diff --git a/base/applications/calc/lang/en-US.rc b/base/applications/calc/lang/en-US.rc index 402991ab06d..e025692c360 100644 --- a/base/applications/calc/lang/en-US.rc +++ b/base/applications/calc/lang/en-US.rc @@ -343,8 +343,8 @@ IDR_MENU_SCIENTIFIC_1 MENU DISCARDABLE BEGIN POPUP "Edit" BEGIN - MENUITEM "Copy\tCTRL-C", IDM_EDIT_COPY - MENUITEM "Paste\tCTRL-V", IDM_EDIT_PASTE + MENUITEM "Copy\tCtrl+C", IDM_EDIT_COPY + MENUITEM "Paste\tCtrl+V", IDM_EDIT_PASTE END POPUP "View" BEGIN @@ -375,8 +375,8 @@ IDR_MENU_SCIENTIFIC_2 MENU DISCARDABLE BEGIN POPUP "Edit" BEGIN - MENUITEM "Copy\tCTRL-C", IDM_EDIT_COPY - MENUITEM "Paste\tCTRL-V", IDM_EDIT_PASTE + MENUITEM "Copy\tCtrl+C", IDM_EDIT_COPY + MENUITEM "Paste\tCtrl+V", IDM_EDIT_PASTE END POPUP "View" BEGIN @@ -408,8 +408,8 @@ IDR_MENU_STANDARD MENU DISCARDABLE BEGIN POPUP "Edit" BEGIN - MENUITEM "Copy\tCTRL-C", IDM_EDIT_COPY - MENUITEM "Paste\tCTRL-V", IDM_EDIT_PASTE + MENUITEM "Copy\tCtrl+C", IDM_EDIT_COPY + MENUITEM "Paste\tCtrl+V", IDM_EDIT_PASTE END POPUP "View" BEGIN diff --git a/base/applications/calc/lang/ja-JP.rc b/base/applications/calc/lang/ja-JP.rc new file mode 100644 index 00000000000..5a7a52e05f9 --- /dev/null +++ b/base/applications/calc/lang/ja-JP.rc @@ -0,0 +1,732 @@ +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT + +// Dialog + +IDD_DIALOG_SCIENTIFIC DIALOGEX 0, 0, 316, 161 +STYLE DS_SHELLFONT | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS 電卓" +MENU IDR_MENU_SCIENTIFIC_1 +FONT 9, "MS UI Gothic", 0, 0, 0x1 +BEGIN + GROUPBOX "",IDC_STATIC,4,16,132,21 + CONTROL "16進",IDC_RADIO_HEX,"Button",BS_AUTORADIOBUTTON,8,24,29,10 + CONTROL "10進",IDC_RADIO_DEC,"Button",BS_AUTORADIOBUTTON,40,24,29,10 + CONTROL "8進",IDC_RADIO_OCT,"Button",BS_AUTORADIOBUTTON,72,24,27,10 + CONTROL "2進",IDC_RADIO_BIN,"Button",BS_AUTORADIOBUTTON,100,24,26,10 + GROUPBOX "",IDC_STATIC,4,36,76,21 + CONTROL "Inv",IDC_CHECK_INV,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,8,44,26,10 + CONTROL "Hyp",IDC_CHECK_HYP,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,40,44,29,10 + CTEXT "",IDC_TEXT_PARENT,84,40,24,17,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + CTEXT "",IDC_TEXT_MEMORY,112,40,24,17,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + PUSHBUTTON "Sta",IDC_BUTTON_STA,4,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Ave",IDC_BUTTON_AVE,4,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | WS_DISABLED | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Sum",IDC_BUTTON_SUM,4,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | WS_DISABLED | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "s",IDC_BUTTON_S,4,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | WS_DISABLED | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Dat",IDC_BUTTON_DAT,4,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | WS_DISABLED | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "F-E",IDC_BUTTON_FE,38,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "dms",IDC_BUTTON_DMS,38,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "sin",IDC_BUTTON_SIN,38,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "cos",IDC_BUTTON_COS,38,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "tan",IDC_BUTTON_TAN,38,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "(",IDC_BUTTON_LEFTPAR,64,64,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Exp",IDC_BUTTON_EXP,64,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "x^y",IDC_BUTTON_XeY,64,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "x^2",IDC_BUTTON_Xe2,64,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "x^3",IDC_BUTTON_Xe3,64,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON ")",IDC_BUTTON_RIGHTPAR,90,64,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "ln",IDC_BUTTON_LN,90,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "log",IDC_BUTTON_LOG,90,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "n!",IDC_BUTTON_NF,90,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "1/x",IDC_BUTTON_RX,90,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "MC",IDC_BUTTON_MC,124,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "MR",IDC_BUTTON_MR,124,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "MS",IDC_BUTTON_MS,124,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "M+",IDC_BUTTON_MP,124,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "pi",IDC_BUTTON_PI,124,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "7",IDC_BUTTON_7,158,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "4",IDC_BUTTON_4,158,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "1",IDC_BUTTON_1,158,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "0",IDC_BUTTON_0,158,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "A",IDC_BUTTON_A,158,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "8",IDC_BUTTON_8,184,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "5",IDC_BUTTON_5,184,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "2",IDC_BUTTON_2,184,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "+/-",IDC_BUTTON_SIGN,184,121,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "B",IDC_BUTTON_B,184,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "9",IDC_BUTTON_9,210,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "6",IDC_BUTTON_6,210,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "3",IDC_BUTTON_3,210,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON ",",IDC_BUTTON_DOT,210,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "C",IDC_BUTTON_C,210,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "/",IDC_BUTTON_DIV,236,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "*",IDC_BUTTON_MULT,236,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "-",IDC_BUTTON_SUB,236,102,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "+",IDC_BUTTON_ADD,236,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "D",IDC_BUTTON_D,236,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Mod",IDC_BUTTON_MOD,262,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Or",IDC_BUTTON_OR,262,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Lsh",IDC_BUTTON_LSH,262,102,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "=",IDC_BUTTON_EQU,262,121,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "E",IDC_BUTTON_E,262,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "And",IDC_BUTTON_AND,288,64,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Xor",IDC_BUTTON_XOR,288,83,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Not",IDC_BUTTON_NOT,288,102,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Int",IDC_BUTTON_INT,288,121,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "F",IDC_BUTTON_F,288,140,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + GROUPBOX "",IDC_STATIC,140,16,172,21 + CONTROL "Qword",IDC_RADIO_QWORD,"Button",BS_AUTORADIOBUTTON | + NOT WS_VISIBLE,148,24,37,10 + CONTROL "Dword",IDC_RADIO_DWORD,"Button",BS_AUTORADIOBUTTON | + NOT WS_VISIBLE,188,24,37,10 + CONTROL "Word",IDC_RADIO_WORD,"Button",BS_AUTORADIOBUTTON | NOT + WS_VISIBLE,232,24,33,10 + CONTROL "Byte",IDC_RADIO_BYTE,"Button",BS_AUTORADIOBUTTON | NOT + WS_VISIBLE,272,24,30,10 + CONTROL "Degrees",IDC_RADIO_DEG,"Button",BS_AUTORADIOBUTTON,148,24, + 42,10 + CONTROL "Radians",IDC_RADIO_RAD,"Button",BS_AUTORADIOBUTTON,192, + 24,42,10 + CONTROL "Gradians",IDC_RADIO_GRAD,"Button",BS_AUTORADIOBUTTON, + 236,24,44,10 + PUSHBUTTON "C",IDC_BUTTON_CANC,272,40,40,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "CE",IDC_BUTTON_CE,228,40,40,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Back",IDC_BUTTON_BACK,184,40,40,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + RTEXT "",IDC_TEXT_OUTPUT,4,4,308,12,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + DEFPUSHBUTTON "",IDC_BUTTON_FOCUS,0,0,5,5, NOT WS_VISIBLE +END + +IDD_DIALOG_STANDARD DIALOGEX 0, 0, 172, 127 +STYLE DS_SHELLFONT | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS 電卓" +MENU IDR_MENU_STANDARD +FONT 9, "MS UI Gothic", 0, 0, 0x1 +BEGIN + PUSHBUTTON "C",IDC_BUTTON_CANC,128,24,40,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "CE",IDC_BUTTON_CE,84,24,40,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Back",IDC_BUTTON_BACK,40,24,40,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + RTEXT "",IDC_TEXT_OUTPUT,4,4,164,12,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + PUSHBUTTON "7",IDC_BUTTON_7,40,48,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "4",IDC_BUTTON_4,40,67,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "1",IDC_BUTTON_1,40,86,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "0",IDC_BUTTON_0,40,105,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "8",IDC_BUTTON_8,66,48,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "5",IDC_BUTTON_5,66,67,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "2",IDC_BUTTON_2,66,86,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "+/-",IDC_BUTTON_SIGN,66,105,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "9",IDC_BUTTON_9,92,48,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "6",IDC_BUTTON_6,92,67,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "3",IDC_BUTTON_3,92,86,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON ",",IDC_BUTTON_DOT,92,105,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "/",IDC_BUTTON_DIV,118,48,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "*",IDC_BUTTON_MULT,118,67,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "-",IDC_BUTTON_SUB,118,86,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "+",IDC_BUTTON_ADD,118,105,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "Sqrt",IDC_BUTTON_SQRT,144,48,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "%",IDC_BUTTON_PERCENT,144,67,24,17,BS_CENTER | + BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "1/x",IDC_BUTTON_RX,144,86,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "=",IDC_BUTTON_EQU,144,105,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + CTEXT "",IDC_TEXT_MEMORY,4,24,24,17,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + PUSHBUTTON "MC",IDC_BUTTON_MC,4,48,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "MR",IDC_BUTTON_MR,4,67,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "MS",IDC_BUTTON_MS,4,86,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + PUSHBUTTON "M+",IDC_BUTTON_MP,4,105,24,17,BS_CENTER | BS_VCENTER | + BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP + DEFPUSHBUTTON "",IDC_BUTTON_FOCUS,0,0,5,5, NOT WS_VISIBLE +END + +IDD_DIALOG_CONVERSION DIALOGEX 0, 0, 320, 130 +STYLE DS_SHELLFONT | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS 電卓" +MENU IDR_MENU_STANDARD +FONT 9, "MS UI Gothic" +BEGIN + PUSHBUTTON "変換",IDC_BUTTON_CONVERT,35,105,76,17 + COMBOBOX IDC_COMBO_CATEGORY,4,31,140,168,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP | CBS_SORT + LTEXT "分類:",IDC_STATIC,4,20,56,8 + COMBOBOX IDC_COMBO_FROM,4,60,140,168,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP | CBS_SORT + LTEXT "変換元:",IDC_STATIC,4,49,56,8 + COMBOBOX IDC_COMBO_TO,4,87,140,168,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP | CBS_SORT + LTEXT "変換先:",IDC_STATIC,4,76,56,8 + CONTROL "C",IDC_BUTTON_CANC,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,276,24,40,17 + CONTROL "CE",IDC_BUTTON_CE,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,232,24,40,17 + CONTROL "Back",IDC_BUTTON_BACK,"Button",BS_OWNERDRAW | + BS_CENTER | BS_VCENTER | BS_NOTIFY | WS_TABSTOP,188,24, + 40,17 + RTEXT "",IDC_TEXT_OUTPUT,4,4,312,12,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + CONTROL "7",IDC_BUTTON_7,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,188,48,24,17 + CONTROL "4",IDC_BUTTON_4,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,188,67,24,17 + CONTROL "1",IDC_BUTTON_1,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,188,86,24,17 + CONTROL "0",IDC_BUTTON_0,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,188,105,24,17 + CONTROL "8",IDC_BUTTON_8,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,214,48,24,17 + CONTROL "5",IDC_BUTTON_5,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,214,67,24,17 + CONTROL "2",IDC_BUTTON_2,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,214,86,24,17 + CONTROL "+/-",IDC_BUTTON_SIGN,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,214,105,24,17 + CONTROL "9",IDC_BUTTON_9,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,240,48,24,17 + CONTROL "6",IDC_BUTTON_6,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,240,67,24,17 + CONTROL "3",IDC_BUTTON_3,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,240,86,24,17 + CONTROL ",",IDC_BUTTON_DOT,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,240,105,24,17 + CONTROL "/",IDC_BUTTON_DIV,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,266,48,24,17 + CONTROL "*",IDC_BUTTON_MULT,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,266,67,24,17 + CONTROL "-",IDC_BUTTON_SUB,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,266,86,24,17 + CONTROL "+",IDC_BUTTON_ADD,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,266,105,24,17 + CONTROL "Sqrt",IDC_BUTTON_SQRT,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,292,48,24,17 + CONTROL "%",IDC_BUTTON_PERCENT,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,292,67,24,17 + CONTROL "1/x",IDC_BUTTON_RX,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,292,86,24,17 + CONTROL "=",IDC_BUTTON_EQU,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,292,105,24,17 + CTEXT "",IDC_TEXT_MEMORY,152,24,24,17,SS_CENTERIMAGE, + WS_EX_CLIENTEDGE + CONTROL "MC",IDC_BUTTON_MC,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,152,48,24,17 + CONTROL "MR",IDC_BUTTON_MR,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,152,67,24,17 + CONTROL "MS",IDC_BUTTON_MS,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,152,86,24,17 + CONTROL "M+",IDC_BUTTON_MP,"Button",BS_OWNERDRAW | BS_CENTER | + BS_VCENTER | BS_NOTIFY | WS_TABSTOP,152,105,24,17 + DEFPUSHBUTTON "",IDC_BUTTON_FOCUS,0,0,5,5,NOT WS_VISIBLE +END + +IDD_DIALOG_ABOUT DIALOGEX DISCARDABLE 0, 0, 264, 169 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS 電卓について" +FONT 9, "MS UI Gothic" +BEGIN + DEFPUSHBUTTON "OK",IDOK,105,148,52,16 + CONTROL IDB_BITMAP_ROS,IDC_STATIC,"Static",SS_BITMAP | SS_CENTERIMAGE | + SS_REALSIZEIMAGE | WS_BORDER,4,4,104,48 + LTEXT "ReactOS 電卓",IDC_STATIC,120,12,132,8, + SS_CENTERIMAGE + LTEXT "Version ",IDC_TEXT_VERSION,120,20,132,8,SS_CENTERIMAGE + LTEXT "Written by Carlo Bramini",IDC_STATIC,120,32,132,8, + SS_CENTERIMAGE + GROUPBOX "",IDC_STATIC,112,0,148,52 + GROUPBOX "",IDC_STATIC,4,56,256,88 + EDITTEXT IDC_EDIT_LICENSE,12,68,240,68,ES_MULTILINE | ES_READONLY | + WS_VSCROLL +END + +IDD_DIALOG_STAT DIALOGEX DISCARDABLE 0, 0, 163, 85 +STYLE DS_SHELLFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Statistics box" +FONT 9, "MS UI Gothic" +BEGIN + LISTBOX IDC_LIST_STAT,4,4,156,40,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "RET",IDC_BUTTON_RET,4,48,36,16 + PUSHBUTTON "LOAD",IDC_BUTTON_LOAD,44,48,36,16 + PUSHBUTTON "CD",IDC_BUTTON_CD,84,48,36,16 + PUSHBUTTON "CAD",IDC_BUTTON_CAD,124,48,36,16 + CTEXT "n=0",IDC_TEXT_NITEMS,4,68,156,12,SS_CENTERIMAGE | + SS_SUNKEN +END + +// Menus + +IDR_MENU_SCIENTIFIC_1 MENU DISCARDABLE +BEGIN + POPUP "編集" + BEGIN + MENUITEM "コピー\tCtrl+C", IDM_EDIT_COPY + MENUITEM "貼\り付け\tCtrl+V", IDM_EDIT_PASTE + END + POPUP "表\示" + BEGIN + MENUITEM "標準", IDM_VIEW_STANDARD, CHECKED + MENUITEM "関数電卓", IDM_VIEW_SCIENTIFIC, CHECKED + MENUITEM "変換", IDM_VIEW_CONVERSION + MENUITEM SEPARATOR + MENUITEM "16進\tF5", IDM_VIEW_HEX, CHECKED + MENUITEM "10進\tF6", IDM_VIEW_DEC, CHECKED + MENUITEM "8進\tF7", IDM_VIEW_OCT, CHECKED + MENUITEM "2進\tF8", IDM_VIEW_BIN, CHECKED + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", IDM_VIEW_DEG, CHECKED + MENUITEM "Radians\tF3", IDM_VIEW_RAD, CHECKED + MENUITEM "Gradians\tF4", IDM_VIEW_GRAD, CHECKED + MENUITEM SEPARATOR + MENUITEM "桁を区切る", IDM_VIEW_GROUP, CHECKED + END + POPUP "ヘルプ" + BEGIN + MENUITEM "ヘルプ トピック", IDM_HELP_HELP + MENUITEM SEPARATOR + MENUITEM "ReactOS 電卓について", IDM_HELP_ABOUT + END +END + +IDR_MENU_SCIENTIFIC_2 MENU DISCARDABLE +BEGIN + POPUP "編集" + BEGIN + MENUITEM "コピー\tCtrl+C", IDM_EDIT_COPY + MENUITEM "貼\り付け\tCtrl+V", IDM_EDIT_PASTE + END + POPUP "表\示" + BEGIN + MENUITEM "標準", IDM_VIEW_STANDARD, CHECKED + MENUITEM "関数電卓", IDM_VIEW_SCIENTIFIC, CHECKED + MENUITEM "変換", IDM_VIEW_CONVERSION + MENUITEM SEPARATOR + MENUITEM "16進\tF5", IDM_VIEW_HEX, CHECKED + MENUITEM "10進\tF6", IDM_VIEW_DEC, CHECKED + MENUITEM "8進\tF7", IDM_VIEW_OCT, CHECKED + MENUITEM "2進\tF8", IDM_VIEW_BIN, CHECKED + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", IDM_VIEW_QWORD, CHECKED + MENUITEM "Dword\tF2", IDM_VIEW_DWORD, CHECKED + MENUITEM "Word\tF3", IDM_VIEW_WORD, CHECKED + MENUITEM "Byte\tF4", IDM_VIEW_BYTE, CHECKED + MENUITEM SEPARATOR + MENUITEM "桁を区切る", IDM_VIEW_GROUP, CHECKED + END + POPUP "ヘルプ" + BEGIN + MENUITEM "ヘルプ トピック", IDM_HELP_HELP + MENUITEM SEPARATOR + MENUITEM "ReactOS 電卓について", IDM_HELP_ABOUT + END +END + +IDR_MENU_STANDARD MENU DISCARDABLE +BEGIN + POPUP "編集" + BEGIN + MENUITEM "コピー\tCtrl+C", IDM_EDIT_COPY + MENUITEM "貼\り付け\tCtrl+V", IDM_EDIT_PASTE + END + POPUP "表\示" + BEGIN + MENUITEM "標準", IDM_VIEW_STANDARD, CHECKED + MENUITEM "関数電卓", IDM_VIEW_SCIENTIFIC, CHECKED + MENUITEM "変換", IDM_VIEW_CONVERSION + MENUITEM SEPARATOR + MENUITEM "桁を区切る", IDM_VIEW_GROUP, CHECKED + END + POPUP "ヘルプ" + BEGIN + MENUITEM "ヘルプ トピック", IDM_HELP_HELP + MENUITEM SEPARATOR + MENUITEM "ReactOS 電卓について", IDM_HELP_ABOUT + END +END + +// String Tables + +STRINGTABLE DISCARDABLE +BEGIN + IDS_STRING_LICENSE "ReactOS 電卓はGNU GPLライセンスの元で提供されるフリーソ\フトウェアです。\r\n\r\nこちらでGNU GPLライセンスのコピーを得ることができます:\r\nhttp://www.gnu.org/licenses/gpl.html\r\n\r\nこちらでGNU GPLライセンスの翻訳を得ることができます:\r\nhttp://www.gnu.org/licenses/translations.html" + IDS_MATH_ERROR "エラー" + IDS_QUICKHELP "クイックヘルプ" +END + +// Types of conversion +STRINGTABLE DISCARDABLE +BEGIN + IDS_CONV_ANGLE "角度" + IDS_CONV_AREA "面積" + IDS_CONV_CONSUMPTION "消費 (エンジン)" + IDS_CONV_CURRENCY "通貨" + IDS_CONV_ENERGY "エネルギー" + IDS_CONV_LENGTH "長さ" + IDS_CONV_POWER "力" + IDS_CONV_PRESSURE "圧力" + IDS_CONV_TEMPERATURE "温度" + IDS_CONV_TIME "時間" + IDS_CONV_VELOCITY "速度" + IDS_CONV_VOLUME "体積" + IDS_CONV_WEIGHT "重さ" +END + +// TYPES OF ANGLES +STRINGTABLE DISCARDABLE +BEGIN + IDS_ANGLE_DEGREES "Degrees" + IDS_ANGLE_GRADIANS "Gradians" + IDS_ANGLE_RADIANS "Radians" +END + +// TYPES OF AREAS +STRINGTABLE DISCARDABLE +BEGIN + IDS_AREA_ACRES "エーカー" + IDS_AREA_ACRES_BRAZIL "エーカー (ブラジル)" + IDS_AREA_ACRES_FRANCE "エーカー (フランス)" + IDS_AREA_ACRES_SCOTS "エーカー (スコットランド)" + IDS_AREA_ACRES_US "エーカー (米国)" + IDS_AREA_ARES "アール" + IDS_AREA_CHOU "Chou" + IDS_AREA_DANBO "Danbo" + IDS_AREA_HECTARES "ヘクタール" + IDS_AREA_JEONGBO "Jeongbo" + IDS_AREA_MORGEN_HUNGARY "Morgen (Hungary)" + IDS_AREA_MU "Mu" + IDS_AREA_PING "Ping" + IDS_AREA_PYEONG "Pyeong" + IDS_AREA_PYEONGBANGJA "Pyeongbangja" + IDS_AREA_RAI "Rai" + IDS_AREA_SE "Se" + IDS_AREA_SQUARE_CENTIMETERS "平方センチメートル" + IDS_AREA_SQUARE_CHR "Square chr" + IDS_AREA_SQUARE_FATHOMS "平方尋" + IDS_AREA_SQUARE_FATHOMS_HUNGARY "平方尋 (ハンガリー)" + IDS_AREA_SQUARE_FEET "平方フィート" + IDS_AREA_SQUARE_INCHES "平方インチ" + IDS_AREA_SQUARE_KILOMETERS "平方キロメーター" + IDS_AREA_SQUARE_LAR "Square lar" + IDS_AREA_SQUARE_METER "平方メートル" + IDS_AREA_SQUARE_MILES "平方マイル" + IDS_AREA_SQUARE_MILLIMETERS "平方ミリメートル" + IDS_AREA_SQUARE_SHAKU "平方尺" + IDS_AREA_SQUARE_TSUEN "Square tsuen" + IDS_AREA_SQUARE_VA "Square va" + IDS_AREA_SQUARE_YARD "平方ヤード" + IDS_AREA_TAN "Tan" + IDS_AREA_TSUBO "坪" +END + +// TYPES OF COMSUMPTIONS +STRINGTABLE DISCARDABLE +BEGIN + IDS_CONSUMPTION_KM_PER_L "キロメートル/リットル" + IDS_CONSUMPTION_L_PER_100_KM "リットル/100キロメートル" + IDS_CONSUMPTION_MILES_GALLON_UK "マイル/ガロン (英国)" + IDS_CONSUMPTION_MILES_GALLON_US "マイル/ガロン (米国)" +END + +// TYPES OF CURRENCIES +STRINGTABLE DISCARDABLE +BEGIN + IDS_CURRENCY_AUSTRIAN_SCHILLING "オーストリア シリング" + IDS_CURRENCY_BELGIAN_FRANC "ベルギー フラン" + IDS_CURRENCY_CYPRIOT_POUND "キプロス ポンド" + IDS_CURRENCY_CZECH_KORUNA "チェコ コルナ" + IDS_CURRENCY_DEUTSCHE_MARK "ドイツ マルク" + IDS_CURRENCY_DUTCH_GUILDER "オランダ ギルダー" + IDS_CURRENCY_EURO "ユーロ" + IDS_CURRENCY_FINNISH_MARKKA "フィンランド マルッカ" + IDS_CURRENCY_FRENCH_FRANC "フランス フラン" + IDS_CURRENCY_GREEK_DRACHMA "ギリシャ ドラクマ" + IDS_CURRENCY_IRISH_POUND "アイルランド ポンド" + IDS_CURRENCY_ITALIAN_LIRA "イタリア リラ" + IDS_CURRENCY_LUXEMBOURG_FRANC "ルクセンブルク フラン" + IDS_CURRENCY_MALTESE_LIRA "マルタ リラ" + IDS_CURRENCY_PORTOGUESE_ESCUDO "ポルトガル エスクード" + IDS_CURRENCY_SLOVAK_KORUNA "スロバキア コルナ" + IDS_CURRENCY_SLOVENIAN_TOLAR "スロベニア tolar" + IDS_CURRENCY_SPANISH_PESETA "スペイン ペセタ" +END + +// TYPES OF ENERGIES +STRINGTABLE DISCARDABLE +BEGIN + IDS_ENERGY_15_C_CALORIES "15℃カロリー" + IDS_ENERGY_BTUS "英国熱単位" + IDS_ENERGY_ERGS "エルグ" + IDS_ENERGY_EVS "電子ボルト" + IDS_ENERGY_FOOT_POUNDS "フートポンド" + IDS_ENERGY_IT_CALORIES "International Table calories" + IDS_ENERGY_IT_KILOCALORIES "International Table kilocalories" + IDS_ENERGY_JOULES "ジュール" + IDS_ENERGY_KILOJOULES "キロジュール" + IDS_ENERGY_KILOWATT_HOURS "キロワット時" + IDS_ENERGY_NUTRITION_CALORIES "栄養カロリー" + IDS_ENERGY_TH_CALORIES "熱化学カロリー" +END + +// TYPES OF LENGTHS +STRINGTABLE DISCARDABLE +BEGIN + IDS_LENGTH_ANGSTROMS "オングストローム" + IDS_LENGTH_ASTRONOMICAL_UNITS "天文単位" + IDS_LENGTH_BARLEYCORNS "バーレーコーン" + IDS_LENGTH_CENTIMETERS "センチメートル" + IDS_LENGTH_CHAINS_UK "チェーン (英国)" + IDS_LENGTH_CHI "Chi" + IDS_LENGTH_CHOU "Chou" + IDS_LENGTH_CHR "Chr" + IDS_LENGTH_CUN "Cun" + IDS_LENGTH_FATHOMS "ファゾム" + IDS_LENGTH_FATHOMS_HUNGARY "ファゾム (ハンガリー)" + IDS_LENGTH_FEET "フィート" + IDS_LENGTH_FURLONGS "ハロン" + IDS_LENGTH_GAN "Gan" + IDS_LENGTH_HANDS "ハンド" + IDS_LENGTH_HUNH "Hunh" + IDS_LENGTH_INCHES "インチ" + IDS_LENGTH_JA "Ja" + IDS_LENGTH_JEONG "Jeong" + IDS_LENGTH_KABIET "Kabiet" + IDS_LENGTH_KEN "Ken" + IDS_LENGTH_KEUB "Keub" + IDS_LENGTH_KILOMETERS "キロメートル" + IDS_LENGTH_LAR "Lar" + IDS_LENGTH_LIGHT_YEARS "光年" + IDS_LENGTH_LINKS_UK "リンク (英国)" + IDS_LENGTH_METERS "メートル" + IDS_LENGTH_MICRONS "ミクロン" + IDS_LENGTH_MILES "マイル" + IDS_LENGTH_MILLIMETERS "ミリメートル" + IDS_LENGTH_NAUTICAL_MILES "海里" + IDS_LENGTH_NIEU "Nieu" + IDS_LENGTH_PARSECS "パーセク" + IDS_LENGTH_PICAS "パイカ" + IDS_LENGTH_RI_JAPAN "里 (日本)" + IDS_LENGTH_RI_KOREA "Ri (韓国)" + IDS_LENGTH_RODS "ロッド" + IDS_LENGTH_SAWK "Sawk" + IDS_LENGTH_SEN "Sen" + IDS_LENGTH_SHAKU "尺" + IDS_LENGTH_SPAN "スパン" + IDS_LENGTH_SUN "寸" + IDS_LENGTH_TSUEN "Tsuen" + IDS_LENGTH_VA "Va" + IDS_LENGTH_YARDS "ヤード" + IDS_LENGTH_YOTE "Yote" + IDS_LENGTH_ZHANG "Zhang" +END + +// TYPES OF POWERS +STRINGTABLE DISCARDABLE +BEGIN + IDS_POWER_BTUS_PER_MINUTE "英国熱単位/分" + IDS_POWER_FPS_PER_MINUTE "フートポンド/分" + IDS_POWER_HORSEPOWER "馬力" + IDS_POWER_KILOWATTS "キロワット" + IDS_POWER_MEGAWATTS "メガワット" + IDS_POWER_WATTS "ワット" +END + +// TYPE OF PRESSURES +STRINGTABLE DISCARDABLE +BEGIN + IDS_PRESSURE_ATMOSPHERES "気圧" + IDS_PRESSURE_BARS "Bars" + IDS_PRESSURE_HECTOPASCALS "ヘクトパスカル" + IDS_PRESSURE_KILOPASCALS "キロパスカル" + IDS_PRESSURE_MM_OF_MERCURY "水銀ミリメートル" + IDS_PRESSURE_PASCALS "パスカル" + IDS_PRESSURE_PSI "ポンド重/平方インチ" +END + +// TYPES OF TEMPERATURES +STRINGTABLE DISCARDABLE +BEGIN + IDS_TEMPERATURE_CELSIUS "摂氏" + IDS_TEMPERATURE_FAHRENHEIT "華氏" + IDS_TEMPERATURE_KELVIN "ケルビン" + IDS_TEMPERATURE_RANKINE "Rankine" +END + +// TYPES OF TIME +STRINGTABLE DISCARDABLE +BEGIN + IDS_TIME_DAYS "日数" + IDS_TIME_HOURS "時間" + IDS_TIME_NANOSECONDS "ナノ秒" + IDS_TIME_MICROSECONDS "マイクロ秒" + IDS_TIME_MILLISECONDS "ミリ秒" + IDS_TIME_MINUTES "分" + IDS_TIME_SECONDS "秒" + IDS_TIME_WEEKS "週" + IDS_TIME_YEARS "年" +END + +// TYPES OF VELOCITIES +STRINGTABLE DISCARDABLE +BEGIN + IDS_VELOCITY_CMS_SECOND "センチメートル/時" + IDS_VELOCITY_FEET_HOUR "フィート/時" + IDS_VELOCITY_FEET_SECOND "フィート/秒" + IDS_VELOCITY_KILOMETERS_HOUR "キロメートル/時" + IDS_VELOCITY_KNOTS "ノット" + IDS_VELOCITY_MACH "マッハ" + IDS_VELOCITY_METERS_SECOND "メートル/秒" + IDS_VELOCITY_MILES_HOUR "マイル/時" +END + +// TYPES OF VOLUMES +STRINGTABLE DISCARDABLE +BEGIN + IDS_VOLUME_BARRELS_UK "バレル (英国)" + IDS_VOLUME_BARRELS_OIL "石油バレル" + IDS_VOLUME_BUN "Bun" + IDS_VOLUME_BUSHELS_UK "ブッシェル (英国)" + IDS_VOLUME_BUSHELS_US "ブッシェル (米国)" + IDS_VOLUME_CUBIC_CENTIMETERS "立法センチメートル" + IDS_VOLUME_CUBIC_FEET "立法フィート" + IDS_VOLUME_CUBIC_INCHES "立法インチ" + IDS_VOLUME_CUBIC_METERS "立法メートル" + IDS_VOLUME_CUBIC_YARDS "立法ヤード" + IDS_VOLUME_DOE "Doe" + IDS_VOLUME_FLUID_OUNCES_UK "流体オンス (英国)" + IDS_VOLUME_FLUID_OUNCES_US "流体オンス (米国)" + IDS_VOLUME_GALLONS_UK "ガロン (英国)" + IDS_VOLUME_GALLONS_DRY_US "ガロン、乾燥 (米国)" + IDS_VOLUME_GALLONS_LIQUID_US "ガロン、液体 (米国)" + IDS_VOLUME_GOU "Gou" + IDS_VOLUME_HOP "Hop" + IDS_VOLUME_ICCE "Icce" + IDS_VOLUME_KWIAN "Kwian" + IDS_VOLUME_LITERS "リットル" + IDS_VOLUME_MAL "Mal" + IDS_VOLUME_MILLILITERS "ミリリットル" + IDS_VOLUME_PINTS_UK "パイント (英国)" + IDS_VOLUME_PINTS_DRY_US "パイント、乾燥 (米国)" + IDS_VOLUME_PINTS_LIQUID_US "パイント、液体 (米国)" + IDS_VOLUME_QUARTS_UK "クォート (英国)" + IDS_VOLUME_QUARTS_DRY_US "クォート、乾燥 (米国)" + IDS_VOLUME_QUARTS_LIQUID_US "クォート、液体 (米国)" + IDS_VOLUME_SEKI "Seki" + IDS_VOLUME_SYOU "Syou" + IDS_VOLUME_TANANLOUNG "Tananloung" + IDS_VOLUME_TANG "Tang" + IDS_VOLUME_TO "To" +END + +// TYPES OF WEIGHTS +STRINGTABLE DISCARDABLE +BEGIN + IDS_WEIGHT_BAHT "Baht" + IDS_WEIGHT_CARATS "カラット" + IDS_WEIGHT_CHUNG "Chung" + IDS_WEIGHT_DON "Don" + IDS_WEIGHT_GEUN "Geun" + IDS_WEIGHT_GRAMS "グラム" + IDS_WEIGHT_GWAN "Gwan" + IDS_WEIGHT_HARB "Harb" + IDS_WEIGHT_JIN_CHINA "Jin (中国)" + IDS_WEIGHT_JIN_TAIWAN "Jin (台湾)" + IDS_WEIGHT_KAN "Kan" + IDS_WEIGHT_KILOGRAMS "キログラム" + IDS_WEIGHT_KIN "Kin" + IDS_WEIGHT_LIANG_CHINA "Liang (中国)" + IDS_WEIGHT_LIANG_TAIWAN "Liang (台湾)" + IDS_WEIGHT_MONME "匁 (もんめ)" + IDS_WEIGHT_OUNCES_AVOIRDUPOIS "常衡オンス" + IDS_WEIGHT_OUNCES_TROY "トロイ オンス" + IDS_WEIGHT_POUNDS "ポンド" + IDS_WEIGHT_QUINTAL_METRIC "キンタル (metric)" + IDS_WEIGHT_SALOUNG "Saloung" + IDS_WEIGHT_STONES "ストーン" + IDS_WEIGHT_TAMLUNG "Tamlung" + IDS_WEIGHT_TONNES "トン" + IDS_WEIGHT_TONS_UK "トン (英国)" + IDS_WEIGHT_TONS_US "トン (米国)" +END diff --git a/base/applications/calc/resource.rc b/base/applications/calc/resource.rc index 53d6e76ca12..945df68922a 100644 --- a/base/applications/calc/resource.rc +++ b/base/applications/calc/resource.rc @@ -52,6 +52,7 @@ IDB_BITMAP_ROS BITMAP DISCARDABLE "res/ROS_logo.bmp" #include "lang/es-ES.rc" #include "lang/fr-FR.rc" #include "lang/it-IT.rc" +#include "lang/ja-JP.rc" #include "lang/ko-KR.rc" #include "lang/nl-NL.rc" #include "lang/no-NO.rc" diff --git a/base/applications/cmdutils/reg/It.rc b/base/applications/cmdutils/reg/It.rc index 09d38fd4025..0a79a7d510f 100644 --- a/base/applications/cmdutils/reg/It.rc +++ b/base/applications/cmdutils/reg/It.rc @@ -35,6 +35,6 @@ STRINGTABLE STRING_SUCCESS, "Operazione completata con successo\n" STRING_INVALID_KEY, "Errore: nome della chiave non valido\n" STRING_INVALID_CMDLINE, "Errore: parametri della linea di comando non validi\n" - STRING_NO_REMOTE, "Errore: Impossibile aggiungere chiavi alla macchina remota\n" - STRING_CANNOT_FIND, "Errore: Il sistema non ティ riuscito a trovare la chiave di registro o il valore specificati\n" + STRING_NO_REMOTE, "Errore: impossibile aggiungere chiavi alla macchina remota\n" + STRING_CANNOT_FIND, "Errore: il sistema non ティ riuscito a trovare la chiave di registro o il valore specificati\n" } diff --git a/base/applications/cmdutils/reg/Sv.rc b/base/applications/cmdutils/reg/Sv.rc new file mode 100644 index 00000000000..cdb5a84014f --- /dev/null +++ b/base/applications/cmdutils/reg/Sv.rc @@ -0,0 +1,39 @@ +/* + * REG.EXE - Wine-compatible reg program. + * Swedish language support + * + * Copyright 2010 Anders Jonsson + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "reg.h" + +#pragma code_page(65001) + +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE +{ + STRING_USAGE, "Syntax fテカr detta kommando テ、r:\n\nREG [ ADD | DELETE | QUERY ]\nREG kommando /?\n" + STRING_ADD_USAGE, "REG ADD nyckelnamn [/v vテ、rdenamn | /ve] [/t typ] [/s separator] [/d data] [/f]\n" + STRING_DELETE_USAGE, "REG DELETE nyckelnamn [/v vテ、rdenamn | /ve | /va] [/f]\n" + STRING_QUERY_USAGE, "REG QUERY nyckelnamn [/v vテ、rdenamn | /ve] [/s]\n" + STRING_SUCCESS, "Operation slutfテカrdes utan problem\n" + STRING_INVALID_KEY, "Fel: ogiltigt nyckelnamn\n" + STRING_INVALID_CMDLINE, "Fel: ogiltiga kommandoradsparametrar\n" + STRING_NO_REMOTE, "Fel: Kan inte lテ、gga till nycklar till fjテ、rrmaskin\n" + STRING_CANNOT_FIND, "Fel: Systemet kunde inte hitta angiven nyckel eller vテ、rde i registret\n" +} diff --git a/base/applications/cmdutils/reg/rsrc.rc b/base/applications/cmdutils/reg/rsrc.rc index 58f6115c2a2..9ff5e373f44 100644 --- a/base/applications/cmdutils/reg/rsrc.rc +++ b/base/applications/cmdutils/reg/rsrc.rc @@ -16,4 +16,5 @@ #include "Ro.rc" #include "Ru.rc" #include "Si.rc" +#include "Sv.rc" #include "Uk.rc" diff --git a/base/applications/cmdutils/xcopy/Da.rc b/base/applications/cmdutils/xcopy/Da.rc index 902f8311614..59fe19f9571 100644 --- a/base/applications/cmdutils/xcopy/Da.rc +++ b/base/applications/cmdutils/xcopy/Da.rc @@ -30,8 +30,8 @@ STRINGTABLE STRING_PAUSE, "Tryk Enter for at begynde at kopiere\n" STRING_SIMCOPY, "%d fil(er) vil blive kopieret\n" STRING_COPY, "%d fil(er) kopieret\n" - STRING_QISDIR, "Er ォ%sサ et filnavn eller katalog\n \ - p destinationen?\n \ + STRING_QISDIR, "Er ォ%sサ et filnavn eller katalog\n\ + p destinationen?\n\ (F - Fil, K - Katalog)\n" STRING_SRCPROMPT,"%s? (Ja|Nei)\n" STRING_OVERWRITE,"Overskrive ォ%sサ? (Ja|Nei|Alle)\n" diff --git a/base/applications/cmdutils/xcopy/De.rc b/base/applications/cmdutils/xcopy/De.rc index 0e8c2a8090d..944bc953908 100644 --- a/base/applications/cmdutils/xcopy/De.rc +++ b/base/applications/cmdutils/xcopy/De.rc @@ -33,8 +33,8 @@ STRINGTABLE STRING_PAUSE, "Eingabetaste betテ、tigen, um mit dem Kopieren zu beginnen\n" STRING_SIMCOPY, "%d Datei(en) wテシrden kopiert\n" STRING_COPY, "%d Datei(en) kopiert\n" - STRING_QISDIR, "Ist '%s' eine Datei oder ein Verzeichnis\n \ - am Zielsort?\n \ + STRING_QISDIR, "Ist '%s' eine Datei oder ein Verzeichnis\n\ + am Zielsort?\n\ (D - Datei, V - Verzeichnis)\n" STRING_SRCPROMPT,"%s? (Ja|Nein)\n" STRING_OVERWRITE,"%s テシberschreiben? (Ja|Nein|Alle)\n" diff --git a/base/applications/cmdutils/xcopy/En.rc b/base/applications/cmdutils/xcopy/En.rc index 4e380624867..a34257ae51f 100644 --- a/base/applications/cmdutils/xcopy/En.rc +++ b/base/applications/cmdutils/xcopy/En.rc @@ -30,8 +30,8 @@ STRINGTABLE STRING_PAUSE, "Press to begin copying\n" STRING_SIMCOPY, "%d file(s) would be copied\n" STRING_COPY, "%d file(s) copied\n" - STRING_QISDIR, "Is '%s' a filename or directory\n \ - on the target?\n \ + STRING_QISDIR, "Is '%s' a filename or directory\n\ + on the target?\n\ (F - File, D - Directory)\n" STRING_SRCPROMPT,"%s? (Yes|No)\n" STRING_OVERWRITE,"Overwrite %s? (Yes|No|All)\n" diff --git a/base/applications/cmdutils/xcopy/Fr.rc b/base/applications/cmdutils/xcopy/Fr.rc index e5b2e4094ad..bf8fb7e80a1 100644 --- a/base/applications/cmdutils/xcopy/Fr.rc +++ b/base/applications/cmdutils/xcopy/Fr.rc @@ -33,8 +33,8 @@ STRINGTABLE STRING_PAUSE, "Appuyez sur ENTRテ右 pour dテゥmarrer la copie\n" STRING_SIMCOPY, "%d fichier(s) seront copiテゥs\n" STRING_COPY, "%d fichier(s) copiテゥs\n" - STRING_QISDIR, "ツォツ%sツツサ est-il un fichier ou un rテゥpertoire\n \ - dans la destinationツ?\n \ + STRING_QISDIR, "ツォツ%sツツサ est-il un fichier ou un rテゥpertoire\n\ + dans la destinationツ?\n\ (F - Fichier, R - Rテゥpertoire)\n" STRING_SRCPROMPT,"%sツ? (Oui|Non)\n" STRING_OVERWRITE,"テ営raser %sツ? (Oui|Non|Tous)\n" diff --git a/base/applications/cmdutils/xcopy/It.rc b/base/applications/cmdutils/xcopy/It.rc index 5820591b772..2978c0db147 100644 --- a/base/applications/cmdutils/xcopy/It.rc +++ b/base/applications/cmdutils/xcopy/It.rc @@ -31,10 +31,10 @@ STRINGTABLE STRING_INVPARMS, "Numero non valido di parametri - Digita xcopy /? per l'aiuto\n" STRING_INVPARM, "Parametro '%s' non valido - Digita xcopy /? per l'aiuto\n" STRING_PAUSE, "Premi Invio per iniziare a copiare\n" - STRING_SIMCOPY, "%d file sarebbero copiati\n" + STRING_SIMCOPY, "%d file saranno copiati\n" STRING_COPY, "%d file copiato/i\n" - STRING_QISDIR, "'%s' ティ il nome di un file o una cartella\n \ - nell'obiettivo?\n \ + STRING_QISDIR, "'%s' ティ il nome di un file o una cartella\n\ + nell'obiettivo?\n\ (F - File, C - Cartella)\n" STRING_SRCPROMPT,"%s? (Sテャ|No)\n" STRING_OVERWRITE,"Sovrascrivere %s? (Sテャ|No|Tutti)\n" @@ -48,7 +48,7 @@ STRINGTABLE STRING_DIR_CHAR, "C" STRING_HELP, -"XCOPY - Copia file(s) e alberi di cartelle sorgenti in una destinazione\n\ +"XCOPY - Copia file e alberi di cartelle sorgenti in una destinazione\n\ \n\ Sintassi:\n\ XCOPY sorgente [destinazione] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ @@ -59,18 +59,18 @@ Dove:\n\ [/I] Assume una cartella se la destinazione non esiste e sono copiati 2 o\n\ \tpiテケ file\n\ [/S] Copia le cartelle e le sottocartelle\n\ -[/E] Copia le cartelle e le sottocartelle, includendo quelle vuote\n\ +[/E] Copia le cartelle e le sottocartelle, incluse quelle vuote\n\ [/Q] Non mostra i nomi durante la copia, modalitテ silenziosa.\n\ [/F] Mostra i nomi completi della sorgente e della destinazione durante la copia\n\ -[/L] Simula l'operazione, mostrando i nome che sarebbero copiati\n\ +[/L] Simula l'operazione, mostrando i nomi che sarebbero copiati\n\ [/W] Richiede prima di iniziare l'operazione di copia\n\ -[/T] Crea la struttura di cartelle vuote ma non copia i files\n\ -[/Y] Disabilita le conferme quando sono sovrascritti files\n\ -[/-Y] Abilita le conferme quando sono sovrascritti files\n\ +[/T] Crea la struttura di cartelle vuote ma non copia i file\n\ +[/Y] Disabilita le conferme quando sono sovrascritti dei file\n\ +[/-Y] Abilita le conferme quando sono sovrascritti dei file\n\ [/P] Chiede conferma per ogni file sorgente prima di copiare\n\ [/N] Copia usando i nomi abbreviati\n\ [/U] Copia solo files che sono giテ presenti nella destinazione\n\ -[/R] Sovrascrive ogni file che abbia l'attributo Sola Lettura\n\ +[/R] Sovrascrive ogni file che abbia l'attributo Sola lettura\n\ [/H] Include i file nascosti e di sistema nella copia\n\ [/C] Continua anche se accade un errore durante la copia\n\ [/A] Copia solo i file che abbiano l'attributo Archivio\n\ diff --git a/base/applications/cmdutils/xcopy/Ja.rc b/base/applications/cmdutils/xcopy/Ja.rc index 8fd7d03eaa1..2146edfb21f 100644 --- a/base/applications/cmdutils/xcopy/Ja.rc +++ b/base/applications/cmdutils/xcopy/Ja.rc @@ -33,8 +33,8 @@ STRINGTABLE STRING_PAUSE, "繧ウ繝斐シ繧帝幕蟋九☆繧九↓縺ッ 繧呈款縺励※縺上□縺輔>\n" STRING_SIMCOPY, "%d 繝輔ぃ繧、繝ォ縺後さ繝斐シ縺輔l繧玖ヲ玖セシ縺ソ縺ァ縺吶\n" STRING_COPY, "%d 繝輔ぃ繧、繝ォ繧偵さ繝斐シ縺励∪縺励◆\n" - STRING_QISDIR, "騾√j蜈医ョ '%s' 縺ッ繝輔ぃ繧、繝ォ蜷阪〒縺吶°縲―n \ - 繝繧」繝ャ繧ッ繝医Μ縺ァ縺吶°?\n \ + STRING_QISDIR, "騾√j蜈医ョ '%s' 縺ッ繝輔ぃ繧、繝ォ蜷阪〒縺吶°縲―n\ + 繝繧」繝ャ繧ッ繝医Μ縺ァ縺吶°?\n\ (F - 繝輔ぃ繧、繝ォ縲. - 繝繧」繝ャ繧ッ繝医Μ)\n" STRING_SRCPROMPT,"%s? (Yes|No)\n" STRING_OVERWRITE,"%s 繧剃ク頑嶌縺阪@縺セ縺吶°? (Yes|No|All)\n" diff --git a/base/applications/cmdutils/xcopy/Ko.rc b/base/applications/cmdutils/xcopy/Ko.rc index 19c6c5fc422..bb46a36499a 100644 --- a/base/applications/cmdutils/xcopy/Ko.rc +++ b/base/applications/cmdutils/xcopy/Ko.rc @@ -22,23 +22,25 @@ #include "xcopy.h" +#pragma code_page(65001) + LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT STRINGTABLE { - STRING_INVPARMS, "ソテケルク」チ セハタコ クナーウコッシタヌ ーケシ - xcopy /?キホ オオソクサタサ コクステソタ\n" - STRING_INVPARM, "ソテケルク」チ セハタコ クナーウコッシ '%s' - xcopy /?キホ オオソクサタサ コクステソタ\n" - STRING_PAUSE, " クヲ エゥク」ク コケサ邁。 ステタロオノ ーヘタヤエマエル\n" - STRING_SIMCOPY, "%d ニトタマタフ コケサ邨ノ ーヘタヤエマエル\n" - STRING_COPY, "%d ニトタマタフ コケサ邨ヌセスタエマエル\n" - STRING_QISDIR, "'%s'タフ コケサ酩メ ニトタマタフウェ オキコナ荳ョ?\n\ - タヤエマア?\n\ - (F - ニトタマ, D - オキコナ荳ョ)\n" - STRING_SRCPROMPT,"%s? (ソケ|セニエマソタ)\n" - STRING_OVERWRITE,"%sクヲ オ、セセイーレスタエマア? (ソケ|セニエマソタ|クオホ)\n" + STRING_INVPARMS, "豫ー罷・エァ 賦捩 ァ、ー罹ウ們攪 ーッ - xcopy /?。 巡它ァ川揆 ウエ亨丶\n" + STRING_INVPARM, "豫ー罷・エァ 賦捩 ァ、ー罹ウ '%s' - xcopy /?。 巡它ァ川揆 ウエ亨丶\n" + STRING_PAUSE, " ・シ ・エゥエ ウオぎー 亨梠摺 イ桿笈共\n" + STRING_SIMCOPY, "%d 血攵擽 ウオぎ摺 イ桿笈共\n" + STRING_COPY, "%d 血攵擽 ウオぎ据来慣笈共\n" + STRING_QISDIR, "'%s'擽 ウオぎ腹 血攵擽x 粕駕ヲャ?\n\ + 桿笈ケ?\n\ + (F - 血攵, D - 粕駕ヲャ)\n" + STRING_SRCPROMPT,"%s? (|符笈丶)\n" + STRING_OVERWRITE,"%s・シ 紺牟堂イ慣笈ケ? (|符笈丶|ェィ草)\n" STRING_COPYFAIL, "Copying of '%s' to '%s' failed with r/c %d\n" - STRING_OPENFAIL, "'%s' ソュア スヌニミ\n" - STRING_READFAIL, "'%sクヲ タミチ クヌ゚スタエマエル'\n" + STRING_OPENFAIL, "'%s' 龍クー 共肩\n" + STRING_READFAIL, "'%s・シ 攷ァ ェサ毎慣笈共'\n" STRING_YES_CHAR, "Y" STRING_NO_CHAR, "N" STRING_ALL_CHAR, "A" @@ -46,36 +48,36 @@ STRINGTABLE STRING_DIR_CHAR, "D" STRING_HELP, -"XCOPY - ソコサ ニトタマタフウェ オキコナ荳ョ アクチカクヲ クタチキホ コケサ軆n\ +"XCOPY - 寳ウク 血攵擽x 粕駕ヲャ オャ。ー・シ ェゥァ。 ウオぎ\n\ \n\ -ケョケ:\n\ -XCOPY ソコサ [エサ] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ +ャクイ:\n\ +XCOPY 寳ウク [劇メ] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ \t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\ \n\ Where:\n\ \n\ -[/I] ククセ エサタフ チクタ酩マチ セハエツ ー豼 オキコナ荳ョキホ ー。チ、ヌマー オホーウウェ エ クケタコ ニトタマタサ \n\ -\tコケサ軆n\ -[/S] オキコナ荳ョヌマー ヌマタァ オキコナ荳ョ コケサ軆n\ -[/E] コ オキコナ荳ョクヲ ニヌヤヌリシュ オキコナ荳ョソヘ ヌマタァ オキコナ荳ョ コケサ軆n\ -[/Q] チカソヌマーヤ コケサ邨ヌエツ ニトタマタフウェ オキコナ荳ョクヲ ヌ・ステヌマチ セハー コケサ.\n\ -[/F] コケサ酩マエツ オソセネ ソマタヌム ソコサー エサ コクソゥチヨア秉n\ -[/L] コケサ邨ノ ーヘタサ コクソゥチヨク鮠ュ ー。サタクキホ タロセ\n\ -[/W] コケサ鄂テタロ ヌマア タソ。 ネョタホヌマア秉n\ -[/T] ニトタマタコ コケサ酩マチ セハー コ オキコナ荳ョ アクチカクク コケサ軆n\ -[/Y] ニトタマ オ、セ セオ カァ ネョタホヌマチ セハア秉n\ -[/-Y] ニトタマタサ オ、セ セオ カァ ネョタホヌマア秉n\ -[/P] コケサ酩マエツ オソセネソ。 ー「ー。タヌ ソコサ ニトタマクカエル ネョタホ\n\ -[/N] ツェタコ タフクァタサ サ鄙ヌリシュ コケサ軆n\ -[/U] タフケフ エサ オキコナ荳ョソ。 チクタ酩マエツ ニトタマクク コケサ軆n\ -[/R] タミア タソ ニトタマオオ オ、セ セイア秉n\ -[/H] シタコ ニトタマタフウェ ステスコナロ ニトタマオオ ニヌヤヌリシュ コケサ軆n\ -[/C] コケサ酩マエツ オソセネソ。 ソ。キッー。 ケ゚サヌリオオ ー霈モ チヌ濬n\ -[/A] ソタチ セミテ シモシコタフ シウチ、オヌセタヨエツ ニトタマクク コケサ軆n\ -[/M] ソタチ セミテ シモシコタサ チヲーナヌマク鮠ュ セミテ シモシコタフ シウチ、オヌセタヨエツ\n\ -\tニトタマクク コケサ軆n\ -[/D | /D:m-d-y] チチ、オネ ウッツ・ ネトソ。 シチ、オヌーナウェ サキホソ ニトタマ コケサ.\n\ -\t\tIククセ セカーヌム ウッツ・オオ チチ、オヌチ セハタクク,ソタチ ソコサコクエル\n\ -\t\tエサタフ ソタキ。オネ ーヘクク コケサ軆n\n" +[/I] ァ護平 劇メ擽 。エ椪葺ァ 賦株 イス垈 粕駕ヲャ。 ー倣葺ウ 草ー罹x 鵠 ァ珠捩 血攵揆 \n\ +\tウオぎ\n\ +[/S] 粕駕ヲャ葺ウ 葺怱 粕駕ヲャ ウオぎ\n\ +[/E] ケ 粕駕ヲャ・シ 小物紛 粕駕ヲャ凰 葺怱 粕駕ヲャ ウオぎ\n\ +[/Q] 。ー圸葺イ ウオぎ据株 血攵擽x 粕駕ヲャ・シ 像亨葺ァ 賦ウ ウオぎ.\n\ +[/F] ウオぎ葺株 徐譜 刋復 寳ウクウシ 劇メ ウエ流」シクー\n\ +[/L] ウオぎ摺 イ揆 ウエ流」シゥエ ーメ愍。 梠羅\n\ +[/W] ウオぎ亨梠 葺クー 乱 剳攤葺クー\n\ +[/T] 血攵捩 ウオぎ葺ァ 賦ウ ケ 粕駕ヲャ オャ。ーァ ウオぎ\n\ +[/Y] 血攵 紺牟 萄 阜 剳攤葺ァ 賦クー\n\ +[/-Y] 血攵揆 紺牟 萄 阜 剳攤葺クー\n\ +[/P] ウオぎ葺株 徐譜乱 ーー攪 寳ウク 血攵ァ壱共 剳攤\n\ +[/N] ァァ捩 擽ヲ揆 ぎ圸紛 ウオぎ\n\ +[/U] 擽ック 劇メ 粕駕ヲャ乱 。エ椪葺株 血攵ァ ウオぎ\n\ +[/R] 攷クー 圸 血攵巡 紺牟 堂クー\n\ +[/H] 葵捩 血攵擽x 亨侃 血攵巡 小物紛 ウオぎ\n\ +[/C] ウオぎ葺株 徐譜乱 乱洳ー ー懍晨紛巡 ウ ァ哩\n\ +[/A] 丶ァ 封カ 作┳擽 └簿据牟梭株 血攵ァ ウオぎ\n\ +[/M] 丶ァ 封カ 作┳揆 懋アー葺ゥエ 封カ 作┳擽 └簿据牟梭株\n\ +\t血攵ァ ウオぎ\n\ +[/D | /D:m-d-y] ァ簿頗 あァ 寇乱 們簿据アーx ヨ。懍垓 血攵 ウオぎ.\n\ +\t\tIァ護平 牟蔓復 あァ罹巡 ァ簿据ァ 賦愍ゥエ,丶ァ 寳ウクウエ共\n\ +\t\t劇メ擽 丶椈頗 イァ ウオぎ\n\n" } diff --git a/base/applications/cmdutils/xcopy/Sv.rc b/base/applications/cmdutils/xcopy/Sv.rc new file mode 100644 index 00000000000..dae6ce04cec --- /dev/null +++ b/base/applications/cmdutils/xcopy/Sv.rc @@ -0,0 +1,82 @@ +/* + * XCOPY - Wine-compatible xcopy program + * Swedish language support + * + * Copyright (C) 2010 Anders Jonsson + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "xcopy.h" + +#pragma code_page(65001) + +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE +{ + STRING_INVPARMS, "Ogiltigt antal parametrar - Anvテ、nd xcopy /? fテカr hjテ、lp\n" + STRING_INVPARM, "Ogiltig parameter '%s' - Anvテ、nd xcopy /? fテカr hjテ、lp\n" + STRING_PAUSE, "Tryck fテカr att bテカrja kopiera\n" + STRING_SIMCOPY, "%d fil(er) skulle kopieras\n" + STRING_COPY, "%d fil(er) kopierade\n" + STRING_QISDIR, "テв '%s' ett filnamn eller en katalog\n" \ + "pテ・ mテ・let?\n" \ + "(F - Fil, K - Katalog)\n" + STRING_SRCPROMPT,"%s? (Ja|Nej)\n" + STRING_OVERWRITE,"Skriv テカver %s? (Ja|Nej|Alla)\n" + STRING_COPYFAIL, "Kunde inte kopiera '%s' till '%s'; misslyckades med r/c %d\n" + STRING_OPENFAIL, "Kunde inte テカppna '%s'\n" + STRING_READFAIL, "Kunde inte lテ、sa '%s'\n" + STRING_YES_CHAR, "J" + STRING_NO_CHAR, "N" + STRING_ALL_CHAR, "A" + STRING_FILE_CHAR,"F" + STRING_DIR_CHAR, "K" + + STRING_HELP, +"XCOPY - Kopierar kテ、llfiler eller katalogtrテ、d till ett mテ・l\n\ +\n\ +Syntax:\n\ +XCOPY kテ、lla [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ +\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\ +\n\ +Dテ、r:\n\ +\n\ +[/I] Antag att mテ・let テ、r en katalog om mテ・let inte existerar och\n\ +\ tvテ・ eller fler filer kopieras\n\ +[/S] Kopiera kataloger och underkataloger\n\ +[/E] Kopiera kataloger och underkataloger, inklusive tomma sテ・dana\n\ +[/Q] Tyst lテ、ge: Lista inte filnamn under kopiering\n\ +[/F] Visa fulla kテ、ll- och mテ・lnamn under kopiering\n\ +[/L] Simulerar operationen och visar namn som skulle kopieras\n\ +[/W] Frテ・gar innan kopieringen pテ・bテカrjas\n\ +[/T] Skapar tom katalogstruktur men kopierar inga filer\n\ +[/Y] Frテ・ga inte nテ、r filer skrivs テカver\n\ +[/-Y] Frテ・ga innan filer skrivs テカver\n\ +[/P] Frテ・ga fテカr varje kテ、llfil som kopieras.\n\ +[/N] Kopiera som korta filnamn\n\ +[/U] Kopiera enbart filer som redan existerar i destinationskatalogen\n\ +[/R] Skriv テカver skrivskyddade filer\n\ +[/H] Inkludera gテカmda filer och systemfiler i kopian\n\ +[/C] Fortsテ、tt テ、ven om ett fel uppstテ・r under kopieringen\n\ +[/A] Kopiera enbart filer markerade som arkiv\n\ +[/M] Kopiera enbart filer markerade som arkiv, ta bort\n\ +\ markeringen\n\ +[/D | /D:m-d-y] Kopiera nya filer eller de テ、ndrade efter angivet datum.\n\ +\t\tOm inget datum angivits utfテカrs endast kopiering om mテ・let テ、r\n\ +\t\tテ、ldre テ、n kテ、llan\n\n" + +} diff --git a/base/applications/cmdutils/xcopy/rsrc.rc b/base/applications/cmdutils/xcopy/rsrc.rc index 60fa9083732..7d4990c5763 100644 --- a/base/applications/cmdutils/xcopy/rsrc.rc +++ b/base/applications/cmdutils/xcopy/rsrc.rc @@ -28,7 +28,6 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "Da.rc" #include "En.rc" -#include "Ko.rc" #include "No.rc" #include "Pl.rc" @@ -37,10 +36,12 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "Fr.rc" #include "It.rc" #include "Ja.rc" +#include "Ko.rc" #include "Lt.rc" #include "Nl.rc" #include "Pt.rc" #include "Ro.rc" #include "Ru.rc" #include "Si.rc" +#include "Sv.rc" #include "Uk.rc" diff --git a/base/applications/games/CMakeLists.txt b/base/applications/games/CMakeLists.txt index f82ff81eb3c..bcc44085ab3 100644 --- a/base/applications/games/CMakeLists.txt +++ b/base/applications/games/CMakeLists.txt @@ -1,4 +1,4 @@ add_subdirectory(solitaire) #add_subdirectory(spider) -add_subdirectory(winemine) +#add_subdirectory(winmine) diff --git a/base/applications/games/spider/lang/it-IT.rc b/base/applications/games/spider/lang/it-IT.rc index 01f59c0020b..b09d39c7939 100644 --- a/base/applications/games/spider/lang/it-IT.rc +++ b/base/applications/games/spider/lang/it-IT.rc @@ -52,10 +52,10 @@ END STRINGTABLE BEGIN IDS_SPI_NAME "Spider" - IDS_SPI_ABOUT "Soltiario Spider di Gregor Schneider\n\nCardLib version 1.0" + IDS_SPI_ABOUT "Solitario Spider di Gregor Schneider\n\nCardLib version 1.0" IDS_SPI_QUIT "Chiudere la partita?" IDS_SPI_WIN "Complimenti, hai vinto!" - IDS_SPI_DEAL "Deal again?" + IDS_SPI_DEAL "Nuova partita?" END diff --git a/base/applications/games/winemine/CMakeLists.txt b/base/applications/games/winemine/CMakeLists.txt deleted file mode 100644 index 844eefe0cbe..00000000000 --- a/base/applications/games/winemine/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ - -set_unicode() - -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) - -set_rc_compiler() - -add_executable(winemine - main.c - dialog.c - rsrc.rc) - -set_module_type(winemine win32gui) -add_importlibs(winemine user32 gdi32 advapi32 shell32 msvcrt kernel32) diff --git a/base/applications/games/winemine/README b/base/applications/games/winemine/README deleted file mode 100644 index 31d7b277fa9..00000000000 --- a/base/applications/games/winemine/README +++ /dev/null @@ -1,21 +0,0 @@ -WineMine README - -WineMine, copyright March 2000, Joshua Thielen -WineMine is to be distributed under the Wine License -See the Wine License for further information. - - -This is minesweeper for wine... -Enjoy. I wrote it because it rhymes ;). - -KNOWN BUGS: - Chokes on fastest times names greater than 16 characters long, must have - something to do with GetDlgItemText. - - No help file. - - Starting a new game causes the window to drop one pixel (Peter Hunnisett) - I don't know if it's a window manager problem (KDE) - -UNKNOWN BUGS: - ??? diff --git a/base/applications/games/winemine/dialog.c b/base/applications/games/winemine/dialog.c deleted file mode 100644 index f9ed4ac6f4d..00000000000 --- a/base/applications/games/winemine/dialog.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * WineMine (dialog.c) - * - * Copyright 2000 Joshua Thielen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include "main.h" -#include "dialog.h" -#include "resource.h" - -INT_PTR CALLBACK CustomDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) -{ - static BOARD *pBoard; - - switch(uMsg) - { - case WM_INITDIALOG: - pBoard = (BOARD*) lParam; - SetDlgItemInt( hDlg, IDC_EDITROWS, pBoard->uRows, FALSE ); - SetDlgItemInt( hDlg, IDC_EDITCOLS, pBoard->uCols, FALSE ); - SetDlgItemInt( hDlg, IDC_EDITMINES, pBoard->uMines, FALSE ); - return TRUE; - - case WM_COMMAND: - switch( LOWORD( wParam ) ) - { - case IDOK: - pBoard->uRows = GetDlgItemInt( hDlg, IDC_EDITROWS, NULL, FALSE ); - pBoard->uCols = GetDlgItemInt( hDlg, IDC_EDITCOLS, NULL, FALSE ); - pBoard->uMines = GetDlgItemInt( hDlg, IDC_EDITMINES, NULL, FALSE ); - CheckLevel( pBoard ); - /* Fall through */ - case IDCANCEL: - EndDialog( hDlg, LOWORD(wParam) ); - return TRUE; - } - break; - } - - return FALSE; -} - -INT_PTR CALLBACK CongratsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) -{ - static BOARD *pBoard; - - switch(uMsg) - { - case WM_INITDIALOG: - pBoard = (BOARD*) lParam; - SetDlgItemText( hDlg, IDC_EDITNAME, pBoard->szBestName[pBoard->Difficulty] ); - return TRUE; - - case WM_COMMAND: - switch( LOWORD(wParam) ) - { - case IDOK: - GetDlgItemText( hDlg, IDC_EDITNAME, - pBoard->szBestName[pBoard->Difficulty], - sizeof( pBoard->szBestName[pBoard->Difficulty] ) ); - EndDialog( hDlg, 0 ); - return TRUE; - - case IDCANCEL: - EndDialog( hDlg, 0 ); - return TRUE; - } - break; - } - return FALSE; -} - -INT_PTR CALLBACK TimesDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) -{ - static BOARD *pBoard; - HKEY hKey; - UCHAR i; - TCHAR szData[16]; - TCHAR szKeyName[8]; - TCHAR szTimes[35]; - TCHAR szSeconds[23]; - TCHAR szNobody[15]; - - switch(uMsg) - { - case WM_INITDIALOG: - pBoard = (BOARD*) lParam; - - /* set best names */ - for( i = 0; i < 3; i++ ) - SetDlgItemText( hDlg, (IDC_NAME1) + i, pBoard->szBestName[i] ); - - /* set best times */ - LoadString( pBoard->hInst, IDS_SECONDS, szSeconds, sizeof(szSeconds) / sizeof(TCHAR) ); - - for( i = 0; i < 3; i++ ) - { - wsprintf(szTimes, TEXT("%d %s"), pBoard->uBestTime[i], szSeconds); - SetDlgItemText( hDlg, (IDC_TIME1) + i, szTimes ); - } - - return TRUE; - - case WM_COMMAND: - switch( LOWORD( wParam ) ) - { - case IDOK: - case IDCANCEL: - EndDialog( hDlg, 0 ); - return TRUE; - - case IDRESET: - if( RegCreateKeyEx( HKEY_CURRENT_USER, szWineMineRegKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL ) != ERROR_SUCCESS) - return TRUE; - - LoadString( pBoard->hInst, IDS_NOBODY, szNobody, sizeof(szNobody) / sizeof(TCHAR) ); - LoadString( pBoard->hInst, IDS_SECONDS, szSeconds, sizeof(szSeconds) / sizeof(TCHAR) ); - - for (i = 0; i < 3; i++) - { - pBoard->uBestTime[i] = 999; - _tcscpy(pBoard->szBestName[i], szNobody); - wsprintf(szTimes, TEXT("%d %s"), pBoard->uBestTime[i], szSeconds); - - SetDlgItemText( hDlg, (IDC_NAME1) + i, pBoard->szBestName[i] ); - SetDlgItemText( hDlg, (IDC_TIME1) + i, szTimes ); - } - - /* Write the changes to the registry - As we write to the same registry key as MS WinMine does, we have to start at 1 for the registry keys */ - for( i = 0; i < 3; i++ ) - { - wsprintf( szKeyName, TEXT("Name%u"), i + 1 ); - _tcsncpy( szData, pBoard->szBestName[i], sizeof(szData) / sizeof(TCHAR) ); - RegSetValueEx( hKey, szKeyName, 0, REG_SZ, (LPBYTE)szData, (_tcslen(szData) + 1) * sizeof(TCHAR) ); - } - - for( i = 0; i < 3; i++ ) - { - wsprintf( szKeyName, TEXT("Time%u"), i + 1 ); - RegSetValueEx( hKey, szKeyName, 0, REG_DWORD, (LPBYTE)&pBoard->uBestTime[i], sizeof(DWORD) ); - } - - RegCloseKey(hKey); - return TRUE; - } - } - - return FALSE; -} - diff --git a/base/applications/games/winemine/dialog.h b/base/applications/games/winemine/dialog.h deleted file mode 100644 index 11a5d9bbcfc..00000000000 --- a/base/applications/games/winemine/dialog.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * WineMine (dialog.h) - * - * Copyright 2000 Joshua Thielen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -INT_PTR CALLBACK CustomDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); -INT_PTR CALLBACK CongratsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); -INT_PTR CALLBACK TimesDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); -INT_PTR CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); diff --git a/base/applications/games/winemine/lang/bg-BG.rc b/base/applications/games/winemine/lang/bg-BG.rc deleted file mode 100644 index 293c05ef845..00000000000 --- a/base/applications/games/winemine/lang/bg-BG.rc +++ /dev/null @@ -1,77 +0,0 @@ -#include "resource.h" - -LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "seconds" - IDS_NOBODY, "Nobody" - IDS_ABOUT, "by Joshua Thielen and ReactOS developers" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&ネ胙" - BEGIN - MENUITEM "&ヘ籵\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "ネ鉐鈔瑙 &糶頸褄 (?)", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "ヘ&竟瑯", IDM_BEGINNER - MENUITEM "ヘ&裝琿", IDM_ADVANCED - MENUITEM "&ツ襌", IDM_EXPERT - MENUITEM "&ヘ璢琥萵", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&ヘ琺- 糅褌褊", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "ネ&", IDM_EXIT - END - POPUP "&ム粢蒟" - BEGIN - MENUITEM "&ヌ", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "ヘ琺- 糅褌褊" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "ヘ琺- 糅褌褊", IDNONE, 10, 10, 182, 45 - LTEXT "ヘ璞竟瑯:", IDNONE, 20, 20, 58, 8 - LTEXT "ヘ瑜裝琿:", IDNONE, 20, 30, 58, 8 - LTEXT "ツ襌:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "ト碣", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&ホ頌籵 裼瑣頸", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "マ鈕珞!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "ツ粢蒟 韲褪 ", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "ト碣", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "ヘ璢蒟 鞳" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "ミ裝:", IDNONE, 5, 15, 43, 10 - LTEXT "ム矜:", IDNONE, 5, 35, 43, 10 - LTEXT "フ竟:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "ト碣", IDOK, 86, 32, 45, 15 - PUSHBUTTON "ホ珸", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/ca-ES.rc b/base/applications/games/winemine/lang/ca-ES.rc deleted file mode 100644 index 0c300dd6423..00000000000 --- a/base/applications/games/winemine/lang/ca-ES.rc +++ /dev/null @@ -1,77 +0,0 @@ -#include "resource.h" - -LANGUAGE LANG_CATALAN, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "seconds" - IDS_NOBODY, "Nobody" - IDS_ABOUT, "by Joshua Thielen and ReactOS developers" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Game" - BEGIN - MENUITEM "&Nou\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "In&terrogant (?)", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&Principiant", IDM_BEGINNER - MENUITEM "&Avan軋t", IDM_ADVANCED - MENUITEM "&Expert", IDM_EXPERT - MENUITEM "Pe&rsonalitzat", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&Millors Temps", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "&Sortida", IDM_EXIT - END - POPUP "&Info" - BEGIN - MENUITEM "En q&uant a", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Millors Temps" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Millors Temps", IDNONE, 10, 10, 182, 45 - LTEXT "Principiant:", IDNONE, 20, 20, 58, 8 - LTEXT "Avan軋t:", IDNONE, 20, 30, 58, 8 - LTEXT "Expert:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "Acceptar", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Reset Scores", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Felicitats!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Si us plau, entreu el vostre nom", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "Acceptar", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Joc Personalitzat" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Files:", IDNONE, 5, 15, 43, 10 - LTEXT "Columnes:", IDNONE, 5, 35, 43, 10 - LTEXT "Mines:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "Acceptar", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Cancelキlar", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/cs-CZ.rc b/base/applications/games/winemine/lang/cs-CZ.rc deleted file mode 100644 index bd776bafc40..00000000000 --- a/base/applications/games/winemine/lang/cs-CZ.rc +++ /dev/null @@ -1,87 +0,0 @@ -/* FILE: applications/games/winemine/lang/cs-CZ.rc - * PURPOSE: Czech Language File - * TRANSLATORS: Stepan Gabriel - SGABA (sgaba@centrum.cz); Radek Liska aka Black_Fox (radekliska at gmail dot com) - * TRANSLATED FROM: Slovak translation by Kario (kario@szm.sk) - * UPDATED: 2010-05-25 - * - * Czech translation - * Copyleft 2007 Kario (kario@szm.sk),2008 SGABA (sgaba@centrum.cz) - */ - -#include "resource.h" - -LANGUAGE LANG_CZECH, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "sek." - IDS_NOBODY, "Bezejmenn" //windows = Anonym - IDS_ABOUT, "od Joshua Thielena a vvoj碾 syst駑u ReactOS" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Hra" - BEGIN - MENUITEM "&Nov hra\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "Zn&a鑢y (?)", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&Za鞦te鈩k", IDM_BEGINNER - MENUITEM "&Pokro鑛l", IDM_ADVANCED - MENUITEM "&Expert", IDM_EXPERT - MENUITEM "&Vlastn...", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&Nejlep夬 鐶sy...", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "&Konec", IDM_EXIT - END - POPUP "&N疳ovda" //windows = &Pomocnk - BEGIN - MENUITEM "&O programu...", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Nejrychlej夬 hleda鑛 min" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Nejlep夬 鐶sy", IDNONE, 10, 10, 182, 45 - LTEXT "Za鞦te鈩k:", IDNONE, 20, 20, 58, 8 - LTEXT "Pokro鑛l:", IDNONE, 20, 30, 58, 8 - LTEXT "Expert:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Vynulovat vsledky", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Blahopeji!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Zadejte prosm svoje jm駭o", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Vlastn pole" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "V嗅a:", IDNONE, 5, 15, 43, 10 - LTEXT "器ka:", IDNONE, 5, 35, 43, 10 - LTEXT "Miny:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Storno", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/de-DE.rc b/base/applications/games/winemine/lang/de-DE.rc deleted file mode 100644 index 69676c41f56..00000000000 --- a/base/applications/games/winemine/lang/de-DE.rc +++ /dev/null @@ -1,77 +0,0 @@ -#include "resource.h" - -LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL - -STRINGTABLE -BEGIN - IDS_SECONDS, "Sekunden" - IDS_NOBODY, "Niemand" - IDS_ABOUT, "von Joshua Thielen und ReactOS-Entwicklern" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Spiel" - BEGIN - MENUITEM "&Neu\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "&Merker (?)", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&Anf舅ger", IDM_BEGINNER - MENUITEM "&Fortgeschrittene", IDM_ADVANCED - MENUITEM "&Profis", IDM_EXPERT - MENUITEM "&Benutzerdefiniert...", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&Bestzeiten", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "Beenden", IDM_EXIT - END - POPUP "&?" - BEGIN - MENUITEM "&Info...", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Bestzeiten" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Bestzeiten", IDNONE, 10, 10, 182, 45 - LTEXT "Anf舅ger:", IDNONE, 20, 20, 58, 8 - LTEXT "Fortgeschrittene:", IDNONE, 20, 30, 58, 8 - LTEXT "Profis:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "Bestzeiten &lschen", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Glckwunsch!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Bitte geben Sie Ihren Namen ein", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Benutzerdefiniertes Spiel" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Hhe:", IDNONE, 5, 15, 43, 10 - LTEXT "Breite:", IDNONE, 5, 35, 43, 10 - LTEXT "Minen:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Abbrechen", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/el-GR.rc b/base/applications/games/winemine/lang/el-GR.rc deleted file mode 100644 index 6ff2605861d..00000000000 --- a/base/applications/games/winemine/lang/el-GR.rc +++ /dev/null @@ -1,77 +0,0 @@ -#include "resource.h" - -LANGUAGE LANG_GREEK, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "seconds" - IDS_NOBODY, "Nobody" - IDS_ABOUT, "by Joshua Thielen and ReactOS developers" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Game" - BEGIN - MENUITEM "&ヘン\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "&モ銕裃 褥銕磑鳰", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&チワ鴆", IDM_BEGINNER - MENUITEM "&ミ銕ン", IDM_ADVANCED - MENUITEM "&ナ鱠鳰", IDM_EXPERT - MENUITEM "&ミ鳰", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&テ鈬褥 ラ", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "ク&蔡", IDM_EXIT - END - POPUP "&?" - BEGIN - MENUITEM "&モ襁鳰ワ...", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "テ鈬褥 ラ" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "テ鈬褥 ラ", IDNONE, 10, 10, 182, 45 - LTEXT "チワ鴆:", IDNONE, 20, 20, 58, 8 - LTEXT "ミ銕ン:", IDNONE, 20, 30, 58, 8 - LTEXT "ナ鱠鳰:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "Oハ", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Reset Scores", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "モ胱碵鉚゙鱆!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "ミ碵碎硴 銖 ワ 碪", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "Oハ", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "ミ鳰 ミ硅゚蓚" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "テ碆ン:", IDNONE, 5, 15, 43, 10 - LTEXT "モ゙褪:", IDNONE, 5, 35, 43, 10 - LTEXT "ヘワ褪:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "Oハ", IDOK, 86, 32, 45, 15 - PUSHBUTTON "チ", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/en-US.rc b/base/applications/games/winemine/lang/en-US.rc deleted file mode 100644 index 7dfe642b65f..00000000000 --- a/base/applications/games/winemine/lang/en-US.rc +++ /dev/null @@ -1,77 +0,0 @@ -#include "resource.h" - -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US - -STRINGTABLE -BEGIN - IDS_SECONDS, "seconds" - IDS_NOBODY, "Nobody" - IDS_ABOUT, "by Joshua Thielen and ReactOS developers" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Game" - BEGIN - MENUITEM "&New\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "&Marks (?)", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&Beginner", IDM_BEGINNER - MENUITEM "&Intermediate", IDM_ADVANCED - MENUITEM "&Expert", IDM_EXPERT - MENUITEM "&Custom...", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&Best Times...", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "E&xit", IDM_EXIT - END - POPUP "&Help" - BEGIN - MENUITEM "&About", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Fastest Times" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Fastest Times", IDNONE, 10, 10, 182, 45 - LTEXT "Beginner:", IDNONE, 20, 20, 58, 8 - LTEXT "Intermediate:", IDNONE, 20, 30, 58, 8 - LTEXT "Expert:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Reset Scores", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Congratulations!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Please enter your name", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Custom Game" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Height:", IDNONE, 5, 15, 43, 10 - LTEXT "Width:", IDNONE, 5, 35, 43, 10 - LTEXT "Mines:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Cancel", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/es-ES.rc b/base/applications/games/winemine/lang/es-ES.rc deleted file mode 100644 index 2a9296c27b0..00000000000 --- a/base/applications/games/winemine/lang/es-ES.rc +++ /dev/null @@ -1,77 +0,0 @@ -#include "resource.h" - -LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL - -STRINGTABLE -BEGIN - IDS_SECONDS, "segundos" - IDS_NOBODY, "Nadie" - IDS_ABOUT, "por Joshua Thielen y los programadores de ReactOS" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Juego" - BEGIN - MENUITEM "&Nuevo\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "&Marcar Interrogantes", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&Principiante", IDM_BEGINNER - MENUITEM "&Advanzado", IDM_ADVANCED - MENUITEM "&Experto", IDM_EXPERT - MENUITEM "&Juego Personalizado", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&Mejores Tiempos", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "&Salir", IDM_EXIT - END - POPUP "&Informacin" - BEGIN - MENUITEM "&Acerca de", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Mejores Tiempos" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Mejores Tiempos", IDNONE, 10, 10, 182, 45 - LTEXT "Principiante:", IDNONE, 20, 20, 58, 8 - LTEXT "Advanzado:", IDNONE, 20, 30, 58, 8 - LTEXT "Experto:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "Aceptar", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Limpiar lista", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "。Felicidades!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Por Favor, introduce tu nombre", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "Aceptar", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Juego Personalizado" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Filas:", IDNONE, 5, 15, 43, 10 - LTEXT "Columnas:", IDNONE, 5, 35, 43, 10 - LTEXT "Minas:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "Aceptar", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Cancelar", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/eu-ES.rc b/base/applications/games/winemine/lang/eu-ES.rc deleted file mode 100644 index d470b1f5273..00000000000 --- a/base/applications/games/winemine/lang/eu-ES.rc +++ /dev/null @@ -1,78 +0,0 @@ - -#include "resource.h" - -LANGUAGE LANG_BASQUE, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "segunduak" - IDS_NOBODY, "Inor ez" - IDS_ABOUT, "Joshua Thielen eta ReactOS programatzaileek" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Jokoa" - BEGIN - MENUITEM "&Berria\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "&Galdera ikurrak jarri", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&Hasiberria", IDM_BEGINNER - MENUITEM "&Tartekoa", IDM_ADVANCED - MENUITEM "&Aditua", IDM_EXPERT - MENUITEM "&Pertsonalizatu jokoa", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&Denborarik onenak", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "&Irten", IDM_EXIT - END - POPUP "&Informazioa" - BEGIN - MENUITEM "&Buscaminas-i buruz", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Denborarik onenak" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Denborarik onenak ", IDNONE, 10, 10, 182, 45 - LTEXT "Hasiberria:", IDNONE, 20, 20, 58, 8 - LTEXT "Tartekoa:", IDNONE, 20, 30, 58, 8 - LTEXT "Aditua:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "Ados", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Berrezarri markagailuak", IDRESET, 18, 57, 84, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Zorionak!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Mesedez, idatzi zure izena", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "Ados", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Pertsonalizatu jokoa" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Zabalera:", IDNONE, 5, 15, 43, 10 - LTEXT "Altuera:", IDNONE, 5, 35, 43, 10 - LTEXT "Minak:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "Ados", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Utzi", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/fr-FR.rc b/base/applications/games/winemine/lang/fr-FR.rc deleted file mode 100644 index 12f8ad5526a..00000000000 --- a/base/applications/games/winemine/lang/fr-FR.rc +++ /dev/null @@ -1,84 +0,0 @@ -#include "resource.h" - -/* - * Translation made by Jerome Signouret, 2006. - * Initial file : http://svn.reactos.org/viewcvs/trunk/reactos/base/applications/games/winemine/En.rc - * Revision : 85 - */ - -LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL - -STRINGTABLE -BEGIN - IDS_SECONDS, "secondes" - IDS_NOBODY, "Anonyme" - IDS_ABOUT, "par Joshua Thielen et les d騅eloppeurs de ReactOS" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Jeu" - BEGIN - MENUITEM "&Nouveau\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "&Marqueur ?", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&D饕utant", IDM_BEGINNER - MENUITEM "&Amateur", IDM_ADVANCED - MENUITEM "&Expert", IDM_EXPERT - MENUITEM "&Sur mesure", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&Temps acc駘駻", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "&Quitter", IDM_EXIT - END - POPUP "&Informations" - BEGIN - MENUITEM "&Temps acc駘駻", IDM_TIMES - MENUITEM "&タ propos", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Temps acc駘駻" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Temps acc駘駻", IDNONE, 10, 10, 182, 45 - LTEXT "D饕utant:", IDNONE, 20, 20, 58, 8 - LTEXT "Amateur:", IDNONE, 20, 30, 58, 8 - LTEXT "Expert:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&R駟nitialiser les scores", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "F駘icitations !" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Veuillez entrer votre nom :", IDNONE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "Ok", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Sur mesure" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Lignes:", IDNONE, 5, 15, 43, 10 - LTEXT "Colonnes:", IDNONE, 5, 35, 43, 10 - LTEXT "Mines:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Annuler", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/id-ID.rc b/base/applications/games/winemine/lang/id-ID.rc deleted file mode 100644 index 1fa62a26dc4..00000000000 --- a/base/applications/games/winemine/lang/id-ID.rc +++ /dev/null @@ -1,77 +0,0 @@ -#include "resource.h" - -LANGUAGE LANG_INDONESIAN, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "seconds" - IDS_NOBODY, "Nobody" - IDS_ABOUT, "by Joshua Thielen and ReactOS developers" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Game" - BEGIN - MENUITEM "&Baru\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "&Tandai Pertanyaan", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&Pemula", IDM_BEGINNER - MENUITEM "&Lanjutan", IDM_ADVANCED - MENUITEM "&Ahli", IDM_EXPERT - MENUITEM "&Kustom", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&Waktu Tercepat", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "E&xit", IDM_EXIT - END - POPUP "&Info" - BEGIN - MENUITEM "&Tentang", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Waktu Tercepat" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Waktu Tercepat", IDNONE, 10, 10, 182, 45 - LTEXT "Pemula:", IDNONE, 20, 20, 58, 8 - LTEXT "Lanjutan:", IDNONE, 20, 30, 58, 8 - LTEXT "Ahli:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Reset Scores", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Selamat!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Silahkan masukkan nama anda", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Game Kustom" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Baris:", IDNONE, 5, 15, 43, 10 - LTEXT "Kolom:", IDNONE, 5, 35, 43, 10 - LTEXT "Mines:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Batal", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/it-IT.rc b/base/applications/games/winemine/lang/it-IT.rc deleted file mode 100644 index 5b96df7d989..00000000000 --- a/base/applications/games/winemine/lang/it-IT.rc +++ /dev/null @@ -1,77 +0,0 @@ -#include "resource.h" - -LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL - -STRINGTABLE -BEGIN - IDS_SECONDS, "seconds" - IDS_NOBODY, "Anonimo" - IDS_ABOUT, "by Joshua Thielen and ReactOS developers" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Game" - BEGIN - MENUITEM "&Nuova\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "&Segno (?)", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&Principiante", IDM_BEGINNER - MENUITEM "&Intermedio", IDM_ADVANCED - MENUITEM "Espe&rto", IDM_EXPERT - MENUITEM "Personali&zza", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&Tempi migliori", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "&Esci", IDM_EXIT - END - POPUP "&Info" - BEGIN - MENUITEM "&Informazioni su Campo minato", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Tempi migliori" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Tempi migliori", IDNONE, 10, 10, 182, 45 - LTEXT "Principiante:", IDNONE, 20, 20, 58, 8 - LTEXT "Intermedio:", IDNONE, 20, 30, 58, 8 - LTEXT "Esperto:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Reset Scores", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Complimenti!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Digita il tuo nome per favore", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "Ok", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Campo personalizzato" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Righe:", IDNONE, 5, 15, 43, 10 - LTEXT "Colonne:", IDNONE, 5, 35, 43, 10 - LTEXT "Mine:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Annulla", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/ja-JP.rc b/base/applications/games/winemine/lang/ja-JP.rc deleted file mode 100644 index 6f6e3699f25..00000000000 --- a/base/applications/games/winemine/lang/ja-JP.rc +++ /dev/null @@ -1,77 +0,0 @@ -#include "resource.h" - -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "秒" - IDS_NOBODY, "名前なし" - IDS_ABOUT, "Joshua ThielenとReactOS developersより" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "ゲーム(&G)" - BEGIN - MENUITEM "新規ゲーム(&N)\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "?マーク(&M)", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "初心者(&B)", IDM_BEGINNER - MENUITEM "中級者(&I)", IDM_ADVANCED - MENUITEM "玄人(&E)", IDM_EXPERT - MENUITEM "カスタム(&C)...", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "ベストタイム(&B)...", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "終了(&X)", IDM_EXIT - END - POPUP "ヘルプ(&H)" - BEGIN - MENUITEM "WineMineについて(&A)", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "最速タイム" -FONT 9, "MS UI Gothic" -BEGIN - GROUPBOX "最速タイム", IDNONE, 10, 10, 182, 45 - LTEXT "初心者:", IDNONE, 20, 20, 58, 8 - LTEXT "中級者:", IDNONE, 20, 30, 58, 8 - LTEXT "玄人:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "スコアのリセット(&R)", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "おめでとう!" -FONT 9, "MS UI Gothic" -BEGIN - LTEXT "お名前を入力してください", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "カスタムゲーム" -FONT 9, "MS UI Gothic" -BEGIN - LTEXT "高さ:", IDNONE, 5, 15, 43, 10 - LTEXT "幅:", IDNONE, 5, 35, 43, 10 - LTEXT "地雷の数:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15 - PUSHBUTTON "キャンセル", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/ko-KR.rc b/base/applications/games/winemine/lang/ko-KR.rc deleted file mode 100644 index 68759496e51..00000000000 --- a/base/applications/games/winemine/lang/ko-KR.rc +++ /dev/null @@ -1,80 +0,0 @@ -/* - *Korean translation by manatails007(www.manatails007.org) - */ -#include "resource.h" - -LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "テハ" - IDS_NOBODY, "タヘク" - IDS_ABOUT, "by Joshua Thielen and ReactOS developers" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "ーヤタモ(&G)" - BEGIN - MENUITEM "サ ーヤタモ(&N)\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "? ヌ・ステ(&M)", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "テハア゙(&B)", IDM_BEGINNER - MENUITEM "チ゚ア゙(&I)", IDM_ADVANCED - MENUITEM "ーア゙(&E)", IDM_EXPERT - MENUITEM "トソスコナメ(&C)", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "テヨー ア箙マ(&B)", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "チセキ(&E)", IDM_EXIT - END - POPUP "オオソクサ(&H)" - BEGIN - MENUITEM "チ、コク(&A)", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Fastest Times" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "テヨー ア箙マ", IDNONE, 10, 10, 182, 45 - LTEXT "テハア゙:", IDNONE, 20, 20, 58, 8 - LTEXT "チ゚ア゙:", IDNONE, 20, 30, 58, 8 - LTEXT "ーア゙:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "ネョタホ", IDOK, 127, 57, 50, 15 - PUSHBUTTON "チ。シ テハア篳ュ(&R)", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "テ猊マヌユエマエル!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "タフクァタサ タヤキツヌマシシソ", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "ネョタホ", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "トソスコナメ ーヤタモ" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "ウタフ:", IDNONE, 5, 15, 43, 10 - LTEXT "ウハコ:", IDNONE, 5, 35, 43, 10 - LTEXT "チキレ:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "ネョタホ", IDOK, 86, 32, 45, 15 - PUSHBUTTON "テシメ", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/lt-LT.rc b/base/applications/games/winemine/lang/lt-LT.rc deleted file mode 100644 index 76055285b1e..00000000000 --- a/base/applications/games/winemine/lang/lt-LT.rc +++ /dev/null @@ -1,80 +0,0 @@ -/* Translation by Vytis "CMan" Girdijauskas (cman@cman.us) */ - -#include "resource.h" - -LANGUAGE LANG_LITHUANIAN, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "sekunds" - IDS_NOBODY, "Niekas" - IDS_ABOUT, "Joshua Thielen ir ReactOS krjai" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&゙aidimas" - BEGIN - MENUITEM "&Naujas aidimas\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "゙ymti &spjamus (?)", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&Pradedantis", IDM_BEGINNER - MENUITEM "Pa&eng誑", IDM_ADVANCED - MENUITEM "&Ekspertas", IDM_EXPERT - MENUITEM "Pasi&rinktas", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&Grei鑛ausi laikai", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "&Baigti", IDM_EXIT - END - POPUP "&Info" - BEGIN - - MENUITEM "&Apie", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Grei鑛ausi laikai" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Grei鑛ausi laikai", IDNONE, 10, 10, 182, 45 - LTEXT "Pradedantis:", IDNONE, 20, 20, 58, 8 - LTEXT "Paeng誑:", IDNONE, 20, 30, 58, 8 - LTEXT "Ekspertas:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Atstatyti", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Sveikiname!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Praome 疵ayti savo vard", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "Gerai", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Pasirinktas aidimas" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Eiluts:", IDNONE, 5, 15, 43, 10 - LTEXT "Stulpeliai:", IDNONE, 5, 35, 43, 10 - LTEXT "Minos:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "Gerai", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Atsisakyti", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/nl-NL.rc b/base/applications/games/winemine/lang/nl-NL.rc deleted file mode 100644 index 16a89f5c304..00000000000 --- a/base/applications/games/winemine/lang/nl-NL.rc +++ /dev/null @@ -1,77 +0,0 @@ -#include "resource.h" - -LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL - -STRINGTABLE -BEGIN - IDS_SECONDS, "seconds" - IDS_NOBODY, "Nobody" - IDS_ABOUT, "by Joshua Thielen and ReactOS developers" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Game" - BEGIN - MENUITEM "&Nieuw\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "Vraagteken a&ctiveren", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&Beginner", IDM_BEGINNER - MENUITEM "&Gevorderde", IDM_ADVANCED - MENUITEM "&Expert", IDM_EXPERT - MENUITEM "Aan&passen", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "Bes&te tijd", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "&Afsluiten", IDM_EXIT - END - POPUP "&Info" - BEGIN - MENUITEM "&Over", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Beste tijd" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Beste tijd", IDNONE, 10, 10, 182, 45 - LTEXT "Beginner:", IDNONE, 20, 20, 58, 8 - LTEXT "Gevorderde:", IDNONE, 20, 30, 58, 8 - LTEXT "Expert:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Reset Scores", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Gefeleciteerd!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Gelieve uw naam in te voeren", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "Ok", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Aangepast spel" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Rijen:", IDNONE, 5, 15, 43, 10 - LTEXT "Kolommen:", IDNONE, 5, 35, 43, 10 - LTEXT "Mijnen:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Annuleren", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/no-NO.rc b/base/applications/games/winemine/lang/no-NO.rc deleted file mode 100644 index 99620f3b157..00000000000 --- a/base/applications/games/winemine/lang/no-NO.rc +++ /dev/null @@ -1,77 +0,0 @@ -#include "resource.h" - -LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL - -STRINGTABLE -BEGIN - IDS_SECONDS, "Sekunder" - IDS_NOBODY, "Ingen" - IDS_ABOUT, "av Joshua Thielen og ReactOS utviklere" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Spill" - BEGIN - MENUITEM "&Nytt\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "&Merk sprsm虱", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&Nybegynner", IDM_BEGINNER - MENUITEM "&Avansert", IDM_ADVANCED - MENUITEM "&Ekspert", IDM_EXPERT - MENUITEM "&Egendefinert", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&Beste tider", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "A&vslutt", IDM_EXIT - END - POPUP "&Informasjon" - BEGIN - MENUITEM "&Om", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Beste tider" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Beste tider", IDNONE, 10, 10, 182, 45 - LTEXT "Nybegynner:", IDNONE, 20, 20, 58, 8 - LTEXT "Avansert:", IDNONE, 20, 30, 58, 8 - LTEXT "Ekspert:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Nullstill poeng", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Gratulerer!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Skriv inn navnet ditt", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Tilpasse spill" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Hyde:", IDNONE, 5, 15, 43, 10 - LTEXT "Bredde:", IDNONE, 5, 35, 43, 10 - LTEXT "Miner:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Avbryt", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/pl-PL.rc b/base/applications/games/winemine/lang/pl-PL.rc deleted file mode 100644 index 7e181073988..00000000000 --- a/base/applications/games/winemine/lang/pl-PL.rc +++ /dev/null @@ -1,86 +0,0 @@ -/* Polish translation Emil Kaczmarek 2006 - * - * small changes by TestamenT - * testament@users.sourceforge.net - * https://sourceforge.net/projects/reactospl - * updated by Caemyr - Olaf Siejka (Jan, 2008) - */ - -#include "resource.h" - -LANGUAGE LANG_POLISH, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "sekund" - IDS_NOBODY, "Anonim" - IDS_ABOUT, "Autorzy: Joshua Thielen i Ekipa ReactOS" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Gra" - BEGIN - MENUITEM "&Nowa gra\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "Poz&iom", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&Poczケtkujケcy", IDM_BEGINNER - MENUITEM "Z&aawansowany", IDM_ADVANCED - MENUITEM "&Ekspert", IDM_EXPERT - MENUITEM "&Wウasny poziom", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "N&ajlepsze czasy", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "&Zamknij", IDM_EXIT - END - POPUP "&Informacje" - BEGIN - MENUITEM "N&ajlepsze czasy", IDM_TIMES - MENUITEM "&WineMine - informacje", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Najlepsze czasy" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Najlepsze czasy", IDNONE, 10, 10, 182, 45 - LTEXT "Poczケtkujケcy:", IDNONE, 20, 20, 58, 8 - LTEXT "Zaawansowany:", IDNONE, 20, 30, 58, 8 - LTEXT "Ekspert:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Zresetuj wyniki", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Gratulacje!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Wpisz swoje imi", IDNONE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Ustawienia gry" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Ilo懈 rz鹽w:", IDNONE, 5, 15, 43, 10 - LTEXT "Ilo懈 kolumn:", IDNONE, 5, 35, 43, 10 - LTEXT "Ilo懈 min:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Anuluj", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/ru-RU.rc b/base/applications/games/winemine/lang/ru-RU.rc deleted file mode 100644 index c398b67137f..00000000000 --- a/base/applications/games/winemine/lang/ru-RU.rc +++ /dev/null @@ -1,79 +0,0 @@ -// Russian language resource file (Dmitry Chapyshev, 2007-06-10) - -#include "resource.h" - -LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "裲" - IDS_NOBODY, "裴鈔褥" - IDS_ABOUT, "Joshua Thielen 珸珮韭 ReactOS" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&ネ胙" - BEGIN - MENUITEM "&ヘ籵 鞳濬tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "&フ褪", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "ヘ&粨", IDM_BEGINNER - MENUITEM "&ヒ礪褄", IDM_ADVANCED - MENUITEM "&マ褥韶琿", IDM_EXPERT - MENUITEM "ホ&磊...", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&ヒ裹 糅褌", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "&ツ", IDM_EXIT - END - POPUP "&ム珞" - BEGIN - MENUITEM "&ホ 胙瑟", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "ヒ裹 糅褌" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "ヒ裹 糅褌", IDNONE, 10, 10, 182, 45 - LTEXT "ヘ粨:", IDNONE, 20, 20, 58, 8 - LTEXT "ヒ礪褄:", IDNONE, 20, 30, 58, 8 - LTEXT "マ褥韶琿:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&ム碣頸", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "マ鈕珞褌!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "マ赳鴦籵 粐裝頸 籵 韲", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "ホ矜 鞳" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "ツ:", IDNONE, 5, 15, 43, 10 - LTEXT "リ頏竟:", IDNONE, 5, 35, 43, 10 - LTEXT "ラ頌 竟:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15 - PUSHBUTTON "ホ褊", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/sk-SK.rc b/base/applications/games/winemine/lang/sk-SK.rc deleted file mode 100644 index 80965475f9e..00000000000 --- a/base/applications/games/winemine/lang/sk-SK.rc +++ /dev/null @@ -1,81 +0,0 @@ -/* Slovak translation - * Copyleft 2007 Kario (kario@szm.sk) - */ - -#include "resource.h" - -LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "sek." - IDS_NOBODY, "Nikto" //windows = Anonym - IDS_ABOUT, "od Joshua Thielen a vvoj疵ov syst駑u ReactOS" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Hra" - BEGIN - MENUITEM "&Nov hra\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "Zn&a鑢y (?)", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&Za鑛ato鈩k", IDM_BEGINNER - MENUITEM "&Pokro鑛l", IDM_ADVANCED - MENUITEM "&Expert", IDM_EXPERT - MENUITEM "&Vlastn...", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&Najlep喨e 鐶sy...", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "S&kon鑛", IDM_EXIT - END - POPUP "&Info" //windows = &Pomocnk - BEGIN - MENUITEM "ネ&o je hra Mny...", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Najrchlej夬 hセada鑛 mn" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "Najlep喨e 鐶sy", IDNONE, 10, 10, 182, 45 - LTEXT "Za鑛ato鈩k:", IDNONE, 20, 20, 58, 8 - LTEXT "Pokro鑛l:", IDNONE, 20, 30, 58, 8 - LTEXT "Expert:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Vynulova vsledky", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Blaho枡l疥!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Zadajte svoje meno, prosm!", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "Vlastn pole" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "V嗅a:", IDNONE, 5, 15, 43, 10 - LTEXT "器rka:", IDNONE, 5, 35, 43, 10 - LTEXT "Mny:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15 - PUSHBUTTON "Zru喨", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/th-TH.rc b/base/applications/games/winemine/lang/th-TH.rc deleted file mode 100644 index 805c0f95e80..00000000000 --- a/base/applications/games/winemine/lang/th-TH.rc +++ /dev/null @@ -1,77 +0,0 @@ -#include "resource.h" - -LANGUAGE LANG_THAI, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "seconds" - IDS_NOBODY, "Nobody" - IDS_ABOUT, "by Joshua Thielen and ReactOS developers" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&Game" - BEGIN - MENUITEM "&ヒチ鐔tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "&、テラ靉ァヒチメツ、モカメチ", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "&テヤ霖オ鮖", IDM_BEGINNER - MENUITEM "&「ム鮖ハルァ「ヨ鮖", IDM_ADVANCED - MENUITEM "&シル鬪モケメュ", IDM_EXPERT - MENUITEM "&、ケキム霽莉", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&ヌナメキユ鞨テ酩キユ靆リエ", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "&ヘヘ。", IDM_EXIT - END - POPUP "&ィ鬧耆鮃テメコ" - BEGIN - MENUITEM "&。ユ霙ヌ。ムコ", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "猊ナメキユ鞨テ酩キユ靆リエ" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "猊ナメキユ鞨テ酩キユ靆リエ", IDNONE, 10, 10, 182, 45 - LTEXT "狹ヤ霖オ鮖:", IDNONE, 20, 20, 58, 8 - LTEXT "「ム鮖ハルァ「ヨ鮖:", IDNONE, 20, 30, 58, 8 - LTEXT "シル鬪モケメュ:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "オ。ナァ", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&Reset Scores", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "「ヘ睫エァ、ヌメチツヤケエユエ鯢ツ!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "篏テエ。テヘ。ェラ靉「ヘァ、リウ", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "オ。ナァ", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "爍チテミエムコ、ケキム霽莉" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "盡ヌ:", IDNONE, 5, 15, 43, 10 - LTEXT "ヒナム。:", IDNONE, 5, 35, 43, 10 - LTEXT "。ムコテミ犲ヤエ:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "オ。ナァ", IDOK, 86, 32, 45, 15 - PUSHBUTTON "ツ。倏ヤ。", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/uk-UA.rc b/base/applications/games/winemine/lang/uk-UA.rc deleted file mode 100644 index f7ee136b366..00000000000 --- a/base/applications/games/winemine/lang/uk-UA.rc +++ /dev/null @@ -1,85 +0,0 @@ -/* - * PROJECT: WineMine - * LICENSE: GPL - See COPYING in the top level directory - * FILE: base/applications/games/winemine/lang/uk-UA.rc - * PURPOSE: Ukraianian Language File for WineMine - * TRANSLATORS: Artem Reznikov, Igor Paliychuk - */ - -#include "resource.h" - -LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT - -STRINGTABLE -BEGIN - IDS_SECONDS, "裲" - IDS_NOBODY, "ヘウ" - IDS_ABOUT, "箋 Joshua Thielen ウ 銜硼韭ウ ReactOS" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "&テ" - BEGIN - MENUITEM "&ヘ籵\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "&フウ (?)", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "ヘ籵&", IDM_BEGINNER - MENUITEM "&タ瑣", IDM_ADVANCED - MENUITEM "マ&褥ウ琿", IDM_EXPERT - MENUITEM "&ホ硴鞣ウ...", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "&ラ褌ウ...", IDM_TIMES - MENUITEM SEPARATOR - MENUITEM "ツ&頷ウ", IDM_EXIT - END - POPUP "&イ璋ウ" - BEGIN - MENUITEM "&マ 胙瑟...", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "ラ褌ウ 鈞 瑣裙ウ" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "ハ瓊ウ 瑰", IDNONE, 10, 10, 182, 45 - LTEXT "ヘ籵:", IDNONE, 20, 20, 58, 8 - LTEXT "タ瑣:", IDNONE, 20, 30, 58, 8 - LTEXT "マ褥ウ琿:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "OK", IDOK, 127, 57, 50, 15 - PUSHBUTTON "&ム鞴瑙 裼瑣ウ", IDRESET, 18, 57, 77, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "ツウ瑙!" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "ツ粢莎 ツ璧 ウ'", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "ム褻ウ琿 " -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "ツ頌:", IDNONE, 5, 15, 43, 10 - LTEXT "リ頏竟:", IDNONE, 5, 35, 43, 10 - LTEXT "フウ:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "OK", IDOK, 86, 32, 45, 15 - PUSHBUTTON "ム瑰籵", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/lang/zh-CN.rc b/base/applications/games/winemine/lang/zh-CN.rc deleted file mode 100644 index 6d3dbe80842..00000000000 --- a/base/applications/games/winemine/lang/zh-CN.rc +++ /dev/null @@ -1,96 +0,0 @@ -/* - * WineMine (Simplified Chinese resources) - * - * Copyright 2007 zhangbing - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "resource.h" - -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED - -STRINGTABLE DISCARDABLE -BEGIN - IDS_SECONDS, "テ" - IDS_NOBODY, "ト菘" - IDS_ABOUT, "by Joshua Thielen and ReactOS developers" -END - -IDM_WINEMINE MENU DISCARDABLE -BEGIN - POPUP "ノィタラ(&G)" - BEGIN - MENUITEM "ソェセヨ(&N)\tF2", IDM_NEW - MENUITEM SEPARATOR - MENUITEM "アシヌ(?)(&M)", IDM_MARKQ - MENUITEM SEPARATOR - MENUITEM "ウシカ(&B)", IDM_BEGINNER - MENUITEM "ヨミシカ(&A)", IDM_ADVANCED - MENUITEM "ク゚シカ(&E)", IDM_EXPERT - MENUITEM "ラヤカィメ(&C)...", IDM_CUSTOM - MENUITEM SEPARATOR - MENUITEM "ヘヒウ(&X)", IDM_EXIT - END - POPUP "ミナマ「(&I)" - BEGIN - MENUITEM "ノィタラモ「ミロー(&F)...", IDM_TIMES - MENUITEM "ケリモレノィタラ(&A)...", IDM_ABOUT - END -END - -IDD_TIMES DIALOGEX DISCARDABLE 0, 0, 200, 75 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "ノィタラモ「ミロー" -FONT 8, "MS Shell Dlg" -BEGIN - GROUPBOX "ラク゚シヘツシ", IDNONE, 10, 10, 182, 45 - LTEXT "ウシカ:", IDNONE, 20, 20, 58, 8 - LTEXT "ヨミシカ:", IDNONE, 20, 30, 58, 8 - LTEXT "ク゚シカ:", IDNONE, 20, 40, 58, 8 - LTEXT "", IDC_TIME1, 80, 20, 50, 8 - LTEXT "", IDC_TIME2, 80, 30, 50, 8 - LTEXT "", IDC_TIME3, 80, 40, 50, 8 - LTEXT "", IDC_NAME1, 132, 20, 55, 8 - LTEXT "", IDC_NAME2, 132, 30, 55, 8 - LTEXT "", IDC_NAME3, 132, 40, 55, 8 - DEFPUSHBUTTON "ネキカィ", IDOK, 127, 57, 50, 15 - PUSHBUTTON "ヨリミツシヌキヨ(&R)", IDRESET, 18, 57, 67, 15 -END - -IDD_CONGRATS DIALOGEX DISCARDABLE 0, 0, 160, 60 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -FONT 8, "MS Shell Dlg" -CAPTION "ヒ「ミツシヘツシ!" -BEGIN - LTEXT "メムニニシヘツシ,ヌハ菠ト羞トテラヨ", IDIGNORE, 25, 10, 150, 10 - EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 - DEFPUSHBUTTON "ネキカィ", IDOK, 60, 40, 40, 15 -END - -IDD_CUSTOM DIALOGEX DISCARDABLE 0, 0, 139, 80 -STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT -CAPTION "ラヤカィメ蠡ラヌ" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "ク゚カネ:", IDNONE, 5, 15, 43, 10 - LTEXT "ソカネ:", IDNONE, 5, 35, 43, 10 - LTEXT "タラハ:", IDNONE, 5, 55, 43, 10 - EDITTEXT IDC_EDITROWS, 49, 15, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITCOLS, 49, 35, 30, 12, ES_NUMBER - EDITTEXT IDC_EDITMINES, 49, 55, 30, 12, ES_NUMBER - DEFPUSHBUTTON "ネキカィ", IDOK, 86, 32, 45, 15 - PUSHBUTTON "ネ。マ", IDCANCEL, 86, 52, 45, 15 -END diff --git a/base/applications/games/winemine/main.c b/base/applications/games/winemine/main.c deleted file mode 100644 index c3a4097f85a..00000000000 --- a/base/applications/games/winemine/main.c +++ /dev/null @@ -1,1085 +0,0 @@ -/* - * WineMine (main.c) - * - * Copyright 2000 Joshua Thielen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include -#include -#include -#include "main.h" -#include "dialog.h" -#include "resource.h" - -#ifdef DUMB_DEBUG -#include -#define DEBUG(x) fprintf(stderr,x) -#else -#define DEBUG(x) -#endif - -static const TCHAR szAppName[] = TEXT("WineMine"); - - -int WINAPI _tWinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR cmdline, int cmdshow ) -{ - MSG msg; - WNDCLASS wc; - HWND hWnd; - HACCEL haccel; - - wc.style = 0; - wc.lpfnWndProc = MainProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInst; - wc.hIcon = LoadIcon( hInst, MAKEINTRESOURCE(IDI_WINEMINE) ); - wc.hCursor = LoadCursor( NULL, (LPCTSTR)IDI_APPLICATION ); - wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); - wc.lpszMenuName = MAKEINTRESOURCE(IDM_WINEMINE); - wc.lpszClassName = szAppName; - - if ( !RegisterClass(&wc) ) - return 1; - - hWnd = CreateWindow( szAppName, szAppName, - WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX, - CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, - NULL, NULL, hInst, NULL ); - - if (!hWnd) - return 1; - - ShowWindow( hWnd, cmdshow ); - UpdateWindow( hWnd ); - - haccel = LoadAccelerators( hInst, MAKEINTRESOURCE(IDA_WINEMINE) ); - SetTimer( hWnd, ID_TIMER, 1000, NULL ); - - while( GetMessage(&msg, NULL, 0, 0) ) - { - if ( !TranslateAccelerator(hWnd, haccel, &msg) ) - TranslateMessage(&msg); - - DispatchMessage(&msg); - } - - return msg.wParam; -} - -LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - static BOARD board; - - switch(msg) - { - case WM_CREATE: - board.hInst = ((LPCREATESTRUCT) lParam)->hInstance; - board.hWnd = hWnd; - InitBoard( &board ); - CreateBoard( &board ); - return 0; - - case WM_PAINT: - { - HDC hDC; - HDC hMemDC; - PAINTSTRUCT ps; - - DEBUG("WM_PAINT\n"); - hDC = BeginPaint( hWnd, &ps ); - hMemDC = CreateCompatibleDC(hDC); - - DrawBoard( hDC, hMemDC, &ps, &board ); - - DeleteDC( hMemDC ); - EndPaint( hWnd, &ps ); - - return 0; - } - - case WM_MOVE: - DEBUG("WM_MOVE\n"); - board.Pos.x = (LONG) LOWORD(lParam); - board.Pos.y = (LONG) HIWORD(lParam); - return 0; - - case WM_DESTROY: - SaveBoard( &board ); - DestroyBoard( &board ); - PostQuitMessage( 0 ); - return 0; - - case WM_TIMER: - if( board.Status == PLAYING ) - { - board.uTime++; - RedrawWindow( hWnd, &board.TimerRect, NULL, RDW_INVALIDATE | RDW_UPDATENOW ); - } - return 0; - - case WM_LBUTTONDOWN: - DEBUG("WM_LBUTTONDOWN\n"); - - if( wParam & MK_RBUTTON ) - msg = WM_MBUTTONDOWN; - - TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg ); - SetCapture( hWnd ); - return 0; - - case WM_LBUTTONUP: - DEBUG("WM_LBUTTONUP\n"); - - if( wParam & MK_RBUTTON ) - msg = WM_MBUTTONUP; - - TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg ); - ReleaseCapture(); - return 0; - - case WM_RBUTTONDOWN: - DEBUG("WM_RBUTTONDOWN\n"); - - if( wParam & MK_LBUTTON ) - { - board.Press.x = 0; - board.Press.y = 0; - msg = WM_MBUTTONDOWN; - } - - TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg ); - return 0; - - case WM_RBUTTONUP: - DEBUG("WM_RBUTTONUP\n"); - if( wParam & MK_LBUTTON ) - msg = WM_MBUTTONUP; - TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg ); - return 0; - - case WM_MBUTTONDOWN: - DEBUG("WM_MBUTTONDOWN\n"); - TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg ); - return 0; - - case WM_MBUTTONUP: - DEBUG("WM_MBUTTONUP\n"); - TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg ); - return 0; - - case WM_MOUSEMOVE: - { - if( (wParam & MK_LBUTTON) && (wParam & MK_RBUTTON) ) - msg = WM_MBUTTONDOWN; - else if( wParam & MK_LBUTTON ) - msg = WM_LBUTTONDOWN; - else - return 0; - - TestBoard( hWnd, &board, LOWORD(lParam), HIWORD(lParam), msg ); - - return 0; - } - - case WM_COMMAND: - switch(LOWORD(wParam)) - { - case IDM_NEW: - CreateBoard( &board ); - return 0; - - case IDM_MARKQ: - { - HMENU hMenu; - - hMenu = GetMenu( hWnd ); - board.bMark = !board.bMark; - - if( board.bMark ) - CheckMenuItem( hMenu, IDM_MARKQ, MF_CHECKED ); - else - CheckMenuItem( hMenu, IDM_MARKQ, MF_UNCHECKED ); - - return 0; - } - - case IDM_BEGINNER: - SetDifficulty( &board, BEGINNER ); - CreateBoard( &board ); - return 0; - - case IDM_ADVANCED: - SetDifficulty( &board, ADVANCED ); - CreateBoard( &board ); - return 0; - - case IDM_EXPERT: - SetDifficulty( &board, EXPERT ); - CreateBoard( &board ); - return 0; - - case IDM_CUSTOM: - SetDifficulty( &board, CUSTOM ); - CreateBoard( &board ); - return 0; - - case IDM_EXIT: - SendMessage( hWnd, WM_CLOSE, 0, 0); - return 0; - - case IDM_TIMES: - DialogBoxParam( board.hInst, MAKEINTRESOURCE(IDD_TIMES), hWnd, TimesDlgProc, (LPARAM) &board); - return 0; - - case IDM_ABOUT: - { - TCHAR szOtherStuff[255]; - - LoadString( board.hInst, IDS_ABOUT, szOtherStuff, sizeof(szOtherStuff) / sizeof(TCHAR) ); - - ShellAbout( hWnd, szAppName, szOtherStuff, (HICON)SendMessage(hWnd, WM_GETICON, ICON_BIG, 0) ); - return 0; - } - - default: - DEBUG("Unknown WM_COMMAND command message received\n"); - break; - } - } - - return( DefWindowProc( hWnd, msg, wParam, lParam )); -} - -void InitBoard( BOARD *pBoard ) -{ - HMENU hMenu; - - pBoard->hMinesBMP = LoadBitmap( pBoard->hInst, (LPCTSTR) IDB_MINES); - pBoard->hFacesBMP = LoadBitmap( pBoard->hInst, (LPCTSTR) IDB_FACES); - pBoard->hLedsBMP = LoadBitmap( pBoard->hInst, (LPCTSTR) IDB_LEDS); - - LoadBoard( pBoard ); - - if( pBoard->Pos.x < GetSystemMetrics( SM_CXFIXEDFRAME ) ) - pBoard->Pos.x = GetSystemMetrics( SM_CXFIXEDFRAME ); - - if( pBoard->Pos.x > (GetSystemMetrics( SM_CXSCREEN ) - GetSystemMetrics( SM_CXFIXEDFRAME ))) - { - pBoard->Pos.x = GetSystemMetrics( SM_CXSCREEN ) - - GetSystemMetrics( SM_CXFIXEDFRAME ); - } - - if( pBoard->Pos.y < (GetSystemMetrics( SM_CYMENU ) + GetSystemMetrics( SM_CYCAPTION ) + GetSystemMetrics( SM_CYFIXEDFRAME ))) - { - pBoard->Pos.y = GetSystemMetrics( SM_CYMENU ) + - GetSystemMetrics( SM_CYCAPTION ) + - GetSystemMetrics( SM_CYFIXEDFRAME ); - } - - if( pBoard->Pos.y > (GetSystemMetrics( SM_CYSCREEN ) - GetSystemMetrics( SM_CYFIXEDFRAME ))) - { - pBoard->Pos.y = GetSystemMetrics( SM_CYSCREEN ) - - GetSystemMetrics( SM_CYFIXEDFRAME ); - } - - hMenu = GetMenu( pBoard->hWnd ); - CheckMenuItem( hMenu, IDM_BEGINNER + pBoard->Difficulty, MF_CHECKED ); - - if( pBoard->bMark ) - CheckMenuItem( hMenu, IDM_MARKQ, MF_CHECKED ); - else - CheckMenuItem( hMenu, IDM_MARKQ, MF_UNCHECKED ); - CheckLevel( pBoard ); -} - -static DWORD LoadDWord(HKEY hKey, TCHAR *szKeyName, DWORD dwDefaultValue) -{ - DWORD dwSize; - DWORD dwValue; - - dwSize = sizeof(DWORD); - - if( RegQueryValueEx( hKey, szKeyName, NULL, NULL, (LPBYTE) &dwValue, &dwSize ) == ERROR_SUCCESS ) - return dwValue; - - return dwDefaultValue; -} - -void LoadBoard( BOARD *pBoard ) -{ - DWORD dwSize; - HKEY hKey; - TCHAR szData[16]; - TCHAR szKeyName[8]; - TCHAR szNobody[15]; - UCHAR i; - - RegOpenKeyEx( HKEY_CURRENT_USER, szWineMineRegKey, 0, KEY_QUERY_VALUE, &hKey ); - - pBoard->Pos.x = (LONG) LoadDWord( hKey, TEXT("Xpos"), GetSystemMetrics(SM_CXFIXEDFRAME) ); - pBoard->Pos.y = (LONG) LoadDWord( hKey, TEXT("Ypos"), GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFIXEDFRAME) ); - pBoard->uRows = (ULONG) LoadDWord( hKey, TEXT("Height"), BEGINNER_ROWS ); - pBoard->uCols = (ULONG) LoadDWord( hKey, TEXT("Width"), BEGINNER_COLS ); - pBoard->uMines = (ULONG) LoadDWord( hKey, TEXT("Mines"), BEGINNER_MINES ); - pBoard->Difficulty = (DIFFICULTY) LoadDWord( hKey, TEXT("Difficulty"), BEGINNER ); - pBoard->bMark = (BOOL) LoadDWord( hKey, TEXT("Mark"), TRUE ); - - LoadString( pBoard->hInst, IDS_NOBODY, szNobody, sizeof(szNobody) / sizeof(TCHAR) ); - - for( i = 0; i < 3; i++ ) - { - // As we write to the same registry key as MS WinMine does, we have to start at 1 for the registry keys - wsprintf( szKeyName, TEXT("Name%d"), i + 1 ); - dwSize = sizeof(szData); - - if( RegQueryValueEx( hKey, szKeyName, NULL, NULL, (LPBYTE)szData, (LPDWORD) &dwSize ) == ERROR_SUCCESS ) - _tcsncpy( pBoard->szBestName[i], szData, sizeof(szData) / sizeof(TCHAR) ); - else - _tcscpy( pBoard->szBestName[i], szNobody); - } - - for( i = 0; i < 3; i++ ) - { - wsprintf( szKeyName, TEXT("Time%d"), i + 1 ); - pBoard->uBestTime[i] = LoadDWord( hKey, szKeyName, 999 ); - } - - RegCloseKey(hKey); -} - -void SaveBoard( BOARD *pBoard ) -{ - DWORD dwValue; - HKEY hKey; - UCHAR i; - TCHAR szData[16]; - TCHAR szKeyName[8]; - - if( RegCreateKeyEx( HKEY_CURRENT_USER, szWineMineRegKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL ) != ERROR_SUCCESS) - return; - - RegSetValueEx( hKey, TEXT("Xpos"), 0, REG_DWORD, (LPBYTE) &pBoard->Pos.x, sizeof(DWORD) ); - RegSetValueEx( hKey, TEXT("Ypos"), 0, REG_DWORD, (LPBYTE) &pBoard->Pos.y, sizeof(DWORD) ); - RegSetValueEx( hKey, TEXT("Difficulty"), 0, REG_DWORD, (LPBYTE) &pBoard->Difficulty, sizeof(DWORD) ); - RegSetValueEx( hKey, TEXT("Height"), 0, REG_DWORD, (LPBYTE) &pBoard->uRows, sizeof(DWORD) ); - RegSetValueEx( hKey, TEXT("Width"), 0, REG_DWORD, (LPBYTE) &pBoard->uCols, sizeof(DWORD) ); - RegSetValueEx( hKey, TEXT("Mines"), 0, REG_DWORD, (LPBYTE) &pBoard->uMines, sizeof(DWORD) ); - RegSetValueEx( hKey, TEXT("Mark"), 0, REG_DWORD, (LPBYTE) &pBoard->bMark, sizeof(DWORD) ); - - for( i = 0; i < 3; i++ ) - { - // As we write to the same registry key as MS WinMine does, we have to start at 1 for the registry keys - wsprintf( szKeyName, TEXT("Name%u"), i + 1); - _tcsncpy( szData, pBoard->szBestName[i], sizeof(szData) / sizeof(TCHAR) ); - RegSetValueEx( hKey, szKeyName, 0, REG_SZ, (LPBYTE)szData, (_tcslen(szData) + 1) * sizeof(TCHAR) ); - } - - for( i = 0; i < 3; i++ ) - { - wsprintf( szKeyName, TEXT("Time%u"), i + 1); - dwValue = pBoard->uBestTime[i]; - RegSetValueEx( hKey, szKeyName, 0, REG_DWORD, (LPBYTE)(LPDWORD)&dwValue, sizeof(DWORD) ); - } - - RegCloseKey(hKey); -} - -void DestroyBoard( BOARD *pBoard ) -{ - DeleteObject( pBoard->hFacesBMP ); - DeleteObject( pBoard->hLedsBMP ); - DeleteObject( pBoard->hMinesBMP ); -} - -void SetDifficulty( BOARD *pBoard, DIFFICULTY Difficulty ) -{ - HMENU hMenu; - - switch(Difficulty) - { - case BEGINNER: - pBoard->uCols = BEGINNER_COLS; - pBoard->uRows = BEGINNER_ROWS; - pBoard->uMines = BEGINNER_MINES; - break; - - case ADVANCED: - pBoard->uCols = ADVANCED_COLS; - pBoard->uRows = ADVANCED_ROWS; - pBoard->uMines = ADVANCED_MINES; - break; - - case EXPERT: - pBoard->uCols = EXPERT_COLS; - pBoard->uRows = EXPERT_ROWS; - pBoard->uMines = EXPERT_MINES; - break; - - case CUSTOM: - if( DialogBoxParam( pBoard->hInst, MAKEINTRESOURCE(IDD_CUSTOM), pBoard->hWnd, CustomDlgProc, (LPARAM) pBoard) != IDOK ) - return; - - break; - } - - hMenu = GetMenu(pBoard->hWnd); - CheckMenuItem( hMenu, IDM_BEGINNER + pBoard->Difficulty, MF_UNCHECKED ); - pBoard->Difficulty = Difficulty; - CheckMenuItem( hMenu, IDM_BEGINNER + Difficulty, MF_CHECKED ); - -} - -void CreateBoard( BOARD *pBoard ) -{ - ULONG uLeft, uTop, uBottom, uRight, uWndX, uWndY, uWndWidth, uWndHeight; - - pBoard->uBoxesLeft = pBoard->uCols * pBoard->uRows - pBoard->uMines; - pBoard->uNumFlags = 0; - - CreateBoxes( pBoard ); - - pBoard->uWidth = pBoard->uCols * MINE_WIDTH + BOARD_WMARGIN * 2; - - pBoard->uHeight = pBoard->uRows * MINE_HEIGHT + LED_HEIGHT - + BOARD_HMARGIN * 3; - - uWndX = pBoard->Pos.x - GetSystemMetrics( SM_CXFIXEDFRAME ); - uWndY = pBoard->Pos.y - GetSystemMetrics( SM_CYMENU ) - - GetSystemMetrics( SM_CYCAPTION ) - - GetSystemMetrics( SM_CYFIXEDFRAME ); - uWndWidth = pBoard->uWidth + GetSystemMetrics( SM_CXFIXEDFRAME ) * 2; - uWndHeight = pBoard->uHeight - + GetSystemMetrics( SM_CYMENU ) - + GetSystemMetrics( SM_CYCAPTION ) - + GetSystemMetrics( SM_CYFIXEDFRAME ) * 2; - - /* setting the mines rectangle boundary */ - uLeft = BOARD_WMARGIN; - uTop = BOARD_HMARGIN * 2 + LED_HEIGHT; - uRight = uLeft + pBoard->uCols * MINE_WIDTH; - uBottom = uTop + pBoard->uRows * MINE_HEIGHT; - SetRect( &pBoard->MinesRect, uLeft, uTop, uRight, uBottom ); - - /* setting the face rectangle boundary */ - uLeft = pBoard->uWidth / 2 - FACE_WIDTH / 2; - uTop = BOARD_HMARGIN; - uRight = uLeft + FACE_WIDTH; - uBottom = uTop + FACE_HEIGHT; - SetRect( &pBoard->FaceRect, uLeft, uTop, uRight, uBottom ); - - /* setting the timer rectangle boundary */ - uLeft = BOARD_WMARGIN; - uTop = BOARD_HMARGIN; - uRight = uLeft + LED_WIDTH * 3; - uBottom = uTop + LED_HEIGHT; - SetRect( &pBoard->CounterRect, uLeft, uTop, uRight, uBottom ); - - /* setting the counter rectangle boundary */ - uLeft = pBoard->uWidth - BOARD_WMARGIN - LED_WIDTH * 3; - uTop = BOARD_HMARGIN; - uRight = pBoard->uWidth - BOARD_WMARGIN; - uBottom = uTop + LED_HEIGHT; - SetRect( &pBoard->TimerRect, uLeft, uTop, uRight, uBottom ); - - pBoard->Status = WAITING; - pBoard->FaceBmp = SMILE_BMP; - pBoard->uTime = 0; - - MoveWindow( pBoard->hWnd, uWndX, uWndY, uWndWidth, uWndHeight, TRUE ); - RedrawWindow( pBoard->hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE ); -} - -void CheckLevel( BOARD *pBoard ) -{ - if( pBoard->uRows < BEGINNER_ROWS ) - pBoard->uRows = BEGINNER_ROWS; - - if( pBoard->uRows > MAX_ROWS ) - pBoard->uRows = MAX_ROWS; - - if( pBoard->uCols < BEGINNER_COLS ) - pBoard->uCols = BEGINNER_COLS; - - if( pBoard->uCols > MAX_COLS ) - pBoard->uCols = MAX_COLS; - - if( pBoard->uMines < BEGINNER_MINES ) - pBoard->uMines = BEGINNER_MINES; - - if( pBoard->uMines > pBoard->uCols * pBoard->uRows - 1 ) - pBoard->uMines = pBoard->uCols * pBoard->uRows - 1; -} - -void CreateBoxes( BOARD *pBoard ) -{ - LONG i, j; - ULONG uCol, uRow; - - srand( (unsigned int)time( NULL ) ); - - /* Create the boxes... - * We actually create them with an empty border, - * so special care doesn't have to be taken on the edges - */ - - for( uCol = 0; uCol <= pBoard->uCols + 1; uCol++ ) - { - for( uRow = 0; uRow <= pBoard->uRows + 1; uRow++ ) - { - pBoard->Box[uCol][uRow].bIsPressed = FALSE; - pBoard->Box[uCol][uRow].bIsMine = FALSE; - pBoard->Box[uCol][uRow].uFlagType = NORMAL; - pBoard->Box[uCol][uRow].uNumMines = 0; - } - } - - /* create mines */ - i = 0; - while( (ULONG)i < pBoard->uMines ) - { - uCol = (ULONG)(pBoard->uCols * (float)rand() / RAND_MAX + 1); - uRow = (ULONG)(pBoard->uRows * (float)rand() / RAND_MAX + 1); - - if( !pBoard->Box[uCol][uRow].bIsMine ) - { - i++; - pBoard->Box[uCol][uRow].bIsMine = TRUE; - } - } - - /* - * Now we label the remaining boxes with the - * number of mines surrounding them. - */ - for( uCol = 1; uCol < pBoard->uCols + 1; uCol++ ) - { - for( uRow = 1; uRow < pBoard->uRows + 1; uRow++ ) - { - for( i = -1; i <= 1; i++ ) - { - for( j = -1; j <= 1; j++ ) - { - if( pBoard->Box[uCol + i][uRow + j].bIsMine ) - { - pBoard->Box[uCol][uRow].uNumMines++; - } - } - } - } - } -} - -void DrawMines ( HDC hdc, HDC hMemDC, BOARD *pBoard ) -{ - HGDIOBJ hOldObj; - ULONG uCol, uRow; - hOldObj = SelectObject (hMemDC, pBoard->hMinesBMP); - - for( uRow = 1; uRow <= pBoard->uRows; uRow++ ) - { - for( uCol = 1; uCol <= pBoard->uCols; uCol++ ) - { - DrawMine( hdc, hMemDC, pBoard, uCol, uRow, FALSE ); - } - } - - SelectObject( hMemDC, hOldObj ); -} - -void DrawMine( HDC hdc, HDC hMemDC, BOARD *pBoard, ULONG uCol, ULONG uRow, BOOL bIsPressed ) -{ - MINEBMP_OFFSET offset = BOX_BMP; - - if( uCol == 0 || uCol > pBoard->uCols || uRow == 0 || uRow > pBoard->uRows ) - return; - - if( pBoard->Status == GAMEOVER ) - { - if( pBoard->Box[uCol][uRow].bIsMine ) - { - switch( pBoard->Box[uCol][uRow].uFlagType ) - { - case FLAG: - offset = FLAG_BMP; - break; - case COMPLETE: - offset = EXPLODE_BMP; - break; - case QUESTION: - /* fall through */ - case NORMAL: - offset = MINE_BMP; - } - } - else - { - switch( pBoard->Box[uCol][uRow].uFlagType ) - { - case QUESTION: - offset = QUESTION_BMP; - break; - case FLAG: - offset = WRONG_BMP; - break; - case NORMAL: - offset = BOX_BMP; - break; - case COMPLETE: - /* Do nothing */ - break; - default: - DEBUG("Unknown FlagType during game over in DrawMine\n"); - break; - } - } - } - else - { /* WAITING or PLAYING */ - switch( pBoard->Box[uCol][uRow].uFlagType ) - { - case QUESTION: - if( !bIsPressed ) - offset = QUESTION_BMP; - else - offset = QPRESS_BMP; - break; - case FLAG: - offset = FLAG_BMP; - break; - case NORMAL: - if( !bIsPressed ) - offset = BOX_BMP; - else - offset = MPRESS_BMP; - break; - case COMPLETE: - /* Do nothing */ - break; - default: - DEBUG("Unknown FlagType while playing in DrawMine\n"); - break; - } - } - - if( pBoard->Box[uCol][uRow].uFlagType == COMPLETE && !pBoard->Box[uCol][uRow].bIsMine ) - offset = (MINEBMP_OFFSET) pBoard->Box[uCol][uRow].uNumMines; - - BitBlt( hdc, - (uCol - 1) * MINE_WIDTH + pBoard->MinesRect.left, - (uRow - 1) * MINE_HEIGHT + pBoard->MinesRect.top, - MINE_WIDTH, MINE_HEIGHT, - hMemDC, 0, offset * MINE_HEIGHT, SRCCOPY ); -} - -void DrawLeds( HDC hDC, HDC hMemDC, BOARD *pBoard, LONG nNumber, LONG x, LONG y ) -{ - HGDIOBJ hOldObj; - UCHAR i; - ULONG uLED[3]; - LONG nCount; - - nCount = nNumber; - - if( nCount < 1000 ) - { - if( nCount >= 0 ) - { - uLED[0] = nCount / 100 ; - nCount -= uLED[0] * 100; - } - else - { - uLED[0] = 10; /* negative sign */ - nCount = -nCount; - } - - uLED[1] = nCount / 10; - nCount -= uLED[1] * 10; - uLED[2] = nCount; - } - else - { - for( i = 0; i < 3; i++ ) - uLED[i] = 10; - } - - /* use unlit led if not playing */ - /* if( pBoard->Status == WAITING ) - for( i = 0; i < 3; i++ ) - uLED[i] = 11;*/ - - hOldObj = SelectObject (hMemDC, pBoard->hLedsBMP); - - for( i = 0; i < 3; i++ ) - { - BitBlt( hDC, - i * LED_WIDTH + x, - y, - LED_WIDTH, - LED_HEIGHT, - hMemDC, - 0, - uLED[i] * LED_HEIGHT, - SRCCOPY); - } - - SelectObject( hMemDC, hOldObj ); -} - -void DrawFace( HDC hDC, HDC hMemDC, BOARD *pBoard ) -{ - HGDIOBJ hOldObj; - - hOldObj = SelectObject (hMemDC, pBoard->hFacesBMP); - - BitBlt( hDC, - pBoard->FaceRect.left, - pBoard->FaceRect.top, - FACE_WIDTH, - FACE_HEIGHT, - hMemDC, 0, pBoard->FaceBmp * FACE_HEIGHT, SRCCOPY); - - SelectObject( hMemDC, hOldObj ); -} - -void DrawBoard( HDC hDC, HDC hMemDC, PAINTSTRUCT *ps, BOARD *pBoard ) -{ - RECT TempRect; - - if( IntersectRect( &TempRect, &ps->rcPaint, &pBoard->CounterRect) ) - DrawLeds( hDC, hMemDC, pBoard, pBoard->uMines - pBoard->uNumFlags, - pBoard->CounterRect.left, - pBoard->CounterRect.top ); - - if( IntersectRect( &TempRect, &ps->rcPaint, &pBoard->TimerRect ) ) - DrawLeds( hDC, hMemDC, pBoard, pBoard->uTime, - pBoard->TimerRect.left, - pBoard->TimerRect.top); - - if( IntersectRect( &TempRect, &ps->rcPaint, &pBoard->FaceRect ) ) - DrawFace( hDC, hMemDC, pBoard ); - - if( IntersectRect( &TempRect, &ps->rcPaint, &pBoard->MinesRect ) ) - DrawMines( hDC, hMemDC, pBoard ); -} - - -void TestBoard( HWND hWnd, BOARD *pBoard, LONG x, LONG y, int msg ) -{ - POINT pt; - ULONG uCol, uRow; - - pt.x = x; - pt.y = y; - - if( PtInRect( &pBoard->MinesRect, pt ) && pBoard->Status != GAMEOVER && pBoard->Status != WON ) - TestMines( pBoard, pt, msg ); - else - { - UnpressBoxes( pBoard, pBoard->Press.x, pBoard->Press.y ); - pBoard->Press.x = 0; - pBoard->Press.y = 0; - } - - if( pBoard->uBoxesLeft == 0 ) - { - // MG - 2006-02-21 - // mimic MS minesweeper behaviour - when autocompleting a board, flag mines - pBoard->Status = WON; - - for( uCol = 0; uCol <= pBoard->uCols + 1; uCol++ ) - { - for( uRow = 0; uRow <= pBoard->uRows + 1; uRow++ ) - { - if(pBoard->Box[uCol][uRow].bIsMine) - { - pBoard->Box[uCol][uRow].uFlagType = FLAG; - } - } - } - - pBoard->uNumFlags = pBoard->uMines; - RedrawWindow( pBoard->hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW ); - - if( pBoard->Difficulty != CUSTOM && pBoard->uTime < pBoard->uBestTime[pBoard->Difficulty] ) - { - pBoard->uBestTime[pBoard->Difficulty] = pBoard->uTime; - - DialogBoxParam( pBoard->hInst, MAKEINTRESOURCE(IDD_CONGRATS), hWnd, CongratsDlgProc, (LPARAM) pBoard); - DialogBoxParam( pBoard->hInst, MAKEINTRESOURCE(IDD_TIMES), hWnd, TimesDlgProc, (LPARAM) pBoard); - } - } - - TestFace( pBoard, pt, msg ); -} - -void TestMines( BOARD *pBoard, POINT pt, int msg ) -{ - BOOL bDraw = TRUE; - ULONG uCol, uRow; - - uCol = (pt.x - pBoard->MinesRect.left) / MINE_WIDTH + 1; - uRow = (pt.y - pBoard->MinesRect.top ) / MINE_HEIGHT + 1; - - switch (msg) - { - case WM_LBUTTONDOWN: - if( pBoard->Press.x != uCol || pBoard->Press.y != uRow ) - { - UnpressBox( pBoard, pBoard->Press.x, pBoard->Press.y ); - pBoard->Press.x = uCol; - pBoard->Press.y = uRow; - PressBox( pBoard, uCol, uRow ); - } - - bDraw = FALSE; - break; - - case WM_LBUTTONUP: - if( pBoard->Press.x != uCol || pBoard->Press.y != uRow ) - UnpressBox( pBoard, pBoard->Press.x, pBoard->Press.y ); - - pBoard->Press.x = 0; - pBoard->Press.y = 0; - - if( pBoard->Box[uCol][uRow].uFlagType != FLAG ) - pBoard->Status = PLAYING; - - CompleteBox( pBoard, uCol, uRow ); - break; - - case WM_MBUTTONDOWN: - PressBoxes( pBoard, uCol, uRow ); - bDraw = FALSE; - break; - - case WM_MBUTTONUP: - if( pBoard->Press.x != uCol || pBoard->Press.y != uRow ) - UnpressBoxes( pBoard, pBoard->Press.x, pBoard->Press.y ); - - pBoard->Press.x = 0; - pBoard->Press.y = 0; - CompleteBoxes( pBoard, uCol, uRow ); - break; - - case WM_RBUTTONDOWN: - AddFlag( pBoard, uCol, uRow ); - pBoard->Status = PLAYING; - break; - - default: - DEBUG("Unknown message type received in TestMines\n"); - break; - } - - if(bDraw) - RedrawWindow( pBoard->hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW ); -} - -void TestFace( BOARD *pBoard, POINT pt, int msg ) -{ - if( pBoard->Status == PLAYING || pBoard->Status == WAITING ) - { - if( msg == WM_LBUTTONDOWN || msg == WM_MBUTTONDOWN ) - pBoard->FaceBmp = OOH_BMP; - else pBoard->FaceBmp = SMILE_BMP; - } - else if( pBoard->Status == GAMEOVER ) - pBoard->FaceBmp = DEAD_BMP; - else if( pBoard->Status == WON ) - pBoard->FaceBmp = COOL_BMP; - - if( PtInRect( &pBoard->FaceRect, pt ) ) - { - if( msg == WM_LBUTTONDOWN ) - pBoard->FaceBmp = SPRESS_BMP; - - if( msg == WM_LBUTTONUP ) - CreateBoard( pBoard ); - } - - RedrawWindow( pBoard->hWnd, &pBoard->FaceRect, NULL, RDW_INVALIDATE | RDW_UPDATENOW ); -} - -void CompleteBox( BOARD *pBoard, ULONG uCol, ULONG uRow ) -{ - CHAR i, j; - - if( pBoard->Box[uCol][uRow].uFlagType != COMPLETE && - pBoard->Box[uCol][uRow].uFlagType != FLAG && - uCol > 0 && uCol < pBoard->uCols + 1 && - uRow > 0 && uRow < pBoard->uRows + 1 ) - { - pBoard->Box[uCol][uRow].uFlagType = COMPLETE; - - if( pBoard->Box[uCol][uRow].bIsMine ) - { - pBoard->FaceBmp = DEAD_BMP; - pBoard->Status = GAMEOVER; - } - else if( pBoard->Status != GAMEOVER ) - pBoard->uBoxesLeft--; - - if( pBoard->Box[uCol][uRow].uNumMines == 0 ) - { - for( i = -1; i <= 1; i++ ) - for( j = -1; j <= 1; j++ ) - CompleteBox( pBoard, uCol + i, uRow + j ); - } - } -} - -void CompleteBoxes( BOARD *pBoard, ULONG uCol, ULONG uRow ) -{ - CHAR i, j; - ULONG uNumFlags = 0; - - if( pBoard->Box[uCol][uRow].uFlagType == COMPLETE ) - { - for( i = -1; i <= 1; i++ ) - { - for( j = -1; j <= 1; j++ ) - { - if( pBoard->Box[uCol + i][uRow + j].uFlagType == FLAG ) - uNumFlags++; - } - } - - if( uNumFlags == pBoard->Box[uCol][uRow].uNumMines ) - { - for( i = -1; i <= 1; i++ ) - { - for( j = -1; j <= 1; j++ ) - { - if( pBoard->Box[uCol + i][uRow + j].uFlagType != FLAG ) - CompleteBox( pBoard, uCol + i, uRow + j ); - } - } - } - } -} - -void AddFlag( BOARD *pBoard, ULONG uCol, ULONG uRow ) -{ - if( pBoard->Box[uCol][uRow].uFlagType != COMPLETE ) - { - switch( pBoard->Box[uCol][uRow].uFlagType ) - { - case FLAG: - if( pBoard->bMark ) - pBoard->Box[uCol][uRow].uFlagType = QUESTION; - else - pBoard->Box[uCol][uRow].uFlagType = NORMAL; - - pBoard->uNumFlags--; - break; - - case QUESTION: - pBoard->Box[uCol][uRow].uFlagType = NORMAL; - break; - - default: - pBoard->Box[uCol][uRow].uFlagType = FLAG; - pBoard->uNumFlags++; - } - } -} - -void PressBox( BOARD *pBoard, ULONG uCol, ULONG uRow ) -{ - HDC hDC; - HGDIOBJ hOldObj; - HDC hMemDC; - - hDC = GetDC( pBoard->hWnd ); - hMemDC = CreateCompatibleDC(hDC); - hOldObj = SelectObject (hMemDC, pBoard->hMinesBMP); - - DrawMine( hDC, hMemDC, pBoard, uCol, uRow, TRUE ); - - SelectObject( hMemDC, hOldObj ); - DeleteDC( hMemDC ); - ReleaseDC( pBoard->hWnd, hDC ); -} - -void PressBoxes( BOARD *pBoard, ULONG uCol, ULONG uRow ) -{ - CHAR i, j; - - for( i = -1; i <= 1; i++ ) - { - for( j = -1; j <= 1; j++ ) - { - pBoard->Box[uCol + i][uRow + j].bIsPressed = TRUE; - PressBox( pBoard, uCol + i, uRow + j ); - } - } - - for( i = -1; i <= 1; i++ ) - { - for( j = -1; j <= 1; j++ ) - { - if( !pBoard->Box[pBoard->Press.x + i][pBoard->Press.y + j].bIsPressed ) - UnpressBox( pBoard, pBoard->Press.x + i, pBoard->Press.y + j ); - } - } - - for( i = -1; i <= 1; i++ ) - { - for( j = -1; j <= 1; j++ ) - { - pBoard->Box[uCol + i][uRow + j].bIsPressed = FALSE; - PressBox( pBoard, uCol + i, uRow + j ); - } - } - - pBoard->Press.x = uCol; - pBoard->Press.y = uRow; -} - -void UnpressBox( BOARD *pBoard, ULONG uCol, ULONG uRow ) -{ - HDC hDC; - HGDIOBJ hOldObj; - HDC hMemDC; - - hDC = GetDC( pBoard->hWnd ); - hMemDC = CreateCompatibleDC( hDC ); - hOldObj = SelectObject( hMemDC, pBoard->hMinesBMP ); - - DrawMine( hDC, hMemDC, pBoard, uCol, uRow, FALSE ); - - SelectObject( hMemDC, hOldObj ); - DeleteDC( hMemDC ); - ReleaseDC( pBoard->hWnd, hDC ); -} - -void UnpressBoxes( BOARD *pBoard, ULONG uCol, ULONG uRow ) -{ - CHAR i, j; - - for( i = -1; i <= 1; i++ ) - { - for( j = -1; j <= 1; j++ ) - { - UnpressBox( pBoard, uCol + i, uRow + j ); - } - } -} diff --git a/base/applications/games/winemine/main.h b/base/applications/games/winemine/main.h deleted file mode 100644 index 7ea91efbff3..00000000000 --- a/base/applications/games/winemine/main.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 2000 Joshua Thielen - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -static const TCHAR szWineMineRegKey[] = TEXT("Software\\Microsoft\\WinMine"); - -// Common Controls 6.0 for MSVC 2005 or later -#if _MSC_VER >= 1400 -# pragma comment(linker, "/manifestdependency:\"type='win32' " \ - "name='Microsoft.Windows.Common-Controls' " \ - "version='6.0.0.0' " \ - "processorArchitecture='x86' " \ - "publicKeyToken='6595b64144ccf1df' " \ - "language='*'\"") -#endif - -#define ID_TIMER 1000 - -#define BEGINNER_MINES 10 -#define BEGINNER_COLS 9 -#define BEGINNER_ROWS 9 - -#define ADVANCED_MINES 40 -#define ADVANCED_COLS 16 -#define ADVANCED_ROWS 16 - -#define EXPERT_MINES 99 -#define EXPERT_COLS 30 -#define EXPERT_ROWS 16 - -#define MAX_COLS 30 -#define MAX_ROWS 24 - -#define BOTTOM_MARGIN 20 -#define BOARD_WMARGIN 5 -#define BOARD_HMARGIN 5 - -/* mine defines */ -#define MINE_WIDTH 16 -#define MINE_HEIGHT 16 -#define LED_WIDTH 12 -#define LED_HEIGHT 23 -#define FACE_WIDTH 24 -#define FACE_HEIGHT 24 - -typedef enum { SPRESS_BMP, COOL_BMP, DEAD_BMP, OOH_BMP, SMILE_BMP } FACE_BMP; - -typedef enum { WAITING, PLAYING, GAMEOVER, WON } GAME_STATUS; - -typedef enum -{ - MPRESS_BMP, ONE_BMP, TWO_BMP, THREE_BMP, FOUR_BMP, FIVE_BMP, SIX_BMP, - SEVEN_BMP, EIGHT_BMP, BOX_BMP, FLAG_BMP, QUESTION_BMP, EXPLODE_BMP, - WRONG_BMP, MINE_BMP, QPRESS_BMP -} MINEBMP_OFFSET; - -typedef enum { BEGINNER, ADVANCED, EXPERT, CUSTOM } DIFFICULTY; - -typedef struct tagBOARD -{ - BOOL bMark; - HINSTANCE hInst; - HWND hWnd; - HBITMAP hMinesBMP; - HBITMAP hFacesBMP; - HBITMAP hLedsBMP; - RECT MinesRect; - RECT FaceRect; - RECT TimerRect; - RECT CounterRect; - - ULONG uWidth; - ULONG uHeight; - POINT Pos; - - ULONG uTime; - ULONG uNumFlags; - ULONG uBoxesLeft; - ULONG uNumMines; - - ULONG uRows; - ULONG uCols; - ULONG uMines; - TCHAR szBestName[3][16]; - ULONG uBestTime[3]; - DIFFICULTY Difficulty; - - POINT Press; - - FACE_BMP FaceBmp; - GAME_STATUS Status; - - struct BOX_STRUCT - { - UINT bIsMine : 1; - UINT bIsPressed : 1; - UINT uFlagType : 2; - UINT uNumMines : 4; - } Box [MAX_COLS + 2] [MAX_ROWS + 2]; - - /* defines for uFlagType */ - #define NORMAL 0 - #define QUESTION 1 - #define FLAG 2 - #define COMPLETE 3 - -} BOARD; - -void ExitApp( int error ); -void InitBoard( BOARD *pBoard ); -void LoadBoard( BOARD *pBoard ); -void SaveBoard( BOARD *pBoard ); -void DestroyBoard( BOARD *pBoard ); -void SetDifficulty( BOARD *pBoard, DIFFICULTY difficulty ); -void CheckLevel( BOARD *pBoard ); -void CreateBoard( BOARD *pBoard ); -void CreateBoxes( BOARD *pBoard ); -void TestBoard( HWND hWnd, BOARD *pBoard, LONG x, LONG y, int msg ); -void TestMines( BOARD *pBoard, POINT pt, int msg ); -void TestFace( BOARD *pBoard, POINT pt, int msg ); -void DrawBoard( HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, BOARD *pBoard ); -void DrawMines( HDC hdc, HDC hMemDC, BOARD *pBoard ); -void DrawMine( HDC hdc, HDC hMemDC, BOARD *pBoard, ULONG uCol, ULONG uRow, BOOL IsPressed ); -void AddFlag( BOARD *pBoard, ULONG uCol, ULONG uRow ); -void CompleteBox( BOARD *pBoard, ULONG uCol, ULONG uRow ); -void CompleteBoxes( BOARD *pBoard, ULONG uCol, ULONG uRow ); -void PressBox( BOARD *pBoard, ULONG uCol, ULONG uRow ); -void PressBoxes( BOARD *pBoard, ULONG uCol, ULONG uRow ); -void UnpressBox( BOARD *pBoard, ULONG uCol, ULONG uRow ); -void UnpressBoxes( BOARD *pBoard, ULONG uCol, ULONG uRow ); -void UpdateTimer( BOARD *pBoard ); -void DrawLeds( HDC hdc, HDC hMemDC, BOARD *pBoard, LONG nNumber, LONG x, LONG y); -void DrawFace( HDC hdc, HDC hMemDC, BOARD *pBoard ); -LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); -INT_PTR CALLBACK CustomDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); -INT_PTR CALLBACK CongratsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); -INT_PTR CALLBACK TimesDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); - -/* end of header */ diff --git a/base/applications/games/winemine/rsrc.rc b/base/applications/games/winemine/rsrc.rc deleted file mode 100644 index 97e20879a2f..00000000000 --- a/base/applications/games/winemine/rsrc.rc +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include "resource.h" - -/* define language neutral resources */ -LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL - -IDA_WINEMINE ACCELERATORS DISCARDABLE -BEGIN - VK_F2, IDM_NEW, VIRTKEY, NOINVERT - "X", IDM_EXIT, VIRTKEY, ALT, NOINVERT -END - -IDI_WINEMINE ICON MOVEABLE "rc/winemine.ico" -IDB_FACES BITMAP MOVEABLE "rc/faces.bmp" -IDB_LEDS BITMAP MOVEABLE "rc/leds.bmp" -IDB_MINES BITMAP MOVEABLE "rc/mines.bmp" - -/* include localised resources */ -#include "lang/bg-BG.rc" -#include "lang/ca-ES.rc" -#include "lang/cs-CZ.rc" -#include "lang/de-DE.rc" -#include "lang/el-GR.rc" -#include "lang/en-US.rc" -#include "lang/es-ES.rc" -#include "lang/eu-ES.rc" -#include "lang/fr-FR.rc" -#include "lang/id-ID.rc" -#include "lang/it-IT.rc" -#include "lang/ja-JP.rc" -#include "lang/ko-KR.rc" -#include "lang/lt-LT.rc" -#include "lang/no-NO.rc" -#include "lang/nl-NL.rc" -#include "lang/pl-PL.rc" -#include "lang/ru-RU.rc" -#include "lang/sk-SK.rc" -#include "lang/th-TH.rc" -#include "lang/uk-UA.rc" -#include "lang/zh-CN.rc" diff --git a/base/applications/games/winmine/CMakeLists.txt b/base/applications/games/winmine/CMakeLists.txt new file mode 100644 index 00000000000..d61bcf53acb --- /dev/null +++ b/base/applications/games/winmine/CMakeLists.txt @@ -0,0 +1,15 @@ + +set_unicode() + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) + +set_rc_compiler() + +add_executable(winmine + main.c + dialog.c + rsrc.rc) + +set_module_type(winmine win32gui) +target_link_libraries(winmine wine) +add_importlibs(winmine user32 gdi32 advapi32 shell32 msvcrt kernel32 ntdll) diff --git a/base/applications/games/winmine/dialog.c b/base/applications/games/winmine/dialog.c new file mode 100644 index 00000000000..dc4ab349fd6 --- /dev/null +++ b/base/applications/games/winmine/dialog.c @@ -0,0 +1,116 @@ +/* + * WineMine (dialog.c) + * + * Copyright 2000 Joshua Thielen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define WIN32_LEAN_AND_MEAN + +#include +#include "main.h" +#include "resource.h" + +INT_PTR CALLBACK CustomDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + BOOL IsRet; + static BOARD *p_board; + + switch( uMsg ) { + case WM_INITDIALOG: + p_board = (BOARD*) lParam; + SetDlgItemInt( hDlg, IDC_EDITROWS, p_board->rows, FALSE ); + SetDlgItemInt( hDlg, IDC_EDITCOLS, p_board->cols, FALSE ); + SetDlgItemInt( hDlg, IDC_EDITMINES, p_board->mines, FALSE ); + return TRUE; + + case WM_COMMAND: + switch( LOWORD( wParam ) ) { + case IDOK: + p_board->rows = GetDlgItemInt( hDlg, IDC_EDITROWS, &IsRet, FALSE ); + p_board->cols = GetDlgItemInt( hDlg, IDC_EDITCOLS, &IsRet, FALSE ); + p_board->mines = GetDlgItemInt( hDlg, IDC_EDITMINES, &IsRet, FALSE ); + CheckLevel( p_board ); + EndDialog( hDlg, 0 ); + return TRUE; + + case IDCANCEL: + EndDialog( hDlg, 1 ); + return TRUE; + } + break; + } + return FALSE; +} + +INT_PTR CALLBACK CongratsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + static BOARD *p_board; + + switch( uMsg ) { + case WM_INITDIALOG: + p_board = (BOARD*) lParam; + SetDlgItemText( hDlg, IDC_EDITNAME, + p_board->best_name[p_board->difficulty] ); + return TRUE; + + case WM_COMMAND: + switch( LOWORD( wParam ) ) { + case IDOK: + GetDlgItemText( hDlg, IDC_EDITNAME, + p_board->best_name[p_board->difficulty], + sizeof( p_board->best_name[p_board->difficulty] ) ); + EndDialog( hDlg, 0 ); + return TRUE; + + case IDCANCEL: + EndDialog( hDlg, 0 ); + return TRUE; + } + break; + } + return FALSE; +} + +INT_PTR CALLBACK TimesDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + static BOARD *p_board; + unsigned i; + + switch( uMsg ) { + case WM_INITDIALOG: + p_board = (BOARD*) lParam; + + /* set best names */ + for( i = 0; i < 3; i++ ) + SetDlgItemText( hDlg, (IDC_NAME1) + i, p_board->best_name[i] ); + + /* set best times */ + for( i = 0; i < 3; i++ ) + SetDlgItemInt( hDlg, (IDC_TIME1) + i, p_board->best_time[i], FALSE ); + return TRUE; + + case WM_COMMAND: + switch( LOWORD( wParam ) ) { + case IDOK: + case IDCANCEL: + EndDialog( hDlg, 0 ); + return TRUE; + } + break; + } + return FALSE; +} diff --git a/base/applications/games/winmine/lang/cs-CZ.rc b/base/applications/games/winmine/lang/cs-CZ.rc new file mode 100644 index 00000000000..5e17ea274cb --- /dev/null +++ b/base/applications/games/winmine/lang/cs-CZ.rc @@ -0,0 +1,98 @@ +/* Hey, Emacs, open this file with -*- coding: cp1250 -*- + * + * WineMine + * Czech Language Support + * + * Copyright 2000 Joshua Thielen + * Copyright 2003 Marcelo Duarte + * Copyright 2004 David Kredba + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +LANGUAGE LANG_CZECH, SUBLANG_DEFAULT + +/* Czech strings in CP1250 */ + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Nikdo" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "N&astaven" BEGIN + MENUITEM "&Nov畚tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Ozna鑰vat nerozhodnut", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&Za鞦te鈩k", IDM_BEGINNER + MENUITEM "&Pokro鑛l", IDM_ADVANCED + MENUITEM "&Expert", IDM_EXPERT + MENUITEM "&Dle libosti", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "&Konec\tAlt+K", IDM_EXIT + END + POPUP "&Informace" BEGIN + MENUITEM "Ne&jlep夬 鐶sy", IDM_TIMES + MENUITEM "&O aplikaci", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Nejlep夬 鐶sy" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Nejlep夬 鐶sy", -1, 10, 10, 140, 45 + LTEXT "Za鞦te鈩k", -1, 20, 20, 40, 8 + LTEXT "Pokro鑛l", -1, 20, 30, 40, 8 + LTEXT "Expert", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Gratulujeme !" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Prosm, zadejte sv jm駭o", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Vlastn hra" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "リ疆ky", -1, 5, 5, 30, 10 + LTEXT "Sloupce", -1, 5, 35, 30, 10 + LTEXT "Miny", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Storno", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/da-DK.rc b/base/applications/games/winmine/lang/da-DK.rc new file mode 100644 index 00000000000..d3430f9b345 --- /dev/null +++ b/base/applications/games/winmine/lang/da-DK.rc @@ -0,0 +1,93 @@ +/* + * WineMine + * Danish language support + * + * Copyright 2008 Jens Albretsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +LANGUAGE LANG_DANISH, SUBLANG_DEFAULT + +STRINGTABLE BEGIN + IDS_APPNAME, "Minerydder" + IDS_NOBODY, "Ingen" + IDS_ABOUT, "Ophavsret 2000 tilhrer Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Indstillinger" BEGIN + MENUITEM "&Nyt spil\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Brug sprgsm虱stegn",IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "Ny&begynder", IDM_BEGINNER + MENUITEM "&Avanceret", IDM_ADVANCED + MENUITEM "&Ekspert", IDM_EXPERT + MENUITEM "B&rugerdefineret", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "Afslut&t\tAlt+X", IDM_EXIT + END + POPUP "&Hj詬p" BEGIN + MENUITEM "&Bedste tider", IDM_TIMES + MENUITEM "&Om", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Bedste tider" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Bedste tider", -1, 10, 10, 140, 45 + LTEXT "Nybegynder", -1, 20, 20, 40, 8 + LTEXT "Avanceret", -1, 20, 30, 40, 8 + LTEXT "Ekspert", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Tillykke!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Indtast dit navn", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Brugerdefineret spil" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "R詭ker", -1, 5, 5, 30, 10 + LTEXT "Kolonner", -1, 5, 35, 30, 10 + LTEXT "Miner", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Annuller", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/de-DE.rc b/base/applications/games/winmine/lang/de-DE.rc new file mode 100644 index 00000000000..d1e25b1a65d --- /dev/null +++ b/base/applications/games/winmine/lang/de-DE.rc @@ -0,0 +1,95 @@ +/* + * WineMine + * German Language Support + * + * Copyright 2004 Henning Gerhardt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +#pragma code_page(65001) + +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Niemand" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Optionen" BEGIN + MENUITEM "&Neu\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Merker", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&Anfテ、nger", IDM_BEGINNER + MENUITEM "&Fortgeschrittene", IDM_ADVANCED + MENUITEM "&Experten", IDM_EXPERT + MENUITEM "Benutzer&definiert...", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "&Beenden\tAlt+X", IDM_EXIT + END + POPUP "&Info" BEGIN + MENUITEM "&Beste Zeiten", IDM_TIMES + MENUITEM "&テ彙er", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Beste Zeiten" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Beste Zeiten", -1, 10, 10, 140, 45 + LTEXT "Anfテ、nger", -1, 20, 20, 40, 8 + LTEXT "Fortgeschrittene", -1, 20, 30, 40, 8 + LTEXT "Experten", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Herzlichen Glテシckwunsch!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Bitte geben Sie Ihren Namen ein", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Benutzerdefiniertes Spiel" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Reihen", -1, 5, 5, 30, 10 + LTEXT "Zeilen", -1, 5, 35, 30, 10 + LTEXT "Minen", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Abbrechen", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/en-US.rc b/base/applications/games/winmine/lang/en-US.rc new file mode 100644 index 00000000000..6536d32f38c --- /dev/null +++ b/base/applications/games/winmine/lang/en-US.rc @@ -0,0 +1,94 @@ +/* + * WineMine + * English Language Support + * + * Copyright 2000 Joshua Thielen + * Copyright 2003 Marcelo Duarte + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Nobody" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Options" BEGIN + MENUITEM "&New\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Mark Question", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&Beginner", IDM_BEGINNER + MENUITEM "&Advanced", IDM_ADVANCED + MENUITEM "&Expert", IDM_EXPERT + MENUITEM "&Custom...", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "E&xit\tAlt+X", IDM_EXIT + END + POPUP "&Info" BEGIN + MENUITEM "&Fastest Times...", IDM_TIMES + MENUITEM "&About", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Fastest Times" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Fastest Times", -1, 10, 10, 140, 45 + LTEXT "Beginner", -1, 20, 20, 40, 8 + LTEXT "Advanced", -1, 20, 30, 40, 8 + LTEXT "Expert", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Congratulations!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Please enter your name", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Custom Game" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Rows", -1, 5, 5, 30, 10 + LTEXT "Cols", -1, 5, 35, 30, 10 + LTEXT "Mines", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Cancel", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/es-ES.rc b/base/applications/games/winmine/lang/es-ES.rc new file mode 100644 index 00000000000..a6cca74a676 --- /dev/null +++ b/base/applications/games/winmine/lang/es-ES.rc @@ -0,0 +1,93 @@ +/* + * WineMine + * Spanish Language Support + * + * Copyright 2003 Jos Manuel Ferrer Ortiz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Nadie" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Opciones" BEGIN + MENUITEM "&Nuevo\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Interrogacin", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&Principiante", IDM_BEGINNER + MENUITEM "&Avanzado", IDM_ADVANCED + MENUITEM "&Experto", IDM_EXPERT + MENUITEM "P&ersonalizado", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "&Salir\tAlt+X", IDM_EXIT + END + POPUP "&Ayuda" BEGIN + MENUITEM "&Mejores tiempos", IDM_TIMES + MENUITEM "&Acerca de", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Mejores tiempos" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Mejores tiempos", -1, 10, 10, 140, 45 + LTEXT "Principiante", -1, 20, 20, 40, 8 + LTEXT "Avanzado", -1, 20, 30, 40, 8 + LTEXT "Experto", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "Aceptar", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "。Enhorabuena!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Por favor, introduzca su nombre", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "Aceptar", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Juego personalizado" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Filas", -1, 5, 5, 30, 10 + LTEXT "Columnas", -1, 5, 35, 30, 10 + LTEXT "Minas", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "Aceptar", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Cancelar", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/fi-FI.rc b/base/applications/games/winmine/lang/fi-FI.rc new file mode 100644 index 00000000000..c24cd172f75 --- /dev/null +++ b/base/applications/games/winmine/lang/fi-FI.rc @@ -0,0 +1,93 @@ +/* + * WineMine + * Finnish Language Support + * + * Copyright 2005 Kimmo Myllyvirta + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Ei kukaan" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Valinnat" BEGIN + MENUITEM "&Uusi\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Merkitse", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&Aloittelija", IDM_BEGINNER + MENUITEM "&Kehittynyt", IDM_ADVANCED + MENUITEM "&Expertti", IDM_EXPERT + MENUITEM "Mukau&ta", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "&Poistu\tAlt+X", IDM_EXIT + END + POPUP "&Info" BEGIN + MENUITEM "&Nopeimmat ajat", IDM_TIMES + MENUITEM "&Tietoja", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Nopeimmat Ajat" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Nopeimmat Ajat",-1, 10, 10, 140, 45 + LTEXT "Aloittelija", -1, 20, 20, 40, 8 + LTEXT "Kehittynyt", -1, 20, 30, 40, 8 + LTEXT "Expertti", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Onnittelut!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Anna nimesi", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Mukautettu Peli" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Rivej", -1, 5, 5, 30, 10 + LTEXT "Palstoja", -1, 5, 35, 30, 10 + LTEXT "Miinoja", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Peruuta", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/fr-FR.rc b/base/applications/games/winmine/lang/fr-FR.rc new file mode 100644 index 00000000000..4730642c92d --- /dev/null +++ b/base/applications/games/winmine/lang/fr-FR.rc @@ -0,0 +1,99 @@ +/* + * WineMine + * French Language Support + * + * Copyright 2000 Joshua Thielen + * Copyright 2003 Marcelo Duarte + * Copyright 2003 Vincent Bテゥron + * Copyright 2006 JonathanツErnst + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL + +STRINGTABLE BEGIN + IDS_APPNAME, "Dテゥmineur de Wine" + IDS_NOBODY, "Anonyme" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Options" BEGIN + MENUITEM "&Nouveau\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Marquage des cases suspectes", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&Dテゥbutant", IDM_BEGINNER + MENUITEM "&Avancテゥ", IDM_ADVANCED + MENUITEM "&Expert", IDM_EXPERT + MENUITEM "&Personnalisテゥ...", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "&Quitter\tAlt+X", IDM_EXIT + END + POPUP "&Info" BEGIN + MENUITEM "Meilleurs &temps", IDM_TIMES + MENUITEM "テ &propos", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Meilleurs temps" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Meilleurs temps", -1, 10, 10, 140, 45 + LTEXT "Dテゥbutant", -1, 20, 20, 40, 8 + LTEXT "Avancテゥ", -1, 20, 30, 40, 8 + LTEXT "Expert", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Fテゥlicitationsツ!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Veuillez saisir votre nom :", -1, 25, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Grille personnalisテゥe" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Lignes", -1, 5, 5, 30, 10 + LTEXT "Colonnes", -1, 5, 35, 30, 10 + LTEXT "Mines", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 30, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 30, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 30, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 44, 30, 50, 15 + PUSHBUTTON "Annuler", IDCANCEL, 44, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/it-IT.rc b/base/applications/games/winmine/lang/it-IT.rc new file mode 100644 index 00000000000..9bf28fca948 --- /dev/null +++ b/base/applications/games/winmine/lang/it-IT.rc @@ -0,0 +1,98 @@ +/* + * WineMine + * Italian Language Support + * + * Copyright 2000 Joshua Thielen + * Copyright 2003 Marcelo Duarte + * Copyright 2003-2004 Ivan Leo Puoti + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Nessuno" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Opzioni" BEGIN + MENUITEM "&Nuovo\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Contrassegna domanda", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&Principiante", IDM_BEGINNER + MENUITEM "&Avanzato", IDM_ADVANCED + MENUITEM "&Esperto", IDM_EXPERT + MENUITEM "&Personalizza", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "E&sci\tAlt+X", IDM_EXIT + END + POPUP "&Informazioni" BEGIN + MENUITEM "&Tempi migliori", IDM_TIMES + MENUITEM "&Riguardo a WineMine", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Tempi migliori" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Tempi migliori", -1, 10, 10, 140, 45 + LTEXT "Principiante", -1, 20, 20, 40, 8 + LTEXT "Avanzato", -1, 20, 30, 40, 8 + LTEXT "Esperto", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Congratulazioni!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Inserisci il tuo nome", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Gioco personalizzato" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Righe", -1, 5, 5, 30, 10 + LTEXT "Colonne", -1, 5, 35, 30, 10 + LTEXT "Mine", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Annulla", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/ja-JP.rc b/base/applications/games/winmine/lang/ja-JP.rc new file mode 100644 index 00000000000..677d08fca96 --- /dev/null +++ b/base/applications/games/winmine/lang/ja-JP.rc @@ -0,0 +1,97 @@ +/* + * WineMine + * Japanese Language Support + * + * Copyright 2000 Joshua Thielen + * Copyright 2003 Marcelo Duarte + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Nobody" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "繧ェ繝励す繝ァ繝ウ(&O)" BEGIN + MENUITEM "繧ケ繧ソ繝シ繝(&N)\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "?繝槭シ繧ッ繧剃スソ逕ィ(&M)", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "蛻晉エ(&B)", IDM_BEGINNER + MENUITEM "荳ュ邏(&A)", IDM_ADVANCED + MENUITEM "荳顔エ(&E)", IDM_EXPERT + MENUITEM "逶、髱「縺ョ螟画峩(&C)", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "邨ゆコ(&X)\tAlt+X", IDM_EXIT + END + POPUP "諠蝣ア(&I)" BEGIN + MENUITEM "繝上う繧ケ繧ウ繧「(&F)", IDM_TIMES + MENUITEM "WineMine 縺ォ縺、縺縺ヲ(&A)", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Fastest Times" +FONT 9, "MS UI Gothic" +BEGIN + GROUPBOX "繝上う繧ケ繧ウ繧「", -1, 10, 10, 140, 45 + LTEXT "蛻晉エ", -1, 20, 20, 40, 8 + LTEXT "荳ュ邏", -1, 20, 30, 40, 8 + LTEXT "荳顔エ", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "縺翫a縺ァ縺ィ縺!" +FONT 9, "MS UI Gothic" +BEGIN + LTEXT "蜷榊燕繧貞・蜉帙@縺セ縺励g縺", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "逶、髱「縺ョ螟画峩" +FONT 9, "MS UI Gothic" +BEGIN + LTEXT "Rows", -1, 5, 5, 30, 10 + LTEXT "Cols", -1, 5, 35, 30, 10 + LTEXT "Mines", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Cancel", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/ko-KR.rc b/base/applications/games/winmine/lang/ko-KR.rc new file mode 100644 index 00000000000..ade7c7a0a8c --- /dev/null +++ b/base/applications/games/winmine/lang/ko-KR.rc @@ -0,0 +1,95 @@ +/* + * WineMine + * Korean Language Support + * + * Copyright 2000 Joshua Thielen + * Copyright 2003 Marcelo Duarte + * Copyright 2005,2007 YunSong Hwang + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT + +STRINGTABLE BEGIN + IDS_APPNAME, "Wineチキレテ」ア" + IDS_NOBODY, "セニケォーウ" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "ソノシヌ(&O)" BEGIN + MENUITEM "サ ーヤタモ(&N)\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "ケータスヌ・ ヌ・ステ(&M)", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "テハコクタレ(&B)", IDM_BEGINNER + MENUITEM "チ゚ア゙タレ(&A)", IDM_ADVANCED + MENUITEM "サア゙タレ(&E)", IDM_EXPERT + MENUITEM "サ鄙タレ チ、タヌ(&C)", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "ウェー。ア(&X)\tAlt+X", IDM_EXIT + END + POPUP "オオソクサ(&I)" BEGIN + MENUITEM "ー。タ コク・ ステー」(&F)", IDM_TIMES + MENUITEM "チ、コク(&A)", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "ー。タ コク・ ステー」" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "テヨエワ ステー」", -1, 10, 10, 140, 45 + LTEXT "テハコクタレ", -1, 20, 20, 40, 8 + LTEXT "チ゚ア゙タレ", -1, 20, 30, 40, 8 + LTEXT "タケョー。", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "ネョタホ", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "テ猊マヌユエマエル!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "エ鄂ナタヌ タフクァタサ タセチヨシシソ", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "ネョタホ", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "ーヤタモ サ鄙タレ チ、タヌ " +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ー。キホチル", -1, 5, 5, 30, 10 + LTEXT "サキホチル", -1, 5, 35, 30, 10 + LTEXT "チキレ", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "ネョタホ", IDOK, 40, 30, 50, 15 + PUSHBUTTON "テシメ", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/lt-LT.rc b/base/applications/games/winmine/lang/lt-LT.rc new file mode 100644 index 00000000000..b566d324250 --- /dev/null +++ b/base/applications/games/winmine/lang/lt-LT.rc @@ -0,0 +1,96 @@ +/* + * WineMine + * Lithuanian Language Support + * + * Copyright 2009 Aurimas Fiナ。eras + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Niekas" + IDS_ABOUT, "Autoriaus teisト耀 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Parinktys" BEGIN + MENUITEM "&Naujas\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&ナスymト葉i klaustuku", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "P&radedantis", IDM_BEGINNER + MENUITEM "&Paナセengト冱", IDM_ADVANCED + MENUITEM "Ek&spertas", IDM_EXPERT + MENUITEM "Pasirin&ktas...", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "Iナ。&eiti\tAlt+X", IDM_EXIT + END + POPUP "&Informacija" BEGIN + MENUITEM "&Geriausi laikai", IDM_TIMES + MENUITEM "&Apie", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Geriausi laikai" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Geriausi laikai", -1, 10, 10, 140, 45 + LTEXT "Pradedantis", -1, 20, 20, 40, 8 + LTEXT "Paナセengト冱", -1, 20, 30, 40, 8 + LTEXT "Ekspertas", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "Gerai", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Sveikiname!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "トョveskite savo vardト", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "Gerai", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Pasirinktas ナセaidimas" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Eilutト耀", -1, 5, 5, 30, 10 + LTEXT "Stulpeliai", -1, 5, 35, 30, 10 + LTEXT "Minos", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "Gerai", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Atsisakyti", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/nl-NL.rc b/base/applications/games/winmine/lang/nl-NL.rc new file mode 100644 index 00000000000..eaee1ba2187 --- /dev/null +++ b/base/applications/games/winmine/lang/nl-NL.rc @@ -0,0 +1,92 @@ +/* + * WineMine (Dutch resources) + * + * Copyright 2003 Hans Leidekker + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Niemand" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Opties" BEGIN + MENUITEM "&Nieuw spel\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Markeer vraag", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&Beginner", IDM_BEGINNER + MENUITEM "&Gevorderde", IDM_ADVANCED + MENUITEM "&Expert", IDM_EXPERT + MENUITEM "Aange&past spel", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "&Afsluiten\tAlt+X", IDM_EXIT + END + POPUP "&Info" BEGIN + MENUITEM "&Snelste tijden...", IDM_TIMES + MENUITEM "&Over WineMine", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Snelste tijden" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Snelste tijden", -1, 10, 10, 140, 45 + LTEXT "Beginner", -1, 20, 20, 40, 8 + LTEXT "Gevorderde", -1, 20, 30, 40, 8 + LTEXT "Expert", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Gefeliciteerd!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Voer uw naam in", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Aangepast spel" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Rijen", -1, 5, 5, 30, 10 + LTEXT "Kolommen", -1, 5, 35, 30, 10 + LTEXT "Mijnen", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Annuleren", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/no-NO.rc b/base/applications/games/winmine/lang/no-NO.rc new file mode 100644 index 00000000000..c03bf179a38 --- /dev/null +++ b/base/applications/games/winmine/lang/no-NO.rc @@ -0,0 +1,93 @@ +/* + * WineMine + * Norwegian Bokm虱 language support + * + * Copyright 2005 Alexander N. Srnes + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL + +STRINGTABLE BEGIN + IDS_APPNAME, "Minesveiper" + IDS_NOBODY, "Ingen" + IDS_ABOUT, "Kopirett 2000 tilhrer Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Innstillinger" BEGIN + MENUITEM "&Ny\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Merk sprsm虱", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "Ny&begynner", IDM_BEGINNER + MENUITEM "&Avansert", IDM_ADVANCED + MENUITEM "&Ekspert", IDM_EXPERT + MENUITEM "E&gendefinert", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "Avslut&t\tAlt+X", IDM_EXIT + END + POPUP "&Hjelp" BEGIN + MENUITEM "&Beste tider", IDM_TIMES + MENUITEM "&Om", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Beste tider" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Beste tider", -1, 10, 10, 140, 45 + LTEXT "Nybegynner", -1, 20, 20, 40, 8 + LTEXT "Avansert", -1, 20, 30, 40, 8 + LTEXT "Ekspert", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Gratulerer!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Skriv inn navnet ditt", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Egendefinert spill" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Rader", -1, 5, 5, 30, 10 + LTEXT "Kolonner", -1, 5, 35, 30, 10 + LTEXT "Miner", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Avbryt", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/pl-PL.rc b/base/applications/games/winmine/lang/pl-PL.rc new file mode 100644 index 00000000000..ff60f15de67 --- /dev/null +++ b/base/applications/games/winmine/lang/pl-PL.rc @@ -0,0 +1,95 @@ +/* + * WineMine + * Polish Language Support + * + * Copyright 2000 Joshua Thielen + * Copyright 2003 Marcelo Duarte + * Copyright 2004 Jacek Caban + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +LANGUAGE LANG_POLISH, SUBLANG_DEFAULT + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Anonim" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Opcje" BEGIN + MENUITEM "&Nowa\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Znaczniki", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&Poczケtkujケcy", IDM_BEGINNER + MENUITEM "Z&aawansowany", IDM_ADVANCED + MENUITEM "&Ekspert", IDM_EXPERT + MENUITEM "&Uソytkownika", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "W&yj彡ie\tAlt+X", IDM_EXIT + END + POPUP "&Info" BEGIN + MENUITEM "&Najlepsze Wyniki", IDM_TIMES + MENUITEM "&O Programie", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 170, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Najlepsze Wyniki" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Najlepsze Wyniki", -1, 10, 10, 150, 45 + LTEXT "Poczケtkujケcy", -1, 20, 20, 50, 8 + LTEXT "Zaawansowany", -1, 20, 30, 50, 8 + LTEXT "Ekspert", -1, 20, 40, 50, 8 + LTEXT "999", IDC_TIME1, 80, 20, 15, 8 + LTEXT "999", IDC_TIME2, 80, 30, 15, 8 + LTEXT "999", IDC_TIME3, 80, 40, 15, 8 + LTEXT "", IDC_NAME1, 100, 20, 55, 8 + LTEXT "", IDC_NAME2, 100, 30, 55, 8 + LTEXT "", IDC_NAME3, 100, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 60, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Gratulacje!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Podaj swoje imi", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Ustawienia Uソytkownika" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Wiersze", -1, 5, 5, 30, 10 + LTEXT "Kolumny", -1, 5, 35, 30, 10 + LTEXT "Miny", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Anuluj", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/pt-PT.rc b/base/applications/games/winmine/lang/pt-PT.rc new file mode 100644 index 00000000000..e86e6ff2c0d --- /dev/null +++ b/base/applications/games/winmine/lang/pt-PT.rc @@ -0,0 +1,131 @@ +/* + * WineMine + * Portuguese Language Support + * + * Copyright 2003 Marcelo Duarte + * Copyright 2004 Amテゥrico Josテゥ Melo + * Copyright 2010 Gustavo Henrique Milarテゥ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +#pragma code_page(65001) + +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Ninguテゥm" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Opテァテオes" BEGIN + MENUITEM "&Novo\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Marcas", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&Principiante", IDM_BEGINNER + MENUITEM "&Intermediテ。rio", IDM_ADVANCED + MENUITEM "&Experiente", IDM_EXPERT + MENUITEM "Personali&zar...", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "Sai&r\tAlt+X", IDM_EXIT + END + POPUP "Aj&uda" BEGIN + MENUITEM "&Melhores tempos", IDM_TIMES + MENUITEM "&Sobre", IDM_ABOUT + END +END + +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Ninguテゥm" + IDS_ABOUT, "Direitos de autor 2000, Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Opテァテオes" BEGIN + MENUITEM "&Novo\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Marcas", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&Principiante", IDM_BEGINNER + MENUITEM "&Intermediテ。rio", IDM_ADVANCED + MENUITEM "&Experiente", IDM_EXPERT + MENUITEM "Personali&zar...", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "Sai&r\tAlt+X", IDM_EXIT + END + POPUP "Aj&uda" BEGIN + MENUITEM "&Melhores tempos", IDM_TIMES + MENUITEM "&Acerca", IDM_ABOUT + END +END + + +LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL + +DLG_TIMES DIALOGEX 0, 0, 170, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Melhores tempos" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Melhores tempos", -1, 10, 10, 150, 45 + LTEXT "Principiante", -1, 20, 20, 50, 8 + LTEXT "Intermediテ。rio", -1, 20, 30, 50, 8 + LTEXT "Experiente", -1, 20, 40, 50, 8 + LTEXT "999", IDC_TIME1, 80, 20, 15, 8 + LTEXT "999", IDC_TIME2, 80, 30, 15, 8 + LTEXT "999", IDC_TIME3, 80, 40, 15, 8 + LTEXT "", IDC_NAME1, 100, 20, 55, 8 + LTEXT "", IDC_NAME2, 100, 30, 55, 8 + LTEXT "", IDC_NAME3, 100, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 60, 60, 50, 15 +END + + +LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Parabテゥns!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Por favor, indique o seu nome", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Jogo personalizado" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Linhas", -1, 5, 5, 30, 10 + LTEXT "Colunas", -1, 5, 35, 30, 10 + LTEXT "Minas", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Cancelar", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/ro-RO.rc b/base/applications/games/winmine/lang/ro-RO.rc new file mode 100644 index 00000000000..d0e05cd19eb --- /dev/null +++ b/base/applications/games/winmine/lang/ro-RO.rc @@ -0,0 +1,95 @@ +/* + * WineMine + * Romanian Language Support + * + * Copyright 2007 Michael Stefaniuc + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL + +#pragma code_page(65001) + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Nimeni" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Opナ」iuni" BEGIN + MENUITEM "&Nou\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Mark Question", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&テ始cepトフor", IDM_BEGINNER + MENUITEM "&Avansat", IDM_ADVANCED + MENUITEM "&Expert", IDM_EXPERT + MENUITEM "&Personalizat", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "&Ieナ殃re\tAlt+X", IDM_EXIT + END + POPUP "&Informaナ」ii" BEGIN + MENUITEM "&Scoruri maxime", IDM_TIMES + MENUITEM "&Despre", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Scoruri maxime" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Scoruri maxime", -1, 10, 10, 140, 45 + LTEXT "&テ始cepトフor", -1, 20, 20, 40, 8 + LTEXT "Avansat", -1, 20, 30, 40, 8 + LTEXT "Expert", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Felicitトビi!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Scrieナ」i-vト numele", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Joc personalizat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Linii", -1, 5, 5, 30, 10 + LTEXT "Coloane", -1, 5, 35, 30, 10 + LTEXT "Mine", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Renunナ」ト", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/ru-RU.rc b/base/applications/games/winmine/lang/ru-RU.rc new file mode 100644 index 00000000000..3c7905ac095 --- /dev/null +++ b/base/applications/games/winmine/lang/ru-RU.rc @@ -0,0 +1,96 @@ +/* + * WineMine + * Russian Language Support + * + * Copyright 2003 Pavel Roskin + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Nobody" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&ミ侑ウムミー" BEGIN + MENUITEM "&ミ斷セミイミーム ミクミウムミー\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&ミ漬セミソムミセムミクムひオミサム糊スム巾オ ミキミスミーミコミク", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "ミ斷セミイミク&ムミセミコ", IDM_BEGINNER + MENUITEM "&ミ慴ームムひオム", IDM_ADVANCED + MENUITEM "&ミュミコムミソミオムム", IDM_EXPERT + MENUITEM "ミ斷オムムひーミスミエミームムひスム巾オ &ミソミームミーミシミオムびム", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "&ミ厘ーミコムム錦び圭tAlt+X", IDM_EXIT + END + POPUP "&ミ。ミソムミーミイミコミー" BEGIN + MENUITEM "&ミ嶝τム威オミオ ミイムミオミシム", IDM_TIMES + MENUITEM "&ミ ミソムミセミウムミーミシミシミオ", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "ミ嶝τム威オミオ ミイムミオミシム" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "ミ嶝τム威オミオ ミイムミオミシム", -1, 10, 10, 140, 45 + LTEXT "ミ斷セミイミクムミセミコ", -1, 20, 20, 40, 8 + LTEXT "ミ慴ームムひオム", -1, 20, 30, 40, 8 + LTEXT "ミュミコムミソミオムム", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "ミ渙セミキミエムミーミイミサム肖!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ミ渙セミカミーミサムσケムムひー, ミイミイミオミエミクムひオ ミイミーム威オ ミクミシム", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 140, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "ミ斷オムムひーミスミエミームムひスム巾オ ミソミームミーミシミオムびム" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ミ渙セ ミイミオムムひクミコミーミサミク", -1, 5, 5, 70, 10 + LTEXT "ミ渙セ ミウミセムミクミキミセミスムひーミサミク", -1, 5, 35, 70, 10 + LTEXT "ミァミクムミサミセ ミシミクミス", -1, 5, 65, 70, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 80, 30, 50, 15 + PUSHBUTTON "ミ樮ひシミオミスミー", IDCANCEL, 80, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/sl-SI.rc b/base/applications/games/winmine/lang/sl-SI.rc new file mode 100644 index 00000000000..855d606f77d --- /dev/null +++ b/base/applications/games/winmine/lang/sl-SI.rc @@ -0,0 +1,95 @@ +/* + * WineMine + * Slovenian Language Support + * + * Copyright 2003, 2008 Rok Mandeljc + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +#pragma code_page(65001) + +LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Nihト稿" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Moナセnosti" BEGIN + MENUITEM "&Nova igra\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Vpraナ。aji", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&Zaト稿tnik", IDM_BEGINNER + MENUITEM "&Napreden", IDM_ADVANCED + MENUITEM "&Strokovnjak", IDM_EXPERT + MENUITEM "&Poljubno", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "Iz&hod\tAlt+X", IDM_EXIT + END + POPUP "&Info" BEGIN + MENUITEM "&Najboljナ。i ト溝si", IDM_TIMES + MENUITEM "&O programu", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Najboljナ。i ト溝si" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Najboljナ。i ト溝si", -1, 10, 10, 140, 45 + LTEXT "Zaト稿tnik", -1, 20, 20, 40, 8 + LTEXT "Napreden", -1, 20, 30, 40, 8 + LTEXT "Strokovnjak", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "V redu", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "ト憩stitamo!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Vnesite svoje ime", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "V redu", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Poljubna igra" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Vrstice", -1, 5, 5, 30, 10 + LTEXT "Stolpci", -1, 5, 35, 30, 10 + LTEXT "Mine", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "V redu", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Prekliト絞", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/sv-SE.rc b/base/applications/games/winmine/lang/sv-SE.rc new file mode 100644 index 00000000000..75785a48e90 --- /dev/null +++ b/base/applications/games/winmine/lang/sv-SE.rc @@ -0,0 +1,98 @@ +/* + * WineMine + * Swedish Language Support + * + * Copyright 2000 Joshua Thielen + * Copyright 2003 Marcelo Duarte + * Copyright 2008 Daniel Nylander + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE BEGIN + IDS_APPNAME, "Minor" + IDS_NOBODY, "Ingen" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "A<ernativ" BEGIN + MENUITEM "&Nytt\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Markera frテ・ga", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "Ny&bテカrjare", IDM_BEGINNER + MENUITEM "&Avancerad", IDM_ADVANCED + MENUITEM "&Expert", IDM_EXPERT + MENUITEM "An&passad...", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "A&vsluta\tAlt+X", IDM_EXIT + END + POPUP "&Info" BEGIN + MENUITEM "&Snabbaste tider...", IDM_TIMES + MENUITEM "&Om", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Snabbaste tider" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Snabbaste tider", -1, 10, 10, 140, 45 + LTEXT "Nybテカrjare", -1, 20, 20, 40, 8 + LTEXT "Avancerad", -1, 20, 30, 40, 8 + LTEXT "Expert", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Gratulerar!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Ange ditt namn", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Anpassat spel" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Rader", -1, 5, 5, 30, 10 + LTEXT "Kolumner", -1, 5, 35, 35, 10 + LTEXT "Minor", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Avbryt", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/tr-TR.rc b/base/applications/games/winmine/lang/tr-TR.rc new file mode 100644 index 00000000000..dc9849350ec --- /dev/null +++ b/base/applications/games/winmine/lang/tr-TR.rc @@ -0,0 +1,93 @@ +/* + * WineMine + * Turkish Language Support + * + * Copyright 2006 Fatih Ac + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + +STRINGTABLE BEGIN + IDS_APPNAME, "Wine Mayn Tarlas" + IDS_NOBODY, "Hi kimse" + IDS_ABOUT, "Telif hakk 2000, Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&Se軻nekler" BEGIN + MENUITEM "&Yeni\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Soru ンareti", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "&Acemi", IDM_BEGINNER + MENUITEM "&Gelimi", IDM_ADVANCED + MENUITEM "&Uzman", IDM_EXPERT + MENUITEM "&ヨzel", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "&ヌk\tAlt+X", IDM_EXIT + END + POPUP "&Bilgi" BEGIN + MENUITEM "&En Ksa Sreler", IDM_TIMES + MENUITEM "&Hakknda", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "En Ksa Sreler" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "En Ksa Sreler", -1, 10, 10, 140, 45 + LTEXT "Acemi", -1, 20, 20, 40, 8 + LTEXT "Gelimi", -1, 20, 30, 40, 8 + LTEXT "Uzman", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "Tamam", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "Tebrikler!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Ltfen adnz girin", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "Tamam", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "ヨzel Oyun" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Satrlar", -1, 5, 5, 30, 10 + LTEXT "Stunlar", -1, 5, 35, 30, 10 + LTEXT "Maynlar", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "Tamam", IDOK, 40, 30, 50, 15 + PUSHBUTTON "ンptal", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/uk-UA.rc b/base/applications/games/winmine/lang/uk-UA.rc new file mode 100644 index 00000000000..a43d6b83703 --- /dev/null +++ b/base/applications/games/winmine/lang/uk-UA.rc @@ -0,0 +1,99 @@ +/* +/* + * WineMine + * Ukrainian Language Support + * + * Copyright 2000 Joshua Thielen + * Copyright 2003 Marcelo Duarte + * Copyright 2010 Igor Paliychuk + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +STRINGTABLE BEGIN + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Nobody" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "&ミ酉ミー" BEGIN + MENUITEM "&ミ斷セミイミー\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&ミ厘スミーミコミク ミソミクムひーミスミスム", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "ミ&ミセミイミームミセミコ", IDM_BEGINNER + MENUITEM "&ミ慴ーミケムムひオム", IDM_ADVANCED + MENUITEM "&ミ片コムミソミオムム", IDM_EXPERT + MENUITEM "&ミ。ミイミセム ミソミームミーミシミオムびミク...", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "&ミ漬クムム孟エ\tAlt+X", IDM_EXIT + END + POPUP "&ミ頒セミイム孟エミコミー" BEGIN + MENUITEM "&ミ墫ミーム禍クミケ ムミーム...", IDM_TIMES + MENUITEM "&ミ湲ミセ ミソムミセミウムミーミシム", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "ミ墫ミーム禍クミケ ムミーム" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "ミ墫ミーム禍クミケ ムミーム", -1, 10, 10, 140, 45 + LTEXT "ミ斷セミイミームミセミコ", -1, 20, 20, 40, 8 + LTEXT "ミ慴ーミケムムひオム", -1, 20, 30, 40, 8 + LTEXT "ミ片コムミソミオムム", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "ミ柘毛ひーミスミスム!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ミ漬イミオミエム毛び ミイミーム威オ ム孟シ'ム", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "ミ。ミイミセム ミソミームミーミシミオムびミク" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ミム紹エミコム孟イ", -1, 5, 5, 30, 10 + LTEXT "ミ。ムひセミイミソムム孟イ", -1, 5, 35, 30, 10 + LTEXT "ミ慯孟ス", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "ミ。ミコミームムσイミームひク", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/lang/zh-CN.rc b/base/applications/games/winmine/lang/zh-CN.rc new file mode 100644 index 00000000000..2b3a1ae7450 --- /dev/null +++ b/base/applications/games/winmine/lang/zh-CN.rc @@ -0,0 +1,167 @@ +/* + * WineMine (Simplified and Traditional Chinese Resource) + * + * Copyright 2008 Hongbo Ni + * Copyright 2010 Cheer Xiao + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +STRINGTABLE BEGIN + IDS_APPNAME, "Wine蝨ー髮キ" + IDS_NOBODY, "譌莠コ" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "騾蛾。ケ(&O)" BEGIN + MENUITEM "譁ー貂ク謌(&N)\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "蜈∬ョク髣ョ蜿キ譬隶ー(&M)", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "蛻晏ュヲ閠(&B)", IDM_BEGINNER + MENUITEM "鬮倡コァ(&A)", IDM_ADVANCED + MENUITEM "荳灘ョカ(&E)", IDM_EXPERT + MENUITEM "閾ェ螳壻ケ(&C)", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "騾蜃コ(&X)\tAlt+X", IDM_EXIT + END + POPUP "菫。諱ッ(&I)" BEGIN + MENUITEM "譛蠢ォ譌カ髣エ(&F)", IDM_TIMES + MENUITEM "蜈ウ莠(&A)", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "譛蠢ォ譌カ髣エ" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "譛蠢ォ譌カ髣エ", -1, 10, 10, 140, 45 + LTEXT "蛻晏ュヲ閠", -1, 20, 20, 40, 8 + LTEXT "鬮倡コァ", -1, 20, 30, 40, 8 + LTEXT "荳灘ョカ", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "遑ョ螳", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "逾晁エコシ" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "隸キ霎灘・菴逧蜷榊ュ", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "遑ョ螳", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "閾ェ螳壻ケ画クク謌" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "陦", -1, 5, 5, 30, 10 + LTEXT "蛻", -1, 5, 35, 30, 10 + LTEXT "蝨ー髮キ", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "遑ョ螳", IDOK, 40, 30, 50, 15 + PUSHBUTTON "蜿匁カ", IDCANCEL, 40, 50, 50, 15 +END + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +STRINGTABLE BEGIN + IDS_APPNAME, "Wine蝨ー髮キ" + IDS_NOBODY, "辟。莠コ" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +END + +MENU_WINEMINE MENU +BEGIN + POPUP "驕ク鬆(&O)" BEGIN + MENUITEM "譁ー驕頑梓(&N)\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "讓吝コ蝠城。(&M)", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "蛻晏ュク閠(&B)", IDM_BEGINNER + MENUITEM "鬮倡エ(&A)", IDM_ADVANCED + MENUITEM "蟆亥ョカ(&E)", IDM_EXPERT + MENUITEM "閾ェ螳夂セゥ(&C)", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "邨先據(&X)\tAlt+X", IDM_EXIT + END + POPUP "雉險(&I)" BEGIN + MENUITEM "譛蠢ォ譎る俣(&F)", IDM_TIMES + MENUITEM "髣懈名(&A)", IDM_ABOUT + END +END + +DLG_TIMES DIALOGEX 0, 0, 160, 80 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "譛蠢ォ譎る俣" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "譛蠢ォ譎る俣", -1, 10, 10, 140, 45 + LTEXT "蛻晏ュク閠", -1, 20, 20, 40, 8 + LTEXT "鬮倡エ", -1, 20, 30, 40, 8 + LTEXT "蟆亥ョカ", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "遒コ螳", IDOK, 55, 60, 50, 15 +END + +DLG_CONGRATS DIALOGEX 0, 0, 160, 60 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "逾晁ウ!" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "隲玖シク蜈・菴逧蜷榊ュ", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "遒コ螳", IDOK, 60, 40, 40, 15 +END + +DLG_CUSTOM DIALOGEX 0, 0, 100, 100 +STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHELLFONT +CAPTION "閾ェ螳夂セゥ驕頑梓" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "陦", -1, 5, 5, 30, 10 + LTEXT "蛻", -1, 5, 35, 30, 10 + LTEXT "蝨ー髮キ", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "遒コ螳", IDOK, 40, 30, 50, 15 + PUSHBUTTON "蜿匁カ", IDCANCEL, 40, 50, 50, 15 +END diff --git a/base/applications/games/winmine/main.c b/base/applications/games/winmine/main.c new file mode 100644 index 00000000000..b000b04e9be --- /dev/null +++ b/base/applications/games/winmine/main.c @@ -0,0 +1,1053 @@ +/* + * WineMine (main.c) + * + * Copyright 2000 Joshua Thielen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define WIN32_LEAN_AND_MEAN + +#include +#include +#include +#include +#include +#include "main.h" +#include "resource.h" + +#include + +WINE_DEFAULT_DEBUG_CHANNEL(winemine); + +static const DWORD wnd_style = WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX; +static const char* registry_key = "Software\\Microsoft\\WinMine"; + + +void CheckLevel( BOARD *p_board ) +{ + if( p_board->rows < BEGINNER_ROWS ) + p_board->rows = BEGINNER_ROWS; + + if( p_board->rows > MAX_ROWS ) + p_board->rows = MAX_ROWS; + + if( p_board->cols < BEGINNER_COLS ) + p_board->cols = BEGINNER_COLS; + + if( p_board->cols > MAX_COLS ) + p_board->cols = MAX_COLS; + + if( p_board->mines < BEGINNER_MINES ) + p_board->mines = BEGINNER_MINES; + + if( p_board->mines > ( p_board->cols - 1 ) * ( p_board->rows - 1 ) ) + p_board->mines = ( p_board->cols - 1 ) * ( p_board->rows - 1 ); +} + +static void LoadBoard( BOARD *p_board ) +{ + DWORD size; + DWORD type; + HKEY hkey; + char data[MAX_PLAYER_NAME_SIZE+1]; + char key_name[8]; + unsigned i; + + RegOpenKeyEx( HKEY_CURRENT_USER, registry_key, + 0, KEY_QUERY_VALUE, &hkey ); + + size = sizeof( p_board->pos.x ); + if( !RegQueryValueEx( hkey, "Xpos", NULL, &type, + (LPBYTE) &p_board->pos.x, &size ) == ERROR_SUCCESS ) + p_board->pos.x = 0; + + size = sizeof( p_board->pos.y ); + if( !RegQueryValueEx( hkey, "Ypos", NULL, &type, + (LPBYTE) &p_board->pos.y, &size ) == ERROR_SUCCESS ) + p_board->pos.y = 0; + + size = sizeof( p_board->rows ); + if( !RegQueryValueEx( hkey, "Height", NULL, &type, + (LPBYTE) &p_board->rows, &size ) == ERROR_SUCCESS ) + p_board->rows = BEGINNER_ROWS; + + size = sizeof( p_board->cols ); + if( !RegQueryValueEx( hkey, "Width", NULL, &type, + (LPBYTE) &p_board->cols, &size ) == ERROR_SUCCESS ) + p_board->cols = BEGINNER_COLS; + + size = sizeof( p_board->mines ); + if( !RegQueryValueEx( hkey, "Mines", NULL, &type, + (LPBYTE) &p_board->mines, &size ) == ERROR_SUCCESS ) + p_board->mines = BEGINNER_MINES; + + size = sizeof( p_board->difficulty ); + if( !RegQueryValueEx( hkey, "Difficulty", NULL, &type, + (LPBYTE) &p_board->difficulty, &size ) == ERROR_SUCCESS ) + p_board->difficulty = BEGINNER; + + size = sizeof( p_board->IsMarkQ ); + if( !RegQueryValueEx( hkey, "Mark", NULL, &type, + (LPBYTE) &p_board->IsMarkQ, &size ) == ERROR_SUCCESS ) + p_board->IsMarkQ = TRUE; + + for( i = 0; i < 3; i++ ) { + wsprintf( key_name, "Name%d", i+1 ); + size = sizeof( data ); + if( RegQueryValueEx( hkey, key_name, NULL, &type, + (LPBYTE) data, &size ) == ERROR_SUCCESS ) + lstrcpynA( p_board->best_name[i], data, sizeof(p_board->best_name[i]) ); + else + LoadString( p_board->hInst, IDS_NOBODY, p_board->best_name[i], MAX_PLAYER_NAME_SIZE+1 ); + } + + for( i = 0; i < 3; i++ ) { + wsprintf( key_name, "Time%d", i+1 ); + size = sizeof( p_board->best_time[i] ); + if( !RegQueryValueEx( hkey, key_name, NULL, &type, + (LPBYTE) &p_board->best_time[i], &size ) == ERROR_SUCCESS ) + p_board->best_time[i] = 999; + } + RegCloseKey( hkey ); +} + +static void InitBoard( BOARD *p_board ) +{ + HMENU hMenu; + + p_board->hMinesBMP = LoadBitmap( p_board->hInst, "mines"); + p_board->hFacesBMP = LoadBitmap( p_board->hInst, "faces"); + p_board->hLedsBMP = LoadBitmap( p_board->hInst, "leds"); + + LoadBoard( p_board ); + + hMenu = GetMenu( p_board->hWnd ); + CheckMenuItem( hMenu, IDM_BEGINNER + (unsigned) p_board->difficulty, + MF_CHECKED ); + if( p_board->IsMarkQ ) + CheckMenuItem( hMenu, IDM_MARKQ, MF_CHECKED ); + else + CheckMenuItem( hMenu, IDM_MARKQ, MF_UNCHECKED ); + CheckLevel( p_board ); +} + +static void SaveBoard( BOARD *p_board ) +{ + HKEY hkey; + unsigned i; + char data[MAX_PLAYER_NAME_SIZE+1]; + char key_name[8]; + + if( RegCreateKeyEx( HKEY_CURRENT_USER, registry_key, + 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, + &hkey, NULL ) != ERROR_SUCCESS) + return; + + RegSetValueEx( hkey, "Xpos", 0, REG_DWORD, (LPBYTE) &p_board->pos.x, sizeof(p_board->pos.x) ); + RegSetValueEx( hkey, "Ypos", 0, REG_DWORD, (LPBYTE) &p_board->pos.y, sizeof(p_board->pos.y) ); + RegSetValueEx( hkey, "Difficulty", 0, REG_DWORD, (LPBYTE) &p_board->difficulty, sizeof(p_board->difficulty) ); + RegSetValueEx( hkey, "Height", 0, REG_DWORD, (LPBYTE) &p_board->rows, sizeof(p_board->rows) ); + RegSetValueEx( hkey, "Width", 0, REG_DWORD, (LPBYTE) &p_board->cols, sizeof(p_board->cols) ); + RegSetValueEx( hkey, "Mines", 0, REG_DWORD, (LPBYTE) &p_board->mines, sizeof(p_board->mines) ); + RegSetValueEx( hkey, "Mark", 0, REG_DWORD, (LPBYTE) &p_board->IsMarkQ, sizeof(p_board->IsMarkQ) ); + + for( i = 0; i < 3; i++ ) { + wsprintf( key_name, "Name%u", i+1 ); + lstrcpyn( data, p_board->best_name[i], sizeof( data ) ); + RegSetValueEx( hkey, key_name, 0, REG_SZ, (LPBYTE) data, strlen(data)+1 ); + } + + for( i = 0; i < 3; i++ ) { + wsprintf( key_name, "Time%u", i+1 ); + RegSetValueEx( hkey, key_name, 0, REG_DWORD, (LPBYTE) &p_board->best_time[i], sizeof(p_board->best_time[i]) ); + } + RegCloseKey( hkey ); +} + +static void DestroyBoard( BOARD *p_board ) +{ + DeleteObject( p_board->hFacesBMP ); + DeleteObject( p_board->hLedsBMP ); + DeleteObject( p_board->hMinesBMP ); +} + +static void SetDifficulty( BOARD *p_board, DIFFICULTY difficulty ) +{ + HMENU hMenu; + + if ( difficulty == CUSTOM ) + if (DialogBoxParam( p_board->hInst, "DLG_CUSTOM", p_board->hWnd, + CustomDlgProc, (LPARAM) p_board) != 0) + return; + + hMenu = GetMenu( p_board->hWnd ); + CheckMenuItem( hMenu, IDM_BEGINNER + p_board->difficulty, MF_UNCHECKED ); + p_board->difficulty = difficulty; + CheckMenuItem( hMenu, IDM_BEGINNER + difficulty, MF_CHECKED ); + + switch( difficulty ) { + case BEGINNER: + p_board->cols = BEGINNER_COLS; + p_board->rows = BEGINNER_ROWS; + p_board->mines = BEGINNER_MINES; + break; + + case ADVANCED: + p_board->cols = ADVANCED_COLS; + p_board->rows = ADVANCED_ROWS; + p_board->mines = ADVANCED_MINES; + break; + + case EXPERT: + p_board->cols = EXPERT_COLS; + p_board->rows = EXPERT_ROWS; + + p_board->mines = EXPERT_MINES; + break; + + case CUSTOM: + break; + } +} + +static void ShiftBetween(LONG* x, LONG* y, LONG a, LONG b) +{ + if (*x < a) { + *y += a - *x; + *x = a; + } + else if (*y > b) { + *x -= *y - b; + *y = b; + } +} + +static void MoveOnScreen(RECT* rect) +{ + HMONITOR hMonitor; + MONITORINFO mi; + + /* find the nearest monitor ... */ + hMonitor = MonitorFromRect(rect, MONITOR_DEFAULTTONEAREST); + + /* ... and move it into the work area (ie excluding task bar)*/ + mi.cbSize = sizeof(mi); + GetMonitorInfo(hMonitor, &mi); + + ShiftBetween(&rect->left, &rect->right, mi.rcWork.left, mi.rcWork.right); + ShiftBetween(&rect->top, &rect->bottom, mi.rcWork.top, mi.rcWork.bottom); +} + +static void CreateBoard( BOARD *p_board ) +{ + int left, top, bottom, right; + unsigned col, row; + RECT wnd_rect; + + p_board->mb = MB_NONE; + p_board->boxes_left = p_board->cols * p_board->rows - p_board->mines; + p_board->num_flags = 0; + + /* Create the boxes... + * We actually create them with an empty border, + * so special care doesn't have to be taken on the edges + */ + for( col = 0; col <= p_board->cols + 1; col++ ) + for( row = 0; row <= p_board->rows + 1; row++ ) { + p_board->box[col][row].IsPressed = FALSE; + p_board->box[col][row].IsMine = FALSE; + p_board->box[col][row].FlagType = NORMAL; + p_board->box[col][row].NumMines = 0; + } + + p_board->width = p_board->cols * MINE_WIDTH + BOARD_WMARGIN * 2; + + p_board->height = p_board->rows * MINE_HEIGHT + LED_HEIGHT + + BOARD_HMARGIN * 3; + + /* setting the mines rectangle boundary */ + left = BOARD_WMARGIN; + top = BOARD_HMARGIN * 2 + LED_HEIGHT; + right = left + p_board->cols * MINE_WIDTH; + bottom = top + p_board->rows * MINE_HEIGHT; + SetRect( &p_board->mines_rect, left, top, right, bottom ); + + /* setting the face rectangle boundary */ + left = p_board->width / 2 - FACE_WIDTH / 2; + top = BOARD_HMARGIN; + right = left + FACE_WIDTH; + bottom = top + FACE_HEIGHT; + SetRect( &p_board->face_rect, left, top, right, bottom ); + + /* setting the timer rectangle boundary */ + left = BOARD_WMARGIN; + top = BOARD_HMARGIN; + right = left + LED_WIDTH * 3; + bottom = top + LED_HEIGHT; + SetRect( &p_board->timer_rect, left, top, right, bottom ); + + /* setting the counter rectangle boundary */ + left = p_board->width - BOARD_WMARGIN - LED_WIDTH * 3; + top = BOARD_HMARGIN; + right = p_board->width - BOARD_WMARGIN; + bottom = top + LED_HEIGHT; + SetRect( &p_board->counter_rect, left, top, right, bottom ); + + p_board->status = WAITING; + p_board->face_bmp = SMILE_BMP; + p_board->time = 0; + + wnd_rect.left = p_board->pos.x; + wnd_rect.right = p_board->pos.x + p_board->width; + wnd_rect.top = p_board->pos.y; + wnd_rect.bottom = p_board->pos.y + p_board->height; + AdjustWindowRect(&wnd_rect, wnd_style, TRUE); + + /* Make sure the window is completely on the screen */ + MoveOnScreen(&wnd_rect); + MoveWindow( p_board->hWnd, wnd_rect.left, wnd_rect.top, + wnd_rect.right - wnd_rect.left, + wnd_rect.bottom - wnd_rect.top, + TRUE ); + RedrawWindow( p_board->hWnd, NULL, 0, + RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE); +} + + +/* Randomly places mines everywhere except the selected box. */ +static void PlaceMines ( BOARD *p_board, int selected_col, int selected_row ) +{ + int i, j; + unsigned col, row; + + srand( (unsigned) time( NULL ) ); + + /* Temporarily place a mine at the selected box until all the other + * mines are placed, this avoids checking in the mine creation loop. */ + p_board->box[selected_col][selected_row].IsMine = TRUE; + + /* create mines */ + i = 0; + while( (unsigned) i < p_board->mines ) { + col = (int) (p_board->cols * (float) rand() / RAND_MAX + 1); + row = (int) (p_board->rows * (float) rand() / RAND_MAX + 1); + + if( !p_board->box[col][row].IsMine ) { + i++; + p_board->box[col][row].IsMine = TRUE; + } + } + + /* Remove temporarily placed mine for selected box */ + p_board->box[selected_col][selected_row].IsMine = FALSE; + + /* + * Now we label the remaining boxes with the + * number of mines surrounding them. + */ + for( col = 1; col < p_board->cols + 1; col++ ) + for( row = 1; row < p_board->rows + 1; row++ ) { + for( i = -1; i <= 1; i++ ) + for( j = -1; j <= 1; j++ ) { + if( p_board->box[col + i][row + j].IsMine ) { + p_board->box[col][row].NumMines++ ; + } + } + } +} + +static void DrawMine( HDC hdc, HDC hMemDC, BOARD *p_board, unsigned col, unsigned row, BOOL IsPressed ) +{ + MINEBMP_OFFSET offset = BOX_BMP; + + if( col == 0 || col > p_board->cols || row == 0 || row > p_board->rows ) + return; + + if( p_board->status == GAMEOVER ) { + if( p_board->box[col][row].IsMine ) { + switch( p_board->box[col][row].FlagType ) { + case FLAG: + offset = FLAG_BMP; + break; + case COMPLETE: + offset = EXPLODE_BMP; + break; + case QUESTION: + /* fall through */ + case NORMAL: + offset = MINE_BMP; + } + } else { + switch( p_board->box[col][row].FlagType ) { + case QUESTION: + offset = QUESTION_BMP; + break; + case FLAG: + offset = WRONG_BMP; + break; + case NORMAL: + offset = BOX_BMP; + break; + case COMPLETE: + /* Do nothing */ + break; + default: + WINE_TRACE("Unknown FlagType during game over in DrawMine\n"); + break; + } + } + } else { /* WAITING or PLAYING */ + switch( p_board->box[col][row].FlagType ) { + case QUESTION: + if( !IsPressed ) + offset = QUESTION_BMP; + else + offset = QPRESS_BMP; + break; + case FLAG: + offset = FLAG_BMP; + break; + case NORMAL: + if( !IsPressed ) + offset = BOX_BMP; + else + offset = MPRESS_BMP; + break; + case COMPLETE: + /* Do nothing */ + break; + default: + WINE_TRACE("Unknown FlagType while playing in DrawMine\n"); + break; + } + } + + if( p_board->box[col][row].FlagType == COMPLETE + && !p_board->box[col][row].IsMine ) + offset = (MINEBMP_OFFSET) p_board->box[col][row].NumMines; + + BitBlt( hdc, + (col - 1) * MINE_WIDTH + p_board->mines_rect.left, + (row - 1) * MINE_HEIGHT + p_board->mines_rect.top, + MINE_WIDTH, MINE_HEIGHT, + hMemDC, 0, offset * MINE_HEIGHT, SRCCOPY ); +} + +static void DrawMines ( HDC hdc, HDC hMemDC, BOARD *p_board ) +{ + HGDIOBJ hOldObj; + unsigned col, row; + hOldObj = SelectObject (hMemDC, p_board->hMinesBMP); + + for( row = 1; row <= p_board->rows; row++ ) { + for( col = 1; col <= p_board->cols; col++ ) { + DrawMine( hdc, hMemDC, p_board, col, row, FALSE ); + } + } + SelectObject( hMemDC, hOldObj ); +} + +static void DrawLeds( HDC hdc, HDC hMemDC, BOARD *p_board, int number, int x, int y ) +{ + HGDIOBJ hOldObj; + unsigned led[3], i; + int count; + + count = number; + if( count < 1000 ) { + if( count >= 0 ) { + led[0] = count / 100 ; + count -= led[0] * 100; + } + else { + led[0] = 10; /* negative sign */ + count = -count; + } + led[1] = count / 10; + count -= led[1] * 10; + led[2] = count; + } + else { + for( i = 0; i < 3; i++ ) + led[i] = 10; + } + + hOldObj = SelectObject (hMemDC, p_board->hLedsBMP); + + for( i = 0; i < 3; i++ ) { + BitBlt( hdc, + i * LED_WIDTH + x, + y, + LED_WIDTH, + LED_HEIGHT, + hMemDC, + 0, + led[i] * LED_HEIGHT, + SRCCOPY); + } + + SelectObject( hMemDC, hOldObj ); +} + + +static void DrawFace( HDC hdc, HDC hMemDC, BOARD *p_board ) +{ + HGDIOBJ hOldObj; + + hOldObj = SelectObject (hMemDC, p_board->hFacesBMP); + + BitBlt( hdc, + p_board->face_rect.left, + p_board->face_rect.top, + FACE_WIDTH, + FACE_HEIGHT, + hMemDC, 0, p_board->face_bmp * FACE_HEIGHT, SRCCOPY); + + SelectObject( hMemDC, hOldObj ); +} + + +static void DrawBoard( HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, BOARD *p_board ) +{ + RECT tmp_rect; + + if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->counter_rect ) ) + DrawLeds( hdc, hMemDC, p_board, p_board->mines - p_board->num_flags, + p_board->counter_rect.left, + p_board->counter_rect.top ); + + if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->timer_rect ) ) + DrawLeds( hdc, hMemDC, p_board, p_board->time, + p_board->timer_rect.left, + p_board->timer_rect.top ); + + if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->face_rect ) ) + DrawFace( hdc, hMemDC, p_board ); + + if( IntersectRect( &tmp_rect, &ps->rcPaint, &p_board->mines_rect ) ) + DrawMines( hdc, hMemDC, p_board ); +} + + +static void AddFlag( BOARD *p_board, unsigned col, unsigned row ) +{ + if( p_board->box[col][row].FlagType != COMPLETE ) { + switch( p_board->box[col][row].FlagType ) { + case FLAG: + if( p_board->IsMarkQ ) + p_board->box[col][row].FlagType = QUESTION; + else + p_board->box[col][row].FlagType = NORMAL; + p_board->num_flags--; + break; + + case QUESTION: + p_board->box[col][row].FlagType = NORMAL; + break; + + default: + p_board->box[col][row].FlagType = FLAG; + p_board->num_flags++; + } + } +} + + +static void UnpressBox( BOARD *p_board, unsigned col, unsigned row ) +{ + HDC hdc; + HGDIOBJ hOldObj; + HDC hMemDC; + + hdc = GetDC( p_board->hWnd ); + hMemDC = CreateCompatibleDC( hdc ); + hOldObj = SelectObject( hMemDC, p_board->hMinesBMP ); + + DrawMine( hdc, hMemDC, p_board, col, row, FALSE ); + + SelectObject( hMemDC, hOldObj ); + DeleteDC( hMemDC ); + ReleaseDC( p_board->hWnd, hdc ); +} + + +static void UnpressBoxes( BOARD *p_board, unsigned col, unsigned row ) +{ + int i, j; + + for( i = -1; i <= 1; i++ ) + for( j = -1; j <= 1; j++ ) { + UnpressBox( p_board, col + i, row + j ); + } +} + + +static void PressBox( BOARD *p_board, unsigned col, unsigned row ) +{ + HDC hdc; + HGDIOBJ hOldObj; + HDC hMemDC; + + hdc = GetDC( p_board->hWnd ); + hMemDC = CreateCompatibleDC( hdc ); + hOldObj = SelectObject (hMemDC, p_board->hMinesBMP); + + DrawMine( hdc, hMemDC, p_board, col, row, TRUE ); + + SelectObject( hMemDC, hOldObj ); + DeleteDC( hMemDC ); + ReleaseDC( p_board->hWnd, hdc ); +} + + +static void PressBoxes( BOARD *p_board, unsigned col, unsigned row ) +{ + int i, j; + + for( i = -1; i <= 1; i++ ) + for( j = -1; j <= 1; j++ ) { + p_board->box[col + i][row + j].IsPressed = TRUE; + PressBox( p_board, col + i, row + j ); + } + + for( i = -1; i <= 1; i++ ) + for( j = -1; j <= 1; j++ ) { + if( !p_board->box[p_board->press.x + i][p_board->press.y + j].IsPressed ) + UnpressBox( p_board, p_board->press.x + i, p_board->press.y + j ); + } + + for( i = -1; i <= 1; i++ ) + for( j = -1; j <= 1; j++ ) { + p_board->box[col + i][row + j].IsPressed = FALSE; + PressBox( p_board, col + i, row + j ); + } + + p_board->press.x = col; + p_board->press.y = row; +} + + +static void CompleteBox( BOARD *p_board, unsigned col, unsigned row ) +{ + int i, j; + + if( p_board->box[col][row].FlagType != COMPLETE && + p_board->box[col][row].FlagType != FLAG && + col > 0 && col < p_board->cols + 1 && + row > 0 && row < p_board->rows + 1 ) { + p_board->box[col][row].FlagType = COMPLETE; + + if( p_board->box[col][row].IsMine ) { + p_board->face_bmp = DEAD_BMP; + p_board->status = GAMEOVER; + } + else if( p_board->status != GAMEOVER ) + p_board->boxes_left--; + + if( p_board->box[col][row].NumMines == 0 ) + { + for( i = -1; i <= 1; i++ ) + for( j = -1; j <= 1; j++ ) + CompleteBox( p_board, col + i, row + j ); + } + } +} + + +static void CompleteBoxes( BOARD *p_board, unsigned col, unsigned row ) +{ + unsigned numFlags = 0; + int i, j; + + if( p_board->box[col][row].FlagType == COMPLETE ) { + for( i = -1; i <= 1; i++ ) + for( j = -1; j <= 1; j++ ) { + if( p_board->box[col+i][row+j].FlagType == FLAG ) + numFlags++; + } + + if( numFlags == p_board->box[col][row].NumMines ) { + for( i = -1; i <= 1; i++ ) + for( j = -1; j <= 1; j++ ) { + if( p_board->box[col+i][row+j].FlagType != FLAG ) + CompleteBox( p_board, col+i, row+j ); + } + } + } +} + + +static void TestMines( BOARD *p_board, POINT pt, int msg ) +{ + BOOL draw = TRUE; + int col, row; + + col = (pt.x - p_board->mines_rect.left) / MINE_WIDTH + 1; + row = (pt.y - p_board->mines_rect.top ) / MINE_HEIGHT + 1; + + switch ( msg ) { + case WM_LBUTTONDOWN: + if( p_board->press.x != col || p_board->press.y != row ) { + UnpressBox( p_board, + p_board->press.x, p_board->press.y ); + p_board->press.x = col; + p_board->press.y = row; + PressBox( p_board, col, row ); + } + draw = FALSE; + break; + + case WM_LBUTTONUP: + if( p_board->press.x != col || p_board->press.y != row ) + UnpressBox( p_board, + p_board->press.x, p_board->press.y ); + p_board->press.x = 0; + p_board->press.y = 0; + if( p_board->box[col][row].FlagType != FLAG + && p_board->status != PLAYING ) + { + p_board->status = PLAYING; + PlaceMines( p_board, col, row ); + } + CompleteBox( p_board, col, row ); + break; + + case WM_MBUTTONDOWN: + PressBoxes( p_board, col, row ); + draw = FALSE; + break; + + case WM_MBUTTONUP: + if( p_board->press.x != col || p_board->press.y != row ) + UnpressBoxes( p_board, + p_board->press.x, p_board->press.y ); + p_board->press.x = 0; + p_board->press.y = 0; + CompleteBoxes( p_board, col, row ); + break; + + case WM_RBUTTONDOWN: + AddFlag( p_board, col, row ); + break; + default: + WINE_TRACE("Unknown message type received in TestMines\n"); + break; + } + + if( draw ) + { + RedrawWindow( p_board->hWnd, NULL, 0, + RDW_INVALIDATE | RDW_UPDATENOW ); + } +} + + +static void TestFace( BOARD *p_board, POINT pt, int msg ) +{ + if( p_board->status == PLAYING || p_board->status == WAITING ) { + if( msg == WM_LBUTTONDOWN || msg == WM_MBUTTONDOWN ) + p_board->face_bmp = OOH_BMP; + else p_board->face_bmp = SMILE_BMP; + } + else if( p_board->status == GAMEOVER ) + p_board->face_bmp = DEAD_BMP; + else if( p_board->status == WON ) + p_board->face_bmp = COOL_BMP; + + if( PtInRect( &p_board->face_rect, pt ) ) { + if( msg == WM_LBUTTONDOWN ) + p_board->face_bmp = SPRESS_BMP; + + if( msg == WM_LBUTTONUP ) + CreateBoard( p_board ); + } + + RedrawWindow( p_board->hWnd, &p_board->face_rect, 0, + RDW_INVALIDATE | RDW_UPDATENOW ); +} + + +static void TestBoard( HWND hWnd, BOARD *p_board, int x, int y, int msg ) +{ + POINT pt; + unsigned col,row; + + pt.x = x; + pt.y = y; + + if( PtInRect( &p_board->mines_rect, pt ) && p_board->status != GAMEOVER + && p_board->status != WON ) + TestMines( p_board, pt, msg ); + else { + UnpressBoxes( p_board, + p_board->press.x, + p_board->press.y ); + p_board->press.x = 0; + p_board->press.y = 0; + } + + if( p_board->boxes_left == 0 ) { + p_board->status = WON; + + if (p_board->num_flags < p_board->mines) { + for( row = 1; row <= p_board->rows; row++ ) { + for( col = 1; col <= p_board->cols; col++ ) { + if (p_board->box[col][row].IsMine && p_board->box[col][row].FlagType != FLAG) + p_board->box[col][row].FlagType = FLAG; + } + } + + p_board->num_flags = p_board->mines; + + RedrawWindow( p_board->hWnd, NULL, 0, + RDW_INVALIDATE | RDW_UPDATENOW ); + } + + if( p_board->difficulty != CUSTOM && + p_board->time < p_board->best_time[p_board->difficulty] ) { + p_board->best_time[p_board->difficulty] = p_board->time; + + DialogBoxParam( p_board->hInst, "DLG_CONGRATS", hWnd, + CongratsDlgProc, (LPARAM) p_board); + + DialogBoxParam( p_board->hInst, "DLG_TIMES", hWnd, + TimesDlgProc, (LPARAM) p_board); + } + } + TestFace( p_board, pt, msg ); +} + + +static LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HDC hdc; + PAINTSTRUCT ps; + HMENU hMenu; + static BOARD board; + + switch( msg ) { + case WM_CREATE: + board.hInst = ((LPCREATESTRUCT) lParam)->hInstance; + board.hWnd = hWnd; + InitBoard( &board ); + CreateBoard( &board ); + return 0; + + case WM_PAINT: + { + HDC hMemDC; + + WINE_TRACE("WM_PAINT\n"); + hdc = BeginPaint( hWnd, &ps ); + hMemDC = CreateCompatibleDC( hdc ); + + DrawBoard( hdc, hMemDC, &ps, &board ); + + DeleteDC( hMemDC ); + EndPaint( hWnd, &ps ); + + return 0; + } + + case WM_MOVE: + WINE_TRACE("WM_MOVE\n"); + board.pos.x = (short)LOWORD(lParam); + board.pos.y = (short)HIWORD(lParam); + return 0; + + case WM_DESTROY: + SaveBoard( &board ); + DestroyBoard( &board ); + PostQuitMessage( 0 ); + return 0; + + case WM_TIMER: + if( board.status == PLAYING ) { + board.time++; + RedrawWindow( hWnd, &board.timer_rect, 0, + RDW_INVALIDATE | RDW_UPDATENOW ); + } + return 0; + + case WM_LBUTTONDOWN: + WINE_TRACE("WM_LBUTTONDOWN\n"); + if( wParam & MK_RBUTTON ) + msg = WM_MBUTTONDOWN; + TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg ); + SetCapture( hWnd ); + return 0; + + case WM_LBUTTONUP: + WINE_TRACE("WM_LBUTTONUP\n"); + if( wParam & MK_RBUTTON ) + msg = WM_MBUTTONUP; + TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg ); + ReleaseCapture(); + return 0; + + case WM_RBUTTONDOWN: + WINE_TRACE("WM_RBUTTONDOWN\n"); + if( wParam & MK_LBUTTON ) { + board.press.x = 0; + board.press.y = 0; + msg = WM_MBUTTONDOWN; + } + TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg ); + return 0; + + case WM_RBUTTONUP: + WINE_TRACE("WM_RBUTTONUP\n"); + if( wParam & MK_LBUTTON ) + msg = WM_MBUTTONUP; + TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg ); + return 0; + + case WM_MBUTTONDOWN: + WINE_TRACE("WM_MBUTTONDOWN\n"); + TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg ); + return 0; + + case WM_MBUTTONUP: + WINE_TRACE("WM_MBUTTONUP\n"); + TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg ); + return 0; + + case WM_MOUSEMOVE: + { + if( ( wParam & MK_MBUTTON ) || + ( ( wParam & MK_LBUTTON ) && ( wParam & MK_RBUTTON ) ) ) { + msg = WM_MBUTTONDOWN; + } + else if( wParam & MK_LBUTTON ) { + msg = WM_LBUTTONDOWN; + } + else { + return 0; + } + + TestBoard( hWnd, &board, (short)LOWORD(lParam), (short)HIWORD(lParam), msg ); + + return 0; + } + + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDM_NEW: + CreateBoard( &board ); + return 0; + + case IDM_MARKQ: + hMenu = GetMenu( hWnd ); + board.IsMarkQ = !board.IsMarkQ; + if( board.IsMarkQ ) + CheckMenuItem( hMenu, IDM_MARKQ, MF_CHECKED ); + else + CheckMenuItem( hMenu, IDM_MARKQ, MF_UNCHECKED ); + return 0; + + case IDM_BEGINNER: + SetDifficulty( &board, BEGINNER ); + CreateBoard( &board ); + return 0; + + case IDM_ADVANCED: + SetDifficulty( &board, ADVANCED ); + CreateBoard( &board ); + return 0; + + case IDM_EXPERT: + SetDifficulty( &board, EXPERT ); + CreateBoard( &board ); + return 0; + + case IDM_CUSTOM: + SetDifficulty( &board, CUSTOM ); + CreateBoard( &board ); + return 0; + + case IDM_EXIT: + SendMessage( hWnd, WM_CLOSE, 0, 0); + return 0; + + case IDM_TIMES: + DialogBoxParam( board.hInst, "DLG_TIMES", hWnd, + TimesDlgProc, (LPARAM) &board); + return 0; + + case IDM_ABOUT: + { + WCHAR appname[256], other[256]; + LoadStringW( board.hInst, IDS_APPNAME, appname, sizeof(appname)/sizeof(WCHAR) ); + LoadStringW( board.hInst, IDS_ABOUT, other, sizeof(other)/sizeof(WCHAR) ); + ShellAboutW( hWnd, appname, other, + LoadImageA( board.hInst, "WINEMINE", IMAGE_ICON, 48, 48, LR_SHARED )); + return 0; + } + default: + WINE_TRACE("Unknown WM_COMMAND command message received\n"); + break; + } + } + return( DefWindowProc( hWnd, msg, wParam, lParam )); +} + +int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmdshow ) +{ + MSG msg; + WNDCLASSEX wc; + HWND hWnd; + HACCEL haccel; + char appname[20]; + + LoadString( hInst, IDS_APPNAME, appname, sizeof(appname)); + + wc.cbSize = sizeof(wc); + wc.style = 0; + wc.lpfnWndProc = MainProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInst; + wc.hIcon = LoadIcon( hInst, "WINEMINE" ); + wc.hCursor = LoadCursor( 0, IDI_APPLICATION ); + wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); //MOD for ROS + wc.lpszMenuName = "MENU_WINEMINE"; + wc.lpszClassName = appname; + wc.hIconSm = LoadImage( hInst, "WINEMINE", IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED ); + + if (!RegisterClassEx(&wc)) ExitProcess(1); + hWnd = CreateWindow( appname, appname, + wnd_style, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + 0, 0, hInst, NULL ); + + if (!hWnd) ExitProcess(1); + + ShowWindow( hWnd, cmdshow ); + UpdateWindow( hWnd ); + + haccel = LoadAccelerators( hInst, MAKEINTRESOURCE(IDA_WINEMINE) ); + SetTimer( hWnd, ID_TIMER, 1000, NULL ); + + while( GetMessage(&msg, 0, 0, 0) ) { + if (!TranslateAccelerator( hWnd, haccel, &msg )) + TranslateMessage( &msg ); + + DispatchMessage( &msg ); + } + return msg.wParam; +} diff --git a/base/applications/games/winmine/main.h b/base/applications/games/winmine/main.h new file mode 100644 index 00000000000..396f19e0eb7 --- /dev/null +++ b/base/applications/games/winmine/main.h @@ -0,0 +1,132 @@ +/* + * Copyright 2000 Joshua Thielen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#define BEGINNER_MINES 10 +#define BEGINNER_COLS 9 +#define BEGINNER_ROWS 9 + +#define ADVANCED_MINES 40 +#define ADVANCED_COLS 16 +#define ADVANCED_ROWS 16 + +#define EXPERT_MINES 99 +#define EXPERT_COLS 30 +#define EXPERT_ROWS 16 + +#define MAX_COLS 30 +#define MAX_ROWS 24 + +#define BOTTOM_MARGIN 20 +#define BOARD_WMARGIN 5 +#define BOARD_HMARGIN 5 + +/* mine defines */ +#define MINE_WIDTH 16 +#define MINE_HEIGHT 16 +#define LED_WIDTH 12 +#define LED_HEIGHT 23 +#define FACE_WIDTH 24 +#define FACE_HEIGHT 24 + +#define MAX_PLAYER_NAME_SIZE 31 + +typedef enum { SPRESS_BMP, COOL_BMP, DEAD_BMP, OOH_BMP, SMILE_BMP } FACE_BMP; + +typedef enum { WAITING, PLAYING, GAMEOVER, WON } GAME_STATUS; + +typedef enum { + MPRESS_BMP, ONE_BMP, TWO_BMP, THREE_BMP, FOUR_BMP, FIVE_BMP, SIX_BMP, + SEVEN_BMP, EIGHT_BMP, BOX_BMP, FLAG_BMP, QUESTION_BMP, EXPLODE_BMP, + WRONG_BMP, MINE_BMP, QPRESS_BMP +} MINEBMP_OFFSET; + +typedef enum { BEGINNER, ADVANCED, EXPERT, CUSTOM } DIFFICULTY; + +typedef struct tagBOARD +{ + BOOL IsMarkQ; + HDC hdc; + HINSTANCE hInst; + HWND hWnd; + HBITMAP hMinesBMP; + HBITMAP hFacesBMP; + HBITMAP hLedsBMP; + RECT mines_rect; + RECT face_rect; + RECT timer_rect; + RECT counter_rect; + + unsigned width; + unsigned height; + POINT pos; + + unsigned time; + unsigned num_flags; + unsigned boxes_left; + unsigned num_mines; + + /* difficulty info */ + unsigned rows; + unsigned cols; + unsigned mines; + char best_name [3][MAX_PLAYER_NAME_SIZE+1]; + DWORD best_time [3]; + DIFFICULTY difficulty; + + POINT press; + + /* defines for mb */ +#define MB_NONE 0 +#define MB_LEFTDOWN 1 +#define MB_LEFTUP 2 +#define MB_RIGHTDOWN 3 +#define MB_RIGHTUP 4 +#define MB_BOTHDOWN 5 +#define MB_BOTHUP 6 + unsigned mb; + + FACE_BMP face_bmp; + GAME_STATUS status; + struct BOX_STRUCT + { + unsigned IsMine : 1; + unsigned IsPressed : 1; + unsigned FlagType : 2; + unsigned NumMines : 4; + } box [MAX_COLS + 2] [MAX_ROWS + 2]; + + /* defines for FlagType */ +#define NORMAL 0 +#define QUESTION 1 +#define FLAG 2 +#define COMPLETE 3 + +} BOARD; + +void CheckLevel( BOARD *p_board ); + +INT_PTR CALLBACK CustomDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); + +INT_PTR CALLBACK CongratsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); + +INT_PTR CALLBACK TimesDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + +/* end of header */ diff --git a/base/applications/games/winemine/rc/faces.bmp b/base/applications/games/winmine/rc/faces.bmp similarity index 100% rename from base/applications/games/winemine/rc/faces.bmp rename to base/applications/games/winmine/rc/faces.bmp diff --git a/base/applications/games/winemine/rc/leds.bmp b/base/applications/games/winmine/rc/leds.bmp similarity index 100% rename from base/applications/games/winemine/rc/leds.bmp rename to base/applications/games/winmine/rc/leds.bmp diff --git a/base/applications/games/winemine/rc/mines.bmp b/base/applications/games/winmine/rc/mines.bmp similarity index 100% rename from base/applications/games/winemine/rc/mines.bmp rename to base/applications/games/winmine/rc/mines.bmp diff --git a/base/applications/games/winemine/rc/winemine.ico b/base/applications/games/winmine/rc/winemine.ico similarity index 100% rename from base/applications/games/winemine/rc/winemine.ico rename to base/applications/games/winmine/rc/winemine.ico diff --git a/base/applications/games/winemine/resource.h b/base/applications/games/winmine/resource.h similarity index 73% rename from base/applications/games/winemine/resource.h rename to base/applications/games/winmine/resource.h index 651678884a6..c3272a29d7d 100644 --- a/base/applications/games/winemine/resource.h +++ b/base/applications/games/winmine/resource.h @@ -1,7 +1,7 @@ /* * WineMine (resource.h) * - * Copyright 2000 Joshua Thielen + * Copyright 2000 Joshua Thielen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -15,14 +15,15 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include +#include -#define IDNONE -1 +#define ID_TIMER 1000 /* menu defines */ -#define IDM_WINEMINE 1000 #define IDM_NEW 1001 #define IDM_EXIT 1002 #define IDM_TIMES 1003 @@ -46,19 +47,8 @@ #define IDC_EDITROWS 1032 #define IDC_EDITMINES 1033 -#define IDS_SECONDS 1101 +#define IDS_APPNAME 1101 #define IDS_NOBODY 1102 #define IDS_ABOUT 1103 -#define IDI_WINEMINE 1201 -#define IDA_WINEMINE 1202 - -#define IDB_FACES 1301 -#define IDB_LEDS 1302 -#define IDB_MINES 1303 - -#define IDRESET 1401 - -#define IDD_CONGRATS 1501 -#define IDD_TIMES 1502 -#define IDD_CUSTOM 1503 +#define IDA_WINEMINE 1201 diff --git a/base/applications/games/winmine/rsrc.rc b/base/applications/games/winmine/rsrc.rc new file mode 100644 index 00000000000..ecdaa8ed17e --- /dev/null +++ b/base/applications/games/winmine/rsrc.rc @@ -0,0 +1,68 @@ +/* + * WineMine (rsrc.rc) + * + * Copyright 2000 Joshua Thielen + * Copyright 2003 Marcelo Duarte + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resource.h" + +LANGUAGE LANG_NEUTRAL,SUBLANG_NEUTRAL + +IDA_WINEMINE ACCELERATORS +{ + VK_F2, IDM_NEW, VIRTKEY, NOINVERT + "X", IDM_EXIT, VIRTKEY, ALT, NOINVERT +} + +/* @makedep: winemine.ico */ +WINEMINE ICON rc/winemine.ico + +/* @makedep: faces.bmp */ +FACES BITMAP rc/faces.bmp + +/* @makedep: leds.bmp */ +LEDS BITMAP rc/leds.bmp + +/* @makedep: mines.bmp */ +MINES BITMAP rc/mines.bmp + +/* include localised resources */ +#include "lang/cs-CZ.rc" +#include "lang/da-DK.rc" +#include "lang/en-US.rc" +#include "lang/es-ES.rc" +#include "lang/fi-FI.rc" +#include "lang/ko-KR.rc" +#include "lang/nl-NL.rc" +#include "lang/no-NO.rc" +#include "lang/pl-PL.rc" +#include "lang/tr-TR.rc" + +/* UTF-8 */ +#include "lang/de-DE.rc" +#include "lang/fr-FR.rc" +#include "lang/it-IT.rc" +#include "lang/ja-JP.rc" +#include "lang/lt-LT.rc" +#include "lang/pt-PT.rc" +#include "lang/ro-RO.rc" +#include "lang/ru-RU.rc" +#include "lang/sl-SI.rc" +#include "lang/sv-SE.rc" +#include "lang/uk-UA.rc" +#include "lang/zh-CN.rc" diff --git a/base/applications/games/winmine/winmine.rbuild b/base/applications/games/winmine/winmine.rbuild new file mode 100644 index 00000000000..97abb45666d --- /dev/null +++ b/base/applications/games/winmine/winmine.rbuild @@ -0,0 +1,13 @@ + + + + . + wine + gdi32 + user32 + advapi32 + shell32 + main.c + dialog.c + rsrc.rc + diff --git a/base/applications/notepad/dialog.c b/base/applications/notepad/dialog.c index d8c6adc04e6..3bc53ac9383 100644 --- a/base/applications/notepad/dialog.c +++ b/base/applications/notepad/dialog.c @@ -687,53 +687,177 @@ VOID DIALOG_EditTimeDate(VOID) SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)szDate); } -VOID DIALOG_EditWrap(VOID) +VOID DoCreateStatusBar(VOID) { - static const TCHAR edit[] = _T("edit"); - DWORD dwStyle; - RECT rc, rcstatus; - DWORD size; + RECT rc; + RECT rcstatus; + BOOL bStatusBarVisible; + + // Check if status bar object already exists. + if (Globals.hStatusBar == NULL) + { + // Try to create the status bar + Globals.hStatusBar = CreateStatusWindow( + WS_CHILD | WS_VISIBLE | WS_EX_STATICEDGE, + NULL, + Globals.hMainWnd, + CMD_STATUSBAR_WND_ID); + + if (Globals.hStatusBar == NULL) + { + ShowLastError(); + return; + } + + // Load the string for formatting column/row text output + LoadString(Globals.hInstance, STRING_LINE_COLUMN, Globals.szStatusBarLineCol, MAX_PATH-1); + + // Set the status bar for single-text output + SendMessage(Globals.hStatusBar, SB_SIMPLE, (WPARAM)TRUE, (LPARAM)0); + } + + // Set status bar visible or not accordind the the settings. + if (Globals.bWrapLongLines == TRUE || + Globals.bShowStatusBar == FALSE) + { + bStatusBarVisible = FALSE; + ShowWindow(Globals.hStatusBar, SW_HIDE); + } + else + { + bStatusBarVisible = TRUE; + ShowWindow(Globals.hStatusBar, SW_SHOW); + SendMessage(Globals.hStatusBar, WM_SIZE, 0, 0); + } + + // Set check state in show status bar item. + if (Globals.bShowStatusBar == TRUE) + { + CheckMenuItem(Globals.hMenu, CMD_STATUSBAR, MF_BYCOMMAND | MF_CHECKED); + } + else + { + CheckMenuItem(Globals.hMenu, CMD_STATUSBAR, MF_BYCOMMAND | MF_UNCHECKED); + } + + // Update menu mar with the previous changes + DrawMenuBar(Globals.hMainWnd); + + // Sefety test is edit control exists + if (Globals.hEdit != NULL) + { + // Retrieve the sizes of the controls + GetClientRect(Globals.hMainWnd, &rc); + GetClientRect(Globals.hStatusBar, &rcstatus); + + // If status bar is currently visible, update dimensions of edir control + if (bStatusBarVisible) + rc.bottom -= (rcstatus.bottom - rcstatus.top); + + // Resize edit control to right size. + MoveWindow(Globals.hEdit, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); + } + + // Update content with current row/column text + DIALOG_StatusBarUpdateCaretPos(); +} + +VOID DoCreateEditWindow(VOID) +{ + DWORD dwStyle; + int iSize; LPTSTR pTemp; - TCHAR buff[MAX_PATH]; - Globals.bWrapLongLines = !Globals.bWrapLongLines; + iSize = 0; - size = GetWindowTextLength(Globals.hEdit) + 1; - pTemp = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); - if (!pTemp) + // If the edit control already exists, try to save its content + if (Globals.hEdit != NULL) + { + // number of chars currently written into the editor. + iSize = GetWindowTextLength(Globals.hEdit); + + if (iSize) + { + // Allocates temporary buffer. + pTemp = HeapAlloc(GetProcessHeap(), 0, (iSize + 1) * sizeof(TCHAR)); + + if (!pTemp) + { + ShowLastError(); + return; + } + + // Recover the text into the control. + GetWindowText(Globals.hEdit, pTemp, iSize + 1); + } + + // Restore original window procedure + SetWindowLongPtr(Globals.hEdit, GWLP_WNDPROC, (LONG_PTR)Globals.EditProc); + + // Destroy the edit control + DestroyWindow(Globals.hEdit); + } + + // Update wrap status into the main menu and recover style flags + if (Globals.bWrapLongLines) + { + dwStyle = EDIT_STYLE_WRAP; + EnableMenuItem(Globals.hMenu, CMD_STATUSBAR, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); + } else { + dwStyle = EDIT_STYLE; + EnableMenuItem(Globals.hMenu, CMD_STATUSBAR, MF_BYCOMMAND | MF_ENABLED); + } + + // Update previous changes + DrawMenuBar(Globals.hMainWnd); + + // Create the new edit control + Globals.hEdit = CreateWindowEx( + WS_EX_CLIENTEDGE, + EDIT_CLASS, + NULL, + dwStyle, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + Globals.hMainWnd, + NULL, + Globals.hInstance, + NULL); + + if (Globals.hEdit == NULL) { ShowLastError(); return; } - GetWindowText(Globals.hEdit, pTemp, size); - DestroyWindow(Globals.hEdit); - GetClientRect(Globals.hMainWnd, &rc); - dwStyle = Globals.bWrapLongLines ? EDIT_STYLE_WRAP : EDIT_STYLE; - EnableMenuItem(GetMenu(Globals.hMainWnd), CMD_STATUSBAR, - MF_BYCOMMAND | (Globals.bWrapLongLines ? MF_DISABLED | MF_GRAYED : MF_ENABLED)); - if ( Globals.hStatusBar ) - { - if ( Globals.bWrapLongLines ) - ShowWindow(Globals.hStatusBar, SW_HIDE); - else if ( Globals.bShowStatusBar ) - { - GetClientRect(Globals.hStatusBar, &rcstatus); - rc.bottom -= (rcstatus.bottom - rcstatus.top); - ShowWindow(Globals.hStatusBar, SW_SHOW); - } - } - Globals.hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, edit, NULL, dwStyle, - 0, 0, rc.right, rc.bottom, Globals.hMainWnd, - NULL, Globals.hInstance, NULL); + SendMessage(Globals.hEdit, WM_SETFONT, (WPARAM)Globals.hFont, FALSE); SendMessage(Globals.hEdit, EM_LIMITTEXT, 0, 0); - SetWindowText(Globals.hEdit, pTemp); - SetFocus(Globals.hEdit); + + // If some text was previously saved, restore it. + if (iSize != 0) + { + SetWindowText(Globals.hEdit, pTemp); + HeapFree(GetProcessHeap(), 0, pTemp); + } + + // Sub-class a new window callback for row/column detection. Globals.EditProc = (WNDPROC) SetWindowLongPtr(Globals.hEdit, GWLP_WNDPROC, (LONG_PTR)EDIT_WndProc); - _stprintf(buff, Globals.szStatusBarLineCol, 1, 1); - SendMessage(Globals.hStatusBar, SB_SETTEXT, SB_SIMPLEID, (LPARAM)buff); - HeapFree(GetProcessHeap(), 0, pTemp); - DrawMenuBar(Globals.hMainWnd); + + // Create/update status bar + DoCreateStatusBar(); + + // Finally shows new edit control and set focus into it. + ShowWindow(Globals.hEdit, SW_SHOW); + SetFocus(Globals.hEdit); +} + +VOID DIALOG_EditWrap(VOID) +{ + Globals.bWrapLongLines = !Globals.bWrapLongLines; + + DoCreateEditWindow(); } VOID DIALOG_SelectFont(VOID) @@ -887,27 +1011,9 @@ VOID DIALOG_StatusBarUpdateCaretPos(VOID) VOID DIALOG_ViewStatusBar(VOID) { - RECT rc; - RECT rcstatus; + Globals.bShowStatusBar = !Globals.bShowStatusBar; - Globals.bShowStatusBar = !Globals.bShowStatusBar; - if ( !Globals.hStatusBar ) - { - Globals.hStatusBar = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_EX_STATICEDGE, TEXT("test"), Globals.hMainWnd, CMD_STATUSBAR_WND_ID ); - LoadString(Globals.hInstance, STRING_LINE_COLUMN, Globals.szStatusBarLineCol, MAX_PATH-1); - SendMessage(Globals.hStatusBar, SB_SIMPLE, (WPARAM)TRUE, (LPARAM)0); - } - CheckMenuItem(GetMenu(Globals.hMainWnd), CMD_STATUSBAR, - MF_BYCOMMAND | (Globals.bShowStatusBar ? MF_CHECKED : MF_UNCHECKED)); - DrawMenuBar(Globals.hMainWnd); - GetClientRect(Globals.hMainWnd, &rc); - GetClientRect(Globals.hStatusBar, &rcstatus); - if ( Globals.bShowStatusBar ) - rc.bottom -= (rcstatus.bottom - rcstatus.top); - - MoveWindow(Globals.hEdit, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); - ShowWindow(Globals.hStatusBar, Globals.bShowStatusBar); - DIALOG_StatusBarUpdateCaretPos(); + DoCreateStatusBar(); } VOID DIALOG_HelpContents(VOID) diff --git a/base/applications/notepad/dialog.h b/base/applications/notepad/dialog.h index b2976cd246b..aa0f6714ee7 100644 --- a/base/applications/notepad/dialog.h +++ b/base/applications/notepad/dialog.h @@ -63,3 +63,5 @@ BOOL FileExists(LPCTSTR szFilename); BOOL HasFileExtension(LPCTSTR szFilename); BOOL DoCloseFile(void); void DoOpenFile(LPCTSTR szFileName); +VOID DoCreateStatusBar(VOID); +VOID DoCreateEditWindow(VOID); diff --git a/base/applications/notepad/main.c b/base/applications/notepad/main.c index 3b10f981b81..36b17bf6de6 100644 --- a/base/applications/notepad/main.c +++ b/base/applications/notepad/main.c @@ -29,9 +29,9 @@ static ATOM aFINDMSGSTRING; VOID NOTEPAD_EnableSearchMenu() { - EnableMenuItem(GetMenu(Globals.hMainWnd), CMD_SEARCH, + EnableMenuItem(Globals.hMenu, CMD_SEARCH, MF_BYCOMMAND | ((GetWindowTextLength(Globals.hEdit) == 0) ? MF_DISABLED | MF_GRAYED : MF_ENABLED)); - EnableMenuItem(GetMenu(Globals.hMainWnd), CMD_SEARCH_NEXT, + EnableMenuItem(Globals.hMenu, CMD_SEARCH_NEXT, MF_BYCOMMAND | ((GetWindowTextLength(Globals.hEdit) == 0) ? MF_DISABLED | MF_GRAYED : MF_ENABLED)); } @@ -334,23 +334,8 @@ static LRESULT WINAPI NOTEPAD_WndProc(HWND hWnd, UINT msg, WPARAM wParam, switch (msg) { case WM_CREATE: - { - static const TCHAR edit[] = _T("edit"); - RECT rc; - GetClientRect(hWnd, &rc); - Globals.hEdit = CreateWindowEx(EDIT_EXSTYLE, edit, NULL, Globals.bWrapLongLines ? EDIT_STYLE_WRAP : EDIT_STYLE, - 0, 0, rc.right, rc.bottom, hWnd, - NULL, Globals.hInstance, NULL); - if (!Globals.hEdit) - return -1; - SendMessage(Globals.hEdit, EM_LIMITTEXT, 0, 0); - if (Globals.hFont) - SendMessage(Globals.hEdit, WM_SETFONT, (WPARAM)Globals.hFont, (LPARAM)TRUE); - - Globals.EditProc = (WNDPROC) SetWindowLongPtr(Globals.hEdit, GWLP_WNDPROC, (LONG_PTR)EDIT_WndProc); - + Globals.hMenu = GetMenu(hWnd); break; - } case WM_COMMAND: if (HIWORD(wParam) == EN_CHANGE || HIWORD(wParam) == EN_HSCROLL || HIWORD(wParam) == EN_VSCROLL) @@ -386,7 +371,8 @@ static LRESULT WINAPI NOTEPAD_WndProc(HWND hWnd, UINT msg, WPARAM wParam, case WM_SIZE: { - if (Globals.bShowStatusBar) + if (Globals.bShowStatusBar == TRUE && + Globals.bWrapLongLines == FALSE) { RECT rcStatusBar; HDWP hdwp; @@ -413,6 +399,12 @@ static LRESULT WINAPI NOTEPAD_WndProc(HWND hWnd, UINT msg, WPARAM wParam, break; } + // The entire client area is covered by edit control and by + // the status bar. So there is no need to erase main background. + // This resolves the horrible fliker effect during windows resizes. + case WM_ERASEBKGND: + return 1; + case WM_SETFOCUS: SetFocus(Globals.hEdit); break; @@ -613,6 +605,8 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE prev, LPTSTR cmdline, int sh ExitProcess(1); } + DoCreateEditWindow(); + NOTEPAD_InitData(); DIALOG_FileNew(); diff --git a/base/applications/notepad/main.h b/base/applications/notepad/main.h index 7b90fb7048b..fdc8c66553b 100644 --- a/base/applications/notepad/main.h +++ b/base/applications/notepad/main.h @@ -23,10 +23,11 @@ #include "notepad_res.h" -#define EDIT_STYLE_WRAP (WS_CHILD | WS_VISIBLE | WS_VSCROLL \ +#define EDIT_STYLE_WRAP (WS_CHILD | WS_VSCROLL \ | ES_AUTOVSCROLL | ES_MULTILINE | ES_NOHIDESEL) #define EDIT_STYLE (EDIT_STYLE_WRAP | WS_HSCROLL | ES_AUTOHSCROLL) -#define EDIT_EXSTYLE (WS_EX_CLIENTEDGE) + +#define EDIT_CLASS _T("EDIT") #define MAX_STRING_LEN 255 @@ -47,6 +48,7 @@ typedef struct HWND hEdit; HWND hStatusBar; HFONT hFont; /* Font used by the edit control */ + HMENU hMenu; LOGFONT lfFont; BOOL bWrapLongLines; BOOL bShowStatusBar; diff --git a/base/applications/paint/globalvar.h b/base/applications/paint/globalvar.h index ed73d4113de..9c884e4fa9a 100644 --- a/base/applications/paint/globalvar.h +++ b/base/applications/paint/globalvar.h @@ -101,3 +101,5 @@ extern HWND hSizeboxRightBottom; extern POINT pointStack[256]; extern short pointSP; +extern POINT *ptStack; +extern int ptSP; diff --git a/base/applications/paint/lang/cs-CZ.rc b/base/applications/paint/lang/cs-CZ.rc index da0e84b5de3..06b3f1b5e6b 100644 --- a/base/applications/paint/lang/cs-CZ.rc +++ b/base/applications/paint/lang/cs-CZ.rc @@ -12,8 +12,8 @@ ID_MENU MENU BEGIN POPUP "&Soubor" BEGIN - MENUITEM "Nov\tCtrl+N", IDM_FILENEW - MENUITEM "Otevt...\tCtrl+O", IDM_FILEOPEN + MENUITEM "&Nov\tCtrl+N", IDM_FILENEW + MENUITEM "&Otevt...\tCtrl+O", IDM_FILEOPEN MENUITEM "Ulo枴t\tCtrl+S", IDM_FILESAVE MENUITEM "Ulo枴t jako...", IDM_FILESAVEAS MENUITEM SEPARATOR @@ -60,7 +60,7 @@ BEGIN MENUITEM "800%", IDM_VIEWZOOM800 END MENUITEM SEPARATOR - MENUITEM "Zobrazit m枳u", IDM_VIEWSHOWGRID + MENUITEM "Zobrazit m枳u\tCtrl+G", IDM_VIEWSHOWGRID MENUITEM "Zobrazit miniaturu", IDM_VIEWSHOWMINIATURE END MENUITEM "Cel obrazovka\tCtrl+F", IDM_VIEWFULLSCREEN diff --git a/base/applications/paint/mouse.c b/base/applications/paint/mouse.c index d46bbe35eaf..0cda1879313 100644 --- a/base/applications/paint/mouse.c +++ b/base/applications/paint/mouse.c @@ -284,6 +284,10 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg) placeSelWin(); ShowWindow(hSelection, SW_SHOW); + /* force refresh of selection contents */ + SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0); + SendMessage(hSelection, WM_MOUSEMOVE, 0, 0); + SendMessage(hSelection, WM_LBUTTONUP, 0, 0); } HeapFree(GetProcessHeap(), 0, ptStack); ptStack = NULL; @@ -310,6 +314,10 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg) placeSelWin(); ShowWindow(hSelection, SW_SHOW); + /* force refresh of selection contents */ + SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0); + SendMessage(hSelection, WM_MOUSEMOVE, 0, 0); + SendMessage(hSelection, WM_LBUTTONUP, 0, 0); } break; case TOOL_RUBBER: diff --git a/base/applications/paint/registry.c b/base/applications/paint/registry.c index 1134a718cb0..392fc08d6de 100644 --- a/base/applications/paint/registry.c +++ b/base/applications/paint/registry.c @@ -14,11 +14,11 @@ /* FUNCTIONS ********************************************************/ void -SetWallpaper(TCHAR * FileName, DWORD dwStyle, DWORD dwTile) //FIXME: The pattern (tiled/stretched) is not set +SetWallpaper(TCHAR * FileName, DWORD dwStyle, DWORD dwTile) //FIXME: Has to be called 2x to apply the pattern (tiled/stretched) too { SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, (PVOID) FileName, SPIF_UPDATEINIFILE); - /*HKEY hDesktop; + HKEY hDesktop; TCHAR szStyle[3], szTile[3]; if ((dwStyle > 2) || (dwTile > 2)) @@ -39,5 +39,5 @@ SetWallpaper(TCHAR * FileName, DWORD dwStyle, DWORD dwTile) //FIXME: The pat _tcslen(szTile) * sizeof(TCHAR)); RegCloseKey(hDesktop); - }*/ + } } diff --git a/base/applications/paint/rsrc.rc b/base/applications/paint/rsrc.rc index a1e776d6720..75db8c8e108 100644 --- a/base/applications/paint/rsrc.rc +++ b/base/applications/paint/rsrc.rc @@ -37,14 +37,3 @@ #include "lang/ru-RU.rc" #include "lang/uk-UA.rc" -// -// SUPPORT FOR WINDOWS XP THEMES: -// THIS WILL MAKE THE PROGRAM USE THE COMMON CONTROLS -// LIBRARY VERSION 6.0 (IF IT IS AVAILABLE) -// -#ifdef _AMD64_ -1 24 "paint.exe.amd64.manifest" -#elif _X86_ -1 24 "paint.exe.manifest" -#endif - diff --git a/base/applications/paint/selection.c b/base/applications/paint/selection.c index 5028f9e66cf..03d7a18f75b 100644 --- a/base/applications/paint/selection.c +++ b/base/applications/paint/selection.c @@ -9,6 +9,8 @@ /* INCLUDES *********************************************************/ #include +#include +#include #include "globalvar.h" #include "drawing.h" #include "history.h" @@ -87,6 +89,7 @@ SelectionWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case WM_MOUSEMOVE: if (moving) { + TCHAR sizeStr[100]; int xDelta; int yDelta; resetToU1(); @@ -147,6 +150,9 @@ SelectionWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) break; } + _stprintf(sizeStr, _T("%d x %d"), rectSel_dest[2], rectSel_dest[3]); + SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr); + if (action != 0) StretchBlt(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2], rectSel_dest[3], hSelDC, 0, 0, GetDIBWidth(hSelBm), GetDIBHeight(hSelBm), SRCCOPY); else @@ -182,6 +188,7 @@ SelectionWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) int h = rectSel_dest[3] * zoom / 1000 + 6; xPos = LOWORD(lParam); yPos = HIWORD(lParam); + SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) NULL); action = identifyCorner(xPos, yPos, w, h); if (action != 0) SetCursor(LoadCursor(NULL, cursors[action])); diff --git a/base/applications/paint/winproc.c b/base/applications/paint/winproc.c index 18bbaa61a67..23e1855824a 100644 --- a/base/applications/paint/winproc.c +++ b/base/applications/paint/winproc.c @@ -151,6 +151,11 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { + case WM_CREATE: + ptStack = NULL; + ptSP = 0; + break; + case WM_DESTROY: PostQuitMessage(0); /* send a WM_QUIT to the message queue */ break; @@ -446,9 +451,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) HDC hdc; GetClientRect(hwndMiniature, (LPRECT) &mclient); hdc = GetDC(hwndMiniature); - BitBlt(hdc, -min(imgXRes * GetScrollPos(hScrollbox, SB_HORZ) / 10000, imgXRes - mclient[2]), - -min(imgYRes * GetScrollPos(hScrollbox, SB_VERT) / 10000, imgYRes - mclient[3]), - imgXRes, imgYRes, hDrawingDC, 0, 0, SRCCOPY); + BitBlt(hdc, 0, 0, imgXRes, imgYRes, hDrawingDC, 0, 0, SRCCOPY); ReleaseDC(hwndMiniature, hdc); } break; @@ -565,6 +568,24 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } break; + case WM_KEYDOWN: + if (wParam == VK_ESCAPE) + { + if (!drawing) + { + /* Deselect */ + if ((activeTool == TOOL_RECTSEL) || (activeTool == TOOL_FREESEL)) + { + startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor); + whilePaintingL(hDrawingDC, 0, 0, fgColor, bgColor); + endPaintingL(hDrawingDC, 0, 0, fgColor, bgColor); + ShowWindow(hSelection, SW_HIDE); + } + } + /* FIXME: also cancel current drawing underway */ + } + break; + case WM_MOUSEMOVE: if (hwnd == hImageArea) { @@ -640,6 +661,8 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) if ((activeTool >= TOOL_TEXT) || (activeTool == TOOL_RECTSEL) || (activeTool == TOOL_FREESEL)) { TCHAR sizeStr[100]; + if ((activeTool >= TOOL_LINE) && (GetAsyncKeyState(VK_SHIFT) < 0)) + yRel = xRel; _stprintf(sizeStr, _T("%d x %d"), xRel, yRel); SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr); } @@ -651,6 +674,8 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) if (activeTool >= TOOL_TEXT) { TCHAR sizeStr[100]; + if ((activeTool >= TOOL_LINE) && (GetAsyncKeyState(VK_SHIFT) < 0)) + yRel = xRel; _stprintf(sizeStr, _T("%d x %d"), xRel, yRel); SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr); } @@ -783,7 +808,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case IDM_EDITDELETESELECTION: { /* remove selection window and already painted content using undo(), - paint Rect for rectangular selections and nothing for freeform selections */ + paint Rect for rectangular selections and Poly for freeform selections */ undo(); if (activeTool == TOOL_RECTSEL) { @@ -791,16 +816,23 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) Rect(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2] + rectSel_dest[0], rectSel_dest[3] + rectSel_dest[1], bgColor, bgColor, 0, TRUE); } + if (activeTool == TOOL_FREESEL) + { + newReversible(); + Poly(hDrawingDC, ptStack, ptSP + 1, 0, 0, 2, 0, FALSE); + } break; } case IDM_EDITSELECTALL: - if (activeTool == TOOL_RECTSEL) - { - startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor); - whilePaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); - endPaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); - } + { + HWND hToolbar = FindWindowEx(hToolBoxContainer, NULL, TOOLBARCLASSNAME, NULL); + SendMessage(hToolbar, TB_CHECKBUTTON, ID_RECTSEL, MAKELONG(TRUE, 0)); + SendMessage(hwnd, WM_COMMAND, ID_RECTSEL, 0); + startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor); + whilePaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); + endPaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor); break; + } case IDM_EDITCOPYTO: if (GetSaveFileName(&ofn) != 0) SaveDIBToFile(hSelBm, ofn.lpstrFile, hDrawingDC, NULL, NULL, fileHPPM, fileVPPM); @@ -829,23 +861,73 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case IDM_IMAGEROTATEMIRROR: switch (mirrorRotateDlg()) { - case 1: - newReversible(); - StretchBlt(hDrawingDC, imgXRes - 1, 0, -imgXRes, imgYRes, hDrawingDC, 0, 0, - imgXRes, imgYRes, SRCCOPY); - SendMessage(hImageArea, WM_PAINT, 0, 0); + case 1: /* flip horizontally */ + if (IsWindowVisible(hSelection)) + { + SelectObject(hSelDC, hSelMask); + StretchBlt(hSelDC, rectSel_dest[2] - 1, 0, -rectSel_dest[2], rectSel_dest[3], hSelDC, + 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY); + SelectObject(hSelDC, hSelBm); + StretchBlt(hSelDC, rectSel_dest[2] - 1, 0, -rectSel_dest[2], rectSel_dest[3], hSelDC, + 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY); + /* force refresh of selection contents, used also in case 2 and case 4 */ + SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0); + SendMessage(hSelection, WM_MOUSEMOVE, 0, 0); + SendMessage(hSelection, WM_LBUTTONUP, 0, 0); + } + else + { + newReversible(); + StretchBlt(hDrawingDC, imgXRes - 1, 0, -imgXRes, imgYRes, hDrawingDC, 0, 0, + imgXRes, imgYRes, SRCCOPY); + SendMessage(hImageArea, WM_PAINT, 0, 0); + } break; - case 2: - newReversible(); - StretchBlt(hDrawingDC, 0, imgYRes - 1, imgXRes, -imgYRes, hDrawingDC, 0, 0, - imgXRes, imgYRes, SRCCOPY); - SendMessage(hImageArea, WM_PAINT, 0, 0); + case 2: /* flip vertically */ + if (IsWindowVisible(hSelection)) + { + SelectObject(hSelDC, hSelMask); + StretchBlt(hSelDC, 0, rectSel_dest[3] - 1, rectSel_dest[2], -rectSel_dest[3], hSelDC, + 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY); + SelectObject(hSelDC, hSelBm); + StretchBlt(hSelDC, 0, rectSel_dest[3] - 1, rectSel_dest[2], -rectSel_dest[3], hSelDC, + 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY); + SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0); + SendMessage(hSelection, WM_MOUSEMOVE, 0, 0); + SendMessage(hSelection, WM_LBUTTONUP, 0, 0); + } + else + { + newReversible(); + StretchBlt(hDrawingDC, 0, imgYRes - 1, imgXRes, -imgYRes, hDrawingDC, 0, 0, + imgXRes, imgYRes, SRCCOPY); + SendMessage(hImageArea, WM_PAINT, 0, 0); + } break; - case 4: - newReversible(); - StretchBlt(hDrawingDC, imgXRes - 1, imgYRes - 1, -imgXRes, -imgYRes, hDrawingDC, - 0, 0, imgXRes, imgYRes, SRCCOPY); - SendMessage(hImageArea, WM_PAINT, 0, 0); + case 3: /* rotate 90 degrees */ + break; + case 4: /* rotate 180 degrees */ + if (IsWindowVisible(hSelection)) + { + SelectObject(hSelDC, hSelMask); + StretchBlt(hSelDC, rectSel_dest[2] - 1, rectSel_dest[3] - 1, -rectSel_dest[2], -rectSel_dest[3], hSelDC, + 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY); + SelectObject(hSelDC, hSelBm); + StretchBlt(hSelDC, rectSel_dest[2] - 1, rectSel_dest[3] - 1, -rectSel_dest[2], -rectSel_dest[3], hSelDC, + 0, 0, rectSel_dest[2], rectSel_dest[3], SRCCOPY); + SendMessage(hSelection, WM_LBUTTONDOWN, 0, 0); + SendMessage(hSelection, WM_MOUSEMOVE, 0, 0); + SendMessage(hSelection, WM_LBUTTONUP, 0, 0); + } + else + { + newReversible(); + StretchBlt(hDrawingDC, imgXRes - 1, imgYRes - 1, -imgXRes, -imgYRes, hDrawingDC, + 0, 0, imgXRes, imgYRes, SRCCOPY); + SendMessage(hImageArea, WM_PAINT, 0, 0); + } + break; + case 5: /* rotate 270 degrees */ break; } break; @@ -895,6 +977,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case IDM_VIEWSHOWGRID: showGrid = !showGrid; + SendMessage(hImageArea, WM_PAINT, 0, 0); break; case IDM_VIEWSHOWMINIATURE: showMiniature = !showMiniature; diff --git a/base/applications/rapps/lang/it-IT.rc b/base/applications/rapps/lang/it-IT.rc index 35366716d7d..adfb35a1381 100644 --- a/base/applications/rapps/lang/it-IT.rc +++ b/base/applications/rapps/lang/it-IT.rc @@ -159,7 +159,7 @@ BEGIN IDS_CAT_ENGINEER "Scienze" IDS_CAT_FINANCE "Finanza" IDS_CAT_GAMES "Giochi e divertimento" - IDS_CAT_GRAPHICS "Graphica" + IDS_CAT_GRAPHICS "Grafica" IDS_CAT_INTERNET "Internet & rete" IDS_CAT_LIBS "Librerie" IDS_CAT_OFFICE "Ufficio" @@ -171,7 +171,7 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_APPTITLE "ReactOS Applications Manager" + IDS_APPTITLE "ReactOS Gestione applicazioni" IDS_SEARCH_TEXT "Cerca..." IDS_INSTALL "Installa" IDS_UNINSTALL "Disinstalla" diff --git a/base/applications/rapps/lang/sk-SK.rc b/base/applications/rapps/lang/sk-SK.rc index 5a8f7b18583..0a5bdebe25a 100644 --- a/base/applications/rapps/lang/sk-SK.rc +++ b/base/applications/rapps/lang/sk-SK.rc @@ -1,6 +1,6 @@ /* TRANSLATOR : M疵io Ka鑪疵 /Mario Kacmar/ aka Kario (kario@szm.sk) * DATE OF TR.: 29-08-2009 - * LAST CHANGE: 05-10-2009 + * LAST CHANGE: 26-07-2010 */ LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT @@ -143,7 +143,7 @@ BEGIN IDS_INFO_INSTALLSRC "\nInstall Source: " IDS_INFO_UNINSTALLSTR "\nUninstall String: " IDS_INFO_MODIFYPATH "\nModify Path: " - IDS_INFO_INSTALLDATE "\nInstall Date: " + IDS_INFO_INSTALLDATE "\nD疸um in嗾al當ie: " END STRINGTABLE DISCARDABLE @@ -193,6 +193,6 @@ BEGIN IDS_CHOOSE_FOLDER_ERROR "Zvolili ste si neexistujci prie鑛nok!" IDS_USER_NOT_ADMIN "Mali by ste by administr疸or pre spustenie ""Mana樣ra aplik當i syst駑u ReactOS""!" IDS_APP_REG_REMOVE "Naozaj chcete vymaza daje o nain嗾alovanom programe z registrov?" - IDS_INFORMATION "Information" - IDS_UNABLE_TO_REMOVE "Unable to remove data on the program from the registry!" + IDS_INFORMATION "Inform當ie" + IDS_UNABLE_TO_REMOVE "Nie je mo柤 odstr疣i z registrov daje o programe!" END diff --git a/base/applications/rapps/rapps/7zip.txt b/base/applications/rapps/rapps/7zip.txt index 5f52e2a78f0..93cdb8ad47e 100644 --- a/base/applications/rapps/rapps/7zip.txt +++ b/base/applications/rapps/rapps/7zip.txt @@ -8,7 +8,7 @@ Description = Utility to create and open 7zip, zip, tar, rar and other archive f Size = 0.9M Category = 12 URLSite = http://www.7-zip.org/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/sevenzip/7z465.exe +URLDownload = http://ovh.dl.sourceforge.net/project/sevenzip/7-Zip/4.65/7z465.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/ac97forvirtualbox.txt b/base/applications/rapps/rapps/ac97forvirtualbox.txt index 11119265a48..3f76d084dd9 100644 --- a/base/applications/rapps/rapps/ac97forvirtualbox.txt +++ b/base/applications/rapps/rapps/ac97forvirtualbox.txt @@ -32,11 +32,11 @@ URLSite = Nieznana [Section.0419] Name = ミ飯ミーミケミイミオム AC97 ミエミサム VirtualBox Licence = ミ斷オ ムσコミーミキミーミスミセ -Description = ミミーミキミームムミクミイミクムムσケムひオ ムミセミエミオムミカミクミシミセミオ ミイ ミソミーミソミコム "ReactOS", ミキミームひオミシ ミエミイミーミカミエム ミソミオムミオミキミーミウムムσキミクムひオ ムミクムムひオミシム. +Description = Pミーミキミームムミクミイミクムムσケムひオ ムミセミエミオムミカミクミシミセミオ ミイ ミソミーミソミコム "ReactOS", ミキミームひオミシ ミエミイミーミカミエム ミソミオムミオミキミーミウムムσキミクムひオ ムミクムムひオミシム. URLSite = ミ斷オ ムσコミーミキミーミスミセ [Section.0422] Name = ミ飯ミーミケミイミオム AC97 ミエミサム VirtualBox Licence = ミ斷オミイム孟エミセミシミー -Description = ミミセミキミームムム孟イムσケムひオ ミイミシム毛ム ミイ ムひオミコム "ReactOS" ミソム毛ミサム ムミセミウミセ ミエミイム毛ム ミソミオムミオミキミーミイミーミスムひーミカムひオ ムミクムムひオミシム. +Description = Pミセミキミームムム孟イムσケムひオ ミイミシム毛ム ミイ ムひオミコム "ReactOS" ミソム毛ミサム ムミセミウミセ ミエミイム毛ム ミソミオムミオミキミーミイミーミスムひーミカムひオ ムミクムムひオミシム. URLSite = ミ斷オ ミイミコミーミキミーミスミセ diff --git a/base/applications/rapps/rapps/diablo2.txt b/base/applications/rapps/rapps/diablo2.txt index 09677af388a..df11f7be0a5 100644 --- a/base/applications/rapps/rapps/diablo2.txt +++ b/base/applications/rapps/rapps/diablo2.txt @@ -8,7 +8,7 @@ Description = Diablo 2 Shareware. zeckensack's glide wrapper is required to run Size = 132MB Category = 4 URLSite = http://www.blizzard.com/diablo2/ -URLDownload = http://ftp.freenet.de/pub/filepilot/windows/spiele/diabloiidemo.exe +URLDownload = http://pub.zoneofgames.ru/demos/diabloiidemo.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/dosbox.txt b/base/applications/rapps/rapps/dosbox.txt index 9c19faa6b25..4d437c7c6ba 100644 --- a/base/applications/rapps/rapps/dosbox.txt +++ b/base/applications/rapps/rapps/dosbox.txt @@ -8,7 +8,7 @@ Description = DOSBox is a DOS emulator. Size = 1.4MB Category = 15 URLSite = http://www.dosbox.com/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/dosbox/DOSBox0.74-win32-installer.exe +URLDownload = http://ovh.dl.sourceforge.net/project/dosbox/dosbox/0.74/DOSBox0.74-win32-installer.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/firefox36.txt b/base/applications/rapps/rapps/firefox36.txt index 52168fc91b8..cff4b21274c 100644 --- a/base/applications/rapps/rapps/firefox36.txt +++ b/base/applications/rapps/rapps/firefox36.txt @@ -2,47 +2,47 @@ [Section] Name = Mozilla Firefox 3.6 -Version = 3.6.7 +Version = 3.6.10 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Web Browsers out there. -Size = 8.2M +Size = 8.1M Category = 5 URLSite = http://www.mozilla.com/en-US/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/en-US/Firefox%20Setup%203.6.7.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/en-US/Firefox%20Setup%203.6.10.exe CDPath = none [Section.0407] Description = Der populテ、rste und einer der besten freien Webbrowser. Size = 8.0M URLSite = http://www.mozilla-europe.org/de/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/de/Firefox%20Setup%203.6.7.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/de/Firefox%20Setup%203.6.10.exe [Section.040a] Description = El mテ。s popular y uno de los mejores navegadores web gratuitos que hay. Size = 8.0M URLSite = http://www.mozilla-europe.org/es/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/es-ES/Firefox%20Setup%203.6.7.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/es-ES/Firefox%20Setup%203.6.10.exe [Section.0414] Description = Mest populテヲre og best ogsテ・ gratis nettleserene der ute. Size = 8.0M URLSite = http://www.mozilla-europe.org/no/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/nb-NO/Firefox%20Setup%203.6.7.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/nb-NO/Firefox%20Setup%203.6.10.exe [Section.0415] Description = Najpopularniejsza i jedna z najlepszych darmowych przeglトdarek internetowych. -Size = 8.9M +Size = 8.8M URLSite = http://www.mozilla-europe.org/pl/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/pl/Firefox%20Setup%203.6.7.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/pl/Firefox%20Setup%203.6.10.exe [Section.0419] Description = ミ榧エミクミス ミクミキ ムミーミシム錦 ミソミセミソムσサム肖ミスム錦 ミク ミサムτム威クム ミアミオムミソミサミームひスム錦 ミアムミームσキミオムミセミイ. Size = 8.4M URLSite = http://www.mozilla-europe.org/ru/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/ru/Firefox%20Setup%203.6.7.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/ru/Firefox%20Setup%203.6.10.exe [Section.0422] Description = ミ斷ーミケミソミセミソムσサム肖ミスム毛威クミケ ムひー ミセミエミクミス ミキ ミコムミーム禍クム ミアミオミキミソミサミームひスミクム ミイミオミア-ミアムミームσキミオムム孟イ. Size = 8.4M URLSite = http://www.mozilla-europe.org/uk/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.7/win32/uk/Firefox%20Setup%203.6.7.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.6.10/win32/uk/Firefox%20Setup%203.6.10.exe diff --git a/base/applications/rapps/rapps/freebasic.txt b/base/applications/rapps/rapps/freebasic.txt index 0463d68f427..97759aa8a41 100644 --- a/base/applications/rapps/rapps/freebasic.txt +++ b/base/applications/rapps/rapps/freebasic.txt @@ -2,13 +2,13 @@ [Section] Name = FreeBASIC -Version = 0.20.0b +Version = 0.21.1 Licence = GPL/LGPL Description = Open Source BASIC Compiler. The BASIC syntax is compatible to QBASIC. -Size = 5.5MB +Size = 5.9MB Category = 7 URLSite = http://www.freebasic.net/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/fbc/FreeBASIC-v0.20.0b-win32.exe +URLDownload = http://freefr.dl.sourceforge.net/project/fbc/Binaries%20-%20Windows/FreeBASIC%200.21.1/FreeBASIC-0.21.1-win32.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/go-oo.txt b/base/applications/rapps/rapps/go-oo.txt new file mode 100644 index 00000000000..e32599ed605 --- /dev/null +++ b/base/applications/rapps/rapps/go-oo.txt @@ -0,0 +1,24 @@ +サソ; UTF-8 + +[Section] +Name = Go-OO +Version = 3.2.1-11 +Licence = LGPL +Description = Open Source Office Suite, based on Open Office, but way better. +Size = 181.0MB +Category = 6 +URLSite = http://www.go-oo.org/ +URLDownload = http://go-oo.mirrorbrain.org/stable/win32/3.2.1/GoOo-3.2.1-11.exe +CDPath = none + +[Section.0407] +Description = Open Source Office Suite, basierend auf Open Office, aber viel besser. + +[Section.040a] +Description = La suite de ofimテ。tica de cテウdigo abierto. + +[Section.0415] +Description = Otwarty pakiet biurowy. + +[Section.0422] +Description = ミ柘孟エミコムミクムひクミケ ミセムム毛ミスミクミケ ミソミーミコミオム. diff --git a/base/applications/rapps/rapps/lbreakout2.txt b/base/applications/rapps/rapps/lbreakout2.txt index 1efbc13796d..98c3262265d 100644 --- a/base/applications/rapps/rapps/lbreakout2.txt +++ b/base/applications/rapps/rapps/lbreakout2.txt @@ -8,7 +8,7 @@ Description = Breakout Clone using SDL libs. Size = 3.1MB Category = 4 URLSite = http://lgames.sourceforge.net/index.php?project=LBreakout2 -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/lgames/lbreakout2-2.4.1-win32.exe +URLDownload = http://ovh.dl.sourceforge.net/project/lgames/binaries/lbreakout2-2.4.1-win32.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/lgeneral.txt b/base/applications/rapps/rapps/lgeneral.txt index 905fb5e0039..0fe80aa68eb 100644 --- a/base/applications/rapps/rapps/lgeneral.txt +++ b/base/applications/rapps/rapps/lgeneral.txt @@ -8,7 +8,7 @@ Description = Panzer General Clone using SDL libs. Size = 2.0MB Category = 4 URLSite = http://lgames.sourceforge.net/index.php?project=LGeneral -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/lgames/lgeneral-1.1-win32.exe +URLDownload = http://ovh.dl.sourceforge.net/project/lgames/binaries/lgeneral-1.1-win32.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/libreoffice.txt b/base/applications/rapps/rapps/libreoffice.txt new file mode 100644 index 00000000000..8edeb91de0a --- /dev/null +++ b/base/applications/rapps/rapps/libreoffice.txt @@ -0,0 +1,24 @@ +サソ; UTF-8 + +[Section] +Name = LibreOffice +Version = 3.3.0 Beta 1 +Licence = LGPL +Description = Former called OpenOffice. Open Source Office Suite. +Size = 138.0MB +Category = 6 +URLSite = http://www.documentfoundation.org/ +URLDownload = http://download.documentfoundation.org/libreoffice/testing/LO_3.3.0-beta1_Win_x86_install_en-US.exe +CDPath = none + +[Section.0407] +Description = Vorher bekannt als OpenOffice. Open Source Office Suite. + +[Section.040a] +Description = La suite de ofimテ。tica de cテウdigo abierto. + +[Section.0415] +Description = Otwarty pakiet biurowy. + +[Section.0422] +Description = ミ柘孟エミコムミクムひクミケ ミセムム毛ミスミクミケ ミソミーミコミオム. diff --git a/base/applications/rapps/rapps/lmarbles.txt b/base/applications/rapps/rapps/lmarbles.txt index 7bd0b3f9498..025508cc4ad 100644 --- a/base/applications/rapps/rapps/lmarbles.txt +++ b/base/applications/rapps/rapps/lmarbles.txt @@ -8,7 +8,7 @@ Description = Atomix Clone using SDL libs. Size = 1.4MB Category = 4 URLSite = http://lgames.sourceforge.net/index.php?project=LMarbles -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/lgames/lmarbles-1.0.6-win32.exe +URLDownload = http://ovh.dl.sourceforge.net/project/lgames/binaries/lmarbles-1.0.6-win32.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/mingw.txt b/base/applications/rapps/rapps/mingw.txt index b351b9168b3..054a2fb71c3 100644 --- a/base/applications/rapps/rapps/mingw.txt +++ b/base/applications/rapps/rapps/mingw.txt @@ -2,13 +2,13 @@ [Section] Name = MinGW -Version = 5.1.6 +Version = 20100909 Licence = Public domain/GPL Description = A Port of the GNU toolchain with GCC, GDB, GNU make, etc. -Size = 155kb +Size = 568kb Category = 7 URLSite = http://mingw.org/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/mingw/MinGW-5.1.6.exe +URLDownload = http://ovh.dl.sourceforge.net/project/mingw/Automated%20MinGW%20Installer/mingw-get-inst/mingw-get-inst-20100909/mingw-get-inst-20100909.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/mirandaim.txt b/base/applications/rapps/rapps/mirandaim.txt index b387bb9ba2f..5c9fc34a53a 100644 --- a/base/applications/rapps/rapps/mirandaim.txt +++ b/base/applications/rapps/rapps/mirandaim.txt @@ -2,13 +2,13 @@ [Section] Name = Miranda IM -Version = 0.8.27 +Version = 0.9.5 Licence = GPL Description = Open source multiprotocol instant messaging application - May not work completely. -Size = 1.8MB +Size = 2.2MB Category = 5 URLSite = http://www.miranda-im.org/ -URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.27-unicode.exe +URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.9.5-unicode.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/mirc.txt b/base/applications/rapps/rapps/mirc.txt index 16d84e21658..695630a24e0 100644 --- a/base/applications/rapps/rapps/mirc.txt +++ b/base/applications/rapps/rapps/mirc.txt @@ -2,13 +2,13 @@ [Section] Name = mIRC -Version = 6.35 +Version = 7.1 Licence = Shareware Description = The most popular client for the Internet Relay Chat (IRC). -Size = 1.66M +Size = 1.8M Category = 5 URLSite = http://www.mirc.com/ -URLDownload = http://mirc.bigchief.dk/mirc635.exe +URLDownload = http://download.mirc.com/mirc71.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/mpc.txt b/base/applications/rapps/rapps/mpc.txt index 7a86d24c068..cf59628dcc3 100644 --- a/base/applications/rapps/rapps/mpc.txt +++ b/base/applications/rapps/rapps/mpc.txt @@ -2,13 +2,13 @@ [Section] Name = Media Player Classic Home Cinema -Version = 1.3.1249 +Version = 1.4.2499 Licence = GPL Description = A media player. -Size = 3.0MB +Size = 4.9MB Category = 1 URLSite = http://mpc-hc.sourceforge.net/ -URLDownload = http://mesh.dl.sourceforge.net/project/mpc-hc/MPC%20HomeCinema%20-%20Win32/MPC-HC%20v1.3.1249.0_32%20bits/MPC-HomeCinema.1.3.1249.0.%28x86%29.exe +URLDownload = http://freefr.dl.sourceforge.net/project/mpc-hc/MPC%20HomeCinema%20-%20Win32/MPC-HC%20v1.4.2499.0_32%20bits/MPC-HomeCinema.1.4.2499.0.x86.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/openttd.txt b/base/applications/rapps/rapps/openttd.txt index 20b8ec52a02..9f038ffe93f 100644 --- a/base/applications/rapps/rapps/openttd.txt +++ b/base/applications/rapps/rapps/openttd.txt @@ -2,13 +2,13 @@ [Section] Name = OpenTTD -Version = 1.0.2 +Version = 1.0.4 Licence = GPL v2 Description = Open Source clone of the "Transport Tycoon Deluxe" game engine. You need a copy of Transport Tycoon. -Size = 3.5MB +Size = 3.4MB Category = 4 URLSite = http://www.openttd.org/ -URLDownload = http://binaries.openttd.org/releases/1.0.2/openttd-1.0.2-windows-win32.exe +URLDownload = http://cz.binaries.openttd.org/openttd/binaries/releases/1.0.4/openttd-1.0.4-windows-win32.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/opera.txt b/base/applications/rapps/rapps/opera.txt index 0701b776196..6852b4c8492 100644 --- a/base/applications/rapps/rapps/opera.txt +++ b/base/applications/rapps/rapps/opera.txt @@ -2,13 +2,13 @@ [Section] Name = Opera -Version = 10.60 +Version = 10.62 Licence = Freeware Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client. Size = 12.7M Category = 5 URLSite = http://www.opera.com/ -URLDownload = http://get4.opera.com/pub/opera/win/1060/int/Opera_1060_int_Setup.exe +URLDownload = http://get4.opera.com/pub/opera/win/1062/int/Opera_1062_int_Setup.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/python.txt b/base/applications/rapps/rapps/python.txt index dfbb9c2720d..4664d47b104 100644 --- a/base/applications/rapps/rapps/python.txt +++ b/base/applications/rapps/rapps/python.txt @@ -2,13 +2,13 @@ [Section] Name = Python -Version = 2.6.5 +Version = 2.6.6 Licence = GPL/LGPL Description = A remarkably powerful dynamic programming language. -Size = 14MB +Size = 14.5MB Category = 7 URLSite = http://www.python.org/ -URLDownload = http://www.python.org/ftp/python/2.6.5/python-2.6.5.msi +URLDownload = http://www.python.org/ftp/python/2.6.6/python-2.6.6.msi CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/remood.txt b/base/applications/rapps/rapps/remood.txt index 5362c91a50f..7ee5f97ee55 100644 --- a/base/applications/rapps/rapps/remood.txt +++ b/base/applications/rapps/rapps/remood.txt @@ -8,7 +8,7 @@ Description = ReMooD is a source port of Doom Legacy. It aims to provide the cla Size = 1.2M Category = 4 URLSite = http://remood.sourceforge.net/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/remood/remoodsetup-win32_08a.exe +URLDownload = http://ovh.dl.sourceforge.net/project/remood/ReMooD/0.8a/remoodsetup-win32_08a.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/rosbe.txt b/base/applications/rapps/rapps/rosbe.txt index 7f0f5469b9f..f729ed350db 100644 --- a/base/applications/rapps/rapps/rosbe.txt +++ b/base/applications/rapps/rapps/rosbe.txt @@ -8,7 +8,7 @@ Description = Allows you to build the ReactOS Source. For more instructions see Size = 13.8MB Category = 7 URLSite = http://reactos.org/wiki/Build_Environment -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.5.1.1.exe +URLDownload = http://ovh.dl.sourceforge.net/project/reactos/RosBE-Windows/i386/1.5.1/RosBE-1.5.1.1.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/rosbearm.txt b/base/applications/rapps/rapps/rosbearm.txt index aac3ae1e9b4..18eb22b61ff 100644 --- a/base/applications/rapps/rapps/rosbearm.txt +++ b/base/applications/rapps/rapps/rosbearm.txt @@ -8,7 +8,7 @@ Description = Allows you to build the ReactOS ARM Source. For more instructions Size = 11.1MB Category = 7 URLSite = http://reactos.org/wiki/Build_Environment/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-ARM-1.0.exe +URLDownload = http://ovh.dl.sourceforge.net/project/reactos/RosBE-Windows/arm/1.0/RosBE-ARM-1.0.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/scite.txt b/base/applications/rapps/rapps/scite.txt index 9d114556166..6fe68efa4d6 100644 --- a/base/applications/rapps/rapps/scite.txt +++ b/base/applications/rapps/rapps/scite.txt @@ -2,13 +2,13 @@ [Section] Name = SciTE -Version = 2.12 +Version = 2.21 Licence = Freeware Description = SciTE is a SCIntilla based Text Editor. Originally built to demonstrate Scintilla, it has grown to be a generally useful editor with facilities for building and running programs. Size = 0.6M Category = 7 URLSite = http://www.scintilla.org/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc212.exe +URLDownload = http://kent.dl.sourceforge.net/project/scintilla/SciTE/2.21/Sc221.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/seamonkey.txt b/base/applications/rapps/rapps/seamonkey.txt index e73790a437e..3dd172cfb9e 100644 --- a/base/applications/rapps/rapps/seamonkey.txt +++ b/base/applications/rapps/rapps/seamonkey.txt @@ -2,36 +2,31 @@ [Section] Name = Mozilla SeaMonkey -Version = 2.0.6 +Version = 2.0.8 Licence = MPL/GPL/LGPL Description = Mozilla Suite is alive. This is the one and only Browser, Mail, Chat, and Composer bundle you will ever need. Size = 10.1MB Category = 5 URLSite = http://www.seamonkey-project.org/ -URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.6/win32/en-US/SeaMonkey%20Setup%202.0.6.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.8/win32/en-US/SeaMonkey%20Setup%202.0.8.exe CDPath = none [Section.0407] Description = Mozilla Suite lebt. Dies ist das einzige Browser-, Mail-, Chat- and Composerwerkzeug-Bundle welches Sie benテカtigen. Size = 10.0MB -URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.6/win32/de/SeaMonkey%20Setup%202.0.6.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.8/win32/de/SeaMonkey%20Setup%202.0.8.exe [Section.040a] Description = La suite de Mozilla estテ。 viva. Es el primero y テコnico navegador web, gestor de correo, lector de noticias, Chat y editor HTML que necesitarテ。s. Size = 10.0MB -URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.6/win32/es-ES/SeaMonkey%20Setup%202.0.6.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.8/win32/es-ES/SeaMonkey%20Setup%202.0.8.exe [Section.0415] Description = Pakiet Mozilla ナシyje. W zestawie: przeglトdarka, klient poczty, IRC oraz Edytor HTML - wszystko, czego potrzebujesz. Size = 10.8MB -URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.6/win32/pl/SeaMonkey%20Setup%202.0.6.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.8/win32/pl/SeaMonkey%20Setup%202.0.8.exe [Section.0419] Description = ミ湲ミセミエミセミサミカミオミスミクミオ Mozilla Suite. ミ漬コミサム紗ミーミオム ミアムミームσキミオム, ミソミセムムひセミイム巾ケ ミコミサミクミオミスム, IRC-ミコミサミクミオミスム ミク HTML-ムミオミエミーミコムひセム. Size = 10.4MB -URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.6/win32/ru/SeaMonkey%20Setup%202.0.6.exe - -[Section.0422] -Description = Mozilla Suite ミソミセミイミオムミスムσイムム. ミ渙ーミコミオム ミシム毛ムひクムび ミイ ムミセミアム ミアムミームσキミオム, ミソミセム尉ひセミイミクミケ ミコミサム毛頒スム, IRC-ミコミサム毛頒スム ムひー HTML-ムミオミエミーミコムひセム. -Size = 10.4MB -URLDownload = http://mozilla.mirror.ac.za/seamonkey/releases/2.0.6/win32/ru/SeaMonkey%20Setup%202.0.6.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.0.8/win32/ru/SeaMonkey%20Setup%202.0.8.exe diff --git a/base/applications/rapps/rapps/smplayer.txt b/base/applications/rapps/rapps/smplayer.txt index f8039ae57b6..de7520c1519 100644 --- a/base/applications/rapps/rapps/smplayer.txt +++ b/base/applications/rapps/rapps/smplayer.txt @@ -8,7 +8,7 @@ Description = SMPlayer. Size = 14.2MB Category = 1 URLSite = http://smplayer.sourceforge.net/ -URLDownload = http://downloads.sourceforge.net/project/smplayer/SMPlayer/0.6.9/smplayer-0.6.9-win32.exe +URLDownload = http://ovh.dl.sourceforge.net/project/smplayer/SMPlayer/0.6.9/smplayer-0.6.9-win32.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/thunderbird.txt b/base/applications/rapps/rapps/thunderbird.txt index 86fefbf871a..71dce2f44bc 100644 --- a/base/applications/rapps/rapps/thunderbird.txt +++ b/base/applications/rapps/rapps/thunderbird.txt @@ -2,41 +2,41 @@ [Section] Name = Mozilla Thunderbird -Version = 3.1.1 +Version = 3.1.4 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Mail Clients out there. Size = 9.0M Category = 5 URLSite = http://www.mozilla-europe.org/en/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.1/win32/en-US/Thunderbird%20Setup%203.1.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.4/win32/en-US/Thunderbird%20Setup%203.1.4.exe CDPath = none [Section.0407] Description = Der populテ、rste und einer der besten freien Mail-Clients. -Size = 8.9M +Size = 8.8M URLSite = http://www.mozilla-europe.org/de/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.1/win32/de/Thunderbird%20Setup%203.1.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.4/win32/de/Thunderbird%20Setup%203.1.4.exe [Section.040a] Description = El mテ。s popular y uno de los mejores clientes mail que hay. Size = 8.8M URLSite = http://www.mozilla-europe.org/es/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.1/win32/es-ES/Thunderbird%20Setup%203.1.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.4/win32/es-ES/Thunderbird%20Setup%203.1.4.exe [Section.0415] Description = Najpopularniejszy i jeden z najlepszych darmowych klientテウw poczty. Size = 9.7M URLSite = http://www.mozilla-europe.org/pl/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.1/win32/pl/Thunderbird%20Setup%203.1.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.4/win32/pl/Thunderbird%20Setup%203.1.4.exe [Section.0419] Description = ミ榧エミクミス ミクミキ ムミーミシム錦 ミソミセミソムσサム肖ミスム錦 ミク ミサムτム威クム ミアミオムミソミサミームひスム錦 ミソミセムムひセミイム錦 ミコミサミクミオミスムひセミイ. Size = 9.2M URLSite = http://www.mozilla-europe.org/ru/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.1/win32/ru/Thunderbird%20Setup%203.1.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.4/win32/ru/Thunderbird%20Setup%203.1.4.exe [Section.0422] Description = ミ斷ーミケミソミセミソムσサム肖ミスム毛威クミケ ムひー ミセミエミクミス ミキ ミコムミーム禍クム ミソミセム尉ひセミイミクム ミコミサム毛頒スムび孟イ. Size = 9.2M URLSite = http://www.mozillamessaging.com/uk/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.1/win32/uk/Thunderbird%20Setup%203.1.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.4/win32/uk/Thunderbird%20Setup%203.1.4.exe diff --git a/base/applications/rapps/rapps/tuxpaint.txt b/base/applications/rapps/rapps/tuxpaint.txt index 3931d501741..a36cfda4a97 100644 --- a/base/applications/rapps/rapps/tuxpaint.txt +++ b/base/applications/rapps/rapps/tuxpaint.txt @@ -8,7 +8,7 @@ Description = An Open Source bitmap graphics editor geared towards young childre Size = 10MB Category = 3 URLSite = http://tuxpaint.org/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/tuxpaint/tuxpaint-0.9.21-win32-installer.exe +URLDownload = http://ovh.dl.sourceforge.net/project/tuxpaint/tuxpaint/0.9.21/tuxpaint-0.9.21-win32-installer.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/utorrent.txt b/base/applications/rapps/rapps/utorrent.txt index 80a4bd52bb9..cb05f9bd3e0 100644 --- a/base/applications/rapps/rapps/utorrent.txt +++ b/base/applications/rapps/rapps/utorrent.txt @@ -2,13 +2,13 @@ [Section] Name = ツオTorrent -Version = 2.0.3 +Version = 2.0.4 Licence = Freeware for non-commercial uses Description = Small and fast BitTorrent Client. Size = 320K Category = 5 URLSite = http://www.utorrent.com/ -URLDownload = http://download.utorrent.com/2.0.3/utorrent.exe +URLDownload = http://download.utorrent.com/2.0.4/utorrent.exe CDPath = none diff --git a/base/applications/rapps/rapps/vlc.txt b/base/applications/rapps/rapps/vlc.txt index 514f36a601d..8a362fa2428 100644 --- a/base/applications/rapps/rapps/vlc.txt +++ b/base/applications/rapps/rapps/vlc.txt @@ -2,13 +2,13 @@ [Section] Name = VLC media player -Version = 1.1.1 +Version = 1.1.4 Licence = GPL Description = A media player. -Size = 18.6MB +Size = 18.7MB Category = 1 URLSite = http://www.videolan.org/vlc/ -URLDownload = http://ignum.dl.sourceforge.net/project/vlc/1.1.1/win32/vlc-1.1.1-win32.exe +URLDownload = http://ignum.dl.sourceforge.net/project/vlc/1.1.4/win32/vlc-1.1.4-win32.exe CDPath = none [Section.0407] diff --git a/base/applications/regedit/childwnd.c b/base/applications/regedit/childwnd.c index 6f3de0b4910..6675e21d4ec 100644 --- a/base/applications/regedit/childwnd.c +++ b/base/applications/regedit/childwnd.c @@ -227,8 +227,8 @@ static void SuggestKeys(HKEY hRootKey, LPCTSTR pszKeyPath, LPTSTR pszSuggestions bFound = FALSE; /* Check default key */ - if (RegQueryStringValue(hRootKey, pszKeyPath, NULL, - szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])) == ERROR_SUCCESS) + if (QueryStringValue(hRootKey, pszKeyPath, NULL, + szBuffer, COUNT_OF(szBuffer)) == ERROR_SUCCESS) { /* Sanity check this key; it cannot be empty, nor can it be a * loop back */ @@ -259,8 +259,8 @@ static void SuggestKeys(HKEY hRootKey, LPCTSTR pszKeyPath, LPTSTR pszSuggestions /* Check CLSID key */ if (RegOpenKey(hRootKey, pszKeyPath, &hSubKey) == ERROR_SUCCESS) { - if (RegQueryStringValue(hSubKey, TEXT("CLSID"), NULL, - szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])) == ERROR_SUCCESS) + if (QueryStringValue(hSubKey, TEXT("CLSID"), NULL, szBuffer, + COUNT_OF(szBuffer)) == ERROR_SUCCESS) { lstrcpyn(pszSuggestions, TEXT("HKCR\\CLSID\\"), (int) iSuggestionsLength); i = _tcslen(pszSuggestions); @@ -535,8 +535,8 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa } else { - if (RegRenameKey(hRootKey, keyPath, ptvdi->item.pszText) != ERROR_SUCCESS) - lResult = FALSE; + if (RenameKey(hRootKey, keyPath, ptvdi->item.pszText) != ERROR_SUCCESS) + lResult = FALSE; } return lResult; } diff --git a/base/applications/regedit/edit.c b/base/applications/regedit/edit.c index 62117504d15..9812b9bf625 100644 --- a/base/applications/regedit/edit.c +++ b/base/applications/regedit/edit.c @@ -702,6 +702,91 @@ done: return result; } +static LONG CopyKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey) +{ + LONG lResult; + DWORD dwDisposition; + HKEY hDestSubKey = NULL; + HKEY hSrcSubKey = NULL; + DWORD dwIndex, dwType, cbName, cbData; + TCHAR szSubKey[256]; + TCHAR szValueName[256]; + BYTE szValueData[512]; + + FILETIME ft; + + /* open the source subkey, if specified */ + if (lpSrcSubKey) + { + lResult = RegOpenKeyEx(hSrcKey, lpSrcSubKey, 0, KEY_ALL_ACCESS, &hSrcSubKey); + if (lResult) + goto done; + hSrcKey = hSrcSubKey; + } + + /* create the destination subkey */ + lResult = RegCreateKeyEx(hDestKey, lpDestSubKey, 0, NULL, 0, KEY_WRITE, NULL, + &hDestSubKey, &dwDisposition); + if (lResult) + goto done; + + /* copy all subkeys */ + dwIndex = 0; + do + { + cbName = sizeof(szSubKey) / sizeof(szSubKey[0]); + lResult = RegEnumKeyEx(hSrcKey, dwIndex++, szSubKey, &cbName, NULL, NULL, NULL, &ft); + if (lResult == ERROR_SUCCESS) + { + lResult = CopyKey(hDestSubKey, szSubKey, hSrcKey, szSubKey); + if (lResult) + goto done; + } + } + while(lResult == ERROR_SUCCESS); + + /* copy all subvalues */ + dwIndex = 0; + do + { + cbName = sizeof(szValueName) / sizeof(szValueName[0]); + cbData = sizeof(szValueData) / sizeof(szValueData[0]); + lResult = RegEnumValue(hSrcKey, dwIndex++, szValueName, &cbName, NULL, &dwType, szValueData, &cbData); + if (lResult == ERROR_SUCCESS) + { + lResult = RegSetValueEx(hDestSubKey, szValueName, 0, dwType, szValueData, cbData); + if (lResult) + goto done; + } + } + while(lResult == ERROR_SUCCESS); + + lResult = ERROR_SUCCESS; + +done: + if (hSrcSubKey) + RegCloseKey(hSrcSubKey); + if (hDestSubKey) + RegCloseKey(hDestSubKey); + if (lResult != ERROR_SUCCESS) + SHDeleteKey(hDestKey, lpDestSubKey); + return lResult; +} + +static LONG MoveKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey) +{ + LONG lResult; + + if (!lpSrcSubKey) + return ERROR_INVALID_FUNCTION; + + lResult = CopyKey(hDestKey, lpDestSubKey, hSrcKey, lpSrcSubKey); + if (lResult == ERROR_SUCCESS) + SHDeleteKey(hSrcKey, lpSrcSubKey); + + return lResult; +} + BOOL DeleteKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath) { TCHAR msg[128], caption[128]; @@ -732,3 +817,128 @@ done: RegCloseKey(hKey); return result; } + +LONG RenameKey(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpNewName) +{ + LPCTSTR s; + LPTSTR lpNewSubKey = NULL; + LONG Ret = 0; + + if (!lpSubKey) + return Ret; + + s = _tcsrchr(lpSubKey, _T('\\')); + if (s) + { + s++; + lpNewSubKey = (LPTSTR) HeapAlloc(GetProcessHeap(), 0, (s - lpSubKey + _tcslen(lpNewName) + 1) * sizeof(TCHAR)); + if (lpNewSubKey != NULL) + { + memcpy(lpNewSubKey, lpSubKey, (s - lpSubKey) * sizeof(TCHAR)); + lstrcpy(lpNewSubKey + (s - lpSubKey), lpNewName); + lpNewName = lpNewSubKey; + } + else + return ERROR_NOT_ENOUGH_MEMORY; + } + + Ret = MoveKey(hKey, lpNewName, hKey, lpSubKey); + + if (lpNewSubKey) + { + HeapFree(GetProcessHeap(), 0, lpNewSubKey); + } + return Ret; +} + +LONG RenameValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpDestValue, LPCTSTR lpSrcValue) +{ + LONG lResult; + HKEY hSubKey = NULL; + DWORD dwType, cbData; + BYTE data[512]; + + if (lpSubKey) + { + lResult = RegOpenKey(hKey, lpSubKey, &hSubKey); + if (lResult != ERROR_SUCCESS) + goto done; + hKey = hSubKey; + } + + cbData = sizeof(data); + lResult = RegQueryValueEx(hKey, lpSrcValue, NULL, &dwType, data, &cbData); + if (lResult != ERROR_SUCCESS) + goto done; + + lResult = RegSetValueEx(hKey, lpDestValue, 0, dwType, data, cbData); + if (lResult != ERROR_SUCCESS) + goto done; + + RegDeleteValue(hKey, lpSrcValue); + +done: + if (hSubKey) + RegCloseKey(hSubKey); + return lResult; +} + +LONG QueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR pszBuffer, DWORD dwBufferLen) +{ + LONG lResult; + HKEY hSubKey = NULL; + DWORD cbData, dwType; + + if (lpSubKey) + { + lResult = RegOpenKey(hKey, lpSubKey, &hSubKey); + if (lResult != ERROR_SUCCESS) + goto done; + hKey = hSubKey; + } + + cbData = (dwBufferLen - 1) * sizeof(*pszBuffer); + lResult = RegQueryValueEx(hKey, lpValueName, NULL, &dwType, (LPBYTE) pszBuffer, &cbData); + if (lResult != ERROR_SUCCESS) + goto done; + if (dwType != REG_SZ) + { + lResult = -1; + goto done; + } + + pszBuffer[cbData / sizeof(*pszBuffer)] = _T('\0'); + +done: + if (lResult != ERROR_SUCCESS) + pszBuffer[0] = _T('\0'); + if (hSubKey) + RegCloseKey(hSubKey); + return lResult; +} + +BOOL GetKeyName(LPTSTR pszDest, size_t iDestLength, HKEY hRootKey, LPCTSTR lpSubKey) +{ + LPCTSTR pszRootKey; + + if (hRootKey == HKEY_CLASSES_ROOT) + pszRootKey = TEXT("HKEY_CLASSES_ROOT"); + else if (hRootKey == HKEY_CURRENT_USER) + pszRootKey = TEXT("HKEY_CURRENT_USER"); + else if (hRootKey == HKEY_LOCAL_MACHINE) + pszRootKey = TEXT("HKEY_LOCAL_MACHINE"); + else if (hRootKey == HKEY_USERS) + pszRootKey = TEXT("HKEY_USERS"); + else if (hRootKey == HKEY_CURRENT_CONFIG) + pszRootKey = TEXT("HKEY_CURRENT_CONFIG"); + else if (hRootKey == HKEY_DYN_DATA) + pszRootKey = TEXT("HKEY_DYN_DATA"); + else + return FALSE; + + if (lpSubKey[0]) + _sntprintf(pszDest, iDestLength, TEXT("%s\\%s"), pszRootKey, lpSubKey); + else + _sntprintf(pszDest, iDestLength, TEXT("%s"), pszRootKey); + return TRUE; +} diff --git a/base/applications/regedit/find.c b/base/applications/regedit/find.c index e3bb26ee404..5803d25eda4 100644 --- a/base/applications/regedit/find.c +++ b/base/applications/regedit/find.c @@ -19,6 +19,12 @@ #include +#define RSF_WHOLESTRING 0x00000001 +#define RSF_LOOKATKEYS 0x00000002 +#define RSF_LOOKATVALUES 0x00000004 +#define RSF_LOOKATDATA 0x00000008 +#define RSF_MATCHCASE 0x00010000 + static TCHAR s_szFindWhat[256]; static const TCHAR s_szFindFlags[] = _T("FindFlags"); static const TCHAR s_szFindFlagsR[] = _T("FindFlagsReactOS"); @@ -677,7 +683,7 @@ BOOL FindNext(HWND hWnd) if (fSuccess) { - RegKeyGetName(szFullKey, COUNT_OF(szFullKey), hKeyRoot, pszFoundSubKey); + GetKeyName(szFullKey, COUNT_OF(szFullKey), hKeyRoot, pszFoundSubKey); SelectNode(g_pChildWnd->hTreeWnd, szFullKey); SetValueName(g_pChildWnd->hListWnd, pszFoundValueName); free(pszFoundSubKey); diff --git a/base/applications/regedit/framewnd.c b/base/applications/regedit/framewnd.c index a6b4144bcef..4e465e6bb30 100644 --- a/base/applications/regedit/framewnd.c +++ b/base/applications/regedit/framewnd.c @@ -95,7 +95,7 @@ static void OnInitMenu(HWND hWnd) dwIndex = 0; do { - cbValueName = sizeof(szValueName) / sizeof(szValueName[0]); + cbValueName = COUNT_OF(szValueName); cbValueData = sizeof(abValueData); lResult = RegEnumValue(hKey, dwIndex, szValueName, &cbValueName, NULL, &dwType, abValueData, &cbValueData); if ((lResult == ERROR_SUCCESS) && (dwType == REG_SZ)) @@ -278,6 +278,7 @@ static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME* pofn) pofn->lpstrFileTitle = FileTitleBuffer; pofn->nMaxFileTitle = _MAX_PATH; pofn->Flags = OFN_HIDEREADONLY; + pofn->lpstrDefExt = TEXT("reg"); return TRUE; } @@ -285,38 +286,33 @@ static BOOL ImportRegistryFile(HWND hWnd) { OPENFILENAME ofn; TCHAR Caption[128]; + LPCTSTR pszKeyPath; + HKEY hRootKey; InitOpenFileName(hWnd, &ofn); - LoadString(hInst, IDS_IMPORT_REG_FILE, Caption, sizeof(Caption)/sizeof(TCHAR)); + LoadString(hInst, IDS_IMPORT_REG_FILE, Caption, COUNT_OF(Caption)); ofn.lpstrTitle = Caption; + ofn.Flags |= OFN_ENABLESIZING; /* ofn.lCustData = ;*/ if (GetOpenFileName(&ofn)) { - /* FIXME - convert to ascii */ - if (!import_registry_file(ofn.lpstrFile)) { - /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/ + FILE *fp = _wfopen(ofn.lpstrFile, L"r"); + if (fp == NULL || !import_registry_file(fp)) { + LPSTR p = GetMultiByteString(ofn.lpstrFile); + fprintf(stderr, "Can't open file \"%s\"\n", p); + HeapFree(GetProcessHeap(), 0, p); + if (fp != NULL) + fclose(fp); return FALSE; } -#if 0 - get_file_name(&s, filename, MAX_PATH); - if (!filename[0]) { - printf("No file name is specified\n%s", usage); - return FALSE; - /*exit(1);*/ - } - while (filename[0]) { - if (!import_registry_file(filename)) { - perror(""); - printf("Can't open file \"%s\"\n", filename); - return FALSE; - /*exit(1);*/ - } - get_file_name(&s, filename, MAX_PATH); - } -#endif - + fclose(fp); } else { CheckCommDlgError(hWnd); } + + RefreshTreeView(g_pChildWnd->hTreeWnd); + pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey); + RefreshListView(g_pChildWnd->hListWnd, hRootKey, pszKeyPath); + return TRUE; } @@ -384,8 +380,7 @@ BOOL ExportRegistryFile(HWND hWnd) /* Figure out which key path we are exporting */ pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); - RegKeyGetName(ExportKeyPath, sizeof(ExportKeyPath) / sizeof(ExportKeyPath[0]), - hKeyRoot, pszKeyPath); + GetKeyName(ExportKeyPath, COUNT_OF(ExportKeyPath), hKeyRoot, pszKeyPath); InitOpenFileName(hWnd, &ofn); LoadString(hInst, IDS_EXPORT_REG_FILE, Caption, sizeof(Caption)/sizeof(TCHAR)); @@ -396,44 +391,24 @@ BOOL ExportRegistryFile(HWND hWnd) { ofn.lCustData = (LPARAM) ExportKeyPath; } - ofn.Flags = OFN_ENABLETEMPLATE | OFN_EXPLORER | OFN_ENABLEHOOK; + ofn.Flags = OFN_ENABLETEMPLATE | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_OVERWRITEPROMPT; ofn.lpfnHook = ExportRegistryFile_OFNHookProc; ofn.lpTemplateName = MAKEINTRESOURCE(IDD_EXPORTRANGE); if (GetSaveFileName(&ofn)) { BOOL result; - LPSTR pszExportKeyPath; -#ifdef UNICODE - CHAR buffer[_MAX_PATH]; - - WideCharToMultiByte(CP_ACP, 0, ExportKeyPath, -1, buffer, sizeof(buffer), NULL, NULL); - pszExportKeyPath = buffer; -#else - pszExportKeyPath = ExportKeyPath; -#endif - - result = export_registry_key(ofn.lpstrFile, pszExportKeyPath); + DWORD format; + + if (ofn.nFilterIndex == 1) + format = REG_FORMAT_5; + else + format = REG_FORMAT_4; + result = export_registry_key(ofn.lpstrFile, ExportKeyPath, format); if (!result) { - /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/ + LPSTR p = GetMultiByteString(ofn.lpstrFile); + fprintf(stderr, "Can't open file \"%s\"\n", p); + HeapFree(GetProcessHeap(), 0, p); return FALSE; } -#if 0 - TCHAR filename[MAX_PATH]; - filename[0] = '\0'; - get_file_name(&s, filename, MAX_PATH); - if (!filename[0]) { - printf("No file name is specified\n%s", usage); - return FALSE; - /*exit(1);*/ - } - if (s[0]) { - TCHAR reg_key_name[KEY_MAX_LEN]; - get_file_name(&s, reg_key_name, KEY_MAX_LEN); - export_registry_key((CHAR)filename, reg_key_name); - } else { - export_registry_key(filename, NULL); - } -#endif - } else { CheckCommDlgError(hWnd); } @@ -543,10 +518,10 @@ BOOL CopyKeyName(HWND hWnd, HKEY hRootKey, LPCTSTR keyName) if (!EmptyClipboard()) goto done; - if (!RegKeyGetName(szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]), hRootKey, keyName)) + if (!GetKeyName(szBuffer, COUNT_OF(szBuffer), hRootKey, keyName)) goto done; - hGlobal = GlobalAlloc(GMEM_MOVEABLE, (_tcslen(szBuffer) + 1) * sizeof(TCHAR)); + hGlobal = GlobalAlloc(GMEM_MOVEABLE, (lstrlen(szBuffer) + 1) * sizeof(TCHAR)); if (!hGlobal) goto done; @@ -578,21 +553,18 @@ static BOOL CreateNewValue(HKEY hRootKey, LPCTSTR pszKeyPath, DWORD dwType) HKEY hKey; LVFINDINFO lvfi; - if (RegOpenKey(hRootKey, pszKeyPath, &hKey) != ERROR_SUCCESS) + if (RegOpenKeyEx(hRootKey, pszKeyPath, 0, KEY_QUERY_VALUE | KEY_SET_VALUE, + &hKey) != ERROR_SUCCESS) return FALSE; - LoadString(hInst, IDS_NEW_VALUE, szNewValueFormat, sizeof(szNewValueFormat) - / sizeof(szNewValueFormat[0])); + LoadString(hInst, IDS_NEW_VALUE, szNewValueFormat, COUNT_OF(szNewValueFormat)); do { - _sntprintf(szNewValue, sizeof(szNewValue) / sizeof(szNewValue[0]), - szNewValueFormat, iIndex++); - + wsprintf(szNewValue, szNewValueFormat, iIndex++); cbData = sizeof(data); lResult = RegQueryValueEx(hKey, szNewValue, NULL, &dwExistingType, data, &cbData); - } - while(lResult == ERROR_SUCCESS); + } while(lResult == ERROR_SUCCESS); switch(dwType) { case REG_DWORD: @@ -614,8 +586,11 @@ static BOOL CreateNewValue(HKEY hRootKey, LPCTSTR pszKeyPath, DWORD dwType) } memset(data, 0, cbData); lResult = RegSetValueEx(hKey, szNewValue, 0, dwType, data, cbData); + RegCloseKey(hKey); if (lResult != ERROR_SUCCESS) + { return FALSE; + } RefreshListView(g_pChildWnd->hListWnd, hRootKey, pszKeyPath); @@ -887,7 +862,7 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } } } - if (GetFocus() == g_pChildWnd->hTreeWnd) + else if (GetFocus() == g_pChildWnd->hTreeWnd) { /* Get focused entry of treeview (if any) */ HTREEITEM hItem = TreeView_GetSelection(g_pChildWnd->hTreeWnd); @@ -930,8 +905,8 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } } } - } else - if (GetFocus() == g_pChildWnd->hTreeWnd) + } + else if (GetFocus() == g_pChildWnd->hTreeWnd) { if (keyPath == 0 || *keyPath == 0) { @@ -943,7 +918,8 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) RefreshTreeView(g_pChildWnd->hTreeWnd); } } - break; + break; + } case ID_EDIT_NEW_STRINGVALUE: CreateNewValue(hKeyRoot, keyPath, REG_SZ); break; @@ -953,14 +929,12 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case ID_EDIT_NEW_DWORDVALUE: CreateNewValue(hKeyRoot, keyPath, REG_DWORD); break; - case ID_EDIT_NEW_MULTISTRINGVALUE: + case ID_EDIT_NEW_MULTISTRINGVALUE: CreateNewValue(hKeyRoot, keyPath, REG_MULTI_SZ); break; - case ID_EDIT_NEW_EXPANDABLESTRINGVALUE: + case ID_EDIT_NEW_EXPANDABLESTRINGVALUE: CreateNewValue(hKeyRoot, keyPath, REG_EXPAND_SZ); break; - - } case ID_EDIT_FIND: FindDialog(hWnd); break; diff --git a/base/applications/regedit/lang/it-IT.rc b/base/applications/regedit/lang/it-IT.rc index a86981a0865..53c68565cb2 100644 --- a/base/applications/regedit/lang/it-IT.rc +++ b/base/applications/regedit/lang/it-IT.rc @@ -167,12 +167,12 @@ BEGIN END POPUP "" BEGIN - MENUITEM "C&ut", ID_HEXEDIT_CUT - MENUITEM "&Copy", ID_HEXEDIT_COPY - MENUITEM "&Paste", ID_HEXEDIT_PASTE - MENUITEM "&Delete", ID_HEXEDIT_DELETE + MENUITEM "&Copia", ID_HEXEDIT_COPY + MENUITEM "&Incolla", ID_HEXEDIT_PASTE + MENUITEM "&Taglia", ID_HEXEDIT_CUT + MENUITEM "&Cancella", ID_HEXEDIT_DELETE MENUITEM SEPARATOR - MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL + MENUITEM "&Seleziona tutto", ID_HEXEDIT_SELECT_ALL END END diff --git a/base/applications/regedit/lang/sk-SK.rc b/base/applications/regedit/lang/sk-SK.rc index d8d558852b3..f5437e9cb65 100644 --- a/base/applications/regedit/lang/sk-SK.rc +++ b/base/applications/regedit/lang/sk-SK.rc @@ -1,6 +1,6 @@ /* TRANSLATOR : M疵io Ka鑪疵 /Mario Kacmar/ aka Kario (kario@szm.sk) * DATE OF TR.: 07-07-2008 - * LAST CHANGE: 28-07-2008 + * LAST CHANGE: 29-07-2010 */ LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT @@ -68,29 +68,29 @@ BEGIN MENUITEM "Roz夬rit&eセn re拌zcov hodnota", ID_EDIT_NEW_EXPANDABLESTRINGVALUE END MENUITEM SEPARATOR - MENUITEM "&Opr疱nenia...", ID_EDIT_PERMISSIONS + MENUITEM "&Opr疱nenia...", ID_EDIT_PERMISSIONS MENUITEM SEPARATOR - MENUITEM "&Vymaza拿tDel", ID_EDIT_DELETE - MENUITEM "&Premenova", ID_EDIT_RENAME + MENUITEM "&Vymaza拿tDel", ID_EDIT_DELETE + MENUITEM "&Premenova", ID_EDIT_RENAME MENUITEM SEPARATOR - MENUITEM "&Koprova n痙ov kセ鐶", ID_EDIT_COPYKEYNAME + MENUITEM "&Koprova n痙ov kセ鐶", ID_EDIT_COPYKEYNAME MENUITEM SEPARATOR - MENUITEM "&Hセada拿tCtrl+F", ID_EDIT_FIND - MENUITEM "Hセa&da alej\tF3", ID_EDIT_FINDNEXT + MENUITEM "&Hセada拿tCtrl+F", ID_EDIT_FIND + MENUITEM "Hセa&da alej\tF3", ID_EDIT_FINDNEXT END POPUP "&Zobrazi" BEGIN - MENUITEM "Stavov &riadok", ID_VIEW_STATUSBAR + MENUITEM "Stavov &riadok", ID_VIEW_STATUSBAR MENUITEM SEPARATOR - MENUITEM "Rozde&lenie", ID_VIEW_SPLIT + MENUITEM "Rozde&lenie", ID_VIEW_SPLIT MENUITEM SEPARATOR - MENUITEM "&Obnovi拿tF5", ID_VIEW_REFRESH + MENUITEM "&Obnovi拿tF5", ID_VIEW_REFRESH END POPUP "&Obセben" BEGIN - MENUITEM "&Prida k obセbenm", ID_FAVOURITES_ADDTOFAVOURITES + MENUITEM "&Prida k obセbenm", ID_FAVOURITES_ADDTOFAVOURITES , GRAYED - MENUITEM "&Odstr疣i z obセbench", ID_FAVOURITES_REMOVEFAVOURITE + MENUITEM "&Odstr疣i z obセbench", ID_FAVOURITES_REMOVEFAVOURITE , GRAYED END POPUP "&Pomocnk" @@ -106,36 +106,36 @@ BEGIN POPUP "" BEGIN MENUITEM "&Zmeni", ID_EDIT_MODIFY - MENUITEM "Zmeni bin疵e daje", ID_EDIT_MODIFY_BIN + MENUITEM "Zmeni bin疵e daje", ID_EDIT_MODIFY_BIN MENUITEM SEPARATOR - MENUITEM "&Vymaza拿tDel", ID_EDIT_DELETE - MENUITEM "&Premenova", ID_EDIT_RENAME + MENUITEM "&Vymaza拿tDel", ID_EDIT_DELETE + MENUITEM "&Premenova", ID_EDIT_RENAME END POPUP "" BEGIN POPUP "&Nov" BEGIN - MENUITEM "&Kセ", ID_EDIT_NEW_KEY + MENUITEM "&Kセ", ID_EDIT_NEW_KEY MENUITEM SEPARATOR - MENUITEM "&Re拌zcov hodnota", ID_EDIT_NEW_STRINGVALUE - MENUITEM "&Bin疵na hodnota", ID_EDIT_NEW_BINARYVALUE - MENUITEM "&DWORD hodnota", ID_EDIT_NEW_DWORDVALUE - MENUITEM "&Viacre拌zcov hodnota", ID_EDIT_NEW_MULTISTRINGVALUE - MENUITEM "Roz夬rit&eセn re拌zcov hodnota", ID_EDIT_NEW_EXPANDABLESTRINGVALUE + MENUITEM "&Re拌zcov hodnota", ID_EDIT_NEW_STRINGVALUE + MENUITEM "&Bin疵na hodnota", ID_EDIT_NEW_BINARYVALUE + MENUITEM "&DWORD hodnota", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&Viacre拌zcov hodnota", ID_EDIT_NEW_MULTISTRINGVALUE + MENUITEM "Roz夬rit&eセn re拌zcov hodnota", ID_EDIT_NEW_EXPANDABLESTRINGVALUE END END POPUP "" BEGIN - MENUITEM "Expand/Collapse", ID_TREE_EXPANDBRANCH + MENUITEM "Expand/Collapse", ID_TREE_EXPANDBRANCH POPUP "&Nov" BEGIN - MENUITEM "&Kセ", ID_EDIT_NEW_KEY + MENUITEM "&Kセ", ID_EDIT_NEW_KEY MENUITEM SEPARATOR - MENUITEM "&Re拌zcov hodnota", ID_EDIT_NEW_STRINGVALUE - MENUITEM "&Bin疵na hodnota", ID_EDIT_NEW_BINARYVALUE - MENUITEM "&DWORD hodnota", ID_EDIT_NEW_DWORDVALUE - MENUITEM "&Viacre拌zcov hodnota", ID_EDIT_NEW_MULTISTRINGVALUE - MENUITEM "Roz夬rit&eセn re拌zcov hodnota", ID_EDIT_NEW_EXPANDABLESTRINGVALUE + MENUITEM "&Re拌zcov hodnota", ID_EDIT_NEW_STRINGVALUE + MENUITEM "&Bin疵na hodnota", ID_EDIT_NEW_BINARYVALUE + MENUITEM "&DWORD hodnota", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&Viacre拌zcov hodnota", ID_EDIT_NEW_MULTISTRINGVALUE + MENUITEM "Roz夬rit&eセn re拌zcov hodnota", ID_EDIT_NEW_EXPANDABLESTRINGVALUE END MENUITEM "&Find", ID_EDIT_FIND MENUITEM SEPARATOR @@ -294,12 +294,12 @@ BEGIN IDS_UNSUPPORTED_TYPE "Can't edit keys of this type (%ld)" IDS_TOO_BIG_VALUE "Hodnota je prli veセk (%ld)" IDS_MULTI_SZ_EMPTY_STRING "Data of type REG_MULTI_SZ cannot contain empty strings.\nThe empty strings have been removed from the list." - IDS_QUERY_DELETE_KEY_ONE "Are you sure you want to delete this key?" - IDS_QUERY_DELETE_KEY_MORE "Are you sure you want to delete these keys?" - IDS_QUERY_DELETE_KEY_CONFIRM "Confirm Key Delete" - IDS_QUERY_DELETE_ONE "Are you sure you want to delete this value?" - IDS_QUERY_DELETE_MORE "Are you sure you want to delete these values?" - IDS_QUERY_DELETE_CONFIRM "Confirm Value Delete" + IDS_QUERY_DELETE_KEY_ONE "Naozaj chcete vymaza tento kセ?" + IDS_QUERY_DELETE_KEY_MORE "Naozaj chcete vymaza tieto kセ鐺?" + IDS_QUERY_DELETE_KEY_CONFIRM "Potvrdi vymazanie kセ鐶" + IDS_QUERY_DELETE_ONE "Naozaj chcete vymaza tto hodnotu?" + IDS_QUERY_DELETE_MORE "Naozaj chcete vymaza tieto hodnoty?" + IDS_QUERY_DELETE_CONFIRM "Potvrdi vymazanie hodnoty" IDS_ERR_DELVAL_CAPTION "Error Deleting Values" IDS_ERR_DELETEVALUE "Unable to delete all specified values!" IDS_ERR_RENVAL_CAPTION "Error Renaming Value" @@ -370,8 +370,7 @@ END */ IDD_EXPORTRANGE DIALOGEX DISCARDABLE 50, 50, 370, 50 -STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | - WS_BORDER +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Export Range",IDC_STATIC,2,0,366,48 diff --git a/base/applications/regedit/listview.c b/base/applications/regedit/listview.c index c6fcd021606..d7eac5974d2 100644 --- a/base/applications/regedit/listview.c +++ b/base/applications/regedit/listview.c @@ -455,7 +455,7 @@ BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result) LONG lResult; keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); - lResult = RegRenameValue(hKeyRoot, keyPath, Info->item.pszText, lineinfo->name); + lResult = RenameValue(hKeyRoot, keyPath, Info->item.pszText, lineinfo->name); lineinfo->name = realloc(lineinfo->name, (_tcslen(Info->item.pszText)+1)*sizeof(TCHAR)); if (lineinfo->name != NULL) _tcscpy(lineinfo->name, Info->item.pszText); diff --git a/base/applications/regedit/main.c b/base/applications/regedit/main.c index fa58e20e1be..0edfcecb758 100644 --- a/base/applications/regedit/main.c +++ b/base/applications/regedit/main.c @@ -20,7 +20,7 @@ #include -BOOL ProcessCmdLine(LPSTR lpCmdLine); +BOOL ProcessCmdLine(LPWSTR lpCmdLine); /******************************************************************************* @@ -143,9 +143,8 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) } /* Restore position */ - if (RegQueryStringValue(HKEY_CURRENT_USER, g_szGeneralRegKey, - _T("LastKey"), - szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0])) == ERROR_SUCCESS) + if (QueryStringValue(HKEY_CURRENT_USER, g_szGeneralRegKey, _T("LastKey"), + szBuffer, COUNT_OF(szBuffer)) == ERROR_SUCCESS) { SelectNode(g_pChildWnd->hTreeWnd, szBuffer); } @@ -183,31 +182,16 @@ BOOL TranslateChildTabMessage(MSG *msg) return TRUE; } -int APIENTRY WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) +int APIENTRY wWinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPWSTR lpCmdLine, + int nCmdShow) { MSG msg; HACCEL hAccel; UNREFERENCED_PARAMETER(hPrevInstance); - /* - int hCrt; - FILE *hf; - AllocConsole(); - hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT); - hf = _fdopen(hCrt, "w"); - *stdout = *hf; - setvbuf(stdout, NULL, _IONBF, 0); - - wprintf(L"command line exit, hInstance = %d\n", hInstance); - getch(); - FreeConsole(); - return 0; - */ - if (ProcessCmdLine(lpCmdLine)) { return 0; } diff --git a/base/applications/regedit/main.h b/base/applications/regedit/main.h index eee317e67ae..4b837d9f84c 100644 --- a/base/applications/regedit/main.h +++ b/base/applications/regedit/main.h @@ -124,3 +124,10 @@ extern void DestroyMainMenu( void ); /* edit.c */ extern BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin); extern BOOL DeleteKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath); +extern LONG RenameKey(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpNewName); +extern LONG RenameValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpDestValue, LPCTSTR lpSrcValue); +extern LONG QueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR pszBuffer, DWORD dwBufferLen); +extern BOOL GetKeyName(LPTSTR pszDest, size_t iDestLength, HKEY hRootKey, LPCTSTR lpSubKey); + +/* security.c */ +extern BOOL RegKeyEditPermissions(HWND hWndOwner, HKEY hKey, LPCTSTR lpMachine, LPCTSTR lpKeyName); diff --git a/base/applications/regedit/regedit.c b/base/applications/regedit/regedit.c index e1572951eef..bd9bad568fa 100644 --- a/base/applications/regedit/regedit.c +++ b/base/applications/regedit/regedit.c @@ -56,7 +56,136 @@ typedef enum { ACTION_UNDEF, ACTION_ADD, ACTION_EXPORT, ACTION_DELETE } REGEDIT_ACTION; -BOOL PerformRegAction(REGEDIT_ACTION action, LPSTR s); + +const CHAR *getAppName(void) +{ + return "regedit"; +} + +/****************************************************************************** + * Copies file name from command line string to the buffer. + * Rewinds the command line string pointer to the next non-space character + * after the file name. + * Buffer contains an empty string if no filename was found; + * + * params: + * command_line - command line current position pointer + * where *s[0] is the first symbol of the file name. + * file_name - buffer to write the file name to. + */ +void get_file_name(LPWSTR *command_line, LPWSTR file_name) +{ + WCHAR *s = *command_line; + int pos = 0; /* position of pointer "s" in *command_line */ + file_name[0] = 0; + + if (!s[0]) { + return; + } + + if (s[0] == L'"') { + s++; + (*command_line)++; + while(s[0] != L'"') { + if (!s[0]) { + fprintf(stderr, "%s: Unexpected end of file name!\n", getAppName()); + exit(1); + } + s++; + pos++; + } + } else { + while(s[0] && !iswspace(s[0])) { + s++; + pos++; + } + } + memcpy(file_name, *command_line, pos * sizeof((*command_line)[0])); + /* remove the last backslash */ + if (file_name[pos - 1] == L'\\') { + file_name[pos - 1] = L'\0'; + } else { + file_name[pos] = L'\0'; + } + + if (s[0]) { + s++; + pos++; + } + while(s[0] && iswspace(s[0])) { + s++; + pos++; + } + (*command_line) += pos; +} + +BOOL PerformRegAction(REGEDIT_ACTION action, LPWSTR s) +{ + switch (action) { + case ACTION_ADD: { + WCHAR filename[MAX_PATH]; + FILE *fp; + + get_file_name(&s, filename); + if (!filename[0]) { + fprintf(stderr, "%s: No file name is specified\n", getAppName()); + fprintf(stderr, usage); + exit(4); + } + + while(filename[0]) { + fp = _wfopen(filename, L"r"); + if (fp == NULL) + { + LPSTR p = GetMultiByteString(filename); + perror(""); + fprintf(stderr, "%s: Can't open file \"%s\"\n", getAppName(), p); + HeapFree(GetProcessHeap(), 0, p); + exit(5); + } + import_registry_file(fp); + get_file_name(&s, filename); + } + break; + } + case ACTION_DELETE: { + WCHAR reg_key_name[KEY_MAX_LEN]; + get_file_name(&s, reg_key_name); + if (!reg_key_name[0]) { + fprintf(stderr, "%s: No registry key is specified for removal\n", getAppName()); + fprintf(stderr, usage); + exit(6); + } + delete_registry_key(reg_key_name); + break; + } + case ACTION_EXPORT: { + WCHAR filename[MAX_PATH]; + + filename[0] = _T('\0'); + get_file_name(&s, filename); + if (!filename[0]) { + fprintf(stderr, "%s: No file name is specified\n", getAppName()); + fprintf(stderr, usage); + exit(7); + } + + if (s[0]) { + WCHAR reg_key_name[KEY_MAX_LEN]; + get_file_name(&s, reg_key_name); + export_registry_key(filename, reg_key_name, REG_FORMAT_4); + } else { + export_registry_key(filename, NULL, REG_FORMAT_4); + } + break; + } + default: + fprintf(stderr, "%s: Unhandled action!\n", getAppName()); + exit(8); + break; + } + return TRUE; +} /** * Process unknown switch. @@ -65,46 +194,47 @@ BOOL PerformRegAction(REGEDIT_ACTION action, LPSTR s); * chu - the switch character in upper-case. * s - the command line string where s points to the switch character. */ -static void error_unknown_switch(char chu, char *s) +static void error_unknown_switch(WCHAR chu, LPWSTR s) { - if (isalpha(chu)) { - fprintf(stderr,"%s: Undefined switch /%c!\n", getAppName(), chu); + if (iswalpha(chu)) { + fprintf(stderr, "%s: Undefined switch /%c!\n", getAppName(), chu); } else { - fprintf(stderr,"%s: Alphabetic character is expected after '%c' " + fprintf(stderr, "%s: Alphabetic character is expected after '%c' " "in swit ch specification\n", getAppName(), *(s - 1)); } exit(1); } -BOOL ProcessCmdLine(LPSTR lpCmdLine) +BOOL ProcessCmdLine(LPWSTR lpCmdLine) { REGEDIT_ACTION action = ACTION_UNDEF; - LPSTR s = lpCmdLine; /* command line pointer */ - CHAR ch = *s; /* current character */ + LPWSTR s = lpCmdLine; /* command line pointer */ + WCHAR ch = *s; /* current character */ - setAppName("regedit"); - while (ch && ((ch == '-') || (ch == '/'))) { - char chu; - char ch2; + while (ch && ((ch == L'-') || (ch == L'/'))) + { + WCHAR chu; + WCHAR ch2; s++; ch = *s; - ch2 = *(s+1); - chu = (CHAR) toupper(ch); - if (!ch2 || isspace(ch2)) { - if (chu == 'S' || chu == 'V') { + ch2 = *(s + 1); + chu = (WCHAR)towupper(ch); + if (!ch2 || iswspace(ch2)) { + if (chu == L'S' || chu == L'V') + { /* ignore these switches */ } else { switch (chu) { - case 'D': + case L'D': action = ACTION_DELETE; break; - case 'E': + case L'E': action = ACTION_EXPORT; break; - case '?': - fprintf(stderr,usage); - exit(0); + case L'?': + fprintf(stderr, usage); + exit(3); break; default: error_unknown_switch(chu, s); @@ -113,13 +243,13 @@ BOOL ProcessCmdLine(LPSTR lpCmdLine) } s++; } else { - if (ch2 == ':') { + if (ch2 == L':') { switch (chu) { - case 'L': + case L'L': /* fall through */ - case 'R': + case L'R': s += 2; - while (*s && !isspace(*s)) { + while (*s && !iswspace(*s)) { s++; } break; @@ -135,7 +265,7 @@ BOOL ProcessCmdLine(LPSTR lpCmdLine) } /* skip spaces to the next parameter */ ch = *s; - while (ch && isspace(ch)) { + while (ch && iswspace(ch)) { s++; ch = *s; } @@ -149,85 +279,3 @@ BOOL ProcessCmdLine(LPSTR lpCmdLine) return PerformRegAction(action, s); } - -BOOL PerformRegAction(REGEDIT_ACTION action, LPSTR s) -{ - switch (action) { - case ACTION_ADD: { - CHAR filename[MAX_PATH]; - FILE *reg_file; - - get_file_name(&s, filename); - if (!filename[0]) { - fprintf(stderr,"%s: No file name is specified\n", getAppName()); - fprintf(stderr,usage); - exit(1); - } - - while(filename[0]) { - reg_file = fopen(filename, "r"); - if (reg_file) { - processRegLines(reg_file, doSetValue); - fclose(reg_file); - } else { - perror(""); - fprintf(stderr,"%s: Can't open file \"%s\"\n", getAppName(), filename); - exit(1); - } - get_file_name(&s, filename); - } - break; - } - case ACTION_DELETE: { - CHAR reg_key_name[KEY_MAX_LEN]; - - get_file_name(&s, reg_key_name); - if (!reg_key_name[0]) { - fprintf(stderr,"%s: No registry key is specified for removal\n", - getAppName()); - fprintf(stderr,usage); - exit(1); - } - delete_registry_key(reg_key_name); - break; - } - case ACTION_EXPORT: { - CHAR filename[MAX_PATH]; - LPCTSTR pszFilename; -#ifdef UNICODE - WCHAR filename_wide[MAX_PATH]; -#endif - - filename[0] = '\0'; - get_file_name(&s, filename); - if (!filename[0]) { - fprintf(stderr,"%s: No file name is specified\n", getAppName()); - fprintf(stderr,usage); - exit(1); - } - -#ifdef UNICODE - MultiByteToWideChar(CP_ACP, 0, filename, -1, filename_wide, - sizeof(filename_wide) / sizeof(filename_wide[0])); - pszFilename = filename_wide; -#else - pszFilename = filename; -#endif - - if (s[0]) { - CHAR reg_key_name[KEY_MAX_LEN]; - - get_file_name(&s, reg_key_name); - export_registry_key(pszFilename, reg_key_name); - } else { - export_registry_key(pszFilename, NULL); - } - break; - } - default: - fprintf(stderr,"%s: Unhandled action!\n", getAppName()); - exit(1); - break; - } - return TRUE; -} diff --git a/base/applications/regedit/regproc.c b/base/applications/regedit/regproc.c index 2ba45c29faf..2f675d04c67 100644 --- a/base/applications/regedit/regproc.c +++ b/base/applications/regedit/regproc.c @@ -4,6 +4,7 @@ * * Copyright 1999 Sylvain St-Germain * Copyright 2002 Andriy Palamarchuk + * Copyright 2008 Alexander N. S?rnes * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,24 +18,17 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#include "regedit.h" #define REG_VAL_BUF_SIZE 4096 /* maximal number of characters in hexadecimal data line, - not including '\' character */ -#define REG_FILE_HEX_LINE_LEN 76 - -/* Globals used by the api setValue */ -static LPSTR currentKeyName = NULL; -static HKEY currentKeyClass = 0; -static HKEY currentKeyHandle = 0; -static BOOL bTheKeyIsOpen = FALSE; - -static const CHAR *app_name = "UNKNOWN"; + * including the indentation, but not including the '\' character + */ +#define REG_FILE_HEX_LINE_LEN (2 + 25 * 3) static const CHAR *reg_class_names[] = { "HKEY_LOCAL_MACHINE", "HKEY_USERS", "HKEY_CLASSES_ROOT", @@ -43,6 +37,11 @@ static const CHAR *reg_class_names[] = { #define REG_CLASS_NUMBER (sizeof(reg_class_names) / sizeof(reg_class_names[0])) +const WCHAR* reg_class_namesW[REG_CLASS_NUMBER] = { + L"HKEY_LOCAL_MACHINE", L"HKEY_USERS", L"HKEY_CLASSES_ROOT", + L"HKEY_CURRENT_CONFIG", L"HKEY_CURRENT_USER", L"HKEY_DYN_DATA" +}; + static HKEY reg_class_keys[REG_CLASS_NUMBER] = { HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CLASSES_ROOT, HKEY_CURRENT_CONFIG, HKEY_CURRENT_USER, HKEY_DYN_DATA @@ -64,100 +63,93 @@ if (!(p)) \ } /****************************************************************************** - * This is a replacement for strsep which is not portable (missing on Solaris). + * Allocates memory and converts input from multibyte to wide chars + * Returned string must be freed by the caller */ -#if 0 -/* DISABLED */ -char* getToken(char** str, const char* delims) +WCHAR* GetWideString(const char* strA) { - char* token; + if(strA) + { + WCHAR* strW; + int len = MultiByteToWideChar(CP_ACP, 0, strA, -1, NULL, 0); - if (*str==NULL) { - /* No more tokens */ - return NULL; + strW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + CHECK_ENOUGH_MEMORY(strW); + MultiByteToWideChar(CP_ACP, 0, strA, -1, strW, len); + return strW; } - - token=*str; - while (**str!='\0') { - if (strchr(delims,**str)!=NULL) { - **str='\0'; - (*str)++; - return token; - } - (*str)++; - } - /* There is no other token */ - *str=NULL; - return token; + return NULL; } -#endif /****************************************************************************** - * Copies file name from command line string to the buffer. - * Rewinds the command line string pointer to the next non-space character - * after the file name. - * Buffer contains an empty string if no filename was found; - * - * params: - * command_line - command line current position pointer - * where *s[0] is the first symbol of the file name. - * file_name - buffer to write the file name to. + * Allocates memory and converts input from multibyte to wide chars + * Returned string must be freed by the caller */ -void get_file_name(CHAR **command_line, CHAR *file_name) +static WCHAR* GetWideStringN(const char* strA, int chars, DWORD *len) { - CHAR *s = *command_line; - int pos = 0; /* position of pointer "s" in *command_line */ - file_name[0] = 0; + if(strA) + { + WCHAR* strW; + *len = MultiByteToWideChar(CP_ACP, 0, strA, chars, NULL, 0); - if (!s[0]) { - return; + strW = HeapAlloc(GetProcessHeap(), 0, *len * sizeof(WCHAR)); + CHECK_ENOUGH_MEMORY(strW); + MultiByteToWideChar(CP_ACP, 0, strA, chars, strW, *len); + return strW; } - - if (s[0] == '"') { - s++; - (*command_line)++; - while(s[0] != '"') { - if (!s[0]) { - fprintf(stderr,"%s: Unexpected end of file name!\n", - getAppName()); - exit(1); - } - s++; - pos++; - } - } else { - while(s[0] && !isspace(s[0])) { - s++; - pos++; - } - } - memcpy(file_name, *command_line, pos * sizeof((*command_line)[0])); - /* remove the last backslash */ - if (file_name[pos - 1] == '\\') { - file_name[pos - 1] = '\0'; - } else { - file_name[pos] = '\0'; - } - - if (s[0]) { - s++; - pos++; - } - while(s[0] && isspace(s[0])) { - s++; - pos++; - } - (*command_line) += pos; + *len = 0; + return NULL; } +/****************************************************************************** + * Allocates memory and converts input from wide chars to multibyte + * Returned string must be freed by the caller + */ +char* GetMultiByteString(const WCHAR* strW) +{ + if(strW) + { + char* strA; + int len = WideCharToMultiByte(CP_ACP, 0, strW, -1, NULL, 0, NULL, NULL); + + strA = HeapAlloc(GetProcessHeap(), 0, len); + CHECK_ENOUGH_MEMORY(strA); + WideCharToMultiByte(CP_ACP, 0, strW, -1, strA, len, NULL, NULL); + return strA; + } + return NULL; +} + +/****************************************************************************** + * Allocates memory and converts input from wide chars to multibyte + * Returned string must be freed by the caller + */ +static char* GetMultiByteStringN(const WCHAR* strW, int chars, DWORD* len) +{ + if(strW) + { + char* strA; + *len = WideCharToMultiByte(CP_ACP, 0, strW, chars, NULL, 0, NULL, NULL); + + strA = HeapAlloc(GetProcessHeap(), 0, *len); + CHECK_ENOUGH_MEMORY(strA); + WideCharToMultiByte(CP_ACP, 0, strW, chars, strA, *len, NULL, NULL); + return strA; + } + *len = 0; + return NULL; +} /****************************************************************************** * Converts a hex representation of a DWORD into a DWORD. */ -static BOOL convertHexToDWord(char* str, DWORD *dw) +static BOOL convertHexToDWord(WCHAR* str, DWORD *dw) { + char buf[9]; char dummy; - if (strlen(str) > 8 || sscanf(str, "%lx%c", dw, &dummy) != 1) { + + WideCharToMultiByte(CP_ACP, 0, str, -1, buf, 9, NULL, NULL); + if (lstrlenW(str) > 8 || sscanf(buf, "%lx%c", dw, &dummy) != 1) { fprintf(stderr,"%s: ERROR, invalid hex value\n", getAppName()); return FALSE; } @@ -165,15 +157,15 @@ static BOOL convertHexToDWord(char* str, DWORD *dw) } /****************************************************************************** -* Converts a hex comma separated values list into a binary string. - */ -static BYTE* convertHexCSVToHex(char *str, DWORD *size) + * Converts a hex comma separated values list into a binary string. + */ +static BYTE* convertHexCSVToHex(WCHAR *str, DWORD *size) { - char *s; + WCHAR *s; BYTE *d, *data; /* The worst case is 1 digit + 1 comma per byte */ - *size=(strlen(str)+1)/2; + *size=(lstrlenW(str)+1)/2; data=HeapAlloc(GetProcessHeap(), 0, *size); CHECK_ENOUGH_MEMORY(data); @@ -182,25 +174,21 @@ static BYTE* convertHexCSVToHex(char *str, DWORD *size) *size=0; while (*s != '\0') { UINT wc; - char dummy; + WCHAR *end; - if (s[1] != ',' && s[1] != '\0' && s[2] != ',' && s[2] != '\0') { - fprintf(stderr,"%s: ERROR converting CSV hex stream. Invalid sequence at '%s'\n", - getAppName(), s); - HeapFree(GetProcessHeap(), 0, data); - return NULL; - } - if (sscanf(s, "%x%c", &wc, &dummy) < 1 || dummy != ',') { + wc = wcstoul(s,&end, 16); + if (end == s || wc > 0xff || (*end && *end != L',')) { + char* strA = GetMultiByteString(s); fprintf(stderr,"%s: ERROR converting CSV hex stream. Invalid value at '%s'\n", - getAppName(), s); + getAppName(), strA); HeapFree(GetProcessHeap(), 0, data); + HeapFree(GetProcessHeap(), 0, strA); return NULL; } *d++ =(BYTE)wc; (*size)++; - /* Skip one or two digits and any comma */ - while (*s && *s!=',') s++; - if (*s) s++; + if (*end) end++; + s = end; } return data; @@ -213,17 +201,24 @@ static BYTE* convertHexCSVToHex(char *str, DWORD *size) * * Note: Updated based on the algorithm used in 'server/registry.c' */ -DWORD getDataType(LPSTR *lpValue, DWORD* parse_type) +static DWORD getDataType(LPWSTR *lpValue, DWORD* parse_type) { - struct data_type { const char *tag; int len; int type; int parse_type; }; + struct data_type { const WCHAR *tag; int len; int type; int parse_type; }; + + static const WCHAR quote[] = {'"'}; + static const WCHAR str[] = {'s','t','r',':','"'}; + static const WCHAR str2[] = {'s','t','r','(','2',')',':','"'}; + static const WCHAR hex[] = {'h','e','x',':'}; + static const WCHAR dword[] = {'d','w','o','r','d',':'}; + static const WCHAR hexp[] = {'h','e','x','('}; static const struct data_type data_types[] = { /* actual type */ /* type to assume for parsing */ - { "\"", 1, REG_SZ, REG_SZ }, - { "str:\"", 5, REG_SZ, REG_SZ }, - { "str(2):\"", 8, REG_EXPAND_SZ, REG_SZ }, - { "hex:", 4, REG_BINARY, REG_BINARY }, - { "dword:", 6, REG_DWORD, REG_DWORD }, - { "hex(", 4, -1, REG_BINARY }, + { quote, 1, REG_SZ, REG_SZ }, + { str, 5, REG_SZ, REG_SZ }, + { str2, 8, REG_EXPAND_SZ, REG_SZ }, + { hex, 4, REG_BINARY, REG_BINARY }, + { dword, 6, REG_DWORD, REG_DWORD }, + { hexp, 4, -1, REG_BINARY }, { NULL, 0, 0, 0 } }; @@ -231,7 +226,7 @@ DWORD getDataType(LPSTR *lpValue, DWORD* parse_type) int type; for (ptr = data_types; ptr->tag; ptr++) { - if (memcmp( ptr->tag, *lpValue, ptr->len )) + if (wcsncmp(ptr->tag, *lpValue, ptr->len)) continue; /* Found! */ @@ -239,13 +234,14 @@ DWORD getDataType(LPSTR *lpValue, DWORD* parse_type) type=ptr->type; *lpValue+=ptr->len; if (type == -1) { - char* end; + WCHAR* end; + /* "hex(xx):" is special */ - type = (int)strtoul( *lpValue , &end, 16 ); + type = (int)wcstoul( *lpValue , &end, 16 ); if (**lpValue=='\0' || *end!=')' || *(end+1)!=':') { type=REG_NONE; } else { - *lpValue=end+2; + *lpValue = end + 2; } } return type; @@ -254,41 +250,14 @@ DWORD getDataType(LPSTR *lpValue, DWORD* parse_type) return REG_NONE; } -/****************************************************************************** - * Returns an allocated buffer with a cleaned copy (removed the surrounding - * dbl quotes) of the passed value. - */ -LPSTR getArg( LPSTR arg) -{ - LPSTR tmp = NULL; - size_t len; - - if (arg == NULL) - return NULL; - - /* - * Get rid of surrounding quotes - */ - len = strlen(arg); - - if( arg[len-1] == '\"' ) arg[len-1] = '\0'; - if( arg[0] == '\"' ) arg++; - - tmp = HeapAlloc(GetProcessHeap(), 0, strlen(arg)+1); - CHECK_ENOUGH_MEMORY(tmp); - strcpy(tmp, arg); - - return tmp; -} - /****************************************************************************** * Replaces escape sequences with the characters. */ -static void REGPROC_unescape_string(LPSTR str) +static void REGPROC_unescape_string(WCHAR* str) { - size_t str_idx = 0; /* current character under analysis */ - size_t val_idx = 0; /* the last character of the unescaped string */ - size_t len = strlen(str); + int str_idx = 0; /* current character under analysis */ + int val_idx = 0; /* the last character of the unescaped string */ + int len = lstrlenW(str); for (str_idx = 0; str_idx < len; str_idx++, val_idx++) { if (str[str_idx] == '\\') { str_idx++; @@ -313,6 +282,55 @@ static void REGPROC_unescape_string(LPSTR str) str[val_idx] = '\0'; } +static BOOL parseKeyName(LPWSTR lpKeyName, HKEY *hKey, LPWSTR *lpKeyPath) +{ + WCHAR* lpSlash = NULL; + unsigned int i, len; + + if (lpKeyName == NULL) + return FALSE; + + for(i = 0; *(lpKeyName + i) != 0; i++) + { + if(*(lpKeyName+i) == '\\') + { + lpSlash = lpKeyName + i; + break; + } + } + + if (lpSlash) + { + len = lpSlash-lpKeyName; + } + else + { + len = lstrlenW(lpKeyName); + lpSlash = lpKeyName+len; + } + *hKey = NULL; + + for (i = 0; i < REG_CLASS_NUMBER; i++) { + if (CompareStringW(LOCALE_USER_DEFAULT, 0, lpKeyName, len, reg_class_namesW[i], len) == CSTR_EQUAL && + len == lstrlenW(reg_class_namesW[i])) { + *hKey = reg_class_keys[i]; + break; + } + } + + if (*hKey == NULL) + return FALSE; + + if (*lpSlash != '\0') + lpSlash++; + *lpKeyPath = lpSlash; + return TRUE; +} + +/* Globals used by the setValue() & co */ +static LPSTR currentKeyName; +static HKEY currentKeyHandle = NULL; + /****************************************************************************** * Sets the value with name val_name to the data in val_data for the currently * opened key. @@ -321,49 +339,63 @@ static void REGPROC_unescape_string(LPSTR str) * val_name - name of the registry value * val_data - registry value data */ -LONG setValue(LPSTR val_name, LPSTR val_data) +static LONG setValue(WCHAR* val_name, WCHAR* val_data, BOOL is_unicode) { LONG res; DWORD dwDataType, dwParseType; LPBYTE lpbData; DWORD dwData, dwLen; + WCHAR del[] = {'-',0}; if ( (val_name == NULL) || (val_data == NULL) ) return ERROR_INVALID_PARAMETER; - if (strcmp(val_data, "-") == 0) + if (lstrcmpW(val_data, del) == 0) { - res=RegDeleteValueA(currentKeyHandle,val_name); + res=RegDeleteValueW(currentKeyHandle,val_name); return (res == ERROR_FILE_NOT_FOUND ? ERROR_SUCCESS : res); } /* Get the data type stored into the value field */ dwDataType = getDataType(&val_data, &dwParseType); - if (dwParseType == REG_SZ) /* no conversion for string */ + if (dwParseType == REG_SZ) /* no conversion for string */ { - dwLen = (DWORD) strlen(val_data); + REGPROC_unescape_string(val_data); + /* Compute dwLen after REGPROC_unescape_string because it may + * have changed the string length and we don't want to store + * the extra garbage in the registry. + */ + dwLen = lstrlenW(val_data); if (dwLen>0 && val_data[dwLen-1]=='"') { dwLen--; val_data[dwLen]='\0'; } - dwLen++; - REGPROC_unescape_string(val_data); - lpbData = (LPBYTE)val_data; + lpbData = (BYTE*) val_data; + dwLen++; /* include terminating null */ + dwLen = dwLen * sizeof(WCHAR); /* size is in bytes */ } else if (dwParseType == REG_DWORD) /* Convert the dword types */ { if (!convertHexToDWord(val_data, &dwData)) return ERROR_INVALID_DATA; lpbData = (BYTE*)&dwData; - dwLen = sizeof(dwData); + dwLen = sizeof(dwData); } else if (dwParseType == REG_BINARY) /* Convert the binary data */ { lpbData = convertHexCSVToHex(val_data, &dwLen); if (!lpbData) - return ERROR_INVALID_DATA; + return ERROR_INVALID_DATA; + + if((dwDataType == REG_MULTI_SZ || dwDataType == REG_EXPAND_SZ) && !is_unicode) + { + LPBYTE tmp = lpbData; + lpbData = (LPBYTE)GetWideStringN((char*)lpbData, dwLen, &dwLen); + dwLen *= sizeof(WCHAR); + HeapFree(GetProcessHeap(), 0, tmp); + } } else /* unknown format */ { @@ -371,25 +403,26 @@ LONG setValue(LPSTR val_name, LPSTR val_data) return ERROR_INVALID_DATA; } - res = RegSetValueExA( + res = RegSetValueExW( currentKeyHandle, val_name, 0, /* Reserved */ dwDataType, lpbData, dwLen); - if (dwParseType == REG_BINARY) HeapFree(GetProcessHeap(), 0, lpbData); return res; } - /****************************************************************************** - * Open the key + * A helper function for processRegEntry() that opens the current key. + * That key must be closed by calling closeKey(). */ -LONG openKey( LPSTR stdInput) +static LONG openKeyW(WCHAR* stdInput) { + HKEY keyClass; + WCHAR* keyPath; DWORD dwDisp; LONG res; @@ -398,17 +431,12 @@ LONG openKey( LPSTR stdInput) return ERROR_INVALID_PARAMETER; /* Get the registry class */ - if (!getRegClass(stdInput, ¤tKeyClass)) /* Sets global variable */ + if (!parseKeyName(stdInput, &keyClass, &keyPath)) return ERROR_INVALID_PARAMETER; - /* Get the key name */ - currentKeyName = getRegKeyName(stdInput); /* Sets global variable */ - if (currentKeyName == NULL) - return ERROR_INVALID_PARAMETER; - - res = RegCreateKeyExA( - currentKeyClass, /* Class */ - currentKeyName, /* Sub Key */ + res = RegCreateKeyExW( + keyClass, /* Class */ + keyPath, /* Sub Key */ 0, /* MUST BE 0 */ NULL, /* object type */ REG_OPTION_NON_VOLATILE, /* option, REG_OPTION_NON_VOLATILE ... */ @@ -419,205 +447,44 @@ LONG openKey( LPSTR stdInput) REG_OPENED_EXISTING_KEY */ if (res == ERROR_SUCCESS) - bTheKeyIsOpen = TRUE; + currentKeyName = GetMultiByteString(stdInput); + else + currentKeyHandle = NULL; return res; } -/****************************************************************************** - * Extracts from [HKEY\some\key\path] or HKEY\some\key\path types of line - * the key name (what starts after the first '\') - */ -LPSTR getRegKeyName(LPSTR lpLine) -{ - LPSTR keyNameBeg; - char lpLineCopy[KEY_MAX_LEN]; - - if (lpLine == NULL) - return NULL; - - strcpy(lpLineCopy, lpLine); - - keyNameBeg = strchr(lpLineCopy, '\\'); /* The key name start by '\' */ - if (keyNameBeg) { - keyNameBeg++; - if (lpLine[0] == '[') /* need to find matching ']' */ - { - LPSTR keyNameEnd; - - keyNameEnd = strrchr(lpLineCopy, ']'); - if (keyNameEnd) { - *keyNameEnd = '\0'; /* remove ']' from the key name */ - } - } - } else { - keyNameBeg = lpLineCopy + strlen(lpLineCopy); /* branch - empty string */ - } - currentKeyName = HeapAlloc(GetProcessHeap(), 0, strlen(keyNameBeg) + 1); - CHECK_ENOUGH_MEMORY(currentKeyName); - strcpy(currentKeyName, keyNameBeg); - return currentKeyName; -} - -/****************************************************************************** - * Extracts from [HKEY\some\key\path] or HKEY\some\key\path types of line - * the key class (what ends before the first '\') - */ -BOOL getRegClass(LPSTR lpClass, HKEY* hkey) -{ - LPSTR classNameEnd; - LPSTR classNameBeg; - unsigned int i; - - char lpClassCopy[KEY_MAX_LEN]; - - if (lpClass == NULL) - return FALSE; - - lstrcpynA(lpClassCopy, lpClass, KEY_MAX_LEN); - - classNameEnd = strchr(lpClassCopy, '\\'); /* The class name ends by '\' */ - if (!classNameEnd) /* or the whole string */ - { - classNameEnd = lpClassCopy + strlen(lpClassCopy); - if (classNameEnd[-1] == ']') - { - classNameEnd--; - } - } - *classNameEnd = '\0'; /* Isolate the class name */ - if (lpClassCopy[0] == '[') { - classNameBeg = lpClassCopy + 1; - } else { - classNameBeg = lpClassCopy; - } - - for (i = 0; i < REG_CLASS_NUMBER; i++) { - if (!strcmp(classNameBeg, reg_class_names[i])) { - *hkey = reg_class_keys[i]; - return TRUE; - } - } - return FALSE; -} - /****************************************************************************** * Close the currently opened key. */ -void closeKey(void) +static void closeKey(void) { - RegCloseKey(currentKeyHandle); - - HeapFree(GetProcessHeap(), 0, currentKeyName); /* Allocated by getKeyName */ - - bTheKeyIsOpen = FALSE; - - currentKeyName = NULL; - currentKeyClass = 0; - currentKeyHandle = 0; -} - -/****************************************************************************** - * This function is the main entry point to the setValue type of action. It - * receives the currently read line and dispatch the work depending on the - * context. - */ -void doSetValue(LPSTR stdInput) -{ - /* - * We encountered the end of the file, make sure we - * close the opened key and exit - */ - if (stdInput == NULL) { - if (bTheKeyIsOpen != FALSE) - closeKey(); - - return; - } - - if ( stdInput[0] == '[') /* We are reading a new key */ + if (currentKeyHandle) { - if ( bTheKeyIsOpen != FALSE ) - closeKey(); /* Close the previous key before */ - - /* delete the key if we encounter '-' at the start of reg key */ - if ( stdInput[1] == '-') - { - int last_chr = strlen(stdInput) - 1; - - /* skip leading "[-" and get rid of trailing "]" */ - if (stdInput[last_chr] == ']') - stdInput[last_chr] = '\0'; - delete_registry_key(stdInput+2); - return; - } - - if ( openKey(stdInput) != ERROR_SUCCESS ) - fprintf(stderr,"%s: setValue failed to open key %s\n", - getAppName(), stdInput); - } else if( ( bTheKeyIsOpen ) && - (( stdInput[0] == '@') || /* reading a default @=data pair */ - ( stdInput[0] == '\"'))) /* reading a new value=data pair */ - { - processSetValue(stdInput); - } else /* since we are assuming that the */ - { /* file format is valid we must */ - if ( bTheKeyIsOpen ) /* be reading a blank line which */ - closeKey(); /* indicate end of this key processing */ + HeapFree(GetProcessHeap(), 0, currentKeyName); + RegCloseKey(currentKeyHandle); + currentKeyHandle = NULL; } } -/****************************************************************************** - * This function is the main entry point to the deleteValue type of action. It - * receives the currently read line and dispatch the work depending on the - * context. - */ -void doDeleteValue(LPSTR line) -{ - UNREFERENCED_PARAMETER(line); - fprintf(stderr,"%s: deleteValue not yet implemented\n", getAppName()); -} - -/****************************************************************************** - * This function is the main entry point to the deleteKey type of action. It - * receives the currently read line and dispatch the work depending on the - * context. - */ -void doDeleteKey(LPSTR line) -{ - UNREFERENCED_PARAMETER(line); - fprintf(stderr,"%s: deleteKey not yet implemented\n", getAppName()); -} - -/****************************************************************************** - * This function is the main entry point to the createKey type of action. It - * receives the currently read line and dispatch the work depending on the - * context. - */ -void doCreateKey(LPSTR line) -{ - UNREFERENCED_PARAMETER(line); - fprintf(stderr,"%s: createKey not yet implemented\n", getAppName()); -} - /****************************************************************************** * This function is a wrapper for the setValue function. It prepares the - * land and clean the area once completed. + * land and cleans the area once completed. * Note: this function modifies the line parameter. * * line - registry file unwrapped line. Should have the registry value name and * complete registry value data. */ -void processSetValue(LPSTR line) +static void processSetValue(WCHAR* line, BOOL is_unicode) { - LPSTR val_name; /* registry value name */ - LPSTR val_data; /* registry value data */ - + WCHAR* val_name; /* registry value name */ + WCHAR* val_data; /* registry value data */ int line_idx = 0; /* current character under analysis */ LONG res; /* get value name */ + while ( iswspace(line[line_idx]) ) line_idx++; if (line[line_idx] == '@' && line[line_idx + 1] == '=') { line[line_idx] = '\0'; val_name = line; @@ -626,11 +493,6 @@ void processSetValue(LPSTR line) line_idx++; val_name = line + line_idx; while (TRUE) { - /* check if the line is unterminated (otherwise it may loop forever!) */ - if (line[line_idx] == '\0') { - fprintf(stderr,"Warning! unrecognized line:\n%s\n", line); - return; - } else if (line[line_idx] == '\\') /* skip escaped character */ { line_idx += 2; @@ -644,48 +506,120 @@ void processSetValue(LPSTR line) } } } + while ( iswspace(line[line_idx]) ) line_idx++; if (line[line_idx] != '=') { + char* lineA; line[line_idx] = '\"'; - fprintf(stderr,"Warning! unrecognized line:\n%s\n", line); + lineA = GetMultiByteString(line); + fprintf(stderr,"Warning! unrecognized line:\n%s\n", lineA); + HeapFree(GetProcessHeap(), 0, lineA); return; } } else { - fprintf(stderr,"Warning! unrecognized line:\n%s\n", line); + char* lineA = GetMultiByteString(line); + fprintf(stderr,"Warning! unrecognized line:\n%s\n", lineA); + HeapFree(GetProcessHeap(), 0, lineA); return; } line_idx++; /* skip the '=' character */ + + while ( iswspace(line[line_idx]) ) line_idx++; val_data = line + line_idx; + /* trim trailing blanks */ + line_idx = lstrlenW(val_data); + while (line_idx > 0 && iswspace(val_data[line_idx-1])) line_idx--; + val_data[line_idx] = '\0'; REGPROC_unescape_string(val_name); - res = setValue(val_name, val_data); + res = setValue(val_name, val_data, is_unicode); if ( res != ERROR_SUCCESS ) + { + char* val_nameA = GetMultiByteString(val_name); + char* val_dataA = GetMultiByteString(val_data); fprintf(stderr,"%s: ERROR Key %s not created. Value: %s, Data: %s\n", getAppName(), currentKeyName, - val_name, - val_data); + val_nameA, + val_dataA); + HeapFree(GetProcessHeap(), 0, val_nameA); + HeapFree(GetProcessHeap(), 0, val_dataA); + } } /****************************************************************************** - * Calls command for each line of a registry file. + * This function receives the currently read entry and performs the + * corresponding action. + * isUnicode affects parsing of REG_MULTI_SZ values + */ +static void processRegEntry(WCHAR* stdInput, BOOL isUnicode) +{ + /* + * We encountered the end of the file, make sure we + * close the opened key and exit + */ + if (stdInput == NULL) { + closeKey(); + return; + } + + if ( stdInput[0] == L'[') /* We are reading a new key */ + { + WCHAR* keyEnd; + closeKey(); /* Close the previous key */ + + /* Get rid of the square brackets */ + stdInput++; + keyEnd = wcsrchr(stdInput, L']'); + if (keyEnd) + *keyEnd='\0'; + + /* delete the key if we encounter '-' at the start of reg key */ + if ( stdInput[0] == '-') + { + delete_registry_key(stdInput + 1); + } else if ( openKeyW(stdInput) != ERROR_SUCCESS ) + { + char* stdInputA = GetMultiByteString(stdInput); + fprintf(stderr,"%s: setValue failed to open key %s\n", + getAppName(), stdInputA); + HeapFree(GetProcessHeap(), 0, stdInputA); + } + } else if( currentKeyHandle && + (( stdInput[0] == '@') || /* reading a default @=data pair */ + ( stdInput[0] == '\"'))) /* reading a new value=data pair */ + { + processSetValue(stdInput, isUnicode); + } else + { + /* Since we are assuming that the file format is valid we must be + * reading a blank line which indicates the end of this key processing + */ + closeKey(); + } +} + +/****************************************************************************** + * Processes a registry file. * Correctly processes comments (in # form), line continuation. * * Parameters: * in - input stream to read from - * command - command to be called for each line */ -void processRegLines(FILE *in, CommandAPI command) +static void processRegLinesA(FILE *in) { LPSTR line = NULL; /* line read from input stream */ - size_t lineSize = REG_VAL_BUF_SIZE; + ULONG lineSize = REG_VAL_BUF_SIZE; line = HeapAlloc(GetProcessHeap(), 0, lineSize); CHECK_ENOUGH_MEMORY(line); while (!feof(in)) { LPSTR s; /* The pointer into line for where the current fgets should read */ + LPSTR check; + WCHAR* lineW; s = line; + for (;;) { size_t size_remaining; int size_to_get; @@ -712,8 +646,11 @@ void processRegLines(FILE *in, CommandAPI command) /* Get as much as possible into the buffer, terminated either by * eof, error, eol or getting the maximum amount. Abort on error. */ - size_to_get = (int) (size_remaining > INT_MAX ? INT_MAX : size_remaining); - if (NULL == fgets (s, size_to_get, in)) { + size_to_get = (size_remaining > INT_MAX ? INT_MAX : size_remaining); + + check = fgets (s, size_to_get, in); + + if (check == NULL) { if (ferror(in)) { perror ("While reading input"); exit (IO_ERROR); @@ -753,90 +690,159 @@ void processRegLines(FILE *in, CommandAPI command) if (s_eol > line && *(s_eol-1) == '\\') { int c; s = s_eol-1; - /* The following error protection could be made more self- - * correcting but I thought it not worth trying. - */ - if ((c = fgetc (in)) == EOF || c != ' ' || - (c = fgetc (in)) == EOF || c != ' ') + + do + { + c = fgetc(in); + } while(c == ' ' || c == '\t'); + + if(c == EOF) + { fprintf(stderr,"%s: ERROR - invalid continuation.\n", getAppName()); + } + else + { + *s = c; + s++; + } continue; } + lineW = GetWideString(line); + break; /* That is the full virtual line */ } - command(line); + processRegEntry(lineW, FALSE); + HeapFree(GetProcessHeap(), 0, lineW); } - command(NULL); + processRegEntry(NULL, FALSE); HeapFree(GetProcessHeap(), 0, line); } -/****************************************************************************** - * This function is the main entry point to the registerDLL action. It - * receives the currently read line, then loads and registers the requested DLLs - */ -void doRegisterDLL(LPSTR stdInput) +static void processRegLinesW(FILE *in) { - HMODULE theLib = 0; - UINT retVal = 0; + WCHAR* buf = NULL; /* line read from input stream */ + ULONG lineSize = REG_VAL_BUF_SIZE; + size_t CharsInBuf = -1; - /* Check for valid input */ - if (stdInput == NULL) - return; + WCHAR* s; /* The pointer into buf for where the current fgets should read */ + WCHAR* line; /* The start of the current line */ - /* Load and register the library, then free it */ - theLib = LoadLibraryA(stdInput); - if (theLib) { - FARPROC lpfnDLLRegProc = GetProcAddress(theLib, "DllRegisterServer"); - if (lpfnDLLRegProc) - retVal = (*lpfnDLLRegProc)(); - else - fprintf(stderr,"%s: Couldn't find DllRegisterServer proc in '%s'.\n", - getAppName(), stdInput); + buf = HeapAlloc(GetProcessHeap(), 0, lineSize * sizeof(WCHAR)); + CHECK_ENOUGH_MEMORY(buf); - if (retVal != S_OK) - fprintf(stderr,"%s: DLLRegisterServer error 0x%x in '%s'.\n", - getAppName(), retVal, stdInput); + s = buf; + line = buf; - FreeLibrary(theLib); - } else { - fprintf(stderr,"%s: Could not load DLL '%s'.\n", getAppName(), stdInput); + while(!feof(in)) { + size_t size_remaining; + int size_to_get; + WCHAR *s_eol = NULL; /* various local uses */ + + /* Do we need to expand the buffer ? */ + assert (s >= buf && s <= buf + lineSize); + size_remaining = lineSize - (s-buf); + if (size_remaining < 2) /* room for 1 character and the \0 */ + { + WCHAR *new_buffer; + size_t new_size = lineSize + (REG_VAL_BUF_SIZE / sizeof(WCHAR)); + if (new_size > lineSize) /* no arithmetic overflow */ + new_buffer = HeapReAlloc (GetProcessHeap(), 0, buf, new_size * sizeof(WCHAR)); + else + new_buffer = NULL; + CHECK_ENOUGH_MEMORY(new_buffer); + buf = new_buffer; + line = buf; + s = buf + lineSize - size_remaining; + lineSize = new_size; + size_remaining = lineSize - (s-buf); + } + + /* Get as much as possible into the buffer, terminated either by + * eof, error or getting the maximum amount. Abort on error. + */ + size_to_get = (size_remaining > INT_MAX ? INT_MAX : size_remaining); + + CharsInBuf = fread(s, sizeof(WCHAR), size_to_get - 1, in); + s[CharsInBuf] = 0; + + if (CharsInBuf == 0) { + if (ferror(in)) { + perror ("While reading input"); + exit (IO_ERROR); + } else { + assert (feof(in)); + *s = '\0'; + /* It is not clear to me from the definition that the + * contents of the buffer are well defined on detecting + * an eof without managing to read anything. + */ + } + } + + /* If we didn't read the eol nor the eof go around for the rest */ + while(1) + { + s_eol = wcschr(line, '\n'); + + if(!s_eol) { + /* Move the stub of the line to the start of the buffer so + * we get the maximum space to read into, and so we don't + * have to recalculate 'line' if the buffer expands */ + MoveMemory(buf, line, (lstrlenW(line) + 1) * sizeof(WCHAR)); + line = buf; + s = wcschr(line, '\0'); + break; + } + + /* If it is a comment line then discard it and go around again */ + if (*line == '#') { + line = s_eol + 1; + continue; + } + + /* If there is a concatenating \\ then go around again */ + if ((*(s_eol-1) == '\\') || + (*(s_eol-1) == '\r' && *(s_eol-2) == '\\')) { + WCHAR* NextLine = s_eol; + + while(*(NextLine+1) == ' ' || *(NextLine+1) == '\t') + NextLine++; + + NextLine++; + + if(*(s_eol-1) == '\r') + s_eol--; + + MoveMemory(s_eol - 1, NextLine, (CharsInBuf - (NextLine - s) + 1)*sizeof(WCHAR)); + CharsInBuf -= NextLine - s_eol + 1; + s_eol = 0; + continue; + } + + /* Remove any line feed. Leave s_eol on the \0 */ + if (s_eol) { + *s_eol = '\0'; + if (s_eol > buf && *(s_eol-1) == '\r') + *(s_eol-1) = '\0'; + } + + if(!s_eol) + break; + + processRegEntry(line, TRUE); + line = s_eol + 1; + s_eol = 0; + continue; /* That is the full virtual line */ + } } -} -/****************************************************************************** - * This function is the main entry point to the unregisterDLL action. It - * receives the currently read line, then loads and unregisters the requested DLLs - */ -void doUnregisterDLL(LPSTR stdInput) -{ - HMODULE theLib = 0; - UINT retVal = 0; + processRegEntry(NULL, TRUE); - /* Check for valid input */ - if (stdInput == NULL) - return; - - /* Load and unregister the library, then free it */ - theLib = LoadLibraryA(stdInput); - if (theLib) { - FARPROC lpfnDLLRegProc = GetProcAddress(theLib, "DllUnregisterServer"); - if (lpfnDLLRegProc) - retVal = (*lpfnDLLRegProc)(); - else - fprintf(stderr,"%s: Couldn't find DllUnregisterServer proc in '%s'.\n", - getAppName(), stdInput); - - if (retVal != S_OK) - fprintf(stderr,"%s: DLLUnregisterServer error 0x%x in '%s'.\n", - getAppName(), retVal, stdInput); - - FreeLibrary(theLib); - } else { - fprintf(stderr,"%s: Could not load DLL '%s'.\n", getAppName(), stdInput); - } + HeapFree(GetProcessHeap(), 0, buf); } /**************************************************************************** @@ -860,7 +866,7 @@ static void REGPROC_print_error(void) exit(1); } puts(lpMsgBuf); - LocalFree((HLOCAL)lpMsgBuf); + LocalFree(lpMsgBuf); exit(1); } @@ -874,7 +880,7 @@ static void REGPROC_print_error(void) * required_len - length of the string to place to the buffer in characters. * The length does not include the terminating null character. */ -static void REGPROC_resize_char_buffer(CHAR **buffer, DWORD *len, DWORD required_len) +static void REGPROC_resize_char_buffer(WCHAR **buffer, DWORD *len, DWORD required_len) { required_len++; if (required_len > *len) { @@ -887,32 +893,156 @@ static void REGPROC_resize_char_buffer(CHAR **buffer, DWORD *len, DWORD required } } +/****************************************************************************** + * Same as REGPROC_resize_char_buffer() but on a regular buffer. + * + * Parameters: + * buffer - pointer to a buffer + * len - current size of the buffer in bytes + * required_size - size of the data to place in the buffer in bytes + */ +static void REGPROC_resize_binary_buffer(BYTE **buffer, DWORD *size, DWORD required_size) +{ + if (required_size > *size) { + *size = required_size; + if (!*buffer) + *buffer = HeapAlloc(GetProcessHeap(), 0, *size); + else + *buffer = HeapReAlloc(GetProcessHeap(), 0, *buffer, *size); + CHECK_ENOUGH_MEMORY(*buffer); + } +} + /****************************************************************************** * Prints string str to file */ -static void REGPROC_export_string(FILE *file, CHAR *str) +static void REGPROC_export_string(WCHAR **line_buf, DWORD *line_buf_size, DWORD *line_len, WCHAR *str, DWORD str_len) { - size_t len = strlen(str); - size_t i; + DWORD i, pos; + DWORD extra = 0; + + REGPROC_resize_char_buffer(line_buf, line_buf_size, *line_len + str_len + 10); /* escaping characters */ - for (i = 0; i < len; i++) { - CHAR c = str[i]; + pos = *line_len; + for (i = 0; i < str_len; i++) { + WCHAR c = str[i]; switch (c) { - case '\\': - fputs("\\\\", file); - break; - case '\"': - fputs("\\\"", file); - break; case '\n': - fputs("\\\n", file); + extra++; + REGPROC_resize_char_buffer(line_buf, line_buf_size, *line_len + str_len + extra); + (*line_buf)[pos++] = '\\'; + (*line_buf)[pos++] = 'n'; break; + + case '\\': + case '"': + extra++; + REGPROC_resize_char_buffer(line_buf, line_buf_size, *line_len + str_len + extra); + (*line_buf)[pos++] = '\\'; + /* Fall through */ + default: - fputc(c, file); + (*line_buf)[pos++] = c; break; } } + (*line_buf)[pos] = '\0'; + *line_len = pos; +} + +static void REGPROC_export_binary(WCHAR **line_buf, DWORD *line_buf_size, DWORD *line_len, DWORD type, BYTE *value, DWORD value_size, BOOL unicode) +{ + DWORD hex_pos, data_pos; + const WCHAR *hex_prefix; + const WCHAR hex[] = {'h','e','x',':',0}; + WCHAR hex_buf[17]; + const WCHAR concat[] = {'\\','\n',' ',' ',0}; + DWORD concat_prefix, concat_len; + const WCHAR newline[] = {'\n',0}; + CHAR* value_multibyte = NULL; + + if (type == REG_BINARY) { + hex_prefix = hex; + } else { + const WCHAR hex_format[] = {'h','e','x','(','%','u',')',':',0}; + hex_prefix = hex_buf; + wsprintfW(hex_buf, hex_format, type); + if ((type == REG_SZ || type == REG_EXPAND_SZ || type == REG_MULTI_SZ) && !unicode) + { + value_multibyte = GetMultiByteStringN((WCHAR*)value, value_size / sizeof(WCHAR), &value_size); + value = (BYTE*)value_multibyte; + } + } + + concat_len = lstrlenW(concat); + concat_prefix = 2; + + hex_pos = *line_len; + *line_len += lstrlenW(hex_prefix); + data_pos = *line_len; + *line_len += value_size * 3; + /* - The 2 spaces that concat places at the start of the + * line effectively reduce the space available for data. + * - If the value name and hex prefix are very long + * ( > REG_FILE_HEX_LINE_LEN) then we may overestimate + * the needed number of lines by one. But that's ok. + * - The trailing linefeed takes the place of a comma so + * it's accounted for already. + */ + *line_len += *line_len / (REG_FILE_HEX_LINE_LEN - concat_prefix) * concat_len; + REGPROC_resize_char_buffer(line_buf, line_buf_size, *line_len); + lstrcpyW(*line_buf + hex_pos, hex_prefix); + if (value_size) + { + const WCHAR format[] = {'%','0','2','x',0}; + DWORD i, column; + + column = data_pos; /* no line wrap yet */ + i = 0; + while (1) + { + wsprintfW(*line_buf + data_pos, format, (unsigned int)value[i]); + data_pos += 2; + if (++i == value_size) + break; + + (*line_buf)[data_pos++] = ','; + column += 3; + + /* wrap the line */ + if (column >= REG_FILE_HEX_LINE_LEN) { + lstrcpyW(*line_buf + data_pos, concat); + data_pos += concat_len; + column = concat_prefix; + } + } + } + lstrcpyW(*line_buf + data_pos, newline); + HeapFree(GetProcessHeap(), 0, value_multibyte); +} + +/****************************************************************************** + * Writes the given line to a file, in multi-byte or wide characters + */ +static void REGPROC_write_line(FILE *file, const WCHAR* str, BOOL unicode) +{ + int i; + if (unicode) + { + for(i = 0; str[i]; i++) + { + if (str[i] == L'\n') + fputwc(L'\r', file); + fputwc(str[i], file); + } + } + else + { + char* strA = GetMultiByteString(str); + fputs(strA, file); + HeapFree(GetProcessHeap(), 0, strA); + } } /****************************************************************************** @@ -923,18 +1053,20 @@ static void REGPROC_export_string(FILE *file, CHAR *str) * key - registry branch to export. * reg_key_name_buf - name of the key with registry class. * Is resized if necessary. - * reg_key_name_len - length of the buffer for the registry class in characters. + * reg_key_name_size - length of the buffer for the registry class in characters. * val_name_buf - buffer for storing value name. * Is resized if necessary. - * val_name_len - length of the buffer for storing value names in characters. + * val_name_size - length of the buffer for storing value names in characters. * val_buf - buffer for storing values while extracting. * Is resized if necessary. * val_size - size of the buffer for storing values in bytes. */ static void export_hkey(FILE *file, HKEY key, - CHAR **reg_key_name_buf, DWORD *reg_key_name_len, - CHAR **val_name_buf, DWORD *val_name_len, - BYTE **val_buf, DWORD *val_size) + WCHAR **reg_key_name_buf, DWORD *reg_key_name_size, + WCHAR **val_name_buf, DWORD *val_name_size, + BYTE **val_buf, DWORD *val_size, + WCHAR **line_buf, DWORD *line_buf_size, + BOOL unicode) { DWORD max_sub_key_len; DWORD max_val_name_len; @@ -943,112 +1075,124 @@ static void export_hkey(FILE *file, HKEY key, DWORD i; BOOL more_data; LONG ret; + WCHAR key_format[] = {'\n','[','%','s',']','\n',0}; /* get size information and resize the buffers if necessary */ - if (RegQueryInfoKey(key, NULL, NULL, NULL, NULL, + if (RegQueryInfoKeyW(key, NULL, NULL, NULL, NULL, &max_sub_key_len, NULL, NULL, &max_val_name_len, &max_val_size, NULL, NULL ) != ERROR_SUCCESS) { REGPROC_print_error(); } - curr_len = (DWORD) strlen(*reg_key_name_buf); - REGPROC_resize_char_buffer(reg_key_name_buf, reg_key_name_len, + curr_len = lstrlenW(*reg_key_name_buf); + REGPROC_resize_char_buffer(reg_key_name_buf, reg_key_name_size, max_sub_key_len + curr_len + 1); - REGPROC_resize_char_buffer(val_name_buf, val_name_len, + REGPROC_resize_char_buffer(val_name_buf, val_name_size, max_val_name_len); - if (max_val_size > *val_size) { - *val_size = max_val_size; - if (!*val_buf) *val_buf = HeapAlloc(GetProcessHeap(), 0, *val_size); - else *val_buf = HeapReAlloc(GetProcessHeap(), 0, *val_buf, *val_size); - CHECK_ENOUGH_MEMORY(val_buf); - } - + REGPROC_resize_binary_buffer(val_buf, val_size, max_val_size); + REGPROC_resize_char_buffer(line_buf, line_buf_size, lstrlenW(*reg_key_name_buf) + 4); /* output data for the current key */ - fputs("\n[", file); - fputs(*reg_key_name_buf, file); - fputs("]\n", file); + wsprintfW(*line_buf, key_format, *reg_key_name_buf); + REGPROC_write_line(file, *line_buf, unicode); + /* print all the values */ i = 0; more_data = TRUE; while(more_data) { DWORD value_type; - DWORD val_name_len1 = *val_name_len; + DWORD val_name_size1 = *val_name_size; DWORD val_size1 = *val_size; - ret = RegEnumValueA(key, i, *val_name_buf, &val_name_len1, NULL, - &value_type, *val_buf, &val_size1); - if (ret != ERROR_SUCCESS) { + ret = RegEnumValueW(key, i, *val_name_buf, &val_name_size1, NULL, + &value_type, *val_buf, &val_size1); + if (ret == ERROR_MORE_DATA) { + /* Increase the size of the buffers and retry */ + REGPROC_resize_char_buffer(val_name_buf, val_name_size, val_name_size1); + REGPROC_resize_binary_buffer(val_buf, val_size, val_size1); + } else if (ret != ERROR_SUCCESS) { more_data = FALSE; if (ret != ERROR_NO_MORE_ITEMS) { REGPROC_print_error(); } } else { + DWORD line_len; i++; if ((*val_name_buf)[0]) { - fputs("\"", file); - REGPROC_export_string(file, *val_name_buf); - fputs("\"=", file); + const WCHAR val_start[] = {'"','%','s','"','=',0}; + + line_len = 0; + REGPROC_export_string(line_buf, line_buf_size, &line_len, *val_name_buf, lstrlenW(*val_name_buf)); + REGPROC_resize_char_buffer(val_name_buf, val_name_size, lstrlenW(*line_buf) + 1); + lstrcpyW(*val_name_buf, *line_buf); + + line_len = 3 + lstrlenW(*val_name_buf); + REGPROC_resize_char_buffer(line_buf, line_buf_size, line_len); + wsprintfW(*line_buf, val_start, *val_name_buf); } else { - fputs("@=", file); + const WCHAR std_val[] = {'@','=',0}; + line_len = 2; + REGPROC_resize_char_buffer(line_buf, line_buf_size, line_len); + lstrcpyW(*line_buf, std_val); } switch (value_type) { case REG_SZ: - case REG_EXPAND_SZ: - fputs("\"", file); - REGPROC_export_string(file, (char*) *val_buf); - fputs("\"\n", file); + { + WCHAR* wstr = (WCHAR*)*val_buf; + + if (val_size1 < sizeof(WCHAR) || val_size1 % sizeof(WCHAR) || + wstr[val_size1 / sizeof(WCHAR) - 1]) { + REGPROC_export_binary(line_buf, line_buf_size, &line_len, value_type, *val_buf, val_size1, unicode); + } else { + const WCHAR start[] = {'"',0}; + const WCHAR end[] = {'"','\n',0}; + DWORD len; + + len = lstrlenW(start); + REGPROC_resize_char_buffer(line_buf, line_buf_size, line_len + len); + lstrcpyW(*line_buf + line_len, start); + line_len += len; + + /* At this point we know wstr is '\0'-terminated + * so we can substract 1 from the size + */ + REGPROC_export_string(line_buf, line_buf_size, &line_len, wstr, val_size1 / sizeof(WCHAR) - 1); + + REGPROC_resize_char_buffer(line_buf, line_buf_size, line_len + lstrlenW(end)); + lstrcpyW(*line_buf + line_len, end); + } break; + } case REG_DWORD: - fprintf(file, "dword:%08lx\n", *((DWORD *)*val_buf)); + { + WCHAR format[] = {'d','w','o','r','d',':','%','0','8','x','\n',0}; + + REGPROC_resize_char_buffer(line_buf, line_buf_size, line_len + 15); + wsprintfW(*line_buf + line_len, format, *((DWORD *)*val_buf)); break; + } default: + { + char* key_nameA = GetMultiByteString(*reg_key_name_buf); + char* value_nameA = GetMultiByteString(*val_name_buf); fprintf(stderr,"%s: warning - unsupported registry format '%ld', " "treat as binary\n", getAppName(), value_type); - fprintf(stderr,"key name: \"%s\"\n", *reg_key_name_buf); - fprintf(stderr,"value name:\"%s\"\n\n", *val_name_buf); + fprintf(stderr,"key name: \"%s\"\n", key_nameA); + fprintf(stderr,"value name:\"%s\"\n\n", value_nameA); + HeapFree(GetProcessHeap(), 0, key_nameA); + HeapFree(GetProcessHeap(), 0, value_nameA); + } /* falls through */ + case REG_EXPAND_SZ: case REG_MULTI_SZ: /* falls through */ - case REG_BINARY: { - DWORD i1; - const CHAR *hex_prefix; - CHAR buf[20]; - int cur_pos; - - if (value_type == REG_BINARY) { - hex_prefix = "hex:"; - } else { - hex_prefix = buf; - sprintf(buf, "hex(%ld):", value_type); - } - - /* position of where the next character will be printed */ - /* NOTE: yes, strlen("hex:") is used even for hex(x): */ - cur_pos = (int) (strlen("\"\"=") + strlen("hex:") + - strlen(*val_name_buf)); - - fputs(hex_prefix, file); - for (i1 = 0; i1 < val_size1; i1++) { - fprintf(file, "%02x", (unsigned int)(*val_buf)[i1]); - if (i1 + 1 < val_size1) { - fputs(",", file); - } - cur_pos += 3; - - /* wrap the line */ - if (cur_pos > REG_FILE_HEX_LINE_LEN) { - fputs("\\\n ", file); - cur_pos = 2; - } - } - fputs("\n", file); - break; - } + case REG_BINARY: + REGPROC_export_binary(line_buf, line_buf_size, &line_len, value_type, *val_buf, val_size1, unicode); } + REGPROC_write_line(file, *line_buf, unicode); } } @@ -1056,11 +1200,14 @@ static void export_hkey(FILE *file, HKEY key, more_data = TRUE; (*reg_key_name_buf)[curr_len] = '\\'; while(more_data) { - DWORD buf_len = *reg_key_name_len - curr_len; + DWORD buf_size = *reg_key_name_size - curr_len - 1; - ret = RegEnumKeyExA(key, i, *reg_key_name_buf + curr_len + 1, &buf_len, - NULL, NULL, NULL, NULL); - if (ret != ERROR_SUCCESS && ret != ERROR_MORE_DATA) { + ret = RegEnumKeyExW(key, i, *reg_key_name_buf + curr_len + 1, &buf_size, + NULL, NULL, NULL, NULL); + if (ret == ERROR_MORE_DATA) { + /* Increase the size of the buffer and retry */ + REGPROC_resize_char_buffer(reg_key_name_buf, reg_key_name_size, curr_len + 1 + buf_size); + } else if (ret != ERROR_SUCCESS) { more_data = FALSE; if (ret != ERROR_NO_MORE_ITEMS) { REGPROC_print_error(); @@ -1069,10 +1216,11 @@ static void export_hkey(FILE *file, HKEY key, HKEY subkey; i++; - if (RegOpenKeyA(key, *reg_key_name_buf + curr_len + 1, - &subkey) == ERROR_SUCCESS) { - export_hkey(file, subkey, reg_key_name_buf, reg_key_name_len, - val_name_buf, val_name_len, val_buf, val_size); + if (RegOpenKeyW(key, *reg_key_name_buf + curr_len + 1, + &subkey) == ERROR_SUCCESS) { + export_hkey(file, subkey, reg_key_name_buf, reg_key_name_size, + val_name_buf, val_name_size, val_buf, val_size, + line_buf, line_buf_size, unicode); RegCloseKey(subkey); } else { REGPROC_print_error(); @@ -1085,15 +1233,39 @@ static void export_hkey(FILE *file, HKEY key, /****************************************************************************** * Open file for export. */ -static FILE *REGPROC_open_export_file(const TCHAR *file_name) +static FILE *REGPROC_open_export_file(WCHAR *file_name, BOOL unicode) { - FILE *file = _tfopen(file_name, _T("w")); - if (!file) { - perror(""); -/* fprintf(stderr,"%s: Can't open file \"%s\"\n", getAppName(), file_name);*/ - exit(1); + FILE *file; + WCHAR dash = '-'; + + if (wcsncmp(file_name, &dash, 1) == 0) + file = stdout; + else + { + if (unicode) + file = _wfopen(file_name, L"wb"); + else + file = _wfopen(file_name, L"w"); + if (!file) { + CHAR* file_nameA = GetMultiByteString(file_name); + perror(""); + fprintf(stderr,"%s: Can't open file \"%s\"\n", getAppName(), file_nameA); + HeapFree(GetProcessHeap(), 0, file_nameA); + exit(1); + } } - fputs("REGEDIT4\n", file); + if (unicode) + { + const BYTE unicode_seq[] = {0xff,0xfe}; + const WCHAR header[] = L"Windows Registry Editor Version 5.00\r\n"; + fwrite(unicode_seq, sizeof(BYTE), COUNT_OF(unicode_seq), file); + fwrite(header, sizeof(WCHAR), lstrlenW(header), file); + } + else + { + fputs("REGEDIT4\n", file); + } + return file; } @@ -1105,77 +1277,84 @@ static FILE *REGPROC_open_export_file(const TCHAR *file_name) * reg_key_name - registry branch to export. The whole registry is exported if * reg_key_name is NULL or contains an empty string. */ -BOOL export_registry_key(const TCHAR *file_name, CHAR *reg_key_name) +BOOL export_registry_key(WCHAR *file_name, WCHAR *reg_key_name, DWORD format) { - HKEY reg_key_class; - - CHAR *reg_key_name_buf; - CHAR *val_name_buf; + WCHAR *reg_key_name_buf; + WCHAR *val_name_buf; BYTE *val_buf; - DWORD reg_key_name_len = KEY_MAX_LEN; - DWORD val_name_len = KEY_MAX_LEN; + WCHAR *line_buf; + DWORD reg_key_name_size = KEY_MAX_LEN; + DWORD val_name_size = KEY_MAX_LEN; DWORD val_size = REG_VAL_BUF_SIZE; + DWORD line_buf_size = KEY_MAX_LEN + REG_VAL_BUF_SIZE; FILE *file = NULL; + BOOL unicode = (format == REG_FORMAT_5); reg_key_name_buf = HeapAlloc(GetProcessHeap(), 0, - reg_key_name_len * sizeof(*reg_key_name_buf)); + reg_key_name_size * sizeof(*reg_key_name_buf)); val_name_buf = HeapAlloc(GetProcessHeap(), 0, - val_name_len * sizeof(*val_name_buf)); + val_name_size * sizeof(*val_name_buf)); val_buf = HeapAlloc(GetProcessHeap(), 0, val_size); - CHECK_ENOUGH_MEMORY(reg_key_name_buf && val_name_buf && val_buf); + line_buf = HeapAlloc(GetProcessHeap(), 0, line_buf_size * sizeof(*line_buf)); + CHECK_ENOUGH_MEMORY(reg_key_name_buf && val_name_buf && val_buf && line_buf); if (reg_key_name && reg_key_name[0]) { - CHAR *branch_name; + HKEY reg_key_class; + WCHAR *branch_name = NULL; HKEY key; - REGPROC_resize_char_buffer(®_key_name_buf, ®_key_name_len, - (DWORD) strlen(reg_key_name)); - strcpy(reg_key_name_buf, reg_key_name); + REGPROC_resize_char_buffer(®_key_name_buf, ®_key_name_size, + lstrlenW(reg_key_name)); + lstrcpyW(reg_key_name_buf, reg_key_name); /* open the specified key */ - if (!getRegClass(reg_key_name, ®_key_class)) { + if (!parseKeyName(reg_key_name, ®_key_class, &branch_name)) { + CHAR* key_nameA = GetMultiByteString(reg_key_name); fprintf(stderr,"%s: Incorrect registry class specification in '%s'\n", - getAppName(), reg_key_name); + getAppName(), key_nameA); + HeapFree(GetProcessHeap(), 0, key_nameA); exit(1); } - branch_name = getRegKeyName(reg_key_name); - CHECK_ENOUGH_MEMORY(branch_name); if (!branch_name[0]) { /* no branch - registry class is specified */ - file = REGPROC_open_export_file(file_name); + file = REGPROC_open_export_file(file_name, unicode); export_hkey(file, reg_key_class, - ®_key_name_buf, ®_key_name_len, - &val_name_buf, &val_name_len, - &val_buf, &val_size); - } else if (RegOpenKeyA(reg_key_class, branch_name, &key) == ERROR_SUCCESS) { - file = REGPROC_open_export_file(file_name); + ®_key_name_buf, ®_key_name_size, + &val_name_buf, &val_name_size, + &val_buf, &val_size, &line_buf, + &line_buf_size, unicode); + } else if (RegOpenKeyW(reg_key_class, branch_name, &key) == ERROR_SUCCESS) { + file = REGPROC_open_export_file(file_name, unicode); export_hkey(file, key, - ®_key_name_buf, ®_key_name_len, - &val_name_buf, &val_name_len, - &val_buf, &val_size); + ®_key_name_buf, ®_key_name_size, + &val_name_buf, &val_name_size, + &val_buf, &val_size, &line_buf, + &line_buf_size, unicode); RegCloseKey(key); } else { + CHAR* key_nameA = GetMultiByteString(reg_key_name); fprintf(stderr,"%s: Can't export. Registry key '%s' does not exist!\n", - getAppName(), reg_key_name); + getAppName(), key_nameA); + HeapFree(GetProcessHeap(), 0, key_nameA); REGPROC_print_error(); } - HeapFree(GetProcessHeap(), 0, branch_name); } else { unsigned int i; /* export all registry classes */ - file = REGPROC_open_export_file(file_name); + file = REGPROC_open_export_file(file_name, unicode); for (i = 0; i < REG_CLASS_NUMBER; i++) { /* do not export HKEY_CLASSES_ROOT */ if (reg_class_keys[i] != HKEY_CLASSES_ROOT && reg_class_keys[i] != HKEY_CURRENT_USER && reg_class_keys[i] != HKEY_CURRENT_CONFIG && reg_class_keys[i] != HKEY_DYN_DATA) { - strcpy(reg_key_name_buf, reg_class_names[i]); + lstrcpyW(reg_key_name_buf, reg_class_namesW[i]); export_hkey(file, reg_class_keys[i], - ®_key_name_buf, ®_key_name_len, - &val_name_buf, &val_name_len, - &val_buf, &val_size); + ®_key_name_buf, ®_key_name_size, + &val_name_buf, &val_name_size, + &val_buf, &val_size, &line_buf, + &line_buf_size, unicode); } } } @@ -1183,83 +1362,37 @@ BOOL export_registry_key(const TCHAR *file_name, CHAR *reg_key_name) if (file) { fclose(file); } + HeapFree(GetProcessHeap(), 0, reg_key_name); + HeapFree(GetProcessHeap(), 0, val_name_buf); HeapFree(GetProcessHeap(), 0, val_buf); + HeapFree(GetProcessHeap(), 0, line_buf); return TRUE; } /****************************************************************************** * Reads contents of the specified file into the registry. */ -BOOL import_registry_file(LPTSTR filename) +BOOL import_registry_file(FILE* reg_file) { - FILE* reg_file = _tfopen(filename, _T("r")); - - if (reg_file) { - unsigned char ch1 = fgetc(reg_file); - unsigned char ch2 = fgetc(reg_file); - - /* detect UTF-16.LE or UTF-16.BE format */ - if ((ch1 == 0xff && ch2 == 0xfe) || - (ch1 == 0xfe && ch2 == 0xff)) { - /* TODO: implement support for UNICODE files! */ - } else { - /* restore read point to the first line */ - fseek(reg_file, 0L, SEEK_SET); - processRegLines(reg_file, doSetValue); + if (reg_file) + { + BYTE s[2]; + if (fread( s, 2, 1, reg_file) == 1) + { + if (s[0] == 0xff && s[1] == 0xfe) + { + processRegLinesW(reg_file); + } else + { + fseek(reg_file, 0, SEEK_SET); + processRegLinesA(reg_file); + } } - fclose(reg_file); return TRUE; } return FALSE; } -/****************************************************************************** - * Recursive function which removes the registry key with all subkeys. - */ -static void delete_branch(HKEY key, - CHAR **reg_key_name_buf, DWORD *reg_key_name_len) -{ - HKEY branch_key; - DWORD max_sub_key_len; - DWORD subkeys; - DWORD curr_len; - LONG ret; - long int i; - - if (RegOpenKeyA(key, *reg_key_name_buf, &branch_key) != ERROR_SUCCESS) { - REGPROC_print_error(); - } - - /* get size information and resize the buffers if necessary */ - if (RegQueryInfoKey(branch_key, NULL, NULL, NULL, - &subkeys, &max_sub_key_len, - NULL, NULL, NULL, NULL, NULL, NULL - ) != ERROR_SUCCESS) { - REGPROC_print_error(); - } - curr_len = (DWORD) strlen(*reg_key_name_buf); - REGPROC_resize_char_buffer(reg_key_name_buf, reg_key_name_len, - max_sub_key_len + curr_len + 1); - - (*reg_key_name_buf)[curr_len] = '\\'; - for (i = subkeys - 1; i >= 0; i--) { - DWORD buf_len = *reg_key_name_len - curr_len; - - ret = RegEnumKeyExA(branch_key, i, *reg_key_name_buf + curr_len + 1, - &buf_len, NULL, NULL, NULL, NULL); - if (ret != ERROR_SUCCESS && - ret != ERROR_MORE_DATA && - ret != ERROR_NO_MORE_ITEMS) { - REGPROC_print_error(); - } else { - delete_branch(key, reg_key_name_buf, reg_key_name_len); - } - } - (*reg_key_name_buf)[curr_len] = '\0'; - RegCloseKey(branch_key); - RegDeleteKeyA(key, *reg_key_name_buf); -} - /****************************************************************************** * Removes the registry key with all subkeys. Parses full key name. * @@ -1267,265 +1400,28 @@ static void delete_branch(HKEY key, * reg_key_name - full name of registry branch to delete. Ignored if is NULL, * empty, points to register key class, does not exist. */ -void delete_registry_key(CHAR *reg_key_name) +void delete_registry_key(WCHAR *reg_key_name) { - CHAR *branch_name; - DWORD branch_name_len; - HKEY reg_key_class; - HKEY branch_key; + WCHAR *key_name = NULL; + HKEY key_class; if (!reg_key_name || !reg_key_name[0]) return; - /* open the specified key */ - if (!getRegClass(reg_key_name, ®_key_class)) { + + if (!parseKeyName(reg_key_name, &key_class, &key_name)) { + char* reg_key_nameA = GetMultiByteString(reg_key_name); fprintf(stderr,"%s: Incorrect registry class specification in '%s'\n", - getAppName(), reg_key_name); + getAppName(), reg_key_nameA); + HeapFree(GetProcessHeap(), 0, reg_key_nameA); exit(1); } - branch_name = getRegKeyName(reg_key_name); - CHECK_ENOUGH_MEMORY(branch_name); - branch_name_len = (DWORD) strlen(branch_name); - if (!branch_name[0]) { + if (!*key_name) { + char* reg_key_nameA = GetMultiByteString(reg_key_name); fprintf(stderr,"%s: Can't delete registry class '%s'\n", - getAppName(), reg_key_name); + getAppName(), reg_key_nameA); + HeapFree(GetProcessHeap(), 0, reg_key_nameA); exit(1); } - if (RegOpenKeyA(reg_key_class, branch_name, &branch_key) == ERROR_SUCCESS) { - /* check whether the key exists */ - RegCloseKey(branch_key); - delete_branch(reg_key_class, &branch_name, &branch_name_len); - } - HeapFree(GetProcessHeap(), 0, branch_name); + + SHDeleteKey(key_class, key_name); } - -/****************************************************************************** - * Sets the application name. Then application name is used in the error - * reporting. - */ -void setAppName(const CHAR *name) -{ - app_name = name; -} - -const CHAR *getAppName(void) -{ - return app_name; -} - -LONG RegCopyKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey) -{ - LONG lResult; - DWORD dwDisposition; - HKEY hDestSubKey = NULL; - HKEY hSrcSubKey = NULL; - DWORD dwIndex, dwType, cbName, cbData; - TCHAR szSubKey[256]; - TCHAR szValueName[256]; - BYTE szValueData[512]; - - FILETIME ft; - - /* open the source subkey, if specified */ - if (lpSrcSubKey) - { - lResult = RegOpenKeyEx(hSrcKey, lpSrcSubKey, 0, KEY_ALL_ACCESS, &hSrcSubKey); - if (lResult) - goto done; - hSrcKey = hSrcSubKey; - } - - /* create the destination subkey */ - lResult = RegCreateKeyEx(hDestKey, lpDestSubKey, 0, NULL, 0, KEY_WRITE, NULL, - &hDestSubKey, &dwDisposition); - if (lResult) - goto done; - - /* copy all subkeys */ - dwIndex = 0; - do - { - cbName = sizeof(szSubKey) / sizeof(szSubKey[0]); - lResult = RegEnumKeyEx(hSrcKey, dwIndex++, szSubKey, &cbName, NULL, NULL, NULL, &ft); - if (lResult == ERROR_SUCCESS) - { - lResult = RegCopyKey(hDestSubKey, szSubKey, hSrcKey, szSubKey); - if (lResult) - goto done; - } - } - while(lResult == ERROR_SUCCESS); - - /* copy all subvalues */ - dwIndex = 0; - do - { - cbName = sizeof(szValueName) / sizeof(szValueName[0]); - cbData = sizeof(szValueData) / sizeof(szValueData[0]); - lResult = RegEnumValue(hSrcKey, dwIndex++, szValueName, &cbName, NULL, &dwType, szValueData, &cbData); - if (lResult == ERROR_SUCCESS) - { - lResult = RegSetValueEx(hDestSubKey, szValueName, 0, dwType, szValueData, cbData); - if (lResult) - goto done; - } - } - while(lResult == ERROR_SUCCESS); - - lResult = ERROR_SUCCESS; - -done: - if (hSrcSubKey) - RegCloseKey(hSrcSubKey); - if (hDestSubKey) - RegCloseKey(hDestSubKey); - if (lResult != ERROR_SUCCESS) - SHDeleteKey(hDestKey, lpDestSubKey); - return lResult; - -} - -LONG RegMoveKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey) -{ - LONG lResult; - - if (!lpSrcSubKey) - return ERROR_INVALID_FUNCTION; - - lResult = RegCopyKey(hDestKey, lpDestSubKey, hSrcKey, lpSrcSubKey); - if (lResult == ERROR_SUCCESS) - SHDeleteKey(hSrcKey, lpSrcSubKey); - - return lResult; -} - -LONG RegRenameKey(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpNewName) -{ - LPCTSTR s; - LPTSTR lpNewSubKey = NULL; - LONG Ret = 0; - - if (!lpSubKey) - return Ret; - - s = _tcsrchr(lpSubKey, _T('\\')); - if (s) - { - s++; - lpNewSubKey = (LPTSTR) HeapAlloc(GetProcessHeap(), 0, (s - lpSubKey + _tcslen(lpNewName) + 1) * sizeof(TCHAR)); - if (lpNewSubKey != NULL) - { - memcpy(lpNewSubKey, lpSubKey, (s - lpSubKey) * sizeof(TCHAR)); - _tcscpy(lpNewSubKey + (s - lpSubKey), lpNewName); - lpNewName = lpNewSubKey; - } - else - return ERROR_NOT_ENOUGH_MEMORY; - } - - Ret = RegMoveKey(hKey, lpNewName, hKey, lpSubKey); - - if (lpNewSubKey) - { - HeapFree(GetProcessHeap(), 0, lpNewSubKey); - } - return Ret; -} - -LONG RegRenameValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpDestValue, LPCTSTR lpSrcValue) -{ - LONG lResult; - HKEY hSubKey = NULL; - DWORD dwType, cbData; - BYTE data[512]; - - if (lpSubKey) - { - lResult = RegOpenKey(hKey, lpSubKey, &hSubKey); - if (lResult != ERROR_SUCCESS) - goto done; - hKey = hSubKey; - } - - cbData = sizeof(data); - lResult = RegQueryValueEx(hKey, lpSrcValue, NULL, &dwType, data, &cbData); - if (lResult != ERROR_SUCCESS) - goto done; - - lResult = RegSetValueEx(hKey, lpDestValue, 0, dwType, data, cbData); - if (lResult != ERROR_SUCCESS) - goto done; - - RegDeleteValue(hKey, lpSrcValue); - -done: - if (hSubKey) - RegCloseKey(hSubKey); - return lResult; -} - -LONG RegQueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR pszBuffer, DWORD dwBufferLen) -{ - LONG lResult; - HKEY hSubKey = NULL; - DWORD cbData, dwType; - - if (lpSubKey) - { - lResult = RegOpenKey(hKey, lpSubKey, &hSubKey); - if (lResult != ERROR_SUCCESS) - goto done; - hKey = hSubKey; - } - - cbData = (dwBufferLen - 1) * sizeof(*pszBuffer); - lResult = RegQueryValueEx(hKey, lpValueName, NULL, &dwType, (LPBYTE) pszBuffer, &cbData); - if (lResult != ERROR_SUCCESS) - goto done; - if (dwType != REG_SZ) - { - lResult = -1; - goto done; - } - - pszBuffer[cbData / sizeof(*pszBuffer)] = '\0'; - -done: - if (lResult != ERROR_SUCCESS) - pszBuffer[0] = '\0'; - if (hSubKey) - RegCloseKey(hSubKey); - return lResult; -} - -/****************************************************************************** - * Key naming and parsing - */ - -BOOL RegKeyGetName(LPTSTR pszDest, size_t iDestLength, HKEY hRootKey, LPCTSTR lpSubKey) -{ - LPCTSTR pszRootKey; - - if (hRootKey == HKEY_CLASSES_ROOT) - pszRootKey = TEXT("HKEY_CLASSES_ROOT"); - else if (hRootKey == HKEY_CURRENT_USER) - pszRootKey = TEXT("HKEY_CURRENT_USER"); - else if (hRootKey == HKEY_LOCAL_MACHINE) - pszRootKey = TEXT("HKEY_LOCAL_MACHINE"); - else if (hRootKey == HKEY_USERS) - pszRootKey = TEXT("HKEY_USERS"); - else if (hRootKey == HKEY_CURRENT_CONFIG) - pszRootKey = TEXT("HKEY_CURRENT_CONFIG"); - else if (hRootKey == HKEY_DYN_DATA) - pszRootKey = TEXT("HKEY_DYN_DATA"); - else - return FALSE; - - if (lpSubKey[0]) - _sntprintf(pszDest, iDestLength, TEXT("%s\\%s"), pszRootKey, lpSubKey); - else - _sntprintf(pszDest, iDestLength, TEXT("%s"), pszRootKey); - return TRUE; -} - - - diff --git a/base/applications/regedit/regproc.h b/base/applications/regedit/regproc.h index aae3a4a969b..e6412459481 100644 --- a/base/applications/regedit/regproc.h +++ b/base/applications/regedit/regproc.h @@ -17,81 +17,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -/****************************************************************************** - * Defines and consts - */ #define KEY_MAX_LEN 1024 -/* Return values */ -#define SUCCESS 0 -#define KEY_VALUE_ALREADY_SET 2 +#define REG_FORMAT_5 1 +#define REG_FORMAT_4 2 -extern HINSTANCE hInst; - -typedef void (*CommandAPI)(LPSTR lpsLine); - -void doSetValue(LPSTR lpsLine); -void doDeleteValue(LPSTR lpsLine); -void doCreateKey(LPSTR lpsLine); -void doDeleteKey(LPSTR lpsLine); -void doRegisterDLL(LPSTR lpsLine); -void doUnregisterDLL(LPSTR lpsLine); - -BOOL export_registry_key(const TCHAR *file_name, CHAR *reg_key_name); -BOOL import_registry_file(LPTSTR filename); -void delete_registry_key(CHAR *reg_key_name); - -void setAppName(const CHAR *name); const CHAR *getAppName(void); -void processRegLines(FILE *in, CommandAPI command); - -/* - * Generic prototypes - */ -char* getToken(char** str, const char* delims); -void get_file_name(CHAR **command_line, CHAR *filename); -LPSTR convertHexToHexCSV( BYTE *buf, ULONG len); -LPSTR convertHexToDWORDStr( BYTE *buf, ULONG len); -LPSTR getRegKeyName(LPSTR lpLine); -BOOL getRegClass(LPSTR lpLine, HKEY* hkey); -DWORD getDataType(LPSTR *lpValue, DWORD* parse_type); -LPSTR getArg(LPSTR arg); -HRESULT openKey(LPSTR stdInput); -void closeKey(void); - -/* - * api setValue prototypes - */ -void processSetValue(LPSTR cmdline); -HRESULT setValue(LPSTR val_name, LPSTR val_data); - -/* - * Permission prototypes - */ - -BOOL InitializeAclUiDll(VOID); -VOID UnloadAclUiDll(VOID); -BOOL RegKeyEditPermissions(HWND hWndOwner, HKEY hKey, LPCTSTR lpMachine, LPCTSTR lpKeyName); - -/* - * Processing - */ -LONG RegCopyKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey); -LONG RegMoveKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey); -LONG RegRenameKey(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpNewName); -LONG RegRenameValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpDestValue, LPCTSTR lpSrcValue); -LONG RegQueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR pszBuffer, DWORD dwBufferLen); - -/* - * Miscellaneous - */ -#define RSF_WHOLESTRING 0x00000001 -#define RSF_LOOKATKEYS 0x00000002 -#define RSF_LOOKATVALUES 0x00000004 -#define RSF_LOOKATDATA 0x00000008 -#define RSF_MATCHCASE 0x00010000 - -BOOL RegKeyGetName(LPTSTR pszDest, size_t iDestLength, HKEY hRootKey, LPCTSTR lpSubKey); - -/* EOF */ +BOOL export_registry_key(WCHAR *file_name, WCHAR *reg_key_name, DWORD format); +BOOL import_registry_file(FILE* reg_file); +void delete_registry_key(LPTSTR reg_key_name); +WCHAR* GetWideString(const char* strA); +CHAR* GetMultiByteString(const WCHAR* strW); diff --git a/base/applications/sndrec32/lang/sk-SK.rc b/base/applications/sndrec32/lang/sk-SK.rc index 329c327037b..6cad3a40f5b 100644 --- a/base/applications/sndrec32/lang/sk-SK.rc +++ b/base/applications/sndrec32/lang/sk-SK.rc @@ -1,6 +1,6 @@ /* TRANSLATOR : M疵io Ka鑪疵 /Mario Kacmar/ aka Kario (kario@szm.sk) * DATE OF TR.: 13-12-2009 - * LAST UPDATE: xx-xx-xxxx + * LAST UPDATE: 26-07-2010 */ LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT @@ -46,3 +46,14 @@ BEGIN IDS_APP_TITLE "reactOS_sndrec32" IDC_REACTOS_SNDREC32 "REACTOS_SNDREC32" END + +STRINGTABLE +BEGIN + IDS_STRPOS "Pozcia: %.2f s" + IDS_STRDUR "D蝙ka: %.2f s" + IDS_STRBUF "Buffer: %.2f kb" //Vyrovn疱acia pam茉 + IDS_STRFMT "%.1f kHz %u bitov" + IDS_STRMONO "mono" + IDS_STRSTEREO "stereo" + IDS_STRCHAN "%s" +END diff --git a/base/applications/winhlp32/Bg.rc b/base/applications/winhlp32/Bg.rc index ee9c07bbe71..191b5d0f78d 100644 --- a/base/applications/winhlp32/Bg.rc +++ b/base/applications/winhlp32/Bg.rc @@ -63,16 +63,13 @@ MAIN_MENU MENU MENUITEM "ツ竟璢 &胛", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&ネ璋...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&ホ WINE", MNID_HELP_WINE -#endif } } /* Strings */ STRINGTABLE { -STID_WINE_HELP, "WINE マ" +STID_WINE_HELP, "Wine マ" STID_WHERROR, "テミナリハタ" STID_WARNING, "マミナトモマミナニトナヘネナ" STID_INFO, "ネ璋" diff --git a/base/applications/winhlp32/Cs.rc b/base/applications/winhlp32/Cs.rc index 7b89d24dc3c..16fc70be2c1 100644 --- a/base/applications/winhlp32/Cs.rc +++ b/base/applications/winhlp32/Cs.rc @@ -68,16 +68,13 @@ MAIN_MENU MENU MENUITEM "V枦y na &vrchu", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Informace...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "O &WINE", MNID_HELP_WINE -#endif } } /* Strings */ STRINGTABLE { -STID_WINE_HELP, "N疳ovda WINE" +STID_WINE_HELP, "N疳ovda Wine" STID_WHERROR, "CHYBA" STID_WARNING, "VAROVチNヘ" STID_INFO, "Informace" diff --git a/base/applications/winhlp32/Da.rc b/base/applications/winhlp32/Da.rc index 4db0268522e..7b2b6d114c7 100644 --- a/base/applications/winhlp32/Da.rc +++ b/base/applications/winhlp32/Da.rc @@ -68,9 +68,6 @@ MAIN_MENU MENU MENUITEM "Altid &テクverst", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Information...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "Om &Wine", MNID_HELP_WINE -#endif } } diff --git a/base/applications/winhlp32/De.rc b/base/applications/winhlp32/De.rc index a5d2e3c8190..f2bb638dea8 100644 --- a/base/applications/winhlp32/De.rc +++ b/base/applications/winhlp32/De.rc @@ -66,9 +66,6 @@ MAIN_MENU MENU MENUITEM "Immer im &Vordergrund", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Info...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&テ彙er WINE", MNID_HELP_WINE -#endif } } @@ -92,7 +89,7 @@ CAPTION "Suche" STRINGTABLE { -STID_WINE_HELP, "WINE Hilfe" +STID_WINE_HELP, "Wine Hilfe" STID_WHERROR, "FEHLER" STID_WARNING, "ACHTUNG" STID_INFO, "Information" diff --git a/base/applications/winhlp32/En.rc b/base/applications/winhlp32/En.rc index 7526d1c71ed..6d987dbc7aa 100644 --- a/base/applications/winhlp32/En.rc +++ b/base/applications/winhlp32/En.rc @@ -63,10 +63,7 @@ MAIN_MENU MENU MENUITEM "Help &on help", MNID_HELP_HELPON MENUITEM "Always on &top", MNID_HELP_HELPTOP MENUITEM SEPARATOR - MENUITEM "&Info...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&About Wine", MNID_HELP_WINE -#endif + MENUITEM "&About Wine Help", MNID_HELP_ABOUT } } @@ -110,10 +107,7 @@ MAIN_MENU MENU MENUITEM "Help &on help", MNID_HELP_HELPON MENUITEM "Always on &top", MNID_HELP_HELPTOP MENUITEM SEPARATOR - MENUITEM "&Info...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&About Wine", MNID_HELP_WINE -#endif + MENUITEM "&About Wine Help", MNID_HELP_ABOUT } } diff --git a/base/applications/winhlp32/Es.rc b/base/applications/winhlp32/Es.rc index f39ddbde6b9..940585e653d 100644 --- a/base/applications/winhlp32/Es.rc +++ b/base/applications/winhlp32/Es.rc @@ -65,9 +65,6 @@ MAIN_MENU MENU MENUITEM "&Siempre visible", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Info...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&Acerca de WINE", MNID_HELP_WINE -#endif } } @@ -90,7 +87,7 @@ CAPTION "Buscar" /* Strings */ STRINGTABLE { -STID_WINE_HELP, "Ayuda de WINE" +STID_WINE_HELP, "Ayuda de Wine" STID_WHERROR, "ERROR" STID_WARNING, "ADVERTENCIA" STID_INFO, "Informacin" diff --git a/base/applications/winhlp32/Fi.rc b/base/applications/winhlp32/Fi.rc index bb6b7848153..eb5a95283bb 100644 --- a/base/applications/winhlp32/Fi.rc +++ b/base/applications/winhlp32/Fi.rc @@ -65,9 +65,6 @@ MAIN_MENU MENU MENUITEM "&Aina p蒿llimm臺sen", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "T&ietoja...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&Tietoja WINEst", MNID_HELP_WINE -#endif } } @@ -75,7 +72,7 @@ MAIN_MENU MENU STRINGTABLE { -STID_WINE_HELP, "WINE Ohje" +STID_WINE_HELP, "Wine Ohje" STID_WHERROR, "VIRHE" STID_WARNING, "VAROITUS" STID_INFO, "Tietoja" diff --git a/base/applications/winhlp32/Fr.rc b/base/applications/winhlp32/Fr.rc index 4178810588c..2b8ea8f6200 100644 --- a/base/applications/winhlp32/Fr.rc +++ b/base/applications/winhlp32/Fr.rc @@ -69,10 +69,7 @@ MAIN_MENU MENU MENUITEM "&Utiliser l'aide", MNID_HELP_HELPON MENUITEM "&Toujours visible", MNID_HELP_HELPTOP MENUITEM SEPARATOR - MENUITEM "&Info...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "テ &propos de Wine", MNID_HELP_WINE -#endif + MENUITEM "&A propos de l'Aide de Wine", MNID_HELP_ABOUT } } diff --git a/base/applications/winhlp32/He.rc b/base/applications/winhlp32/He.rc new file mode 100644 index 00000000000..2b9da4631a9 --- /dev/null +++ b/base/applications/winhlp32/He.rc @@ -0,0 +1,131 @@ +/* + * Help Viewer (Hebrew resources) + * + * Copyright 1996 Ulrich Schmid + * Copyright 2002 Sylvain Petreolle + * Copyright 2010 Yaron Shahrabani + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "winhelp_res.h" + +#pragma code_page(65001) + +/* Menu */ + +LANGUAGE LANG_HEBREW, SUBLANG_DEFAULT + +MAIN_MENU MENU +{ + POPUP "&ラァラ勉泰・" { + MENUITEM "&ラ、ラェラ燮隣", MNID_FILE_OPEN + MENUITEM SEPARATOR + MENUITEM "ラ&ラ沌、ラ。ラ", MNID_FILE_PRINT + MENUITEM "ラ&ラ潰沌ィラェ ラ蕃槞沌、ラ。ラェ...", MNID_FILE_SETUP + MENUITEM SEPARATOR + MENUITEM "ラ&ラヲラ燮碩", MNID_FILE_EXIT + } + POPUP "ラ「&ラィラ燮嶼" { + MENUITEM "ラ&ラ「ラェラァラ...", MNID_EDIT_COPYDLG + MENUITEM SEPARATOR + MENUITEM "ラ蕃勉。ラ、ラェ ラ蕃「&ラィラ勉ェ...", MNID_EDIT_ANNOTATE + } + POPUP "&ラ。ラ燮槞ラ燮" { + MENUITEM "ラ&ラ潰沌ィラ...", MNID_BKMK_DEFINE + } + POPUP "&ラ碩、ラゥラィラ勉燮勉ェ" { + POPUP "ラ蕃「ラ儲ィラ ラ潰慵勉燮 ラェラ槞燮" + BEGIN + MENUITEM "ラ泰ィラィラェ ラ槞隣沌", MNID_OPTS_HELP_DEFAULT + MENUITEM "ラ潰慵勉燮", MNID_OPTS_HELP_VISIBLE + MENUITEM "ラ槞勉。ラェラィラェ", MNID_OPTS_HELP_NONVISIBLE + END + MENUITEM "ラ蕃燮。ラ俎勉ィラ燮", MNID_OPTS_HISTORY + POPUP "ラ潰勉、ララ燮" + BEGIN + MENUITEM "ラァラ俎ラ燮", MNID_OPTS_FONTS_SMALL + MENUITEM "ラィラ潰燮慵燮", MNID_OPTS_FONTS_NORMAL + MENUITEM "ラ潰沌勉慵燮", MNID_OPTS_FONTS_LARGE + END + MENUITEM "ラゥラ燮槞勉ゥ ラ泰ヲラ泰「ラ ラ蕃槞「ラィラ嶼ェ", MNID_OPTS_SYSTEM_COLORS + } + POPUP "ラ「&ラ儲ィラ" { + MENUITEM "ラ「ラ儲ィラ ラ「&ラ ラ蕃「ラ儲ィラ", MNID_HELP_HELPON + MENUITEM "ラェラ槞燮 &ラ「ラ慵燮勉", MNID_HELP_HELPTOP + MENUITEM SEPARATOR + MENUITEM "&ラ槞燮沌「...", MNID_HELP_ABOUT + } +} + +IDD_INDEX DIALOG 0, 0, 200, 190 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_LAYOUTRTL +FONT 8, "MS Shell Dlg" +CAPTION "ラ槞、ラェラ" +{ + LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER +} + +IDD_SEARCH DIALOG 0, 0, 200, 190 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_LAYOUTRTL +FONT 8, "MS Shell Dlg" +CAPTION "ラ隣燮、ラ勉ゥ" +{ + LTEXT "ラ慵 ラ槞勉俎槞「 ラ「ラ沌燮燮", -1, 10, 10, 180, 150 +} + +/* Strings */ +STRINGTABLE +{ +STID_WINE_HELP, "ラ蕃「ラ儲ィラ ラゥラ Wine" +STID_WHERROR, "ラゥラ潰燮碩" +STID_WARNING, "ラ碩儲蕃ィラ" +STID_INFO, "ラ槞燮沌「" +STID_NOT_IMPLEMENTED, "ラ慵 ラ槞勉俎槞「" +STID_HLPFILE_ERROR_s, "ラ碩燮ィラ「ラ ラゥラ潰燮碩 ラ泰「ラェ ラァラィラ燮碩ェ ラァラ勉泰・ ラ蕃「ラ儲ィラ `%s'" +STID_INDEX, "ラ&ラ、ラェラ" +STID_CONTENTS, "ラェラァラヲラ燮ィ" +STID_BACK, "&ラ隣儲ィラ" +STID_ALL_FILES, "ラ嶼 ラ蕃ァラ泰ヲラ燮 (*.*)" +STID_HELP_FILES_HLP, "ラァラ勉泰ヲラ ラ「ラ儲ィラ (*.hlp)" +STID_FILE_NOT_FOUND_s "ラ慵 ララ燮ェラ ラ慵槞ヲラ勉 ラ碩ェ '%s'. ラ蕃碩 ラ泰ィラヲラ勉ラ ラ慵槞ヲラ勉 ラァラ勉泰・ ラ儲 ラ泰「ラヲラ槞?" +STID_NO_RICHEDIT "ラ慵 ララ燮ェラ ラ慵槞ヲラ勉 ラ燮燮ゥラ勉 ラゥラ richedit... ラ蕃ェラ嶼ラ燮ェ ラェラヲラ" +STID_PSH_INDEX, "ララ勉ゥラ碩 ラ蕃「ラ儲ィラ: " +} + +CONTEXT_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "ラ蕃「ラィラ勉ェ...", MNID_CTXT_ANNOTATE + MENUITEM "ラ蕃「ラェラァラ", MNID_CTXT_COPY + MENUITEM "ラ蕃沌、ラ。ラ...", MNID_CTXT_PRINT + POPUP "ラ潰勉、ララ燮" + BEGIN + MENUITEM "ラァラ俎ラ燮", MNID_CTXT_FONTS_SMALL + MENUITEM "ラィラ潰燮慵燮", MNID_CTXT_FONTS_NORMAL + MENUITEM "ラ潰沌勉慵燮", MNID_CTXT_FONTS_LARGE + END + POPUP "ラ蕃「ラ儲ィラ ラェラ槞燮 ラ儲槞燮ラ" + BEGIN + MENUITEM "ラ泰ィラィラェ ラ槞隣沌", MNID_CTXT_HELP_DEFAULT + MENUITEM "ラ潰慵勉燮", MNID_CTXT_HELP_VISIBLE + MENUITEM "ラ槞勉。ラェラィラェ", MNID_CTXT_HELP_NONVISIBLE + END + MENUITEM "ラゥラ燮槞勉ゥ ラ泰ヲラ泰「ラ ラ蕃槞「ラィラ嶼ェ", MNID_CTXT_SYSTEM_COLORS + END +END diff --git a/base/applications/winhlp32/Hu.rc b/base/applications/winhlp32/Hu.rc index 4fccbebccd2..7699677b1e2 100644 --- a/base/applications/winhlp32/Hu.rc +++ b/base/applications/winhlp32/Hu.rc @@ -65,9 +65,6 @@ MAIN_MENU MENU MENUITEM "Mindig &legfell", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Inform當i...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&&A WINE-rl", MNID_HELP_WINE -#endif } } @@ -75,7 +72,7 @@ MAIN_MENU MENU STRINGTABLE { -STID_WINE_HELP, "WINE sg" +STID_WINE_HELP, "Wine sg" STID_WHERROR, "HIBA" STID_WARNING, "FIGYELMEZTETノS" STID_INFO, "Inform當i" diff --git a/base/applications/winhlp32/It.rc b/base/applications/winhlp32/It.rc index b146b1009c1..f0dfd0c8573 100644 --- a/base/applications/winhlp32/It.rc +++ b/base/applications/winhlp32/It.rc @@ -21,10 +21,11 @@ #include "winhelp_res.h" -LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL - +/* UTF-8 */ #pragma code_page(65001) +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + /* Menu */ MAIN_MENU MENU @@ -55,20 +56,17 @@ MAIN_MENU MENU MENUITEM "Cronologia", MNID_OPTS_HISTORY POPUP "Caratteri" BEGIN - MENUITEM "Piccolo", MNID_OPTS_FONTS_SMALL - MENUITEM "Normale", MNID_OPTS_FONTS_NORMAL - MENUITEM "Grande", MNID_OPTS_FONTS_LARGE + MENUITEM "Piccoli", MNID_OPTS_FONTS_SMALL + MENUITEM "Normali", MNID_OPTS_FONTS_NORMAL + MENUITEM "Grandi", MNID_OPTS_FONTS_LARGE END - MENUITEM "Usa colori di sistema", MNID_OPTS_SYSTEM_COLORS + MENUITEM "Usa i colori di sistema", MNID_OPTS_SYSTEM_COLORS } POPUP "&Aiuto" { MENUITEM "&Aiuto sulla guida", MNID_HELP_HELPON MENUITEM "Sempre in primo &piano", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Informazioni su...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&Informazioni su WINE", MNID_HELP_WINE -#endif } } @@ -91,7 +89,7 @@ CAPTION "Cerca" /* Strings */ STRINGTABLE { -STID_WINE_HELP, "Guida di WINE" +STID_WINE_HELP, "Guida di Wine" STID_WHERROR, "ERRORE" STID_WARNING, "ATTENZIONE" STID_INFO, "Informazione" @@ -101,7 +99,7 @@ STID_INDEX, "Indice" STID_CONTENTS, "&Sommario" STID_BACK, "&Precedente" STID_ALL_FILES, "Tutti i file (*.*)" -STID_HELP_FILES_HLP, "File della Guida (*.hlp)" +STID_HELP_FILES_HLP, "File della guida (*.hlp)" STID_FILE_NOT_FOUND_s "Non ティ stato possibile trovare '%s'. Vuoi cercare questo file?" STID_NO_RICHEDIT "Non ティ stato possibile trovare un'implementazione richedit... Annullando" STID_PSH_INDEX, "Argomenti di aiuto: " @@ -116,13 +114,13 @@ BEGIN MENUITEM "Stampa...", MNID_CTXT_PRINT POPUP "Caratteri" BEGIN - MENUITEM "Piccolo", MNID_CTXT_FONTS_SMALL - MENUITEM "Normale", MNID_CTXT_FONTS_NORMAL - MENUITEM "Grande", MNID_CTXT_FONTS_LARGE + MENUITEM "Piccoli", MNID_CTXT_FONTS_SMALL + MENUITEM "Normali", MNID_CTXT_FONTS_NORMAL + MENUITEM "Grandi", MNID_CTXT_FONTS_LARGE END POPUP "Aiuto sempre visibile" BEGIN - MENUITEM "Default", MNID_CTXT_HELP_DEFAULT + MENUITEM "Predefinito", MNID_CTXT_HELP_DEFAULT MENUITEM "Visibile", MNID_CTXT_HELP_VISIBLE MENUITEM "Non visibile", MNID_CTXT_HELP_NONVISIBLE END diff --git a/base/applications/winhlp32/Ja.rc b/base/applications/winhlp32/Ja.rc index 8d3f3542575..a93e5a3b5e9 100644 --- a/base/applications/winhlp32/Ja.rc +++ b/base/applications/winhlp32/Ja.rc @@ -67,9 +67,6 @@ MAIN_MENU MENU MENUITEM "蟶ク縺ォ謇句燕縺ォ陦ィ遉コ(&T)", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "諠蝣ア(&I)...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "WINE 縺ォ縺、縺縺ヲ(&A)", MNID_HELP_WINE -#endif } } @@ -92,7 +89,7 @@ CAPTION "讀懃エ「" /* Strings */ STRINGTABLE { -STID_WINE_HELP, "WINE 繝倥Ν繝" +STID_WINE_HELP, "Wine 繝倥Ν繝" STID_WHERROR, "繧ィ繝ゥ繝シ" STID_WARNING, "隴ヲ蜻" STID_INFO, "諠蝣ア" diff --git a/base/applications/winhlp32/Ko.rc b/base/applications/winhlp32/Ko.rc index e4eff0ba0b3..32b32b21865 100644 --- a/base/applications/winhlp32/Ko.rc +++ b/base/applications/winhlp32/Ko.rc @@ -64,9 +64,6 @@ MAIN_MENU MENU MENUITEM "ヌラサ タァ(&T)", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "チ、コク(&I)...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "Wineソ。 ーヌマソゥ(&A)", MNID_HELP_WINE -#endif } } diff --git a/base/applications/winhlp32/Lt.rc b/base/applications/winhlp32/Lt.rc index b6ee9c792fb..195740c3e3c 100644 --- a/base/applications/winhlp32/Lt.rc +++ b/base/applications/winhlp32/Lt.rc @@ -66,9 +66,6 @@ MAIN_MENU MENU MENUITEM "&Visada virナ。uje", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Informacija...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&Apie Wine", MNID_HELP_WINE -#endif } } diff --git a/base/applications/winhlp32/Nl.rc b/base/applications/winhlp32/Nl.rc index 228667df4ba..08860098f3f 100644 --- a/base/applications/winhlp32/Nl.rc +++ b/base/applications/winhlp32/Nl.rc @@ -66,9 +66,6 @@ MAIN_MENU MENU MENUITEM "Altijd &zichtbaar", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Info...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&Over Wine", MNID_HELP_WINE -#endif } } diff --git a/base/applications/winhlp32/No.rc b/base/applications/winhlp32/No.rc index 141ad3a1b84..a18dbc4f19e 100644 --- a/base/applications/winhlp32/No.rc +++ b/base/applications/winhlp32/No.rc @@ -63,9 +63,6 @@ MAIN_MENU MENU MENUITEM "All&tid verst", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Informasjon...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&Om Wine", MNID_HELP_WINE -#endif } } diff --git a/base/applications/winhlp32/Pl.rc b/base/applications/winhlp32/Pl.rc index 2a561f2c0b8..fb2114d754b 100644 --- a/base/applications/winhlp32/Pl.rc +++ b/base/applications/winhlp32/Pl.rc @@ -66,9 +66,6 @@ MAIN_MENU MENU MENUITEM "&Zawsze na wierzchu", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&O programie...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&O programie WINE", MNID_HELP_WINE -#endif } } @@ -91,7 +88,7 @@ CAPTION "Szukaj" /* Strings */ STRINGTABLE { -STID_WINE_HELP, "WINE - Pomoc" +STID_WINE_HELP, "Wine - Pomoc" STID_WHERROR, "B」・D" STID_WARNING, "OSTRZEッENIE" STID_INFO, "Informacja" diff --git a/base/applications/winhlp32/Pt.rc b/base/applications/winhlp32/Pt.rc index 4b62a5fbb19..86216754128 100644 --- a/base/applications/winhlp32/Pt.rc +++ b/base/applications/winhlp32/Pt.rc @@ -72,9 +72,6 @@ MAIN_MENU MENU MENUITEM "Sempre &visテュvel", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Informaテァテオes...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&Sobre o WINE", MNID_HELP_WINE -#endif } } @@ -119,9 +116,6 @@ MAIN_MENU MENU MENUITEM "Sempre &visテュvel", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Informaテァテオes...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&Acerca do WINE", MNID_HELP_WINE -#endif } } @@ -149,7 +143,7 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN STRINGTABLE { -STID_WINE_HELP, "Ajuda WINE" +STID_WINE_HELP, "Ajuda Wine" STID_WHERROR, "ERRO" STID_WARNING, "AVISO" STID_INFO, "Informaテァテ」o" @@ -169,7 +163,7 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE STRINGTABLE { -STID_WINE_HELP, "Ajuda WINE" +STID_WINE_HELP, "Ajuda Wine" STID_WHERROR, "ERRO" STID_WARNING, "AVISO" STID_INFO, "Informaテァテ」o" diff --git a/base/applications/winhlp32/Rm.rc b/base/applications/winhlp32/Rm.rc index a5462b87a32..60403f02d79 100644 --- a/base/applications/winhlp32/Rm.rc +++ b/base/applications/winhlp32/Rm.rc @@ -70,16 +70,13 @@ MAIN_MENU MENU MENUITEM "Adソスna da&vant", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "I&nfuormaziuns", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "Davart &Wine", MNID_HELP_WINE -#endif } } /* Strings */ STRINGTABLE { -STID_WINE_HELP, "WINE agソスd" +STID_WINE_HELP, "Wine agソスd" STID_WHERROR, "SBAGL" STID_WARNING, "ATTENZIUN" STID_INFO, "INFUORMAZIUN" diff --git a/base/applications/winhlp32/Ro.rc b/base/applications/winhlp32/Ro.rc index 845b1cc5754..69b088fef2a 100644 --- a/base/applications/winhlp32/Ro.rc +++ b/base/applications/winhlp32/Ro.rc @@ -67,9 +67,6 @@ MAIN_MENU MENU MENUITEM "テ始&totdeauna deasupra", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Informaネ嬖i...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&Despre Wine", MNID_HELP_WINE -#endif } } diff --git a/base/applications/winhlp32/Ru.rc b/base/applications/winhlp32/Ru.rc index f8bc3cbe924..456f7e2b168 100644 --- a/base/applications/winhlp32/Ru.rc +++ b/base/applications/winhlp32/Ru.rc @@ -66,9 +66,6 @@ MAIN_MENU MENU MENUITEM "ミ柘ミオミウミエミー &ムミイミオムムム", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&ミ侑スムミセムミシミームミクム...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&ミ Wine", MNID_HELP_WINE -#endif } } @@ -91,7 +88,7 @@ CAPTION "ミ渙セミクムミコ" /* Strings */ STRINGTABLE { -STID_WINE_HELP, "ミ。ミソムミーミイミコミー WINE" +STID_WINE_HELP, "ミ。ミソムミーミイミコミー Wine" STID_WHERROR, "ミ榧ィミ侑岱墟" STID_WARNING, "ミ漬斷侑慴籍斷侑" STID_INFO, "ミ侑スムミセムミシミームミクム" diff --git a/base/applications/winhlp32/Si.rc b/base/applications/winhlp32/Si.rc index 340b9414551..023b28a984a 100644 --- a/base/applications/winhlp32/Si.rc +++ b/base/applications/winhlp32/Si.rc @@ -65,9 +65,6 @@ MAIN_MENU MENU MENUITEM "Vedno na &vrhu", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Informacije ...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&O WINE", MNID_HELP_WINE -#endif } } @@ -90,7 +87,7 @@ CAPTION "Iskanje" /* Strings */ STRINGTABLE { -STID_WINE_HELP, "WINE Pomoト" +STID_WINE_HELP, "Wine Pomoト" STID_WHERROR, "NAPAKA" STID_WARNING, "OPOZORILO" STID_INFO, "Informacija" diff --git a/base/applications/winhlp32/Sk.rc b/base/applications/winhlp32/Sk.rc index 773f5405e9d..d1abcff02c7 100644 --- a/base/applications/winhlp32/Sk.rc +++ b/base/applications/winhlp32/Sk.rc @@ -61,16 +61,13 @@ MAIN_MENU MENU MENUITEM "V枦y na &vrchu", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Info...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "O& WINE", MNID_HELP_WINE -#endif } } /* Strings */ STRINGTABLE { -STID_WINE_HELP, "WINE Pomoc" +STID_WINE_HELP, "Wine Pomoc" STID_WHERROR, "CHYBA" STID_WARNING, "VAROVANIE" STID_INFO, "Inform當ie" diff --git a/base/applications/winhlp32/Sr.rc b/base/applications/winhlp32/Sr.rc new file mode 100644 index 00000000000..a33e75adfce --- /dev/null +++ b/base/applications/winhlp32/Sr.rc @@ -0,0 +1,128 @@ +/* + * Help Viewer + * + * Copyright 2010 Nenad Vujic + * Paul Vriens + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "winhelp_res.h" + +#pragma code_page(65001) + +/* Menu */ + +LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN + +MAIN_MENU MENU +{ + POPUP "&Fajl" { + MENUITEM "&Otvori", MNID_FILE_OPEN + MENUITEM SEPARATOR + MENUITEM "&ナtampaj", MNID_FILE_PRINT + MENUITEM "ナtampaト &podeナ。avanje...", MNID_FILE_SETUP + MENUITEM SEPARATOR + MENUITEM "I&zlaz", MNID_FILE_EXIT + } + POPUP "&Izmeni" { + MENUITEM "&Kopiraj...", MNID_EDIT_COPYDLG + MENUITEM SEPARATOR + MENUITEM "&Pribeleナセi...", MNID_EDIT_ANNOTATE + } + POPUP "&Oznaト絞" { + MENUITEM "&Odredi...", MNID_BKMK_DEFINE + } + POPUP "&Opcije" { + POPUP "Pomoト uvek vidljiva" + BEGIN + MENUITEM "Osnovno", MNID_OPTS_HELP_DEFAULT + MENUITEM "Vidljivo", MNID_OPTS_HELP_VISIBLE + MENUITEM "Nije vidljivo", MNID_OPTS_HELP_NONVISIBLE + END + MENUITEM "Istorija", MNID_OPTS_HISTORY + POPUP "Fontovi" + BEGIN + MENUITEM "Mali", MNID_OPTS_FONTS_SMALL + MENUITEM "Normalan", MNID_OPTS_FONTS_NORMAL + MENUITEM "Veliki", MNID_OPTS_FONTS_LARGE + END + MENUITEM "Koristi sistenske boje", MNID_OPTS_SYSTEM_COLORS + } + POPUP "&Pomoト" { + MENUITEM "Pomoト &na pomoトi", MNID_HELP_HELPON + MENUITEM "Uvek na &vrhu", MNID_HELP_HELPTOP + MENUITEM SEPARATOR + MENUITEM "&Info...", MNID_HELP_ABOUT + } +} + +IDD_INDEX DIALOG 0, 0, 200, 190 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "Index" +{ + LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER +} + +IDD_SEARCH DIALOG 0, 0, 200, 190 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "Traナセi" +{ + LTEXT "Not implemented yet", -1, 10, 10, 180, 150 +} + +/* Strings */ +STRINGTABLE +{ +STID_WINE_HELP, "Wine Pomoト" +STID_WHERROR, "GREナKA" +STID_WARNING, "UPOZORENJE" +STID_INFO, "Informacija" +STID_NOT_IMPLEMENTED, "Nije jos u programu" +STID_HLPFILE_ERROR_s, "Greナ。ka tokom ト絞tanja pomoトnog fajla `%s'" +STID_INDEX, "&Index" +STID_CONTENTS, "Pregled" +STID_BACK, "&Nazad" +STID_ALL_FILES, "Svi fajlovi (*.*)" +STID_HELP_FILES_HLP, "Pomoト肱i fajlovi (*.hlp)" +STID_FILE_NOT_FOUND_s "Ne mogu naトi '%s'. Da li ナセelite da sami naト粗te fajl?" +STID_NO_RICHEDIT "Ne mogu naトi richedit ubacen... Prekidam" +STID_PSH_INDEX, "Teme pomoトi: " +} + +CONTEXT_MENU MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "Beleナ。ke...", MNID_CTXT_ANNOTATE + MENUITEM "Kopiraj", MNID_CTXT_COPY + MENUITEM "ナtampaj...", MNID_CTXT_PRINT + POPUP "Fontovi" + BEGIN + MENUITEM "Mali", MNID_CTXT_FONTS_SMALL + MENUITEM "Normalno", MNID_CTXT_FONTS_NORMAL + MENUITEM "Veliki", MNID_CTXT_FONTS_LARGE + END + POPUP "Pomoト uvek vidljiva" + BEGIN + MENUITEM "Osnovno", MNID_CTXT_HELP_DEFAULT + MENUITEM "Vidljiv", MNID_CTXT_HELP_VISIBLE + MENUITEM "Nije vidljiv", MNID_CTXT_HELP_NONVISIBLE + END + MENUITEM "Koristi sistemske boje", MNID_CTXT_SYSTEM_COLORS + END +END diff --git a/base/applications/winhlp32/Sv.rc b/base/applications/winhlp32/Sv.rc index 8a5da49ce54..c91332093ee 100644 --- a/base/applications/winhlp32/Sv.rc +++ b/base/applications/winhlp32/Sv.rc @@ -67,9 +67,6 @@ MAIN_MENU MENU MENUITEM "Alltid &verst", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Info...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&Om Wine", MNID_HELP_WINE -#endif } } diff --git a/base/applications/winhlp32/Tr.rc b/base/applications/winhlp32/Tr.rc index 62202f7fc95..41af0c5387c 100644 --- a/base/applications/winhlp32/Tr.rc +++ b/base/applications/winhlp32/Tr.rc @@ -63,16 +63,13 @@ MAIN_MENU MENU MENUITEM "&Her Zaman ワstte", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&Bilgi...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "WINE &Hakknda", MNID_HELP_WINE -#endif } } /* Strings */ STRINGTABLE { -STID_WINE_HELP, "WINE Yardm" +STID_WINE_HELP, "Wine Yardm" STID_WHERROR, "HATA" STID_WARNING, "UYARI" STID_INFO, "Bilgi" diff --git a/base/applications/winhlp32/Uk.rc b/base/applications/winhlp32/Uk.rc index f4e72d0e8ee..8009697172f 100644 --- a/base/applications/winhlp32/Uk.rc +++ b/base/applications/winhlp32/Uk.rc @@ -71,9 +71,6 @@ MAIN_MENU MENU MENUITEM "ミ厘ーミイミカミエミク &ミキミイミオムムム", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "&ミミスムミセムミシミームム毛...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "&ミ湲ミセ Wine", MNID_HELP_WINE -#endif } } diff --git a/base/applications/winhlp32/Zh.rc b/base/applications/winhlp32/Zh.rc index 9401e74a84c..f9d27461223 100644 --- a/base/applications/winhlp32/Zh.rc +++ b/base/applications/winhlp32/Zh.rc @@ -68,16 +68,13 @@ MAIN_MENU MENU MENUITEM "諤サ譏ッ蝨ィ譛蜑埼擇(&T)", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "襍譁吩ソ。諱ッ(&I)...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "蜈ウ莠 WINE(&A)", MNID_HELP_WINE -#endif } } /* Strings */ STRINGTABLE { -STID_WINE_HELP, "WINE 蟶ョ蜉ゥ" +STID_WINE_HELP, "Wine 蟶ョ蜉ゥ" STID_WHERROR, "髞呵ッッ" STID_WARNING, "隴ヲ蜻" STID_INFO, "菫。諱ッ" @@ -136,16 +133,13 @@ MAIN_MENU MENU MENUITEM "邵ス譏ッ蝨ィ譛荳企擇(&T)", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "雉險(&I)...", MNID_HELP_ABOUT -#ifdef WINELIB - MENUITEM "髣懈名 WINE(&A)", MNID_HELP_WINE -#endif } } /* Strings */ STRINGTABLE { -STID_WINE_HELP, "WINE 蟷ォ蜉ゥ" +STID_WINE_HELP, "Wine 蟷ォ蜉ゥ" STID_WHERROR, "骭ッ隱、" STID_WARNING, "隴ヲ蜻" STID_INFO, "雉險" diff --git a/base/applications/winhlp32/macro.c b/base/applications/winhlp32/macro.c index ca0fc8c54d2..3151e0dac14 100644 --- a/base/applications/winhlp32/macro.c +++ b/base/applications/winhlp32/macro.c @@ -151,7 +151,11 @@ void CALLBACK MACRO_JumpContents(LPCSTR lpszPath, LPCSTR lpszWindow) void CALLBACK MACRO_About(void) { - WINE_FIXME("()\n"); + WCHAR name[256]; + HICON icon = LoadImageW( Globals.hInstance, MAKEINTRESOURCEW(IDI_WINHELP), + IMAGE_ICON, 48, 48, LR_SHARED ); + LoadStringW( Globals.hInstance, STID_WINE_HELP, name, sizeof(name)/sizeof(WCHAR) ); + ShellAboutW( MACRO_CurrentWindow()->hMainWnd, name, NULL, icon ); } static void CALLBACK MACRO_AddAccelerator(LONG u1, LONG u2, LPCSTR str) diff --git a/base/applications/winhlp32/rsrc.rc b/base/applications/winhlp32/rsrc.rc index 8b877ed0162..6bf84754f48 100644 --- a/base/applications/winhlp32/rsrc.rc +++ b/base/applications/winhlp32/rsrc.rc @@ -22,7 +22,7 @@ #include "winhelp_res.h" /* @makedep: winhelp.ico */ -IDI_WINHELP ICON DISCARDABLE winhelp.ico +IDI_WINHELP ICON winhelp.ico #include "Bg.rc" #include "Cs.rc" @@ -41,6 +41,7 @@ IDI_WINHELP ICON DISCARDABLE winhelp.ico #include "Da.rc" #include "De.rc" #include "Fr.rc" +#include "He.rc" #include "It.rc" #include "Ja.rc" #include "Lt.rc" @@ -50,5 +51,6 @@ IDI_WINHELP ICON DISCARDABLE winhelp.ico #include "Ro.rc" #include "Ru.rc" #include "Si.rc" +#include "Sr.rc" #include "Uk.rc" #include "Zh.rc" diff --git a/base/applications/winhlp32/winhelp.c b/base/applications/winhlp32/winhelp.c index 582ab3e1c52..5e4bce4c4cf 100644 --- a/base/applications/winhlp32/winhelp.c +++ b/base/applications/winhlp32/winhelp.c @@ -1368,7 +1368,6 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, case MNID_HELP_HELPON: MACRO_HelpOn(); break; case MNID_HELP_HELPTOP: MACRO_HelpOnTop(); break; case MNID_HELP_ABOUT: MACRO_About(); break; - case MNID_HELP_WINE: ShellAbout(hWnd, "WINE", "Help", 0); break; /* Context help */ case MNID_CTXT_ANNOTATE:MACRO_Annotate(); break; diff --git a/base/applications/winhlp32/winhelp_res.h b/base/applications/winhlp32/winhelp_res.h index ba2f9799d25..a6d183096de 100644 --- a/base/applications/winhlp32/winhelp_res.h +++ b/base/applications/winhlp32/winhelp_res.h @@ -23,7 +23,6 @@ #define MNID_HELP_HELPON 0x141 #define MNID_HELP_HELPTOP 0x142 #define MNID_HELP_ABOUT 0x143 -#define MNID_HELP_WINE 0x144 #define MNID_CTXT_ANNOTATE 0x200 #define MNID_CTXT_COPY 0x201 diff --git a/base/applications/wordpad/It.rc b/base/applications/wordpad/It.rc index de9828eb1b9..79278d5d5c4 100644 --- a/base/applications/wordpad/It.rc +++ b/base/applications/wordpad/It.rc @@ -54,7 +54,7 @@ BEGIN MENUITEM "Trova s&uccessivo\tF3", ID_FIND_NEXT MENUITEM "S&ostituisci...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR - MENUITEM "Solo &Lettura", ID_EDIT_READONLY + MENUITEM "Sola &lettura", ID_EDIT_READONLY MENUITEM "&Modificato", ID_EDIT_MODIFIED MENUITEM SEPARATOR POPUP "E&xtra" @@ -71,7 +71,7 @@ BEGIN MENUITEM "Barra degli &strumenti", ID_TOGGLE_TOOLBAR MENUITEM "Barra del &formato", ID_TOGGLE_FORMATBAR MENUITEM "&Righello", ID_TOGGLE_RULER - MENUITEM "Barra dello s&tato", ID_TOGGLE_STATUSBAR + MENUITEM "Barra di s&tato", ID_TOGGLE_STATUSBAR MENUITEM SEPARATOR MENUITEM "&Opzioni...", ID_VIEWPROPERTIES END @@ -93,7 +93,7 @@ BEGIN END POPUP "&Aiuto" BEGIN - MENUITEM "&Riguardo A Wine Wordpad" ID_ABOUT + MENUITEM "&Riguardo a Wine Wordpad" ID_ABOUT END END @@ -119,8 +119,8 @@ BEGIN MENUITEM "Verde" ID_COLOR_GREEN MENUITEM "Verde oliva" ID_COLOR_OLIVE MENUITEM "Blu oltremare" ID_COLOR_NAVY - MENUITEM "Propora" ID_COLOR_PURPLE - MENUITEM "Teal" ID_COLOR_TEAL + MENUITEM "Porpora" ID_COLOR_PURPLE + MENUITEM "Foglia di Tティ" ID_COLOR_TEAL MENUITEM "Grigio" ID_COLOR_GRAY MENUITEM "Argento" ID_COLOR_SILVER MENUITEM "Rosso" ID_COLOR_RED @@ -128,9 +128,9 @@ BEGIN MENUITEM "Giallo" ID_COLOR_YELLOW MENUITEM "Blu" ID_COLOR_BLUE MENUITEM "Fucsia" ID_COLOR_FUCHSIA - MENUITEM "Aqua" ID_COLOR_AQUA + MENUITEM "Acqua" ID_COLOR_AQUA MENUITEM "Bianco" ID_COLOR_WHITE - MENUITEM "Automatic" ID_COLOR_AUTOMATIC + MENUITEM "Automatico" ID_COLOR_AUTOMATIC END END @@ -161,7 +161,7 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU Caption "Formato del paragrafo" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Indentazione", -1, 10, 10, 120, 68 + GROUPBOX "Rientro", -1, 10, 10, 120, 68 LTEXT "Sinistra", -1, 15, 22, 40, 13 EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 LTEXT "Destra", -1, 15, 40, 40, 13 @@ -201,17 +201,17 @@ BEGIN CHECKBOX "Barra degli &strumenti", IDC_PAGEFMT_TB, 180, 20, 80, 15 CHECKBOX "Barra del &formato", IDC_PAGEFMT_FB, 180, 38, 80, 15 CHECKBOX "&Righello", IDC_PAGEFMT_RU, 180, 56, 80, 15 - CHECKBOX "Barra dello s&tato", IDC_PAGEFMT_SB, 180, 74, 80, 15 + CHECKBOX "Barra di s&tato", IDC_PAGEFMT_SB, 180, 74, 80, 15 LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 END STRINGTABLE BEGIN - STRING_ALL_FILES, "Tutti i files (*.*)" + STRING_ALL_FILES, "Tutti i file (*.*)" STRING_TEXT_FILES_TXT, "File di testo (*.txt)" STRING_TEXT_FILES_UNICODE_TXT, "File di testo Unicode (*.txt)" STRING_RICHTEXT_FILES_RTF, "Formato rich text (*.rtf)" - STRING_NEWFILE_RICHTEXT, "Documento Rich text" + STRING_NEWFILE_RICHTEXT, "Documento rich text" STRING_NEWFILE_TXT, "Documento di testo" STRING_NEWFILE_TXT_UNICODE, "Documento di testo Unicode" STRING_PRINTER_FILES_PRN, "File di stampa (*.PRN)" @@ -264,6 +264,6 @@ BEGIN STRING_WRITE_ACCESS_DENIED, "Non hai i diritti di accesso per salvare il file." STRING_OPEN_FAILED, "Impossibile aprire il file." STRING_OPEN_ACCESS_DENIED, "Non hai i diritti di accesso per aprire il file." - STRING_PRINTING_NOT_IMPLEMENTED, "Stampa non implementata" + STRING_PRINTING_NOT_IMPLEMENTED, "Stampa non implementata" STRING_MAX_TAB_STOPS, "Non si possono aggiungere piテケ di 32 punti di fermata delle tabulazioni." END diff --git a/base/applications/wordpad/Zh.rc b/base/applications/wordpad/Zh.rc index 63bfc57c3b6..cd13c719a85 100644 --- a/base/applications/wordpad/Zh.rc +++ b/base/applications/wordpad/Zh.rc @@ -56,12 +56,12 @@ BEGIN MENUITEM "謇セ荳倶ク荳ェ(&N)\tF3", ID_FIND_NEXT MENUITEM "譖ソ謐「(&R)...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR - MENUITEM "蜿ェ隸サ(&0))", ID_EDIT_READONLY - MENUITEM "蟾イ謾ケ蜉ィ(M)", ID_EDIT_MODIFIED + MENUITEM "蜿ェ隸サ(&O)", ID_EDIT_READONLY + MENUITEM "蟾イ謾ケ蜉ィ(&M)", ID_EDIT_MODIFIED MENUITEM SEPARATOR POPUP "蜈カ莉(&X)" BEGIN - MENUITEM "騾画叫菫。諱ッ(&I)", ID_EDIT_SELECTIONINFO + MENUITEM "騾我クュ菫。諱ッ(&I)", ID_EDIT_SELECTIONINFO MENUITEM "譁蟄玲シ蠑(&F)", ID_EDIT_CHARFORMAT MENUITEM "鮟倩ョ、譬シ蠑(&D)", ID_EDIT_DEFCHARFORMAT MENUITEM "谿オ關ス譬シ蠑(&H)", ID_EDIT_PARAFORMAT @@ -116,22 +116,22 @@ IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN - MENUITEM "鮟", ID_COLOR_BLACK - MENUITEM "Maroon", ID_COLOR_MAROON - MENUITEM "扈ソ", ID_COLOR_GREEN - MENUITEM "Olive" ID_COLOR_OLIVE - MENUITEM "Navy" ID_COLOR_NAVY - MENUITEM "邏ォ" ID_COLOR_PURPLE - MENUITEM "Teal" ID_COLOR_TEAL - MENUITEM "轣ー" ID_COLOR_GRAY - MENUITEM "Silver" ID_COLOR_SILVER - MENUITEM "郤「" ID_COLOR_RED - MENUITEM "Lime" ID_COLOR_LIME - MENUITEM "鮟" ID_COLOR_YELLOW - MENUITEM "闢" ID_COLOR_BLUE - MENUITEM "Fuchsia" ID_COLOR_FUCHSIA - MENUITEM "Aqua" ID_COLOR_AQUA - MENUITEM "逋ス" ID_COLOR_WHITE + MENUITEM "鮟題牡", ID_COLOR_BLACK /* 譛ェ謇セ蛻ー窶懈蜃隸大錐陦ィ窶 */ + MENUITEM "譬苓牡", ID_COLOR_MAROON + MENUITEM "隹蜥檎サソ", ID_COLOR_GREEN + MENUITEM "讖讎濶イ" ID_COLOR_OLIVE + MENUITEM "阯城搨" ID_COLOR_NAVY + MENUITEM "邏ォ濶イ" ID_COLOR_PURPLE + MENUITEM "鮑ュ鄙扈ソ" ID_COLOR_TEAL + MENUITEM "轣ー濶イ" ID_COLOR_GRAY + MENUITEM "體カ濶イ" ID_COLOR_SILVER + MENUITEM "郤「濶イ" ID_COLOR_RED + MENUITEM "扈ソ濶イ" ID_COLOR_LIME + MENUITEM "鮟濶イ" ID_COLOR_YELLOW + MENUITEM "闢晁牡" ID_COLOR_BLUE + MENUITEM "豢狗コ「" ID_COLOR_FUCHSIA /* =magenta? */ + MENUITEM "豌エ扈ソ" ID_COLOR_AQUA + MENUITEM "逋ス濶イ" ID_COLOR_WHITE MENUITEM "閾ェ蜉ィ" ID_COLOR_AUTOMATIC END END @@ -262,20 +262,18 @@ END STRINGTABLE BEGIN STRING_DEFAULT_FILENAME, "譁譯」" - STRING_PROMPT_SAVE_CHANGES, "隕∽ソ晏ュ '%s' 蜷?" - STRING_SEARCH_FINISHED, "譁莉カ譟・謇セ扈捺據." - STRING_LOAD_RICHED_FAILED, "RichEdit 陬霓ス螟ア雍・." - STRING_SAVE_LOSEFORMATTING, "菴蟾イ扈城画叫菫晏ュ倅クコ譁譛ャ譁莉カ, " \ - "霑吝庄閭ス蟇シ閾エ譬シ蠑丈ク「螟ア. " \ - "菴遑ョ螳夊ヲ∬ソ吩ケ亥★蜷?" + STRING_PROMPT_SAVE_CHANGES, "隕∽ソ晏ュ倪%s窶晏雛シ" + STRING_SEARCH_FINISHED, "譁莉カ譟・謇セ扈捺據縲" + STRING_LOAD_RICHED_FAILED, "RichEdit 陬霓ス螟ア雍・縲" + STRING_SAVE_LOSEFORMATTING, "菴蟾イ扈城画叫菫晏ュ倅クコ譁譛ャ譁莉カシ瑚瑚ソ吝庄閭ス蟇シ閾エ譬シ蠑丈ク「螟ア縲ゆス遑ョ螳夊ヲ∬ソ吩ケ亥★蜷暦シ" STRING_INVALID_NUMBER, "謨ー蟄玲シ蠑乗裏謨" STRING_OLE_STORAGE_NOT_SUPPORTED, "荳肴髪謖 OLE 蛯ィ蟄俶枚莉カ" - STRING_WRITE_FAILED, "荳崎ス菫晏ュ俶枚莉カ." - STRING_WRITE_ACCESS_DENIED, "菴豐。譛我ソ晏ュ俶枚莉カ逧譚髯." - STRING_OPEN_FAILED, "荳崎ス謇灘シ譁莉カ." - STRING_OPEN_ACCESS_DENIED, "菴豐。譛画遠蠑譁莉カ逧譚髯." + STRING_WRITE_FAILED, "荳崎ス菫晏ュ俶枚莉カ縲" + STRING_WRITE_ACCESS_DENIED, "菴豐。譛我ソ晏ュ俶枚莉カ逧譚髯舌" + STRING_OPEN_FAILED, "荳崎ス謇灘シ譁莉カ縲" + STRING_OPEN_ACCESS_DENIED, "菴豐。譛画遠蠑譁莉カ逧譚髯舌" STRING_PRINTING_NOT_IMPLEMENTED, "謇灘魂蜉溯ス蟆壽悴螳樒鴫" - STRING_MAX_TAB_STOPS, "譛螟壼宵閭ス豺サ蜉 32 荳ェ蛻カ陦ィ菴榊ョス蠎ヲ." + STRING_MAX_TAB_STOPS, "譛螟壼宵閭ス豺サ蜉 32 荳ェ蛻カ陦ィ菴榊ョス蠎ヲ縲" END LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL diff --git a/base/services/eventlog/eventlog.h b/base/services/eventlog/eventlog.h index df0ab151c41..7b6640e4b8d 100644 --- a/base/services/eventlog/eventlog.h +++ b/base/services/eventlog/eventlog.h @@ -93,6 +93,7 @@ typedef struct _LOGFILE LIST_ENTRY ListEntry; } LOGFILE, *PLOGFILE; +#if 0 typedef struct _EVENTSOURCE { LIST_ENTRY EventSourceListEntry; @@ -100,6 +101,15 @@ typedef struct _EVENTSOURCE ULONG CurrentRecord; WCHAR szName[1]; } EVENTSOURCE, *PEVENTSOURCE; +#endif + +typedef struct _LOGHANDLE +{ + LIST_ENTRY LogHandleListEntry; + PLOGFILE LogFile; + ULONG CurrentRecord; + WCHAR szName[1]; +} LOGHANDLE, *PLOGHANDLE; /* file.c */ VOID LogfListInitialize(VOID); diff --git a/base/services/eventlog/rpc.c b/base/services/eventlog/rpc.c index d399d1e600f..d0efdad7f83 100644 --- a/base/services/eventlog/rpc.c +++ b/base/services/eventlog/rpc.c @@ -11,7 +11,7 @@ #include "eventlog.h" -LIST_ENTRY EventSourceListHead; +LIST_ENTRY LogHandleListHead; /* FUNCTIONS ****************************************************************/ @@ -19,7 +19,7 @@ DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter) { RPC_STATUS Status; - InitializeListHead(&EventSourceListHead); + InitializeListHead(&LogHandleListHead); Status = RpcServerUseProtseqEpW(L"ncacn_np", 20, L"\\pipe\\EventLog", NULL); if (Status != RPC_S_OK) @@ -44,21 +44,21 @@ DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter) return 0; } -PEVENTSOURCE ElfCreateEventLogHandle(LPCWSTR Name, BOOL Create) +PLOGHANDLE ElfCreateEventLogHandle(LPCWSTR Name, BOOL Create) { - PEVENTSOURCE lpEventSource; + PLOGHANDLE lpLogHandle; PLOGFILE currentLogFile = NULL; INT i, LogsActive; - lpEventSource = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTSOURCE) + lpLogHandle = HeapAlloc(GetProcessHeap(), 0, sizeof(LOGHANDLE) + ((wcslen(Name) + 1) * sizeof(WCHAR))); - if (!lpEventSource) + if (!lpLogHandle) { DPRINT1("Failed to allocate Heap!\n"); return NULL; } - wcscpy(lpEventSource->szName, Name); + wcscpy(lpLogHandle->szName, Name); /* Get the number of Log Files the EventLog service found */ LogsActive = LogfListItemCount(); @@ -70,9 +70,9 @@ PEVENTSOURCE ElfCreateEventLogHandle(LPCWSTR Name, BOOL Create) /* If Creating, default to the Application Log in case we fail, as documented on MSDN */ if (Create == TRUE) - lpEventSource->LogFile = LogfListItemByName(L"Application"); + lpLogHandle->LogFile = LogfListItemByName(L"Application"); else - lpEventSource->LogFile = NULL; + lpLogHandle->LogFile = NULL; for (i = 1; i <= LogsActive; i++) { @@ -80,49 +80,50 @@ PEVENTSOURCE ElfCreateEventLogHandle(LPCWSTR Name, BOOL Create) if (_wcsicmp(Name, currentLogFile->LogName) == 0) { - lpEventSource->LogFile = LogfListItemByIndex(i); - lpEventSource->CurrentRecord = LogfGetOldestRecord(lpEventSource->LogFile); + lpLogHandle->LogFile = LogfListItemByIndex(i); + lpLogHandle->CurrentRecord = LogfGetOldestRecord(lpLogHandle->LogFile); break; } } - if (!lpEventSource->LogFile) + if (!lpLogHandle->LogFile) goto Cleanup; - /* Append service record */ - InsertTailList(&EventSourceListHead, &lpEventSource->EventSourceListEntry); + /* Append log handle */ + InsertTailList(&LogHandleListHead, &lpLogHandle->LogHandleListEntry); - return lpEventSource; + return lpLogHandle; Cleanup: - HeapFree(GetProcessHeap(), 0, lpEventSource); + HeapFree(GetProcessHeap(), 0, lpLogHandle); return NULL; } -PEVENTSOURCE ElfGetEventLogSourceEntryByHandle(IELF_HANDLE EventLogHandle) +PLOGHANDLE ElfGetLogHandleEntryByHandle(IELF_HANDLE EventLogHandle) { - PEVENTSOURCE CurrentEventSource; + PLOGHANDLE lpLogHandle; - if (IsListEmpty(&EventSourceListHead)) + if (IsListEmpty(&LogHandleListHead)) { return NULL; } - CurrentEventSource = CONTAINING_RECORD((PEVENTSOURCE)EventLogHandle, EVENTSOURCE, EventSourceListEntry); - return CurrentEventSource; + lpLogHandle = CONTAINING_RECORD((PLOGHANDLE)EventLogHandle, LOGHANDLE, LogHandleListEntry); + + return lpLogHandle; } BOOL ElfDeleteEventLogHandle(IELF_HANDLE EventLogHandle) { - PEVENTSOURCE lpEventSource = (PEVENTSOURCE)EventLogHandle; - if (!ElfGetEventLogSourceEntryByHandle(lpEventSource)) + PLOGHANDLE lpLogHandle = (PLOGHANDLE)EventLogHandle; + if (!ElfGetLogHandleEntryByHandle(lpLogHandle)) { return FALSE; } - RemoveEntryList(&lpEventSource->EventSourceListEntry); - HeapFree(GetProcessHeap(),0,lpEventSource); + RemoveEntryList(&lpLogHandle->LogHandleListEntry); + HeapFree(GetProcessHeap(),0,lpLogHandle); return TRUE; } @@ -177,15 +178,15 @@ NTSTATUS ElfrNumberOfRecords( IELF_HANDLE LogHandle, DWORD *NumberOfRecords) { - PEVENTSOURCE lpEventSource; + PLOGHANDLE lpLogHandle; - lpEventSource = ElfGetEventLogSourceEntryByHandle(LogHandle); - if (!lpEventSource) + lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); + if (!lpLogHandle) { return STATUS_INVALID_HANDLE; } - *NumberOfRecords = lpEventSource->LogFile->Header.CurrentRecordNumber; + *NumberOfRecords = lpLogHandle->LogFile->Header.CurrentRecordNumber; return STATUS_SUCCESS; } @@ -196,10 +197,10 @@ NTSTATUS ElfrOldestRecord( IELF_HANDLE LogHandle, DWORD *OldestRecordNumber) { - PEVENTSOURCE lpEventSource; + PLOGHANDLE lpLogHandle; - lpEventSource = ElfGetEventLogSourceEntryByHandle(LogHandle); - if (!lpEventSource) + lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); + if (!lpLogHandle) { return STATUS_INVALID_HANDLE; } @@ -210,7 +211,7 @@ NTSTATUS ElfrOldestRecord( } *OldestRecordNumber = 0; - *OldestRecordNumber = LogfGetOldestRecord(lpEventSource->LogFile); + *OldestRecordNumber = LogfGetOldestRecord(lpLogHandle->LogFile); return STATUS_SUCCESS; } @@ -306,12 +307,12 @@ NTSTATUS ElfrReadELW( DWORD *NumberOfBytesRead, DWORD *MinNumberOfBytesNeeded) { - PEVENTSOURCE lpEventSource; + PLOGHANDLE lpLogHandle; DWORD dwError; DWORD RecordNumber; - lpEventSource = ElfGetEventLogSourceEntryByHandle(LogHandle); - if (!lpEventSource) + lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); + if (!lpLogHandle) { return STATUS_INVALID_HANDLE; } @@ -322,20 +323,20 @@ NTSTATUS ElfrReadELW( /* If sequential read, retrieve the CurrentRecord from this log handle */ if (ReadFlags & EVENTLOG_SEQUENTIAL_READ) { - RecordNumber = lpEventSource->CurrentRecord; + RecordNumber = lpLogHandle->CurrentRecord; } else { RecordNumber = RecordOffset; } - dwError = LogfReadEvent(lpEventSource->LogFile, ReadFlags, &RecordNumber, + dwError = LogfReadEvent(lpLogHandle->LogFile, ReadFlags, &RecordNumber, NumberOfBytesToRead, Buffer, NumberOfBytesRead, MinNumberOfBytesNeeded); /* Update the handles CurrentRecord if success*/ if (dwError == ERROR_SUCCESS) { - lpEventSource->CurrentRecord = RecordNumber; + lpLogHandle->CurrentRecord = RecordNumber; } return I_RpcMapWin32Status(dwError); @@ -361,7 +362,7 @@ NTSTATUS ElfrReportEventW( { USHORT i; PBYTE LogBuffer; - PEVENTSOURCE lpEventSource; + PLOGHANDLE lpLogHandle; DWORD lastRec; DWORD recSize; DWORD dwStringsSize = 0; @@ -369,8 +370,8 @@ NTSTATUS ElfrReportEventW( WCHAR *lpStrings; int pos = 0; - lpEventSource = ElfGetEventLogSourceEntryByHandle(LogHandle); - if (!lpEventSource) + lpLogHandle = ElfGetLogHandleEntryByHandle(LogHandle); + if (!lpLogHandle) { return STATUS_INVALID_HANDLE; } @@ -381,7 +382,7 @@ NTSTATUS ElfrReportEventW( return STATUS_INVALID_PARAMETER; } - lastRec = LogfGetCurrentRecord(lpEventSource->LogFile); + lastRec = LogfGetCurrentRecord(lpLogHandle->LogFile); for (i = 0; i < NumStrings; i++) { @@ -428,7 +429,7 @@ NTSTATUS ElfrReportEventW( EventType, EventCategory, EventID, - lpEventSource->szName, + lpLogHandle->szName, ComputerName->Buffer, sizeof(UserSID), &UserSID, @@ -437,10 +438,10 @@ NTSTATUS ElfrReportEventW( DataSize, Data); - dwError = LogfWriteData(lpEventSource->LogFile, recSize, LogBuffer); + dwError = LogfWriteData(lpLogHandle->LogFile, recSize, LogBuffer); if (!dwError) { - DPRINT1("ERROR WRITING TO EventLog %S\n",lpEventSource->LogFile->FileName); + DPRINT1("ERROR WRITING TO EventLog %S\n", lpLogHandle->LogFile->FileName); } LogfFreeRecord(LogBuffer); diff --git a/base/setup/usetup/lang/et-EE.h b/base/setup/usetup/lang/et-EE.h index 3c8a14b43c5..bb3349ed929 100644 --- a/base/setup/usetup/lang/et-EE.h +++ b/base/setup/usetup/lang/et-EE.h @@ -985,13 +985,13 @@ static MUI_ENTRY etEEBootLoaderEntries[] = { 8, 12, - "Install bootloader on the harddisk (MBR and VBR).", + "Paigalda alglaadur k舸akettale (MBR ja VBR).", TEXT_STYLE_NORMAL }, { 8, 13, - "Install bootloader on the harddisk (VBR only).", + "Paigalda alglaadur k舸akettale (ainult VBR).", TEXT_STYLE_NORMAL }, { diff --git a/base/setup/usetup/lang/it-IT.h b/base/setup/usetup/lang/it-IT.h index 6e3c4d88398..2f6329f404e 100644 --- a/base/setup/usetup/lang/it-IT.h +++ b/base/setup/usetup/lang/it-IT.h @@ -986,13 +986,13 @@ static MUI_ENTRY itITBootLoaderEntries[] = { 8, 12, - "Install bootloader on the harddisk (MBR and VBR).", + "Installazione del bootloader sul disco fisso (MBR e VBR).", TEXT_STYLE_NORMAL }, { 8, 13, - "Install bootloader on the harddisk (VBR only).", + "Installazione del bootloader sul disco fisso (solo VBR).", TEXT_STYLE_NORMAL }, { diff --git a/base/setup/usetup/lang/ja-JP.h b/base/setup/usetup/lang/ja-JP.h index 0db36acab83..1bcd002f042 100644 --- a/base/setup/usetup/lang/ja-JP.h +++ b/base/setup/usetup/lang/ja-JP.h @@ -986,13 +986,13 @@ static MUI_ENTRY jaJPBootLoaderEntries[] = { 8, 12, - "Install bootloader on the harddisk (MBR and VBR).", + "ハードディスクニ ブートローダーヲ インストール シマス (MBR ト VBR).", TEXT_STYLE_NORMAL }, { 8, 13, - "Install bootloader on the harddisk (VBR only).", + "ハードディスクニ ブートローダーヲ インストール シマス (VBR ノミ).", TEXT_STYLE_NORMAL }, { diff --git a/base/setup/usetup/lang/ru-RU.h b/base/setup/usetup/lang/ru-RU.h index 268fec4a7ff..b55efabbbc9 100644 --- a/base/setup/usetup/lang/ru-RU.h +++ b/base/setup/usetup/lang/ru-RU.h @@ -986,19 +986,19 @@ static MUI_ENTRY ruRUBootLoaderEntries[] = { 8, 12, - "Install bootloader on the harddisk (MBR and VBR).", + "乍笄ュョ「ィ粮 ァ」璢ァ遞ェ ュ ヲ・矮ェィゥ 、ィ皙 (MBR ィ VBR).", TEXT_STYLE_NORMAL }, { 8, 13, - "Install bootloader on the harddisk (VBR only).", + "乍笄ュョ「ィ粮 ァ」璢ァ遞ェ ュ ヲ・矮ェィゥ 、ィ皙 (箘ォェョ VBR).", TEXT_STYLE_NORMAL }, { 8, 14, - "乍笄ュョ「ェ ュ 」ィ。ェィゥ 、ィ皙.", + "乍笄ュョ「ィ粮 ァ」璢ァ遞ェ ュ 」ィ。ェィゥ 、ィ皙.", TEXT_STYLE_NORMAL }, { diff --git a/base/setup/usetup/lang/uk-UA.h b/base/setup/usetup/lang/uk-UA.h index fc970357058..9b40eb6bb06 100644 --- a/base/setup/usetup/lang/uk-UA.h +++ b/base/setup/usetup/lang/uk-UA.h @@ -985,31 +985,31 @@ static MUI_ENTRY ukUABootLoaderEntries[] = { 6, 8, - "ゃ笄ュョ「ォ「 「矮ュョ「ォ boot loader", + "ゃ笄ュョ「ォ「 「矮ュョ「ォ ァ「ュ笄ヲ罎", TEXT_STYLE_NORMAL }, { 8, 12, - "Install bootloader on the harddisk (MBR and VBR).", + "ゃ笄ュョ「ィ筧 ァ「ュ笄ヲ罎 ュ ヲョ珮筱ィゥ 、ィ皙 (MBR i VBR).", TEXT_STYLE_NORMAL }, { 8, 13, - "Install bootloader on the harddisk (VBR only).", + "ゃ笄ュョ「ィ筧 ァ「ュ笄ヲ罎 ュ ヲョ珮筱ィゥ 、ィ皙 (ォィ隘 VBR).", TEXT_STYLE_NORMAL }, { 8, 14, - "ゃ笄ュョ「ィ筧 bootloader ュ 、ィ皙・粤.", + "ゃ笄ュョ「ィ筧 ァ「ュ笄ヲ罎 ュ 、ィ皙・粤.", TEXT_STYLE_NORMAL }, { 8, 15, - "婚 「矮ュョ「ォ「筧 bootloader.", + "婚 「矮ュョ「ォ「筧 ァ「ュ笄ヲ罎.", TEXT_STYLE_NORMAL }, { diff --git a/base/setup/usetup/settings.c b/base/setup/usetup/settings.c index ef2e936a5b1..ffc20ac286a 100644 --- a/base/setup/usetup/settings.c +++ b/base/setup/usetup/settings.c @@ -683,15 +683,13 @@ ProcessLocaleRegistry(PGENERIC_LIST List) REG_SZ, (PVOID)(LanguageId + 4), 8 * sizeof(PWCHAR)); + NtClose(KeyHandle); if (!NT_SUCCESS(Status)) { DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status); - NtClose(KeyHandle); return FALSE; } - NtClose(KeyHandle); - return TRUE; } @@ -989,11 +987,11 @@ SetGeoID(PWCHAR Id) 0, REG_SZ, (PVOID)Id, - (wcslen(Id) * sizeof(WCHAR))); + (wcslen(Id) + 1) * sizeof(WCHAR)); + NtClose(KeyHandle); if (!NT_SUCCESS(Status)) { DPRINT1("NtSetValueKey() failed (Status = %lx)\n", Status); - NtClose(KeyHandle); return FALSE; } diff --git a/base/shell/cmd/cmd.c b/base/shell/cmd/cmd.c index 54ff9b23edc..09f362d73af 100644 --- a/base/shell/cmd/cmd.c +++ b/base/shell/cmd/cmd.c @@ -316,6 +316,7 @@ Execute (LPTSTR Full, LPTSTR First, LPTSTR Rest, PARSED_COMMAND *Cmd) TCHAR szWindowTitle[MAX_PATH]; DWORD dwExitCode = 0; TCHAR *FirstEnd; + TCHAR szFullCmdLine [CMDLINE_LENGTH]; TRACE ("Execute: \'%s\' \'%s\'\n", debugstr_aw(First), debugstr_aw(Rest)); @@ -392,11 +393,16 @@ Execute (LPTSTR Full, LPTSTR First, LPTSTR Rest, PARSED_COMMAND *Cmd) PROCESS_INFORMATION prci; STARTUPINFO stui; - /* build command line for CreateProcess(): first + " " + rest */ - if (*rest) - rest[-1] = _T(' '); + /* build command line for CreateProcess(): FullName + " " + rest */ + _tcscpy(szFullCmdLine, szFullName); - TRACE ("[EXEC: %s]\n", debugstr_aw(Full)); + if (*rest) + { + _tcsncat(szFullCmdLine, _T(" "), CMDLINE_LENGTH - _tcslen(szFullCmdLine)); + _tcsncat(szFullCmdLine, rest, CMDLINE_LENGTH - _tcslen(szFullCmdLine)); + } + + TRACE ("[EXEC: %s]\n", debugstr_aw(szFullCmdLine)); /* fill startup info */ memset (&stui, 0, sizeof (STARTUPINFO)); @@ -409,7 +415,7 @@ Execute (LPTSTR Full, LPTSTR First, LPTSTR Rest, PARSED_COMMAND *Cmd) ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT ); if (CreateProcess (szFullName, - Full, + szFullCmdLine, NULL, NULL, TRUE, diff --git a/base/shell/cmd/start.c b/base/shell/cmd/start.c index aef28893807..88acf5e3276 100644 --- a/base/shell/cmd/start.c +++ b/base/shell/cmd/start.c @@ -246,14 +246,14 @@ INT cmd_start (LPTSTR Rest) else { TRACE ("[EXEC: %s %s]\n", debugstr_aw(szFullName), debugstr_aw(Rest)); - _tcscpy(szFullCmdLine, Rest); + _tcscpy(szFullCmdLine, szFullName); } /* build command line for CreateProcess() */ if (param != NULL) { - _tcscat(szFullCmdLine, _T(" ")); - _tcscat(szFullCmdLine, param); + _tcsncat(szFullCmdLine, _T(" "), CMDLINE_LENGTH - _tcslen(szFullCmdLine)); + _tcsncat(szFullCmdLine, param, CMDLINE_LENGTH - _tcslen(szFullCmdLine)); } /* fill startup info */ diff --git a/base/shell/explorer-new/lang/sk-SK.rc b/base/shell/explorer-new/lang/sk-SK.rc index c6329c7e695..f931b8497d4 100644 --- a/base/shell/explorer-new/lang/sk-SK.rc +++ b/base/shell/explorer-new/lang/sk-SK.rc @@ -1,3 +1,8 @@ +/* TRANSLATOR : M疵io Ka鑪疵 /Mario Kacmar/ aka Kario (kario@szm.sk) + * DATE OF TR.: 20-07-2007 + * LAST UPDATE: 26-07-2010 + */ + LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT IDM_TRAYWND MENU DISCARDABLE @@ -5,7 +10,7 @@ BEGIN POPUP "" BEGIN MENUITEM SEPARATOR - MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR + MENUITEM "Spr疱ca lo&h", ID_SHELL_CMD_OPEN_TASKMGR MENUITEM SEPARATOR MENUITEM "Za&mkn panel loh", ID_LOCKTASKBAR MENUITEM "&Vlastnosti", ID_SHELL_CMD_PROPERTIES @@ -56,60 +61,60 @@ END IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Taskbar" +CAPTION "Panel loh" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121 + GROUPBOX "Vzhセad panela loh", IDC_STATIC, 6,6,240,121 CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21 - AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10 - AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10 - AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10 - AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10 - AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10 - AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10 + AUTOCHECKBOX "Za&mkn panel loh", IDC_TASKBARPROP_LOCK, 13,45,200,10 + AUTOCHECKBOX "A&utomaticky skva panel loh", IDC_TASKBARPROP_HIDE, 13,58,200,10 + AUTOCHECKBOX "Zo&brazova panel loh nad ostatnmi oknami", IDC_TASKBARPROP_ONTOP, 13,71,200,10 //Ponecha panel loh nad ostatnmi oknami + AUTOCHECKBOX "&Zoskupova podobn tla鑛dl na paneli s n疽trojmi", IDC_TASKBARPROP_GROUP, 13,84,200,10 + AUTOCHECKBOX "Zobrazi panel &Rchle spustenie", IDC_TASKBARPROP_SHOWQL, 13,97,200,10 + AUTOCHECKBOX "Z&obrazi n疉セady okien (miniatry)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10 END IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Start Menu" +CAPTION "Ponuka 閣art" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10 + AUTORADIOBUTTON "Pon&uka 閣art", IDC_TASKBARPROP_STARTMENU, 7,7,105,10 LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED - PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED - AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED + PUSHBUTTON "P&rispsobi...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED + AUTORADIOBUTTON "Klasick po&nuka 閣art", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED - PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED - GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42 + PUSHBUTTON "&Prispsobi...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED + GROUPBOX "Ochrana skromia",IDC_STATIC, 7,100,238,42 AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED END IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Notification Area" +CAPTION "Oblas ozn疥en" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED - GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED + GROUPBOX "Ikony", IDC_STATIC, 6,33,240,58, WS_DISABLED LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED - AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED - PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED - GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED - LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED - AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED - AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED - AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED - AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED + AUTOCHECKBOX "&Skry neaktvne ikony", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED + PUSHBUTTON "P&rispsobi...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED + GROUPBOX "Syst駑ov ikony", IDC_STATIC, 6,97,240,84, WS_DISABLED + LTEXT "Vyberte, ktor syst駑ov ikony sa maj v枦y zobrazova.", IDC_STATIC, 13,112,223,16, WS_DISABLED + AUTOCHECKBOX "Ho&diny", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED + AUTOCHECKBOX "&Hlasitos", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED + AUTOCHECKBOX "Si&e", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED + AUTOCHECKBOX "N&ap疔anie", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED END IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Toolbars" +CAPTION "Panel s n疽trojmi" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED + LTEXT "Vyberte, ktor panely s n疽trojmi sa maj prida do panela loh.", IDC_STATIC, 7,7,223,12, WS_DISABLED CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE END @@ -120,10 +125,10 @@ BEGIN IDS_PROPERTIES "Vl&astnosti" IDS_OPEN_ALL_USERS "&Otvori profil All Users" IDS_EXPLORE_ALL_USERS "&Preskma profil All Users" - IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable." + IDS_STARTUP_ERROR "Syst駑 nemo枡 spusti prieskumnka, preto枡 registre s po嗅oden alebo nedostupn." END STRINGTABLE DISCARDABLE BEGIN - IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties" + IDS_TASKBAR_STARTMENU_PROP_CAPTION "Vlastnosti panela loh a ponuky 閣art" END diff --git a/base/system/lsass/lsass.c b/base/system/lsass/lsass.c index 30fa05de17d..57216a4d9a6 100644 --- a/base/system/lsass/lsass.c +++ b/base/system/lsass/lsass.c @@ -55,6 +55,14 @@ wWinMain(IN HINSTANCE hInstance, goto ByeBye; } + /* Start the Netlogon service. */ + Status = ServiceInit(); + if (!NT_SUCCESS(Status)) + { + DPRINT1("ServiceInit() failed (Status 0x%08lX)\n", Status); + goto ByeBye; + } + #if 0 /* Initialize the SAM server DLL. */ Status = SamIInitialize(); diff --git a/base/system/msiexec/rsrc.rc b/base/system/msiexec/rsrc.rc index cfc89370039..2594c51b0b1 100644 --- a/base/system/msiexec/rsrc.rc +++ b/base/system/msiexec/rsrc.rc @@ -32,4 +32,4 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL /* @makedep: msiexec.ico */ -1 ICON DISCARDABLE msiexec.ico +1 ICON msiexec.ico diff --git a/base/system/services/rpcserver.c b/base/system/services/rpcserver.c index 914e013327b..b4b5bb88335 100644 --- a/base/system/services/rpcserver.c +++ b/base/system/services/rpcserver.c @@ -24,7 +24,6 @@ typedef struct _SCMGR_HANDLE { DWORD Tag; - DWORD RefCount; DWORD DesiredAccess; } SCMGR_HANDLE; @@ -43,7 +42,6 @@ typedef struct _SERVICE_HANDLE { SCMGR_HANDLE Handle; - DWORD DesiredAccess; PSERVICE ServiceEntry; /* FIXME: Insert more data here */ @@ -169,7 +167,6 @@ ScmCreateManagerHandle(LPWSTR lpDatabaseName, return ERROR_NOT_ENOUGH_MEMORY; Ptr->Handle.Tag = MANAGER_TAG; - Ptr->Handle.RefCount = 1; /* FIXME: initialize more data here */ @@ -194,7 +191,6 @@ ScmCreateServiceHandle(PSERVICE lpServiceEntry, return ERROR_NOT_ENOUGH_MEMORY; Ptr->Handle.Tag = SERVICE_TAG; - Ptr->Handle.RefCount = 1; /* FIXME: initialize more data here */ Ptr->ServiceEntry = lpServiceEntry; @@ -205,6 +201,46 @@ ScmCreateServiceHandle(PSERVICE lpServiceEntry, } +static PMANAGER_HANDLE +ScmGetServiceManagerFromHandle(SC_RPC_HANDLE Handle) +{ + PMANAGER_HANDLE pManager = NULL; + + _SEH2_TRY + { + if (((PMANAGER_HANDLE)Handle)->Handle.Tag == MANAGER_TAG) + pManager = (PMANAGER_HANDLE)Handle; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + DPRINT1("Exception: Invalid Service Manager handle!\n"); + } + _SEH2_END; + + return pManager; +} + + +static PSERVICE_HANDLE +ScmGetServiceFromHandle(SC_RPC_HANDLE Handle) +{ + PSERVICE_HANDLE pService = NULL; + + _SEH2_TRY + { + if (((PSERVICE_HANDLE)Handle)->Handle.Tag == SERVICE_TAG) + pService = (PSERVICE_HANDLE)Handle; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + DPRINT1("Exception: Invalid Service handle!\n"); + } + _SEH2_END; + + return pService; +} + + static DWORD ScmCheckAccess(SC_HANDLE Handle, DWORD dwDesiredAccess) @@ -423,14 +459,10 @@ DWORD RCloseServiceHandle( { DPRINT("Found manager handle\n"); - hManager->Handle.RefCount--; - if (hManager->Handle.RefCount == 0) - { - /* FIXME: add handle cleanup code */ + /* FIXME: add handle cleanup code */ - HeapFree(GetProcessHeap(), 0, hManager); - hManager = NULL; - } + HeapFree(GetProcessHeap(), 0, hManager); + hManager = NULL; DPRINT("RCloseServiceHandle() done\n"); return ERROR_SUCCESS; @@ -442,17 +474,11 @@ DWORD RCloseServiceHandle( /* Get the pointer to the service record */ lpService = hService->ServiceEntry; - ASSERT(hService->Handle.RefCount > 0); + /* FIXME: add handle cleanup code */ - hService->Handle.RefCount--; - if (hService->Handle.RefCount == 0) - { - /* FIXME: add handle cleanup code */ - - /* Free the handle */ - HeapFree(GetProcessHeap(), 0, hService); - hService = NULL; - } + /* Free the handle */ + HeapFree(GetProcessHeap(), 0, hService); + hService = NULL; ASSERT(lpService->dwRefCount > 0); @@ -543,18 +569,19 @@ DWORD RControlService( return ERROR_SHUTDOWN_IN_PROGRESS; /* Check the service handle */ - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } + /* Check the service entry point */ lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT("lpService == NULL!\n"); + DPRINT1("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -674,9 +701,12 @@ DWORD RDeleteService( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) + { + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; + } if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, DELETE)) @@ -721,9 +751,12 @@ DWORD RLockServiceDatabase( *lpLock = 0; - hMgr = (PMANAGER_HANDLE)hSCManager; - if (!hMgr || hMgr->Handle.Tag != MANAGER_TAG) + hMgr = ScmGetServiceManagerFromHandle(hSCManager); + if (hMgr == NULL) + { + DPRINT1("Invalid service manager handle!\n"); return ERROR_INVALID_HANDLE; + } if (!RtlAreAllAccessesGranted(hMgr->Handle.DesiredAccess, SC_MANAGER_LOCK)) @@ -758,10 +791,10 @@ DWORD RQueryServiceObjectSecurity( DPRINT("RQueryServiceObjectSecurity() called\n"); - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } @@ -840,10 +873,10 @@ DWORD RSetServiceObjectSecurity( DPRINT("RSetServiceObjectSecurity() called\n"); - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } @@ -957,10 +990,10 @@ DWORD RQueryServiceStatus( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } @@ -1143,10 +1176,10 @@ DWORD RChangeServiceConfigW( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } @@ -1763,10 +1796,10 @@ DWORD RCreateServiceW( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hManager = (PMANAGER_HANDLE)hSCManager; - if (!hManager || hManager->Handle.Tag != MANAGER_TAG) + hManager = ScmGetServiceManagerFromHandle(hSCManager); + if (hManager == NULL) { - DPRINT("Invalid manager handle!\n"); + DPRINT1("Invalid service manager handle!\n"); return ERROR_INVALID_HANDLE; } @@ -2073,7 +2106,6 @@ DWORD REnumDependentServicesW( DWORD dwServicesReturned = 0; DWORD dwServiceCount; HKEY hServicesKey = NULL; - LPSC_RPC_HANDLE hSCObject; PSERVICE_HANDLE hSvc; PSERVICE lpService = NULL; PSERVICE *lpServicesArray = NULL; @@ -2085,8 +2117,13 @@ DWORD REnumDependentServicesW( DPRINT("REnumDependentServicesW() called\n"); - hSCObject = &hService; - hSvc = (PSERVICE_HANDLE) *hSCObject; + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) + { + DPRINT1("Invalid service handle!\n"); + return ERROR_INVALID_HANDLE; + } + lpService = hSvc->ServiceEntry; /* Check access rights */ @@ -2218,13 +2255,14 @@ DWORD REnumServicesStatusW( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hManager = (PMANAGER_HANDLE)hSCManager; - if (!hManager || hManager->Handle.Tag != MANAGER_TAG) + hManager = ScmGetServiceManagerFromHandle(hSCManager); + if (hManager == NULL) { - DPRINT("Invalid manager handle!\n"); + DPRINT1("Invalid service manager handle!\n"); return ERROR_INVALID_HANDLE; } + *pcbBytesNeeded = 0; *lpServicesReturned = 0; @@ -2469,10 +2507,10 @@ DWORD ROpenServiceW( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hManager = (PMANAGER_HANDLE)hSCManager; - if (!hManager || hManager->Handle.Tag != MANAGER_TAG) + hManager = ScmGetServiceManagerFromHandle(hSCManager); + if (hManager == NULL) { - DPRINT("Invalid manager handle!\n"); + DPRINT1("Invalid service manager handle!\n"); return ERROR_INVALID_HANDLE; } @@ -2549,10 +2587,10 @@ DWORD RQueryServiceConfigW( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } @@ -2757,10 +2795,10 @@ DWORD RStartServiceW( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } @@ -2983,10 +3021,10 @@ DWORD RChangeServiceConfigA( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } @@ -3401,7 +3439,6 @@ DWORD REnumDependentServicesA( DWORD dwServicesReturned = 0; DWORD dwServiceCount; HKEY hServicesKey = NULL; - LPSC_RPC_HANDLE hSCObject; PSERVICE_HANDLE hSvc; PSERVICE lpService = NULL; PSERVICE *lpServicesArray = NULL; @@ -3413,8 +3450,13 @@ DWORD REnumDependentServicesA( DPRINT("REnumDependentServicesA() called\n"); - hSCObject = &hService; - hSvc = (PSERVICE_HANDLE) *hSCObject; + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) + { + DPRINT1("Invalid service handle!\n"); + return ERROR_INVALID_HANDLE; + } + lpService = hSvc->ServiceEntry; /* Check access rights */ @@ -3723,10 +3765,10 @@ DWORD RQueryServiceConfigA( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } @@ -3964,10 +4006,10 @@ DWORD RStartServiceA( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } @@ -4345,10 +4387,10 @@ DWORD RChangeServiceConfig2W( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } @@ -4446,10 +4488,10 @@ DWORD RQueryServiceConfig2A( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } @@ -4566,10 +4608,10 @@ DWORD RQueryServiceConfig2W( if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } @@ -4719,10 +4761,10 @@ DWORD RQueryServiceStatusEx( if (cbBufSize < sizeof(SERVICE_STATUS_PROCESS)) return ERROR_INSUFFICIENT_BUFFER; - hSvc = (PSERVICE_HANDLE)hService; - if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + hSvc = ScmGetServiceFromHandle(hService); + if (hSvc == NULL) { - DPRINT("Invalid handle tag!\n"); + DPRINT1("Invalid service handle!\n"); return ERROR_INVALID_HANDLE; } @@ -4912,10 +4954,10 @@ DWORD REnumServicesStatusExW( if (InfoLevel != SC_ENUM_PROCESS_INFO) return ERROR_INVALID_LEVEL; - hManager = (PMANAGER_HANDLE)hSCManager; - if (!hManager || hManager->Handle.Tag != MANAGER_TAG) + hManager = ScmGetServiceManagerFromHandle(hSCManager); + if (hManager == NULL) { - DPRINT("Invalid manager handle!\n"); + DPRINT1("Invalid service manager handle!\n"); return ERROR_INVALID_HANDLE; } diff --git a/base/system/smss/smapiexec.c b/base/system/smss/smapiexec.c index b9614907603..8fef5654a72 100644 --- a/base/system/smss/smapiexec.c +++ b/base/system/smss/smapiexec.c @@ -108,11 +108,11 @@ FailProcParams: __FUNCTION__, Status); return Status; } -#ifdef ROS_DOESNT_SUCK + /* Reserve lower 1Mb, if requested */ if (Flags & SM_CREATE_FLAG_RESERVE_1MB) ProcessParameters->Flags |= RTL_USER_PROCESS_PARAMETERS_RESERVE_1MB; -#endif + /* Create the user process */ Status = RtlCreateUserProcess (& ImagePathString, OBJ_CASE_INSENSITIVE, diff --git a/boot/bootdata/hivesft_amd64.inf b/boot/bootdata/hivesft_amd64.inf index 006796e8779..516bc7ba985 100644 --- a/boot/bootdata/hivesft_amd64.inf +++ b/boot/bootdata/hivesft_amd64.inf @@ -124,10 +124,10 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports","LPT2:",2,"" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports","LPT3:",2,"" ; Image File Execution Options (NtGlobalFlag with FLG_SHOW_LDR_SNAPS set for loadlib.exe) -HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loadlib.exe","GlobalFlag",0x00000000,"0x00000002" -;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loaddll.exe","GlobalFlag",0x00000000,"0x00000002" -;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\soffice.exe","GlobalFlag",0x00000000,"0x00000002" -;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\tlstest.exe","GlobalFlag",0x00000000,"0x00000002" +HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loadlib.exe","GlobalFlag",0x00010001,0x00000002 +;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loaddll.exe","GlobalFlag",0x00010001,0x00000002 +;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\soffice.exe","GlobalFlag",0x00010001,0x00000002 +;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\tlstest.exe","GlobalFlag",0x00010001,0x00000002 HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","midimapper",0x00000000,"midimap.dll" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","wavemapper",0x00000000,"msacm32.drv" @@ -1078,7 +1078,7 @@ HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\374","Nam HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\380","CountryCode",0x00010001,0x0000017c HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\380","Name",0x00000000,"Ukraine" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\381","CountryCode",0x00010001,0x0000017d -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\381","Name",0x00000000,"Yugoslavia" +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\381","Name",0x00000000,"Serbia" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\385","CountryCode",0x00010001,0x00000181 HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\385","Name",0x00000000,"Croatia" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\386","CountryCode",0x00010001,0x00000182 diff --git a/boot/bootdata/hivesft_arm.inf b/boot/bootdata/hivesft_arm.inf index 6a63e499ae1..41d179ff979 100644 --- a/boot/bootdata/hivesft_arm.inf +++ b/boot/bootdata/hivesft_arm.inf @@ -50,10 +50,10 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion","CurrentBuildNumber",0x00020 ; Image File Execution Options (NtGlobalFlag with FLG_SHOW_LDR_SNAPS set for loadlib.exe) -HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loadlib.exe","GlobalFlag",0x00000000,"0x00000002" -;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loaddll.exe","GlobalFlag",0x00000000,"0x00000002" -;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\soffice.exe","GlobalFlag",0x00000000,"0x00000002" -;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\tlstest.exe","GlobalFlag",0x00000000,"0x00000002" +HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loadlib.exe","GlobalFlag",0x00010001,0x00000002 +;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loaddll.exe","GlobalFlag",0x00010001,0x00000002 +;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\soffice.exe","GlobalFlag",0x00010001,0x00000002 +;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\tlstest.exe","GlobalFlag",0x00010001,0x00000002 HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","midimapper",0x00000000,"midimap.dll" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","wavemapper",0x00000000,"msacm32.drv" @@ -994,7 +994,7 @@ HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\374","Nam HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\380","CountryCode",0x00010001,0x0000017c HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\380","Name",0x00000000,"Ukraine" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\381","CountryCode",0x00010001,0x0000017d -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\381","Name",0x00000000,"Yugoslavia" +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\381","Name",0x00000000,"Serbia" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\385","CountryCode",0x00010001,0x00000181 HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\385","Name",0x00000000,"Croatia" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\386","CountryCode",0x00010001,0x00000182 diff --git a/boot/bootdata/hivesft_i386.inf b/boot/bootdata/hivesft_i386.inf index 5acea1c1687..b04af498659 100644 --- a/boot/bootdata/hivesft_i386.inf +++ b/boot/bootdata/hivesft_i386.inf @@ -124,10 +124,10 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports","LPT2:",2,"" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports","LPT3:",2,"" ; Image File Execution Options (NtGlobalFlag with FLG_SHOW_LDR_SNAPS set for loadlib.exe) -HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loadlib.exe","GlobalFlag",0x00000000,"0x00000002" -;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loaddll.exe","GlobalFlag",0x00000000,"0x00000002" -;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\soffice.exe","GlobalFlag",0x00000000,"0x00000002" -;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\tlstest.exe","GlobalFlag",0x00000000,"0x00000002" +HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loadlib.exe","GlobalFlag",0x00010001,0x00000002 +;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\loaddll.exe","GlobalFlag",0x00010001,0x00000002 +;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\soffice.exe","GlobalFlag",0x00010001,0x00000002 +;HKLM,"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\tlstest.exe","GlobalFlag",0x00010001,0x00000002 HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","midimapper",0x00000000,"midimap.dll" HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","wavemapper",0x00000000,"msacm32.drv" @@ -1078,7 +1078,7 @@ HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\374","Nam HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\380","CountryCode",0x00010001,0x0000017c HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\380","Name",0x00000000,"Ukraine" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\381","CountryCode",0x00010001,0x0000017d -HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\381","Name",0x00000000,"Yugoslavia" +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\381","Name",0x00000000,"Serbia" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\385","CountryCode",0x00010001,0x00000181 HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\385","Name",0x00000000,"Croatia" HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List\386","CountryCode",0x00010001,0x00000182 diff --git a/boot/bootdata/hivesys_amd64.inf b/boot/bootdata/hivesys_amd64.inf index 977ea93d55b..517dfa1a53b 100644 --- a/boot/bootdata/hivesys_amd64.inf +++ b/boot/bootdata/hivesys_amd64.inf @@ -730,7 +730,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000814",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000415",0x00000000,"2" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000416",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000816",0x00000000,"1" -HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000417",0x00000000,"1" +;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000417",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000418",0x00000000,"2" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000419",0x00000000,"5" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","0000041a",0x00000000,"2" @@ -768,11 +768,11 @@ HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","0000083e",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000441",0x00000000,"1" ;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000443",0x00000000,"6" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000843",0x00000000,"5" -HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000445",0x00000000,"f" +;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000445",0x00000000,"f" ;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000455",0x00000000,"" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000456",0x00000000,"1" -HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","0000048f",0x00000000,"1" -HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000490",0x00000000,"1" +;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","0000048f",0x00000000,"1" +;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000490",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language Groups","1",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language Groups","2",0x00000000,"1" diff --git a/boot/bootdata/hivesys_arm.inf b/boot/bootdata/hivesys_arm.inf index 51f2dc8dd63..abf8d68c100 100644 --- a/boot/bootdata/hivesys_arm.inf +++ b/boot/bootdata/hivesys_arm.inf @@ -623,7 +623,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000814",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000415",0x00000000,"2" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000416",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000816",0x00000000,"1" -HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000417",0x00000000,"1" +;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000417",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000418",0x00000000,"2" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000419",0x00000000,"5" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","0000041a",0x00000000,"2" @@ -661,11 +661,11 @@ HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","0000083e",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000441",0x00000000,"1" ;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000443",0x00000000,"6" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000843",0x00000000,"5" -HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000445",0x00000000,"f" +;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000445",0x00000000,"f" ;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000455",0x00000000,"" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000456",0x00000000,"1" -HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","0000048f",0x00000000,"1" -HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000490",0x00000000,"1" +;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","0000048f",0x00000000,"1" +;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000490",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language Groups","1",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language Groups","2",0x00000000,"1" diff --git a/boot/bootdata/hivesys_i386.inf b/boot/bootdata/hivesys_i386.inf index d1d5c39cd41..9bffb34dea1 100644 --- a/boot/bootdata/hivesys_i386.inf +++ b/boot/bootdata/hivesys_i386.inf @@ -7,6 +7,98 @@ HKLM,"SYSTEM\CurrentControlSet\Control","CurrentUser",2,"USERNAME" HKLM,"SYSTEM\CurrentControlSet\Control","WaitToKillServiceTimeout",2,"20000" HKLM,"SYSTEM\CurrentControlSet\Control\Biosinfo","InfName",2,"biosinfo.inf" HKLM,"SYSTEM\CurrentControlSet\Control\PnP",,0x00000012 +HKLM,"SYSTEM\CurrentControlSet\Control\Arbiters",,0x00000012 + +HKLM,"SYSTEM\CurrentControlSet\Control\Arbiters\AllocationOrder","Root",0x000a0001,\ +a8,04,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,00,01,00,00,00,01,00,01,00,24,00,00,00,00,01,00,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,05,00,00,00,00,00,00,ff,ff,00,00,00,00,00,\ +00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,40,01,00,00,00,00,00,00,\ +7f,01,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ +02,00,00,00,00,00,00,ff,02,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,00,03,00,00,00,00,00,00,6f,03,00,00,00,00,00,00,08,01,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,78,03,00,00,00,00,00,00,7a,03,00,00,\ +00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,e8,02,00,00,00,\ +00,00,00,ff,02,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,00,f0,01,00,00,00,00,00,00,f8,01,00,00,00,00,00,00,08,01,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,00,b0,03,00,00,00,00,00,00,cf,03,00,00,00,00,00,00,\ +08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,e8,03,00,00,00,00,00,00,ff,\ +03,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ce,01,\ +00,00,00,00,00,00,cf,01,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,01,00,00,00,00,00,00,ff,03,00,00,00,00,00,00,08,02,00,00,\ +00,00,00,00,09,00,00,00,09,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,00,00,08,02,00,00,00,00,00,00,08,00,00,00,08,00,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,08,02,00,00,00,00,00,00,07,00,00,00,07,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,02,00,00,00,00,00,00,\ +0b,00,00,00,0b,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,\ +02,00,00,00,00,00,00,0a,00,00,00,0a,00,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,08,02,00,00,00,00,00,00,02,00,00,00,02,00,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,00,00,00,00,00,00,03,00,00,00,\ +03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,02,00,00,00,\ +00,00,00,05,00,00,00,05,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,00,08,02,00,00,00,00,00,00,04,00,00,00,04,00,00,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,00,08,02,00,00,00,00,00,00,0f,00,00,00,0f,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,02,00,00,00,00,00,00,0d,\ +00,00,00,0d,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,02,\ +00,00,00,00,00,00,0e,00,00,00,0e,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,08,02,00,00,00,00,00,00,06,00,00,00,06,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,08,02,00,00,00,00,00,00,0c,00,00,00,0c,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,02,00,00,00,00,\ +00,00,01,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,08,02,00,00,00,00,00,00,00,00,ff,ff,fe,ff,ff,ff,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,08,02,00,00,00,00,00,00,10,00,00,00,ff,ff,fe,ff,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,10,00,00,00,00,00,ff,ff,ff,ff,ff,ff,ff,ff,08,03,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,0f,00,00,00,00,00,ff,ff,0f,00,\ +00,00,00,00,08,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,00,00,\ +00,00,00,ff,ff,0b,00,00,00,00,00,08,03,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,00,00,00,08,00,00,00,00,00,ff,ff,0f,00,00,00,00,00,08,03,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,08,00,00,00,00,00,ff,ff,bf,ff,00,00,00,00,\ +00,04,00,00,00,00,00,00,06,00,00,00,0f,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,00,08,04,00,00,00,00,00,00,03,00,00,00,04,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,04,00,00,00,00,00,00,00,00,00,\ +00,0f,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 + +HKLM,"SYSTEM\CurrentControlSet\Control\Arbiters\AllocationOrder","Pci",0x000a0001,\ +48,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,01,00,00,00,01,00,01,00,11,00,00,00,00,01,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,00,00,ff,ff,ff,ff,00,00,00,00,\ +08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,05,00,00,00,00,00,00,ff,\ +ff,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,40,01,\ +00,00,00,00,00,00,7f,01,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,02,00,00,00,00,00,00,ff,02,00,00,00,00,00,00,08,01,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,03,00,00,00,00,00,00,6f,03,00,00,00,\ +00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,78,03,00,00,00,00,\ +00,00,7a,03,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,e8,02,00,00,00,00,00,00,ff,02,00,00,00,00,00,00,08,01,00,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,f0,01,00,00,00,00,00,00,f8,01,00,00,00,00,00,00,08,\ +01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,b0,03,00,00,00,00,00,00,cf,03,\ +00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,e8,03,00,\ +00,00,00,00,00,ff,03,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,\ +00,00,00,00,ce,01,00,00,00,00,00,00,cf,01,00,00,00,00,00,00,08,01,00,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,00,00,00,ff,03,00,00,00,00,\ +00,00,00,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,10,00,00,00,00,\ +00,ff,ff,ff,ff,ff,ff,ff,ff,08,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,00,0f,00,00,00,00,00,ff,ff,0f,00,00,00,00,00,08,03,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,00,08,00,00,00,00,00,ff,ff,0b,00,00,00,00,00,08,03,\ +00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,00,00,00,00,00,ff,ff,0f,\ +00,00,00,00,00,08,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08,00,\ +00,00,00,00,ff,ff,bf,ff,00,00,00,00 + +HKLM,"SYSTEM\CurrentControlSet\Control\Arbiters\ReservedResources","Pci",0x00000002, "PCStandard" +HKLM,"SYSTEM\CurrentControlSet\Control\Arbiters\ReservedResources","Root",0x00000002, "PCStandard" +HKLM,"SYSTEM\CurrentControlSet\Control\Arbiters\ReservedResources","PCStandard",0x000a0001,\ +08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,00,01,00,00,00,01,00,01,00,07,00,00,00,00,01,00,00,\ +00,00,00,00,00,00,00,00,00,00,00,00,f8,02,00,00,00,00,00,00,ff,02,00,00,00,\ +00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,b0,03,00,00,00,00,\ +00,00,bb,03,00,00,00,00,00,00,08,01,00,00,00,00,00,00,00,00,00,00,00,00,00,\ +00,bc,03,00,00,00,00,00,00,be,03,00,00,00,00,00,00,08,01,00,00,00,00,00,00,\ +00,00,00,00,00,00,00,00,c0,03,00,00,00,00,00,00,df,03,00,00,00,00,00,00,08,\ +01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,f8,03,00,00,00,00,00,00,ff,03,\ +00,00,00,00,00,00,00,03,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,0a,\ +00,00,00,00,00,ff,ff,0b,00,00,00,00,00,08,03,00,00,00,00,00,00,00,00,00,00,\ +00,00,00,00,00,00,f0,ff,00,00,00,00,ff,ff,ff,ff,00,00,00,00 HKLM,"SYSTEM\CurrentControlSet\Control\FileSystem","NtfsDisable8dot3NameCreation",0x00010003,0 HKLM,"SYSTEM\CurrentControlSet\Control\FileSystem","Win31FileSystem",0x00010001,0 @@ -730,7 +822,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000814",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000415",0x00000000,"2" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000416",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000816",0x00000000,"1" -HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000417",0x00000000,"1" +;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000417",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000418",0x00000000,"2" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000419",0x00000000,"5" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","0000041a",0x00000000,"2" @@ -768,11 +860,11 @@ HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","0000083e",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000441",0x00000000,"1" ;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000443",0x00000000,"6" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000843",0x00000000,"5" -HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000445",0x00000000,"f" +;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000445",0x00000000,"f" ;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000455",0x00000000,"" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000456",0x00000000,"1" -HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","0000048f",0x00000000,"1" -HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000490",0x00000000,"1" +;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","0000048f",0x00000000,"1" +;HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Locale","00000490",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language Groups","1",0x00000000,"1" HKLM,"SYSTEM\CurrentControlSet\Control\NLS\Language Groups","2",0x00000000,"1" diff --git a/boot/bootdata/packages/reactos.dff b/boot/bootdata/packages/reactos.dff index 74e23dfd333..d391b7bc85c 100644 --- a/boot/bootdata/packages/reactos.dff +++ b/boot/bootdata/packages/reactos.dff @@ -48,7 +48,7 @@ base\applications\extrac32\extrac32.exe 1 base\applications\fontview\fontview.exe 1 base\applications\games\solitaire\sol.exe 1 base\applications\games\spider\spider.exe 1 -base\applications\games\winemine\winemine.exe 1 +base\applications\games\winmine\winmine.exe 1 base\applications\hh\hh.exe 4 base\applications\kbswitch\kbswitch.exe 1 base\applications\kbswitch\kbsdll\kbsdll.dll 1 @@ -856,5 +856,10 @@ modules\rostests\winetests\wldap32\wldap32_winetest.exe 7 o modules\rostests\winetests\ws2_32\ws2_32_winetest.exe 7 optional modules\rostests\winetests\xmllite\xmllite_winetest.exe 7 optional +modules\rostests\apitests\dciman32\dciman32_apitest.exe 7 optional +modules\rostests\apitests\gdi32\gdi32_apitest.exe 7 optional +modules\rostests\apitests\ntdll\ntdll_apitest.exe 7 optional +modules\rostests\apitests\user32\user32_apitest.exe 7 optional +modules\rostests\apitests\ws2_32\ws2_32_apitest.exe 7 optional modules\wallpaper\Angelus_02_ROSWP.bmp 4 optional diff --git a/boot/bootdata/txtsetup.sif b/boot/bootdata/txtsetup.sif index c822c2fbc3e..57617385bbe 100644 --- a/boot/bootdata/txtsetup.sif +++ b/boot/bootdata/txtsetup.sif @@ -17,6 +17,7 @@ FreeSysPartDiskSpace=350 [SourceDisksFiles] acpi.sys=,,,,,,,,,,,,4 +nmidebug.sys=,,,,,,x,,,,,,4 uniata.sys=,,,,,,x,,,,,,4 buslogic.sys=,,,,,,x,,,,,,4 blue.sys=,,,,,,x,,,,,,4 diff --git a/boot/freeldr/freeldr/arch/i386/hardware.c b/boot/freeldr/freeldr/arch/i386/hardware.c index f99e26780d6..641bd8d4c94 100644 --- a/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/boot/freeldr/freeldr/arch/i386/hardware.c @@ -1004,6 +1004,7 @@ DetectBiosDisks(PCONFIGURATION_COMPONENT_DATA BusKey) /* Calculate the MBR checksum */ for (i = 0; i < 2048 / sizeof(ULONG); i++) Checksum += Buffer[i]; + Checksum = ~Checksum + 1; DPRINTM(DPRINT_HWDETECT, "Checksum: %x\n", Checksum); /* Fill out the ARC disk block */ diff --git a/dll/cpl/desk/background.c b/dll/cpl/desk/background.c index 32d45c6892c..50d8b46ef2a 100644 --- a/dll/cpl/desk/background.c +++ b/dll/cpl/desk/background.c @@ -17,6 +17,18 @@ #define PLACEMENT_STRETCH 1 #define PLACEMENT_TILE 2 +/* The values in these macros are dependant on the + * layout of the monitor image and they must be adjusted + * if that image will be changed. + */ +#define MONITOR_LEFT 18 +#define MONITOR_TOP 18 +#define MONITOR_RIGHT 168 +#define MONITOR_BOTTOM 128 + +#define MONITOR_WIDTH (MONITOR_RIGHT-MONITOR_LEFT) +#define MONITOR_HEIGHT (MONITOR_BOTTOM-MONITOR_TOP) + typedef struct { BOOL bWallpaper; /* Is this background a wallpaper */ @@ -303,7 +315,7 @@ InitBackgroundDialog(HWND hwndDlg, PDATA pData) RegCloseKey(regKey); - pData->hBitmap = (HBITMAP) LoadImage(hApplet, MAKEINTRESOURCE(IDC_MONITOR), IMAGE_BITMAP, 0, 0, LR_LOADTRANSPARENT); + pData->hBitmap = (HBITMAP) LoadImage(hApplet, MAKEINTRESOURCE(IDC_MONITOR), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); if (pData->hBitmap != NULL) { GetObject(pData->hBitmap, sizeof(BITMAP), &bitmap); @@ -515,93 +527,139 @@ DrawBackgroundPreview(LPDRAWITEMSTRUCT draw, PDATA pData) float scaleY; int scaledWidth; int scaledHeight; - int posX; - int posY; + int posX, desX; + int posY, desY; HBRUSH hBrush; int x; int y; + HDC hDC; + HGDIOBJ hOldObj; + RECT rcItem = { + MONITOR_LEFT, + MONITOR_TOP, + MONITOR_RIGHT, + MONITOR_BOTTOM + }; + + hDC = CreateCompatibleDC(draw->hDC); + hOldObj = SelectObject(hDC, pData->hBitmap); if (pData->backgroundItems[pData->backgroundSelection].bWallpaper == FALSE) { /* update desktop background color image */ hBrush = CreateSolidBrush(g_GlobalData.desktop_color); - FillRect(draw->hDC, &draw->rcItem, hBrush); + FillRect(hDC, &rcItem, hBrush); DeleteObject(hBrush); - return; } - - if (pData->pWallpaperBitmap == NULL) - return; - - scaleX = ((float)GetSystemMetrics(SM_CXSCREEN) - 1) / (float)draw->rcItem.right; - scaleY = ((float)GetSystemMetrics(SM_CYSCREEN) - 1) / (float)draw->rcItem.bottom; - - scaledWidth = pData->pWallpaperBitmap->width / scaleX; - scaledHeight = pData->pWallpaperBitmap->height / scaleY; - - posX = (draw->rcItem.right / 2) - (scaledWidth / 2); - posY = (draw->rcItem.bottom / 2) - (scaledHeight / 2); - - FillRect(draw->hDC, &draw->rcItem, GetSysColorBrush(COLOR_BACKGROUND)); - - SetStretchBltMode(draw->hDC, COLORONCOLOR); - - switch (pData->placementSelection) + else + if (pData->pWallpaperBitmap != NULL) { - case PLACEMENT_CENTER: - StretchDIBits(draw->hDC, - posX, - posY, - scaledWidth, - scaledHeight, - 0, - 0, - pData->pWallpaperBitmap->width, - pData->pWallpaperBitmap->height, - pData->pWallpaperBitmap->bits, - pData->pWallpaperBitmap->info, - DIB_RGB_COLORS, - SRCCOPY); - break; + scaleX = ((float)GetSystemMetrics(SM_CXSCREEN) - 1) / (float)MONITOR_WIDTH; + scaleY = ((float)GetSystemMetrics(SM_CYSCREEN) - 1) / (float)MONITOR_HEIGHT; - case PLACEMENT_STRETCH: - StretchDIBits(draw->hDC, - 0, - 0, - draw->rcItem.right, - draw->rcItem.bottom, - 0, - 0, - pData->pWallpaperBitmap->width, - pData->pWallpaperBitmap->height, - pData->pWallpaperBitmap->bits, - pData->pWallpaperBitmap->info, - DIB_RGB_COLORS, - SRCCOPY); - break; + scaledWidth = (int)(pData->pWallpaperBitmap->width / scaleX); + scaledHeight = (int)(pData->pWallpaperBitmap->height / scaleY); - case PLACEMENT_TILE: - for (y = 0; y < draw->rcItem.bottom; y += scaledHeight) - { - for (x = 0; x < draw->rcItem.right; x += scaledWidth) + FillRect(hDC, &rcItem, GetSysColorBrush(COLOR_BACKGROUND)); + + SetStretchBltMode(hDC, COLORONCOLOR); + + switch (pData->placementSelection) + { + case PLACEMENT_CENTER: + posX = (MONITOR_WIDTH - scaledWidth + 1) / 2; + posY = (MONITOR_HEIGHT - scaledHeight + 1) / 2; + desX = 0; + desY = 0; + + if (posX < 0) { desX = -posX / 2; posX = 0; } + if (posY < 0) { desY = -posY / 2; posY = 0; } + + if (scaledWidth > MONITOR_WIDTH) + scaledWidth = MONITOR_WIDTH; + + if (scaledHeight > MONITOR_HEIGHT) + scaledHeight = MONITOR_HEIGHT; + + StretchDIBits(hDC, + MONITOR_LEFT+posX, + MONITOR_TOP+posY, + scaledWidth, + scaledHeight, + desX, + desY, + pData->pWallpaperBitmap->width - (int)(desX * scaleX), + pData->pWallpaperBitmap->height - (int)(desY * scaleY), + pData->pWallpaperBitmap->bits, + pData->pWallpaperBitmap->info, + DIB_RGB_COLORS, + SRCCOPY); + break; + + case PLACEMENT_STRETCH: + StretchDIBits(hDC, + MONITOR_LEFT, + MONITOR_TOP, + MONITOR_WIDTH, + MONITOR_HEIGHT, + 0, + 0, + pData->pWallpaperBitmap->width, + pData->pWallpaperBitmap->height, + pData->pWallpaperBitmap->bits, + pData->pWallpaperBitmap->info, + DIB_RGB_COLORS, + SRCCOPY); + break; + + case PLACEMENT_TILE: + for (y = 0; y < MONITOR_HEIGHT; y += scaledHeight) { - StretchDIBits(draw->hDC, - x, - y, - scaledWidth, - scaledHeight, - 0, - 0, - pData->pWallpaperBitmap->width, - pData->pWallpaperBitmap->height, - pData->pWallpaperBitmap->bits, - pData->pWallpaperBitmap->info, - DIB_RGB_COLORS, - SRCCOPY); + for (x = 0; x < MONITOR_WIDTH; x += scaledWidth) + { + if ((MONITOR_WIDTH-x) >= scaledWidth) + posX = scaledWidth; + else + posX = MONITOR_WIDTH-x; + + + if ((MONITOR_HEIGHT-y) >= scaledHeight) + posY = scaledHeight; + else + posY = MONITOR_HEIGHT-y; + + StretchDIBits(hDC, + MONITOR_LEFT + x, + MONITOR_TOP + y, + posX, + posY, + 0, + 0, + pData->pWallpaperBitmap->width * posX / scaledWidth, + pData->pWallpaperBitmap->height * posY / scaledHeight, + pData->pWallpaperBitmap->bits, + pData->pWallpaperBitmap->info, + DIB_RGB_COLORS, + SRCCOPY); + } + } - } - break; + + break; + } } + + TransparentBlt(draw->hDC, + draw->rcItem.left, draw->rcItem.top, + draw->rcItem.right-draw->rcItem.left+1, + draw->rcItem.bottom-draw->rcItem.top+1, + hDC, + 0, 0, + pData->cxSource, pData->cySource, + 0xFF00FF); + + SelectObject(hDC, hOldObj); + DeleteDC(hDC); } @@ -724,25 +782,6 @@ BackgroundPageProc(HWND hwndDlg, } } break; - case WM_PAINT: - { - PAINTSTRUCT ps; - HDC hdc, hdcMem; - - hdc = BeginPaint(hwndDlg, &ps); - - hdcMem = CreateCompatibleDC(hdc); - SelectObject(hdcMem, pData->hBitmap); -/* - TransparentBlt(hdc, 98, 0, - pData->cxSource, pData->cySource, hdcMem, 0, 0, - pData->cxSource, pData->cySource, 0xFF80FF); -*/ - DeleteDC(hdcMem); - EndPaint(hwndDlg, &ps); - } - break; - case WM_DRAWITEM: { LPDRAWITEMSTRUCT drawItem; diff --git a/dll/cpl/desk/devsett.c b/dll/cpl/desk/devsett.c index 5c6320f5b1d..d175d1a9a6d 100644 --- a/dll/cpl/desk/devsett.c +++ b/dll/cpl/desk/devsett.c @@ -86,7 +86,7 @@ pCDevSettings_AllocAndCopyString(const TCHAR *pszSrc) wcscpy(str, pszSrc); #else - MultiByteToWideChar(CP_APC, + MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, diff --git a/dll/cpl/desk/lang/bg-BG.rc b/dll/cpl/desk/lang/bg-BG.rc index 66f648a21a8..ad7e006fb9d 100644 --- a/dll/cpl/desk/lang/bg-BG.rc +++ b/dll/cpl/desk/lang/bg-BG.rc @@ -8,7 +8,7 @@ CAPTION " FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70,WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "",IDC_BACKGROUND_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 8, 114, 174, 78 @@ -18,7 +18,7 @@ BEGIN PUSHBUTTON "&ヨ...", IDC_COLOR_BUTTON, 188, 177, 50, 15 LTEXT "ミ珸趺韃:", IDC_STATIC, 188, 138, 55, 9 COMBOBOX IDC_PLACEMENT_COMBO, 188, 149, 50, 54, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END diff --git a/dll/cpl/desk/lang/cs-CZ.rc b/dll/cpl/desk/lang/cs-CZ.rc index 384d954182e..0ca4627f511 100644 --- a/dll/cpl/desk/lang/cs-CZ.rc +++ b/dll/cpl/desk/lang/cs-CZ.rc @@ -12,7 +12,7 @@ CAPTION "Pozad FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_BACKGROUND_PREVIEW,"Static",SS_OWNERDRAW, - 70, 10, 105, 70,WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "",IDC_BACKGROUND_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,99,173,71 @@ -22,7 +22,7 @@ BEGIN PUSHBUTTON "&Barva...",IDC_COLOR_BUTTON,187,155,50,14 LTEXT "Umstn:",IDC_STATIC,187,98,36,8 COMBOBOX IDC_PLACEMENT_COMBO,187,108,50,90,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP + WS_VSCROLL | WS_TABSTOP END diff --git a/dll/cpl/desk/lang/de-DE.rc b/dll/cpl/desk/lang/de-DE.rc index d0829d9fbc0..55d91d4ac31 100644 --- a/dll/cpl/desk/lang/de-DE.rc +++ b/dll/cpl/desk/lang/de-DE.rc @@ -6,7 +6,7 @@ CAPTION "Desktop" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70, WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "", IDC_BACKGROUND_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 8, 114, 174, 78 @@ -16,7 +16,7 @@ BEGIN PUSHBUTTON "&Farbe...", IDC_COLOR_BUTTON, 188, 177, 55, 15 LTEXT "&Ausrichtung:", IDC_STATIC, 188, 140, 50, 9 COMBOBOX IDC_PLACEMENT_COMBO, 188, 149, 50, 54, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 diff --git a/dll/cpl/desk/lang/el-GR.rc b/dll/cpl/desk/lang/el-GR.rc index b4abca50c6c..e9988ab2b53 100644 --- a/dll/cpl/desk/lang/el-GR.rc +++ b/dll/cpl/desk/lang/el-GR.rc @@ -6,7 +6,7 @@ CAPTION " FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70, WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "", IDC_BACKGROUND_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 7, 99, 163, 71 @@ -16,7 +16,7 @@ BEGIN PUSHBUTTON "&ラ...", IDC_COLOR_BUTTON, 177, 155, 64, 14 LTEXT "ネン:", IDC_STATIC, 177, 98, 36, 8 COMBOBOX IDC_PLACEMENT_COMBO, 177, 108, 64, 90, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 diff --git a/dll/cpl/desk/lang/en-US.rc b/dll/cpl/desk/lang/en-US.rc index 8a04cf15668..e955b8eea16 100644 --- a/dll/cpl/desk/lang/en-US.rc +++ b/dll/cpl/desk/lang/en-US.rc @@ -6,7 +6,7 @@ CAPTION "Background" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70,WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "",IDC_BACKGROUND_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 8, 114, 174, 78 @@ -16,7 +16,7 @@ BEGIN PUSHBUTTON "&Color...", IDC_COLOR_BUTTON, 188, 177, 50, 15 LTEXT "Placement:", IDC_STATIC, 188, 138, 36, 9 COMBOBOX IDC_PLACEMENT_COMBO, 188, 149, 50, 54, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 diff --git a/dll/cpl/desk/lang/es-ES.rc b/dll/cpl/desk/lang/es-ES.rc index c6ce2ec5c9c..2d71ca2a120 100644 --- a/dll/cpl/desk/lang/es-ES.rc +++ b/dll/cpl/desk/lang/es-ES.rc @@ -14,7 +14,7 @@ CAPTION "Escritorio" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70,WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "",IDC_BACKGROUND_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 7, 99, 173, 71 @@ -24,7 +24,7 @@ BEGIN PUSHBUTTON "C&olor...", IDC_COLOR_BUTTON, 187, 155, 50, 14 LTEXT "Po&sicin", IDC_STATIC, 187, 98, 36, 8 COMBOBOX IDC_PLACEMENT_COMBO, 187, 108, 50, 90, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 diff --git a/dll/cpl/desk/lang/fr-FR.rc b/dll/cpl/desk/lang/fr-FR.rc index b4dc42fc3e3..1158e2cde64 100644 --- a/dll/cpl/desk/lang/fr-FR.rc +++ b/dll/cpl/desk/lang/fr-FR.rc @@ -9,7 +9,7 @@ CAPTION "Fond d' FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW,"Static", SS_OWNERDRAW, - 70, 10, 105, 70, WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "", IDC_BACKGROUND_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 7, 99, 173, 71 @@ -19,7 +19,7 @@ BEGIN PUSHBUTTON "&Couleur...",IDC_COLOR_BUTTON, 187, 155, 50, 14 LTEXT "Position :",IDC_STATIC, 187, 98, 36, 8 COMBOBOX IDC_PLACEMENT_COMBO, 187, 108, 50, 90, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 diff --git a/dll/cpl/desk/lang/hu-HU.rc b/dll/cpl/desk/lang/hu-HU.rc index 2e8c09c4817..874408398e1 100644 --- a/dll/cpl/desk/lang/hu-HU.rc +++ b/dll/cpl/desk/lang/hu-HU.rc @@ -7,7 +7,7 @@ CAPTION "H FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70, WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "", IDC_BACKGROUND_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 7, 99, 173, 71 @@ -17,7 +17,7 @@ BEGIN PUSHBUTTON "&Sznek...", IDC_COLOR_BUTTON, 187, 155, 50, 14 LTEXT "Elrendez駸:", IDC_STATIC, 187, 98, 36, 8 COMBOBOX IDC_PLACEMENT_COMBO, 187, 148, 50, 90, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 diff --git a/dll/cpl/desk/lang/id-ID.rc b/dll/cpl/desk/lang/id-ID.rc index 0991114c85f..c081f87009c 100644 --- a/dll/cpl/desk/lang/id-ID.rc +++ b/dll/cpl/desk/lang/id-ID.rc @@ -6,7 +6,7 @@ CAPTION "Latar Belakang" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70,WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "",IDC_BACKGROUND_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 8, 114, 174, 78 @@ -16,7 +16,7 @@ BEGIN PUSHBUTTON "&Warna...", IDC_COLOR_BUTTON, 188, 177, 50, 15 LTEXT "Penempatan:", IDC_STATIC, 188, 138, 36, 9 COMBOBOX IDC_PLACEMENT_COMBO, 188, 149, 50, 54, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 diff --git a/dll/cpl/desk/lang/it-IT.rc b/dll/cpl/desk/lang/it-IT.rc index 61546b26313..7e21fbc95ed 100644 --- a/dll/cpl/desk/lang/it-IT.rc +++ b/dll/cpl/desk/lang/it-IT.rc @@ -6,7 +6,7 @@ CAPTION "Sfondo" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70, WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "", IDC_BACKGROUND_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 8, 122, 174, 78 @@ -16,7 +16,7 @@ BEGIN PUSHBUTTON "&Colore...", IDC_COLOR_BUTTON, 188, 185, 50, 15 LTEXT "Posizione:", IDC_STATIC, 188, 146, 36, 9 COMBOBOX IDC_PLACEMENT_COMBO, 188, 157, 50, 54, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 @@ -201,8 +201,8 @@ BEGIN IDS_CPLDESCRIPTION "Adatta la visualizzazione del desktop e dello screen saver." IDS_NONE "(Niente)" IDS_CENTER "Al centro" - IDS_STRETCH "Affiancata" - IDS_TILE "Estesa" + IDS_STRETCH "Estesa" + IDS_TILE "Affiancata" END STRINGTABLE DISCARDABLE diff --git a/dll/cpl/desk/lang/ja-JP.rc b/dll/cpl/desk/lang/ja-JP.rc index 178ebd960ab..acc45c7ab73 100644 --- a/dll/cpl/desk/lang/ja-JP.rc +++ b/dll/cpl/desk/lang/ja-JP.rc @@ -6,7 +6,7 @@ CAPTION " FONT 9, "MS UI Gothic" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70,WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "",IDC_BACKGROUND_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 8, 114, 174, 78 @@ -16,7 +16,7 @@ BEGIN PUSHBUTTON "色(&C)...", IDC_COLOR_BUTTON, 188, 177, 50, 15 LTEXT "表\示位置:", IDC_STATIC, 188, 138, 36, 9 COMBOBOX IDC_PLACEMENT_COMBO, 188, 149, 50, 54, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 diff --git a/dll/cpl/desk/lang/nl-NL.rc b/dll/cpl/desk/lang/nl-NL.rc index feb903cda19..74f1842a013 100644 --- a/dll/cpl/desk/lang/nl-NL.rc +++ b/dll/cpl/desk/lang/nl-NL.rc @@ -8,7 +8,7 @@ CAPTION "Achtergrond" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static",SS_OWNERDRAW, - 70, 10, 105, 70, WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "", IDC_BACKGROUND_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 7, 99, 173, 71 @@ -18,7 +18,7 @@ BEGIN PUSHBUTTON "&Kleur...", IDC_COLOR_BUTTON, 187, 155, 50, 14 LTEXT "&Weergave:", IDC_STATIC, 187, 98, 36, 8 COMBOBOX IDC_PLACEMENT_COMBO, 187, 108, 50, 90, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 diff --git a/dll/cpl/desk/lang/no-NO.rc b/dll/cpl/desk/lang/no-NO.rc index b248524805d..61edf39a2fd 100644 --- a/dll/cpl/desk/lang/no-NO.rc +++ b/dll/cpl/desk/lang/no-NO.rc @@ -6,7 +6,7 @@ CAPTION "Bakgrunn" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70,WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "",IDC_BACKGROUND_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 8, 114, 174, 78 @@ -16,7 +16,7 @@ BEGIN PUSHBUTTON "&Farger...", IDC_COLOR_BUTTON, 188, 177, 50, 15 LTEXT "Plassering:", IDC_STATIC, 188, 138, 36, 9 COMBOBOX IDC_PLACEMENT_COMBO, 188, 149, 50, 54, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END diff --git a/dll/cpl/desk/lang/pl-PL.rc b/dll/cpl/desk/lang/pl-PL.rc index 01d7c796d70..436b9d40f6c 100644 --- a/dll/cpl/desk/lang/pl-PL.rc +++ b/dll/cpl/desk/lang/pl-PL.rc @@ -16,7 +16,7 @@ CAPTION "Pulpit" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70, WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "", IDC_BACKGROUND_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 7, 99, 173, 71 @@ -26,7 +26,7 @@ BEGIN PUSHBUTTON "&Kolor...", IDC_COLOR_BUTTON, 187, 155, 50, 14 LTEXT "Poウoソenie:", IDC_STATIC, 187, 98, 36, 8 COMBOBOX IDC_PLACEMENT_COMBO, 187, 108, 50, 90, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 diff --git a/dll/cpl/desk/lang/ro-RO.rc b/dll/cpl/desk/lang/ro-RO.rc index c0a738cc08e..39b0b41c41e 100644 --- a/dll/cpl/desk/lang/ro-RO.rc +++ b/dll/cpl/desk/lang/ro-RO.rc @@ -8,7 +8,7 @@ CAPTION "Fundal" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70,WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "",IDC_BACKGROUND_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 8, 114, 174, 78 @@ -18,7 +18,7 @@ BEGIN PUSHBUTTON "&Culoare...", IDC_COLOR_BUTTON, 188, 177, 50, 15 LTEXT "Poziネ嬖e:", IDC_STATIC, 188, 138, 36, 9 COMBOBOX IDC_PLACEMENT_COMBO, 188, 149, 50, 54, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END diff --git a/dll/cpl/desk/lang/ru-RU.rc b/dll/cpl/desk/lang/ru-RU.rc index ba507026e1a..519da21015f 100644 --- a/dll/cpl/desk/lang/ru-RU.rc +++ b/dll/cpl/desk/lang/ru-RU.rc @@ -6,7 +6,7 @@ CAPTION " FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70, WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "", IDC_BACKGROUND_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 8, 114, 174, 78 @@ -16,7 +16,7 @@ BEGIN PUSHBUTTON "&ヨ粢...", IDC_COLOR_BUTTON, 188, 167, 55, 15 LTEXT "ミ瑰趺韃:", IDC_STATIC, 188, 138, 55, 9 COMBOBOX IDC_PLACEMENT_COMBO, 188, 149, 55, 54, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 diff --git a/dll/cpl/desk/lang/sk-SK.rc b/dll/cpl/desk/lang/sk-SK.rc index 68ccf0684cc..0743898065c 100644 --- a/dll/cpl/desk/lang/sk-SK.rc +++ b/dll/cpl/desk/lang/sk-SK.rc @@ -14,7 +14,7 @@ CAPTION "Pozadie" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70,WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "",IDC_BACKGROUND_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 8, 114, 174, 78 @@ -24,7 +24,7 @@ BEGIN PUSHBUTTON "&Farba...", IDC_COLOR_BUTTON, 188, 177, 50, 15 LTEXT "&Umiestnenie:", IDC_STATIC, 188, 138, 50, 9 COMBOBOX IDC_PLACEMENT_COMBO, 188, 149, 50, 54, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END diff --git a/dll/cpl/desk/lang/sv-SE.rc b/dll/cpl/desk/lang/sv-SE.rc index dd70390010e..49f8c7bda2c 100644 --- a/dll/cpl/desk/lang/sv-SE.rc +++ b/dll/cpl/desk/lang/sv-SE.rc @@ -9,7 +9,7 @@ CAPTION "Bakgrund" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_BACKGROUND_PREVIEW,"Static",SS_OWNERDRAW, - 70, 10, 105, 70,WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "",IDC_BACKGROUND_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,99,173,71 @@ -19,7 +19,7 @@ BEGIN PUSHBUTTON "&F舐g...",IDC_COLOR_BUTTON,187,155,50,14 LTEXT "Placering:",IDC_STATIC,187,98,36,8 COMBOBOX IDC_PLACEMENT_COMBO,187,108,50,90,CBS_DROPDOWNLIST | - CBS_SORT | WS_VSCROLL | WS_TABSTOP + WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 diff --git a/dll/cpl/desk/lang/uk-UA.rc b/dll/cpl/desk/lang/uk-UA.rc index e92bdb04380..bcbefe72481 100644 --- a/dll/cpl/desk/lang/uk-UA.rc +++ b/dll/cpl/desk/lang/uk-UA.rc @@ -14,7 +14,7 @@ CAPTION " FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70, WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "", IDC_BACKGROUND_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 8, 114, 174, 78 @@ -24,7 +24,7 @@ BEGIN PUSHBUTTON "&ハウ...", IDC_COLOR_BUTTON, 188, 177, 50, 15 LTEXT "ミ銓璧籵:", IDC_STATIC, 188, 138, 51, 9 COMBOBOX IDC_PLACEMENT_COMBO, 188, 149, 50, 54, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END IDD_SCREENSAVER DIALOGEX 0, 0, 246, 204 diff --git a/dll/cpl/desk/lang/zh-CN.rc b/dll/cpl/desk/lang/zh-CN.rc index 33e46997781..f09d566fa7f 100644 --- a/dll/cpl/desk/lang/zh-CN.rc +++ b/dll/cpl/desk/lang/zh-CN.rc @@ -13,7 +13,7 @@ CAPTION " FONT 9, "MS Shell Dlg" BEGIN CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, - 70, 10, 105, 70,WS_EX_STATICEDGE + 70, 10, 105, 80, 0 CONTROL "",IDC_BACKGROUND_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 8, 114, 174, 78 @@ -23,7 +23,7 @@ BEGIN PUSHBUTTON "ムユノォ(&C)...", IDC_COLOR_BUTTON, 188, 177, 50, 15 LTEXT "ホサヨテ:", IDC_STATIC, 188, 138, 36, 9 COMBOBOX IDC_PLACEMENT_COMBO, 188, 149, 50, 54, - CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END diff --git a/dll/cpl/desk/screensaver.c b/dll/cpl/desk/screensaver.c index 37b8f0d576e..deeeda6ec73 100644 --- a/dll/cpl/desk/screensaver.c +++ b/dll/cpl/desk/screensaver.c @@ -22,9 +22,10 @@ typedef struct typedef struct _DATA { - ScreenSaverItem ScreenSaverItems[MAX_SCREENSAVERS]; + ScreenSaverItem ScreenSaverItems[MAX_SCREENSAVERS]; PROCESS_INFORMATION PrevWindowPi; - int Selection; + int Selection; + UINT ScreenSaverCount; } DATA, *PDATA; @@ -235,7 +236,7 @@ ScreensaverPreview(HWND hwndDlg, PDATA pData) /s Run normal */ - WCHAR szCmdline[2048]; + TCHAR szCmdline[2048]; STARTUPINFO si; PROCESS_INFORMATION pi; @@ -322,59 +323,39 @@ CheckRegScreenSaverIsSecure(HWND hwndDlg) static VOID -AddScreenSavers(HWND hwndDlg, PDATA pData) +SearchScreenSavers(HWND hwndScreenSavers, + LPCTSTR pszSearchPath, + PDATA pData) { - HWND hwndScreenSavers = GetDlgItem(hwndDlg, IDC_SCREENS_LIST); - WIN32_FIND_DATA fd; - HANDLE hFind; - TCHAR szSearchPath[MAX_PATH]; - INT i; - int ScreenSaverCount = 0; - ScreenSaverItem *ScreenSaverItem = NULL; - HANDLE hModule = NULL; + WIN32_FIND_DATA fd; + TCHAR szSearchPath[MAX_PATH]; + HANDLE hFind; + ScreenSaverItem *ScreenSaverItem; + HANDLE hModule; + UINT i, ScreenSaverCount; - /* Add the "None" item */ - ScreenSaverItem = &pData->ScreenSaverItems[ScreenSaverCount]; + ScreenSaverCount = pData->ScreenSaverCount; - ScreenSaverItem->bIsScreenSaver = FALSE; - - LoadString(hApplet, - IDS_NONE, - ScreenSaverItem->szDisplayName, - sizeof(ScreenSaverItem->szDisplayName) / sizeof(TCHAR)); - - i = SendMessage(hwndScreenSavers, - CB_ADDSTRING, - 0, - (LPARAM)ScreenSaverItem->szDisplayName); - - SendMessage(hwndScreenSavers, - CB_SETITEMDATA, - i, - (LPARAM)ScreenSaverCount); - - ScreenSaverCount++; - - /* Add all the screensavers in the C:\ReactOS\System32 directory. */ - - GetSystemDirectory(szSearchPath, MAX_PATH); + _tcscpy(szSearchPath, pszSearchPath); _tcscat(szSearchPath, TEXT("\\*.scr")); hFind = FindFirstFile(szSearchPath, &fd); - while (ScreenSaverCount < MAX_SCREENSAVERS-1 && - hFind != INVALID_HANDLE_VALUE) + + if (hFind == INVALID_HANDLE_VALUE) + return; + + while (ScreenSaverCount < MAX_SCREENSAVERS) { /* Don't add any hidden screensavers */ if ((fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0) { TCHAR filename[MAX_PATH]; - GetSystemDirectory(filename, MAX_PATH); - - _tcscat(filename, TEXT("\\")); + _tcscpy(filename, pszSearchPath); + _tcscat(filename, _T("\\")); _tcscat(filename, fd.cFileName); - ScreenSaverItem = &pData->ScreenSaverItems[ScreenSaverCount]; + ScreenSaverItem = pData->ScreenSaverItems + ScreenSaverCount; ScreenSaverItem->bIsScreenSaver = TRUE; @@ -383,11 +364,16 @@ AddScreenSavers(HWND hwndDlg, PDATA pData) DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE); if (hModule) { - LoadString(hModule, + if (0 == LoadString(hModule, 1, ScreenSaverItem->szDisplayName, - sizeof(ScreenSaverItem->szDisplayName) / sizeof(TCHAR)); - FreeLibrary(hModule); + sizeof(ScreenSaverItem->szDisplayName) / sizeof(TCHAR))) + { + // If the string does not exists, copy the name of the file + _tcscpy(ScreenSaverItem->szDisplayName, fd.cFileName); + ScreenSaverItem->szDisplayName[_tcslen(fd.cFileName)-4] = '\0'; + } + FreeLibrary(hModule); } else { @@ -410,7 +396,62 @@ AddScreenSavers(HWND hwndDlg, PDATA pData) } if (!FindNextFile(hFind, &fd)) - hFind = INVALID_HANDLE_VALUE; + break; + } + + FindClose(hFind); + + pData->ScreenSaverCount = ScreenSaverCount; +} + + +static VOID +AddScreenSavers(HWND hwndDlg, PDATA pData) +{ + HWND hwndScreenSavers = GetDlgItem(hwndDlg, IDC_SCREENS_LIST); + TCHAR szSearchPath[MAX_PATH]; + INT i; + ScreenSaverItem *ScreenSaverItem = NULL; + LPTSTR lpBackSlash; + + /* Add the "None" item */ + ScreenSaverItem = pData->ScreenSaverItems; + + ScreenSaverItem->bIsScreenSaver = FALSE; + + LoadString(hApplet, + IDS_NONE, + ScreenSaverItem->szDisplayName, + sizeof(ScreenSaverItem->szDisplayName) / sizeof(TCHAR)); + + i = SendMessage(hwndScreenSavers, + CB_ADDSTRING, + 0, + (LPARAM)ScreenSaverItem->szDisplayName); + + SendMessage(hwndScreenSavers, + CB_SETITEMDATA, + i, + (LPARAM)0); + + // Initialize number of items into the list + pData->ScreenSaverCount = 1; + + // Add all the screensavers in the C:\ReactOS\System32 directory. + GetSystemDirectory(szSearchPath, MAX_PATH); + SearchScreenSavers(hwndScreenSavers, szSearchPath, pData); + + // Add all the screensavers in the C:\ReactOS directory. + GetWindowsDirectory(szSearchPath, MAX_PATH); + SearchScreenSavers(hwndScreenSavers, szSearchPath, pData); + + // Add all the screensavers where the applet is stored. + GetModuleFileName(hApplet, szSearchPath, MAX_PATH); + lpBackSlash = _tcsrchr(szSearchPath, _T('\\')); + if (lpBackSlash != NULL) + { + lpBackSlash = '\0'; + SearchScreenSavers(hwndScreenSavers, szSearchPath, pData); } } diff --git a/dll/directx/wine/d3d8/buffer.c b/dll/directx/wine/d3d8/buffer.c new file mode 100644 index 00000000000..f7dc12d8f60 --- /dev/null +++ b/dll/directx/wine/d3d8/buffer.c @@ -0,0 +1,549 @@ +/* + * Copyright 2005 Oliver Stieber + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "d3d8_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d8); + +static HRESULT WINAPI d3d8_vertexbuffer_QueryInterface(IDirect3DVertexBuffer8 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IDirect3DVertexBuffer8) + || IsEqualGUID(riid, &IID_IDirect3DResource8) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IUnknown_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3d8_vertexbuffer_AddRef(IDirect3DVertexBuffer8 *iface) +{ + IDirect3DVertexBuffer8Impl *buffer = (IDirect3DVertexBuffer8Impl *)iface; + ULONG refcount = InterlockedIncrement(&buffer->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + if (refcount == 1) + { + IDirect3DDevice8_AddRef(buffer->parentDevice); + wined3d_mutex_lock(); + IWineD3DBuffer_AddRef(buffer->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + } + + return refcount; +} + +static ULONG WINAPI d3d8_vertexbuffer_Release(IDirect3DVertexBuffer8 *iface) +{ + IDirect3DVertexBuffer8Impl *buffer = (IDirect3DVertexBuffer8Impl *)iface; + ULONG refcount = InterlockedDecrement(&buffer->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + { + IDirect3DDevice8 *device = buffer->parentDevice; + + wined3d_mutex_lock(); + IWineD3DBuffer_Release(buffer->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice8_Release(device); + } + + return refcount; +} + +static HRESULT WINAPI d3d8_vertexbuffer_GetDevice(IDirect3DVertexBuffer8 *iface, IDirect3DDevice8 **device) +{ + TRACE("iface %p, device %p.\n", iface, device); + + *device = (IDirect3DDevice8 *)((IDirect3DVertexBuffer8Impl *)iface)->parentDevice; + IDirect3DDevice8_AddRef(*device); + + TRACE("Returning device %p.\n", *device); + + return D3D_OK; +} + +static HRESULT WINAPI d3d8_vertexbuffer_SetPrivateData(IDirect3DVertexBuffer8 *iface, + REFGUID guid, const void *data, DWORD data_size, DWORD flags) +{ + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", + iface, debugstr_guid(guid), data, data_size, flags); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_SetPrivateData(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer, + guid, data, data_size, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_vertexbuffer_GetPrivateData(IDirect3DVertexBuffer8 *iface, + REFGUID guid, void *data, DWORD *data_size) +{ + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %p.\n", + iface, debugstr_guid(guid), data, data_size); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_GetPrivateData(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer, + guid, data, data_size); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_vertexbuffer_FreePrivateData(IDirect3DVertexBuffer8 *iface, REFGUID guid) +{ + HRESULT hr; + + TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_FreePrivateData(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer, guid); + wined3d_mutex_unlock(); + + return hr; +} + +static DWORD WINAPI d3d8_vertexbuffer_SetPriority(IDirect3DVertexBuffer8 *iface, DWORD priority) +{ + DWORD previous; + + TRACE("iface %p, priority %u.\n", iface, priority); + + wined3d_mutex_lock(); + previous = IWineD3DBuffer_SetPriority(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer, priority); + wined3d_mutex_unlock(); + + return previous; +} + +static DWORD WINAPI d3d8_vertexbuffer_GetPriority(IDirect3DVertexBuffer8 *iface) +{ + DWORD priority; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + priority = IWineD3DBuffer_GetPriority(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + + return priority; +} + +static void WINAPI d3d8_vertexbuffer_PreLoad(IDirect3DVertexBuffer8 *iface) +{ + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + IWineD3DBuffer_PreLoad(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer); + wined3d_mutex_unlock(); +} + +static D3DRESOURCETYPE WINAPI d3d8_vertexbuffer_GetType(IDirect3DVertexBuffer8 *iface) +{ + TRACE("iface %p.\n", iface); + + return D3DRTYPE_VERTEXBUFFER; +} + +static HRESULT WINAPI d3d8_vertexbuffer_Lock(IDirect3DVertexBuffer8 *iface, + UINT offset, UINT size, BYTE **data, DWORD flags) +{ + HRESULT hr; + + TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", + iface, offset, size, data, flags); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_Map(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer, + offset, size, data, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_vertexbuffer_Unlock(IDirect3DVertexBuffer8 *iface) +{ + HRESULT hr; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_Unmap(((IDirect3DVertexBuffer8Impl *)iface)->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_vertexbuffer_GetDesc(IDirect3DVertexBuffer8 *iface, D3DVERTEXBUFFER_DESC *desc) +{ + IDirect3DVertexBuffer8Impl *buffer = (IDirect3DVertexBuffer8Impl *)iface; + WINED3DBUFFER_DESC wined3d_desc; + + TRACE("iface %p, desc %p.\n", iface, desc); + + wined3d_mutex_lock(); + IWineD3DBuffer_GetDesc(buffer->wineD3DVertexBuffer, &wined3d_desc); + wined3d_mutex_unlock(); + + desc->Type = D3DRTYPE_VERTEXBUFFER; + desc->Usage = wined3d_desc.Usage; + desc->Pool = wined3d_desc.Pool; + desc->Size = wined3d_desc.Size; + desc->FVF = buffer->fvf; + desc->Format = D3DFMT_VERTEXDATA; + + return D3D_OK; +} + +static const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl = +{ + /* IUnknown */ + d3d8_vertexbuffer_QueryInterface, + d3d8_vertexbuffer_AddRef, + d3d8_vertexbuffer_Release, + /* IDirect3DResource8 */ + d3d8_vertexbuffer_GetDevice, + d3d8_vertexbuffer_SetPrivateData, + d3d8_vertexbuffer_GetPrivateData, + d3d8_vertexbuffer_FreePrivateData, + d3d8_vertexbuffer_SetPriority, + d3d8_vertexbuffer_GetPriority, + d3d8_vertexbuffer_PreLoad, + d3d8_vertexbuffer_GetType, + /* IDirect3DVertexBuffer8 */ + d3d8_vertexbuffer_Lock, + d3d8_vertexbuffer_Unlock, + d3d8_vertexbuffer_GetDesc, +}; + +static void STDMETHODCALLTYPE d3d8_vertexbuffer_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d8_vertexbuffer_wined3d_parent_ops = +{ + d3d8_vertexbuffer_wined3d_object_destroyed, +}; + +HRESULT vertexbuffer_init(IDirect3DVertexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, + UINT size, DWORD usage, DWORD fvf, D3DPOOL pool) +{ + HRESULT hr; + + buffer->lpVtbl = &Direct3DVertexBuffer8_Vtbl; + buffer->ref = 1; + buffer->fvf = fvf; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateVertexBuffer(device->WineD3DDevice, size, usage & WINED3DUSAGE_MASK, + (WINED3DPOOL)pool, buffer, &d3d8_vertexbuffer_wined3d_parent_ops, &buffer->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d buffer, hr %#x.\n", hr); + return hr; + } + + buffer->parentDevice = (IDirect3DDevice8 *)device; + IUnknown_AddRef(buffer->parentDevice); + + return D3D_OK; +} + +static HRESULT WINAPI d3d8_indexbuffer_QueryInterface(IDirect3DIndexBuffer8 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IDirect3DIndexBuffer8) + || IsEqualGUID(riid, &IID_IDirect3DResource8) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IUnknown_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3d8_indexbuffer_AddRef(IDirect3DIndexBuffer8 *iface) +{ + IDirect3DIndexBuffer8Impl *buffer = (IDirect3DIndexBuffer8Impl *)iface; + ULONG refcount = InterlockedIncrement(&buffer->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + if (refcount == 1) + { + IDirect3DDevice8_AddRef(buffer->parentDevice); + wined3d_mutex_lock(); + IWineD3DBuffer_AddRef(buffer->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + } + + return refcount; +} + +static ULONG WINAPI d3d8_indexbuffer_Release(IDirect3DIndexBuffer8 *iface) +{ + IDirect3DIndexBuffer8Impl *buffer = (IDirect3DIndexBuffer8Impl *)iface; + ULONG refcount = InterlockedDecrement(&buffer->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + { + IDirect3DDevice8 *device = buffer->parentDevice; + + wined3d_mutex_lock(); + IWineD3DBuffer_Release(buffer->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice8_Release(device); + } + + return refcount; +} + +static HRESULT WINAPI d3d8_indexbuffer_GetDevice(IDirect3DIndexBuffer8 *iface, IDirect3DDevice8 **device) +{ + TRACE("iface %p, device %p.\n", iface, device); + + *device = (IDirect3DDevice8 *)((IDirect3DIndexBuffer8Impl *)iface)->parentDevice; + IDirect3DDevice8_AddRef(*device); + + TRACE("Returning device %p.\n", *device); + + return D3D_OK; +} + +static HRESULT WINAPI d3d8_indexbuffer_SetPrivateData(IDirect3DIndexBuffer8 *iface, + REFGUID guid, const void *data, DWORD data_size, DWORD flags) +{ + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", + iface, debugstr_guid(guid), data, data_size, flags); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_SetPrivateData(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer, + guid, data, data_size, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_indexbuffer_GetPrivateData(IDirect3DIndexBuffer8 *iface, + REFGUID guid, void *data, DWORD *data_size) +{ + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %p.\n", + iface, debugstr_guid(guid), data, data_size); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_GetPrivateData(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer, + guid, data, data_size); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_indexbuffer_FreePrivateData(IDirect3DIndexBuffer8 *iface, REFGUID guid) +{ + HRESULT hr; + + TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_FreePrivateData(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer, guid); + wined3d_mutex_unlock(); + + return hr; +} + +static DWORD WINAPI d3d8_indexbuffer_SetPriority(IDirect3DIndexBuffer8 *iface, DWORD priority) +{ + DWORD previous; + + TRACE("iface %p, priority %u.\n", iface, priority); + + wined3d_mutex_lock(); + previous = IWineD3DBuffer_SetPriority(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer, priority); + wined3d_mutex_unlock(); + + return previous; +} + +static DWORD WINAPI d3d8_indexbuffer_GetPriority(IDirect3DIndexBuffer8 *iface) +{ + DWORD priority; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + priority = IWineD3DBuffer_GetPriority(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + + return priority; +} + +static void WINAPI d3d8_indexbuffer_PreLoad(IDirect3DIndexBuffer8 *iface) +{ + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + IWineD3DBuffer_PreLoad(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer); + wined3d_mutex_unlock(); +} + +static D3DRESOURCETYPE WINAPI d3d8_indexbuffer_GetType(IDirect3DIndexBuffer8 *iface) +{ + TRACE("iface %p.\n", iface); + + return D3DRTYPE_INDEXBUFFER; +} + +static HRESULT WINAPI d3d8_indexbuffer_Lock(IDirect3DIndexBuffer8 *iface, + UINT offset, UINT size, BYTE **data, DWORD flags) +{ + HRESULT hr; + + TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", + iface, offset, size, data, flags); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_Map(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer, + offset, size, data, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_indexbuffer_Unlock(IDirect3DIndexBuffer8 *iface) +{ + HRESULT hr; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_Unmap(((IDirect3DIndexBuffer8Impl *)iface)->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d8_indexbuffer_GetDesc(IDirect3DIndexBuffer8 *iface, D3DINDEXBUFFER_DESC *desc) +{ + IDirect3DIndexBuffer8Impl *buffer = (IDirect3DIndexBuffer8Impl *)iface; + WINED3DBUFFER_DESC wined3d_desc; + + TRACE("iface %p, desc %p.\n", iface, desc); + + wined3d_mutex_lock(); + IWineD3DBuffer_GetDesc(buffer->wineD3DIndexBuffer, &wined3d_desc); + wined3d_mutex_unlock(); + + desc->Format = d3dformat_from_wined3dformat(buffer->format); + desc->Type = D3DRTYPE_INDEXBUFFER; + desc->Usage = wined3d_desc.Usage; + desc->Pool = wined3d_desc.Pool; + desc->Size = wined3d_desc.Size; + + return D3D_OK; +} + +static const IDirect3DIndexBuffer8Vtbl d3d8_indexbuffer_vtbl = +{ + /* IUnknown */ + d3d8_indexbuffer_QueryInterface, + d3d8_indexbuffer_AddRef, + d3d8_indexbuffer_Release, + /* IDirect3DResource8 */ + d3d8_indexbuffer_GetDevice, + d3d8_indexbuffer_SetPrivateData, + d3d8_indexbuffer_GetPrivateData, + d3d8_indexbuffer_FreePrivateData, + d3d8_indexbuffer_SetPriority, + d3d8_indexbuffer_GetPriority, + d3d8_indexbuffer_PreLoad, + d3d8_indexbuffer_GetType, + /* IDirect3DIndexBuffer8 */ + d3d8_indexbuffer_Lock, + d3d8_indexbuffer_Unlock, + d3d8_indexbuffer_GetDesc, +}; + +static void STDMETHODCALLTYPE d3d8_indexbuffer_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d8_indexbuffer_wined3d_parent_ops = +{ + d3d8_indexbuffer_wined3d_object_destroyed, +}; + +HRESULT indexbuffer_init(IDirect3DIndexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, + UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; + + buffer->lpVtbl = &d3d8_indexbuffer_vtbl; + buffer->ref = 1; + buffer->format = wined3dformat_from_d3dformat(format); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateIndexBuffer(device->WineD3DDevice, size, usage & WINED3DUSAGE_MASK, + (WINED3DPOOL)pool, buffer, &d3d8_indexbuffer_wined3d_parent_ops, &buffer->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d buffer, hr %#x.\n", hr); + return hr; + } + + buffer->parentDevice = (IDirect3DDevice8 *)device; + IUnknown_AddRef(buffer->parentDevice); + + return D3D_OK; +} diff --git a/dll/directx/wine/d3d8/cubetexture.c b/dll/directx/wine/d3d8/cubetexture.c index 7e48dab1d79..b9b411a1156 100644 --- a/dll/directx/wine/d3d8/cubetexture.c +++ b/dll/directx/wine/d3d8/cubetexture.c @@ -253,22 +253,27 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_GetLevelDesc(LPDIRECT3DCUBETEXTU return hr; } -static HRESULT WINAPI IDirect3DCubeTexture8Impl_GetCubeMapSurface(LPDIRECT3DCUBETEXTURE8 iface, D3DCUBEMAP_FACES FaceType, UINT Level, IDirect3DSurface8 **ppCubeMapSurface) { +static HRESULT WINAPI IDirect3DCubeTexture8Impl_GetCubeMapSurface(IDirect3DCubeTexture8 *iface, + D3DCUBEMAP_FACES FaceType, UINT Level, IDirect3DSurface8 **ppCubeMapSurface) +{ IDirect3DCubeTexture8Impl *This = (IDirect3DCubeTexture8Impl *)iface; - HRESULT hrc = D3D_OK; IWineD3DSurface *mySurface = NULL; + HRESULT hr; TRACE("iface %p, face %#x, level %u, surface %p.\n", iface, FaceType, Level, ppCubeMapSurface); wined3d_mutex_lock(); - hrc = IWineD3DCubeTexture_GetCubeMapSurface(This->wineD3DCubeTexture, (WINED3DCUBEMAP_FACES) FaceType, Level, &mySurface); - if (hrc == D3D_OK && NULL != ppCubeMapSurface) { - IWineD3DCubeTexture_GetParent(mySurface, (IUnknown **)ppCubeMapSurface); + hr = IWineD3DCubeTexture_GetCubeMapSurface(This->wineD3DCubeTexture, + (WINED3DCUBEMAP_FACES) FaceType, Level, &mySurface); + if (SUCCEEDED(hr) && ppCubeMapSurface) + { + *ppCubeMapSurface = IWineD3DCubeTexture_GetParent(mySurface); + IDirect3DSurface8_AddRef(*ppCubeMapSurface); IWineD3DCubeTexture_Release(mySurface); } wined3d_mutex_unlock(); - return hrc; + return hr; } static HRESULT WINAPI IDirect3DCubeTexture8Impl_LockRect(LPDIRECT3DCUBETEXTURE8 iface, D3DCUBEMAP_FACES FaceType, UINT Level, D3DLOCKED_RECT* pLockedRect, CONST RECT *pRect, DWORD Flags) { @@ -357,9 +362,9 @@ HRESULT cubetexture_init(IDirect3DCubeTexture8Impl *texture, IDirect3DDevice8Imp texture->ref = 1; wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateCubeTexture(device->WineD3DDevice, edge_length, levels, usage & WINED3DUSAGE_MASK, - wined3dformat_from_d3dformat(format), pool, &texture->wineD3DCubeTexture, - (IUnknown *)texture, &d3d8_cubetexture_wined3d_parent_ops); + hr = IWineD3DDevice_CreateCubeTexture(device->WineD3DDevice, edge_length, levels, + usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture, + &d3d8_cubetexture_wined3d_parent_ops, &texture->wineD3DCubeTexture); wined3d_mutex_unlock(); if (FAILED(hr)) { diff --git a/dll/directx/wine/d3d8/d3d8_main.c b/dll/directx/wine/d3d8/d3d8_main.c index c471049714b..6cefe574d19 100644 --- a/dll/directx/wine/d3d8/d3d8_main.c +++ b/dll/directx/wine/d3d8/d3d8_main.c @@ -98,7 +98,7 @@ HRESULT WINAPI ValidateVertexShader(DWORD* vertexshader, DWORD* reserved1, DWORD ret=S_OK; break; default: - ERR("vertexshader version mismatch\n"); + WARN("Invalid shader version token %#x.\n", *vertexshader); ret=E_FAIL; } @@ -136,7 +136,7 @@ HRESULT WINAPI ValidatePixelShader(DWORD* pixelshader, DWORD* reserved1, BOOL bo ret=S_OK; break; default: - ERR("pixelshader version mismatch\n"); + WARN("Invalid shader version token %#x.\n", *pixelshader); ret=E_FAIL; } return ret; diff --git a/dll/directx/wine/d3d8/d3d8_private.h b/dll/directx/wine/d3d8/d3d8_private.h index 4ba399b5d92..7e896671922 100644 --- a/dll/directx/wine/d3d8/d3d8_private.h +++ b/dll/directx/wine/d3d8/d3d8_private.h @@ -220,7 +220,7 @@ struct IDirect3DVolume8Impl }; HRESULT volume_init(IDirect3DVolume8Impl *volume, IDirect3DDevice8Impl *device, UINT width, UINT height, - UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool) DECLSPEC_HIDDEN; + UINT depth, DWORD usage, enum wined3d_format_id format, WINED3DPOOL pool) DECLSPEC_HIDDEN; /* ------------------- */ /* IDirect3DSwapChain8 */ @@ -329,7 +329,7 @@ struct IDirect3DIndexBuffer8Impl /* Parent reference */ LPDIRECT3DDEVICE8 parentDevice; - WINED3DFORMAT format; + enum wined3d_format_id format; }; HRESULT indexbuffer_init(IDirect3DIndexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, @@ -535,13 +535,8 @@ typedef struct IDirect3DPixelShader8Impl { HRESULT pixelshader_init(IDirect3DPixelShader8Impl *shader, IDirect3DDevice8Impl *device, const DWORD *byte_code, DWORD shader_handle) DECLSPEC_HIDDEN; -/** - * Internals functions - * - * to see how not defined it here - */ -D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format) DECLSPEC_HIDDEN; -WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_HIDDEN; +D3DFORMAT d3dformat_from_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN; +enum wined3d_format_id wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_HIDDEN; void load_local_constants(const DWORD *d3d8_elements, IWineD3DVertexShader *wined3d_vertex_shader) DECLSPEC_HIDDEN; size_t parse_token(const DWORD *pToken) DECLSPEC_HIDDEN; diff --git a/dll/directx/wine/d3d8/device.c b/dll/directx/wine/d3d8/device.c index 12ed0fbfd38..f54f043e006 100644 --- a/dll/directx/wine/d3d8/device.c +++ b/dll/directx/wine/d3d8/device.c @@ -36,7 +36,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d8); -D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format) +D3DFORMAT d3dformat_from_wined3dformat(enum wined3d_format_id format) { BYTE *c = (BYTE *)&format; @@ -82,12 +82,12 @@ D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format) case WINED3DFMT_R16_UINT: return D3DFMT_INDEX16; case WINED3DFMT_R32_UINT: return D3DFMT_INDEX32; default: - FIXME("Unhandled WINED3DFORMAT %#x\n", format); + FIXME("Unhandled wined3d format %#x.\n", format); return D3DFMT_UNKNOWN; } } -WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format) +enum wined3d_format_id wined3dformat_from_d3dformat(D3DFORMAT format) { BYTE *c = (BYTE *)&format; @@ -260,8 +260,7 @@ static ULONG WINAPI D3D8CB_DestroySwapChain(IWineD3DSwapChain *swapchain) TRACE("swapchain %p.\n", swapchain); - IWineD3DSwapChain_GetParent(swapchain, &parent); - IUnknown_Release(parent); + parent = IWineD3DSwapChain_GetParent(swapchain); return IUnknown_Release(parent); } @@ -370,10 +369,11 @@ static HRESULT WINAPI IDirect3DDevice8Impl_ResourceManagerDiscardBytes(LPDIRECT3 return hr; } -static HRESULT WINAPI IDirect3DDevice8Impl_GetDirect3D(LPDIRECT3DDEVICE8 iface, IDirect3D8** ppD3D8) { +static HRESULT WINAPI IDirect3DDevice8Impl_GetDirect3D(IDirect3DDevice8 *iface, IDirect3D8 **ppD3D8) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - HRESULT hr = D3D_OK; - IWineD3D* pWineD3D; + IWineD3D *pWineD3D; + HRESULT hr; TRACE("iface %p, d3d8 %p.\n", iface, ppD3D8); @@ -383,11 +383,14 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetDirect3D(LPDIRECT3DDEVICE8 iface, wined3d_mutex_lock(); hr = IWineD3DDevice_GetDirect3D(This->WineD3DDevice, &pWineD3D); - if (hr == D3D_OK && pWineD3D != NULL) + if (SUCCEEDED(hr) && pWineD3D) { - IWineD3D_GetParent(pWineD3D,(IUnknown **)ppD3D8); + *ppD3D8 = IWineD3D_GetParent(pWineD3D); + IDirect3D8_AddRef(*ppD3D8); IWineD3D_Release(pWineD3D); - } else { + } + else + { FIXME("Call to IWineD3DDevice_GetDirect3D failed\n"); *ppD3D8 = NULL; } @@ -589,23 +592,27 @@ static HRESULT WINAPI IDirect3DDevice8Impl_Present(LPDIRECT3DDEVICE8 iface, CONS return hr; } -static HRESULT WINAPI IDirect3DDevice8Impl_GetBackBuffer(LPDIRECT3DDEVICE8 iface, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8** ppBackBuffer) { +static HRESULT WINAPI IDirect3DDevice8Impl_GetBackBuffer(IDirect3DDevice8 *iface, + UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8 **ppBackBuffer) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; IWineD3DSurface *retSurface = NULL; - HRESULT rc = D3D_OK; + HRESULT hr; TRACE("iface %p, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, BackBuffer, Type, ppBackBuffer); wined3d_mutex_lock(); - rc = IWineD3DDevice_GetBackBuffer(This->WineD3DDevice, 0, BackBuffer, (WINED3DBACKBUFFER_TYPE) Type, &retSurface); - if (rc == D3D_OK && NULL != retSurface && NULL != ppBackBuffer) { - IWineD3DSurface_GetParent(retSurface, (IUnknown **)ppBackBuffer); + hr = IWineD3DDevice_GetBackBuffer(This->WineD3DDevice, 0, BackBuffer, (WINED3DBACKBUFFER_TYPE)Type, &retSurface); + if (SUCCEEDED(hr) && retSurface && ppBackBuffer) + { + *ppBackBuffer = IWineD3DSurface_GetParent(retSurface); + IDirect3DSurface8_AddRef(*ppBackBuffer); IWineD3DSurface_Release(retSurface); } wined3d_mutex_unlock(); - return rc; + return hr; } static HRESULT WINAPI IDirect3DDevice8Impl_GetRasterStatus(LPDIRECT3DDEVICE8 iface, D3DRASTER_STATUS* pRasterStatus) { @@ -879,7 +886,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, ID IDirect3DSurface8Impl *Dest = (IDirect3DSurface8Impl *) pDestinationSurface; HRESULT hr = WINED3D_OK; - WINED3DFORMAT srcFormat, destFormat; + enum wined3d_format_id srcFormat, destFormat; WINED3DSURFACE_DESC winedesc; TRACE("iface %p, src_surface %p, src_rects %p, rect_count %u, dst_surface %p, dst_points %p.\n", @@ -984,10 +991,12 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetRenderTarget(LPDIRECT3DDEVICE8 ifa return hr; } -static HRESULT WINAPI IDirect3DDevice8Impl_GetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8** ppRenderTarget) { +static HRESULT WINAPI IDirect3DDevice8Impl_GetRenderTarget(IDirect3DDevice8 *iface, + IDirect3DSurface8 **ppRenderTarget) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - HRESULT hr = D3D_OK; IWineD3DSurface *pRenderTarget; + HRESULT hr; TRACE("iface %p, render_target %p.\n", iface, ppRenderTarget); @@ -997,11 +1006,14 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetRenderTarget(LPDIRECT3DDEVICE8 i wined3d_mutex_lock(); hr = IWineD3DDevice_GetRenderTarget(This->WineD3DDevice, 0, &pRenderTarget); - - if (hr == D3D_OK && pRenderTarget != NULL) { - IWineD3DSurface_GetParent(pRenderTarget,(IUnknown**)ppRenderTarget); + if (SUCCEEDED(hr) && pRenderTarget) + { + *ppRenderTarget = IWineD3DSurface_GetParent(pRenderTarget); + IDirect3DSurface8_AddRef(*ppRenderTarget); IWineD3DSurface_Release(pRenderTarget); - } else { + } + else + { FIXME("Call to IWineD3DDevice_GetRenderTarget failed\n"); *ppRenderTarget = NULL; } @@ -1010,10 +1022,12 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetRenderTarget(LPDIRECT3DDEVICE8 i return hr; } -static HRESULT WINAPI IDirect3DDevice8Impl_GetDepthStencilSurface(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8** ppZStencilSurface) { +static HRESULT WINAPI IDirect3DDevice8Impl_GetDepthStencilSurface(IDirect3DDevice8 *iface, + IDirect3DSurface8 **ppZStencilSurface) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - HRESULT hr = D3D_OK; IWineD3DSurface *pZStencilSurface; + HRESULT hr; TRACE("iface %p, depth_stencil %p.\n", iface, ppZStencilSurface); @@ -1022,11 +1036,15 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetDepthStencilSurface(LPDIRECT3DDE } wined3d_mutex_lock(); - hr=IWineD3DDevice_GetDepthStencilSurface(This->WineD3DDevice,&pZStencilSurface); - if (hr == WINED3D_OK) { - IWineD3DSurface_GetParent(pZStencilSurface,(IUnknown**)ppZStencilSurface); + hr = IWineD3DDevice_GetDepthStencilSurface(This->WineD3DDevice, &pZStencilSurface); + if (SUCCEEDED(hr)) + { + *ppZStencilSurface = IWineD3DSurface_GetParent(pZStencilSurface); + IDirect3DSurface8_AddRef(*ppZStencilSurface); IWineD3DSurface_Release(pZStencilSurface); - }else{ + } + else + { if (hr != WINED3DERR_NOTFOUND) FIXME("Call to IWineD3DDevice_GetDepthStencilSurface failed with 0x%08x\n", hr); *ppZStencilSurface = NULL; @@ -1069,9 +1087,8 @@ static HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD TRACE("iface %p, rect_count %u, rects %p, flags %#x, color 0x%08x, z %.8e, stencil %u.\n", iface, Count, pRects, Flags, Color, Z, Stencil); - /* Note: D3DRECT is compatible with WINED3DRECT */ wined3d_mutex_lock(); - hr = IWineD3DDevice_Clear(This->WineD3DDevice, Count, (CONST WINED3DRECT*) pRects, Flags, Color, Z, Stencil); + hr = IWineD3DDevice_Clear(This->WineD3DDevice, Count, (const RECT *)pRects, Flags, Color, Z, Stencil); wined3d_mutex_unlock(); return hr; @@ -1415,8 +1432,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateStateBlock(IDirect3DDevice8 *if } wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateStateBlock(This->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)Type, - &stateblock, NULL); + hr = IWineD3DDevice_CreateStateBlock(This->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)Type, &stateblock); if (FAILED(hr)) { wined3d_mutex_unlock(); @@ -1469,7 +1485,9 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetClipStatus(LPDIRECT3DDEVICE8 iface return hr; } -static HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage,IDirect3DBaseTexture8** ppTexture) { +static HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(IDirect3DDevice8 *iface, + DWORD Stage, IDirect3DBaseTexture8 **ppTexture) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; IWineD3DBaseTexture *retTexture; HRESULT hr; @@ -1492,7 +1510,8 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, D if (retTexture) { - IWineD3DBaseTexture_GetParent(retTexture, (IUnknown **)ppTexture); + *ppTexture = IWineD3DBaseTexture_GetParent(retTexture); + IDirect3DBaseTexture8_AddRef(*ppTexture); IWineD3DBaseTexture_Release(retTexture); } else @@ -1556,13 +1575,22 @@ tss_lookup[] = {FALSE, WINED3DTSS_RESULTARG}, /* 28, D3DTSS_RESULTARG */ }; -static HRESULT WINAPI IDirect3DDevice8Impl_GetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD* pValue) { +static HRESULT WINAPI IDirect3DDevice8Impl_GetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD *pValue) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - const struct tss_lookup *l = &tss_lookup[Type]; + const struct tss_lookup *l; HRESULT hr; TRACE("iface %p, stage %u, state %#x, value %p.\n", iface, Stage, Type, pValue); + if (Type >= sizeof(tss_lookup) / sizeof(*tss_lookup)) + { + WARN("Invalid Type %#x passed.\n", Type); + return D3D_OK; + } + + l = &tss_lookup[Type]; + wined3d_mutex_lock(); if (l->sampler_state) hr = IWineD3DDevice_GetSamplerState(This->WineD3DDevice, Stage, l->state, pValue); else hr = IWineD3DDevice_GetTextureStageState(This->WineD3DDevice, Stage, l->state, pValue); @@ -1571,13 +1599,22 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetTextureStageState(LPDIRECT3DDEVI return hr; } -static HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) { +static HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - const struct tss_lookup *l = &tss_lookup[Type]; + const struct tss_lookup *l; HRESULT hr; TRACE("iface %p, stage %u, state %#x, value %#x.\n", iface, Stage, Type, Value); + if (Type >= sizeof(tss_lookup) / sizeof(*tss_lookup)) + { + WARN("Invalid Type %#x passed.\n", Type); + return D3D_OK; + } + + l = &tss_lookup[Type]; + wined3d_mutex_lock(); if (l->sampler_state) hr = IWineD3DDevice_SetSamplerState(This->WineD3DDevice, Stage, l->state, Value); else hr = IWineD3DDevice_SetTextureStageState(This->WineD3DDevice, Stage, l->state, Value); @@ -1902,22 +1939,23 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetVertexShader(LPDIRECT3DDEVICE8 ifa return hr; } -static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShader(LPDIRECT3DDEVICE8 iface, DWORD* ppShader) { +static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShader(IDirect3DDevice8 *iface, DWORD *ppShader) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; IWineD3DVertexDeclaration *wined3d_declaration; IDirect3DVertexDeclaration8 *d3d8_declaration; - HRESULT hrc; + HRESULT hr; TRACE("iface %p, shader %p.\n", iface, ppShader); wined3d_mutex_lock(); - hrc = IWineD3DDevice_GetVertexDeclaration(This->WineD3DDevice, &wined3d_declaration); - if (FAILED(hrc)) + hr = IWineD3DDevice_GetVertexDeclaration(This->WineD3DDevice, &wined3d_declaration); + if (FAILED(hr)) { wined3d_mutex_unlock(); WARN("(%p) : Call to IWineD3DDevice_GetVertexDeclaration failed %#x (device %p)\n", - This, hrc, This->WineD3DDevice); - return hrc; + This, hr, This->WineD3DDevice); + return hr; } if (!wined3d_declaration) @@ -1927,24 +1965,20 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShader(LPDIRECT3DDEVICE8 ifa return D3D_OK; } - hrc = IWineD3DVertexDeclaration_GetParent(wined3d_declaration, (IUnknown **)&d3d8_declaration); + d3d8_declaration = IWineD3DVertexDeclaration_GetParent(wined3d_declaration); IWineD3DVertexDeclaration_Release(wined3d_declaration); wined3d_mutex_unlock(); - if (SUCCEEDED(hrc)) - { - *ppShader = ((IDirect3DVertexDeclaration8Impl *)d3d8_declaration)->shader_handle; - IDirect3DVertexDeclaration8_Release(d3d8_declaration); - } + *ppShader = ((IDirect3DVertexDeclaration8Impl *)d3d8_declaration)->shader_handle; TRACE("(%p) : returning %#x\n", This, *ppShader); - return hrc; + return hr; } static HRESULT WINAPI IDirect3DDevice8Impl_DeleteVertexShader(LPDIRECT3DDEVICE8 iface, DWORD pShader) { IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; IDirect3DVertexShader8Impl *shader; - IWineD3DVertexShader *cur = NULL; + IWineD3DVertexShader *cur; TRACE("iface %p, shader %#x.\n", iface, pShader); @@ -1958,8 +1992,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeleteVertexShader(LPDIRECT3DDEVICE return D3DERR_INVALIDCALL; } - IWineD3DDevice_GetVertexShader(This->WineD3DDevice, &cur); - + cur = IWineD3DDevice_GetVertexShader(This->WineD3DDevice); if (cur) { if (cur == shader->wineD3DVertexShader) IDirect3DDevice8_SetVertexShader(iface, 0); @@ -2107,10 +2140,12 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetIndices(LPDIRECT3DDEVICE8 iface, I return hr; } -static HRESULT WINAPI IDirect3DDevice8Impl_GetIndices(LPDIRECT3DDEVICE8 iface, IDirect3DIndexBuffer8** ppIndexData,UINT* pBaseVertexIndex) { +static HRESULT WINAPI IDirect3DDevice8Impl_GetIndices(IDirect3DDevice8 *iface, + IDirect3DIndexBuffer8 **ppIndexData, UINT *pBaseVertexIndex) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; IWineD3DBuffer *retIndexData = NULL; - HRESULT rc = D3D_OK; + HRESULT hr; TRACE("iface %p, buffer %p, base_vertex_index %p.\n", iface, ppIndexData, pBaseVertexIndex); @@ -2121,17 +2156,19 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetIndices(LPDIRECT3DDEVICE8 iface, I /* The case from UINT to INT is safe because d3d8 will never set negative values */ wined3d_mutex_lock(); IWineD3DDevice_GetBaseVertexIndex(This->WineD3DDevice, (INT *) pBaseVertexIndex); - rc = IWineD3DDevice_GetIndexBuffer(This->WineD3DDevice, &retIndexData); - if (SUCCEEDED(rc) && retIndexData) { - IWineD3DBuffer_GetParent(retIndexData, (IUnknown **)ppIndexData); + hr = IWineD3DDevice_GetIndexBuffer(This->WineD3DDevice, &retIndexData); + if (SUCCEEDED(hr) && retIndexData) + { + *ppIndexData = IWineD3DBuffer_GetParent(retIndexData); + IDirect3DIndexBuffer8_AddRef(*ppIndexData); IWineD3DBuffer_Release(retIndexData); } else { - if (FAILED(rc)) FIXME("Call to GetIndices failed\n"); + if (FAILED(hr)) FIXME("Call to GetIndices failed\n"); *ppIndexData = NULL; } wined3d_mutex_unlock(); - return rc; + return hr; } static HRESULT WINAPI IDirect3DDevice8Impl_CreatePixelShader(IDirect3DDevice8 *iface, @@ -2219,10 +2256,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetPixelShader(LPDIRECT3DDEVICE8 ifac return hr; } -static HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShader(LPDIRECT3DDEVICE8 iface, DWORD* ppShader) { +static HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShader(IDirect3DDevice8 *iface, DWORD *ppShader) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; IWineD3DPixelShader *object; - HRESULT hrc = D3D_OK; TRACE("iface %p, shader %p.\n", iface, ppShader); @@ -2232,27 +2269,29 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShader(LPDIRECT3DDEVICE8 ifac } wined3d_mutex_lock(); - hrc = IWineD3DDevice_GetPixelShader(This->WineD3DDevice, &object); - if (D3D_OK == hrc && NULL != object) { + object = IWineD3DDevice_GetPixelShader(This->WineD3DDevice); + if (object) + { IDirect3DPixelShader8Impl *d3d8_shader; - hrc = IWineD3DPixelShader_GetParent(object, (IUnknown **)&d3d8_shader); + d3d8_shader = IWineD3DPixelShader_GetParent(object); IWineD3DPixelShader_Release(object); *ppShader = d3d8_shader->handle; - IDirect3DPixelShader8_Release((IDirect3DPixelShader8 *)d3d8_shader); - } else { + } + else + { *ppShader = 0; } wined3d_mutex_unlock(); TRACE("(%p) : returning %#x\n", This, *ppShader); - return hrc; + return D3D_OK; } static HRESULT WINAPI IDirect3DDevice8Impl_DeletePixelShader(LPDIRECT3DDEVICE8 iface, DWORD pShader) { IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; IDirect3DPixelShader8Impl *shader; - IWineD3DPixelShader *cur = NULL; + IWineD3DPixelShader *cur; TRACE("iface %p, shader %#x.\n", iface, pShader); @@ -2266,8 +2305,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeletePixelShader(LPDIRECT3DDEVICE8 i return D3DERR_INVALIDCALL; } - IWineD3DDevice_GetPixelShader(This->WineD3DDevice, &cur); - + cur = IWineD3DDevice_GetPixelShader(This->WineD3DDevice); if (cur) { if (cur == shader->wineD3DPixelShader) IDirect3DDevice8_SetPixelShader(iface, 0); @@ -2393,10 +2431,12 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetStreamSource(LPDIRECT3DDEVICE8 ifa return hr; } -static HRESULT WINAPI IDirect3DDevice8Impl_GetStreamSource(LPDIRECT3DDEVICE8 iface, UINT StreamNumber,IDirect3DVertexBuffer8** pStream,UINT* pStride) { +static HRESULT WINAPI IDirect3DDevice8Impl_GetStreamSource(IDirect3DDevice8 *iface, + UINT StreamNumber, IDirect3DVertexBuffer8 **pStream, UINT *pStride) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; IWineD3DBuffer *retStream = NULL; - HRESULT rc = D3D_OK; + HRESULT hr; TRACE("iface %p, stream_idx %u, buffer %p, stride %p.\n", iface, StreamNumber, pStream, pStride); @@ -2406,19 +2446,22 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetStreamSource(LPDIRECT3DDEVICE8 ifa } wined3d_mutex_lock(); - rc = IWineD3DDevice_GetStreamSource(This->WineD3DDevice, StreamNumber, &retStream, 0 /* Offset in bytes */, pStride); - if (rc == D3D_OK && NULL != retStream) { - IWineD3DBuffer_GetParent(retStream, (IUnknown **)pStream); + hr = IWineD3DDevice_GetStreamSource(This->WineD3DDevice, StreamNumber, + &retStream, 0 /* Offset in bytes */, pStride); + if (SUCCEEDED(hr) && retStream) + { + *pStream = IWineD3DBuffer_GetParent(retStream); + IDirect3DVertexBuffer8_AddRef(*pStream); IWineD3DBuffer_Release(retStream); - }else{ - if (rc != D3D_OK){ - FIXME("Call to GetStreamSource failed %p\n", pStride); - } + } + else + { + if (FAILED(hr)) FIXME("Call to GetStreamSource failed, hr %#x.\n", hr); *pStream = NULL; } wined3d_mutex_unlock(); - return rc; + return hr; } static const IDirect3DDevice8Vtbl Direct3DDevice8_Vtbl = @@ -2556,7 +2599,7 @@ static void STDMETHODCALLTYPE device_parent_WineD3DDeviceCreated(IWineD3DDeviceP } static HRESULT STDMETHODCALLTYPE device_parent_CreateSurface(IWineD3DDeviceParent *iface, - IUnknown *superior, UINT width, UINT height, WINED3DFORMAT format, DWORD usage, + IUnknown *superior, UINT width, UINT height, enum wined3d_format_id format, DWORD usage, WINED3DPOOL pool, UINT level, WINED3DCUBEMAP_FACES face, IWineD3DSurface **surface) { struct IDirect3DDevice8Impl *This = device_from_device_parent(iface); @@ -2594,8 +2637,9 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSurface(IWineD3DDeviceParen } static HRESULT STDMETHODCALLTYPE device_parent_CreateRenderTarget(IWineD3DDeviceParent *iface, - IUnknown *superior, UINT width, UINT height, WINED3DFORMAT format, WINED3DMULTISAMPLE_TYPE multisample_type, - DWORD multisample_quality, BOOL lockable, IWineD3DSurface **surface) + IUnknown *superior, UINT width, UINT height, enum wined3d_format_id format, + WINED3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality, BOOL lockable, + IWineD3DSurface **surface) { struct IDirect3DDevice8Impl *This = device_from_device_parent(iface); IDirect3DSurface8Impl *d3d_surface; @@ -2624,16 +2668,16 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateRenderTarget(IWineD3DDevice } static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3DDeviceParent *iface, - IUnknown *superior, UINT width, UINT height, WINED3DFORMAT format, WINED3DMULTISAMPLE_TYPE multisample_type, + UINT width, UINT height, enum wined3d_format_id format, WINED3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality, BOOL discard, IWineD3DSurface **surface) { struct IDirect3DDevice8Impl *This = device_from_device_parent(iface); IDirect3DSurface8Impl *d3d_surface; HRESULT hr; - TRACE("iface %p, superior %p, width %u, height %u, format %#x, multisample_type %#x,\n" + TRACE("iface %p, width %u, height %u, format %#x, multisample_type %#x,\n" "\tmultisample_quality %u, discard %u, surface %p\n", - iface, superior, width, height, format, multisample_type, multisample_quality, discard, surface); + iface, width, height, format, multisample_type, multisample_quality, discard, surface); hr = IDirect3DDevice8_CreateDepthStencilSurface((IDirect3DDevice8 *)This, width, height, d3dformat_from_wined3dformat(format), multisample_type, (IDirect3DSurface8 **)&d3d_surface); @@ -2654,7 +2698,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3 } static HRESULT STDMETHODCALLTYPE device_parent_CreateVolume(IWineD3DDeviceParent *iface, - IUnknown *superior, UINT width, UINT height, UINT depth, WINED3DFORMAT format, + IUnknown *superior, UINT width, UINT height, UINT depth, enum wined3d_format_id format, WINED3DPOOL pool, DWORD usage, IWineD3DVolume **volume) { struct IDirect3DDevice8Impl *This = device_from_device_parent(iface); @@ -2766,9 +2810,8 @@ static const IWineD3DDeviceParentVtbl d3d8_wined3d_device_parent_vtbl = static void setup_fpu(void) { - WORD cw; - #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) + WORD cw; __asm__ volatile ("fnstcw %0" : "=m" (cw)); cw = (cw & ~0xf3f) | 0x3f; __asm__ volatile ("fldcw %0" : : "m" (cw)); @@ -2798,7 +2841,7 @@ HRESULT device_init(IDirect3DDevice8Impl *device, IWineD3D *wined3d, UINT adapte if (!(flags & D3DCREATE_FPU_PRESERVE)) setup_fpu(); wined3d_mutex_lock(); - hr = IWineD3D_CreateDevice(wined3d, adapter, device_type, focus_window, flags, (IUnknown *)device, + hr = IWineD3D_CreateDevice(wined3d, adapter, device_type, focus_window, flags, (IWineD3DDeviceParent *)&device->device_parent_vtbl, &device->WineD3DDevice); if (FAILED(hr)) { diff --git a/dll/directx/wine/d3d8/indexbuffer.c b/dll/directx/wine/d3d8/indexbuffer.c deleted file mode 100644 index b98c2d3edbb..00000000000 --- a/dll/directx/wine/d3d8/indexbuffer.c +++ /dev/null @@ -1,285 +0,0 @@ -/* - * IDirect3DIndexBuffer8 implementation - * - * Copyright 2005 Oliver Stieber - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "d3d8_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d8); - -/* IDirect3DIndexBuffer8 IUnknown parts follow: */ -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_QueryInterface(LPDIRECT3DINDEXBUFFER8 iface, REFIID riid, LPVOID *ppobj) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); - - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IDirect3DResource8) - || IsEqualGUID(riid, &IID_IDirect3DIndexBuffer8)) { - IUnknown_AddRef(iface); - *ppobj = This; - return S_OK; - } - - WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); - *ppobj = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI IDirect3DIndexBuffer8Impl_AddRef(LPDIRECT3DINDEXBUFFER8 iface) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("%p increasing refcount to %u.\n", iface, ref); - - if (ref == 1) - { - IDirect3DDevice8_AddRef(This->parentDevice); - wined3d_mutex_lock(); - IWineD3DBuffer_AddRef(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); - } - - return ref; -} - -static ULONG WINAPI IDirect3DIndexBuffer8Impl_Release(LPDIRECT3DINDEXBUFFER8 iface) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("%p decreasing refcount to %u.\n", iface, ref); - - if (ref == 0) { - IDirect3DDevice8 *parentDevice = This->parentDevice; - - wined3d_mutex_lock(); - IWineD3DBuffer_Release(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); - - /* Release the device last, as it may cause the device to be destroyed. */ - IDirect3DDevice8_Release(parentDevice); - } - return ref; -} - -/* IDirect3DIndexBuffer8 IDirect3DResource8 Interface follow: */ -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_GetDevice(IDirect3DIndexBuffer8 *iface, IDirect3DDevice8 **device) -{ - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - - TRACE("iface %p, device %p.\n", iface, device); - - *device = (IDirect3DDevice8 *)This->parentDevice; - IDirect3DDevice8_AddRef(*device); - - TRACE("Returning device %p.\n", *device); - - return D3D_OK; -} - -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_SetPrivateData(LPDIRECT3DINDEXBUFFER8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", - iface, debugstr_guid(refguid), pData, SizeOfData, Flags); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_SetPrivateData(This->wineD3DIndexBuffer, refguid, pData, SizeOfData, Flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_GetPrivateData(LPDIRECT3DINDEXBUFFER8 iface, REFGUID refguid, void *pData, DWORD *pSizeOfData) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %p.\n", - iface, debugstr_guid(refguid), pData, pSizeOfData); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_GetPrivateData(This->wineD3DIndexBuffer, refguid, pData, pSizeOfData); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_FreePrivateData(LPDIRECT3DINDEXBUFFER8 iface, REFGUID refguid) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid)); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_FreePrivateData(This->wineD3DIndexBuffer, refguid); - wined3d_mutex_unlock(); - - return hr; -} - -static DWORD WINAPI IDirect3DIndexBuffer8Impl_SetPriority(LPDIRECT3DINDEXBUFFER8 iface, DWORD PriorityNew) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - DWORD ret; - - TRACE("iface %p, priority %u.\n", iface, PriorityNew); - - wined3d_mutex_lock(); - ret = IWineD3DBuffer_SetPriority(This->wineD3DIndexBuffer, PriorityNew); - wined3d_mutex_unlock(); - - return ret; -} - -static DWORD WINAPI IDirect3DIndexBuffer8Impl_GetPriority(LPDIRECT3DINDEXBUFFER8 iface) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - DWORD ret; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - ret = IWineD3DBuffer_GetPriority(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); - - return ret; -} - -static void WINAPI IDirect3DIndexBuffer8Impl_PreLoad(LPDIRECT3DINDEXBUFFER8 iface) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - IWineD3DBuffer_PreLoad(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); -} - -static D3DRESOURCETYPE WINAPI IDirect3DIndexBuffer8Impl_GetType(IDirect3DIndexBuffer8 *iface) -{ - TRACE("iface %p.\n", iface); - - return D3DRTYPE_INDEXBUFFER; -} - -/* IDirect3DIndexBuffer8 Interface follow: */ -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_Lock(LPDIRECT3DINDEXBUFFER8 iface, UINT OffsetToLock, UINT SizeToLock, BYTE **ppbData, DWORD Flags) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", - iface, OffsetToLock, SizeToLock, ppbData, Flags); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_Map(This->wineD3DIndexBuffer, OffsetToLock, SizeToLock, ppbData, Flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_Unlock(LPDIRECT3DINDEXBUFFER8 iface) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_Unmap(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DIndexBuffer8Impl_GetDesc(LPDIRECT3DINDEXBUFFER8 iface, D3DINDEXBUFFER_DESC *pDesc) { - IDirect3DIndexBuffer8Impl *This = (IDirect3DIndexBuffer8Impl *)iface; - HRESULT hr; - WINED3DBUFFER_DESC desc; - - TRACE("iface %p, desc %p.\n", iface, pDesc); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_GetDesc(This->wineD3DIndexBuffer, &desc); - wined3d_mutex_unlock(); - - if (SUCCEEDED(hr)) { - pDesc->Format = d3dformat_from_wined3dformat(This->format); - pDesc->Type = D3DRTYPE_INDEXBUFFER; - pDesc->Usage = desc.Usage; - pDesc->Pool = desc.Pool; - pDesc->Size = desc.Size; - } - - return hr; -} - -static const IDirect3DIndexBuffer8Vtbl Direct3DIndexBuffer8_Vtbl = -{ - /* IUnknown */ - IDirect3DIndexBuffer8Impl_QueryInterface, - IDirect3DIndexBuffer8Impl_AddRef, - IDirect3DIndexBuffer8Impl_Release, - /* IDirect3DResource8 */ - IDirect3DIndexBuffer8Impl_GetDevice, - IDirect3DIndexBuffer8Impl_SetPrivateData, - IDirect3DIndexBuffer8Impl_GetPrivateData, - IDirect3DIndexBuffer8Impl_FreePrivateData, - IDirect3DIndexBuffer8Impl_SetPriority, - IDirect3DIndexBuffer8Impl_GetPriority, - IDirect3DIndexBuffer8Impl_PreLoad, - IDirect3DIndexBuffer8Impl_GetType, - /* IDirect3DIndexBuffer8 */ - IDirect3DIndexBuffer8Impl_Lock, - IDirect3DIndexBuffer8Impl_Unlock, - IDirect3DIndexBuffer8Impl_GetDesc -}; - -static void STDMETHODCALLTYPE d3d8_indexbuffer_wined3d_object_destroyed(void *parent) -{ - HeapFree(GetProcessHeap(), 0, parent); -} - -static const struct wined3d_parent_ops d3d8_indexbuffer_wined3d_parent_ops = -{ - d3d8_indexbuffer_wined3d_object_destroyed, -}; - -HRESULT indexbuffer_init(IDirect3DIndexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, - UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) -{ - HRESULT hr; - - buffer->lpVtbl = &Direct3DIndexBuffer8_Vtbl; - buffer->ref = 1; - buffer->format = wined3dformat_from_d3dformat(format); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateIndexBuffer(device->WineD3DDevice, size, - usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, &buffer->wineD3DIndexBuffer, - (IUnknown *)buffer, &d3d8_indexbuffer_wined3d_parent_ops); - wined3d_mutex_unlock(); - if (FAILED(hr)) - { - WARN("Failed to create wined3d buffer, hr %#x.\n", hr); - return hr; - } - - buffer->parentDevice = (IDirect3DDevice8 *)device; - IUnknown_AddRef(buffer->parentDevice); - - return D3D_OK; -} diff --git a/dll/directx/wine/d3d8/pixelshader.c b/dll/directx/wine/d3d8/pixelshader.c deleted file mode 100644 index 7b6d4e580e3..00000000000 --- a/dll/directx/wine/d3d8/pixelshader.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * IDirect3DPixelShader8 implementation - * - * Copyright 2002-2003 Jason Edmeades - * Raphael Junqueira - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "d3d8_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d8); - -/* IDirect3DPixelShader8 IUnknown parts follow: */ -static HRESULT WINAPI IDirect3DPixelShader8Impl_QueryInterface(IDirect3DPixelShader8 *iface, REFIID riid, LPVOID *ppobj) { - IDirect3DPixelShader8Impl *This = (IDirect3DPixelShader8Impl *)iface; - - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); - - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IDirect3DPixelShader8)) { - IUnknown_AddRef(iface); - *ppobj = This; - return S_OK; - } - - WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); - *ppobj = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI IDirect3DPixelShader8Impl_AddRef(IDirect3DPixelShader8 *iface) { - IDirect3DPixelShader8Impl *This = (IDirect3DPixelShader8Impl *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("%p increasing refcount to %u.\n", iface, ref); - - if (ref == 1) - { - wined3d_mutex_lock(); - IWineD3DPixelShader_AddRef(This->wineD3DPixelShader); - wined3d_mutex_unlock(); - } - - return ref; -} - -static ULONG WINAPI IDirect3DPixelShader8Impl_Release(IDirect3DPixelShader8 * iface) { - IDirect3DPixelShader8Impl *This = (IDirect3DPixelShader8Impl *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("%p decreasing refcount to %u.\n", iface, ref); - - if (ref == 0) { - wined3d_mutex_lock(); - IWineD3DPixelShader_Release(This->wineD3DPixelShader); - wined3d_mutex_unlock(); - } - return ref; -} - -static const IDirect3DPixelShader8Vtbl Direct3DPixelShader8_Vtbl = -{ - /* IUnknown */ - IDirect3DPixelShader8Impl_QueryInterface, - IDirect3DPixelShader8Impl_AddRef, - IDirect3DPixelShader8Impl_Release, -}; - -static void STDMETHODCALLTYPE d3d8_pixelshader_wined3d_object_destroyed(void *parent) -{ - HeapFree(GetProcessHeap(), 0, parent); -} - -static const struct wined3d_parent_ops d3d8_pixelshader_wined3d_parent_ops = -{ - d3d8_pixelshader_wined3d_object_destroyed, -}; - -HRESULT pixelshader_init(IDirect3DPixelShader8Impl *shader, IDirect3DDevice8Impl *device, - const DWORD *byte_code, DWORD shader_handle) -{ - HRESULT hr; - - shader->ref = 1; - shader->lpVtbl = &Direct3DPixelShader8_Vtbl; - shader->handle = shader_handle; - - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreatePixelShader(device->WineD3DDevice, byte_code, - NULL, &shader->wineD3DPixelShader, (IUnknown *)shader, - &d3d8_pixelshader_wined3d_parent_ops); - wined3d_mutex_unlock(); - if (FAILED(hr)) - { - WARN("Failed to create wined3d pixel shader, hr %#x.\n", hr); - return hr; - } - - return D3D_OK; -} diff --git a/dll/directx/wine/d3d8/shader.c b/dll/directx/wine/d3d8/shader.c new file mode 100644 index 00000000000..a59f10b57b4 --- /dev/null +++ b/dll/directx/wine/d3d8/shader.c @@ -0,0 +1,280 @@ +/* + * Copyright 2002-2003 Jason Edmeades + * Raphael Junqueira + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "d3d8_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d8); + +static HRESULT WINAPI d3d8_vertexshader_QueryInterface(IDirect3DVertexShader8 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IDirect3DVertexShader8) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IUnknown_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3d8_vertexshader_AddRef(IDirect3DVertexShader8 *iface) +{ + IDirect3DVertexShader8Impl *shader = (IDirect3DVertexShader8Impl *)iface; + ULONG refcount = InterlockedIncrement(&shader->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + if (refcount == 1 && shader->wineD3DVertexShader) + { + wined3d_mutex_lock(); + IWineD3DVertexShader_AddRef(shader->wineD3DVertexShader); + wined3d_mutex_unlock(); + } + + return refcount; +} + +static void STDMETHODCALLTYPE d3d8_vertexshader_wined3d_object_destroyed(void *parent) +{ + IDirect3DVertexShader8Impl *shader = parent; + IDirect3DVertexDeclaration8_Release(shader->vertex_declaration); + HeapFree(GetProcessHeap(), 0, shader); +} + +static ULONG WINAPI d3d8_vertexshader_Release(IDirect3DVertexShader8 *iface) +{ + IDirect3DVertexShader8Impl *shader = (IDirect3DVertexShader8Impl *)iface; + ULONG refcount = InterlockedDecrement(&shader->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + { + if (shader->wineD3DVertexShader) + { + wined3d_mutex_lock(); + IWineD3DVertexShader_Release(shader->wineD3DVertexShader); + wined3d_mutex_unlock(); + } + else + { + d3d8_vertexshader_wined3d_object_destroyed(shader); + } + } + + return refcount; +} + +static const IDirect3DVertexShader8Vtbl d3d8_vertexshader_vtbl = +{ + /* IUnknown */ + d3d8_vertexshader_QueryInterface, + d3d8_vertexshader_AddRef, + d3d8_vertexshader_Release, +}; + +static const struct wined3d_parent_ops d3d8_vertexshader_wined3d_parent_ops = +{ + d3d8_vertexshader_wined3d_object_destroyed, +}; + +static HRESULT d3d8_vertexshader_create_vertexdeclaration(IDirect3DDevice8Impl *device, + const DWORD *declaration, DWORD shader_handle, IDirect3DVertexDeclaration8 **decl_ptr) +{ + IDirect3DVertexDeclaration8Impl *object; + HRESULT hr; + + TRACE("device %p, declaration %p, shader_handle %#x, decl_ptr %p.\n", + device, declaration, shader_handle, decl_ptr); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Memory allocation failed.\n"); + return E_OUTOFMEMORY; + } + + hr = vertexdeclaration_init(object, device, declaration, shader_handle); + if (FAILED(hr)) + { + WARN("Failed to initialize vertex declaration, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created vertex declaration %p.\n", object); + *decl_ptr = (IDirect3DVertexDeclaration8 *)object; + + return D3D_OK; +} + +HRESULT vertexshader_init(IDirect3DVertexShader8Impl *shader, IDirect3DDevice8Impl *device, + const DWORD *declaration, const DWORD *byte_code, DWORD shader_handle, DWORD usage) +{ + const DWORD *token = declaration; + HRESULT hr; + + /* Test if the vertex declaration is valid. */ + while (D3DVSD_END() != *token) + { + D3DVSD_TOKENTYPE token_type = ((*token & D3DVSD_TOKENTYPEMASK) >> D3DVSD_TOKENTYPESHIFT); + + if (token_type == D3DVSD_TOKEN_STREAMDATA && !(token_type & 0x10000000)) + { + DWORD type = ((*token & D3DVSD_DATATYPEMASK) >> D3DVSD_DATATYPESHIFT); + DWORD reg = ((*token & D3DVSD_VERTEXREGMASK) >> D3DVSD_VERTEXREGSHIFT); + + if (reg == D3DVSDE_NORMAL && type != D3DVSDT_FLOAT3 && !byte_code) + { + WARN("Attempt to use a non-FLOAT3 normal with the fixed function function\n"); + return D3DERR_INVALIDCALL; + } + } + token += parse_token(token); + } + + shader->ref = 1; + shader->lpVtbl = &d3d8_vertexshader_vtbl; + + hr = d3d8_vertexshader_create_vertexdeclaration(device, declaration, shader_handle, &shader->vertex_declaration); + if (FAILED(hr)) + { + WARN("Failed to create vertex declaration, hr %#x.\n", hr); + return hr; + } + + if (byte_code) + { + if (usage) FIXME("Usage %#x not implemented.\n", usage); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateVertexShader(device->WineD3DDevice, byte_code, NULL /* output signature */, + shader, &d3d8_vertexshader_wined3d_parent_ops, &shader->wineD3DVertexShader); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr); + IDirect3DVertexDeclaration8_Release(shader->vertex_declaration); + return hr; + } + + load_local_constants(declaration, shader->wineD3DVertexShader); + } + + return D3D_OK; +} + +static HRESULT WINAPI d3d8_pixelshader_QueryInterface(IDirect3DPixelShader8 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IDirect3DPixelShader8) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IUnknown_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3d8_pixelshader_AddRef(IDirect3DPixelShader8 *iface) +{ + IDirect3DPixelShader8Impl *shader = (IDirect3DPixelShader8Impl *)iface; + ULONG refcount = InterlockedIncrement(&shader->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + if (refcount == 1) + { + wined3d_mutex_lock(); + IWineD3DPixelShader_AddRef(shader->wineD3DPixelShader); + wined3d_mutex_unlock(); + } + + return refcount; +} + +static ULONG WINAPI d3d8_pixelshader_Release(IDirect3DPixelShader8 *iface) +{ + IDirect3DPixelShader8Impl *shader = (IDirect3DPixelShader8Impl *)iface; + ULONG refcount = InterlockedDecrement(&shader->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + { + wined3d_mutex_lock(); + IWineD3DPixelShader_Release(shader->wineD3DPixelShader); + wined3d_mutex_unlock(); + } + + return refcount; +} + +static const IDirect3DPixelShader8Vtbl d3d8_pixelshader_vtbl = +{ + /* IUnknown */ + d3d8_pixelshader_QueryInterface, + d3d8_pixelshader_AddRef, + d3d8_pixelshader_Release, +}; + +static void STDMETHODCALLTYPE d3d8_pixelshader_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d8_pixelshader_wined3d_parent_ops = +{ + d3d8_pixelshader_wined3d_object_destroyed, +}; + +HRESULT pixelshader_init(IDirect3DPixelShader8Impl *shader, IDirect3DDevice8Impl *device, + const DWORD *byte_code, DWORD shader_handle) +{ + HRESULT hr; + + shader->ref = 1; + shader->lpVtbl = &d3d8_pixelshader_vtbl; + shader->handle = shader_handle; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreatePixelShader(device->WineD3DDevice, byte_code, NULL, shader, + &d3d8_pixelshader_wined3d_parent_ops, &shader->wineD3DPixelShader); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d pixel shader, hr %#x.\n", hr); + return hr; + } + + return D3D_OK; +} diff --git a/dll/directx/wine/d3d8/surface.c b/dll/directx/wine/d3d8/surface.c index cf72e3e7d22..6e59bd65f75 100644 --- a/dll/directx/wine/d3d8/surface.c +++ b/dll/directx/wine/d3d8/surface.c @@ -190,27 +190,23 @@ static HRESULT WINAPI IDirect3DSurface8Impl_GetContainer(LPDIRECT3DSURFACE8 ifac static HRESULT WINAPI IDirect3DSurface8Impl_GetDesc(LPDIRECT3DSURFACE8 iface, D3DSURFACE_DESC *pDesc) { IDirect3DSurface8Impl *This = (IDirect3DSurface8Impl *)iface; WINED3DSURFACE_DESC wined3ddesc; - HRESULT hr; TRACE("iface %p, desc %p.\n", iface, pDesc); wined3d_mutex_lock(); - hr = IWineD3DSurface_GetDesc(This->wineD3DSurface, &wined3ddesc); + IWineD3DSurface_GetDesc(This->wineD3DSurface, &wined3ddesc); wined3d_mutex_unlock(); - if (SUCCEEDED(hr)) - { - pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.format); - pDesc->Type = wined3ddesc.resource_type; - pDesc->Usage = wined3ddesc.usage; - pDesc->Pool = wined3ddesc.pool; - pDesc->Size = wined3ddesc.size; - pDesc->MultiSampleType = wined3ddesc.multisample_type; - pDesc->Width = wined3ddesc.width; - pDesc->Height = wined3ddesc.height; - } + pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.format); + pDesc->Type = wined3ddesc.resource_type; + pDesc->Usage = wined3ddesc.usage; + pDesc->Pool = wined3ddesc.pool; + pDesc->Size = wined3ddesc.size; + pDesc->MultiSampleType = wined3ddesc.multisample_type; + pDesc->Width = wined3ddesc.width; + pDesc->Height = wined3ddesc.height; - return hr; + return D3D_OK; } static HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKED_RECT *pLockedRect, CONST RECT *pRect, DWORD Flags) { @@ -306,9 +302,8 @@ HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *devic wined3d_mutex_lock(); hr = IWineD3DDevice_CreateSurface(device->WineD3DDevice, width, height, wined3dformat_from_d3dformat(format), - lockable, discard, level, &surface->wineD3DSurface, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, - multisample_type, multisample_quality, SURFACE_OPENGL, (IUnknown *)surface, - &d3d8_surface_wined3d_parent_ops); + lockable, discard, level, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, multisample_type, + multisample_quality, SURFACE_OPENGL, surface, &d3d8_surface_wined3d_parent_ops, &surface->wineD3DSurface); wined3d_mutex_unlock(); if (FAILED(hr)) { diff --git a/dll/directx/wine/d3d8/swapchain.c b/dll/directx/wine/d3d8/swapchain.c index 1b807fb80a2..1c2a5357824 100644 --- a/dll/directx/wine/d3d8/swapchain.c +++ b/dll/directx/wine/d3d8/swapchain.c @@ -83,23 +83,28 @@ static HRESULT WINAPI IDirect3DSwapChain8Impl_Present(LPDIRECT3DSWAPCHAIN8 iface return hr; } -static HRESULT WINAPI IDirect3DSwapChain8Impl_GetBackBuffer(LPDIRECT3DSWAPCHAIN8 iface, UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8** ppBackBuffer) { +static HRESULT WINAPI IDirect3DSwapChain8Impl_GetBackBuffer(IDirect3DSwapChain8 *iface, + UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8 **ppBackBuffer) +{ IDirect3DSwapChain8Impl *This = (IDirect3DSwapChain8Impl *)iface; - HRESULT hrc = D3D_OK; IWineD3DSurface *mySurface = NULL; + HRESULT hr; TRACE("iface %p, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, iBackBuffer, Type, ppBackBuffer); wined3d_mutex_lock(); - hrc = IWineD3DSwapChain_GetBackBuffer(This->wineD3DSwapChain, iBackBuffer, (WINED3DBACKBUFFER_TYPE )Type, &mySurface); - if (hrc == D3D_OK && NULL != mySurface) { - IWineD3DSurface_GetParent(mySurface, (IUnknown **)ppBackBuffer); - IWineD3DSurface_Release(mySurface); + hr = IWineD3DSwapChain_GetBackBuffer(This->wineD3DSwapChain, iBackBuffer, + (WINED3DBACKBUFFER_TYPE)Type, &mySurface); + if (SUCCEEDED(hr) && mySurface) + { + *ppBackBuffer = IWineD3DSurface_GetParent(mySurface); + IDirect3DSurface8_AddRef(*ppBackBuffer); + IWineD3DSurface_Release(mySurface); } wined3d_mutex_unlock(); - return hrc; + return hr; } static const IDirect3DSwapChain8Vtbl Direct3DSwapChain8_Vtbl = @@ -138,7 +143,7 @@ HRESULT swapchain_init(IDirect3DSwapChain8Impl *swapchain, IDirect3DDevice8Impl wined3d_mutex_lock(); hr = IWineD3DDevice_CreateSwapChain(device->WineD3DDevice, &wined3d_parameters, - &swapchain->wineD3DSwapChain, (IUnknown *)swapchain, SURFACE_OPENGL); + SURFACE_OPENGL, swapchain, &swapchain->wineD3DSwapChain); wined3d_mutex_unlock(); present_parameters->BackBufferWidth = wined3d_parameters.BackBufferWidth; diff --git a/dll/directx/wine/d3d8/texture.c b/dll/directx/wine/d3d8/texture.c index 67a60b4ee96..a8421604862 100644 --- a/dll/directx/wine/d3d8/texture.c +++ b/dll/directx/wine/d3d8/texture.c @@ -251,22 +251,26 @@ static HRESULT WINAPI IDirect3DTexture8Impl_GetLevelDesc(LPDIRECT3DTEXTURE8 ifac return hr; } -static HRESULT WINAPI IDirect3DTexture8Impl_GetSurfaceLevel(LPDIRECT3DTEXTURE8 iface, UINT Level, IDirect3DSurface8 **ppSurfaceLevel) { +static HRESULT WINAPI IDirect3DTexture8Impl_GetSurfaceLevel(IDirect3DTexture8 *iface, + UINT Level, IDirect3DSurface8 **ppSurfaceLevel) +{ IDirect3DTexture8Impl *This = (IDirect3DTexture8Impl *)iface; - HRESULT hrc = D3D_OK; IWineD3DSurface *mySurface = NULL; + HRESULT hr; TRACE("iface %p, level %u, surface %p.\n", iface, Level, ppSurfaceLevel); wined3d_mutex_lock(); - hrc = IWineD3DTexture_GetSurfaceLevel(This->wineD3DTexture, Level, &mySurface); - if (hrc == D3D_OK && NULL != ppSurfaceLevel) { - IWineD3DSurface_GetParent(mySurface, (IUnknown **)ppSurfaceLevel); + hr = IWineD3DTexture_GetSurfaceLevel(This->wineD3DTexture, Level, &mySurface); + if (SUCCEEDED(hr) && ppSurfaceLevel) + { + *ppSurfaceLevel = IWineD3DSurface_GetParent(mySurface); + IDirect3DSurface8_AddRef(*ppSurfaceLevel); IWineD3DSurface_Release(mySurface); } wined3d_mutex_unlock(); - return hrc; + return hr; } static HRESULT WINAPI IDirect3DTexture8Impl_LockRect(LPDIRECT3DTEXTURE8 iface, UINT Level, D3DLOCKED_RECT *pLockedRect, CONST RECT *pRect, DWORD Flags) { @@ -357,7 +361,7 @@ HRESULT texture_init(IDirect3DTexture8Impl *texture, IDirect3DDevice8Impl *devic wined3d_mutex_lock(); hr = IWineD3DDevice_CreateTexture(device->WineD3DDevice, width, height, levels, usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, - &texture->wineD3DTexture, (IUnknown *)texture, &d3d8_texture_wined3d_parent_ops); + texture, &d3d8_texture_wined3d_parent_ops, &texture->wineD3DTexture); wined3d_mutex_unlock(); if (FAILED(hr)) { diff --git a/dll/directx/wine/d3d8/vertexbuffer.c b/dll/directx/wine/d3d8/vertexbuffer.c deleted file mode 100644 index 476fcc492c2..00000000000 --- a/dll/directx/wine/d3d8/vertexbuffer.c +++ /dev/null @@ -1,288 +0,0 @@ -/* - * IDirect3DVertexBuffer8 implementation - * - * Copyright 2005 Oliver Stieber - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "d3d8_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d8); - -/* IDirect3DVertexBuffer8 IUnknown parts follow: */ -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_QueryInterface(LPDIRECT3DVERTEXBUFFER8 iface, REFIID riid, LPVOID *ppobj) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); - - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IDirect3DResource8) - || IsEqualGUID(riid, &IID_IDirect3DVertexBuffer8)) { - IUnknown_AddRef(iface); - *ppobj = This; - return S_OK; - } - - WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); - - *ppobj = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI IDirect3DVertexBuffer8Impl_AddRef(LPDIRECT3DVERTEXBUFFER8 iface) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("%p increasing refcount to %u.\n", iface, ref); - - if (ref == 1) - { - IDirect3DDevice8_AddRef(This->parentDevice); - wined3d_mutex_lock(); - IWineD3DBuffer_AddRef(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); - } - - return ref; -} - -static ULONG WINAPI IDirect3DVertexBuffer8Impl_Release(LPDIRECT3DVERTEXBUFFER8 iface) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("%p decreasing refcount to %u.\n", iface, ref); - - if (ref == 0) { - IDirect3DDevice8 *parentDevice = This->parentDevice; - - wined3d_mutex_lock(); - IWineD3DBuffer_Release(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); - - /* Release the device last, as it may cause the device to be destroyed. */ - IDirect3DDevice8_Release(parentDevice); - } - - return ref; -} - -/* IDirect3DVertexBuffer8 IDirect3DResource8 Interface follow: */ -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_GetDevice(IDirect3DVertexBuffer8 *iface, IDirect3DDevice8 **device) -{ - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - - TRACE("iface %p, device %p.\n", iface, device); - - *device = (IDirect3DDevice8 *)This->parentDevice; - IDirect3DDevice8_AddRef(*device); - - TRACE("Returning device %p.\n", *device); - - return D3D_OK; -} - -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_SetPrivateData(LPDIRECT3DVERTEXBUFFER8 iface, REFGUID refguid, CONST void *pData, DWORD SizeOfData, DWORD Flags) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", - iface, debugstr_guid(refguid), pData, SizeOfData, Flags); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_SetPrivateData(This->wineD3DVertexBuffer, refguid, pData, SizeOfData, Flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_GetPrivateData(LPDIRECT3DVERTEXBUFFER8 iface, REFGUID refguid, void *pData, DWORD *pSizeOfData) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %p.\n", - iface, debugstr_guid(refguid), pData, pSizeOfData); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_GetPrivateData(This->wineD3DVertexBuffer, refguid, pData, pSizeOfData); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_FreePrivateData(LPDIRECT3DVERTEXBUFFER8 iface, REFGUID refguid) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid)); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_FreePrivateData(This->wineD3DVertexBuffer, refguid); - wined3d_mutex_unlock(); - - return hr; -} - -static DWORD WINAPI IDirect3DVertexBuffer8Impl_SetPriority(LPDIRECT3DVERTEXBUFFER8 iface, DWORD PriorityNew) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - DWORD ret; - - TRACE("iface %p, priority %u.\n", iface, PriorityNew); - - wined3d_mutex_lock(); - ret = IWineD3DBuffer_SetPriority(This->wineD3DVertexBuffer, PriorityNew); - wined3d_mutex_unlock(); - - return ret; -} - -static DWORD WINAPI IDirect3DVertexBuffer8Impl_GetPriority(LPDIRECT3DVERTEXBUFFER8 iface) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - DWORD ret; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - ret = IWineD3DBuffer_GetPriority(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); - - return ret; -} - -static void WINAPI IDirect3DVertexBuffer8Impl_PreLoad(LPDIRECT3DVERTEXBUFFER8 iface) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - IWineD3DBuffer_PreLoad(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); -} - -static D3DRESOURCETYPE WINAPI IDirect3DVertexBuffer8Impl_GetType(IDirect3DVertexBuffer8 *iface) -{ - TRACE("iface %p.\n", iface); - - return D3DRTYPE_VERTEXBUFFER; -} - -/* IDirect3DVertexBuffer8 Interface follow: */ -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_Lock(LPDIRECT3DVERTEXBUFFER8 iface, UINT OffsetToLock, UINT SizeToLock, BYTE **ppbData, DWORD Flags) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", - iface, OffsetToLock, SizeToLock, ppbData, Flags); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_Map(This->wineD3DVertexBuffer, OffsetToLock, SizeToLock, ppbData, Flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_Unlock(LPDIRECT3DVERTEXBUFFER8 iface) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - HRESULT hr; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_Unmap(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DVertexBuffer8Impl_GetDesc(LPDIRECT3DVERTEXBUFFER8 iface, D3DVERTEXBUFFER_DESC *pDesc) { - IDirect3DVertexBuffer8Impl *This = (IDirect3DVertexBuffer8Impl *)iface; - HRESULT hr; - WINED3DBUFFER_DESC desc; - - TRACE("iface %p, desc %p.\n", iface, pDesc); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_GetDesc(This->wineD3DVertexBuffer, &desc); - wined3d_mutex_unlock(); - - if (SUCCEEDED(hr)) { - pDesc->Type = D3DRTYPE_VERTEXBUFFER; - pDesc->Usage = desc.Usage; - pDesc->Pool = desc.Pool; - pDesc->Size = desc.Size; - pDesc->FVF = This->fvf; - pDesc->Format = D3DFMT_VERTEXDATA; - } - - return hr; -} - -static const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl = -{ - /* IUnknown */ - IDirect3DVertexBuffer8Impl_QueryInterface, - IDirect3DVertexBuffer8Impl_AddRef, - IDirect3DVertexBuffer8Impl_Release, - /* IDirect3DResource8 */ - IDirect3DVertexBuffer8Impl_GetDevice, - IDirect3DVertexBuffer8Impl_SetPrivateData, - IDirect3DVertexBuffer8Impl_GetPrivateData, - IDirect3DVertexBuffer8Impl_FreePrivateData, - IDirect3DVertexBuffer8Impl_SetPriority, - IDirect3DVertexBuffer8Impl_GetPriority, - IDirect3DVertexBuffer8Impl_PreLoad, - IDirect3DVertexBuffer8Impl_GetType, - /* IDirect3DVertexBuffer8 */ - IDirect3DVertexBuffer8Impl_Lock, - IDirect3DVertexBuffer8Impl_Unlock, - IDirect3DVertexBuffer8Impl_GetDesc -}; - -static void STDMETHODCALLTYPE d3d8_vertexbuffer_wined3d_object_destroyed(void *parent) -{ - HeapFree(GetProcessHeap(), 0, parent); -} - -static const struct wined3d_parent_ops d3d8_vertexbuffer_wined3d_parent_ops = -{ - d3d8_vertexbuffer_wined3d_object_destroyed, -}; - -HRESULT vertexbuffer_init(IDirect3DVertexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, - UINT size, DWORD usage, DWORD fvf, D3DPOOL pool) -{ - HRESULT hr; - - buffer->lpVtbl = &Direct3DVertexBuffer8_Vtbl; - buffer->ref = 1; - buffer->fvf = fvf; - - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateVertexBuffer(device->WineD3DDevice, size, - usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, &buffer->wineD3DVertexBuffer, - (IUnknown *)buffer, &d3d8_vertexbuffer_wined3d_parent_ops); - wined3d_mutex_unlock(); - if (FAILED(hr)) - { - WARN("Failed to create wined3d buffer, hr %#x.\n", hr); - return hr; - } - - buffer->parentDevice = (IDirect3DDevice8 *)device; - IUnknown_AddRef(buffer->parentDevice); - - return D3D_OK; -} diff --git a/dll/directx/wine/d3d8/vertexdeclaration.c b/dll/directx/wine/d3d8/vertexdeclaration.c index b876b66c41c..58573a50f84 100644 --- a/dll/directx/wine/d3d8/vertexdeclaration.c +++ b/dll/directx/wine/d3d8/vertexdeclaration.c @@ -254,7 +254,7 @@ static const size_t wined3d_type_sizes[] = /*WINED3DDECLTYPE_FLOAT16_4*/ 4 * sizeof(short int) }; -static const WINED3DFORMAT wined3d_format_lookup[] = +static const enum wined3d_format_id wined3d_format_lookup[] = { /*WINED3DDECLTYPE_FLOAT1*/ WINED3DFMT_R32_FLOAT, /*WINED3DDECLTYPE_FLOAT2*/ WINED3DFMT_R32G32_FLOAT, @@ -399,9 +399,8 @@ HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration8Impl *declaration, memcpy(declaration->elements, elements, declaration->elements_size); wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateVertexDeclaration(device->WineD3DDevice, &declaration->wined3d_vertex_declaration, - (IUnknown *)declaration, &d3d8_vertexdeclaration_wined3d_parent_ops, - wined3d_elements, wined3d_element_count); + hr = IWineD3DDevice_CreateVertexDeclaration(device->WineD3DDevice, wined3d_elements, wined3d_element_count, + declaration, &d3d8_vertexdeclaration_wined3d_parent_ops, &declaration->wined3d_vertex_declaration); wined3d_mutex_unlock(); HeapFree(GetProcessHeap(), 0, wined3d_elements); if (FAILED(hr)) @@ -425,9 +424,8 @@ HRESULT vertexdeclaration_init_fvf(IDirect3DVertexDeclaration8Impl *declaration, declaration->elements_size = 0; declaration->shader_handle = fvf; - hr = IWineD3DDevice_CreateVertexDeclarationFromFVF(device->WineD3DDevice, - &declaration->wined3d_vertex_declaration, (IUnknown *)declaration, - &d3d8_vertexdeclaration_wined3d_parent_ops, fvf); + hr = IWineD3DDevice_CreateVertexDeclarationFromFVF(device->WineD3DDevice, fvf, declaration, + &d3d8_vertexdeclaration_wined3d_parent_ops, &declaration->wined3d_vertex_declaration); if (FAILED(hr)) { WARN("Failed to create wined3d vertex declaration, hr %#x.\n", hr); diff --git a/dll/directx/wine/d3d8/vertexshader.c b/dll/directx/wine/d3d8/vertexshader.c deleted file mode 100644 index 1f00aa0bd7b..00000000000 --- a/dll/directx/wine/d3d8/vertexshader.c +++ /dev/null @@ -1,187 +0,0 @@ -/* - * IDirect3DVertexShader8 implementation - * - * Copyright 2002-2003 Jason Edmeades - * Raphael Junqueira - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "d3d8_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d8); - -/* IDirect3DVertexShader8 IUnknown parts follow: */ -static HRESULT WINAPI IDirect3DVertexShader8Impl_QueryInterface(IDirect3DVertexShader8 *iface, REFIID riid, LPVOID* ppobj) { - IDirect3DVertexShader8Impl *This = (IDirect3DVertexShader8Impl *)iface; - - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); - - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IDirect3DVertexShader8)) { - IUnknown_AddRef(iface); - *ppobj = This; - return S_OK; - } - - WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); - *ppobj = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI IDirect3DVertexShader8Impl_AddRef(IDirect3DVertexShader8 *iface) { - IDirect3DVertexShader8Impl *This = (IDirect3DVertexShader8Impl *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("%p increasing refcount to %u.\n", iface, ref); - - if (ref == 1 && This->wineD3DVertexShader) - { - wined3d_mutex_lock(); - IWineD3DVertexShader_AddRef(This->wineD3DVertexShader); - wined3d_mutex_unlock(); - } - - return ref; -} - -static void STDMETHODCALLTYPE d3d8_vertexshader_wined3d_object_destroyed(void *parent) -{ - IDirect3DVertexShader8Impl *shader = parent; - IDirect3DVertexDeclaration8_Release(shader->vertex_declaration); - HeapFree(GetProcessHeap(), 0, shader); -} - -static ULONG WINAPI IDirect3DVertexShader8Impl_Release(IDirect3DVertexShader8 *iface) { - IDirect3DVertexShader8Impl *This = (IDirect3DVertexShader8Impl *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("%p decreasing refcount to %u.\n", iface, ref); - - if (ref == 0) { - if (This->wineD3DVertexShader) - { - wined3d_mutex_lock(); - IWineD3DVertexShader_Release(This->wineD3DVertexShader); - wined3d_mutex_unlock(); - } - else - { - d3d8_vertexshader_wined3d_object_destroyed(This); - } - } - return ref; -} - -static const IDirect3DVertexShader8Vtbl Direct3DVertexShader8_Vtbl = -{ - /* IUnknown */ - IDirect3DVertexShader8Impl_QueryInterface, - IDirect3DVertexShader8Impl_AddRef, - IDirect3DVertexShader8Impl_Release, -}; - -static const struct wined3d_parent_ops d3d8_vertexshader_wined3d_parent_ops = -{ - d3d8_vertexshader_wined3d_object_destroyed, -}; - -static HRESULT vertexshader_create_vertexdeclaration(IDirect3DDevice8Impl *device, - const DWORD *declaration, DWORD shader_handle, IDirect3DVertexDeclaration8 **decl_ptr) -{ - IDirect3DVertexDeclaration8Impl *object; - HRESULT hr; - - TRACE("device %p, declaration %p, shader_handle %#x, decl_ptr %p.\n", - device, declaration, shader_handle, decl_ptr); - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - if (!object) { - ERR("Memory allocation failed\n"); - *decl_ptr = NULL; - return D3DERR_OUTOFVIDEOMEMORY; - } - - hr = vertexdeclaration_init(object, device, declaration, shader_handle); - if (FAILED(hr)) - { - WARN("Failed to initialize vertex declaration, hr %#x.\n", hr); - HeapFree(GetProcessHeap(), 0, object); - return hr; - } - - TRACE("Created vertex declaration %p.\n", object); - *decl_ptr = (IDirect3DVertexDeclaration8 *)object; - - return D3D_OK; -} - -HRESULT vertexshader_init(IDirect3DVertexShader8Impl *shader, IDirect3DDevice8Impl *device, - const DWORD *declaration, const DWORD *byte_code, DWORD shader_handle, DWORD usage) -{ - const DWORD *token = declaration; - HRESULT hr; - - /* Test if the vertex declaration is valid */ - while (D3DVSD_END() != *token) - { - D3DVSD_TOKENTYPE token_type = ((*token & D3DVSD_TOKENTYPEMASK) >> D3DVSD_TOKENTYPESHIFT); - - if (token_type == D3DVSD_TOKEN_STREAMDATA && !(token_type & 0x10000000)) - { - DWORD type = ((*token & D3DVSD_DATATYPEMASK) >> D3DVSD_DATATYPESHIFT); - DWORD reg = ((*token & D3DVSD_VERTEXREGMASK) >> D3DVSD_VERTEXREGSHIFT); - - if (reg == D3DVSDE_NORMAL && type != D3DVSDT_FLOAT3 && !byte_code) - { - WARN("Attempt to use a non-FLOAT3 normal with the fixed function function\n"); - return D3DERR_INVALIDCALL; - } - } - token += parse_token(token); - } - - shader->ref = 1; - shader->lpVtbl = &Direct3DVertexShader8_Vtbl; - - hr = vertexshader_create_vertexdeclaration(device, declaration, shader_handle, &shader->vertex_declaration); - if (FAILED(hr)) - { - WARN("Failed to create vertex declaration, hr %#x.\n", hr); - return hr; - } - - if (byte_code) - { - if (usage) FIXME("Usage %#x not implemented.\n", usage); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateVertexShader(device->WineD3DDevice, byte_code, - NULL /* output signature */, &shader->wineD3DVertexShader, - (IUnknown *)shader, &d3d8_vertexshader_wined3d_parent_ops); - wined3d_mutex_unlock(); - if (FAILED(hr)) - { - WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr); - IDirect3DVertexDeclaration8_Release(shader->vertex_declaration); - return hr; - } - - load_local_constants(declaration, shader->wineD3DVertexShader); - } - - return D3D_OK; -} diff --git a/dll/directx/wine/d3d8/volume.c b/dll/directx/wine/d3d8/volume.c index 8e8dc603075..1705822cf5d 100644 --- a/dll/directx/wine/d3d8/volume.c +++ b/dll/directx/wine/d3d8/volume.c @@ -177,28 +177,24 @@ static HRESULT WINAPI IDirect3DVolume8Impl_GetContainer(LPDIRECT3DVOLUME8 iface, static HRESULT WINAPI IDirect3DVolume8Impl_GetDesc(LPDIRECT3DVOLUME8 iface, D3DVOLUME_DESC *pDesc) { IDirect3DVolume8Impl *This = (IDirect3DVolume8Impl *)iface; - HRESULT hr; - WINED3DVOLUME_DESC wined3ddesc; + WINED3DVOLUME_DESC wined3ddesc; TRACE("iface %p, desc %p.\n", iface, pDesc); wined3d_mutex_lock(); - hr = IWineD3DVolume_GetDesc(This->wineD3DVolume, &wined3ddesc); + IWineD3DVolume_GetDesc(This->wineD3DVolume, &wined3ddesc); wined3d_mutex_unlock(); - if (SUCCEEDED(hr)) - { - pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format); - pDesc->Type = wined3ddesc.Type; - pDesc->Usage = wined3ddesc.Usage; - pDesc->Pool = wined3ddesc.Pool; - pDesc->Size = wined3ddesc.Size; - pDesc->Width = wined3ddesc.Width; - pDesc->Height = wined3ddesc.Height; - pDesc->Depth = wined3ddesc.Depth; - } + pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format); + pDesc->Type = wined3ddesc.Type; + pDesc->Usage = wined3ddesc.Usage; + pDesc->Pool = wined3ddesc.Pool; + pDesc->Size = wined3ddesc.Size; + pDesc->Width = wined3ddesc.Width; + pDesc->Height = wined3ddesc.Height; + pDesc->Depth = wined3ddesc.Depth; - return hr; + return D3D_OK; } static HRESULT WINAPI IDirect3DVolume8Impl_LockBox(LPDIRECT3DVOLUME8 iface, D3DLOCKED_BOX *pLockedVolume, CONST D3DBOX *pBox, DWORD Flags) { @@ -256,7 +252,7 @@ static const struct wined3d_parent_ops d3d8_volume_wined3d_parent_ops = }; HRESULT volume_init(IDirect3DVolume8Impl *volume, IDirect3DDevice8Impl *device, UINT width, UINT height, - UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool) + UINT depth, DWORD usage, enum wined3d_format_id format, WINED3DPOOL pool) { HRESULT hr; @@ -264,7 +260,7 @@ HRESULT volume_init(IDirect3DVolume8Impl *volume, IDirect3DDevice8Impl *device, volume->ref = 1; hr = IWineD3DDevice_CreateVolume(device->WineD3DDevice, width, height, depth, usage, - format, pool, &volume->wineD3DVolume, (IUnknown *)volume, &d3d8_volume_wined3d_parent_ops); + format, pool, volume, &d3d8_volume_wined3d_parent_ops, &volume->wineD3DVolume); if (FAILED(hr)) { WARN("Failed to create wined3d volume, hr %#x.\n", hr); diff --git a/dll/directx/wine/d3d8/volumetexture.c b/dll/directx/wine/d3d8/volumetexture.c index bc5c5b84d2e..bd72d68e916 100644 --- a/dll/directx/wine/d3d8/volumetexture.c +++ b/dll/directx/wine/d3d8/volumetexture.c @@ -251,22 +251,26 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetLevelDesc(LPDIRECT3DVOLUMET return hr; } -static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetVolumeLevel(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level, IDirect3DVolume8 **ppVolumeLevel) { +static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetVolumeLevel(IDirect3DVolumeTexture8 *iface, + UINT Level, IDirect3DVolume8 **ppVolumeLevel) +{ IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface; - HRESULT hrc = D3D_OK; IWineD3DVolume *myVolume = NULL; + HRESULT hr; TRACE("iface %p, level %u, volume %p.\n", iface, Level, ppVolumeLevel); wined3d_mutex_lock(); - hrc = IWineD3DVolumeTexture_GetVolumeLevel(This->wineD3DVolumeTexture, Level, &myVolume); - if (hrc == D3D_OK && NULL != ppVolumeLevel) { - IWineD3DVolumeTexture_GetParent(myVolume, (IUnknown **)ppVolumeLevel); - IWineD3DVolumeTexture_Release(myVolume); + hr = IWineD3DVolumeTexture_GetVolumeLevel(This->wineD3DVolumeTexture, Level, &myVolume); + if (SUCCEEDED(hr) && ppVolumeLevel) + { + *ppVolumeLevel = IWineD3DVolumeTexture_GetParent(myVolume); + IDirect3DVolume8_AddRef(*ppVolumeLevel); + IWineD3DVolumeTexture_Release(myVolume); } wined3d_mutex_unlock(); - return hrc; + return hr; } static HRESULT WINAPI IDirect3DVolumeTexture8Impl_LockBox(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level, D3DLOCKED_BOX *pLockedVolume, CONST D3DBOX *pBox, DWORD Flags) { @@ -356,8 +360,8 @@ HRESULT volumetexture_init(IDirect3DVolumeTexture8Impl *texture, IDirect3DDevice wined3d_mutex_lock(); hr = IWineD3DDevice_CreateVolumeTexture(device->WineD3DDevice, width, height, depth, levels, - usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, - &texture->wineD3DVolumeTexture, (IUnknown *)texture, &d3d8_volumetexture_wined3d_parent_ops); + usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture, + &d3d8_volumetexture_wined3d_parent_ops, &texture->wineD3DVolumeTexture); wined3d_mutex_unlock(); if (FAILED(hr)) { diff --git a/dll/directx/wine/d3d9/buffer.c b/dll/directx/wine/d3d9/buffer.c new file mode 100644 index 00000000000..ac8c2443e33 --- /dev/null +++ b/dll/directx/wine/d3d9/buffer.c @@ -0,0 +1,551 @@ +/* + * Copyright 2002-2004 Jason Edmeades + * Copyright 2002-2004 Raphael Junqueira + * Copyright 2005 Oliver Stieber + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "d3d9_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d9); + +static HRESULT WINAPI d3d9_vertexbuffer_QueryInterface(IDirect3DVertexBuffer9 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IDirect3DVertexBuffer9) + || IsEqualGUID(riid, &IID_IDirect3DResource9) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IDirect3DVertexBuffer9_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3d9_vertexbuffer_AddRef(IDirect3DVertexBuffer9 *iface) +{ + IDirect3DVertexBuffer9Impl *buffer = (IDirect3DVertexBuffer9Impl *)iface; + ULONG refcount = InterlockedIncrement(&buffer->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + if (refcount == 1) + { + IDirect3DDevice9Ex_AddRef(buffer->parentDevice); + wined3d_mutex_lock(); + IWineD3DBuffer_AddRef(buffer->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + } + + return refcount; +} + +static ULONG WINAPI d3d9_vertexbuffer_Release(IDirect3DVertexBuffer9 *iface) +{ + IDirect3DVertexBuffer9Impl *buffer = (IDirect3DVertexBuffer9Impl *)iface; + ULONG refcount = InterlockedDecrement(&buffer->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + { + IDirect3DDevice9Ex *device = buffer->parentDevice; + + wined3d_mutex_lock(); + IWineD3DBuffer_Release(buffer->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice9Ex_Release(device); + } + + return refcount; +} + +static HRESULT WINAPI d3d9_vertexbuffer_GetDevice(IDirect3DVertexBuffer9 *iface, IDirect3DDevice9 **device) +{ + TRACE("iface %p, device %p.\n", iface, device); + + *device = (IDirect3DDevice9 *)((IDirect3DVertexBuffer9Impl *)iface)->parentDevice; + IDirect3DDevice9_AddRef(*device); + + TRACE("Returning device %p.\n", *device); + + return D3D_OK; +} + +static HRESULT WINAPI d3d9_vertexbuffer_SetPrivateData(IDirect3DVertexBuffer9 *iface, + REFGUID guid, const void *data, DWORD data_size, DWORD flags) +{ + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", + iface, debugstr_guid(guid), data, data_size, flags); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_SetPrivateData(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer, + guid, data, data_size, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d9_vertexbuffer_GetPrivateData(IDirect3DVertexBuffer9 *iface, + REFGUID guid, void *data, DWORD *data_size) +{ + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %p.\n", + iface, debugstr_guid(guid), data, data_size); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_GetPrivateData(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer, + guid, data, data_size); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d9_vertexbuffer_FreePrivateData(IDirect3DVertexBuffer9 *iface, REFGUID guid) +{ + HRESULT hr; + + TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_FreePrivateData(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer, guid); + wined3d_mutex_unlock(); + + return hr; +} + +static DWORD WINAPI d3d9_vertexbuffer_SetPriority(IDirect3DVertexBuffer9 *iface, DWORD priority) +{ + DWORD previous; + + TRACE("iface %p, priority %u.\n", iface, priority); + + wined3d_mutex_lock(); + previous = IWineD3DBuffer_SetPriority(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer, priority); + wined3d_mutex_unlock(); + + return previous; +} + +static DWORD WINAPI d3d9_vertexbuffer_GetPriority(IDirect3DVertexBuffer9 *iface) +{ + DWORD priority; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + priority = IWineD3DBuffer_GetPriority(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + + return priority; +} + +static void WINAPI d3d9_vertexbuffer_PreLoad(IDirect3DVertexBuffer9 *iface) +{ + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + IWineD3DBuffer_PreLoad(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer); + wined3d_mutex_unlock(); +} + +static D3DRESOURCETYPE WINAPI d3d9_vertexbuffer_GetType(IDirect3DVertexBuffer9 *iface) +{ + TRACE("iface %p.\n", iface); + + return D3DRTYPE_VERTEXBUFFER; +} + +static HRESULT WINAPI d3d9_vertexbuffer_Lock(IDirect3DVertexBuffer9 *iface, + UINT offset, UINT size, void **data, DWORD flags) +{ + HRESULT hr; + + TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", + iface, offset, size, data, flags); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_Map(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer, + offset, size, (BYTE **)data, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d9_vertexbuffer_Unlock(IDirect3DVertexBuffer9 *iface) +{ + HRESULT hr; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_Unmap(((IDirect3DVertexBuffer9Impl *)iface)->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d9_vertexbuffer_GetDesc(IDirect3DVertexBuffer9 *iface, D3DVERTEXBUFFER_DESC *desc) +{ + IDirect3DVertexBuffer9Impl *buffer = (IDirect3DVertexBuffer9Impl *)iface; + WINED3DBUFFER_DESC wined3d_desc; + + TRACE("iface %p, desc %p.\n", iface, desc); + + wined3d_mutex_lock(); + IWineD3DBuffer_GetDesc(buffer->wineD3DVertexBuffer, &wined3d_desc); + wined3d_mutex_unlock(); + + desc->Format = D3DFMT_VERTEXDATA; + desc->Usage = wined3d_desc.Usage; + desc->Pool = wined3d_desc.Pool; + desc->Size = wined3d_desc.Size; + desc->Type = D3DRTYPE_VERTEXBUFFER; + desc->FVF = buffer->fvf; + + return D3D_OK; +} + +static const IDirect3DVertexBuffer9Vtbl d3d9_vertexbuffer_vtbl = +{ + /* IUnknown */ + d3d9_vertexbuffer_QueryInterface, + d3d9_vertexbuffer_AddRef, + d3d9_vertexbuffer_Release, + /* IDirect3DResource9 */ + d3d9_vertexbuffer_GetDevice, + d3d9_vertexbuffer_SetPrivateData, + d3d9_vertexbuffer_GetPrivateData, + d3d9_vertexbuffer_FreePrivateData, + d3d9_vertexbuffer_SetPriority, + d3d9_vertexbuffer_GetPriority, + d3d9_vertexbuffer_PreLoad, + d3d9_vertexbuffer_GetType, + /* IDirect3DVertexBuffer9 */ + d3d9_vertexbuffer_Lock, + d3d9_vertexbuffer_Unlock, + d3d9_vertexbuffer_GetDesc, +}; + +static void STDMETHODCALLTYPE d3d9_vertexbuffer_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d9_vertexbuffer_wined3d_parent_ops = +{ + d3d9_vertexbuffer_wined3d_object_destroyed, +}; + +HRESULT vertexbuffer_init(IDirect3DVertexBuffer9Impl *buffer, IDirect3DDevice9Impl *device, + UINT size, UINT usage, DWORD fvf, D3DPOOL pool) +{ + HRESULT hr; + + buffer->lpVtbl = &d3d9_vertexbuffer_vtbl; + buffer->ref = 1; + buffer->fvf = fvf; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateVertexBuffer(device->WineD3DDevice, size, usage & WINED3DUSAGE_MASK, + (WINED3DPOOL)pool, buffer, &d3d9_vertexbuffer_wined3d_parent_ops, &buffer->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d buffer, hr %#x.\n", hr); + return hr; + } + + buffer->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(buffer->parentDevice); + + return D3D_OK; +} + +static HRESULT WINAPI d3d9_indexbuffer_QueryInterface(IDirect3DIndexBuffer9 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IDirect3DIndexBuffer9) + || IsEqualGUID(riid, &IID_IDirect3DResource9) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IDirect3DIndexBuffer9_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3d9_indexbuffer_AddRef(IDirect3DIndexBuffer9 *iface) +{ + IDirect3DIndexBuffer9Impl *buffer = (IDirect3DIndexBuffer9Impl *)iface; + ULONG refcount = InterlockedIncrement(&buffer->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + if (refcount == 1) + { + IDirect3DDevice9Ex_AddRef(buffer->parentDevice); + wined3d_mutex_lock(); + IWineD3DBuffer_AddRef(buffer->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + } + + return refcount; +} + +static ULONG WINAPI d3d9_indexbuffer_Release(IDirect3DIndexBuffer9 *iface) +{ + IDirect3DIndexBuffer9Impl *buffer = (IDirect3DIndexBuffer9Impl *)iface; + ULONG refcount = InterlockedDecrement(&buffer->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + { + IDirect3DDevice9Ex *device = buffer->parentDevice; + + wined3d_mutex_lock(); + IWineD3DBuffer_Release(buffer->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice9Ex_Release(device); + } + + return refcount; +} + +static HRESULT WINAPI d3d9_indexbuffer_GetDevice(IDirect3DIndexBuffer9 *iface, IDirect3DDevice9 **device) +{ + TRACE("iface %p, device %p.\n", iface, device); + + *device = (IDirect3DDevice9 *)((IDirect3DIndexBuffer9Impl *)iface)->parentDevice; + IDirect3DDevice9_AddRef(*device); + + TRACE("Returning device %p.\n", *device); + + return D3D_OK; +} + +static HRESULT WINAPI d3d9_indexbuffer_SetPrivateData(IDirect3DIndexBuffer9 *iface, + REFGUID guid, const void *data, DWORD data_size, DWORD flags) +{ + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", + iface, debugstr_guid(guid), data, data_size, flags); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_SetPrivateData(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer, + guid, data, data_size, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d9_indexbuffer_GetPrivateData(IDirect3DIndexBuffer9 *iface, + REFGUID guid, void *data, DWORD *data_size) +{ + HRESULT hr; + + TRACE("iface %p, guid %s, data %p, data_size %p.\n", + iface, debugstr_guid(guid), data, data_size); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_GetPrivateData(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer, + guid, data, data_size); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d9_indexbuffer_FreePrivateData(IDirect3DIndexBuffer9 *iface, REFGUID guid) +{ + HRESULT hr; + + TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_FreePrivateData(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer, guid); + wined3d_mutex_unlock(); + + return hr; +} + +static DWORD WINAPI d3d9_indexbuffer_SetPriority(IDirect3DIndexBuffer9 *iface, DWORD priority) +{ + DWORD previous; + + TRACE("iface %p, priority %u.\n", iface, priority); + + wined3d_mutex_lock(); + previous = IWineD3DBuffer_SetPriority(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer, priority); + wined3d_mutex_unlock(); + + return previous; +} + +static DWORD WINAPI d3d9_indexbuffer_GetPriority(IDirect3DIndexBuffer9 *iface) +{ + DWORD priority; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + priority = IWineD3DBuffer_GetPriority(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + + return priority; +} + +static void WINAPI d3d9_indexbuffer_PreLoad(IDirect3DIndexBuffer9 *iface) +{ + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + IWineD3DBuffer_PreLoad(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer); + wined3d_mutex_unlock(); +} + +static D3DRESOURCETYPE WINAPI d3d9_indexbuffer_GetType(IDirect3DIndexBuffer9 *iface) +{ + TRACE("iface %p.\n", iface); + + return D3DRTYPE_INDEXBUFFER; +} + +static HRESULT WINAPI d3d9_indexbuffer_Lock(IDirect3DIndexBuffer9 *iface, + UINT offset, UINT size, void **data, DWORD flags) +{ + HRESULT hr; + + TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", + iface, offset, size, data, flags); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_Map(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer, + offset, size, (BYTE **)data, flags); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d9_indexbuffer_Unlock(IDirect3DIndexBuffer9 *iface) +{ + HRESULT hr; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + hr = IWineD3DBuffer_Unmap(((IDirect3DIndexBuffer9Impl *)iface)->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI d3d9_indexbuffer_GetDesc(IDirect3DIndexBuffer9 *iface, D3DINDEXBUFFER_DESC *desc) +{ + IDirect3DIndexBuffer9Impl *buffer = (IDirect3DIndexBuffer9Impl *)iface; + WINED3DBUFFER_DESC wined3d_desc; + + TRACE("iface %p, desc %p.\n", iface, desc); + + wined3d_mutex_lock(); + IWineD3DBuffer_GetDesc(buffer->wineD3DIndexBuffer, &wined3d_desc); + wined3d_mutex_unlock(); + + desc->Format = d3dformat_from_wined3dformat(buffer->format); + desc->Usage = wined3d_desc.Usage; + desc->Pool = wined3d_desc.Pool; + desc->Size = wined3d_desc.Size; + desc->Type = D3DRTYPE_INDEXBUFFER; + + return D3D_OK; +} + +static const IDirect3DIndexBuffer9Vtbl d3d9_indexbuffer_vtbl = +{ + /* IUnknown */ + d3d9_indexbuffer_QueryInterface, + d3d9_indexbuffer_AddRef, + d3d9_indexbuffer_Release, + /* IDirect3DResource9 */ + d3d9_indexbuffer_GetDevice, + d3d9_indexbuffer_SetPrivateData, + d3d9_indexbuffer_GetPrivateData, + d3d9_indexbuffer_FreePrivateData, + d3d9_indexbuffer_SetPriority, + d3d9_indexbuffer_GetPriority, + d3d9_indexbuffer_PreLoad, + d3d9_indexbuffer_GetType, + /* IDirect3DIndexBuffer9 */ + d3d9_indexbuffer_Lock, + d3d9_indexbuffer_Unlock, + d3d9_indexbuffer_GetDesc, +}; + +static void STDMETHODCALLTYPE d3d9_indexbuffer_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d9_indexbuffer_wined3d_parent_ops = +{ + d3d9_indexbuffer_wined3d_object_destroyed, +}; + +HRESULT indexbuffer_init(IDirect3DIndexBuffer9Impl *buffer, IDirect3DDevice9Impl *device, + UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; + + buffer->lpVtbl = &d3d9_indexbuffer_vtbl; + buffer->ref = 1; + buffer->format = wined3dformat_from_d3dformat(format); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateIndexBuffer(device->WineD3DDevice, size, usage & WINED3DUSAGE_MASK, + (WINED3DPOOL)pool, buffer, &d3d9_indexbuffer_wined3d_parent_ops, &buffer->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d buffer, hr %#x.\n", hr); + return hr; + } + + buffer->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(buffer->parentDevice); + + return D3D_OK; +} diff --git a/dll/directx/wine/d3d9/cubetexture.c b/dll/directx/wine/d3d9/cubetexture.c index c0d0e3c5518..508784f8958 100644 --- a/dll/directx/wine/d3d9/cubetexture.c +++ b/dll/directx/wine/d3d9/cubetexture.c @@ -292,22 +292,27 @@ static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetLevelDesc(LPDIRECT3DCUBETEXTU return hr; } -static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetCubeMapSurface(LPDIRECT3DCUBETEXTURE9 iface, D3DCUBEMAP_FACES FaceType, UINT Level, IDirect3DSurface9** ppCubeMapSurface) { +static HRESULT WINAPI IDirect3DCubeTexture9Impl_GetCubeMapSurface(IDirect3DCubeTexture9 *iface, + D3DCUBEMAP_FACES FaceType, UINT Level, IDirect3DSurface9 **ppCubeMapSurface) +{ IDirect3DCubeTexture9Impl *This = (IDirect3DCubeTexture9Impl *)iface; - HRESULT hrc = D3D_OK; IWineD3DSurface *mySurface = NULL; + HRESULT hr; TRACE("iface %p, face %#x, level %u, surface %p.\n", iface, FaceType, Level, ppCubeMapSurface); wined3d_mutex_lock(); - hrc = IWineD3DCubeTexture_GetCubeMapSurface(This->wineD3DCubeTexture, (WINED3DCUBEMAP_FACES) FaceType, Level, &mySurface); - if (hrc == D3D_OK && NULL != ppCubeMapSurface) { - IWineD3DCubeTexture_GetParent(mySurface, (IUnknown **)ppCubeMapSurface); - IWineD3DCubeTexture_Release(mySurface); + hr = IWineD3DCubeTexture_GetCubeMapSurface(This->wineD3DCubeTexture, + (WINED3DCUBEMAP_FACES)FaceType, Level, &mySurface); + if (SUCCEEDED(hr) && ppCubeMapSurface) + { + *ppCubeMapSurface = IWineD3DCubeTexture_GetParent(mySurface); + IDirect3DSurface9_AddRef(*ppCubeMapSurface); + IWineD3DCubeTexture_Release(mySurface); } wined3d_mutex_unlock(); - return hrc; + return hr; } static HRESULT WINAPI IDirect3DCubeTexture9Impl_LockRect(LPDIRECT3DCUBETEXTURE9 iface, D3DCUBEMAP_FACES FaceType, UINT Level, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) { @@ -399,9 +404,9 @@ HRESULT cubetexture_init(IDirect3DCubeTexture9Impl *texture, IDirect3DDevice9Imp texture->ref = 1; wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateCubeTexture(device->WineD3DDevice, edge_length, levels, usage, - wined3dformat_from_d3dformat(format), pool, &texture->wineD3DCubeTexture, - (IUnknown *)texture, &d3d9_cubetexture_wined3d_parent_ops); + hr = IWineD3DDevice_CreateCubeTexture(device->WineD3DDevice, edge_length, + levels, usage, wined3dformat_from_d3dformat(format), pool, texture, + &d3d9_cubetexture_wined3d_parent_ops, &texture->wineD3DCubeTexture); wined3d_mutex_unlock(); if (FAILED(hr)) { diff --git a/dll/directx/wine/d3d9/d3d9_private.h b/dll/directx/wine/d3d9/d3d9_private.h index eb3a032f18b..f1bc1a0e23d 100644 --- a/dll/directx/wine/d3d9/d3d9_private.h +++ b/dll/directx/wine/d3d9/d3d9_private.h @@ -42,8 +42,8 @@ Internal use =========================================================================== */ extern HRESULT vdecl_convert_fvf(DWORD FVF, D3DVERTEXELEMENT9 **ppVertexElements) DECLSPEC_HIDDEN; -D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format) DECLSPEC_HIDDEN; -WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_HIDDEN; +D3DFORMAT d3dformat_from_wined3dformat(enum wined3d_format_id format) DECLSPEC_HIDDEN; +enum wined3d_format_id wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_HIDDEN; /* =========================================================================== Macros @@ -183,51 +183,6 @@ typedef struct IDirect3DDevice9Impl HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapter, D3DDEVTYPE device_type, HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters) DECLSPEC_HIDDEN; -/* IDirect3DDevice9: */ -extern HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(IDirect3DDevice9Ex *iface, - UINT iSwapChain, IDirect3DSwapChain9 **pSwapChain) DECLSPEC_HIDDEN; -extern UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(IDirect3DDevice9Ex *iface) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(IDirect3DDevice9Ex *iface, - IDirect3DVertexDeclaration9 *pDecl) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexDeclaration(IDirect3DDevice9Ex *iface, - IDirect3DVertexDeclaration9 **ppDecl) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShader(IDirect3DDevice9Ex *iface, - IDirect3DVertexShader9 *pShader) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShader(IDirect3DDevice9Ex *iface, - IDirect3DVertexShader9 **ppShader) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantF(IDirect3DDevice9Ex *iface, - UINT StartRegister, const float *pConstantData, UINT Vector4fCount) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantF(IDirect3DDevice9Ex *iface, - UINT StartRegister, float *pConstantData, UINT Vector4fCount) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantI(IDirect3DDevice9Ex *iface, - UINT StartRegister, const int *pConstantData, UINT Vector4iCount) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantI(IDirect3DDevice9Ex *iface, - UINT StartRegister, int *pConstantData, UINT Vector4iCount) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantB(IDirect3DDevice9Ex *iface, - UINT StartRegister, const BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantB(IDirect3DDevice9Ex *iface, - UINT StartRegister, BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShader(IDirect3DDevice9Ex *iface, - IDirect3DPixelShader9 *pShader) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShader(IDirect3DDevice9Ex *iface, - IDirect3DPixelShader9 **ppShader) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantF(IDirect3DDevice9Ex *iface, - UINT StartRegister, const float *pConstantData, UINT Vector4fCount) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantF(IDirect3DDevice9Ex *iface, - UINT StartRegister, float *pConstantData, UINT Vector4fCount) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantI(IDirect3DDevice9Ex *iface, - UINT StartRegister, const int *pConstantData, UINT Vector4iCount) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantI(IDirect3DDevice9Ex *iface, - UINT StartRegister, int *pConstantData, UINT Vector4iCount) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantB(IDirect3DDevice9Ex *iface, - UINT StartRegister, const BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantB(IDirect3DDevice9Ex *iface, - UINT StartRegister, BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN; - -/* ---------------- */ -/* IDirect3DVolume9 */ -/* ---------------- */ - /***************************************************************************** * IDirect3DVolume9 implementation structure */ @@ -248,7 +203,7 @@ typedef struct IDirect3DVolume9Impl } IDirect3DVolume9Impl; HRESULT volume_init(IDirect3DVolume9Impl *volume, IDirect3DDevice9Impl *device, UINT width, UINT height, - UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool) DECLSPEC_HIDDEN; + UINT depth, DWORD usage, enum wined3d_format_id format, WINED3DPOOL pool) DECLSPEC_HIDDEN; /* ------------------- */ /* IDirect3DSwapChain9 */ @@ -351,7 +306,7 @@ typedef struct IDirect3DIndexBuffer9Impl /* Parent reference */ LPDIRECT3DDEVICE9EX parentDevice; - WINED3DFORMAT format; + enum wined3d_format_id format; } IDirect3DIndexBuffer9Impl; HRESULT indexbuffer_init(IDirect3DIndexBuffer9Impl *buffer, IDirect3DDevice9Impl *device, diff --git a/dll/directx/wine/d3d9/device.c b/dll/directx/wine/d3d9/device.c index b9f539e0b28..c788b987c8a 100644 --- a/dll/directx/wine/d3d9/device.c +++ b/dll/directx/wine/d3d9/device.c @@ -25,7 +25,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d9); -D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format) +D3DFORMAT d3dformat_from_wined3dformat(enum wined3d_format_id format) { BYTE *c = (BYTE *)&format; @@ -85,12 +85,12 @@ D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format) case WINED3DFMT_R32G32B32A32_FLOAT: return D3DFMT_A32B32G32R32F; case WINED3DFMT_R8G8_SNORM_Cx: return D3DFMT_CxV8U8; default: - FIXME("Unhandled WINED3DFORMAT %#x\n", format); + FIXME("Unhandled wined3d format %#x.\n", format); return D3DFMT_UNKNOWN; } } -WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format) +enum wined3d_format_id wined3dformat_from_d3dformat(D3DFORMAT format) { BYTE *c = (BYTE *)&format; @@ -187,8 +187,9 @@ static ULONG WINAPI D3D9CB_DestroySwapChain(IWineD3DSwapChain *swapchain) TRACE("swapchain %p.\n", swapchain); - IWineD3DSwapChain_GetParent(swapchain, (IUnknown **)&parent); + parent = IWineD3DSwapChain_GetParent(swapchain); parent->isImplicit = FALSE; + IDirect3DSwapChain9_AddRef((IDirect3DSwapChain9 *)parent); return IDirect3DSwapChain9_Release((IDirect3DSwapChain9 *)parent); } @@ -337,7 +338,8 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetDirect3D(LPDIRECT3DDEVICE9EX iface hr = IWineD3DDevice_GetDirect3D(This->WineD3DDevice, &pWineD3D); if (hr == D3D_OK && pWineD3D != NULL) { - IWineD3D_GetParent(pWineD3D,(IUnknown **)ppD3D9); + *ppD3D9 = IWineD3D_GetParent(pWineD3D); + IDirect3D9_AddRef(*ppD3D9); IWineD3D_Release(pWineD3D); } else { FIXME("Call to IWineD3DDevice_GetDirect3D failed\n"); @@ -484,6 +486,45 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_CreateAdditionalSwa return D3D_OK; } +static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_GetSwapChain(IDirect3DDevice9Ex *iface, + UINT swapchain_idx, IDirect3DSwapChain9 **swapchain) +{ + IWineD3DSwapChain *wined3d_swapchain = NULL; + HRESULT hr; + + TRACE("iface %p, swapchain_idx %u, swapchain %p.\n", iface, swapchain_idx, swapchain); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_GetSwapChain(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, + swapchain_idx, &wined3d_swapchain); + if (SUCCEEDED(hr) && swapchain) + { + *swapchain = IWineD3DSwapChain_GetParent(wined3d_swapchain); + IDirect3DSwapChain9_AddRef(*swapchain); + IWineD3DSwapChain_Release(wined3d_swapchain); + } + else + { + *swapchain = NULL; + } + wined3d_mutex_unlock(); + + return hr; +} + +static UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(IDirect3DDevice9Ex *iface) +{ + UINT count; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + count = IWineD3DDevice_GetNumberOfSwapChains(((IDirect3DDevice9Impl *)iface)->WineD3DDevice); + wined3d_mutex_unlock(); + + return count; +} + static HRESULT WINAPI reset_enum_callback(IWineD3DResource *resource, void *data) { BOOL *resources_ok = data; D3DRESOURCETYPE type; @@ -495,7 +536,7 @@ static HRESULT WINAPI reset_enum_callback(IWineD3DResource *resource, void *data WINED3DPOOL pool; IDirect3DResource9 *parent; - IWineD3DResource_GetParent(resource, (IUnknown **) &parent); + parent = IWineD3DResource_GetParent(resource); type = IDirect3DResource9_GetType(parent); switch(type) { case D3DRTYPE_SURFACE: @@ -526,16 +567,17 @@ static HRESULT WINAPI reset_enum_callback(IWineD3DResource *resource, void *data break; } - if(pool == WINED3DPOOL_DEFAULT) { - if(IUnknown_Release(parent) == 0) { + if (pool == WINED3DPOOL_DEFAULT) + { + IDirect3DResource9_AddRef(parent); + if (IUnknown_Release(parent) == 0) + { TRACE("Parent %p is an implicit resource with ref 0\n", parent); } else { WARN("Resource %p(wineD3D %p) with pool D3DPOOL_DEFAULT blocks the Reset call\n", parent, resource); ret = S_FALSE; *resources_ok = FALSE; } - } else { - IUnknown_Release(parent); } IWineD3DResource_Release(resource); @@ -635,23 +677,28 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Present(LPDIRECT3D return hr; } -static HRESULT WINAPI IDirect3DDevice9Impl_GetBackBuffer(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9 ** ppBackBuffer) { +static HRESULT WINAPI IDirect3DDevice9Impl_GetBackBuffer(IDirect3DDevice9Ex *iface, + UINT iSwapChain, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9 **ppBackBuffer) +{ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; IWineD3DSurface *retSurface = NULL; - HRESULT rc = D3D_OK; + HRESULT hr; TRACE("iface %p, swapchain %u, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, iSwapChain, BackBuffer, Type, ppBackBuffer); wined3d_mutex_lock(); - rc = IWineD3DDevice_GetBackBuffer(This->WineD3DDevice, iSwapChain, BackBuffer, (WINED3DBACKBUFFER_TYPE) Type, &retSurface); - if (rc == D3D_OK && NULL != retSurface && NULL != ppBackBuffer) { - IWineD3DSurface_GetParent(retSurface, (IUnknown **)ppBackBuffer); + hr = IWineD3DDevice_GetBackBuffer(This->WineD3DDevice, iSwapChain, + BackBuffer, (WINED3DBACKBUFFER_TYPE) Type, &retSurface); + if (SUCCEEDED(hr) && retSurface && ppBackBuffer) + { + *ppBackBuffer = IWineD3DSurface_GetParent(retSurface); + IDirect3DSurface9_AddRef(*ppBackBuffer); IWineD3DSurface_Release(retSurface); } wined3d_mutex_unlock(); - return rc; + return hr; } static HRESULT WINAPI IDirect3DDevice9Impl_GetRasterStatus(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, D3DRASTER_STATUS* pRasterStatus) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; @@ -1007,7 +1054,16 @@ static HRESULT WINAPI IDirect3DDevice9Impl_StretchRect(IDirect3DDevice9Ex *iface return hr; } -static HRESULT WINAPI IDirect3DDevice9Impl_ColorFill(LPDIRECT3DDEVICE9EX iface, IDirect3DSurface9* pSurface, CONST RECT* pRect, D3DCOLOR color) { +static HRESULT WINAPI IDirect3DDevice9Impl_ColorFill(IDirect3DDevice9Ex *iface, + IDirect3DSurface9 *pSurface, const RECT *pRect, D3DCOLOR color) +{ + const WINED3DCOLORVALUE c = + { + ((color >> 16) & 0xff) / 255.0f, + ((color >> 8) & 0xff) / 255.0f, + (color & 0xff) / 255.0f, + ((color >> 24) & 0xff) / 255.0f, + }; IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; IDirect3DSurface9Impl *surface = (IDirect3DSurface9Impl *)pSurface; WINED3DPOOL pool; @@ -1035,8 +1091,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_ColorFill(LPDIRECT3DDEVICE9EX iface } /* Colorfill can only be used on rendertarget surfaces, or offscreen plain surfaces in D3DPOOL_DEFAULT */ - /* Note: D3DRECT is compatible with WINED3DRECT */ - hr = IWineD3DDevice_ColorFill(This->WineD3DDevice, surface->wineD3DSurface, (CONST WINED3DRECT*)pRect, color); + hr = IWineD3DDevice_ColorFill(This->WineD3DDevice, surface->wineD3DSurface, pRect, &c); wined3d_mutex_unlock(); @@ -1088,7 +1143,9 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetRenderTarget(LPDIRECT3DDEVICE9EX return hr; } -static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTarget(LPDIRECT3DDEVICE9EX iface, DWORD RenderTargetIndex, IDirect3DSurface9 **ppRenderTarget) { +static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTarget(IDirect3DDevice9Ex *iface, + DWORD RenderTargetIndex, IDirect3DSurface9 **ppRenderTarget) +{ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; IWineD3DSurface *pRenderTarget; HRESULT hr; @@ -1119,7 +1176,8 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTarget(LPDIRECT3DDEVICE9EX } else { - IWineD3DSurface_GetParent(pRenderTarget, (IUnknown **)ppRenderTarget); + *ppRenderTarget = IWineD3DSurface_GetParent(pRenderTarget); + IDirect3DSurface9_AddRef(*ppRenderTarget); IWineD3DSurface_Release(pRenderTarget); } @@ -1144,10 +1202,12 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetDepthStencilSurface(LPDIRECT3DDE return hr; } -static HRESULT WINAPI IDirect3DDevice9Impl_GetDepthStencilSurface(LPDIRECT3DDEVICE9EX iface, IDirect3DSurface9 **ppZStencilSurface) { +static HRESULT WINAPI IDirect3DDevice9Impl_GetDepthStencilSurface(IDirect3DDevice9Ex *iface, + IDirect3DSurface9 **ppZStencilSurface) +{ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr = D3D_OK; IWineD3DSurface *pZStencilSurface; + HRESULT hr; TRACE("iface %p, depth_stencil %p.\n", iface, ppZStencilSurface); @@ -1157,10 +1217,14 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetDepthStencilSurface(LPDIRECT3DDE wined3d_mutex_lock(); hr = IWineD3DDevice_GetDepthStencilSurface(This->WineD3DDevice,&pZStencilSurface); - if (hr == WINED3D_OK) { - IWineD3DSurface_GetParent(pZStencilSurface,(IUnknown**)ppZStencilSurface); + if (SUCCEEDED(hr)) + { + *ppZStencilSurface = IWineD3DSurface_GetParent(pZStencilSurface); + IDirect3DSurface9_AddRef(*ppZStencilSurface); IWineD3DSurface_Release(pZStencilSurface); - } else { + } + else + { if (hr != WINED3DERR_NOTFOUND) WARN("Call to IWineD3DDevice_GetDepthStencilSurface failed with 0x%08x\n", hr); *ppZStencilSurface = NULL; @@ -1205,7 +1269,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_Clear(LPDIRECT3DDEVICE9EX iface, DW /* Note: D3DRECT is compatible with WINED3DRECT */ wined3d_mutex_lock(); - hr = IWineD3DDevice_Clear(This->WineD3DDevice, Count, (CONST WINED3DRECT*) pRects, Flags, Color, Z, Stencil); + hr = IWineD3DDevice_Clear(This->WineD3DDevice, Count, (const RECT *)pRects, Flags, Color, Z, Stencil); wined3d_mutex_unlock(); return hr; @@ -1532,10 +1596,12 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetClipStatus(LPDIRECT3DDEVICE9EX i return hr; } -static HRESULT WINAPI IDirect3DDevice9Impl_GetTexture(LPDIRECT3DDEVICE9EX iface, DWORD Stage, IDirect3DBaseTexture9 **ppTexture) { +static HRESULT WINAPI IDirect3DDevice9Impl_GetTexture(IDirect3DDevice9Ex *iface, + DWORD Stage, IDirect3DBaseTexture9 **ppTexture) +{ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; IWineD3DBaseTexture *retTexture = NULL; - HRESULT rc = D3D_OK; + HRESULT hr; TRACE("iface %p, stage %u, texture %p.\n", iface, Stage, ppTexture); @@ -1544,19 +1610,24 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetTexture(LPDIRECT3DDEVICE9EX ifac } wined3d_mutex_lock(); - rc = IWineD3DDevice_GetTexture(This->WineD3DDevice, Stage, &retTexture); - if (SUCCEEDED(rc) && NULL != retTexture) { - IWineD3DBaseTexture_GetParent(retTexture, (IUnknown **)ppTexture); + hr = IWineD3DDevice_GetTexture(This->WineD3DDevice, Stage, &retTexture); + if (SUCCEEDED(hr) && retTexture) + { + *ppTexture = IWineD3DBaseTexture_GetParent(retTexture); + IWineD3DBaseTexture_AddRef(*ppTexture); IWineD3DBaseTexture_Release(retTexture); - } else { - if(FAILED(rc)) { + } + else + { + if (FAILED(hr)) + { WARN("Call to get texture (%d) failed (%p)\n", Stage, retTexture); } *ppTexture = NULL; } wined3d_mutex_unlock(); - return rc; + return hr; } static HRESULT WINAPI IDirect3DDevice9Impl_SetTexture(LPDIRECT3DDEVICE9EX iface, DWORD Stage, IDirect3DBaseTexture9* pTexture) { @@ -1610,12 +1681,19 @@ static const WINED3DTEXTURESTAGESTATETYPE tss_lookup[] = WINED3DTSS_CONSTANT, /* 32, D3DTSS_CONSTANT */ }; -static HRESULT WINAPI IDirect3DDevice9Impl_GetTextureStageState(LPDIRECT3DDEVICE9EX iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD* pValue) { +static HRESULT WINAPI IDirect3DDevice9Impl_GetTextureStageState(LPDIRECT3DDEVICE9EX iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD *pValue) +{ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; HRESULT hr; TRACE("iface %p, stage %u, state %#x, value %p.\n", iface, Stage, Type, pValue); + if (Type >= sizeof(tss_lookup) / sizeof(*tss_lookup)) + { + WARN("Invalid Type %#x passed.\n", Type); + return D3D_OK; + } + wined3d_mutex_lock(); hr = IWineD3DDevice_GetTextureStageState(This->WineD3DDevice, Stage, tss_lookup[Type], pValue); wined3d_mutex_unlock(); @@ -1623,12 +1701,19 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetTextureStageState(LPDIRECT3DDEVI return hr; } -static HRESULT WINAPI IDirect3DDevice9Impl_SetTextureStageState(LPDIRECT3DDEVICE9EX iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) { +static HRESULT WINAPI IDirect3DDevice9Impl_SetTextureStageState(LPDIRECT3DDEVICE9EX iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) +{ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; HRESULT hr; TRACE("iface %p, stage %u, state %#x, value %#x.\n", iface, Stage, Type, Value); + if (Type >= sizeof(tss_lookup) / sizeof(*tss_lookup)) + { + WARN("Invalid Type %#x passed.\n", Type); + return D3D_OK; + } + wined3d_mutex_lock(); hr = IWineD3DDevice_SetTextureStageState(This->WineD3DDevice, Stage, tss_lookup[Type], Value); wined3d_mutex_unlock(); @@ -1939,6 +2024,49 @@ static HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexDeclaration(IDirect3DDevi return D3D_OK; } +static HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(IDirect3DDevice9Ex *iface, + IDirect3DVertexDeclaration9 *declaration) +{ + HRESULT hr; + + TRACE("iface %p, declaration %p.\n", iface, declaration); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_SetVertexDeclaration(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, + declaration ? ((IDirect3DVertexDeclaration9Impl *)declaration)->wineD3DVertexDeclaration : NULL); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_GetVertexDeclaration(IDirect3DDevice9Ex *iface, + IDirect3DVertexDeclaration9 **declaration) +{ + IWineD3DVertexDeclaration *wined3d_declaration = NULL; + HRESULT hr; + + TRACE("iface %p, declaration %p.\n", iface, declaration); + + if (!declaration) return D3DERR_INVALIDCALL; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_GetVertexDeclaration(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, &wined3d_declaration); + if (SUCCEEDED(hr) && wined3d_declaration) + { + *declaration = IWineD3DVertexDeclaration_GetParent(wined3d_declaration); + IDirect3DVertexDeclaration9_AddRef(*declaration); + IWineD3DVertexDeclaration_Release(wined3d_declaration); + } + else + { + *declaration = NULL; + } + wined3d_mutex_unlock(); + + TRACE("Returning %p.\n", *declaration); + return hr; +} + static IDirect3DVertexDeclaration9 *getConvertedDecl(IDirect3DDevice9Impl *This, DWORD fvf) { HRESULT hr; D3DVERTEXELEMENT9* elements = NULL; @@ -2086,6 +2214,145 @@ static HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexShader(IDirect3DDevice9Ex return D3D_OK; } +static HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShader(IDirect3DDevice9Ex *iface, + IDirect3DVertexShader9 *shader) +{ + HRESULT hr; + + TRACE("iface %p, shader %p.\n", iface, shader); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_SetVertexShader(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, + shader ? ((IDirect3DVertexShader9Impl *)shader)->wineD3DVertexShader : NULL); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShader(IDirect3DDevice9Ex *iface, + IDirect3DVertexShader9 **shader) +{ + IWineD3DVertexShader *wined3d_shader; + + TRACE("iface %p, shader %p.\n", iface, shader); + + wined3d_mutex_lock(); + wined3d_shader = IWineD3DDevice_GetVertexShader(((IDirect3DDevice9Impl *)iface)->WineD3DDevice); + if (wined3d_shader) + { + *shader = IWineD3DVertexShader_GetParent(wined3d_shader); + IDirect3DVertexShader9_AddRef(*shader); + IWineD3DVertexShader_Release(wined3d_shader); + } + else + { + *shader = NULL; + } + wined3d_mutex_unlock(); + + TRACE("Returning %p.\n", *shader); + + return D3D_OK; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantF(IDirect3DDevice9Ex *iface, + UINT reg_idx, const float *data, UINT count) +{ + HRESULT hr; + + TRACE("iface %p, reg_idx %u, data %p, count %u.\n", iface, reg_idx, data, count); + + if (reg_idx + count > D3D9_MAX_VERTEX_SHADER_CONSTANTF) + { + WARN("Trying to access %u constants, but d3d9 only supports %u\n", + reg_idx + count, D3D9_MAX_VERTEX_SHADER_CONSTANTF); + return D3DERR_INVALIDCALL; + } + + wined3d_mutex_lock(); + hr = IWineD3DDevice_SetVertexShaderConstantF(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, reg_idx, data, count); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantF(IDirect3DDevice9Ex *iface, + UINT reg_idx, float *data, UINT count) +{ + HRESULT hr; + + TRACE("iface %p, reg_idx %u, data %p, count %u.\n", iface, reg_idx, data, count); + + if (reg_idx + count > D3D9_MAX_VERTEX_SHADER_CONSTANTF) + { + WARN("Trying to access %u constants, but d3d9 only supports %u\n", + reg_idx + count, D3D9_MAX_VERTEX_SHADER_CONSTANTF); + return D3DERR_INVALIDCALL; + } + + wined3d_mutex_lock(); + hr = IWineD3DDevice_GetVertexShaderConstantF(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, reg_idx, data, count); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantI(IDirect3DDevice9Ex *iface, + UINT reg_idx, const int *data, UINT count) +{ + HRESULT hr; + + TRACE("iface %p, reg_idx %u, data %p, count %u.\n", iface, reg_idx, data, count); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_SetVertexShaderConstantI(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, reg_idx, data, count); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantI(IDirect3DDevice9Ex *iface, + UINT reg_idx, int *data, UINT count) +{ + HRESULT hr; + + TRACE("iface %p, reg_idx %u, data %p, count %u.\n", iface, reg_idx, data, count); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_GetVertexShaderConstantI(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, reg_idx, data, count); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantB(IDirect3DDevice9Ex *iface, + UINT reg_idx, const BOOL *data, UINT count) +{ + HRESULT hr; + + TRACE("iface %p, reg_idx %u, data %p, count %u.\n", iface, reg_idx, data, count); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_SetVertexShaderConstantB(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, reg_idx, data, count); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantB(IDirect3DDevice9Ex *iface, + UINT reg_idx, BOOL *data, UINT count) +{ + HRESULT hr; + + TRACE("iface %p, reg_idx %u, data %p, count %u.\n", iface, reg_idx, data, count); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_GetVertexShaderConstantB(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, reg_idx, data, count); + wined3d_mutex_unlock(); + + return hr; +} + static HRESULT WINAPI IDirect3DDevice9Impl_SetStreamSource(LPDIRECT3DDEVICE9EX iface, UINT StreamNumber, IDirect3DVertexBuffer9* pStreamData, UINT OffsetInBytes, UINT Stride) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; HRESULT hr; @@ -2102,10 +2369,12 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetStreamSource(LPDIRECT3DDEVICE9EX i return hr; } -static HRESULT WINAPI IDirect3DDevice9Impl_GetStreamSource(LPDIRECT3DDEVICE9EX iface, UINT StreamNumber, IDirect3DVertexBuffer9 **pStream, UINT* OffsetInBytes, UINT* pStride) { +static HRESULT WINAPI IDirect3DDevice9Impl_GetStreamSource(IDirect3DDevice9Ex *iface, + UINT StreamNumber, IDirect3DVertexBuffer9 **pStream, UINT* OffsetInBytes, UINT* pStride) +{ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; IWineD3DBuffer *retStream = NULL; - HRESULT rc = D3D_OK; + HRESULT hr; TRACE("iface %p, stream_idx %u, buffer %p, offset %p, stride %p.\n", iface, StreamNumber, pStream, OffsetInBytes, pStride); @@ -2115,19 +2384,24 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetStreamSource(LPDIRECT3DDEVICE9EX i } wined3d_mutex_lock(); - rc = IWineD3DDevice_GetStreamSource(This->WineD3DDevice, StreamNumber, &retStream, OffsetInBytes, pStride); - if (rc == D3D_OK && NULL != retStream) { - IWineD3DBuffer_GetParent(retStream, (IUnknown **)pStream); + hr = IWineD3DDevice_GetStreamSource(This->WineD3DDevice, StreamNumber, &retStream, OffsetInBytes, pStride); + if (SUCCEEDED(hr) && retStream) + { + *pStream = IWineD3DBuffer_GetParent(retStream); + IDirect3DVertexBuffer9_AddRef(*pStream); IWineD3DBuffer_Release(retStream); - }else{ - if (rc != D3D_OK){ + } + else + { + if (FAILED(hr)) + { FIXME("Call to GetStreamSource failed %p %p\n", OffsetInBytes, pStride); } *pStream = NULL; } wined3d_mutex_unlock(); - return rc; + return hr; } static HRESULT WINAPI IDirect3DDevice9Impl_SetStreamSourceFreq(IDirect3DDevice9Ex *iface, UINT StreamNumber, @@ -2174,10 +2448,11 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetIndices(LPDIRECT3DDEVICE9EX ifac return hr; } -static HRESULT WINAPI IDirect3DDevice9Impl_GetIndices(LPDIRECT3DDEVICE9EX iface, IDirect3DIndexBuffer9 **ppIndexData) { +static HRESULT WINAPI IDirect3DDevice9Impl_GetIndices(IDirect3DDevice9Ex *iface, IDirect3DIndexBuffer9 **ppIndexData) +{ IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; IWineD3DBuffer *retIndexData = NULL; - HRESULT rc = D3D_OK; + HRESULT hr; TRACE("iface %p, buffer %p.\n", iface, ppIndexData); @@ -2186,17 +2461,21 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetIndices(LPDIRECT3DDEVICE9EX ifac } wined3d_mutex_lock(); - rc = IWineD3DDevice_GetIndexBuffer(This->WineD3DDevice, &retIndexData); - if (SUCCEEDED(rc) && retIndexData) { - IWineD3DBuffer_GetParent(retIndexData, (IUnknown **)ppIndexData); + hr = IWineD3DDevice_GetIndexBuffer(This->WineD3DDevice, &retIndexData); + if (SUCCEEDED(hr) && retIndexData) + { + *ppIndexData = IWineD3DBuffer_GetParent(retIndexData); + IDirect3DIndexBuffer9_AddRef(*ppIndexData); IWineD3DBuffer_Release(retIndexData); - } else { - if (FAILED(rc)) FIXME("Call to GetIndices failed\n"); + } + else + { + if (FAILED(hr)) FIXME("Call to GetIndices failed\n"); *ppIndexData = NULL; } wined3d_mutex_unlock(); - return rc; + return hr; } static HRESULT WINAPI IDirect3DDevice9Impl_CreatePixelShader(IDirect3DDevice9Ex *iface, @@ -2229,6 +2508,133 @@ static HRESULT WINAPI IDirect3DDevice9Impl_CreatePixelShader(IDirect3DDevice9Ex return D3D_OK; } +static HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShader(IDirect3DDevice9Ex *iface, + IDirect3DPixelShader9 *shader) +{ + HRESULT hr; + + TRACE("iface %p, shader %p.\n", iface, shader); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_SetPixelShader(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, + shader ? ((IDirect3DPixelShader9Impl *)shader)->wineD3DPixelShader : NULL); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShader(IDirect3DDevice9Ex *iface, + IDirect3DPixelShader9 **shader) +{ + IWineD3DPixelShader *wined3d_shader; + + TRACE("iface %p, shader %p.\n", iface, shader); + + if (!shader) return D3DERR_INVALIDCALL; + + wined3d_mutex_lock(); + wined3d_shader = IWineD3DDevice_GetPixelShader(((IDirect3DDevice9Impl *)iface)->WineD3DDevice); + if (wined3d_shader) + { + *shader = IWineD3DPixelShader_GetParent(wined3d_shader); + IDirect3DPixelShader9_AddRef(*shader); + IWineD3DPixelShader_Release(wined3d_shader); + } + else + { + *shader = NULL; + } + wined3d_mutex_unlock(); + + TRACE("Returning %p.\n", *shader); + + return D3D_OK; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantF(IDirect3DDevice9Ex *iface, + UINT reg_idx, const float *data, UINT count) +{ + HRESULT hr; + + TRACE("iface %p, reg_idx %u, data %p, count %u.\n", iface, reg_idx, data, count); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_SetPixelShaderConstantF(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, reg_idx, data, count); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantF(IDirect3DDevice9Ex *iface, + UINT reg_idx, float *data, UINT count) +{ + HRESULT hr; + + TRACE("iface %p, reg_idx %u, data %p, count %u.\n", iface, reg_idx, data, count); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_GetPixelShaderConstantF(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, reg_idx, data, count); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantI(IDirect3DDevice9Ex *iface, + UINT reg_idx, const int *data, UINT count) +{ + HRESULT hr; + + TRACE("iface %p, reg_idx %u, data %p, count %u.\n", iface, reg_idx, data, count); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_SetPixelShaderConstantI(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, reg_idx, data, count); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantI(IDirect3DDevice9Ex *iface, + UINT reg_idx, int *data, UINT count) +{ + HRESULT hr; + + TRACE("iface %p, reg_idx %u, data %p, count %u.\n", iface, reg_idx, data, count); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_GetPixelShaderConstantI(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, reg_idx, data, count); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantB(IDirect3DDevice9Ex *iface, + UINT reg_idx, const BOOL *data, UINT count) +{ + HRESULT hr; + + TRACE("iface %p, reg_idx %u, data %p, count %u.\n", iface, reg_idx, data, count); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_SetPixelShaderConstantB(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, reg_idx, data, count); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantB(IDirect3DDevice9Ex *iface, + UINT reg_idx, BOOL *data, UINT count) +{ + HRESULT hr; + + TRACE("iface %p, reg_idx %u, data %p, count %u.\n", iface, reg_idx, data, count); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_GetPixelShaderConstantB(((IDirect3DDevice9Impl *)iface)->WineD3DDevice, reg_idx, data, count); + wined3d_mutex_unlock(); + + return hr; +} + static HRESULT WINAPI IDirect3DDevice9Impl_DrawRectPatch(LPDIRECT3DDEVICE9EX iface, UINT Handle, CONST float* pNumSegs, CONST D3DRECTPATCH_INFO* pRectPatchInfo) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; HRESULT hr; @@ -2610,7 +3016,7 @@ static void STDMETHODCALLTYPE device_parent_WineD3DDeviceCreated(IWineD3DDeviceP } static HRESULT STDMETHODCALLTYPE device_parent_CreateSurface(IWineD3DDeviceParent *iface, - IUnknown *superior, UINT width, UINT height, WINED3DFORMAT format, DWORD usage, + IUnknown *superior, UINT width, UINT height, enum wined3d_format_id format, DWORD usage, WINED3DPOOL pool, UINT level, WINED3DCUBEMAP_FACES face, IWineD3DSurface **surface) { struct IDirect3DDevice9Impl *This = device_from_device_parent(iface); @@ -2648,8 +3054,9 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSurface(IWineD3DDeviceParen } static HRESULT STDMETHODCALLTYPE device_parent_CreateRenderTarget(IWineD3DDeviceParent *iface, - IUnknown *superior, UINT width, UINT height, WINED3DFORMAT format, WINED3DMULTISAMPLE_TYPE multisample_type, - DWORD multisample_quality, BOOL lockable, IWineD3DSurface **surface) + IUnknown *superior, UINT width, UINT height, enum wined3d_format_id format, + WINED3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality, BOOL lockable, + IWineD3DSurface **surface) { struct IDirect3DDevice9Impl *This = device_from_device_parent(iface); IDirect3DSurface9Impl *d3d_surface; @@ -2679,16 +3086,16 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateRenderTarget(IWineD3DDevice } static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3DDeviceParent *iface, - IUnknown *superior, UINT width, UINT height, WINED3DFORMAT format, WINED3DMULTISAMPLE_TYPE multisample_type, + UINT width, UINT height, enum wined3d_format_id format, WINED3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality, BOOL discard, IWineD3DSurface **surface) { struct IDirect3DDevice9Impl *This = device_from_device_parent(iface); IDirect3DSurface9Impl *d3d_surface; HRESULT hr; - TRACE("iface %p, superior %p, width %u, height %u, format %#x, multisample_type %#x,\n" + TRACE("iface %p, width %u, height %u, format %#x, multisample_type %#x,\n" "\tmultisample_quality %u, discard %u, surface %p\n", - iface, superior, width, height, format, multisample_type, multisample_quality, discard, surface); + iface, width, height, format, multisample_type, multisample_quality, discard, surface); hr = IDirect3DDevice9Impl_CreateDepthStencilSurface((IDirect3DDevice9Ex *)This, width, height, d3dformat_from_wined3dformat(format), multisample_type, multisample_quality, discard, @@ -2709,7 +3116,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3 } static HRESULT STDMETHODCALLTYPE device_parent_CreateVolume(IWineD3DDeviceParent *iface, - IUnknown *superior, UINT width, UINT height, UINT depth, WINED3DFORMAT format, + IUnknown *superior, UINT width, UINT height, UINT depth, enum wined3d_format_id format, WINED3DPOOL pool, DWORD usage, IWineD3DVolume **volume) { struct IDirect3DDevice9Impl *This = device_from_device_parent(iface); @@ -2824,9 +3231,8 @@ static const IWineD3DDeviceParentVtbl d3d9_wined3d_device_parent_vtbl = static void setup_fpu(void) { - WORD cw; - #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) + WORD cw; __asm__ volatile ("fnstcw %0" : "=m" (cw)); cw = (cw & ~0xf3f) | 0x3f; __asm__ volatile ("fldcw %0" : : "m" (cw)); @@ -2849,7 +3255,7 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte if (!(flags & D3DCREATE_FPU_PRESERVE)) setup_fpu(); wined3d_mutex_lock(); - hr = IWineD3D_CreateDevice(wined3d, adapter, device_type, focus_window, flags, (IUnknown *)device, + hr = IWineD3D_CreateDevice(wined3d, adapter, device_type, focus_window, flags, (IWineD3DDeviceParent *)&device->device_parent_vtbl, &device->WineD3DDevice); if (FAILED(hr)) { diff --git a/dll/directx/wine/d3d9/indexbuffer.c b/dll/directx/wine/d3d9/indexbuffer.c deleted file mode 100644 index 1b7e8e43276..00000000000 --- a/dll/directx/wine/d3d9/indexbuffer.c +++ /dev/null @@ -1,287 +0,0 @@ -/* - * IDirect3DIndexBuffer9 implementation - * - * Copyright 2002-2004 Jason Edmeades - * Raphael Junqueira - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "d3d9_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d9); - -/* IDirect3DIndexBuffer9 IUnknown parts follow: */ -static HRESULT WINAPI IDirect3DIndexBuffer9Impl_QueryInterface(LPDIRECT3DINDEXBUFFER9 iface, REFIID riid, LPVOID* ppobj) { - IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface; - - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); - - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IDirect3DResource9) - || IsEqualGUID(riid, &IID_IDirect3DIndexBuffer9)) { - IDirect3DIndexBuffer9_AddRef(iface); - *ppobj = This; - return S_OK; - } - - WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); - *ppobj = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI IDirect3DIndexBuffer9Impl_AddRef(LPDIRECT3DINDEXBUFFER9 iface) { - IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("%p increasing refcount to %u.\n", iface, ref); - - if (ref == 1) - { - IDirect3DDevice9Ex_AddRef(This->parentDevice); - wined3d_mutex_lock(); - IWineD3DBuffer_AddRef(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); - } - - return ref; -} - -static ULONG WINAPI IDirect3DIndexBuffer9Impl_Release(LPDIRECT3DINDEXBUFFER9 iface) { - IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("%p decreasing refcount to %u.\n", iface, ref); - - if (ref == 0) { - IDirect3DDevice9Ex *parentDevice = This->parentDevice; - - wined3d_mutex_lock(); - IWineD3DBuffer_Release(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); - - /* Release the device last, as it may cause the device to be destroyed. */ - IDirect3DDevice9Ex_Release(parentDevice); - } - return ref; -} - -/* IDirect3DIndexBuffer9 IDirect3DResource9 Interface follow: */ -static HRESULT WINAPI IDirect3DIndexBuffer9Impl_GetDevice(IDirect3DIndexBuffer9 *iface, IDirect3DDevice9 **device) -{ - IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface; - - TRACE("iface %p, device %p.\n", iface, device); - - *device = (IDirect3DDevice9 *)This->parentDevice; - IDirect3DDevice9_AddRef(*device); - - TRACE("Returning device %p.\n", *device); - - return D3D_OK; -} - -static HRESULT WINAPI IDirect3DIndexBuffer9Impl_SetPrivateData(LPDIRECT3DINDEXBUFFER9 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) { - IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", - iface, debugstr_guid(refguid), pData, SizeOfData, Flags); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_SetPrivateData(This->wineD3DIndexBuffer, refguid, pData, SizeOfData, Flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DIndexBuffer9Impl_GetPrivateData(LPDIRECT3DINDEXBUFFER9 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData) { - IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %p.\n", - iface, debugstr_guid(refguid), pData, pSizeOfData); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_GetPrivateData(This->wineD3DIndexBuffer, refguid, pData, pSizeOfData); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DIndexBuffer9Impl_FreePrivateData(LPDIRECT3DINDEXBUFFER9 iface, REFGUID refguid) { - IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid)); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_FreePrivateData(This->wineD3DIndexBuffer, refguid); - wined3d_mutex_unlock(); - - return hr; -} - -static DWORD WINAPI IDirect3DIndexBuffer9Impl_SetPriority(LPDIRECT3DINDEXBUFFER9 iface, DWORD PriorityNew) { - IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface; - DWORD ret; - - TRACE("iface %p, priority %u.\n", iface, PriorityNew); - - wined3d_mutex_lock(); - ret = IWineD3DBuffer_SetPriority(This->wineD3DIndexBuffer, PriorityNew); - wined3d_mutex_unlock(); - - return ret; -} - -static DWORD WINAPI IDirect3DIndexBuffer9Impl_GetPriority(LPDIRECT3DINDEXBUFFER9 iface) { - IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface; - DWORD ret; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - ret = IWineD3DBuffer_GetPriority(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); - - return ret; -} - -static void WINAPI IDirect3DIndexBuffer9Impl_PreLoad(LPDIRECT3DINDEXBUFFER9 iface) { - IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - IWineD3DBuffer_PreLoad(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); -} - -static D3DRESOURCETYPE WINAPI IDirect3DIndexBuffer9Impl_GetType(IDirect3DIndexBuffer9 *iface) -{ - TRACE("iface %p.\n", iface); - - return D3DRTYPE_INDEXBUFFER; -} - -/* IDirect3DIndexBuffer9 Interface follow: */ -static HRESULT WINAPI IDirect3DIndexBuffer9Impl_Lock(LPDIRECT3DINDEXBUFFER9 iface, UINT OffsetToLock, UINT SizeToLock, void** ppbData, DWORD Flags) { - IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", - iface, OffsetToLock, SizeToLock, ppbData, Flags); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_Map(This->wineD3DIndexBuffer, OffsetToLock, SizeToLock, (BYTE **)ppbData, Flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DIndexBuffer9Impl_Unlock(LPDIRECT3DINDEXBUFFER9 iface) { - IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface; - HRESULT hr; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_Unmap(This->wineD3DIndexBuffer); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DIndexBuffer9Impl_GetDesc(LPDIRECT3DINDEXBUFFER9 iface, D3DINDEXBUFFER_DESC *pDesc) { - IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl *)iface; - HRESULT hr; - WINED3DBUFFER_DESC desc; - - TRACE("iface %p, desc %p.\n", iface, pDesc); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_GetDesc(This->wineD3DIndexBuffer, &desc); - wined3d_mutex_unlock(); - - if (SUCCEEDED(hr)) { - pDesc->Format = d3dformat_from_wined3dformat(This->format); - pDesc->Usage = desc.Usage; - pDesc->Pool = desc.Pool; - pDesc->Size = desc.Size; - pDesc->Type = D3DRTYPE_INDEXBUFFER; - } - - return hr; -} - - -static const IDirect3DIndexBuffer9Vtbl Direct3DIndexBuffer9_Vtbl = -{ - /* IUnknown */ - IDirect3DIndexBuffer9Impl_QueryInterface, - IDirect3DIndexBuffer9Impl_AddRef, - IDirect3DIndexBuffer9Impl_Release, - /* IDirect3DResource9 */ - IDirect3DIndexBuffer9Impl_GetDevice, - IDirect3DIndexBuffer9Impl_SetPrivateData, - IDirect3DIndexBuffer9Impl_GetPrivateData, - IDirect3DIndexBuffer9Impl_FreePrivateData, - IDirect3DIndexBuffer9Impl_SetPriority, - IDirect3DIndexBuffer9Impl_GetPriority, - IDirect3DIndexBuffer9Impl_PreLoad, - IDirect3DIndexBuffer9Impl_GetType, - /* IDirect3DIndexBuffer9 */ - IDirect3DIndexBuffer9Impl_Lock, - IDirect3DIndexBuffer9Impl_Unlock, - IDirect3DIndexBuffer9Impl_GetDesc -}; - -static void STDMETHODCALLTYPE d3d9_indexbuffer_wined3d_object_destroyed(void *parent) -{ - HeapFree(GetProcessHeap(), 0, parent); -} - -static const struct wined3d_parent_ops d3d9_indexbuffer_wined3d_parent_ops = -{ - d3d9_indexbuffer_wined3d_object_destroyed, -}; - -HRESULT indexbuffer_init(IDirect3DIndexBuffer9Impl *buffer, IDirect3DDevice9Impl *device, - UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) -{ - HRESULT hr; - - buffer->lpVtbl = &Direct3DIndexBuffer9_Vtbl; - buffer->ref = 1; - buffer->format = wined3dformat_from_d3dformat(format); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateIndexBuffer(device->WineD3DDevice, size, - usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, &buffer->wineD3DIndexBuffer, - (IUnknown *)buffer, &d3d9_indexbuffer_wined3d_parent_ops); - wined3d_mutex_unlock(); - if (FAILED(hr)) - { - WARN("Failed to create wined3d buffer, hr %#x.\n", hr); - return hr; - } - - buffer->parentDevice = (IDirect3DDevice9Ex *)device; - IDirect3DDevice9Ex_AddRef(buffer->parentDevice); - - return D3D_OK; -} diff --git a/dll/directx/wine/d3d9/pixelshader.c b/dll/directx/wine/d3d9/pixelshader.c deleted file mode 100644 index 7cb803a7f4c..00000000000 --- a/dll/directx/wine/d3d9/pixelshader.c +++ /dev/null @@ -1,286 +0,0 @@ -/* - * IDirect3DPixelShader9 implementation - * - * Copyright 2002-2003 Jason Edmeades - * Raphael Junqueira - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "d3d9_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d9); - -/* IDirect3DPixelShader9 IUnknown parts follow: */ -static HRESULT WINAPI IDirect3DPixelShader9Impl_QueryInterface(LPDIRECT3DPIXELSHADER9 iface, REFIID riid, LPVOID* ppobj) { - IDirect3DPixelShader9Impl *This = (IDirect3DPixelShader9Impl *)iface; - - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); - - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IDirect3DPixelShader9)) { - IDirect3DPixelShader9_AddRef(iface); - *ppobj = This; - return S_OK; - } - - WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); - *ppobj = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI IDirect3DPixelShader9Impl_AddRef(LPDIRECT3DPIXELSHADER9 iface) { - IDirect3DPixelShader9Impl *This = (IDirect3DPixelShader9Impl *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("%p increasing refcount to %u.\n", iface, ref); - - if (ref == 1) - { - IDirect3DDevice9Ex_AddRef(This->parentDevice); - wined3d_mutex_lock(); - IWineD3DPixelShader_AddRef(This->wineD3DPixelShader); - wined3d_mutex_unlock(); - } - - return ref; -} - -static ULONG WINAPI IDirect3DPixelShader9Impl_Release(LPDIRECT3DPIXELSHADER9 iface) { - IDirect3DPixelShader9Impl *This = (IDirect3DPixelShader9Impl *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("%p decreasing refcount to %u.\n", iface, ref); - - if (ref == 0) { - IDirect3DDevice9Ex *parentDevice = This->parentDevice; - - wined3d_mutex_lock(); - IWineD3DPixelShader_Release(This->wineD3DPixelShader); - wined3d_mutex_unlock(); - - /* Release the device last, as it may cause the device to be destroyed. */ - IDirect3DDevice9Ex_Release(parentDevice); - } - return ref; -} - -/* IDirect3DPixelShader9 Interface follow: */ -static HRESULT WINAPI IDirect3DPixelShader9Impl_GetDevice(IDirect3DPixelShader9 *iface, IDirect3DDevice9 **device) -{ - IDirect3DPixelShader9Impl *This = (IDirect3DPixelShader9Impl *)iface; - - TRACE("iface %p, device %p.\n", iface, device); - - *device = (IDirect3DDevice9 *)This->parentDevice; - IDirect3DDevice9_AddRef(*device); - - TRACE("Returning device %p.\n", *device); - - return D3D_OK; -} - -static HRESULT WINAPI IDirect3DPixelShader9Impl_GetFunction(LPDIRECT3DPIXELSHADER9 iface, VOID* pData, UINT* pSizeOfData) { - IDirect3DPixelShader9Impl *This = (IDirect3DPixelShader9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, data %p, data_size %p.\n", iface, pData, pSizeOfData); - - wined3d_mutex_lock(); - hr = IWineD3DPixelShader_GetFunction(This->wineD3DPixelShader, pData, pSizeOfData); - wined3d_mutex_unlock(); - - return hr; -} - - -static const IDirect3DPixelShader9Vtbl Direct3DPixelShader9_Vtbl = -{ - /* IUnknown */ - IDirect3DPixelShader9Impl_QueryInterface, - IDirect3DPixelShader9Impl_AddRef, - IDirect3DPixelShader9Impl_Release, - /* IDirect3DPixelShader9 */ - IDirect3DPixelShader9Impl_GetDevice, - IDirect3DPixelShader9Impl_GetFunction -}; - -static void STDMETHODCALLTYPE d3d9_pixelshader_wined3d_object_destroyed(void *parent) -{ - HeapFree(GetProcessHeap(), 0, parent); -} - -static const struct wined3d_parent_ops d3d9_pixelshader_wined3d_parent_ops = -{ - d3d9_pixelshader_wined3d_object_destroyed, -}; - -HRESULT pixelshader_init(IDirect3DPixelShader9Impl *shader, IDirect3DDevice9Impl *device, const DWORD *byte_code) -{ - HRESULT hr; - - shader->ref = 1; - shader->lpVtbl = &Direct3DPixelShader9_Vtbl; - - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreatePixelShader(device->WineD3DDevice, byte_code, - NULL, &shader->wineD3DPixelShader, (IUnknown *)shader, - &d3d9_pixelshader_wined3d_parent_ops); - wined3d_mutex_unlock(); - if (FAILED(hr)) - { - WARN("Failed to created wined3d pixel shader, hr %#x.\n", hr); - return hr; - } - - shader->parentDevice = (IDirect3DDevice9Ex *)device; - IDirect3DDevice9Ex_AddRef(shader->parentDevice); - - return D3D_OK; -} - -HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShader(LPDIRECT3DDEVICE9EX iface, IDirect3DPixelShader9* pShader) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - IDirect3DPixelShader9Impl *shader = (IDirect3DPixelShader9Impl *)pShader; - - TRACE("iface %p, shader %p.\n", iface, shader); - - wined3d_mutex_lock(); - IWineD3DDevice_SetPixelShader(This->WineD3DDevice, shader == NULL ? NULL :shader->wineD3DPixelShader); - wined3d_mutex_unlock(); - - return D3D_OK; -} - -HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShader(LPDIRECT3DDEVICE9EX iface, IDirect3DPixelShader9** ppShader) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - IWineD3DPixelShader *object; - HRESULT hrc; - - TRACE("iface %p, shader %p.\n", iface, ppShader); - - if (ppShader == NULL) { - TRACE("(%p) Invalid call\n", This); - return D3DERR_INVALIDCALL; - } - - wined3d_mutex_lock(); - hrc = IWineD3DDevice_GetPixelShader(This->WineD3DDevice, &object); - if (SUCCEEDED(hrc)) - { - if (object) - { - hrc = IWineD3DPixelShader_GetParent(object, (IUnknown **)ppShader); - IWineD3DPixelShader_Release(object); - } - else - { - *ppShader = NULL; - } - } - else - { - WARN("(%p) : Call to IWineD3DDevice_GetPixelShader failed %u (device %p)\n", This, hrc, This->WineD3DDevice); - } - wined3d_mutex_unlock(); - - TRACE("(%p) : returning %p\n", This, *ppShader); - return hrc; -} - -HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantF(LPDIRECT3DDEVICE9EX iface, UINT Register, CONST float* pConstantData, UINT Vector4fCount) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, register %u, data %p, count %u.\n", - iface, Register, pConstantData, Vector4fCount); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_SetPixelShaderConstantF(This->WineD3DDevice, Register, pConstantData, Vector4fCount); - wined3d_mutex_unlock(); - - return hr; -} - -HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantF(LPDIRECT3DDEVICE9EX iface, UINT Register, float* pConstantData, UINT Vector4fCount) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, register %u, data %p, count %u.\n", - iface, Register, pConstantData, Vector4fCount); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_GetPixelShaderConstantF(This->WineD3DDevice, Register, pConstantData, Vector4fCount); - wined3d_mutex_unlock(); - - return hr; -} - -HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantI(LPDIRECT3DDEVICE9EX iface, UINT Register, CONST int* pConstantData, UINT Vector4iCount) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, register %u, data %p, count %u.\n", - iface, Register, pConstantData, Vector4iCount); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_SetPixelShaderConstantI(This->WineD3DDevice, Register, pConstantData, Vector4iCount); - wined3d_mutex_unlock(); - - return hr; -} - -HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantI(LPDIRECT3DDEVICE9EX iface, UINT Register, int* pConstantData, UINT Vector4iCount) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, register %u, data %p, count %u.\n", - iface, Register, pConstantData, Vector4iCount); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_GetPixelShaderConstantI(This->WineD3DDevice, Register, pConstantData, Vector4iCount); - wined3d_mutex_unlock(); - - return hr; -} - -HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantB(LPDIRECT3DDEVICE9EX iface, UINT Register, CONST BOOL* pConstantData, UINT BoolCount) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, register %u, data %p, count %u.\n", - iface, Register, pConstantData, BoolCount); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_SetPixelShaderConstantB(This->WineD3DDevice, Register, pConstantData, BoolCount); - wined3d_mutex_unlock(); - - return hr; -} - -HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantB(LPDIRECT3DDEVICE9EX iface, UINT Register, BOOL* pConstantData, UINT BoolCount) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, register %u, data %p, count %u.\n", - iface, Register, pConstantData, BoolCount); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_GetPixelShaderConstantB(This->WineD3DDevice, Register, pConstantData, BoolCount); - wined3d_mutex_unlock(); - - return hr; -} diff --git a/dll/directx/wine/d3d9/query.c b/dll/directx/wine/d3d9/query.c index a38dc9d15fb..4a5869696fb 100644 --- a/dll/directx/wine/d3d9/query.c +++ b/dll/directx/wine/d3d9/query.c @@ -158,7 +158,7 @@ HRESULT query_init(IDirect3DQuery9Impl *query, IDirect3DDevice9Impl *device, D3D query->ref = 1; wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateQuery(device->WineD3DDevice, type, &query->wineD3DQuery, (IUnknown *)query); + hr = IWineD3DDevice_CreateQuery(device->WineD3DDevice, type, &query->wineD3DQuery); wined3d_mutex_unlock(); if (FAILED(hr)) { diff --git a/dll/directx/wine/d3d9/shader.c b/dll/directx/wine/d3d9/shader.c new file mode 100644 index 00000000000..c6656e524c3 --- /dev/null +++ b/dll/directx/wine/d3d9/shader.c @@ -0,0 +1,278 @@ +/* + * Copyright 2002-2003 Jason Edmeades + * Raphael Junqueira + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "d3d9_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d9); + +static HRESULT WINAPI d3d9_vertexshader_QueryInterface(IDirect3DVertexShader9 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IDirect3DVertexShader9) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IDirect3DVertexShader9_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3d9_vertexshader_AddRef(IDirect3DVertexShader9 *iface) +{ + IDirect3DVertexShader9Impl *shader = (IDirect3DVertexShader9Impl *)iface; + ULONG refcount = InterlockedIncrement(&shader->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + if (refcount == 1) + { + IDirect3DDevice9Ex_AddRef(shader->parentDevice); + wined3d_mutex_lock(); + IWineD3DVertexShader_AddRef(shader->wineD3DVertexShader); + wined3d_mutex_unlock(); + } + + return refcount; +} + +static ULONG WINAPI d3d9_vertexshader_Release(IDirect3DVertexShader9 *iface) +{ + IDirect3DVertexShader9Impl *shader = (IDirect3DVertexShader9Impl *)iface; + ULONG refcount = InterlockedDecrement(&shader->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + { + IDirect3DDevice9Ex *device = shader->parentDevice; + + wined3d_mutex_lock(); + IWineD3DVertexShader_Release(shader->wineD3DVertexShader); + wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice9Ex_Release(device); + } + + return refcount; +} + +static HRESULT WINAPI d3d9_vertexshader_GetDevice(IDirect3DVertexShader9 *iface, IDirect3DDevice9 **device) +{ + TRACE("iface %p, device %p.\n", iface, device); + + *device = (IDirect3DDevice9 *)((IDirect3DVertexShader9Impl *)iface)->parentDevice; + IDirect3DDevice9_AddRef(*device); + + TRACE("Returning device %p.\n", *device); + + return D3D_OK; +} + +static HRESULT WINAPI d3d9_vertexshader_GetFunction(IDirect3DVertexShader9 *iface, + void *data, UINT *data_size) +{ + HRESULT hr; + + TRACE("iface %p, data %p, data_size %p.\n", iface, data, data_size); + + wined3d_mutex_lock(); + hr = IWineD3DVertexShader_GetFunction(((IDirect3DVertexShader9Impl *)iface)->wineD3DVertexShader, data, data_size); + wined3d_mutex_unlock(); + + return hr; +} + +static const IDirect3DVertexShader9Vtbl d3d9_vertexshader_vtbl = +{ + /* IUnknown */ + d3d9_vertexshader_QueryInterface, + d3d9_vertexshader_AddRef, + d3d9_vertexshader_Release, + /* IDirect3DVertexShader9 */ + d3d9_vertexshader_GetDevice, + d3d9_vertexshader_GetFunction, +}; + +static void STDMETHODCALLTYPE d3d9_vertexshader_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d9_vertexshader_wined3d_parent_ops = +{ + d3d9_vertexshader_wined3d_object_destroyed, +}; + +HRESULT vertexshader_init(IDirect3DVertexShader9Impl *shader, IDirect3DDevice9Impl *device, const DWORD *byte_code) +{ + HRESULT hr; + + shader->ref = 1; + shader->lpVtbl = &d3d9_vertexshader_vtbl; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateVertexShader(device->WineD3DDevice, byte_code, NULL, + shader, &d3d9_vertexshader_wined3d_parent_ops, &shader->wineD3DVertexShader); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr); + return hr; + } + + shader->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(shader->parentDevice); + + return D3D_OK; +} + +static HRESULT WINAPI d3d9_pixelshader_QueryInterface(IDirect3DPixelShader9 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IDirect3DPixelShader9) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IDirect3DPixelShader9_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3d9_pixelshader_AddRef(IDirect3DPixelShader9 *iface) +{ + IDirect3DPixelShader9Impl *shader = (IDirect3DPixelShader9Impl *)iface; + ULONG refcount = InterlockedIncrement(&shader->ref); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + if (refcount == 1) + { + IDirect3DDevice9Ex_AddRef(shader->parentDevice); + wined3d_mutex_lock(); + IWineD3DPixelShader_AddRef(shader->wineD3DPixelShader); + wined3d_mutex_unlock(); + } + + return refcount; +} + +static ULONG WINAPI d3d9_pixelshader_Release(IDirect3DPixelShader9 *iface) +{ + IDirect3DPixelShader9Impl *shader = (IDirect3DPixelShader9Impl *)iface; + ULONG refcount = InterlockedDecrement(&shader->ref); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + { + IDirect3DDevice9Ex *device = shader->parentDevice; + + wined3d_mutex_lock(); + IWineD3DPixelShader_Release(shader->wineD3DPixelShader); + wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice9Ex_Release(device); + } + + return refcount; +} + +static HRESULT WINAPI d3d9_pixelshader_GetDevice(IDirect3DPixelShader9 *iface, IDirect3DDevice9 **device) +{ + TRACE("iface %p, device %p.\n", iface, device); + + *device = (IDirect3DDevice9 *)((IDirect3DPixelShader9Impl *)iface)->parentDevice; + IDirect3DDevice9_AddRef(*device); + + TRACE("Returning device %p.\n", *device); + + return D3D_OK; +} + +static HRESULT WINAPI d3d9_pixelshader_GetFunction(IDirect3DPixelShader9 *iface, void *data, UINT *data_size) +{ + HRESULT hr; + + TRACE("iface %p, data %p, data_size %p.\n", iface, data, data_size); + + wined3d_mutex_lock(); + hr = IWineD3DPixelShader_GetFunction(((IDirect3DPixelShader9Impl *)iface)->wineD3DPixelShader, data, data_size); + wined3d_mutex_unlock(); + + return hr; +} + +static const IDirect3DPixelShader9Vtbl d3d9_pixelshader_vtbl = +{ + /* IUnknown */ + d3d9_pixelshader_QueryInterface, + d3d9_pixelshader_AddRef, + d3d9_pixelshader_Release, + /* IDirect3DPixelShader9 */ + d3d9_pixelshader_GetDevice, + d3d9_pixelshader_GetFunction, +}; + +static void STDMETHODCALLTYPE d3d9_pixelshader_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d9_pixelshader_wined3d_parent_ops = +{ + d3d9_pixelshader_wined3d_object_destroyed, +}; + +HRESULT pixelshader_init(IDirect3DPixelShader9Impl *shader, IDirect3DDevice9Impl *device, const DWORD *byte_code) +{ + HRESULT hr; + + shader->ref = 1; + shader->lpVtbl = &d3d9_pixelshader_vtbl; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreatePixelShader(device->WineD3DDevice, byte_code, NULL, shader, + &d3d9_pixelshader_wined3d_parent_ops, &shader->wineD3DPixelShader); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to created wined3d pixel shader, hr %#x.\n", hr); + return hr; + } + + shader->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(shader->parentDevice); + + return D3D_OK; +} diff --git a/dll/directx/wine/d3d9/stateblock.c b/dll/directx/wine/d3d9/stateblock.c index c4941db254b..01a882eea54 100644 --- a/dll/directx/wine/d3d9/stateblock.c +++ b/dll/directx/wine/d3d9/stateblock.c @@ -138,8 +138,8 @@ HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Im else { wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateStateBlock(device->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)type, - &stateblock->wineD3DStateBlock, (IUnknown *)stateblock); + hr = IWineD3DDevice_CreateStateBlock(device->WineD3DDevice, + (WINED3DSTATEBLOCKTYPE)type, &stateblock->wineD3DStateBlock); wined3d_mutex_unlock(); if (FAILED(hr)) { diff --git a/dll/directx/wine/d3d9/surface.c b/dll/directx/wine/d3d9/surface.c index 210a0ee1d45..de3fb779e0d 100644 --- a/dll/directx/wine/d3d9/surface.c +++ b/dll/directx/wine/d3d9/surface.c @@ -246,27 +246,23 @@ static HRESULT WINAPI IDirect3DSurface9Impl_GetContainer(LPDIRECT3DSURFACE9 ifac static HRESULT WINAPI IDirect3DSurface9Impl_GetDesc(LPDIRECT3DSURFACE9 iface, D3DSURFACE_DESC* pDesc) { IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl *)iface; WINED3DSURFACE_DESC wined3ddesc; - HRESULT hr; TRACE("iface %p, desc %p.\n", iface, pDesc); wined3d_mutex_lock(); - hr = IWineD3DSurface_GetDesc(This->wineD3DSurface, &wined3ddesc); + IWineD3DSurface_GetDesc(This->wineD3DSurface, &wined3ddesc); wined3d_mutex_unlock(); - if (SUCCEEDED(hr)) - { - pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.format); - pDesc->Type = wined3ddesc.resource_type; - pDesc->Usage = wined3ddesc.usage; - pDesc->Pool = wined3ddesc.pool; - pDesc->MultiSampleType = wined3ddesc.multisample_type; - pDesc->MultiSampleQuality = wined3ddesc.multisample_quality; - pDesc->Width = wined3ddesc.width; - pDesc->Height = wined3ddesc.height; - } + pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.format); + pDesc->Type = wined3ddesc.resource_type; + pDesc->Usage = wined3ddesc.usage; + pDesc->Pool = wined3ddesc.pool; + pDesc->MultiSampleType = wined3ddesc.multisample_type; + pDesc->MultiSampleQuality = wined3ddesc.multisample_quality; + pDesc->Width = wined3ddesc.width; + pDesc->Height = wined3ddesc.height; - return hr; + return D3D_OK; } static HRESULT WINAPI IDirect3DSurface9Impl_LockRect(LPDIRECT3DSURFACE9 iface, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) { @@ -403,9 +399,8 @@ HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *devic wined3d_mutex_lock(); hr = IWineD3DDevice_CreateSurface(device->WineD3DDevice, width, height, wined3dformat_from_d3dformat(format), - lockable, discard, level, &surface->wineD3DSurface, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, - multisample_type, multisample_quality, SURFACE_OPENGL, (IUnknown *)surface, - &d3d9_surface_wined3d_parent_ops); + lockable, discard, level, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, multisample_type, + multisample_quality, SURFACE_OPENGL, surface, &d3d9_surface_wined3d_parent_ops, &surface->wineD3DSurface); wined3d_mutex_unlock(); if (FAILED(hr)) { diff --git a/dll/directx/wine/d3d9/swapchain.c b/dll/directx/wine/d3d9/swapchain.c index c692371a258..0d523914f92 100644 --- a/dll/directx/wine/d3d9/swapchain.c +++ b/dll/directx/wine/d3d9/swapchain.c @@ -106,24 +106,29 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetFrontBufferData(LPDIRECT3DSWAPC return hr; } -static HRESULT WINAPI IDirect3DSwapChain9Impl_GetBackBuffer(LPDIRECT3DSWAPCHAIN9 iface, UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9** ppBackBuffer) { +static HRESULT WINAPI IDirect3DSwapChain9Impl_GetBackBuffer(IDirect3DSwapChain9 *iface, + UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9 **ppBackBuffer) +{ IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface; - HRESULT hrc = D3D_OK; IWineD3DSurface *mySurface = NULL; + HRESULT hr; TRACE("iface %p, backbuffer_idx %u, backbuffer_type %#x, backbuffer %p.\n", iface, iBackBuffer, Type, ppBackBuffer); wined3d_mutex_lock(); - hrc = IWineD3DSwapChain_GetBackBuffer(This->wineD3DSwapChain, iBackBuffer, (WINED3DBACKBUFFER_TYPE) Type, &mySurface); - if (hrc == D3D_OK && NULL != mySurface) { - IWineD3DSurface_GetParent(mySurface, (IUnknown **)ppBackBuffer); + hr = IWineD3DSwapChain_GetBackBuffer(This->wineD3DSwapChain, iBackBuffer, + (WINED3DBACKBUFFER_TYPE)Type, &mySurface); + if (SUCCEEDED(hr) && mySurface) + { + *ppBackBuffer = IWineD3DSurface_GetParent(mySurface); + IDirect3DSurface9_AddRef(*ppBackBuffer); IWineD3DSurface_Release(mySurface); } wined3d_mutex_unlock(); /* Do not touch the **ppBackBuffer pointer otherwise! (see device test) */ - return hrc; + return hr; } static HRESULT WINAPI IDirect3DSwapChain9Impl_GetRasterStatus(LPDIRECT3DSWAPCHAIN9 iface, D3DRASTER_STATUS* pRasterStatus) { @@ -239,7 +244,7 @@ HRESULT swapchain_init(IDirect3DSwapChain9Impl *swapchain, IDirect3DDevice9Impl wined3d_mutex_lock(); hr = IWineD3DDevice_CreateSwapChain(device->WineD3DDevice, &wined3d_parameters, - &swapchain->wineD3DSwapChain, (IUnknown *)swapchain, SURFACE_OPENGL); + SURFACE_OPENGL, swapchain, &swapchain->wineD3DSwapChain); wined3d_mutex_unlock(); present_parameters->BackBufferWidth = wined3d_parameters.BackBufferWidth; @@ -268,37 +273,3 @@ HRESULT swapchain_init(IDirect3DSwapChain9Impl *swapchain, IDirect3DDevice9Impl return D3D_OK; } - -HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, IDirect3DSwapChain9** pSwapChain) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hrc = D3D_OK; - IWineD3DSwapChain *swapchain = NULL; - - TRACE("iface %p, swapchain_idx %u, swapchain %p.\n", - iface, iSwapChain, pSwapChain); - - wined3d_mutex_lock(); - hrc = IWineD3DDevice_GetSwapChain(This->WineD3DDevice, iSwapChain, &swapchain); - if (hrc == D3D_OK && NULL != swapchain) { - IWineD3DSwapChain_GetParent(swapchain, (IUnknown **)pSwapChain); - IWineD3DSwapChain_Release(swapchain); - } else { - *pSwapChain = NULL; - } - wined3d_mutex_unlock(); - - return hrc; -} - -UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(LPDIRECT3DDEVICE9EX iface) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - UINT ret; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - ret = IWineD3DDevice_GetNumberOfSwapChains(This->WineD3DDevice); - wined3d_mutex_unlock(); - - return ret; -} diff --git a/dll/directx/wine/d3d9/texture.c b/dll/directx/wine/d3d9/texture.c index 564057f33f1..dbe9798ab64 100644 --- a/dll/directx/wine/d3d9/texture.c +++ b/dll/directx/wine/d3d9/texture.c @@ -289,22 +289,26 @@ static HRESULT WINAPI IDirect3DTexture9Impl_GetLevelDesc(LPDIRECT3DTEXTURE9 ifac return hr; } -static HRESULT WINAPI IDirect3DTexture9Impl_GetSurfaceLevel(LPDIRECT3DTEXTURE9 iface, UINT Level, IDirect3DSurface9** ppSurfaceLevel) { +static HRESULT WINAPI IDirect3DTexture9Impl_GetSurfaceLevel(IDirect3DTexture9 *iface, + UINT Level, IDirect3DSurface9 **ppSurfaceLevel) +{ IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl *)iface; - HRESULT hrc = D3D_OK; IWineD3DSurface *mySurface = NULL; + HRESULT hr; TRACE("iface %p, level %u, surface %p.\n", iface, Level, ppSurfaceLevel); wined3d_mutex_lock(); - hrc = IWineD3DTexture_GetSurfaceLevel(This->wineD3DTexture, Level, &mySurface); - if (hrc == D3D_OK && NULL != ppSurfaceLevel) { - IWineD3DSurface_GetParent(mySurface, (IUnknown **)ppSurfaceLevel); - IWineD3DSurface_Release(mySurface); + hr = IWineD3DTexture_GetSurfaceLevel(This->wineD3DTexture, Level, &mySurface); + if (SUCCEEDED(hr) && ppSurfaceLevel) + { + *ppSurfaceLevel = IWineD3DSurface_GetParent(mySurface); + IDirect3DSurface9_AddRef(*ppSurfaceLevel); + IWineD3DSurface_Release(mySurface); } wined3d_mutex_unlock(); - return hrc; + return hr; } static HRESULT WINAPI IDirect3DTexture9Impl_LockRect(LPDIRECT3DTEXTURE9 iface, UINT Level, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) { @@ -398,7 +402,7 @@ HRESULT texture_init(IDirect3DTexture9Impl *texture, IDirect3DDevice9Impl *devic wined3d_mutex_lock(); hr = IWineD3DDevice_CreateTexture(device->WineD3DDevice, width, height, levels, usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, - &texture->wineD3DTexture, (IUnknown *)texture, &d3d9_texture_wined3d_parent_ops); + texture, &d3d9_texture_wined3d_parent_ops, &texture->wineD3DTexture); wined3d_mutex_unlock(); if (FAILED(hr)) { diff --git a/dll/directx/wine/d3d9/vertexbuffer.c b/dll/directx/wine/d3d9/vertexbuffer.c deleted file mode 100644 index 1841bec19c0..00000000000 --- a/dll/directx/wine/d3d9/vertexbuffer.c +++ /dev/null @@ -1,289 +0,0 @@ -/* - * IDirect3DVertexBuffer9 implementation - * - * Copyright 2002-2004 Jason Edmeades - * Copyright 2002-2004 Raphael Junqueira - * Copyright 2005 Oliver Stieber - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "d3d9_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d9); - -/* IDirect3DVertexBuffer9 IUnknown parts follow: */ -static HRESULT WINAPI IDirect3DVertexBuffer9Impl_QueryInterface(LPDIRECT3DVERTEXBUFFER9 iface, REFIID riid, LPVOID* ppobj) { - IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; - - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); - - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IDirect3DResource9) - || IsEqualGUID(riid, &IID_IDirect3DVertexBuffer9)) { - IDirect3DVertexBuffer9_AddRef(iface); - *ppobj = This; - return S_OK; - } - - WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); - *ppobj = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI IDirect3DVertexBuffer9Impl_AddRef(LPDIRECT3DVERTEXBUFFER9 iface) { - IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("%p increasing refcount to %u.\n", iface, ref); - - if (ref == 1) - { - IDirect3DDevice9Ex_AddRef(This->parentDevice); - wined3d_mutex_lock(); - IWineD3DBuffer_AddRef(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); - } - - return ref; -} - -static ULONG WINAPI IDirect3DVertexBuffer9Impl_Release(LPDIRECT3DVERTEXBUFFER9 iface) { - IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("%p decreasing refcount to %u.\n", iface, ref); - - if (ref == 0) { - IDirect3DDevice9Ex *parentDevice = This->parentDevice; - - wined3d_mutex_lock(); - IWineD3DBuffer_Release(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); - - /* Release the device last, as it may cause the device to be destroyed. */ - IDirect3DDevice9Ex_Release(parentDevice); - } - return ref; -} - -/* IDirect3DVertexBuffer9 IDirect3DResource9 Interface follow: */ -static HRESULT WINAPI IDirect3DVertexBuffer9Impl_GetDevice(IDirect3DVertexBuffer9 *iface, IDirect3DDevice9 **device) -{ - IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; - - TRACE("iface %p, device %p.\n", iface, device); - - *device = (IDirect3DDevice9 *)This->parentDevice; - IDirect3DDevice9_AddRef(*device); - - TRACE("Returning device %p.\n", *device); - - return D3D_OK; -} - -static HRESULT WINAPI IDirect3DVertexBuffer9Impl_SetPrivateData(LPDIRECT3DVERTEXBUFFER9 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) { - IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", - iface, debugstr_guid(refguid), pData, SizeOfData, Flags); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_SetPrivateData(This->wineD3DVertexBuffer, refguid, pData, SizeOfData, Flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DVertexBuffer9Impl_GetPrivateData(LPDIRECT3DVERTEXBUFFER9 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData) { - IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s, data %p, data_size %p.\n", - iface, debugstr_guid(refguid), pData, pSizeOfData); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_GetPrivateData(This->wineD3DVertexBuffer, refguid, pData, pSizeOfData); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DVertexBuffer9Impl_FreePrivateData(LPDIRECT3DVERTEXBUFFER9 iface, REFGUID refguid) { - IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, guid %s.\n", iface, debugstr_guid(refguid)); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_FreePrivateData(This->wineD3DVertexBuffer, refguid); - wined3d_mutex_unlock(); - - return hr; -} - -static DWORD WINAPI IDirect3DVertexBuffer9Impl_SetPriority(LPDIRECT3DVERTEXBUFFER9 iface, DWORD PriorityNew) { - IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, priority %u.\n", iface, PriorityNew); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_SetPriority(This->wineD3DVertexBuffer, PriorityNew); - wined3d_mutex_unlock(); - - return hr; -} - -static DWORD WINAPI IDirect3DVertexBuffer9Impl_GetPriority(LPDIRECT3DVERTEXBUFFER9 iface) { - IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; - HRESULT hr; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_GetPriority(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); - - return hr; -} - -static void WINAPI IDirect3DVertexBuffer9Impl_PreLoad(LPDIRECT3DVERTEXBUFFER9 iface) { - IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - IWineD3DBuffer_PreLoad(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); -} - -static D3DRESOURCETYPE WINAPI IDirect3DVertexBuffer9Impl_GetType(IDirect3DVertexBuffer9 *iface) -{ - TRACE("iface %p.\n", iface); - - return D3DRTYPE_VERTEXBUFFER; -} - -/* IDirect3DVertexBuffer9 Interface follow: */ -static HRESULT WINAPI IDirect3DVertexBuffer9Impl_Lock(LPDIRECT3DVERTEXBUFFER9 iface, UINT OffsetToLock, UINT SizeToLock, void** ppbData, DWORD Flags) { - IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", - iface, OffsetToLock, SizeToLock, ppbData, Flags); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_Map(This->wineD3DVertexBuffer, OffsetToLock, SizeToLock, (BYTE **)ppbData, Flags); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DVertexBuffer9Impl_Unlock(LPDIRECT3DVERTEXBUFFER9 iface) { - IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; - HRESULT hr; - - TRACE("iface %p.\n", iface); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_Unmap(This->wineD3DVertexBuffer); - wined3d_mutex_unlock(); - - return hr; -} - -static HRESULT WINAPI IDirect3DVertexBuffer9Impl_GetDesc(LPDIRECT3DVERTEXBUFFER9 iface, D3DVERTEXBUFFER_DESC* pDesc) { - IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl *)iface; - HRESULT hr; - WINED3DBUFFER_DESC desc; - - TRACE("iface %p, desc %p.\n", iface, pDesc); - - wined3d_mutex_lock(); - hr = IWineD3DBuffer_GetDesc(This->wineD3DVertexBuffer, &desc); - wined3d_mutex_unlock(); - - if (SUCCEEDED(hr)) { - pDesc->Format = D3DFMT_VERTEXDATA; - pDesc->Usage = desc.Usage; - pDesc->Pool = desc.Pool; - pDesc->Size = desc.Size; - pDesc->Type = D3DRTYPE_VERTEXBUFFER; - pDesc->FVF = This->fvf; - } - - - return hr; -} - -static const IDirect3DVertexBuffer9Vtbl Direct3DVertexBuffer9_Vtbl = -{ - /* IUnknown */ - IDirect3DVertexBuffer9Impl_QueryInterface, - IDirect3DVertexBuffer9Impl_AddRef, - IDirect3DVertexBuffer9Impl_Release, - /* IDirect3DResource9 */ - IDirect3DVertexBuffer9Impl_GetDevice, - IDirect3DVertexBuffer9Impl_SetPrivateData, - IDirect3DVertexBuffer9Impl_GetPrivateData, - IDirect3DVertexBuffer9Impl_FreePrivateData, - IDirect3DVertexBuffer9Impl_SetPriority, - IDirect3DVertexBuffer9Impl_GetPriority, - IDirect3DVertexBuffer9Impl_PreLoad, - IDirect3DVertexBuffer9Impl_GetType, - /* IDirect3DVertexBuffer9 */ - IDirect3DVertexBuffer9Impl_Lock, - IDirect3DVertexBuffer9Impl_Unlock, - IDirect3DVertexBuffer9Impl_GetDesc -}; - -static void STDMETHODCALLTYPE d3d9_vertexbuffer_wined3d_object_destroyed(void *parent) -{ - HeapFree(GetProcessHeap(), 0, parent); -} - -static const struct wined3d_parent_ops d3d9_vertexbuffer_wined3d_parent_ops = -{ - d3d9_vertexbuffer_wined3d_object_destroyed, -}; - -HRESULT vertexbuffer_init(IDirect3DVertexBuffer9Impl *buffer, IDirect3DDevice9Impl *device, - UINT size, UINT usage, DWORD fvf, D3DPOOL pool) -{ - HRESULT hr; - - buffer->lpVtbl = &Direct3DVertexBuffer9_Vtbl; - buffer->ref = 1; - buffer->fvf = fvf; - - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateVertexBuffer(device->WineD3DDevice, size, - usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, &buffer->wineD3DVertexBuffer, - (IUnknown *)buffer, &d3d9_vertexbuffer_wined3d_parent_ops); - wined3d_mutex_unlock(); - if (FAILED(hr)) - { - WARN("Failed to create wined3d buffer, hr %#x.\n", hr); - return hr; - } - - buffer->parentDevice = (IDirect3DDevice9Ex *)device; - IDirect3DDevice9Ex_AddRef(buffer->parentDevice); - - return D3D_OK; -} diff --git a/dll/directx/wine/d3d9/vertexdeclaration.c b/dll/directx/wine/d3d9/vertexdeclaration.c index d3ee1dcfb19..88f912f1dba 100644 --- a/dll/directx/wine/d3d9/vertexdeclaration.c +++ b/dll/directx/wine/d3d9/vertexdeclaration.c @@ -26,7 +26,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d9); typedef struct _D3DDECLTYPE_INFO { D3DDECLTYPE d3dType; - WINED3DFORMAT format; + enum wined3d_format_id format; int size; int typesize; } D3DDECLTYPE_INFO; @@ -395,9 +395,8 @@ HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration9Impl *declaration, declaration->element_count = element_count; wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateVertexDeclaration(device->WineD3DDevice, &declaration->wineD3DVertexDeclaration, - (IUnknown *)declaration, &d3d9_vertexdeclaration_wined3d_parent_ops, - wined3d_elements, wined3d_element_count); + hr = IWineD3DDevice_CreateVertexDeclaration(device->WineD3DDevice, wined3d_elements, wined3d_element_count, + declaration, &d3d9_vertexdeclaration_wined3d_parent_ops, &declaration->wineD3DVertexDeclaration); wined3d_mutex_unlock(); HeapFree(GetProcessHeap(), 0, wined3d_elements); if (FAILED(hr)) @@ -412,44 +411,3 @@ HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration9Impl *declaration, return D3D_OK; } - -HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(LPDIRECT3DDEVICE9EX iface, IDirect3DVertexDeclaration9* pDecl) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - IDirect3DVertexDeclaration9Impl *pDeclImpl = (IDirect3DVertexDeclaration9Impl *)pDecl; - HRESULT hr = D3D_OK; - - TRACE("iface %p, vertex declaration %p.\n", iface, pDecl); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_SetVertexDeclaration(This->WineD3DDevice, pDeclImpl == NULL ? NULL : pDeclImpl->wineD3DVertexDeclaration); - wined3d_mutex_unlock(); - - return hr; -} - -HRESULT WINAPI IDirect3DDevice9Impl_GetVertexDeclaration(LPDIRECT3DDEVICE9EX iface, IDirect3DVertexDeclaration9** ppDecl) { - IDirect3DDevice9Impl* This = (IDirect3DDevice9Impl*) iface; - IWineD3DVertexDeclaration* pTest = NULL; - HRESULT hr = D3D_OK; - - TRACE("iface %p, declaration %p.\n", iface, ppDecl); - - if (NULL == ppDecl) { - return D3DERR_INVALIDCALL; - } - - *ppDecl = NULL; - - wined3d_mutex_lock(); - hr = IWineD3DDevice_GetVertexDeclaration(This->WineD3DDevice, &pTest); - if (hr == D3D_OK && NULL != pTest) { - IWineD3DVertexDeclaration_GetParent(pTest, (IUnknown **)ppDecl); - IWineD3DVertexDeclaration_Release(pTest); - } else { - *ppDecl = NULL; - } - wined3d_mutex_unlock(); - - TRACE("(%p) : returning %p\n", This, *ppDecl); - return hr; -} diff --git a/dll/directx/wine/d3d9/vertexshader.c b/dll/directx/wine/d3d9/vertexshader.c deleted file mode 100644 index 21a4e875571..00000000000 --- a/dll/directx/wine/d3d9/vertexshader.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - * IDirect3DVertexShader9 implementation - * - * Copyright 2002-2003 Jason Edmeades - * Raphael Junqueira - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "d3d9_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d9); - -/* IDirect3DVertexShader9 IUnknown parts follow: */ -static HRESULT WINAPI IDirect3DVertexShader9Impl_QueryInterface(LPDIRECT3DVERTEXSHADER9 iface, REFIID riid, LPVOID* ppobj) { - IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; - - TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj); - - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IDirect3DVertexShader9)) { - IDirect3DVertexShader9_AddRef(iface); - *ppobj = This; - return S_OK; - } - - WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj); - *ppobj = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI IDirect3DVertexShader9Impl_AddRef(LPDIRECT3DVERTEXSHADER9 iface) { - IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("%p increasing refcount to %u.\n", iface, ref); - - if (ref == 1) - { - IDirect3DDevice9Ex_AddRef(This->parentDevice); - wined3d_mutex_lock(); - IWineD3DVertexShader_AddRef(This->wineD3DVertexShader); - wined3d_mutex_unlock(); - } - - return ref; -} - -static ULONG WINAPI IDirect3DVertexShader9Impl_Release(LPDIRECT3DVERTEXSHADER9 iface) { - IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("%p decreasing refcount to %u.\n", iface, ref); - - if (ref == 0) { - IDirect3DDevice9Ex *parentDevice = This->parentDevice; - - wined3d_mutex_lock(); - IWineD3DVertexShader_Release(This->wineD3DVertexShader); - wined3d_mutex_unlock(); - - /* Release the device last, as it may cause the device to be destroyed. */ - IDirect3DDevice9Ex_Release(parentDevice); - } - return ref; -} - -/* IDirect3DVertexShader9 Interface follow: */ -static HRESULT WINAPI IDirect3DVertexShader9Impl_GetDevice(IDirect3DVertexShader9 *iface, IDirect3DDevice9 **device) -{ - IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; - - TRACE("iface %p, device %p.\n", iface, device); - - *device = (IDirect3DDevice9 *)This->parentDevice; - IDirect3DDevice9_AddRef(*device); - - TRACE("Returning device %p.\n", *device); - - return D3D_OK; -} - -static HRESULT WINAPI IDirect3DVertexShader9Impl_GetFunction(LPDIRECT3DVERTEXSHADER9 iface, VOID* pData, UINT* pSizeOfData) { - IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, data %p, data_size %p.\n", iface, pData, pSizeOfData); - - wined3d_mutex_lock(); - hr = IWineD3DVertexShader_GetFunction(This->wineD3DVertexShader, pData, pSizeOfData); - wined3d_mutex_unlock(); - - return hr; -} - - -static const IDirect3DVertexShader9Vtbl Direct3DVertexShader9_Vtbl = -{ - /* IUnknown */ - IDirect3DVertexShader9Impl_QueryInterface, - IDirect3DVertexShader9Impl_AddRef, - IDirect3DVertexShader9Impl_Release, - /* IDirect3DVertexShader9 */ - IDirect3DVertexShader9Impl_GetDevice, - IDirect3DVertexShader9Impl_GetFunction -}; - -static void STDMETHODCALLTYPE d3d9_vertexshader_wined3d_object_destroyed(void *parent) -{ - HeapFree(GetProcessHeap(), 0, parent); -} - -static const struct wined3d_parent_ops d3d9_vertexshader_wined3d_parent_ops = -{ - d3d9_vertexshader_wined3d_object_destroyed, -}; - -HRESULT vertexshader_init(IDirect3DVertexShader9Impl *shader, IDirect3DDevice9Impl *device, const DWORD *byte_code) -{ - HRESULT hr; - - shader->ref = 1; - shader->lpVtbl = &Direct3DVertexShader9_Vtbl; - - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateVertexShader(device->WineD3DDevice, byte_code, - NULL /* output signature */, &shader->wineD3DVertexShader, - (IUnknown *)shader, &d3d9_vertexshader_wined3d_parent_ops); - wined3d_mutex_unlock(); - if (FAILED(hr)) - { - WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr); - return hr; - } - - shader->parentDevice = (IDirect3DDevice9Ex *)device; - IDirect3DDevice9Ex_AddRef(shader->parentDevice); - - return D3D_OK; -} - -HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShader(LPDIRECT3DDEVICE9EX iface, IDirect3DVertexShader9* pShader) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hrc = D3D_OK; - - TRACE("iface %p, shader %p.\n", iface, pShader); - - wined3d_mutex_lock(); - hrc = IWineD3DDevice_SetVertexShader(This->WineD3DDevice, pShader==NULL?NULL:((IDirect3DVertexShader9Impl *)pShader)->wineD3DVertexShader); - wined3d_mutex_unlock(); - - TRACE("(%p) : returning hr(%u)\n", This, hrc); - return hrc; -} - -HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShader(LPDIRECT3DDEVICE9EX iface, IDirect3DVertexShader9** ppShader) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - IWineD3DVertexShader *pShader; - HRESULT hrc = D3D_OK; - - TRACE("iface %p, shader %p.\n", iface, ppShader); - - wined3d_mutex_lock(); - hrc = IWineD3DDevice_GetVertexShader(This->WineD3DDevice, &pShader); - if (SUCCEEDED(hrc)) - { - if (pShader) - { - hrc = IWineD3DVertexShader_GetParent(pShader, (IUnknown **)ppShader); - IWineD3DVertexShader_Release(pShader); - } - else - { - *ppShader = NULL; - } - } - else - { - WARN("(%p) : Call to IWineD3DDevice_GetVertexShader failed %u (device %p)\n", This, hrc, This->WineD3DDevice); - } - wined3d_mutex_unlock(); - - TRACE("(%p) : returning %p\n", This, *ppShader); - return hrc; -} - -HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantF(LPDIRECT3DDEVICE9EX iface, UINT Register, CONST float* pConstantData, UINT Vector4fCount) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, register %u, data %p, count %u.\n", - iface, Register, pConstantData, Vector4fCount); - - if(Register + Vector4fCount > D3D9_MAX_VERTEX_SHADER_CONSTANTF) { - WARN("Trying to access %u constants, but d3d9 only supports %u\n", - Register + Vector4fCount, D3D9_MAX_VERTEX_SHADER_CONSTANTF); - return D3DERR_INVALIDCALL; - } - - wined3d_mutex_lock(); - hr = IWineD3DDevice_SetVertexShaderConstantF(This->WineD3DDevice, Register, pConstantData, Vector4fCount); - wined3d_mutex_unlock(); - - return hr; -} - -HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantF(LPDIRECT3DDEVICE9EX iface, UINT Register, float* pConstantData, UINT Vector4fCount) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, register %u, data %p, count %u.\n", - iface, Register, pConstantData, Vector4fCount); - - if(Register + Vector4fCount > D3D9_MAX_VERTEX_SHADER_CONSTANTF) { - WARN("Trying to access %u constants, but d3d9 only supports %u\n", - Register + Vector4fCount, D3D9_MAX_VERTEX_SHADER_CONSTANTF); - return D3DERR_INVALIDCALL; - } - - wined3d_mutex_lock(); - hr = IWineD3DDevice_GetVertexShaderConstantF(This->WineD3DDevice, Register, pConstantData, Vector4fCount); - wined3d_mutex_unlock(); - - return hr; -} - -HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantI(LPDIRECT3DDEVICE9EX iface, UINT Register, CONST int* pConstantData, UINT Vector4iCount) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, register %u, data %p, count %u.\n", - iface, Register, pConstantData, Vector4iCount); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_SetVertexShaderConstantI(This->WineD3DDevice, Register, pConstantData, Vector4iCount); - wined3d_mutex_unlock(); - - return hr; -} - -HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantI(LPDIRECT3DDEVICE9EX iface, UINT Register, int* pConstantData, UINT Vector4iCount) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, register %u, data %p, count %u.\n", - iface, Register, pConstantData, Vector4iCount); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_GetVertexShaderConstantI(This->WineD3DDevice, Register, pConstantData, Vector4iCount); - wined3d_mutex_unlock(); - - return hr; -} - -HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantB(LPDIRECT3DDEVICE9EX iface, UINT Register, CONST BOOL* pConstantData, UINT BoolCount) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, register %u, data %p, count %u.\n", - iface, Register, pConstantData, BoolCount); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_SetVertexShaderConstantB(This->WineD3DDevice, Register, pConstantData, BoolCount); - wined3d_mutex_unlock(); - - return hr; -} - -HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantB(LPDIRECT3DDEVICE9EX iface, UINT Register, BOOL* pConstantData, UINT BoolCount) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr; - - TRACE("iface %p, register %u, data %p, count %u.\n", - iface, Register, pConstantData, BoolCount); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_GetVertexShaderConstantB(This->WineD3DDevice, Register, pConstantData, BoolCount); - wined3d_mutex_unlock(); - - return hr; -} diff --git a/dll/directx/wine/d3d9/volume.c b/dll/directx/wine/d3d9/volume.c index baa286b4f2a..1ecd2b27d29 100644 --- a/dll/directx/wine/d3d9/volume.c +++ b/dll/directx/wine/d3d9/volume.c @@ -182,29 +182,25 @@ static HRESULT WINAPI IDirect3DVolume9Impl_GetContainer(LPDIRECT3DVOLUME9 iface, static HRESULT WINAPI IDirect3DVolume9Impl_GetDesc(LPDIRECT3DVOLUME9 iface, D3DVOLUME_DESC* pDesc) { IDirect3DVolume9Impl *This = (IDirect3DVolume9Impl *)iface; - WINED3DVOLUME_DESC wined3ddesc; - HRESULT hr; + WINED3DVOLUME_DESC wined3ddesc; TRACE("iface %p, desc %p.\n", iface, pDesc); wined3d_mutex_lock(); - hr = IWineD3DVolume_GetDesc(This->wineD3DVolume, &wined3ddesc); + IWineD3DVolume_GetDesc(This->wineD3DVolume, &wined3ddesc); wined3d_mutex_unlock(); - if (SUCCEEDED(hr)) - { - pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format); - pDesc->Type = wined3ddesc.Type; - pDesc->Usage = wined3ddesc.Usage; - pDesc->Pool = wined3ddesc.Pool; - pDesc->Width = wined3ddesc.Width; - pDesc->Height = wined3ddesc.Height; - pDesc->Depth = wined3ddesc.Depth; - } + pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format); + pDesc->Type = wined3ddesc.Type; + pDesc->Usage = wined3ddesc.Usage; + pDesc->Pool = wined3ddesc.Pool; + pDesc->Width = wined3ddesc.Width; + pDesc->Height = wined3ddesc.Height; + pDesc->Depth = wined3ddesc.Depth; - return hr; + return D3D_OK; } static HRESULT WINAPI IDirect3DVolume9Impl_LockBox(LPDIRECT3DVOLUME9 iface, D3DLOCKED_BOX* pLockedVolume, CONST D3DBOX* pBox, DWORD Flags) { @@ -267,7 +263,7 @@ static const struct wined3d_parent_ops d3d9_volume_wined3d_parent_ops = }; HRESULT volume_init(IDirect3DVolume9Impl *volume, IDirect3DDevice9Impl *device, UINT width, UINT height, - UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool) + UINT depth, DWORD usage, enum wined3d_format_id format, WINED3DPOOL pool) { HRESULT hr; @@ -275,7 +271,7 @@ HRESULT volume_init(IDirect3DVolume9Impl *volume, IDirect3DDevice9Impl *device, volume->ref = 1; hr = IWineD3DDevice_CreateVolume(device->WineD3DDevice, width, height, depth, usage & WINED3DUSAGE_MASK, - format, pool, &volume->wineD3DVolume, (IUnknown *)volume, &d3d9_volume_wined3d_parent_ops); + format, pool, volume, &d3d9_volume_wined3d_parent_ops, &volume->wineD3DVolume); if (FAILED(hr)) { WARN("Failed to create wined3d volume, hr %#x.\n", hr); diff --git a/dll/directx/wine/d3d9/volumetexture.c b/dll/directx/wine/d3d9/volumetexture.c index ca9ca9c6ac8..7ce46237cc3 100644 --- a/dll/directx/wine/d3d9/volumetexture.c +++ b/dll/directx/wine/d3d9/volumetexture.c @@ -315,24 +315,28 @@ static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetLevelDesc(LPDIRECT3DVOLUMET return hr; } -static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetVolumeLevel(LPDIRECT3DVOLUMETEXTURE9 iface, UINT Level, IDirect3DVolume9** ppVolumeLevel) { +static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetVolumeLevel(IDirect3DVolumeTexture9 *iface, + UINT Level, IDirect3DVolume9 **ppVolumeLevel) +{ IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface; - HRESULT hrc = D3D_OK; IWineD3DVolume *myVolume = NULL; + HRESULT hr; TRACE("iface %p, level %u, volume %p.\n", iface, Level, ppVolumeLevel); wined3d_mutex_lock(); - hrc = IWineD3DVolumeTexture_GetVolumeLevel(This->wineD3DVolumeTexture, Level, &myVolume); - if (hrc == D3D_OK && NULL != ppVolumeLevel) { - IWineD3DVolumeTexture_GetParent(myVolume, (IUnknown **)ppVolumeLevel); + hr = IWineD3DVolumeTexture_GetVolumeLevel(This->wineD3DVolumeTexture, Level, &myVolume); + if (SUCCEEDED(hr) && ppVolumeLevel) + { + *ppVolumeLevel = IWineD3DVolumeTexture_GetParent(myVolume); + IDirect3DVolumeTexture9_AddRef(*ppVolumeLevel); IWineD3DVolumeTexture_Release(myVolume); } wined3d_mutex_unlock(); - return hrc; + return hr; } static HRESULT WINAPI IDirect3DVolumeTexture9Impl_LockBox(LPDIRECT3DVOLUMETEXTURE9 iface, UINT Level, D3DLOCKED_BOX* pLockedVolume, CONST D3DBOX* pBox, DWORD Flags) { @@ -433,8 +437,8 @@ HRESULT volumetexture_init(IDirect3DVolumeTexture9Impl *texture, IDirect3DDevice wined3d_mutex_lock(); hr = IWineD3DDevice_CreateVolumeTexture(device->WineD3DDevice, width, height, depth, levels, - usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, - &texture->wineD3DVolumeTexture, (IUnknown *)texture, &d3d9_volumetexture_wined3d_parent_ops); + usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, texture, + &d3d9_volumetexture_wined3d_parent_ops, &texture->wineD3DVolumeTexture); wined3d_mutex_unlock(); if (FAILED(hr)) { diff --git a/dll/directx/wine/ddraw/clipper.c b/dll/directx/wine/ddraw/clipper.c index 4fa4c363eaa..b4c493c4bad 100644 --- a/dll/directx/wine/ddraw/clipper.c +++ b/dll/directx/wine/ddraw/clipper.c @@ -20,23 +20,10 @@ */ #include "config.h" - -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "ddraw.h" -#include "winerror.h" +#include "wine/port.h" #include "ddraw_private.h" -#include "wine/debug.h" - WINE_DEFAULT_DEBUG_CHANNEL(ddraw); /***************************************************************************** @@ -62,17 +49,18 @@ WINE_DEFAULT_DEBUG_CHANNEL(ddraw); static HRESULT WINAPI IDirectDrawClipperImpl_QueryInterface( LPDIRECTDRAWCLIPPER iface, REFIID riid, LPVOID* ppvObj ) { - if (IsEqualGUID(&IID_IUnknown, riid) - || IsEqualGUID(&IID_IDirectDrawClipper, riid)) + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppvObj); + + if (IsEqualGUID(&IID_IDirectDrawClipper, riid) + || IsEqualGUID(&IID_IUnknown, riid)) { IUnknown_AddRef(iface); *ppvObj = iface; return S_OK; } - else - { - return E_NOINTERFACE; - } + + return E_NOINTERFACE; } /***************************************************************************** @@ -86,7 +74,7 @@ static ULONG WINAPI IDirectDrawClipperImpl_AddRef( LPDIRECTDRAWCLIPPER iface ) IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->() incrementing from %u.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -102,7 +90,7 @@ static ULONG WINAPI IDirectDrawClipperImpl_Release(IDirectDrawClipper *iface) { IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (ref == 0) { @@ -135,7 +123,8 @@ static HRESULT WINAPI IDirectDrawClipperImpl_SetHwnd( ) { IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%p)\n", This, dwFlags, hWnd); + + TRACE("iface %p, flags %#x, window %p.\n", iface, dwFlags, hWnd); EnterCriticalSection(&ddraw_cs); hr = IWineD3DClipper_SetHWnd(This->wineD3DClipper, @@ -173,7 +162,9 @@ static HRESULT WINAPI IDirectDrawClipperImpl_GetClipList( { IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; HRESULT hr; - TRACE("(%p,%p,%p,%p)\n", This, lpRect, lpClipList, lpdwSize); + + TRACE("iface %p, rect %s, clip_list %p, clip_list_size %p.\n", + iface, wine_dbgstr_rect(lpRect), lpClipList, lpdwSize); EnterCriticalSection(&ddraw_cs); hr = IWineD3DClipper_GetClipList(This->wineD3DClipper, @@ -204,6 +195,8 @@ static HRESULT WINAPI IDirectDrawClipperImpl_SetClipList( IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; HRESULT hr; + TRACE("iface %p, clip_list %p, flags %#x.\n", iface, lprgn, dwFlag); + EnterCriticalSection(&ddraw_cs); hr = IWineD3DClipper_SetClipList(This->wineD3DClipper, lprgn, @@ -228,7 +221,8 @@ static HRESULT WINAPI IDirectDrawClipperImpl_GetHWnd( ) { IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p)\n", This, hWndPtr); + + TRACE("iface %p, window %p.\n", iface, hWndPtr); EnterCriticalSection(&ddraw_cs); hr = IWineD3DClipper_GetHWnd(This->wineD3DClipper, @@ -254,19 +248,18 @@ static HRESULT WINAPI IDirectDrawClipperImpl_GetHWnd( static HRESULT WINAPI IDirectDrawClipperImpl_Initialize( LPDIRECTDRAWCLIPPER iface, LPDIRECTDRAW lpDD, DWORD dwFlags ) { - IDirectDrawImpl* pOwner; IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; - TRACE("(%p)->(%p,0x%08x)\n", This, lpDD, dwFlags); + + TRACE("iface %p, ddraw %p, flags %#x.\n", iface, lpDD, dwFlags); EnterCriticalSection(&ddraw_cs); - if (This->ddraw_owner != NULL) + if (This->initialized) { LeaveCriticalSection(&ddraw_cs); return DDERR_ALREADYINITIALIZED; } - pOwner = lpDD ? ddraw_from_ddraw1(lpDD) : NULL; - This->ddraw_owner = pOwner; + This->initialized = TRUE; LeaveCriticalSection(&ddraw_cs); return DD_OK; @@ -286,8 +279,7 @@ static HRESULT WINAPI IDirectDrawClipperImpl_Initialize( static HRESULT WINAPI IDirectDrawClipperImpl_IsClipListChanged( LPDIRECTDRAWCLIPPER iface, BOOL* lpbChanged ) { - IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; - FIXME("(%p)->(%p),stub!\n",This,lpbChanged); + FIXME("iface %p, changed %p stub!\n", iface, lpbChanged); /* XXX What is safest? */ *lpbChanged = FALSE; @@ -298,7 +290,7 @@ static HRESULT WINAPI IDirectDrawClipperImpl_IsClipListChanged( /***************************************************************************** * The VTable *****************************************************************************/ -const IDirectDrawClipperVtbl IDirectDrawClipper_Vtbl = +static const struct IDirectDrawClipperVtbl ddraw_clipper_vtbl = { IDirectDrawClipperImpl_QueryInterface, IDirectDrawClipperImpl_AddRef, @@ -310,3 +302,17 @@ const IDirectDrawClipperVtbl IDirectDrawClipper_Vtbl = IDirectDrawClipperImpl_SetClipList, IDirectDrawClipperImpl_SetHwnd }; + +HRESULT ddraw_clipper_init(IDirectDrawClipperImpl *clipper) +{ + clipper->lpVtbl = &ddraw_clipper_vtbl; + clipper->ref = 1; + clipper->wineD3DClipper = pWineDirect3DCreateClipper(); + if (!clipper->wineD3DClipper) + { + WARN("Failed to create wined3d clipper.\n"); + return E_OUTOFMEMORY; + } + + return DD_OK; +} diff --git a/dll/directx/wine/ddraw/ddraw.c b/dll/directx/wine/ddraw/ddraw.c index a7522f91789..bef9cf0f8a6 100644 --- a/dll/directx/wine/ddraw/ddraw.c +++ b/dll/directx/wine/ddraw/ddraw.c @@ -23,33 +23,10 @@ #include "config.h" #include "wine/port.h" -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - #include "ddraw_private.h" -#include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw); -static BOOL IDirectDrawImpl_DDSD_Match(const DDSURFACEDESC2* requested, const DDSURFACEDESC2* provided); -static HRESULT IDirectDrawImpl_AttachD3DDevice(IDirectDrawImpl *This, IDirectDrawSurfaceImpl *primary); -static HRESULT IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This, DDSURFACEDESC2 *pDDSD, IDirectDrawSurfaceImpl **ppSurf, UINT level); -static HRESULT IDirectDrawImpl_CreateGDISwapChain(IDirectDrawImpl *This, IDirectDrawSurfaceImpl *primary); - /* Device identifier. Don't relay it to WineD3D */ static const DDDEVICEIDENTIFIER2 deviceidentifier = { @@ -69,6 +46,26 @@ const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops = ddraw_null_wined3d_object_destroyed, }; +static inline IDirectDrawImpl *ddraw_from_ddraw1(IDirectDraw *iface) +{ + return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirectDraw_vtbl)); +} + +static inline IDirectDrawImpl *ddraw_from_ddraw2(IDirectDraw2 *iface) +{ + return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirectDraw2_vtbl)); +} + +static inline IDirectDrawImpl *ddraw_from_ddraw3(IDirectDraw3 *iface) +{ + return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirectDraw3_vtbl)); +} + +static inline IDirectDrawImpl *ddraw_from_ddraw4(IDirectDraw4 *iface) +{ + return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirectDraw4_vtbl)); +} + /***************************************************************************** * IUnknown Methods *****************************************************************************/ @@ -93,14 +90,11 @@ const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops = * E_NOINTERFACE if the requested interface wasn't found * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_QueryInterface(IDirectDraw7 *iface, - REFIID refiid, - void **obj) +static HRESULT WINAPI ddraw7_QueryInterface(IDirectDraw7 *iface, REFIID refiid, void **obj) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(refiid), obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(refiid), obj); /* Can change surface impl type */ EnterCriticalSection(&ddraw_cs); @@ -220,6 +214,62 @@ IDirectDrawImpl_QueryInterface(IDirectDraw7 *iface, return S_OK; } +static HRESULT WINAPI ddraw4_QueryInterface(IDirectDraw4 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw4(iface), riid, object); +} + +static HRESULT WINAPI ddraw3_QueryInterface(IDirectDraw3 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw3(iface), riid, object); +} + +static HRESULT WINAPI ddraw2_QueryInterface(IDirectDraw2 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw2(iface), riid, object); +} + +static HRESULT WINAPI ddraw1_QueryInterface(IDirectDraw *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw1(iface), riid, object); +} + +static HRESULT WINAPI d3d7_QueryInterface(IDirect3D7 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw7_QueryInterface((IDirectDraw7 *)ddraw_from_d3d7(iface), riid, object); +} + +static HRESULT WINAPI d3d3_QueryInterface(IDirect3D3 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw7_QueryInterface((IDirectDraw7 *)ddraw_from_d3d3(iface), riid, object); +} + +static HRESULT WINAPI d3d2_QueryInterface(IDirect3D2 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw7_QueryInterface((IDirectDraw7 *)ddraw_from_d3d2(iface), riid, object); +} + +static HRESULT WINAPI d3d1_QueryInterface(IDirect3D *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw7_QueryInterface((IDirectDraw7 *)ddraw_from_d3d1(iface), riid, object); +} + /***************************************************************************** * IDirectDraw7::AddRef * @@ -238,21 +288,96 @@ IDirectDrawImpl_QueryInterface(IDirectDraw7 *iface, * Returns: The new refcount * *****************************************************************************/ -static ULONG WINAPI -IDirectDrawImpl_AddRef(IDirectDraw7 *iface) +static ULONG WINAPI ddraw7_AddRef(IDirectDraw7 *iface) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref7); - TRACE("(%p) : incrementing IDirectDraw7 refcount from %u.\n", This, ref -1); + TRACE("%p increasing refcount to %u.\n", This, ref); if(ref == 1) InterlockedIncrement(&This->numIfaces); return ref; } +static ULONG WINAPI ddraw4_AddRef(IDirectDraw4 *iface) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw4(iface); + ULONG ref = InterlockedIncrement(&ddraw->ref4); + + TRACE("%p increasing refcount to %u.\n", ddraw, ref); + + if (ref == 1) InterlockedIncrement(&ddraw->numIfaces); + + return ref; +} + +static ULONG WINAPI ddraw3_AddRef(IDirectDraw3 *iface) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw3(iface); + ULONG ref = InterlockedIncrement(&ddraw->ref3); + + TRACE("%p increasing refcount to %u.\n", ddraw, ref); + + if (ref == 1) InterlockedIncrement(&ddraw->numIfaces); + + return ref; +} + +static ULONG WINAPI ddraw2_AddRef(IDirectDraw2 *iface) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw2(iface); + ULONG ref = InterlockedIncrement(&ddraw->ref2); + + TRACE("%p increasing refcount to %u.\n", ddraw, ref); + + if (ref == 1) InterlockedIncrement(&ddraw->numIfaces); + + return ref; +} + +static ULONG WINAPI ddraw1_AddRef(IDirectDraw *iface) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw1(iface); + ULONG ref = InterlockedIncrement(&ddraw->ref1); + + TRACE("%p increasing refcount to %u.\n", ddraw, ref); + + if (ref == 1) InterlockedIncrement(&ddraw->numIfaces); + + return ref; +} + +static ULONG WINAPI d3d7_AddRef(IDirect3D7 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_AddRef((IDirectDraw7 *)ddraw_from_d3d7(iface)); +} + +static ULONG WINAPI d3d3_AddRef(IDirect3D3 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw1_AddRef((IDirectDraw *)&ddraw_from_d3d3(iface)->IDirectDraw_vtbl); +} + +static ULONG WINAPI d3d2_AddRef(IDirect3D2 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw1_AddRef((IDirectDraw *)&ddraw_from_d3d2(iface)->IDirectDraw_vtbl); +} + +static ULONG WINAPI d3d1_AddRef(IDirect3D *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw1_AddRef((IDirectDraw *)&ddraw_from_d3d1(iface)->IDirectDraw_vtbl); +} + /***************************************************************************** - * IDirectDrawImpl_Destroy + * ddraw_destroy * * Destroys a ddraw object if all refcounts are 0. This is to share code * between the IDirectDrawX::Release functions @@ -261,8 +386,7 @@ IDirectDrawImpl_AddRef(IDirectDraw7 *iface) * This: DirectDraw object to destroy * *****************************************************************************/ -void -IDirectDrawImpl_Destroy(IDirectDrawImpl *This) +static void ddraw_destroy(IDirectDrawImpl *This) { IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)This, NULL, DDSCL_NORMAL); IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)This); @@ -275,9 +399,6 @@ IDirectDrawImpl_Destroy(IDirectDrawImpl *This) This->devicewindow = 0; } - /* Unregister the window class */ - UnregisterClassA(This->classname, 0); - EnterCriticalSection(&ddraw_cs); list_remove(&This->ddraw_list_entry); LeaveCriticalSection(&ddraw_cs); @@ -297,23 +418,99 @@ IDirectDrawImpl_Destroy(IDirectDrawImpl *This) * * Returns: The new refcount *****************************************************************************/ -static ULONG WINAPI -IDirectDrawImpl_Release(IDirectDraw7 *iface) +static ULONG WINAPI ddraw7_Release(IDirectDraw7 *iface) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref7); - TRACE("(%p)->() decrementing IDirectDraw7 refcount from %u.\n", This, ref +1); + TRACE("%p decreasing refcount to %u.\n", This, ref); - if(ref == 0) - { - ULONG ifacecount = InterlockedDecrement(&This->numIfaces); - if(ifacecount == 0) IDirectDrawImpl_Destroy(This); - } + if (!ref && !InterlockedDecrement(&This->numIfaces)) + ddraw_destroy(This); return ref; } +static ULONG WINAPI ddraw4_Release(IDirectDraw4 *iface) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw4(iface); + ULONG ref = InterlockedDecrement(&ddraw->ref4); + + TRACE("%p decreasing refcount to %u.\n", ddraw, ref); + + if (!ref && !InterlockedDecrement(&ddraw->numIfaces)) + ddraw_destroy(ddraw); + + return ref; +} + +static ULONG WINAPI ddraw3_Release(IDirectDraw3 *iface) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw3(iface); + ULONG ref = InterlockedDecrement(&ddraw->ref3); + + TRACE("%p decreasing refcount to %u.\n", ddraw, ref); + + if (!ref && !InterlockedDecrement(&ddraw->numIfaces)) + ddraw_destroy(ddraw); + + return ref; +} + +static ULONG WINAPI ddraw2_Release(IDirectDraw2 *iface) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw2(iface); + ULONG ref = InterlockedDecrement(&ddraw->ref2); + + TRACE("%p decreasing refcount to %u.\n", ddraw, ref); + + if (!ref && !InterlockedDecrement(&ddraw->numIfaces)) + ddraw_destroy(ddraw); + + return ref; +} + +static ULONG WINAPI ddraw1_Release(IDirectDraw *iface) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw1(iface); + ULONG ref = InterlockedDecrement(&ddraw->ref1); + + TRACE("%p decreasing refcount to %u.\n", ddraw, ref); + + if (!ref && !InterlockedDecrement(&ddraw->numIfaces)) + ddraw_destroy(ddraw); + + return ref; +} + +static ULONG WINAPI d3d7_Release(IDirect3D7 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_Release((IDirectDraw7 *)ddraw_from_d3d7(iface)); +} + +static ULONG WINAPI d3d3_Release(IDirect3D3 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw1_Release((IDirectDraw *)&ddraw_from_d3d3(iface)->IDirectDraw_vtbl); +} + +static ULONG WINAPI d3d2_Release(IDirect3D2 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw1_Release((IDirectDraw *)&ddraw_from_d3d2(iface)->IDirectDraw_vtbl); +} + +static ULONG WINAPI d3d1_Release(IDirect3D *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw1_Release((IDirectDraw *)&ddraw_from_d3d1(iface)->IDirectDraw_vtbl); +} + /***************************************************************************** * IDirectDraw methods *****************************************************************************/ @@ -348,7 +545,7 @@ IDirectDrawImpl_Release(IDirectDraw7 *iface) * DDSCL_SETDEVICEWINDOW: Sets a window specially used for rendering (I don't * expect any difference to a normal window for wine) * DDSCL_CREATEDEVICEWINDOW: Tells ddraw to create its own window for - * rendering (Possible test case: Half-life) + * rendering (Possible test case: Half-Life) * * Unsure about these: DDSCL_FPUSETUP DDSCL_FPURESERVE * @@ -362,15 +559,12 @@ IDirectDrawImpl_Release(IDirectDraw7 *iface) * (Probably others too, have to investigate) * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 *iface, - HWND hwnd, - DWORD cooplevel) +static HRESULT WINAPI ddraw7_SetCooperativeLevel(IDirectDraw7 *iface, HWND hwnd, DWORD cooplevel) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; HWND window; - TRACE("(%p)->(%p,%08x)\n",This,hwnd,cooplevel); + TRACE("iface %p, window %p, flags %#x.\n", iface, hwnd, cooplevel); DDRAW_dump_cooperativelevel(cooplevel); EnterCriticalSection(&ddraw_cs); @@ -504,11 +698,15 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 *iface, /* Don't create a device window if a focus window is set */ if( !(This->focuswindow) ) { - HWND devicewindow = CreateWindowExA(0, This->classname, "DDraw device window", - WS_POPUP, 0, 0, - GetSystemMetrics(SM_CXSCREEN), - GetSystemMetrics(SM_CYSCREEN), - NULL, NULL, GetModuleHandleA(0), NULL); + HWND devicewindow = CreateWindowExA(0, DDRAW_WINDOW_CLASS_NAME, "DDraw device window", + WS_POPUP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), + NULL, NULL, NULL, NULL); + if (!devicewindow) + { + ERR("Failed to create window, last error %#x.\n", GetLastError()); + LeaveCriticalSection(&ddraw_cs); + return E_FAIL; + } ShowWindow(devicewindow, SW_SHOW); /* Just to be sure */ TRACE("(%p) Created a DDraw device window. HWND=%p\n", This, devicewindow); @@ -539,35 +737,60 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw4_SetCooperativeLevel(IDirectDraw4 *iface, HWND window, DWORD flags) +{ + TRACE("iface %p, window %p, flags %#x.\n", iface, window, flags); + + return ddraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw4(iface), window, flags); +} + +static HRESULT WINAPI ddraw3_SetCooperativeLevel(IDirectDraw3 *iface, HWND window, DWORD flags) +{ + TRACE("iface %p, window %p, flags %#x.\n", iface, window, flags); + + return ddraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw3(iface), window, flags); +} + +static HRESULT WINAPI ddraw2_SetCooperativeLevel(IDirectDraw2 *iface, HWND window, DWORD flags) +{ + TRACE("iface %p, window %p, flags %#x.\n", iface, window, flags); + + return ddraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw2(iface), window, flags); +} + +static HRESULT WINAPI ddraw1_SetCooperativeLevel(IDirectDraw *iface, HWND window, DWORD flags) +{ + TRACE("iface %p, window %p, flags %#x.\n", iface, window, flags); + + return ddraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw1(iface), window, flags); +} + /***************************************************************************** * * Helper function for SetDisplayMode and RestoreDisplayMode * * Implements DirectDraw's SetDisplayMode, but ignores the value of * ForceRefreshRate, since it is already handled by - * IDirectDrawImpl_SetDisplayMode. RestoreDisplayMode can use this function + * ddraw7_SetDisplayMode. RestoreDisplayMode can use this function * without worrying that ForceRefreshRate will override the refresh rate. For * argument and return value documentation, see - * IDirectDrawImpl_SetDisplayMode. + * ddraw7_SetDisplayMode. * *****************************************************************************/ -static HRESULT -IDirectDrawImpl_SetDisplayModeNoOverride(IDirectDraw7 *iface, - DWORD Width, - DWORD Height, - DWORD BPP, - DWORD RefreshRate, - DWORD Flags) +static HRESULT ddraw_set_display_mode(IDirectDraw7 *iface, DWORD Width, DWORD Height, + DWORD BPP, DWORD RefreshRate, DWORD Flags) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; WINED3DDISPLAYMODE Mode; HRESULT hr; - TRACE("(%p)->(%d,%d,%d,%d,%x): Relay!\n", This, Width, Height, BPP, RefreshRate, Flags); + + TRACE("iface %p, width %u, height %u, bpp %u, refresh_rate %u, flags %#x.\n", + iface, Width, Height, BPP, RefreshRate, Flags); EnterCriticalSection(&ddraw_cs); if( !Width || !Height ) { - ERR("Width=%d, Height=%d, what to do?\n", Width, Height); + ERR("Width %u, Height %u, what to do?\n", Width, Height); /* It looks like Need for Speed Porsche Unleashed expects DD_OK here */ LeaveCriticalSection(&ddraw_cs); return DD_OK; @@ -633,22 +856,57 @@ IDirectDrawImpl_SetDisplayModeNoOverride(IDirectDraw7 *iface, * DD_OK on success * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_SetDisplayMode(IDirectDraw7 *iface, - DWORD Width, - DWORD Height, - DWORD BPP, - DWORD RefreshRate, - DWORD Flags) +static HRESULT WINAPI ddraw7_SetDisplayMode(IDirectDraw7 *iface, DWORD Width, DWORD Height, + DWORD BPP, DWORD RefreshRate, DWORD Flags) { + TRACE("iface %p, width %u, height %u, bpp %u, refresh_rate %u, flags %#x.\n", + iface, Width, Height, BPP, RefreshRate, Flags); + if (force_refresh_rate != 0) { - TRACE("ForceRefreshRate overriding passed-in refresh rate (%d Hz) to %d Hz\n", RefreshRate, force_refresh_rate); + TRACE("ForceRefreshRate overriding passed-in refresh rate (%u Hz) to %u Hz\n", + RefreshRate, force_refresh_rate); RefreshRate = force_refresh_rate; } - return IDirectDrawImpl_SetDisplayModeNoOverride(iface, Width, Height, BPP, - RefreshRate, Flags); + return ddraw_set_display_mode(iface, Width, Height, BPP, RefreshRate, Flags); +} + +static HRESULT WINAPI ddraw4_SetDisplayMode(IDirectDraw4 *iface, + DWORD width, DWORD height, DWORD bpp, DWORD refresh_rate, DWORD flags) +{ + TRACE("iface %p, width %u, height %u, bpp %u, refresh_rate %u, flags %#x.\n", + iface, width, height, bpp, refresh_rate, flags); + + return ddraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(iface), + width, height, bpp, refresh_rate, flags); +} + +static HRESULT WINAPI ddraw3_SetDisplayMode(IDirectDraw3 *iface, + DWORD width, DWORD height, DWORD bpp, DWORD refresh_rate, DWORD flags) +{ + TRACE("iface %p, width %u, height %u, bpp %u, refresh_rate %u, flags %#x.\n", + iface, width, height, bpp, refresh_rate, flags); + + return ddraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw3(iface), + width, height, bpp, refresh_rate, flags); +} + +static HRESULT WINAPI ddraw2_SetDisplayMode(IDirectDraw2 *iface, + DWORD width, DWORD height, DWORD bpp, DWORD refresh_rate, DWORD flags) +{ + TRACE("iface %p, width %u, height %u, bpp %u, refresh_rate %u, flags %#x.\n", + iface, width, height, bpp, refresh_rate, flags); + + return ddraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(iface), + width, height, bpp, refresh_rate, flags); +} + +static HRESULT WINAPI ddraw1_SetDisplayMode(IDirectDraw *iface, DWORD width, DWORD height, DWORD bpp) +{ + TRACE("iface %p, width %u, height %u, bpp %u.\n", iface, width, height, bpp); + + return ddraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(iface), width, height, bpp, 0, 0); } /***************************************************************************** @@ -672,14 +930,41 @@ IDirectDrawImpl_SetDisplayMode(IDirectDraw7 *iface, * DDERR_NOEXCLUSIVE mode if the device isn't in fullscreen mode * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_RestoreDisplayMode(IDirectDraw7 *iface) +static HRESULT WINAPI ddraw7_RestoreDisplayMode(IDirectDraw7 *iface) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)\n", This); - return IDirectDrawImpl_SetDisplayModeNoOverride(iface, - This->orig_width, This->orig_height, This->orig_bpp, 0, 0); + TRACE("iface %p.\n", iface); + + return ddraw_set_display_mode(iface, This->orig_width, This->orig_height, This->orig_bpp, 0, 0); +} + +static HRESULT WINAPI ddraw4_RestoreDisplayMode(IDirectDraw4 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(iface)); +} + +static HRESULT WINAPI ddraw3_RestoreDisplayMode(IDirectDraw3 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw3(iface)); +} + +static HRESULT WINAPI ddraw2_RestoreDisplayMode(IDirectDraw2 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(iface)); +} + +static HRESULT WINAPI ddraw1_RestoreDisplayMode(IDirectDraw *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(iface)); } /***************************************************************************** @@ -697,10 +982,7 @@ IDirectDrawImpl_RestoreDisplayMode(IDirectDraw7 *iface) * This implementation returns DD_OK only * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_GetCaps(IDirectDraw7 *iface, - DDCAPS *DriverCaps, - DDCAPS *HELCaps) +static HRESULT WINAPI ddraw7_GetCaps(IDirectDraw7 *iface, DDCAPS *DriverCaps, DDCAPS *HELCaps) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; DDCAPS caps; @@ -709,10 +991,12 @@ IDirectDrawImpl_GetCaps(IDirectDraw7 *iface, DDSCAPS2 ddscaps = {0, 0, 0, {0}}; TRACE("(%p)->(%p,%p)\n", This, DriverCaps, HELCaps); + TRACE("iface %p, driver_caps %p, hel_caps %p.\n", iface, DriverCaps, HELCaps); + /* One structure must be != NULL */ if( (!DriverCaps) && (!HELCaps) ) { - ERR("(%p) Invalid params to IDirectDrawImpl_GetCaps\n", This); + ERR("(%p) Invalid params to ddraw7_GetCaps\n", This); return DDERR_INVALIDPARAMS; } @@ -785,6 +1069,34 @@ IDirectDrawImpl_GetCaps(IDirectDraw7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw4_GetCaps(IDirectDraw4 *iface, DDCAPS *driver_caps, DDCAPS *hel_caps) +{ + TRACE("iface %p, driver_caps %p, hel_caps %p.\n", iface, driver_caps, hel_caps); + + return ddraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw4(iface), driver_caps, hel_caps); +} + +static HRESULT WINAPI ddraw3_GetCaps(IDirectDraw3 *iface, DDCAPS *driver_caps, DDCAPS *hel_caps) +{ + TRACE("iface %p, driver_caps %p, hel_caps %p.\n", iface, driver_caps, hel_caps); + + return ddraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw3(iface), driver_caps, hel_caps); +} + +static HRESULT WINAPI ddraw2_GetCaps(IDirectDraw2 *iface, DDCAPS *driver_caps, DDCAPS *hel_caps) +{ + TRACE("iface %p, driver_caps %p, hel_caps %p.\n", iface, driver_caps, hel_caps); + + return ddraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw2(iface), driver_caps, hel_caps); +} + +static HRESULT WINAPI ddraw1_GetCaps(IDirectDraw *iface, DDCAPS *driver_caps, DDCAPS *hel_caps) +{ + TRACE("iface %p, driver_caps %p, hel_caps %p.\n", iface, driver_caps, hel_caps); + + return ddraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw1(iface), driver_caps, hel_caps); +} + /***************************************************************************** * IDirectDraw7::Compact * @@ -794,15 +1106,41 @@ IDirectDrawImpl_GetCaps(IDirectDraw7 *iface, * DD_OK, but this is unchecked * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_Compact(IDirectDraw7 *iface) +static HRESULT WINAPI ddraw7_Compact(IDirectDraw7 *iface) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)\n", This); + TRACE("iface %p.\n", iface); return DD_OK; } +static HRESULT WINAPI ddraw4_Compact(IDirectDraw4 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw4(iface)); +} + +static HRESULT WINAPI ddraw3_Compact(IDirectDraw3 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw3(iface)); +} + +static HRESULT WINAPI ddraw2_Compact(IDirectDraw2 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw2(iface)); +} + +static HRESULT WINAPI ddraw1_Compact(IDirectDraw *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw1(iface)); +} + /***************************************************************************** * IDirectDraw7::GetDisplayMode * @@ -817,15 +1155,14 @@ IDirectDrawImpl_Compact(IDirectDraw7 *iface) * DD_OK * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_GetDisplayMode(IDirectDraw7 *iface, - DDSURFACEDESC2 *DDSD) +static HRESULT WINAPI ddraw7_GetDisplayMode(IDirectDraw7 *iface, DDSURFACEDESC2 *DDSD) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; HRESULT hr; WINED3DDISPLAYMODE Mode; DWORD Size; - TRACE("(%p)->(%p): Relay\n", This, DDSD); + + TRACE("iface %p, surface_desc %p.\n", iface, DDSD); EnterCriticalSection(&ddraw_cs); /* This seems sane */ @@ -871,6 +1208,34 @@ IDirectDrawImpl_GetDisplayMode(IDirectDraw7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw4_GetDisplayMode(IDirectDraw4 *iface, DDSURFACEDESC2 *surface_desc) +{ + TRACE("iface %p, surface_desc %p.\n", iface, surface_desc); + + return ddraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(iface), surface_desc); +} + +static HRESULT WINAPI ddraw3_GetDisplayMode(IDirectDraw3 *iface, DDSURFACEDESC *surface_desc) +{ + TRACE("iface %p, surface_desc %p.\n", iface, surface_desc); + + return ddraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw3(iface), (DDSURFACEDESC2 *)surface_desc); +} + +static HRESULT WINAPI ddraw2_GetDisplayMode(IDirectDraw2 *iface, DDSURFACEDESC *surface_desc) +{ + TRACE("iface %p, surface_desc %p.\n", iface, surface_desc); + + return ddraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(iface), (DDSURFACEDESC2 *)surface_desc); +} + +static HRESULT WINAPI ddraw1_GetDisplayMode(IDirectDraw *iface, DDSURFACEDESC *surface_desc) +{ + TRACE("iface %p, surface_desc %p.\n", iface, surface_desc); + + return ddraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(iface), (DDSURFACEDESC2 *)surface_desc); +} + /***************************************************************************** * IDirectDraw7::GetFourCCCodes * @@ -888,12 +1253,11 @@ IDirectDrawImpl_GetDisplayMode(IDirectDraw7 *iface, * Always returns DD_OK, as it's a stub for now * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_GetFourCCCodes(IDirectDraw7 *iface, - DWORD *NumCodes, DWORD *Codes) +static HRESULT WINAPI ddraw7_GetFourCCCodes(IDirectDraw7 *iface, DWORD *NumCodes, DWORD *Codes) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - WINED3DFORMAT formats[] = { + static const enum wined3d_format_id formats[] = + { WINED3DFMT_YUY2, WINED3DFMT_UYVY, WINED3DFMT_YV12, WINED3DFMT_DXT1, WINED3DFMT_DXT2, WINED3DFMT_DXT3, WINED3DFMT_DXT4, WINED3DFMT_DXT5, WINED3DFMT_ATI2N, WINED3DFMT_NVHU, WINED3DFMT_NVHS @@ -902,7 +1266,8 @@ IDirectDrawImpl_GetFourCCCodes(IDirectDraw7 *iface, HRESULT hr; WINED3DDISPLAYMODE d3ddm; WINED3DSURFTYPE type = This->ImplType; - TRACE("(%p)->(%p, %p)\n", This, NumCodes, Codes); + + TRACE("iface %p, codes_count %p, codes %p.\n", iface, NumCodes, Codes); IWineD3DDevice_GetDisplayMode(This->wineD3DDevice, 0 /* swapchain 0 */, @@ -936,6 +1301,34 @@ IDirectDrawImpl_GetFourCCCodes(IDirectDraw7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw4_GetFourCCCodes(IDirectDraw4 *iface, DWORD *codes_count, DWORD *codes) +{ + TRACE("iface %p, codes_count %p, codes %p.\n", iface, codes_count, codes); + + return ddraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw4(iface), codes_count, codes); +} + +static HRESULT WINAPI ddraw3_GetFourCCCodes(IDirectDraw3 *iface, DWORD *codes_count, DWORD *codes) +{ + TRACE("iface %p, codes_count %p, codes %p.\n", iface, codes_count, codes); + + return ddraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw3(iface), codes_count, codes); +} + +static HRESULT WINAPI ddraw2_GetFourCCCodes(IDirectDraw2 *iface, DWORD *codes_count, DWORD *codes) +{ + TRACE("iface %p, codes_count %p, codes %p.\n", iface, codes_count, codes); + + return ddraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw2(iface), codes_count, codes); +} + +static HRESULT WINAPI ddraw1_GetFourCCCodes(IDirectDraw *iface, DWORD *codes_count, DWORD *codes) +{ + TRACE("iface %p, codes_count %p, codes %p.\n", iface, codes_count, codes); + + return ddraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw1(iface), codes_count, codes); +} + /***************************************************************************** * IDirectDraw7::GetMonitorFrequency * @@ -950,12 +1343,9 @@ IDirectDrawImpl_GetFourCCCodes(IDirectDraw7 *iface, * Always returns DD_OK * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_GetMonitorFrequency(IDirectDraw7 *iface, - DWORD *Freq) +static HRESULT WINAPI ddraw7_GetMonitorFrequency(IDirectDraw7 *iface, DWORD *Freq) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%p)\n", This, Freq); + FIXME("iface %p, frequency %p stub!\n", iface, Freq); /* Ideally this should be in WineD3D, as it concerns the screen setup, * but for now this should make the games happy @@ -964,6 +1354,34 @@ IDirectDrawImpl_GetMonitorFrequency(IDirectDraw7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw4_GetMonitorFrequency(IDirectDraw4 *iface, DWORD *frequency) +{ + TRACE("iface %p, frequency %p.\n", iface, frequency); + + return ddraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw4(iface), frequency); +} + +static HRESULT WINAPI ddraw3_GetMonitorFrequency(IDirectDraw3 *iface, DWORD *frequency) +{ + TRACE("iface %p, frequency %p.\n", iface, frequency); + + return ddraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw3(iface), frequency); +} + +static HRESULT WINAPI ddraw2_GetMonitorFrequency(IDirectDraw2 *iface, DWORD *frequency) +{ + TRACE("iface %p, frequency %p.\n", iface, frequency); + + return ddraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw2(iface), frequency); +} + +static HRESULT WINAPI ddraw1_GetMonitorFrequency(IDirectDraw *iface, DWORD *frequency) +{ + TRACE("iface %p, frequency %p.\n", iface, frequency); + + return ddraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw1(iface), frequency); +} + /***************************************************************************** * IDirectDraw7::GetVerticalBlankStatus * @@ -978,12 +1396,11 @@ IDirectDrawImpl_GetMonitorFrequency(IDirectDraw7 *iface, * DDERR_INVALIDPARAMS if status is NULL * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_GetVerticalBlankStatus(IDirectDraw7 *iface, - BOOL *status) +static HRESULT WINAPI ddraw7_GetVerticalBlankStatus(IDirectDraw7 *iface, BOOL *status) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%p)\n", This, status); + + TRACE("iface %p, status %p.\n", iface, status); /* This looks sane, the MSDN suggests it too */ EnterCriticalSection(&ddraw_cs); @@ -999,6 +1416,34 @@ IDirectDrawImpl_GetVerticalBlankStatus(IDirectDraw7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw4_GetVerticalBlankStatus(IDirectDraw4 *iface, BOOL *status) +{ + TRACE("iface %p, status %p.\n", iface, status); + + return ddraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw4(iface), status); +} + +static HRESULT WINAPI ddraw3_GetVerticalBlankStatus(IDirectDraw3 *iface, BOOL *status) +{ + TRACE("iface %p, status %p.\n", iface, status); + + return ddraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw3(iface), status); +} + +static HRESULT WINAPI ddraw2_GetVerticalBlankStatus(IDirectDraw2 *iface, BOOL *status) +{ + TRACE("iface %p, status %p.\n", iface, status); + + return ddraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw2(iface), status); +} + +static HRESULT WINAPI ddraw1_GetVerticalBlankStatus(IDirectDraw *iface, BOOL *status) +{ + TRACE("iface %p, status %p.\n", iface, status); + + return ddraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw1(iface), status); +} + /***************************************************************************** * IDirectDraw7::GetAvailableVidMem * @@ -1014,11 +1459,11 @@ IDirectDrawImpl_GetVerticalBlankStatus(IDirectDraw7 *iface, * DDERR_INVALIDPARAMS of free and total are NULL * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_GetAvailableVidMem(IDirectDraw7 *iface, DDSCAPS2 *Caps, DWORD *total, DWORD *free) +static HRESULT WINAPI ddraw7_GetAvailableVidMem(IDirectDraw7 *iface, DDSCAPS2 *Caps, DWORD *total, DWORD *free) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%p, %p, %p)\n", This, Caps, total, free); + + TRACE("iface %p, caps %p, total %p, free %p.\n", iface, Caps, total, free); if(TRACE_ON(ddraw)) { @@ -1045,6 +1490,36 @@ IDirectDrawImpl_GetAvailableVidMem(IDirectDraw7 *iface, DDSCAPS2 *Caps, DWORD *t return DD_OK; } +static HRESULT WINAPI ddraw4_GetAvailableVidMem(IDirectDraw4 *iface, + DDSCAPS2 *caps, DWORD *total, DWORD *free) +{ + TRACE("iface %p, caps %p, total %p, free %p.\n", iface, caps, total, free); + + return ddraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw4(iface), caps, total, free); +} + +static HRESULT WINAPI ddraw3_GetAvailableVidMem(IDirectDraw3 *iface, + DDSCAPS *caps, DWORD *total, DWORD *free) +{ + DDSCAPS2 caps2; + + TRACE("iface %p, caps %p, total %p, free %p.\n", iface, caps, total, free); + + DDRAW_Convert_DDSCAPS_1_To_2(caps, &caps2); + return ddraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw3(iface), &caps2, total, free); +} + +static HRESULT WINAPI ddraw2_GetAvailableVidMem(IDirectDraw2 *iface, + DDSCAPS *caps, DWORD *total, DWORD *free) +{ + DDSCAPS2 caps2; + + TRACE("iface %p, caps %p, total %p, free %p.\n", iface, caps, total, free); + + DDRAW_Convert_DDSCAPS_1_To_2(caps, &caps2); + return ddraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw2(iface), &caps2, total, free); +} + /***************************************************************************** * IDirectDraw7::Initialize * @@ -1059,12 +1534,11 @@ IDirectDrawImpl_GetAvailableVidMem(IDirectDraw7 *iface, DDSCAPS2 *Caps, DWORD *t * DDERR_ALREADYINITIALIZED on repeated calls * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_Initialize(IDirectDraw7 *iface, - GUID *Guid) +static HRESULT WINAPI ddraw7_Initialize(IDirectDraw7 *iface, GUID *Guid) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%s): No-op\n", This, debugstr_guid(Guid)); + + TRACE("iface %p, guid %s.\n", iface, debugstr_guid(Guid)); if(This->initialized) { @@ -1076,6 +1550,41 @@ IDirectDrawImpl_Initialize(IDirectDraw7 *iface, } } +static HRESULT WINAPI ddraw4_Initialize(IDirectDraw4 *iface, GUID *guid) +{ + TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); + + return ddraw7_Initialize((IDirectDraw7 *)ddraw_from_ddraw4(iface), guid); +} + +static HRESULT WINAPI ddraw3_Initialize(IDirectDraw3 *iface, GUID *guid) +{ + TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); + + return ddraw7_Initialize((IDirectDraw7 *)ddraw_from_ddraw3(iface), guid); +} + +static HRESULT WINAPI ddraw2_Initialize(IDirectDraw2 *iface, GUID *guid) +{ + TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); + + return ddraw7_Initialize((IDirectDraw7 *)ddraw_from_ddraw2(iface), guid); +} + +static HRESULT WINAPI ddraw1_Initialize(IDirectDraw *iface, GUID *guid) +{ + TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); + + return ddraw7_Initialize((IDirectDraw7 *)ddraw_from_ddraw1(iface), guid); +} + +static HRESULT WINAPI d3d1_Initialize(IDirect3D *iface, REFIID riid) +{ + TRACE("iface %p, riid %s.\n", iface, debugstr_guid(riid)); + + return D3D_OK; +} + /***************************************************************************** * IDirectDraw7::FlipToGDISurface * @@ -1089,15 +1598,41 @@ IDirectDrawImpl_Initialize(IDirectDraw7 *iface, * Always returns DD_OK * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_FlipToGDISurface(IDirectDraw7 *iface) +static HRESULT WINAPI ddraw7_FlipToGDISurface(IDirectDraw7 *iface) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)\n", This); + FIXME("iface %p stub!\n", iface); return DD_OK; } +static HRESULT WINAPI ddraw4_FlipToGDISurface(IDirectDraw4 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw4(iface)); +} + +static HRESULT WINAPI ddraw3_FlipToGDISurface(IDirectDraw3 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw3(iface)); +} + +static HRESULT WINAPI ddraw2_FlipToGDISurface(IDirectDraw2 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw2(iface)); +} + +static HRESULT WINAPI ddraw1_FlipToGDISurface(IDirectDraw *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw1(iface)); +} + /***************************************************************************** * IDirectDraw7::WaitForVerticalBlank * @@ -1115,18 +1650,16 @@ IDirectDrawImpl_FlipToGDISurface(IDirectDraw7 *iface) * Always returns DD_OK * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_WaitForVerticalBlank(IDirectDraw7 *iface, - DWORD Flags, - HANDLE h) +static HRESULT WINAPI ddraw7_WaitForVerticalBlank(IDirectDraw7 *iface, DWORD Flags, HANDLE event) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - static BOOL hide = FALSE; + static BOOL hide; + + TRACE("iface %p, flags %#x, event %p.\n", iface, Flags, event); /* This function is called often, so print the fixme only once */ if(!hide) { - FIXME("(%p)->(%x,%p): Stub\n", This, Flags, h); + FIXME("iface %p, flags %#x, event %p stub!\n", iface, Flags, event); hide = TRUE; } @@ -1137,6 +1670,34 @@ IDirectDrawImpl_WaitForVerticalBlank(IDirectDraw7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw4_WaitForVerticalBlank(IDirectDraw4 *iface, DWORD flags, HANDLE event) +{ + TRACE("iface %p, flags %#x, event %p.\n", iface, flags, event); + + return ddraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw4(iface), flags, event); +} + +static HRESULT WINAPI ddraw3_WaitForVerticalBlank(IDirectDraw3 *iface, DWORD flags, HANDLE event) +{ + TRACE("iface %p, flags %#x, event %p.\n", iface, flags, event); + + return ddraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw3(iface), flags, event); +} + +static HRESULT WINAPI ddraw2_WaitForVerticalBlank(IDirectDraw2 *iface, DWORD flags, HANDLE event) +{ + TRACE("iface %p, flags %#x, event %p.\n", iface, flags, event); + + return ddraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw2(iface), flags, event); +} + +static HRESULT WINAPI ddraw1_WaitForVerticalBlank(IDirectDraw *iface, DWORD flags, HANDLE event) +{ + TRACE("iface %p, flags %#x, event %p.\n", iface, flags, event); + + return ddraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw1(iface), flags, event); +} + /***************************************************************************** * IDirectDraw7::GetScanLine * @@ -1149,17 +1710,19 @@ IDirectDrawImpl_WaitForVerticalBlank(IDirectDraw7 *iface, * Always returns DD_OK * *****************************************************************************/ -static HRESULT WINAPI IDirectDrawImpl_GetScanLine(IDirectDraw7 *iface, DWORD *Scanline) +static HRESULT WINAPI ddraw7_GetScanLine(IDirectDraw7 *iface, DWORD *Scanline) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; static BOOL hide = FALSE; WINED3DDISPLAYMODE Mode; + TRACE("iface %p, line %p.\n", iface, Scanline); + /* This function is called often, so print the fixme only once */ EnterCriticalSection(&ddraw_cs); if(!hide) { - FIXME("(%p)->(%p): Semi-Stub\n", This, Scanline); + FIXME("iface %p, line %p partial stub!\n", iface, Scanline); hide = TRUE; } @@ -1178,6 +1741,34 @@ static HRESULT WINAPI IDirectDrawImpl_GetScanLine(IDirectDraw7 *iface, DWORD *Sc return DD_OK; } +static HRESULT WINAPI ddraw4_GetScanLine(IDirectDraw4 *iface, DWORD *line) +{ + TRACE("iface %p, line %p.\n", iface, line); + + return ddraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw4(iface), line); +} + +static HRESULT WINAPI ddraw3_GetScanLine(IDirectDraw3 *iface, DWORD *line) +{ + TRACE("iface %p, line %p.\n", iface, line); + + return ddraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw3(iface), line); +} + +static HRESULT WINAPI ddraw2_GetScanLine(IDirectDraw2 *iface, DWORD *line) +{ + TRACE("iface %p, line %p.\n", iface, line); + + return ddraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw2(iface), line); +} + +static HRESULT WINAPI ddraw1_GetScanLine(IDirectDraw *iface, DWORD *line) +{ + TRACE("iface %p, line %p.\n", iface, line); + + return ddraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw1(iface), line); +} + /***************************************************************************** * IDirectDraw7::TestCooperativeLevel * @@ -1190,14 +1781,20 @@ static HRESULT WINAPI IDirectDrawImpl_GetScanLine(IDirectDraw7 *iface, DWORD *Sc * if the state is not correct(See below) * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_TestCooperativeLevel(IDirectDraw7 *iface) +static HRESULT WINAPI ddraw7_TestCooperativeLevel(IDirectDraw7 *iface) { TRACE("iface %p.\n", iface); return DD_OK; } +static HRESULT WINAPI ddraw4_TestCooperativeLevel(IDirectDraw4 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_TestCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw4(iface)); +} + /***************************************************************************** * IDirectDraw7::GetGDISurface * @@ -1212,16 +1809,15 @@ IDirectDrawImpl_TestCooperativeLevel(IDirectDraw7 *iface) * DDERR_NOTFOUND if the GDI surface wasn't found * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_GetGDISurface(IDirectDraw7 *iface, - IDirectDrawSurface7 **GDISurface) +static HRESULT WINAPI ddraw7_GetGDISurface(IDirectDraw7 *iface, IDirectDrawSurface7 **GDISurface) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; IWineD3DSurface *Surf; IDirectDrawSurface7 *ddsurf; HRESULT hr; DDSCAPS2 ddsCaps; - TRACE("(%p)->(%p)\n", This, GDISurface); + + TRACE("iface %p, surface %p.\n", iface, GDISurface); /* Get the back buffer from the wineD3DDevice and search its * attached surfaces for the front buffer @@ -1241,13 +1837,9 @@ IDirectDrawImpl_GetGDISurface(IDirectDraw7 *iface, return DDERR_NOTFOUND; } - /* GetBackBuffer AddRef()ed the surface, release it */ + ddsurf = IWineD3DSurface_GetParent(Surf); IWineD3DSurface_Release(Surf); - IWineD3DSurface_GetParent(Surf, - (IUnknown **) &ddsurf); - IDirectDrawSurface7_Release(ddsurf); /* For the GetParent */ - /* Find the front buffer */ ddsCaps.dwCaps = DDSCAPS_FRONTBUFFER; hr = IDirectDrawSurface7_GetAttachedSurface(ddsurf, @@ -1263,6 +1855,69 @@ IDirectDrawImpl_GetGDISurface(IDirectDraw7 *iface, return hr; } +static HRESULT WINAPI ddraw4_GetGDISurface(IDirectDraw4 *iface, IDirectDrawSurface4 **surface) +{ + TRACE("iface %p, surface %p.\n", iface, surface); + + return ddraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw4(iface), (IDirectDrawSurface7 **)surface); +} + +static HRESULT WINAPI ddraw3_GetGDISurface(IDirectDraw3 *iface, IDirectDrawSurface **surface) +{ + IDirectDrawSurface7 *surface7; + HRESULT hr; + + TRACE("iface %p, surface %p.\n", iface, surface); + + hr = ddraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw3(iface), &surface7); + *surface = surface7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)surface7)->IDirectDrawSurface3_vtbl : NULL; + + return hr; +} + +static HRESULT WINAPI ddraw2_GetGDISurface(IDirectDraw2 *iface, IDirectDrawSurface **surface) +{ + IDirectDrawSurface7 *surface7; + HRESULT hr; + + TRACE("iface %p, surface %p.\n", iface, surface); + + hr = ddraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw2(iface), &surface7); + *surface = surface7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)surface7)->IDirectDrawSurface3_vtbl : NULL; + + return hr; +} + +static HRESULT WINAPI ddraw1_GetGDISurface(IDirectDraw *iface, IDirectDrawSurface **surface) +{ + IDirectDrawSurface7 *surface7; + HRESULT hr; + + TRACE("iface %p, surface %p.\n", iface, surface); + + hr = ddraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw1(iface), &surface7); + *surface = surface7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)surface7)->IDirectDrawSurface3_vtbl : NULL; + + return hr; +} + +struct displaymodescallback_context +{ + LPDDENUMMODESCALLBACK func; + void *context; +}; + +static HRESULT CALLBACK EnumDisplayModesCallbackThunk(DDSURFACEDESC2 *surface_desc, void *context) +{ + struct displaymodescallback_context *cbcontext = context; + DDSURFACEDESC desc; + + memcpy(&desc, surface_desc, sizeof(desc)); + desc.dwSize = sizeof(desc); + + return cbcontext->func(&desc, cbcontext->context); +} + /***************************************************************************** * IDirectDraw7::EnumDisplayModes * @@ -1280,29 +1935,26 @@ IDirectDrawImpl_GetGDISurface(IDirectDraw7 *iface, * DDERR_INVALIDPARAMS if the callback wasn't set * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_EnumDisplayModes(IDirectDraw7 *iface, - DWORD Flags, - DDSURFACEDESC2 *DDSD, - void *Context, - LPDDENUMMODESCALLBACK2 cb) +static HRESULT WINAPI ddraw7_EnumDisplayModes(IDirectDraw7 *iface, DWORD Flags, + DDSURFACEDESC2 *DDSD, void *Context, LPDDENUMMODESCALLBACK2 cb) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; unsigned int modenum, fmt; - WINED3DFORMAT pixelformat = WINED3DFMT_UNKNOWN; + enum wined3d_format_id pixelformat = WINED3DFMT_UNKNOWN; WINED3DDISPLAYMODE mode; DDSURFACEDESC2 callback_sd; WINED3DDISPLAYMODE *enum_modes = NULL; unsigned enum_mode_count = 0, enum_mode_array_size = 0; - WINED3DFORMAT checkFormatList[] = + static const enum wined3d_format_id checkFormatList[] = { WINED3DFMT_B8G8R8X8_UNORM, WINED3DFMT_B5G6R5_UNORM, WINED3DFMT_P8_UINT, }; - TRACE("(%p)->(%p,%p,%p): Relay\n", This, DDSD, Context, cb); + TRACE("iface %p, flags %#x, surface_desc %p, context %p, callback %p.\n", + iface, Flags, DDSD, Context, cb); EnterCriticalSection(&ddraw_cs); /* This looks sane */ @@ -1434,6 +2086,61 @@ IDirectDrawImpl_EnumDisplayModes(IDirectDraw7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw4_EnumDisplayModes(IDirectDraw4 *iface, DWORD flags, + DDSURFACEDESC2 *surface_desc, void *context, LPDDENUMMODESCALLBACK2 callback) +{ + TRACE("iface %p, flags %#x, surface_desc %p, context %p, callback %p.\n", + iface, flags, surface_desc, context, callback); + + return ddraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw4(iface), flags, + surface_desc, context, callback); +} + +static HRESULT WINAPI ddraw3_EnumDisplayModes(IDirectDraw3 *iface, DWORD flags, + DDSURFACEDESC *surface_desc, void *context, LPDDENUMMODESCALLBACK callback) +{ + struct displaymodescallback_context cbcontext; + + TRACE("iface %p, flags %#x, surface_desc %p, context %p, callback %p.\n", + iface, flags, surface_desc, context, callback); + + cbcontext.func = callback; + cbcontext.context = context; + + return ddraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw3(iface), flags, + (DDSURFACEDESC2 *)surface_desc, &cbcontext, EnumDisplayModesCallbackThunk); +} + +static HRESULT WINAPI ddraw2_EnumDisplayModes(IDirectDraw2 *iface, DWORD flags, + DDSURFACEDESC *surface_desc, void *context, LPDDENUMMODESCALLBACK callback) +{ + struct displaymodescallback_context cbcontext; + + TRACE("iface %p, flags %#x, surface_desc %p, context %p, callback %p.\n", + iface, flags, surface_desc, context, callback); + + cbcontext.func = callback; + cbcontext.context = context; + + return ddraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw2(iface), flags, + (DDSURFACEDESC2 *)surface_desc, &cbcontext, EnumDisplayModesCallbackThunk); +} + +static HRESULT WINAPI ddraw1_EnumDisplayModes(IDirectDraw *iface, DWORD flags, + DDSURFACEDESC *surface_desc, void *context, LPDDENUMMODESCALLBACK callback) +{ + struct displaymodescallback_context cbcontext; + + TRACE("iface %p, flags %#x, surface_desc %p, context %p, callback %p.\n", + iface, flags, surface_desc, context, callback); + + cbcontext.func = callback; + cbcontext.context = context; + + return ddraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw1(iface), flags, + (DDSURFACEDESC2 *)surface_desc, &cbcontext, EnumDisplayModesCallbackThunk); +} + /***************************************************************************** * IDirectDraw7::EvaluateMode * @@ -1450,13 +2157,9 @@ IDirectDrawImpl_EnumDisplayModes(IDirectDraw7 *iface, * This implementation always DD_OK, because it's a stub * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_EvaluateMode(IDirectDraw7 *iface, - DWORD Flags, - DWORD *Timeout) +static HRESULT WINAPI ddraw7_EvaluateMode(IDirectDraw7 *iface, DWORD Flags, DWORD *Timeout) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - FIXME("(%p)->(%d,%p): Stub!\n", This, Flags, Timeout); + FIXME("iface %p, flags %#x, timeout %p stub!\n", iface, Flags, Timeout); /* When implementing this, implement it in WineD3D */ @@ -1478,13 +2181,10 @@ IDirectDrawImpl_EvaluateMode(IDirectDraw7 *iface, * DDERR_INVALIDPARAMS if DDDI is NULL * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_GetDeviceIdentifier(IDirectDraw7 *iface, - DDDEVICEIDENTIFIER2 *DDDI, - DWORD Flags) +static HRESULT WINAPI ddraw7_GetDeviceIdentifier(IDirectDraw7 *iface, + DDDEVICEIDENTIFIER2 *DDDI, DWORD Flags) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%p,%08x)\n", This, DDDI, Flags); + TRACE("iface %p, device_identifier %p, flags %#x.\n", iface, DDDI, Flags); if(!DDDI) return DDERR_INVALIDPARAMS; @@ -1500,6 +2200,20 @@ IDirectDrawImpl_GetDeviceIdentifier(IDirectDraw7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw4_GetDeviceIdentifier(IDirectDraw4 *iface, + DDDEVICEIDENTIFIER *identifier, DWORD flags) +{ + DDDEVICEIDENTIFIER2 identifier2; + HRESULT hr; + + TRACE("iface %p, identifier %p, flags %#x.\n", iface, identifier, flags); + + hr = ddraw7_GetDeviceIdentifier((IDirectDraw7 *)ddraw_from_ddraw4(iface), &identifier2, flags); + DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(&identifier2, identifier); + + return hr; +} + /***************************************************************************** * IDirectDraw7::GetSurfaceFromDC * @@ -1514,10 +2228,7 @@ IDirectDrawImpl_GetDeviceIdentifier(IDirectDraw7 *iface, * Always returns DD_OK because it's a stub * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_GetSurfaceFromDC(IDirectDraw7 *iface, - HDC hdc, - IDirectDrawSurface7 **Surface) +static HRESULT WINAPI ddraw7_GetSurfaceFromDC(IDirectDraw7 *iface, HDC hdc, IDirectDrawSurface7 **Surface) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; IWineD3DSurface *wined3d_surface; @@ -1535,11 +2246,35 @@ IDirectDrawImpl_GetSurfaceFromDC(IDirectDraw7 *iface, return DDERR_NOTFOUND; } - IWineD3DSurface_GetParent(wined3d_surface, (IUnknown **)Surface); + *Surface = IWineD3DSurface_GetParent(wined3d_surface); + IDirectDrawSurface7_AddRef(*Surface); TRACE("Returning surface %p.\n", Surface); return DD_OK; } +static HRESULT WINAPI ddraw4_GetSurfaceFromDC(IDirectDraw4 *iface, HDC dc, IDirectDrawSurface4 **surface) +{ + IDirectDrawSurface7 *surface7; + HRESULT hr; + + TRACE("iface %p, dc %p, surface %p.\n", iface, dc, surface); + + if (!surface) return E_INVALIDARG; + + hr = ddraw7_GetSurfaceFromDC((IDirectDraw7 *)ddraw_from_ddraw4(iface), dc, &surface7); + *surface = surface7 ? (IDirectDrawSurface4 *)&((IDirectDrawSurfaceImpl *)surface7)->IDirectDrawSurface3_vtbl : NULL; + + return hr; +} + +static HRESULT WINAPI ddraw3_GetSurfaceFromDC(IDirectDraw3 *iface, HDC dc, IDirectDrawSurface **surface) +{ + TRACE("iface %p, dc %p, surface %p.\n", iface, dc, surface); + + return ddraw7_GetSurfaceFromDC((IDirectDraw7 *)ddraw_from_ddraw3(iface), + dc, (IDirectDrawSurface7 **)surface); +} + /***************************************************************************** * IDirectDraw7::RestoreAllSurfaces * @@ -1551,11 +2286,9 @@ IDirectDrawImpl_GetSurfaceFromDC(IDirectDraw7 *iface, * Always returns DD_OK because it's a stub * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_RestoreAllSurfaces(IDirectDraw7 *iface) +static HRESULT WINAPI ddraw7_RestoreAllSurfaces(IDirectDraw7 *iface) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - FIXME("(%p): Stub\n", This); + FIXME("iface %p stub!\n", iface); /* This isn't hard to implement: Enumerate all WineD3D surfaces, * get their parent and call their restore method. Do not implement @@ -1565,6 +2298,13 @@ IDirectDrawImpl_RestoreAllSurfaces(IDirectDraw7 *iface) return DD_OK; } +static HRESULT WINAPI ddraw4_RestoreAllSurfaces(IDirectDraw4 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_RestoreAllSurfaces((IDirectDraw7 *)ddraw_from_ddraw4(iface)); +} + /***************************************************************************** * IDirectDraw7::StartModeTest * @@ -1587,14 +2327,10 @@ IDirectDrawImpl_RestoreAllSurfaces(IDirectDraw7 *iface) * otherwise DD_OK * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_StartModeTest(IDirectDraw7 *iface, - SIZE *Modes, - DWORD NumModes, - DWORD Flags) +static HRESULT WINAPI ddraw7_StartModeTest(IDirectDraw7 *iface, SIZE *Modes, DWORD NumModes, DWORD Flags) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - WARN("(%p)->(%p, %d, %x): Semi-Stub, most likely harmless\n", This, Modes, NumModes, Flags); + FIXME("iface %p, modes %p, mode_count %u, flags %#x partial stub!\n", + iface, Modes, NumModes, Flags); /* This looks sane */ if( (!Modes) || (NumModes == 0) ) return DDERR_INVALIDPARAMS; @@ -1611,27 +2347,24 @@ IDirectDrawImpl_StartModeTest(IDirectDraw7 *iface, } /***************************************************************************** - * IDirectDrawImpl_RecreateSurfacesCallback + * ddraw_recreate_surfaces_cb * - * Enumeration callback for IDirectDrawImpl_RecreateAllSurfaces. + * Enumeration callback for ddraw_recreate_surface. * It re-recreates the WineD3DSurface. It's pretty straightforward * *****************************************************************************/ -HRESULT WINAPI -IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf, - DDSURFACEDESC2 *desc, - void *Context) +HRESULT WINAPI ddraw_recreate_surfaces_cb(IDirectDrawSurface7 *surf, DDSURFACEDESC2 *desc, void *Context) { IDirectDrawSurfaceImpl *surfImpl = (IDirectDrawSurfaceImpl *)surf; IDirectDrawImpl *This = surfImpl->ddraw; - IUnknown *Parent; IWineD3DSurface *wineD3DSurface; IWineD3DSwapChain *swapchain; + void *parent; HRESULT hr; IWineD3DClipper *clipper = NULL; WINED3DSURFACE_DESC Desc; - WINED3DFORMAT Format; + enum wined3d_format_id Format; DWORD Usage; WINED3DPOOL Pool; @@ -1640,7 +2373,8 @@ IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf, UINT Width; UINT Height; - TRACE("(%p): Enumerated Surface %p\n", This, surfImpl); + TRACE("surface %p, surface_desc %p, context %p.\n", + surf, desc, Context); /* For the enumeration */ IDirectDrawSurface7_Release(surf); @@ -1656,8 +2390,7 @@ IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf, IWineD3DSurface_GetClipper(wineD3DSurface, &clipper); /* Get the surface properties */ - hr = IWineD3DSurface_GetDesc(wineD3DSurface, &Desc); - if(hr != D3D_OK) return hr; + IWineD3DSurface_GetDesc(wineD3DSurface, &Desc); Format = Desc.format; Usage = Desc.usage; @@ -1667,13 +2400,10 @@ IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf, Width = Desc.width; Height = Desc.height; - IWineD3DSurface_GetParent(wineD3DSurface, &Parent); - - /* Create the new surface */ - hr = IWineD3DDevice_CreateSurface(This->wineD3DDevice, Width, Height, Format, - TRUE /* Lockable */, FALSE /* Discard */, surfImpl->mipmap_level, &surfImpl->WineD3DSurface, Usage, Pool, - MultiSampleType, MultiSampleQuality, This->ImplType, Parent, &ddraw_null_wined3d_parent_ops); - IUnknown_Release(Parent); + parent = IWineD3DSurface_GetParent(wineD3DSurface); + hr = IWineD3DDevice_CreateSurface(This->wineD3DDevice, Width, Height, Format, TRUE /* Lockable */, + FALSE /* Discard */, surfImpl->mipmap_level, Usage, Pool, MultiSampleType, MultiSampleQuality, + This->ImplType, parent, &ddraw_null_wined3d_parent_ops, &surfImpl->WineD3DSurface); if (FAILED(hr)) { surfImpl->WineD3DSurface = wineD3DSurface; @@ -1712,15 +2442,14 @@ IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf, } /***************************************************************************** - * IDirectDrawImpl_RecreateAllSurfaces + * ddraw_recreate_surfaces * * A function, that converts all wineD3DSurfaces to the new implementation type * It enumerates all surfaces with IWineD3DDevice::EnumSurfaces, creates a * new WineD3DSurface, copies the content and releases the old surface * *****************************************************************************/ -static HRESULT -IDirectDrawImpl_RecreateAllSurfaces(IDirectDrawImpl *This) +static HRESULT ddraw_recreate_surfaces(IDirectDrawImpl *This) { DDSURFACEDESC2 desc; TRACE("(%p): Switch to implementation %d\n", This, This->ImplType); @@ -1737,20 +2466,21 @@ IDirectDrawImpl_RecreateAllSurfaces(IDirectDrawImpl *This) memset(&desc, 0, sizeof(desc)); desc.dwSize = sizeof(desc); - return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)This, 0, &desc, This, IDirectDrawImpl_RecreateSurfacesCallback); + return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)This, 0, &desc, This, ddraw_recreate_surfaces_cb); } -ULONG WINAPI D3D7CB_DestroySwapChain(IWineD3DSwapChain *pSwapChain) { - IUnknown* swapChainParent; - TRACE("(%p) call back\n", pSwapChain); +ULONG WINAPI D3D7CB_DestroySwapChain(IWineD3DSwapChain *pSwapChain) +{ + IUnknown *swapChainParent; - IWineD3DSwapChain_GetParent(pSwapChain, &swapChainParent); - IUnknown_Release(swapChainParent); + TRACE("swapchain %p.\n", pSwapChain); + + swapChainParent = IWineD3DSwapChain_GetParent(pSwapChain); return IUnknown_Release(swapChainParent); } /***************************************************************************** - * IDirectDrawImpl_CreateNewSurface + * ddraw_create_surface * * A helper function for IDirectDraw7::CreateSurface. It creates a new surface * with the passed parameters. @@ -1763,19 +2493,14 @@ ULONG WINAPI D3D7CB_DestroySwapChain(IWineD3DSwapChain *pSwapChain) { * DD_OK on success * *****************************************************************************/ -static HRESULT -IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This, - DDSURFACEDESC2 *pDDSD, - IDirectDrawSurfaceImpl **ppSurf, - UINT level) +static HRESULT ddraw_create_surface(IDirectDrawImpl *This, DDSURFACEDESC2 *pDDSD, + IDirectDrawSurfaceImpl **ppSurf, UINT level) { - HRESULT hr; - UINT Width, Height; - WINED3DFORMAT Format = WINED3DFMT_UNKNOWN; - DWORD Usage = 0; WINED3DSURFTYPE ImplType = This->ImplType; - WINED3DSURFACE_DESC Desc; - WINED3DPOOL Pool = WINED3DPOOL_DEFAULT; + HRESULT hr; + + TRACE("ddraw %p, surface_desc %p, surface %p, level %u.\n", + This, pDDSD, ppSurf, level); if (TRACE_ON(ddraw)) { @@ -1828,7 +2553,7 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This, ImplType = SURFACE_OPENGL; This->ImplType = ImplType; TRACE("(%p) Re-creating all surfaces\n", This); - IDirectDrawImpl_RecreateAllSurfaces(This); + ddraw_recreate_surfaces(This); TRACE("(%p) Done recreating all surfaces\n", This); } else if(This->ImplType != SURFACE_OPENGL && pDDSD->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) @@ -1838,57 +2563,6 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This, } } - if (!(pDDSD->ddsCaps.dwCaps & (DDSCAPS_VIDEOMEMORY | DDSCAPS_SYSTEMMEMORY)) && - !((pDDSD->ddsCaps.dwCaps & DDSCAPS_TEXTURE) && (pDDSD->ddsCaps.dwCaps2 & DDSCAPS2_TEXTUREMANAGE)) ) - { - /* Tests show surfaces without memory flags get these flags added right after creation. */ - pDDSD->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY; - } - /* Get the correct wined3d usage */ - if (pDDSD->ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | - DDSCAPS_3DDEVICE ) ) - { - Usage |= WINED3DUSAGE_RENDERTARGET; - - pDDSD->ddsCaps.dwCaps |= DDSCAPS_VISIBLE; - } - if (pDDSD->ddsCaps.dwCaps & (DDSCAPS_OVERLAY)) - { - Usage |= WINED3DUSAGE_OVERLAY; - } - if(This->depthstencil || (pDDSD->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) ) - { - /* The depth stencil creation callback sets this flag. - * Set the WineD3D usage to let it know that it's a depth - * Stencil surface. - */ - Usage |= WINED3DUSAGE_DEPTHSTENCIL; - } - if(pDDSD->ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY) - { - Pool = WINED3DPOOL_SYSTEMMEM; - } - else if(pDDSD->ddsCaps.dwCaps2 & DDSCAPS2_TEXTUREMANAGE) - { - Pool = WINED3DPOOL_MANAGED; - /* Managed textures have the system memory flag set */ - pDDSD->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - } - else if(pDDSD->ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY) - { - /* Videomemory adds localvidmem, this is mutually exclusive with systemmemory - * and texturemanage - */ - pDDSD->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM; - } - - Format = PixelFormat_DD2WineD3D(&pDDSD->u4.ddpfPixelFormat); - if(Format == WINED3DFMT_UNKNOWN) - { - ERR("Unsupported / Unknown pixelformat\n"); - return DDERR_INVALIDPIXELFORMAT; - } - /* Create the Surface object */ *ppSurf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawSurfaceImpl)); if(!*ppSurf) @@ -1896,41 +2570,12 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This, ERR("(%p) Error allocating memory for a surface\n", This); return DDERR_OUTOFVIDEOMEMORY; } - (*ppSurf)->lpVtbl = &IDirectDrawSurface7_Vtbl; - (*ppSurf)->IDirectDrawSurface3_vtbl = &IDirectDrawSurface3_Vtbl; - (*ppSurf)->IDirectDrawGammaControl_vtbl = &IDirectDrawGammaControl_Vtbl; - (*ppSurf)->IDirect3DTexture2_vtbl = &IDirect3DTexture2_Vtbl; - (*ppSurf)->IDirect3DTexture_vtbl = &IDirect3DTexture1_Vtbl; - (*ppSurf)->ref = 1; - (*ppSurf)->version = 7; - TRACE("%p->version = %d\n", (*ppSurf), (*ppSurf)->version); - (*ppSurf)->ddraw = This; - (*ppSurf)->surface_desc.dwSize = sizeof(DDSURFACEDESC2); - (*ppSurf)->surface_desc.u4.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - DD_STRUCT_COPY_BYSIZE(&(*ppSurf)->surface_desc, pDDSD); - /* Surface attachments */ - (*ppSurf)->next_attached = NULL; - (*ppSurf)->first_attached = *ppSurf; - - /* Needed to re-create the surface on an implementation change */ - (*ppSurf)->ImplType = ImplType; - - /* For D3DDevice creation */ - (*ppSurf)->isRenderTarget = FALSE; - - /* A trace message for debugging */ - TRACE("(%p) Created IDirectDrawSurface implementation structure at %p\n", This, *ppSurf); - - /* Now create the WineD3D Surface */ - hr = IWineD3DDevice_CreateSurface(This->wineD3DDevice, pDDSD->dwWidth, pDDSD->dwHeight, Format, - TRUE /* Lockable */, FALSE /* Discard */, level, &(*ppSurf)->WineD3DSurface, - Usage, Pool, WINED3DMULTISAMPLE_NONE, 0 /* MultiSampleQuality */, ImplType, - (IUnknown *)*ppSurf, &ddraw_null_wined3d_parent_ops); - - if(hr != D3D_OK) + hr = ddraw_surface_init(*ppSurf, This, pDDSD, level, ImplType); + if (FAILED(hr)) { - ERR("IWineD3DDevice::CreateSurface failed. hr = %08x\n", hr); + WARN("Failed to initialize surface, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, *ppSurf); return hr; } @@ -1938,93 +2583,7 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This, InterlockedIncrement(&This->surfaces); list_add_head(&This->surface_list, &(*ppSurf)->surface_list_entry); - /* Here we could store all created surfaces in the DirectDrawImpl structure, - * But this could also be delegated to WineDDraw, as it keeps track of all its - * resources. Not implemented for now, as there are more important things ;) - */ - - /* Get the pixel format of the WineD3DSurface and store it. - * Don't use the Format choosen above, WineD3D might have - * changed it - */ - (*ppSurf)->surface_desc.dwFlags |= DDSD_PIXELFORMAT; - hr = IWineD3DSurface_GetDesc((*ppSurf)->WineD3DSurface, &Desc); - if(hr != D3D_OK) - { - ERR("IWineD3DSurface::GetDesc failed\n"); - IDirectDrawSurface7_Release( (IDirectDrawSurface7 *) *ppSurf); - return hr; - } - - Format = Desc.format; - Width = Desc.width; - Height = Desc.height; - - if(Format == WINED3DFMT_UNKNOWN) - { - FIXME("IWineD3DSurface::GetDesc returned WINED3DFMT_UNKNOWN\n"); - } - PixelFormat_WineD3DtoDD( &(*ppSurf)->surface_desc.u4.ddpfPixelFormat, Format); - - /* Anno 1602 stores the pitch right after surface creation, so make sure it's there. - * I can't LockRect() the surface here because if OpenGL surfaces are in use, the - * WineD3DDevice might not be usable for 3D yet, so an extra method was created. - * TODO: Test other fourcc formats - */ - if(Format == WINED3DFMT_DXT1 || Format == WINED3DFMT_DXT2 || Format == WINED3DFMT_DXT3 || - Format == WINED3DFMT_DXT4 || Format == WINED3DFMT_DXT5) - { - (*ppSurf)->surface_desc.dwFlags |= DDSD_LINEARSIZE; - if(Format == WINED3DFMT_DXT1) - { - (*ppSurf)->surface_desc.u1.dwLinearSize = max(4, Width) * max(4, Height) / 2; - } - else - { - (*ppSurf)->surface_desc.u1.dwLinearSize = max(4, Width) * max(4, Height); - } - } - else - { - (*ppSurf)->surface_desc.dwFlags |= DDSD_PITCH; - (*ppSurf)->surface_desc.u1.lPitch = IWineD3DSurface_GetPitch((*ppSurf)->WineD3DSurface); - } - - /* Application passed a color key? Set it! */ - if(pDDSD->dwFlags & DDSD_CKDESTOVERLAY) - { - IWineD3DSurface_SetColorKey((*ppSurf)->WineD3DSurface, - DDCKEY_DESTOVERLAY, - (WINEDDCOLORKEY *) &pDDSD->u3.ddckCKDestOverlay); - } - if(pDDSD->dwFlags & DDSD_CKDESTBLT) - { - IWineD3DSurface_SetColorKey((*ppSurf)->WineD3DSurface, - DDCKEY_DESTBLT, - (WINEDDCOLORKEY *) &pDDSD->ddckCKDestBlt); - } - if(pDDSD->dwFlags & DDSD_CKSRCOVERLAY) - { - IWineD3DSurface_SetColorKey((*ppSurf)->WineD3DSurface, - DDCKEY_SRCOVERLAY, - (WINEDDCOLORKEY *) &pDDSD->ddckCKSrcOverlay); - } - if(pDDSD->dwFlags & DDSD_CKSRCBLT) - { - IWineD3DSurface_SetColorKey((*ppSurf)->WineD3DSurface, - DDCKEY_SRCBLT, - (WINEDDCOLORKEY *) &pDDSD->ddckCKSrcBlt); - } - if ( pDDSD->dwFlags & DDSD_LPSURFACE) - { - hr = IWineD3DSurface_SetMem((*ppSurf)->WineD3DSurface, pDDSD->lpSurface); - if(hr != WINED3D_OK) - { - /* No need for a trace here, wined3d does that for us */ - IDirectDrawSurface7_Release((IDirectDrawSurface7 *)*ppSurf); - return hr; - } - } + TRACE("Created surface %p.\n", *ppSurf); return DD_OK; } @@ -2074,10 +2633,7 @@ CreateAdditionalSurfaces(IDirectDrawImpl *This, } CubeFaceRoot = FALSE; - hr = IDirectDrawImpl_CreateNewSurface(This, - &DDSD, - &object2, - level); + hr = ddraw_create_surface(This, &DDSD, &object2, level); if(hr != DD_OK) { return hr; @@ -2101,6 +2657,153 @@ CreateAdditionalSurfaces(IDirectDrawImpl *This, return DD_OK; } +/* Must set all attached surfaces (e.g. mipmaps) versions as well */ +static void ddraw_set_surface_version(IDirectDrawSurfaceImpl *surface, UINT version) +{ + unsigned int i; + + TRACE("surface %p, version %u -> %u.\n", surface, surface->version, version); + + surface->version = version; + for (i = 0; i < MAX_COMPLEX_ATTACHED; ++i) + { + if (!surface->complex_array[i]) break; + ddraw_set_surface_version(surface->complex_array[i], version); + } + while ((surface = surface->next_attached)) + { + ddraw_set_surface_version(surface, version); + } +} + +/***************************************************************************** + * ddraw_attach_d3d_device + * + * Initializes the D3D capabilities of WineD3D + * + * Params: + * primary: The primary surface for D3D + * + * Returns + * DD_OK on success, + * DDERR_* otherwise + * + *****************************************************************************/ +static HRESULT ddraw_attach_d3d_device(IDirectDrawImpl *ddraw, IDirectDrawSurfaceImpl *primary) +{ + WINED3DPRESENT_PARAMETERS localParameters; + HWND window = ddraw->dest_window; + HRESULT hr; + + TRACE("ddraw %p, primary %p.\n", ddraw, primary); + + if (!window || window == GetDesktopWindow()) + { + window = CreateWindowExA(0, DDRAW_WINDOW_CLASS_NAME, "Hidden D3D Window", + WS_DISABLED, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), + NULL, NULL, NULL, NULL); + if (!window) + { + ERR("Failed to create window, last error %#x.\n", GetLastError()); + return E_FAIL; + } + + ShowWindow(window, SW_HIDE); /* Just to be sure */ + WARN("No window for the Direct3DDevice, created hidden window %p.\n", window); + } + else + { + TRACE("Using existing window %p for Direct3D rendering.\n", window); + } + ddraw->d3d_window = window; + + /* Store the future Render Target surface */ + ddraw->d3d_target = primary; + + /* Use the surface description for the device parameters, not the device + * settings. The application might render to an offscreen surface. */ + localParameters.BackBufferWidth = primary->surface_desc.dwWidth; + localParameters.BackBufferHeight = primary->surface_desc.dwHeight; + localParameters.BackBufferFormat = PixelFormat_DD2WineD3D(&primary->surface_desc.u4.ddpfPixelFormat); + localParameters.BackBufferCount = (primary->surface_desc.dwFlags & DDSD_BACKBUFFERCOUNT) + ? primary->surface_desc.u5.dwBackBufferCount : 0; + localParameters.MultiSampleType = WINED3DMULTISAMPLE_NONE; + localParameters.MultiSampleQuality = 0; + localParameters.SwapEffect = WINED3DSWAPEFFECT_COPY; + localParameters.hDeviceWindow = window; + localParameters.Windowed = !(ddraw->cooperative_level & DDSCL_FULLSCREEN); + localParameters.EnableAutoDepthStencil = TRUE; + localParameters.AutoDepthStencilFormat = WINED3DFMT_D16_UNORM; + localParameters.Flags = 0; + localParameters.FullScreen_RefreshRateInHz = WINED3DPRESENT_RATE_DEFAULT; + localParameters.PresentationInterval = WINED3DPRESENT_INTERVAL_DEFAULT; + + /* Set this NOW, otherwise creating the depth stencil surface will cause a + * recursive loop until ram or emulated video memory is full. */ + ddraw->d3d_initialized = TRUE; + hr = IWineD3DDevice_Init3D(ddraw->wineD3DDevice, &localParameters); + if (FAILED(hr)) + { + ddraw->d3d_target = NULL; + ddraw->d3d_initialized = FALSE; + return hr; + } + + ddraw->declArraySize = 2; + ddraw->decls = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ddraw->decls) * ddraw->declArraySize); + if (!ddraw->decls) + { + ERR("Error allocating an array for the converted vertex decls.\n"); + ddraw->declArraySize = 0; + hr = IWineD3DDevice_Uninit3D(ddraw->wineD3DDevice, D3D7CB_DestroySwapChain); + return E_OUTOFMEMORY; + } + + TRACE("Successfully initialized 3D.\n"); + + return DD_OK; +} + +static HRESULT ddraw_create_gdi_swapchain(IDirectDrawImpl *ddraw, IDirectDrawSurfaceImpl *primary) +{ + WINED3DPRESENT_PARAMETERS presentation_parameters; + HWND window; + HRESULT hr; + + window = ddraw->dest_window; + + memset(&presentation_parameters, 0, sizeof(presentation_parameters)); + + /* Use the surface description for the device parameters, not the device + * settings. The application might render to an offscreen surface. */ + presentation_parameters.BackBufferWidth = primary->surface_desc.dwWidth; + presentation_parameters.BackBufferHeight = primary->surface_desc.dwHeight; + presentation_parameters.BackBufferFormat = PixelFormat_DD2WineD3D(&primary->surface_desc.u4.ddpfPixelFormat); + presentation_parameters.BackBufferCount = (primary->surface_desc.dwFlags & DDSD_BACKBUFFERCOUNT) + ? primary->surface_desc.u5.dwBackBufferCount : 0; + presentation_parameters.MultiSampleType = WINED3DMULTISAMPLE_NONE; + presentation_parameters.MultiSampleQuality = 0; + presentation_parameters.SwapEffect = WINED3DSWAPEFFECT_FLIP; + presentation_parameters.hDeviceWindow = window; + presentation_parameters.Windowed = !(ddraw->cooperative_level & DDSCL_FULLSCREEN); + presentation_parameters.EnableAutoDepthStencil = FALSE; /* Not on GDI swapchains */ + presentation_parameters.AutoDepthStencilFormat = 0; + presentation_parameters.Flags = 0; + presentation_parameters.FullScreen_RefreshRateInHz = WINED3DPRESENT_RATE_DEFAULT; + presentation_parameters.PresentationInterval = WINED3DPRESENT_INTERVAL_DEFAULT; + + ddraw->d3d_target = primary; + hr = IWineD3DDevice_InitGDI(ddraw->wineD3DDevice, &presentation_parameters); + ddraw->d3d_target = NULL; + if (FAILED(hr)) + { + WARN("Failed to initialize GDI ddraw implementation, hr %#x.\n", hr); + primary->wineD3DSwapChain = NULL; + } + + return hr; +} + /***************************************************************************** * IDirectDraw7::CreateSurface * @@ -2178,11 +2881,8 @@ CreateAdditionalSurfaces(IDirectDrawImpl *This, * DDERR_* if an error occurs * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface, - DDSURFACEDESC2 *DDSD, - IDirectDrawSurface7 **Surf, - IUnknown *UnkOuter) +static HRESULT CreateSurface(IDirectDraw7 *iface, + DDSURFACEDESC2 *DDSD, IDirectDrawSurface7 **Surf, IUnknown *UnkOuter) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; IDirectDrawSurfaceImpl *object = NULL; @@ -2192,7 +2892,8 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface, WINED3DDISPLAYMODE Mode; const DWORD sysvidmem = DDSCAPS_VIDEOMEMORY | DDSCAPS_SYSTEMMEMORY; - TRACE("(%p)->(%p,%p,%p)\n", This, DDSD, Surf, UnkOuter); + TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n", + iface, DDSD, Surf, UnkOuter); /* Some checks before we start */ if (TRACE_ON(ddraw)) @@ -2244,8 +2945,9 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface, return DDERR_NOEXCLUSIVEMODE; } - if(DDSD->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER)) { - WARN("Application tried to create an explicit front or back buffer\n"); + if((DDSD->ddsCaps.dwCaps & (DDSCAPS_BACKBUFFER | DDSCAPS_PRIMARYSURFACE)) == (DDSCAPS_BACKBUFFER | DDSCAPS_PRIMARYSURFACE)) + { + WARN("Application wanted to create back buffer primary surface\n"); LeaveCriticalSection(&ddraw_cs); return DDERR_INVALIDCAPS; } @@ -2436,10 +3138,10 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface, } /* Create the first surface */ - hr = IDirectDrawImpl_CreateNewSurface(This, &desc2, &object, 0); - if( hr != DD_OK) + hr = ddraw_create_surface(This, &desc2, &object, 0); + if (FAILED(hr)) { - ERR("IDirectDrawImpl_CreateNewSurface failed with %08x\n", hr); + WARN("ddraw_create_surface failed, hr %#x.\n", hr); LeaveCriticalSection(&ddraw_cs); return hr; } @@ -2520,11 +3222,11 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface, } TRACE("(%p) Attaching a D3DDevice, rendertarget = %p\n", This, target); - hr = IDirectDrawImpl_AttachD3DDevice(This, target); - if(hr != D3D_OK) + hr = ddraw_attach_d3d_device(This, target); + if (hr != D3D_OK) { IDirectDrawSurfaceImpl *release_surf; - ERR("IDirectDrawImpl_AttachD3DDevice failed, hr = %x\n", hr); + ERR("ddraw_attach_d3d_device failed, hr %#x\n", hr); *Surf = NULL; /* The before created surface structures are in an incomplete state here. @@ -2538,13 +3240,15 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface, { release_surf = object; object = object->complex_array[0]; - IDirectDrawSurfaceImpl_Destroy(release_surf); + ddraw_surface_destroy(release_surf); } LeaveCriticalSection(&ddraw_cs); return hr; } - } else if(!(This->d3d_initialized) && desc2.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) { - IDirectDrawImpl_CreateGDISwapChain(This, object); + } + else if(!(This->d3d_initialized) && desc2.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) + { + ddraw_create_gdi_swapchain(This, object); } /* Addref the ddraw interface to keep an reference for each surface */ @@ -2554,8 +3258,8 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface, /* Create a WineD3DTexture if a texture was requested */ if(desc2.ddsCaps.dwCaps & DDSCAPS_TEXTURE) { + enum wined3d_format_id Format; UINT levels; - WINED3DFORMAT Format; WINED3DPOOL Pool = WINED3DPOOL_DEFAULT; This->tex_root = object; @@ -2586,15 +3290,15 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface, */ if(desc2.ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP) { - hr = IWineD3DDevice_CreateCubeTexture(This->wineD3DDevice, DDSD->dwWidth /* Edgelength */, - levels, 0 /* usage */, Format, Pool, (IWineD3DCubeTexture **)&object->wineD3DTexture, - (IUnknown *)object, &ddraw_null_wined3d_parent_ops); + hr = IWineD3DDevice_CreateCubeTexture(This->wineD3DDevice, DDSD->dwWidth /* Edgelength */, levels, + 0 /* usage */, Format, Pool, object, &ddraw_null_wined3d_parent_ops, + (IWineD3DCubeTexture **)&object->wineD3DTexture); } else { hr = IWineD3DDevice_CreateTexture(This->wineD3DDevice, DDSD->dwWidth, DDSD->dwHeight, levels, - 0 /* usage */, Format, Pool, (IWineD3DTexture **)&object->wineD3DTexture, - (IUnknown *)object, &ddraw_null_wined3d_parent_ops); + 0 /* usage */, Format, Pool, object, &ddraw_null_wined3d_parent_ops, + (IWineD3DTexture **)&object->wineD3DTexture); } This->tex_root = NULL; } @@ -2603,6 +3307,201 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface, return hr; } +static HRESULT WINAPI ddraw7_CreateSurface(IDirectDraw7 *iface, + DDSURFACEDESC2 *surface_desc, IDirectDrawSurface7 **surface, IUnknown *outer_unknown) +{ + TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n", + iface, surface_desc, surface, outer_unknown); + + if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC2)) + { + WARN("Application supplied invalid surface descriptor\n"); + return DDERR_INVALIDPARAMS; + } + + if(surface_desc->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER)) + { + if (TRACE_ON(ddraw)) + { + TRACE(" (%p) Requesting surface desc :\n", iface); + DDRAW_dump_surface_desc(surface_desc); + } + + WARN("Application tried to create an explicit front or back buffer\n"); + return DDERR_INVALIDCAPS; + } + + return CreateSurface(iface, surface_desc, surface, outer_unknown); +} + +static HRESULT WINAPI ddraw4_CreateSurface(IDirectDraw4 *iface, + DDSURFACEDESC2 *surface_desc, IDirectDrawSurface4 **surface, IUnknown *outer_unknown) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw4(iface); + IDirectDrawSurfaceImpl *impl; + HRESULT hr; + + TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n", + iface, surface_desc, surface, outer_unknown); + + if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC2)) + { + WARN("Application supplied invalid surface descriptor\n"); + return DDERR_INVALIDPARAMS; + } + + if(surface_desc->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER)) + { + if (TRACE_ON(ddraw)) + { + TRACE(" (%p) Requesting surface desc :\n", iface); + DDRAW_dump_surface_desc(surface_desc); + } + + WARN("Application tried to create an explicit front or back buffer\n"); + return DDERR_INVALIDCAPS; + } + + hr = CreateSurface((IDirectDraw7 *)ddraw, surface_desc, (IDirectDrawSurface7 **)surface, outer_unknown); + impl = (IDirectDrawSurfaceImpl *)*surface; + if (SUCCEEDED(hr) && impl) + { + ddraw_set_surface_version(impl, 4); + IDirectDraw7_Release((IDirectDraw7 *)ddraw); + IDirectDraw4_AddRef(iface); + impl->ifaceToRelease = (IUnknown *)iface; + } + + return hr; +} + +static HRESULT WINAPI ddraw3_CreateSurface(IDirectDraw3 *iface, + DDSURFACEDESC *surface_desc, IDirectDrawSurface **surface, IUnknown *outer_unknown) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw3(iface); + IDirectDrawSurface7 *surface7; + IDirectDrawSurfaceImpl *impl; + HRESULT hr; + + TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n", + iface, surface_desc, surface, outer_unknown); + + if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC)) + { + WARN("Application supplied invalid surface descriptor\n"); + return DDERR_INVALIDPARAMS; + } + + if(surface_desc->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER)) + { + if (TRACE_ON(ddraw)) + { + TRACE(" (%p) Requesting surface desc :\n", iface); + DDRAW_dump_surface_desc((LPDDSURFACEDESC2)surface_desc); + } + + WARN("Application tried to create an explicit front or back buffer\n"); + return DDERR_INVALIDCAPS; + } + + hr = CreateSurface((IDirectDraw7 *)ddraw, (DDSURFACEDESC2 *)surface_desc, &surface7, outer_unknown); + if (FAILED(hr)) + { + *surface = NULL; + return hr; + } + + impl = (IDirectDrawSurfaceImpl *)surface7; + *surface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl; + ddraw_set_surface_version(impl, 3); + IDirectDraw7_Release((IDirectDraw7 *)ddraw); + IDirectDraw3_AddRef(iface); + impl->ifaceToRelease = (IUnknown *)iface; + + return hr; +} + +static HRESULT WINAPI ddraw2_CreateSurface(IDirectDraw2 *iface, + DDSURFACEDESC *surface_desc, IDirectDrawSurface **surface, IUnknown *outer_unknown) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw2(iface); + IDirectDrawSurface7 *surface7; + IDirectDrawSurfaceImpl *impl; + HRESULT hr; + + TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n", + iface, surface_desc, surface, outer_unknown); + + if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC)) + { + WARN("Application supplied invalid surface descriptor\n"); + return DDERR_INVALIDPARAMS; + } + + if(surface_desc->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER)) + { + if (TRACE_ON(ddraw)) + { + TRACE(" (%p) Requesting surface desc :\n", iface); + DDRAW_dump_surface_desc((LPDDSURFACEDESC2)surface_desc); + } + + WARN("Application tried to create an explicit front or back buffer\n"); + return DDERR_INVALIDCAPS; + } + + hr = CreateSurface((IDirectDraw7 *)ddraw, (DDSURFACEDESC2 *)surface_desc, &surface7, outer_unknown); + if (FAILED(hr)) + { + *surface = NULL; + return hr; + } + + impl = (IDirectDrawSurfaceImpl *)surface7; + *surface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl; + ddraw_set_surface_version(impl, 2); + IDirectDraw7_Release((IDirectDraw7 *)ddraw); + impl->ifaceToRelease = NULL; + + return hr; +} + +static HRESULT WINAPI ddraw1_CreateSurface(IDirectDraw *iface, + DDSURFACEDESC *surface_desc, IDirectDrawSurface **surface, IUnknown *outer_unknown) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw1(iface); + IDirectDrawSurface7 *surface7; + IDirectDrawSurfaceImpl *impl; + HRESULT hr; + + TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n", + iface, surface_desc, surface, outer_unknown); + + if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC)) + { + WARN("Application supplied invalid surface descriptor\n"); + return DDERR_INVALIDPARAMS; + } + + /* Remove front buffer flag, this causes failure in v7, and its added to normal + * primaries anyway. */ + surface_desc->ddsCaps.dwCaps &= ~DDSCAPS_FRONTBUFFER; + hr = CreateSurface((IDirectDraw7 *)ddraw, (DDSURFACEDESC2 *)surface_desc, &surface7, outer_unknown); + if (FAILED(hr)) + { + *surface = NULL; + return hr; + } + + impl = (IDirectDrawSurfaceImpl *)surface7; + *surface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl; + ddraw_set_surface_version(impl, 1); + IDirectDraw7_Release((IDirectDraw7 *)ddraw); + impl->ifaceToRelease = NULL; + + return hr; +} + #define DDENUMSURFACES_SEARCHTYPE (DDENUMSURFACES_CANBECREATED|DDENUMSURFACES_DOESEXIST) #define DDENUMSURFACES_MATCHTYPE (DDENUMSURFACES_ALL|DDENUMSURFACES_MATCH|DDENUMSURFACES_NOMATCH) @@ -2652,9 +3551,7 @@ Main_DirectDraw_DDPIXELFORMAT_Match(const DDPIXELFORMAT *requested, return TRUE; } -static BOOL -IDirectDrawImpl_DDSD_Match(const DDSURFACEDESC2* requested, - const DDSURFACEDESC2* provided) +static BOOL ddraw_match_surface_desc(const DDSURFACEDESC2 *requested, const DDSURFACEDESC2 *provided) { struct compare_info { @@ -2717,6 +3614,21 @@ IDirectDrawImpl_DDSD_Match(const DDSURFACEDESC2* requested, #undef DDENUMSURFACES_SEARCHTYPE #undef DDENUMSURFACES_MATCHTYPE +struct surfacescallback_context +{ + LPDDENUMSURFACESCALLBACK func; + void *context; +}; + +static HRESULT CALLBACK EnumSurfacesCallbackThunk(IDirectDrawSurface7 *surface, + DDSURFACEDESC2 *surface_desc, void *context) +{ + struct surfacescallback_context *cbcontext = context; + + return cbcontext->func((IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)surface)->IDirectDrawSurface3_vtbl, + (DDSURFACEDESC *)surface_desc, cbcontext->context); +} + /***************************************************************************** * IDirectDraw7::EnumSurfaces * @@ -2736,12 +3648,8 @@ IDirectDrawImpl_DDSD_Match(const DDSURFACEDESC2* requested, * DD_OK on success * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_EnumSurfaces(IDirectDraw7 *iface, - DWORD Flags, - DDSURFACEDESC2 *DDSD, - void *Context, - LPDDENUMSURFACESCALLBACK7 Callback) +static HRESULT WINAPI ddraw7_EnumSurfaces(IDirectDraw7 *iface, DWORD Flags, + DDSURFACEDESC2 *DDSD, void *Context, LPDDENUMSURFACESCALLBACK7 Callback) { /* The surface enumeration is handled by WineDDraw, * because it keeps track of all surfaces attached to @@ -2755,10 +3663,12 @@ IDirectDrawImpl_EnumSurfaces(IDirectDraw7 *iface, DDSURFACEDESC2 desc; struct list *entry, *entry2; + TRACE("iface %p, flags %#x, surface_desc %p, context %p, callback %p.\n", + iface, Flags, DDSD, Context, Callback); + all = Flags & DDENUMSURFACES_ALL; nomatch = Flags & DDENUMSURFACES_NOMATCH; - TRACE("(%p)->(%x,%p,%p,%p)\n", This, Flags, DDSD, Context, Callback); EnterCriticalSection(&ddraw_cs); if(!Callback) @@ -2771,7 +3681,7 @@ IDirectDrawImpl_EnumSurfaces(IDirectDraw7 *iface, LIST_FOR_EACH_SAFE(entry, entry2, &This->surface_list) { surf = LIST_ENTRY(entry, IDirectDrawSurfaceImpl, surface_list_entry); - if (all || (nomatch != IDirectDrawImpl_DDSD_Match(DDSD, &surf->surface_desc))) + if (all || (nomatch != ddraw_match_surface_desc(DDSD, &surf->surface_desc))) { desc = surf->surface_desc; IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)surf); @@ -2786,161 +3696,59 @@ IDirectDrawImpl_EnumSurfaces(IDirectDraw7 *iface, return DD_OK; } -static HRESULT WINAPI -findRenderTarget(IDirectDrawSurface7 *surface, - DDSURFACEDESC2 *desc, - void *ctx) +static HRESULT WINAPI ddraw4_EnumSurfaces(IDirectDraw4 *iface, DWORD flags, + DDSURFACEDESC2 *surface_desc, void *context, LPDDENUMSURFACESCALLBACK2 callback) { - IDirectDrawSurfaceImpl *surf = (IDirectDrawSurfaceImpl *)surface; - IDirectDrawSurfaceImpl **target = ctx; + TRACE("iface %p, flags %#x, surface_desc %p, context %p, callback %p.\n", + iface, flags, surface_desc, context, callback); - if(!surf->isRenderTarget) { - *target = surf; - IDirectDrawSurface7_Release(surface); - return DDENUMRET_CANCEL; - } - - /* Recurse into the surface tree */ - IDirectDrawSurface7_EnumAttachedSurfaces(surface, ctx, findRenderTarget); - - IDirectDrawSurface7_Release(surface); - if(*target) return DDENUMRET_CANCEL; - else return DDENUMRET_OK; /* Continue with the next neighbor surface */ + return ddraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw4(iface), + flags, surface_desc, context, (LPDDENUMSURFACESCALLBACK7)callback); } -static HRESULT IDirectDrawImpl_CreateGDISwapChain(IDirectDrawImpl *This, - IDirectDrawSurfaceImpl *primary) { - HRESULT hr; - WINED3DPRESENT_PARAMETERS presentation_parameters; - HWND window; +static HRESULT WINAPI ddraw3_EnumSurfaces(IDirectDraw3 *iface, DWORD flags, + DDSURFACEDESC *surface_desc, void *context, LPDDENUMSURFACESCALLBACK callback) +{ + struct surfacescallback_context cbcontext; - window = This->dest_window; + TRACE("iface %p, flags %#x, surface_desc %p, context %p, callback %p.\n", + iface, flags, surface_desc, context, callback); - memset(&presentation_parameters, 0, sizeof(presentation_parameters)); + cbcontext.func = callback; + cbcontext.context = context; - /* Use the surface description for the device parameters, not the - * Device settings. The app might render to an offscreen surface - */ - presentation_parameters.BackBufferWidth = primary->surface_desc.dwWidth; - presentation_parameters.BackBufferHeight = primary->surface_desc.dwHeight; - presentation_parameters.BackBufferFormat = PixelFormat_DD2WineD3D(&primary->surface_desc.u4.ddpfPixelFormat); - presentation_parameters.BackBufferCount = (primary->surface_desc.dwFlags & DDSD_BACKBUFFERCOUNT) ? primary->surface_desc.u5.dwBackBufferCount : 0; - presentation_parameters.MultiSampleType = WINED3DMULTISAMPLE_NONE; - presentation_parameters.MultiSampleQuality = 0; - presentation_parameters.SwapEffect = WINED3DSWAPEFFECT_FLIP; - presentation_parameters.hDeviceWindow = window; - presentation_parameters.Windowed = !(This->cooperative_level & DDSCL_FULLSCREEN); - presentation_parameters.EnableAutoDepthStencil = FALSE; /* Not on GDI swapchains */ - presentation_parameters.AutoDepthStencilFormat = 0; - presentation_parameters.Flags = 0; - presentation_parameters.FullScreen_RefreshRateInHz = WINED3DPRESENT_RATE_DEFAULT; /* Default rate: It's already set */ - presentation_parameters.PresentationInterval = WINED3DPRESENT_INTERVAL_DEFAULT; - - This->d3d_target = primary; - hr = IWineD3DDevice_InitGDI(This->wineD3DDevice, &presentation_parameters); - This->d3d_target = NULL; - - if (hr != D3D_OK) - { - FIXME("(%p) call to IWineD3DDevice_InitGDI failed\n", This); - primary->wineD3DSwapChain = NULL; - } - return hr; + return ddraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw3(iface), flags, + (DDSURFACEDESC2 *)surface_desc, &cbcontext, EnumSurfacesCallbackThunk); } -/***************************************************************************** - * IDirectDrawImpl_AttachD3DDevice - * - * Initializes the D3D capabilities of WineD3D - * - * Params: - * primary: The primary surface for D3D - * - * Returns - * DD_OK on success, - * DDERR_* otherwise - * - *****************************************************************************/ -static HRESULT -IDirectDrawImpl_AttachD3DDevice(IDirectDrawImpl *This, - IDirectDrawSurfaceImpl *primary) +static HRESULT WINAPI ddraw2_EnumSurfaces(IDirectDraw2 *iface, DWORD flags, + DDSURFACEDESC *surface_desc, void *context, LPDDENUMSURFACESCALLBACK callback) { - HRESULT hr; - HWND window = This->dest_window; + struct surfacescallback_context cbcontext; - WINED3DPRESENT_PARAMETERS localParameters; + TRACE("iface %p, flags %#x, surface_desc %p, context %p, callback %p.\n", + iface, flags, surface_desc, context, callback); - TRACE("(%p)->(%p)\n", This, primary); + cbcontext.func = callback; + cbcontext.context = context; - /* If there's no window, create a hidden window. WineD3D needs it */ - if(window == 0 || window == GetDesktopWindow()) - { - window = CreateWindowExA(0, This->classname, "Hidden D3D Window", - WS_DISABLED, 0, 0, - GetSystemMetrics(SM_CXSCREEN), - GetSystemMetrics(SM_CYSCREEN), - NULL, NULL, GetModuleHandleA(0), NULL); + return ddraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw2(iface), flags, + (DDSURFACEDESC2 *)surface_desc, &cbcontext, EnumSurfacesCallbackThunk); +} - ShowWindow(window, SW_HIDE); /* Just to be sure */ - WARN("(%p) No window for the Direct3DDevice, created a hidden window. HWND=%p\n", This, window); - } - else - { - TRACE("(%p) Using existing window %p for Direct3D rendering\n", This, window); - } - This->d3d_window = window; +static HRESULT WINAPI ddraw1_EnumSurfaces(IDirectDraw *iface, DWORD flags, + DDSURFACEDESC *surface_desc, void *context, LPDDENUMSURFACESCALLBACK callback) +{ + struct surfacescallback_context cbcontext; - /* Store the future Render Target surface */ - This->d3d_target = primary; + TRACE("iface %p, flags %#x, surface_desc %p, context %p, callback %p.\n", + iface, flags, surface_desc, context, callback); - /* Use the surface description for the device parameters, not the - * Device settings. The app might render to an offscreen surface - */ - localParameters.BackBufferWidth = primary->surface_desc.dwWidth; - localParameters.BackBufferHeight = primary->surface_desc.dwHeight; - localParameters.BackBufferFormat = PixelFormat_DD2WineD3D(&primary->surface_desc.u4.ddpfPixelFormat); - localParameters.BackBufferCount = (primary->surface_desc.dwFlags & DDSD_BACKBUFFERCOUNT) ? primary->surface_desc.u5.dwBackBufferCount : 0; - localParameters.MultiSampleType = WINED3DMULTISAMPLE_NONE; - localParameters.MultiSampleQuality = 0; - localParameters.SwapEffect = WINED3DSWAPEFFECT_COPY; - localParameters.hDeviceWindow = window; - localParameters.Windowed = !(This->cooperative_level & DDSCL_FULLSCREEN); - localParameters.EnableAutoDepthStencil = TRUE; - localParameters.AutoDepthStencilFormat = WINED3DFMT_D16_UNORM; - localParameters.Flags = 0; - localParameters.FullScreen_RefreshRateInHz = WINED3DPRESENT_RATE_DEFAULT; /* Default rate: It's already set */ - localParameters.PresentationInterval = WINED3DPRESENT_INTERVAL_DEFAULT; + cbcontext.func = callback; + cbcontext.context = context; - TRACE("Passing mode %d\n", localParameters.BackBufferFormat); - - /* Set this NOW, otherwise creating the depth stencil surface will cause a - * recursive loop until ram or emulated video memory is full - */ - This->d3d_initialized = TRUE; - - hr = IWineD3DDevice_Init3D(This->wineD3DDevice, &localParameters); - if(FAILED(hr)) - { - This->d3d_target = NULL; - This->d3d_initialized = FALSE; - return hr; - } - - This->declArraySize = 2; - This->decls = HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - sizeof(*This->decls) * This->declArraySize); - if(!This->decls) - { - ERR("Error allocating an array for the converted vertex decls\n"); - This->declArraySize = 0; - hr = IWineD3DDevice_Uninit3D(This->wineD3DDevice, D3D7CB_DestroySwapChain); - return E_OUTOFMEMORY; - } - - /* Create an Index Buffer parent */ - TRACE("(%p) Successfully initialized 3D\n", This); - return DD_OK; + return ddraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw1(iface), flags, + (DDSURFACEDESC2 *)surface_desc, &cbcontext, EnumSurfacesCallbackThunk); } /***************************************************************************** @@ -2964,7 +3772,10 @@ DirectDrawCreateClipper(DWORD Flags, IUnknown *UnkOuter) { IDirectDrawClipperImpl* object; - TRACE("(%08x,%p,%p)\n", Flags, Clipper, UnkOuter); + HRESULT hr; + + TRACE("flags %#x, clipper %p, outer_unknown %p.\n", + Flags, Clipper, UnkOuter); EnterCriticalSection(&ddraw_cs); if (UnkOuter != NULL) @@ -2987,16 +3798,16 @@ DirectDrawCreateClipper(DWORD Flags, return E_OUTOFMEMORY; } - object->lpVtbl = &IDirectDrawClipper_Vtbl; - object->ref = 1; - object->wineD3DClipper = pWineDirect3DCreateClipper((IUnknown *) object); - if(!object->wineD3DClipper) + hr = ddraw_clipper_init(object); + if (FAILED(hr)) { + WARN("Failed to initialize clipper, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); LeaveCriticalSection(&ddraw_cs); - return E_OUTOFMEMORY; + return hr; } + TRACE("Created clipper %p.\n", object); *Clipper = (IDirectDrawClipper *) object; LeaveCriticalSection(&ddraw_cs); return DD_OK; @@ -3008,17 +3819,51 @@ DirectDrawCreateClipper(DWORD Flags, * Creates a DDraw clipper. See DirectDrawCreateClipper for details * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_CreateClipper(IDirectDraw7 *iface, - DWORD Flags, - IDirectDrawClipper **Clipper, - IUnknown *UnkOuter) +static HRESULT WINAPI ddraw7_CreateClipper(IDirectDraw7 *iface, DWORD Flags, + IDirectDrawClipper **Clipper, IUnknown *UnkOuter) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%x,%p,%p)\n", This, Flags, Clipper, UnkOuter); + TRACE("iface %p, flags %#x, clipper %p, outer_unknown %p.\n", + iface, Flags, Clipper, UnkOuter); + return DirectDrawCreateClipper(Flags, Clipper, UnkOuter); } +static HRESULT WINAPI ddraw4_CreateClipper(IDirectDraw4 *iface, + DWORD flags, IDirectDrawClipper **clipper, IUnknown *outer_unknown) +{ + TRACE("iface %p, flags %#x, clipper %p, outer_unknown %p.\n", + iface, flags, clipper, outer_unknown); + + return ddraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw4(iface), flags, clipper, outer_unknown); +} + +static HRESULT WINAPI ddraw3_CreateClipper(IDirectDraw3 *iface, + DWORD flags, IDirectDrawClipper **clipper, IUnknown *outer_unknown) +{ + TRACE("iface %p, flags %#x, clipper %p, outer_unknown %p.\n", + iface, flags, clipper, outer_unknown); + + return ddraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw3(iface), flags, clipper, outer_unknown); +} + +static HRESULT WINAPI ddraw2_CreateClipper(IDirectDraw2 *iface, + DWORD flags, IDirectDrawClipper **clipper, IUnknown *outer_unknown) +{ + TRACE("iface %p, flags %#x, clipper %p, outer_unknown %p.\n", + iface, flags, clipper, outer_unknown); + + return ddraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw2(iface), flags, clipper, outer_unknown); +} + +static HRESULT WINAPI ddraw1_CreateClipper(IDirectDraw *iface, + DWORD flags, IDirectDrawClipper **clipper, IUnknown *outer_unknown) +{ + TRACE("iface %p, flags %#x, clipper %p, outer_unknown %p.\n", + iface, flags, clipper, outer_unknown); + + return ddraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw1(iface), flags, clipper, outer_unknown); +} + /***************************************************************************** * IDirectDraw7::CreatePalette * @@ -3036,17 +3881,15 @@ IDirectDrawImpl_CreateClipper(IDirectDraw7 *iface, * E_OUTOFMEMORY if allocating the object failed * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_CreatePalette(IDirectDraw7 *iface, - DWORD Flags, - PALETTEENTRY *ColorTable, - IDirectDrawPalette **Palette, - IUnknown *pUnkOuter) +static HRESULT WINAPI ddraw7_CreatePalette(IDirectDraw7 *iface, DWORD Flags, + PALETTEENTRY *ColorTable, IDirectDrawPalette **Palette, IUnknown *pUnkOuter) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; IDirectDrawPaletteImpl *object; - HRESULT hr = DDERR_GENERIC; - TRACE("(%p)->(%x,%p,%p,%p)\n", This, Flags, ColorTable, Palette, pUnkOuter); + HRESULT hr; + + TRACE("iface %p, flags %#x, color_table %p, palette %p, outer_unknown %p.\n", + iface, Flags, ColorTable, Palette, pUnkOuter); EnterCriticalSection(&ddraw_cs); if(pUnkOuter != NULL) @@ -3072,26 +3915,102 @@ IDirectDrawImpl_CreatePalette(IDirectDraw7 *iface, return E_OUTOFMEMORY; } - object->lpVtbl = &IDirectDrawPalette_Vtbl; - object->ref = 1; - object->ddraw_owner = This; - - hr = IWineD3DDevice_CreatePalette(This->wineD3DDevice, Flags, - ColorTable, &object->wineD3DPalette, (IUnknown *)object); - if(hr != DD_OK) + hr = ddraw_palette_init(object, This, Flags, ColorTable); + if (FAILED(hr)) { + WARN("Failed to initialize palette, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); LeaveCriticalSection(&ddraw_cs); return hr; } - IDirectDraw7_AddRef(iface); - object->ifaceToRelease = (IUnknown *) iface; + TRACE("Created palette %p.\n", object); *Palette = (IDirectDrawPalette *)object; LeaveCriticalSection(&ddraw_cs); return DD_OK; } +static HRESULT WINAPI ddraw4_CreatePalette(IDirectDraw4 *iface, DWORD flags, + PALETTEENTRY *entries, IDirectDrawPalette **palette, IUnknown *outer_unknown) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw4(iface); + HRESULT hr; + + TRACE("iface %p, flags %#x, entries %p, palette %p, outer_unknown %p.\n", + iface, flags, entries, palette, outer_unknown); + + hr = ddraw7_CreatePalette((IDirectDraw7 *)ddraw, flags, entries, palette, outer_unknown); + if (SUCCEEDED(hr) && *palette) + { + IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*palette; + IDirectDraw7_Release((IDirectDraw7 *)ddraw); + IDirectDraw4_AddRef(iface); + impl->ifaceToRelease = (IUnknown *)iface; + } + return hr; +} + +static HRESULT WINAPI ddraw3_CreatePalette(IDirectDraw3 *iface, DWORD flags, + PALETTEENTRY *entries, IDirectDrawPalette **palette, IUnknown *outer_unknown) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw3(iface); + HRESULT hr; + + TRACE("iface %p, flags %#x, entries %p, palette %p, outer_unknown %p.\n", + iface, flags, entries, palette, outer_unknown); + + hr = ddraw7_CreatePalette((IDirectDraw7 *)ddraw, flags, entries, palette, outer_unknown); + if (SUCCEEDED(hr) && *palette) + { + IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*palette; + IDirectDraw7_Release((IDirectDraw7 *)ddraw); + IDirectDraw4_AddRef(iface); + impl->ifaceToRelease = (IUnknown *)iface; + } + + return hr; +} + +static HRESULT WINAPI ddraw2_CreatePalette(IDirectDraw2 *iface, DWORD flags, + PALETTEENTRY *entries, IDirectDrawPalette **palette, IUnknown *outer_unknown) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw2(iface); + HRESULT hr; + + TRACE("iface %p, flags %#x, entries %p, palette %p, outer_unknown %p.\n", + iface, flags, entries, palette, outer_unknown); + + hr = ddraw7_CreatePalette((IDirectDraw7 *)ddraw, flags, entries, palette, outer_unknown); + if (SUCCEEDED(hr) && *palette) + { + IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*palette; + IDirectDraw7_Release((IDirectDraw7 *)ddraw); + impl->ifaceToRelease = NULL; + } + + return hr; +} + +static HRESULT WINAPI ddraw1_CreatePalette(IDirectDraw *iface, DWORD flags, + PALETTEENTRY *entries, IDirectDrawPalette **palette, IUnknown *outer_unknown) +{ + IDirectDrawImpl *ddraw = ddraw_from_ddraw1(iface); + HRESULT hr; + + TRACE("iface %p, flags %#x, entries %p, palette %p, outer_unknown %p.\n", + iface, flags, entries, palette, outer_unknown); + + hr = ddraw7_CreatePalette((IDirectDraw7 *)ddraw, flags, entries, palette, outer_unknown); + if (SUCCEEDED(hr) && *palette) + { + IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*palette; + IDirectDraw7_Release((IDirectDraw7 *)ddraw); + impl->ifaceToRelease = NULL; + } + + return hr; +} + /***************************************************************************** * IDirectDraw7::DuplicateSurface * @@ -3109,15 +4028,12 @@ IDirectDrawImpl_CreatePalette(IDirectDraw7 *iface, * See IDirectDraw7::CreateSurface * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawImpl_DuplicateSurface(IDirectDraw7 *iface, - IDirectDrawSurface7 *Src, - IDirectDrawSurface7 **Dest) +static HRESULT WINAPI ddraw7_DuplicateSurface(IDirectDraw7 *iface, + IDirectDrawSurface7 *Src, IDirectDrawSurface7 **Dest) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; IDirectDrawSurfaceImpl *Surf = (IDirectDrawSurfaceImpl *)Src; - FIXME("(%p)->(%p,%p)\n", This, Surf, Dest); + FIXME("iface %p, src %p, dst %p partial stub!\n", iface, Src, Dest); /* For now, simply create a new, independent surface */ return IDirectDraw7_CreateSurface(iface, @@ -3126,51 +4042,1378 @@ IDirectDrawImpl_DuplicateSurface(IDirectDraw7 *iface, NULL); } +static HRESULT WINAPI ddraw4_DuplicateSurface(IDirectDraw4 *iface, + IDirectDrawSurface4 *src, IDirectDrawSurface4 **dst) +{ + TRACE("iface %p, src %p, dst %p.\n", iface, src, dst); + + return ddraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw4(iface), + (IDirectDrawSurface7 *)src, (IDirectDrawSurface7 **)dst); +} + +static HRESULT WINAPI ddraw3_DuplicateSurface(IDirectDraw3 *iface, + IDirectDrawSurface *src, IDirectDrawSurface **dst) +{ + IDirectDrawSurface7 *src7, *dst7; + HRESULT hr; + + TRACE("iface %p, src %p, dst %p.\n", iface, src, dst); + src7 = (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)src); + hr = ddraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw3(iface), src7, &dst7); + if (FAILED(hr)) + return hr; + *dst = (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)dst7)->IDirectDrawSurface3_vtbl; + return hr; +} + +static HRESULT WINAPI ddraw2_DuplicateSurface(IDirectDraw2 *iface, + IDirectDrawSurface *src, IDirectDrawSurface **dst) +{ + IDirectDrawSurface7 *src7, *dst7; + HRESULT hr; + + TRACE("iface %p, src %p, dst %p.\n", iface, src, dst); + src7 = (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)src); + hr = ddraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw2(iface), src7, &dst7); + if (FAILED(hr)) + return hr; + *dst = (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)dst7)->IDirectDrawSurface3_vtbl; + return hr; +} + +static HRESULT WINAPI ddraw1_DuplicateSurface(IDirectDraw *iface, + IDirectDrawSurface *src, IDirectDrawSurface **dst) +{ + IDirectDrawSurface7 *src7, *dst7; + HRESULT hr; + + TRACE("iface %p, src %p, dst %p.\n", iface, src, dst); + src7 = (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)src); + hr = ddraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw1(iface), src7, &dst7); + if (FAILED(hr)) + return hr; + *dst = (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)dst7)->IDirectDrawSurface3_vtbl; + return hr; +} + +/***************************************************************************** + * IDirect3D7::EnumDevices + * + * The EnumDevices method for IDirect3D7. It enumerates all supported + * D3D7 devices. Currently the T&L, HAL and RGB devices are enumerated. + * + * Params: + * callback: Function to call for each enumerated device + * context: Pointer to pass back to the app + * + * Returns: + * D3D_OK, or the return value of the GetCaps call + * + *****************************************************************************/ +static HRESULT WINAPI d3d7_EnumDevices(IDirect3D7 *iface, LPD3DENUMDEVICESCALLBACK7 callback, void *context) +{ + char interface_name_tnl[] = "WINE Direct3D7 Hardware Transform and Lighting acceleration using WineD3D"; + char device_name_tnl[] = "Wine D3D7 T&L HAL"; + char interface_name_hal[] = "WINE Direct3D7 Hardware acceleration using WineD3D"; + char device_name_hal[] = "Wine D3D7 HAL"; + char interface_name_rgb[] = "WINE Direct3D7 RGB Software Emulation using WineD3D"; + char device_name_rgb[] = "Wine D3D7 RGB"; + + IDirectDrawImpl *ddraw = ddraw_from_d3d7(iface); + D3DDEVICEDESC7 device_desc7; + D3DDEVICEDESC device_desc1; + HRESULT hr; + + TRACE("iface %p, callback %p, context %p.\n", iface, callback, context); + + EnterCriticalSection(&ddraw_cs); + + hr = IDirect3DImpl_GetCaps(ddraw->wineD3D, &device_desc1, &device_desc7); + if (hr != D3D_OK) + { + LeaveCriticalSection(&ddraw_cs); + return hr; + } + callback(interface_name_tnl, device_name_tnl, &device_desc7, context); + + device_desc7.deviceGUID = IID_IDirect3DHALDevice; + callback(interface_name_hal, device_name_hal, &device_desc7, context); + + device_desc7.deviceGUID = IID_IDirect3DRGBDevice; + callback(interface_name_rgb, device_name_rgb, &device_desc7, context); + + TRACE("End of enumeration.\n"); + + LeaveCriticalSection(&ddraw_cs); + + return D3D_OK; +} + +/***************************************************************************** + * IDirect3D3::EnumDevices + * + * Enumerates all supported Direct3DDevice interfaces. This is the + * implementation for Direct3D 1 to Direc3D 3, Version 7 has its own. + * + * Version 1, 2 and 3 + * + * Params: + * callback: Application-provided routine to call for each enumerated device + * Context: Pointer to pass to the callback + * + * Returns: + * D3D_OK on success, + * The result of IDirect3DImpl_GetCaps if it failed + * + *****************************************************************************/ +static HRESULT WINAPI d3d3_EnumDevices(IDirect3D3 *iface, LPD3DENUMDEVICESCALLBACK callback, void *context) +{ + static CHAR wined3d_description[] = "Wine D3DDevice using WineD3D and OpenGL"; + + IDirectDrawImpl *ddraw = ddraw_from_d3d3(iface); + D3DDEVICEDESC device_desc1, hal_desc, hel_desc; + D3DDEVICEDESC7 device_desc7; + HRESULT hr; + + /* Some games (Motoracer 2 demo) have the bad idea to modify the device + * name string. Let's put the string in a sufficiently sized array in + * writable memory. */ + char device_name[50]; + strcpy(device_name,"Direct3D HEL"); + + TRACE("iface %p, callback %p, context %p.\n", iface, callback, context); + + EnterCriticalSection(&ddraw_cs); + + hr = IDirect3DImpl_GetCaps(ddraw->wineD3D, &device_desc1, &device_desc7); + if (hr != D3D_OK) + { + LeaveCriticalSection(&ddraw_cs); + return hr; + } + + /* Do I have to enumerate the reference id? Note from old d3d7: + * "It seems that enumerating the reference IID on Direct3D 1 games + * (AvP / Motoracer2) breaks them". So do not enumerate this iid in V1 + * + * There's a registry key HKLM\Software\Microsoft\Direct3D\Drivers, + * EnumReference which enables / disables enumerating the reference + * rasterizer. It's a DWORD, 0 means disabled, 2 means enabled. The + * enablerefrast.reg and disablerefrast.reg files in the DirectX 7.0 sdk + * demo directory suggest this. + * + * Some games(GTA 2) seem to use the second enumerated device, so I have + * to enumerate at least 2 devices. So enumerate the reference device to + * have 2 devices. + * + * Other games (Rollcage) tell emulation and hal device apart by certain + * flags. Rollcage expects D3DPTEXTURECAPS_POW2 to be set (yeah, it is a + * limitation flag), and it refuses all devices that have the perspective + * flag set. This way it refuses the emulation device, and HAL devices + * never have POW2 unset in d3d7 on windows. */ + if (ddraw->d3dversion != 1) + { + static CHAR reference_description[] = "RGB Direct3D emulation"; + + TRACE("Enumerating WineD3D D3DDevice interface.\n"); + hal_desc = device_desc1; + hel_desc = device_desc1; + /* The rgb device has the pow2 flag set in the hel caps, but not in the hal caps. */ + hal_desc.dpcLineCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 + | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); + hal_desc.dpcTriCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 + | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); + hr = callback((GUID *)&IID_IDirect3DRGBDevice, reference_description, + device_name, &hal_desc, &hel_desc, context); + if (hr != D3DENUMRET_OK) + { + TRACE("Application cancelled the enumeration.\n"); + LeaveCriticalSection(&ddraw_cs); + return D3D_OK; + } + } + + strcpy(device_name,"Direct3D HAL"); + + TRACE("Enumerating HAL Direct3D device.\n"); + hal_desc = device_desc1; + hel_desc = device_desc1; + /* The hal device does not have the pow2 flag set in hel, but in hal. */ + hel_desc.dpcLineCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 + | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); + hel_desc.dpcTriCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 + | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); + hr = callback((GUID *)&IID_IDirect3DHALDevice, wined3d_description, + device_name, &hal_desc, &hel_desc, context); + if (hr != D3DENUMRET_OK) + { + TRACE("Application cancelled the enumeration.\n"); + LeaveCriticalSection(&ddraw_cs); + return D3D_OK; + } + + TRACE("End of enumeration.\n"); + + LeaveCriticalSection(&ddraw_cs); + return D3D_OK; +} + +static HRESULT WINAPI d3d2_EnumDevices(IDirect3D2 *iface, LPD3DENUMDEVICESCALLBACK callback, void *context) +{ + TRACE("iface %p, callback %p, context %p.\n", iface, callback, context); + + return d3d3_EnumDevices((IDirect3D3 *)&ddraw_from_d3d2(iface)->IDirect3D3_vtbl, callback, context); +} + +static HRESULT WINAPI d3d1_EnumDevices(IDirect3D *iface, LPD3DENUMDEVICESCALLBACK callback, void *context) +{ + TRACE("iface %p, callback %p, context %p.\n", iface, callback, context); + + return d3d3_EnumDevices((IDirect3D3 *)&ddraw_from_d3d1(iface)->IDirect3D3_vtbl, callback, context); +} + +/***************************************************************************** + * IDirect3D3::CreateLight + * + * Creates an IDirect3DLight interface. This interface is used in + * Direct3D3 or earlier for lighting. In Direct3D7 it has been replaced + * by the DIRECT3DLIGHT7 structure. Wine's Direct3DLight implementation + * uses the IDirect3DDevice7 interface with D3D7 lights. + * + * Version 1, 2 and 3 + * + * Params: + * light: Address to store the new interface pointer + * outer_unknown: Basically for aggregation, but ddraw doesn't support it. + * Must be NULL + * + * Returns: + * D3D_OK on success + * DDERR_OUTOFMEMORY if memory allocation failed + * CLASS_E_NOAGGREGATION if outer_unknown != NULL + * + *****************************************************************************/ +static HRESULT WINAPI d3d3_CreateLight(IDirect3D3 *iface, IDirect3DLight **light, IUnknown *outer_unknown) +{ + IDirect3DLightImpl *object; + + TRACE("iface %p, light %p, outer_unknown %p.\n", iface, light, outer_unknown); + + if (outer_unknown) return CLASS_E_NOAGGREGATION; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate light memory.\n"); + return DDERR_OUTOFMEMORY; + } + + d3d_light_init(object, ddraw_from_d3d3(iface)); + + TRACE("Created light %p.\n", object); + *light = (IDirect3DLight *)object; + + return D3D_OK; +} + +static HRESULT WINAPI d3d2_CreateLight(IDirect3D2 *iface, IDirect3DLight **light, IUnknown *outer_unknown) +{ + TRACE("iface %p, light %p, outer_unknown %p.\n", iface, light, outer_unknown); + + return d3d3_CreateLight((IDirect3D3 *)&ddraw_from_d3d2(iface)->IDirect3D3_vtbl, light, outer_unknown); +} + +static HRESULT WINAPI d3d1_CreateLight(IDirect3D *iface, IDirect3DLight **light, IUnknown *outer_unknown) +{ + TRACE("iface %p, light %p, outer_unknown %p.\n", iface, light, outer_unknown); + + return d3d3_CreateLight((IDirect3D3 *)&ddraw_from_d3d1(iface)->IDirect3D3_vtbl, light, outer_unknown); +} + +/***************************************************************************** + * IDirect3D3::CreateMaterial + * + * Creates an IDirect3DMaterial interface. This interface is used by Direct3D3 + * and older versions. The IDirect3DMaterial implementation wraps its + * functionality to IDirect3DDevice7::SetMaterial and friends. + * + * Version 1, 2 and 3 + * + * Params: + * material: Address to store the new interface's pointer to + * outer_unknown: Basically for aggregation, but ddraw doesn't support it. + * Must be NULL + * + * Returns: + * D3D_OK on success + * DDERR_OUTOFMEMORY if memory allocation failed + * CLASS_E_NOAGGREGATION if outer_unknown != NULL + * + *****************************************************************************/ +static HRESULT WINAPI d3d3_CreateMaterial(IDirect3D3 *iface, IDirect3DMaterial3 **material, IUnknown *outer_unknown) +{ + IDirect3DMaterialImpl *object; + + TRACE("iface %p, material %p, outer_unknown %p.\n", iface, material, outer_unknown); + + if (outer_unknown) return CLASS_E_NOAGGREGATION; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate material memory.\n"); + return DDERR_OUTOFMEMORY; + } + + d3d_material_init(object, ddraw_from_d3d3(iface)); + + TRACE("Created material %p.\n", object); + *material = (IDirect3DMaterial3 *)object; + + return D3D_OK; +} + +static HRESULT WINAPI d3d2_CreateMaterial(IDirect3D2 *iface, IDirect3DMaterial2 **material, IUnknown *outer_unknown) +{ + IDirect3DMaterial3 *material3; + HRESULT hr; + + TRACE("iface %p, material %p, outer_unknown %p.\n", iface, material, outer_unknown); + + hr = d3d3_CreateMaterial((IDirect3D3 *)&ddraw_from_d3d2(iface)->IDirect3D3_vtbl, &material3, outer_unknown); + *material = material3 ? (IDirect3DMaterial2 *)&((IDirect3DMaterialImpl *)material3)->IDirect3DMaterial2_vtbl : NULL; + + TRACE("Returning material %p.\n", *material); + + return hr; +} + +static HRESULT WINAPI d3d1_CreateMaterial(IDirect3D *iface, IDirect3DMaterial **material, IUnknown *outer_unknown) +{ + IDirect3DMaterial3 *material3; + HRESULT hr; + + TRACE("iface %p, material %p, outer_unknown %p.\n", iface, material, outer_unknown); + + hr = d3d3_CreateMaterial((IDirect3D3 *)&ddraw_from_d3d1(iface)->IDirect3D3_vtbl, &material3, outer_unknown); + *material = material3 ? (IDirect3DMaterial *)&((IDirect3DMaterialImpl *)material3)->IDirect3DMaterial_vtbl : NULL; + + TRACE("Returning material %p.\n", *material); + + return hr; +} + +/***************************************************************************** + * IDirect3D3::CreateViewport + * + * Creates an IDirect3DViewport interface. This interface is used + * by Direct3D and earlier versions for Viewport management. In Direct3D7 + * it has been replaced by a viewport structure and + * IDirect3DDevice7::*Viewport. Wine's IDirect3DViewport implementation + * uses the IDirect3DDevice7 methods for its functionality + * + * Params: + * Viewport: Address to store the new interface pointer + * outer_unknown: Basically for aggregation, but ddraw doesn't support it. + * Must be NULL + * + * Returns: + * D3D_OK on success + * DDERR_OUTOFMEMORY if memory allocation failed + * CLASS_E_NOAGGREGATION if outer_unknown != NULL + * + *****************************************************************************/ +static HRESULT WINAPI d3d3_CreateViewport(IDirect3D3 *iface, IDirect3DViewport3 **viewport, IUnknown *outer_unknown) +{ + IDirect3DViewportImpl *object; + + TRACE("iface %p, viewport %p, outer_unknown %p.\n", iface, viewport, outer_unknown); + + if (outer_unknown) return CLASS_E_NOAGGREGATION; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate viewport memory.\n"); + return DDERR_OUTOFMEMORY; + } + + d3d_viewport_init(object, ddraw_from_d3d3(iface)); + + TRACE("Created viewport %p.\n", object); + *viewport = (IDirect3DViewport3 *)object; + + return D3D_OK; +} + +static HRESULT WINAPI d3d2_CreateViewport(IDirect3D2 *iface, IDirect3DViewport2 **viewport, IUnknown *outer_unknown) +{ + TRACE("iface %p, viewport %p, outer_unknown %p.\n", iface, viewport, outer_unknown); + + return d3d3_CreateViewport((IDirect3D3 *)&ddraw_from_d3d2(iface)->IDirect3D3_vtbl, + (IDirect3DViewport3 **)viewport, outer_unknown); +} + +static HRESULT WINAPI d3d1_CreateViewport(IDirect3D *iface, IDirect3DViewport **viewport, IUnknown *outer_unknown) +{ + TRACE("iface %p, viewport %p, outer_unknown %p.\n", iface, viewport, outer_unknown); + + return d3d3_CreateViewport((IDirect3D3 *)&ddraw_from_d3d1(iface)->IDirect3D3_vtbl, + (IDirect3DViewport3 **)viewport, outer_unknown); +} + +/***************************************************************************** + * IDirect3D3::FindDevice + * + * This method finds a device with the requested properties and returns a + * device description + * + * Verion 1, 2 and 3 + * Params: + * fds: Describes the requested device characteristics + * fdr: Returns the device description + * + * Returns: + * D3D_OK on success + * DDERR_INVALIDPARAMS if no device was found + * + *****************************************************************************/ +static HRESULT WINAPI d3d3_FindDevice(IDirect3D3 *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr) +{ + IDirectDrawImpl *ddraw = ddraw_from_d3d3(iface); + D3DDEVICEDESC7 desc7; + D3DDEVICEDESC desc1; + HRESULT hr; + + TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr); + + if (!fds || !fdr) return DDERR_INVALIDPARAMS; + + if (fds->dwSize != sizeof(D3DFINDDEVICESEARCH) + || fdr->dwSize != sizeof(D3DFINDDEVICERESULT)) + return DDERR_INVALIDPARAMS; + + if ((fds->dwFlags & D3DFDS_COLORMODEL) + && fds->dcmColorModel != D3DCOLOR_RGB) + { + WARN("Trying to request a non-RGB D3D color model. Not supported.\n"); + return DDERR_INVALIDPARAMS; /* No real idea what to return here :-) */ + } + + if (fds->dwFlags & D3DFDS_GUID) + { + TRACE("Trying to match guid %s.\n", debugstr_guid(&(fds->guid))); + if (!IsEqualGUID(&IID_D3DDEVICE_WineD3D, &fds->guid) + && !IsEqualGUID(&IID_IDirect3DHALDevice, &fds->guid) + && !IsEqualGUID(&IID_IDirect3DRGBDevice, &fds->guid)) + { + WARN("No match for this GUID.\n"); + return DDERR_NOTFOUND; + } + } + + /* Get the caps */ + hr = IDirect3DImpl_GetCaps(ddraw->wineD3D, &desc1, &desc7); + if (hr != D3D_OK) return hr; + + /* Now return our own GUID */ + fdr->guid = IID_D3DDEVICE_WineD3D; + fdr->ddHwDesc = desc1; + fdr->ddSwDesc = desc1; + + TRACE("Returning Wine's wined3d device with (undumped) capabilities.\n"); + + return D3D_OK; +} + +static HRESULT WINAPI d3d2_FindDevice(IDirect3D2 *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr) +{ + TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr); + + return d3d3_FindDevice((IDirect3D3 *)&ddraw_from_d3d2(iface)->IDirect3D3_vtbl, fds, fdr); +} + +static HRESULT WINAPI d3d1_FindDevice(IDirect3D *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr) +{ + TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr); + + return d3d3_FindDevice((IDirect3D3 *)&ddraw_from_d3d1(iface)->IDirect3D3_vtbl, fds, fdr); +} + +/***************************************************************************** + * IDirect3D7::CreateDevice + * + * Creates an IDirect3DDevice7 interface. + * + * Version 2, 3 and 7. IDirect3DDevice 1 interfaces are interfaces to + * DirectDraw surfaces and are created with + * IDirectDrawSurface::QueryInterface. This method uses CreateDevice to + * create the device object and QueryInterfaces for IDirect3DDevice + * + * Params: + * refiid: IID of the device to create + * Surface: Initial rendertarget + * Device: Address to return the interface pointer + * + * Returns: + * D3D_OK on success + * DDERR_OUTOFMEMORY if memory allocation failed + * DDERR_INVALIDPARAMS if a device exists already + * + *****************************************************************************/ +static HRESULT WINAPI d3d7_CreateDevice(IDirect3D7 *iface, REFCLSID riid, + IDirectDrawSurface7 *surface, IDirect3DDevice7 **device) +{ + IDirectDrawSurfaceImpl *target = (IDirectDrawSurfaceImpl *)surface; + IDirectDrawImpl *ddraw = ddraw_from_d3d7(iface); + IDirect3DDeviceImpl *object; + HRESULT hr; + + TRACE("iface %p, riid %s, surface %p, device %p.\n", iface, debugstr_guid(riid), surface, device); + + EnterCriticalSection(&ddraw_cs); + *device = NULL; + + /* Fail device creation if non-opengl surfaces are used. */ + if (ddraw->ImplType != SURFACE_OPENGL) + { + ERR("The application wants to create a Direct3D device, but non-opengl surfaces are set in the registry.\n"); + ERR("Please set the surface implementation to opengl or autodetection to allow 3D rendering.\n"); + + /* We only hit this path if a default surface is set in the registry. Incorrect autodetection + * is caught in CreateSurface or QueryInterface. */ + LeaveCriticalSection(&ddraw_cs); + return DDERR_NO3D; + } + + if (ddraw->d3ddevice) + { + FIXME("Only one Direct3D device per DirectDraw object supported.\n"); + LeaveCriticalSection(&ddraw_cs); + return DDERR_INVALIDPARAMS; + } + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate device memory.\n"); + LeaveCriticalSection(&ddraw_cs); + return DDERR_OUTOFMEMORY; + } + + hr = d3d_device_init(object, ddraw, target); + if (FAILED(hr)) + { + WARN("Failed to initialize device, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + LeaveCriticalSection(&ddraw_cs); + return hr; + } + + TRACE("Created device %p.\n", object); + *device = (IDirect3DDevice7 *)object; + + LeaveCriticalSection(&ddraw_cs); + return D3D_OK; +} + +static HRESULT WINAPI d3d3_CreateDevice(IDirect3D3 *iface, REFCLSID riid, + IDirectDrawSurface4 *surface, IDirect3DDevice3 **device, IUnknown *outer_unknown) +{ + HRESULT hr; + + TRACE("iface %p, riid %s, surface %p, device %p, outer_unknown %p.\n", + iface, debugstr_guid(riid), surface, device, outer_unknown); + + if (outer_unknown) return CLASS_E_NOAGGREGATION; + + hr = d3d7_CreateDevice((IDirect3D7 *)&ddraw_from_d3d3(iface)->IDirect3D7_vtbl, riid, + (IDirectDrawSurface7 *)surface, (IDirect3DDevice7 **)device); + if (*device) *device = (IDirect3DDevice3 *)&((IDirect3DDeviceImpl *)*device)->IDirect3DDevice3_vtbl; + + return hr; +} + +static HRESULT WINAPI d3d2_CreateDevice(IDirect3D2 *iface, REFCLSID riid, + IDirectDrawSurface *surface, IDirect3DDevice2 **device) +{ + HRESULT hr; + + TRACE("iface %p, riid %s, surface %p, device %p.\n", + iface, debugstr_guid(riid), surface, device); + + hr = d3d7_CreateDevice((IDirect3D7 *)&ddraw_from_d3d2(iface)->IDirect3D7_vtbl, riid, + surface ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)surface) : NULL, + (IDirect3DDevice7 **)device); + if (*device) *device = (IDirect3DDevice2 *)&((IDirect3DDeviceImpl *)*device)->IDirect3DDevice2_vtbl; + + return hr; +} + +/***************************************************************************** + * IDirect3D7::CreateVertexBuffer + * + * Creates a new vertex buffer object and returns a IDirect3DVertexBuffer7 + * interface. + * + * Version 3 and 7 + * + * Params: + * desc: Requested Vertex buffer properties + * vertex_buffer: Address to return the interface pointer at + * flags: Some flags, should be 0 + * + * Returns + * D3D_OK on success + * DDERR_OUTOFMEMORY if memory allocation failed + * The return value of IWineD3DDevice::CreateVertexBuffer if this call fails + * DDERR_INVALIDPARAMS if desc or vertex_buffer are NULL + * + *****************************************************************************/ +static HRESULT WINAPI d3d7_CreateVertexBuffer(IDirect3D7 *iface, D3DVERTEXBUFFERDESC *desc, + IDirect3DVertexBuffer7 **vertex_buffer, DWORD flags) +{ + IDirect3DVertexBufferImpl *object; + HRESULT hr; + + TRACE("iface %p, desc %p, vertex_buffer %p, flags %#x.\n", + iface, desc, vertex_buffer, flags); + + if (!vertex_buffer || !desc) return DDERR_INVALIDPARAMS; + + TRACE("Vertex buffer description:\n"); + TRACE(" dwSize %u\n", desc->dwSize); + TRACE(" dwCaps %#x\n", desc->dwCaps); + TRACE(" FVF %#x\n", desc->dwFVF); + TRACE(" dwNumVertices %u\n", desc->dwNumVertices); + + /* Now create the vertex buffer */ + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate vertex buffer memory.\n"); + return DDERR_OUTOFMEMORY; + } + + hr = d3d_vertex_buffer_init(object, ddraw_from_d3d7(iface), desc); + if (FAILED(hr)) + { + WARN("Failed to initialize vertex buffer, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created vertex buffer %p.\n", object); + *vertex_buffer = (IDirect3DVertexBuffer7 *)object; + + return D3D_OK; +} + +static HRESULT WINAPI d3d3_CreateVertexBuffer(IDirect3D3 *iface, D3DVERTEXBUFFERDESC *desc, + IDirect3DVertexBuffer **vertex_buffer, DWORD flags, IUnknown *outer_unknown) +{ + IDirectDrawImpl *This = ddraw_from_d3d3(iface); + HRESULT hr; + + TRACE("iface %p, desc %p, vertex_buffer %p, flags %#x, outer_unknown %p.\n", + iface, desc, vertex_buffer, flags, outer_unknown); + + if (outer_unknown) return CLASS_E_NOAGGREGATION; + + hr = d3d7_CreateVertexBuffer((IDirect3D7 *)&This->IDirect3D7_vtbl, + desc, (IDirect3DVertexBuffer7 **)vertex_buffer, flags); + if (*vertex_buffer) + *vertex_buffer = (IDirect3DVertexBuffer *)&((IDirect3DVertexBufferImpl *)*vertex_buffer)->IDirect3DVertexBuffer_vtbl; + + return hr; +} + +/***************************************************************************** + * IDirect3D7::EnumZBufferFormats + * + * Enumerates all supported Z buffer pixel formats + * + * Version 3 and 7 + * + * Params: + * device_iid: + * callback: callback to call for each pixel format + * context: Pointer to pass back to the callback + * + * Returns: + * D3D_OK on success + * DDERR_INVALIDPARAMS if callback is NULL + * For details, see IWineD3DDevice::EnumZBufferFormats + * + *****************************************************************************/ +static HRESULT WINAPI d3d7_EnumZBufferFormats(IDirect3D7 *iface, REFCLSID device_iid, + LPD3DENUMPIXELFORMATSCALLBACK callback, void *context) +{ + IDirectDrawImpl *ddraw = ddraw_from_d3d7(iface); + WINED3DDISPLAYMODE d3ddm; + WINED3DDEVTYPE type; + unsigned int i; + HRESULT hr; + + /* Order matters. Specifically, BattleZone II (full version) expects the + * 16-bit depth formats to be listed before the 24 and 32 ones. */ + static const enum wined3d_format_id formats[] = + { + WINED3DFMT_S1_UINT_D15_UNORM, + WINED3DFMT_D16_UNORM, + WINED3DFMT_X8D24_UNORM, + WINED3DFMT_S4X4_UINT_D24_UNORM, + WINED3DFMT_D24_UNORM_S8_UINT, + WINED3DFMT_D32_UNORM, + }; + + TRACE("iface %p, device_iid %s, callback %p, context %p.\n", + iface, debugstr_guid(device_iid), callback, context); + + if (!callback) return DDERR_INVALIDPARAMS; + + if (IsEqualGUID(device_iid, &IID_IDirect3DHALDevice) + || IsEqualGUID(device_iid, &IID_IDirect3DTnLHalDevice) + || IsEqualGUID(device_iid, &IID_D3DDEVICE_WineD3D)) + { + TRACE("Asked for HAL device.\n"); + type = WINED3DDEVTYPE_HAL; + } + else if (IsEqualGUID(device_iid, &IID_IDirect3DRGBDevice) + || IsEqualGUID(device_iid, &IID_IDirect3DMMXDevice)) + { + TRACE("Asked for SW device.\n"); + type = WINED3DDEVTYPE_SW; + } + else if (IsEqualGUID(device_iid, &IID_IDirect3DRefDevice)) + { + TRACE("Asked for REF device.\n"); + type = WINED3DDEVTYPE_REF; + } + else if (IsEqualGUID(device_iid, &IID_IDirect3DNullDevice)) + { + TRACE("Asked for NULLREF device.\n"); + type = WINED3DDEVTYPE_NULLREF; + } + else + { + FIXME("Unexpected device GUID %s.\n", debugstr_guid(device_iid)); + type = WINED3DDEVTYPE_HAL; + } + + EnterCriticalSection(&ddraw_cs); + /* We need an adapter format from somewhere to please wined3d and WGL. + * Use the current display mode. So far all cards offer the same depth + * stencil format for all modes, but if some do not and applications do + * not like that we'll have to find some workaround, like iterating over + * all imaginable formats and collecting all the depth stencil formats we + * can get. */ + hr = IWineD3DDevice_GetDisplayMode(ddraw->wineD3DDevice, 0, &d3ddm); + + for (i = 0; i < (sizeof(formats) / sizeof(*formats)); ++i) + { + hr = IWineD3D_CheckDeviceFormat(ddraw->wineD3D, WINED3DADAPTER_DEFAULT, type, d3ddm.Format, + WINED3DUSAGE_DEPTHSTENCIL, WINED3DRTYPE_SURFACE, formats[i], SURFACE_OPENGL); + if (SUCCEEDED(hr)) + { + DDPIXELFORMAT pformat; + + memset(&pformat, 0, sizeof(pformat)); + pformat.dwSize = sizeof(pformat); + PixelFormat_WineD3DtoDD(&pformat, formats[i]); + + TRACE("Enumerating wined3d format %#x.\n", formats[i]); + hr = callback(&pformat, context); + if (hr != DDENUMRET_OK) + { + TRACE("Format enumeration cancelled by application.\n"); + LeaveCriticalSection(&ddraw_cs); + return D3D_OK; + } + } + } + TRACE("End of enumeration.\n"); + + LeaveCriticalSection(&ddraw_cs); + return D3D_OK; +} + +static HRESULT WINAPI d3d3_EnumZBufferFormats(IDirect3D3 *iface, REFCLSID device_iid, + LPD3DENUMPIXELFORMATSCALLBACK callback, void *context) +{ + TRACE("iface %p, device_iid %s, callback %p, context %p.\n", + iface, debugstr_guid(device_iid), callback, context); + + return d3d7_EnumZBufferFormats((IDirect3D7 *)&ddraw_from_d3d3(iface)->IDirect3D7_vtbl, + device_iid, callback, context); +} + +/***************************************************************************** + * IDirect3D7::EvictManagedTextures + * + * Removes all managed textures (=surfaces with DDSCAPS2_TEXTUREMANAGE or + * DDSCAPS2_D3DTEXTUREMANAGE caps) to be removed from video memory. + * + * Version 3 and 7 + * + * Returns: + * D3D_OK, because it's a stub + * + *****************************************************************************/ +static HRESULT WINAPI d3d7_EvictManagedTextures(IDirect3D7 *iface) +{ + FIXME("iface %p stub!\n", iface); + + /* TODO: Just enumerate resources using IWineD3DDevice_EnumResources(), + * then unload surfaces / textures. */ + + return D3D_OK; +} + +static HRESULT WINAPI d3d3_EvictManagedTextures(IDirect3D3 *iface) +{ + TRACE("iface %p.\n", iface); + + return d3d7_EvictManagedTextures((IDirect3D7 *)&ddraw_from_d3d3(iface)->IDirect3D7_vtbl); +} + +/***************************************************************************** + * IDirect3DImpl_GetCaps + * + * This function retrieves the device caps from wined3d + * and converts it into a D3D7 and D3D - D3D3 structure + * This is a helper function called from various places in ddraw + * + * Params: + * wined3d: The interface to get the caps from + * desc1: Old D3D <3 structure to fill (needed) + * desc7: D3D7 device desc structure to fill (needed) + * + * Returns + * D3D_OK on success, or the return value of IWineD3D::GetCaps + * + *****************************************************************************/ +HRESULT IDirect3DImpl_GetCaps(IWineD3D *wined3d, D3DDEVICEDESC *desc1, D3DDEVICEDESC7 *desc7) +{ + WINED3DCAPS wined3d_caps; + HRESULT hr; + + TRACE("wined3d %p, desc1 %p, desc7 %p.\n", wined3d, desc1, desc7); + + memset(&wined3d_caps, 0, sizeof(wined3d_caps)); + + EnterCriticalSection(&ddraw_cs); + hr = IWineD3D_GetDeviceCaps(wined3d, 0, WINED3DDEVTYPE_HAL, &wined3d_caps); + LeaveCriticalSection(&ddraw_cs); + if (FAILED(hr)) + { + WARN("Failed to get device caps, hr %#x.\n", hr); + return hr; + } + + /* Copy the results into the d3d7 and d3d3 structures */ + desc7->dwDevCaps = wined3d_caps.DevCaps; + desc7->dpcLineCaps.dwMiscCaps = wined3d_caps.PrimitiveMiscCaps; + desc7->dpcLineCaps.dwRasterCaps = wined3d_caps.RasterCaps; + desc7->dpcLineCaps.dwZCmpCaps = wined3d_caps.ZCmpCaps; + desc7->dpcLineCaps.dwSrcBlendCaps = wined3d_caps.SrcBlendCaps; + desc7->dpcLineCaps.dwDestBlendCaps = wined3d_caps.DestBlendCaps; + desc7->dpcLineCaps.dwAlphaCmpCaps = wined3d_caps.AlphaCmpCaps; + desc7->dpcLineCaps.dwShadeCaps = wined3d_caps.ShadeCaps; + desc7->dpcLineCaps.dwTextureCaps = wined3d_caps.TextureCaps; + desc7->dpcLineCaps.dwTextureFilterCaps = wined3d_caps.TextureFilterCaps; + desc7->dpcLineCaps.dwTextureAddressCaps = wined3d_caps.TextureAddressCaps; + + desc7->dwMaxTextureWidth = wined3d_caps.MaxTextureWidth; + desc7->dwMaxTextureHeight = wined3d_caps.MaxTextureHeight; + + desc7->dwMaxTextureRepeat = wined3d_caps.MaxTextureRepeat; + desc7->dwMaxTextureAspectRatio = wined3d_caps.MaxTextureAspectRatio; + desc7->dwMaxAnisotropy = wined3d_caps.MaxAnisotropy; + desc7->dvMaxVertexW = wined3d_caps.MaxVertexW; + + desc7->dvGuardBandLeft = wined3d_caps.GuardBandLeft; + desc7->dvGuardBandTop = wined3d_caps.GuardBandTop; + desc7->dvGuardBandRight = wined3d_caps.GuardBandRight; + desc7->dvGuardBandBottom = wined3d_caps.GuardBandBottom; + + desc7->dvExtentsAdjust = wined3d_caps.ExtentsAdjust; + desc7->dwStencilCaps = wined3d_caps.StencilCaps; + + desc7->dwFVFCaps = wined3d_caps.FVFCaps; + desc7->dwTextureOpCaps = wined3d_caps.TextureOpCaps; + + desc7->dwVertexProcessingCaps = wined3d_caps.VertexProcessingCaps; + desc7->dwMaxActiveLights = wined3d_caps.MaxActiveLights; + + /* Remove all non-d3d7 caps */ + desc7->dwDevCaps &= ( + D3DDEVCAPS_FLOATTLVERTEX | D3DDEVCAPS_SORTINCREASINGZ | D3DDEVCAPS_SORTDECREASINGZ | + D3DDEVCAPS_SORTEXACT | D3DDEVCAPS_EXECUTESYSTEMMEMORY | D3DDEVCAPS_EXECUTEVIDEOMEMORY | + D3DDEVCAPS_TLVERTEXSYSTEMMEMORY | D3DDEVCAPS_TLVERTEXVIDEOMEMORY | D3DDEVCAPS_TEXTURESYSTEMMEMORY | + D3DDEVCAPS_TEXTUREVIDEOMEMORY | D3DDEVCAPS_DRAWPRIMTLVERTEX | D3DDEVCAPS_CANRENDERAFTERFLIP | + D3DDEVCAPS_TEXTURENONLOCALVIDMEM | D3DDEVCAPS_DRAWPRIMITIVES2 | D3DDEVCAPS_SEPARATETEXTUREMEMORIES | + D3DDEVCAPS_DRAWPRIMITIVES2EX | D3DDEVCAPS_HWTRANSFORMANDLIGHT | D3DDEVCAPS_CANBLTSYSTONONLOCAL | + D3DDEVCAPS_HWRASTERIZATION); + + desc7->dwStencilCaps &= ( + D3DSTENCILCAPS_KEEP | D3DSTENCILCAPS_ZERO | D3DSTENCILCAPS_REPLACE | + D3DSTENCILCAPS_INCRSAT | D3DSTENCILCAPS_DECRSAT | D3DSTENCILCAPS_INVERT | + D3DSTENCILCAPS_INCR | D3DSTENCILCAPS_DECR); + + /* FVF caps ?*/ + + desc7->dwTextureOpCaps &= ( + D3DTEXOPCAPS_DISABLE | D3DTEXOPCAPS_SELECTARG1 | D3DTEXOPCAPS_SELECTARG2 | + D3DTEXOPCAPS_MODULATE | D3DTEXOPCAPS_MODULATE2X | D3DTEXOPCAPS_MODULATE4X | + D3DTEXOPCAPS_ADD | D3DTEXOPCAPS_ADDSIGNED | D3DTEXOPCAPS_ADDSIGNED2X | + D3DTEXOPCAPS_SUBTRACT | D3DTEXOPCAPS_ADDSMOOTH | D3DTEXOPCAPS_BLENDTEXTUREALPHA | + D3DTEXOPCAPS_BLENDFACTORALPHA | D3DTEXOPCAPS_BLENDTEXTUREALPHAPM | D3DTEXOPCAPS_BLENDCURRENTALPHA | + D3DTEXOPCAPS_PREMODULATE | D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR | D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA | + D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR | D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA | D3DTEXOPCAPS_BUMPENVMAP | + D3DTEXOPCAPS_BUMPENVMAPLUMINANCE | D3DTEXOPCAPS_DOTPRODUCT3); + + desc7->dwVertexProcessingCaps &= ( + D3DVTXPCAPS_TEXGEN | D3DVTXPCAPS_MATERIALSOURCE7 | D3DVTXPCAPS_VERTEXFOG | + D3DVTXPCAPS_DIRECTIONALLIGHTS | D3DVTXPCAPS_POSITIONALLIGHTS | D3DVTXPCAPS_LOCALVIEWER); + + desc7->dpcLineCaps.dwMiscCaps &= ( + D3DPMISCCAPS_MASKPLANES | D3DPMISCCAPS_MASKZ | D3DPMISCCAPS_LINEPATTERNREP | + D3DPMISCCAPS_CONFORMANT | D3DPMISCCAPS_CULLNONE | D3DPMISCCAPS_CULLCW | + D3DPMISCCAPS_CULLCCW); + + desc7->dpcLineCaps.dwRasterCaps &= ( + D3DPRASTERCAPS_DITHER | D3DPRASTERCAPS_ROP2 | D3DPRASTERCAPS_XOR | + D3DPRASTERCAPS_PAT | D3DPRASTERCAPS_ZTEST | D3DPRASTERCAPS_SUBPIXEL | + D3DPRASTERCAPS_SUBPIXELX | D3DPRASTERCAPS_FOGVERTEX | D3DPRASTERCAPS_FOGTABLE | + D3DPRASTERCAPS_STIPPLE | D3DPRASTERCAPS_ANTIALIASSORTDEPENDENT | D3DPRASTERCAPS_ANTIALIASSORTINDEPENDENT | + D3DPRASTERCAPS_ANTIALIASEDGES | D3DPRASTERCAPS_MIPMAPLODBIAS | D3DPRASTERCAPS_ZBIAS | + D3DPRASTERCAPS_ZBUFFERLESSHSR | D3DPRASTERCAPS_FOGRANGE | D3DPRASTERCAPS_ANISOTROPY | + D3DPRASTERCAPS_WBUFFER | D3DPRASTERCAPS_TRANSLUCENTSORTINDEPENDENT | D3DPRASTERCAPS_WFOG | + D3DPRASTERCAPS_ZFOG); + + desc7->dpcLineCaps.dwZCmpCaps &= ( + D3DPCMPCAPS_NEVER | D3DPCMPCAPS_LESS | D3DPCMPCAPS_EQUAL | + D3DPCMPCAPS_LESSEQUAL | D3DPCMPCAPS_GREATER | D3DPCMPCAPS_NOTEQUAL | + D3DPCMPCAPS_GREATEREQUAL | D3DPCMPCAPS_ALWAYS); + + desc7->dpcLineCaps.dwSrcBlendCaps &= ( + D3DPBLENDCAPS_ZERO | D3DPBLENDCAPS_ONE | D3DPBLENDCAPS_SRCCOLOR | + D3DPBLENDCAPS_INVSRCCOLOR | D3DPBLENDCAPS_SRCALPHA | D3DPBLENDCAPS_INVSRCALPHA | + D3DPBLENDCAPS_DESTALPHA | D3DPBLENDCAPS_INVDESTALPHA | D3DPBLENDCAPS_DESTCOLOR | + D3DPBLENDCAPS_INVDESTCOLOR | D3DPBLENDCAPS_SRCALPHASAT | D3DPBLENDCAPS_BOTHSRCALPHA | + D3DPBLENDCAPS_BOTHINVSRCALPHA); + + desc7->dpcLineCaps.dwDestBlendCaps &= ( + D3DPBLENDCAPS_ZERO | D3DPBLENDCAPS_ONE | D3DPBLENDCAPS_SRCCOLOR | + D3DPBLENDCAPS_INVSRCCOLOR | D3DPBLENDCAPS_SRCALPHA | D3DPBLENDCAPS_INVSRCALPHA | + D3DPBLENDCAPS_DESTALPHA | D3DPBLENDCAPS_INVDESTALPHA | D3DPBLENDCAPS_DESTCOLOR | + D3DPBLENDCAPS_INVDESTCOLOR | D3DPBLENDCAPS_SRCALPHASAT | D3DPBLENDCAPS_BOTHSRCALPHA | + D3DPBLENDCAPS_BOTHINVSRCALPHA); + + desc7->dpcLineCaps.dwAlphaCmpCaps &= ( + D3DPCMPCAPS_NEVER | D3DPCMPCAPS_LESS | D3DPCMPCAPS_EQUAL | + D3DPCMPCAPS_LESSEQUAL | D3DPCMPCAPS_GREATER | D3DPCMPCAPS_NOTEQUAL | + D3DPCMPCAPS_GREATEREQUAL | D3DPCMPCAPS_ALWAYS); + + desc7->dpcLineCaps.dwShadeCaps &= ( + D3DPSHADECAPS_COLORFLATMONO | D3DPSHADECAPS_COLORFLATRGB | D3DPSHADECAPS_COLORGOURAUDMONO | + D3DPSHADECAPS_COLORGOURAUDRGB | D3DPSHADECAPS_COLORPHONGMONO | D3DPSHADECAPS_COLORPHONGRGB | + D3DPSHADECAPS_SPECULARFLATMONO | D3DPSHADECAPS_SPECULARFLATRGB | D3DPSHADECAPS_SPECULARGOURAUDMONO | + D3DPSHADECAPS_SPECULARGOURAUDRGB | D3DPSHADECAPS_SPECULARPHONGMONO | D3DPSHADECAPS_SPECULARPHONGRGB | + D3DPSHADECAPS_ALPHAFLATBLEND | D3DPSHADECAPS_ALPHAFLATSTIPPLED | D3DPSHADECAPS_ALPHAGOURAUDBLEND | + D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED | D3DPSHADECAPS_ALPHAPHONGBLEND | D3DPSHADECAPS_ALPHAPHONGSTIPPLED | + D3DPSHADECAPS_FOGFLAT | D3DPSHADECAPS_FOGGOURAUD | D3DPSHADECAPS_FOGPHONG); + + desc7->dpcLineCaps.dwTextureCaps &= ( + D3DPTEXTURECAPS_PERSPECTIVE | D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_ALPHA | + D3DPTEXTURECAPS_TRANSPARENCY | D3DPTEXTURECAPS_BORDER | D3DPTEXTURECAPS_SQUAREONLY | + D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE | D3DPTEXTURECAPS_ALPHAPALETTE| D3DPTEXTURECAPS_NONPOW2CONDITIONAL | + D3DPTEXTURECAPS_PROJECTED | D3DPTEXTURECAPS_CUBEMAP | D3DPTEXTURECAPS_COLORKEYBLEND); + + desc7->dpcLineCaps.dwTextureFilterCaps &= ( + D3DPTFILTERCAPS_NEAREST | D3DPTFILTERCAPS_LINEAR | D3DPTFILTERCAPS_MIPNEAREST | + D3DPTFILTERCAPS_MIPLINEAR | D3DPTFILTERCAPS_LINEARMIPNEAREST | D3DPTFILTERCAPS_LINEARMIPLINEAR | + D3DPTFILTERCAPS_MINFPOINT | D3DPTFILTERCAPS_MINFLINEAR | D3DPTFILTERCAPS_MINFANISOTROPIC | + D3DPTFILTERCAPS_MIPFPOINT | D3DPTFILTERCAPS_MIPFLINEAR | D3DPTFILTERCAPS_MAGFPOINT | + D3DPTFILTERCAPS_MAGFLINEAR | D3DPTFILTERCAPS_MAGFANISOTROPIC | D3DPTFILTERCAPS_MAGFAFLATCUBIC | + D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC); + + desc7->dpcLineCaps.dwTextureBlendCaps &= ( + D3DPTBLENDCAPS_DECAL | D3DPTBLENDCAPS_MODULATE | D3DPTBLENDCAPS_DECALALPHA | + D3DPTBLENDCAPS_MODULATEALPHA | D3DPTBLENDCAPS_DECALMASK | D3DPTBLENDCAPS_MODULATEMASK | + D3DPTBLENDCAPS_COPY | D3DPTBLENDCAPS_ADD); + + desc7->dpcLineCaps.dwTextureAddressCaps &= ( + D3DPTADDRESSCAPS_WRAP | D3DPTADDRESSCAPS_MIRROR | D3DPTADDRESSCAPS_CLAMP | + D3DPTADDRESSCAPS_BORDER | D3DPTADDRESSCAPS_INDEPENDENTUV); + + if (!(desc7->dpcLineCaps.dwTextureCaps & D3DPTEXTURECAPS_POW2)) + { + /* DirectX7 always has the np2 flag set, no matter what the card + * supports. Some old games (Rollcage) check the caps incorrectly. + * If wined3d supports nonpow2 textures it also has np2 conditional + * support. */ + desc7->dpcLineCaps.dwTextureCaps |= D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_NONPOW2CONDITIONAL; + } + + /* Fill the missing members, and do some fixup */ + desc7->dpcLineCaps.dwSize = sizeof(desc7->dpcLineCaps); + desc7->dpcLineCaps.dwTextureBlendCaps = D3DPTBLENDCAPS_ADD | D3DPTBLENDCAPS_MODULATEMASK | + D3DPTBLENDCAPS_COPY | D3DPTBLENDCAPS_DECAL | + D3DPTBLENDCAPS_DECALALPHA | D3DPTBLENDCAPS_DECALMASK | + D3DPTBLENDCAPS_MODULATE | D3DPTBLENDCAPS_MODULATEALPHA; + desc7->dpcLineCaps.dwStippleWidth = 32; + desc7->dpcLineCaps.dwStippleHeight = 32; + /* Use the same for the TriCaps */ + desc7->dpcTriCaps = desc7->dpcLineCaps; + + desc7->dwDeviceRenderBitDepth = DDBD_16 | DDBD_24 | DDBD_32; + desc7->dwDeviceZBufferBitDepth = DDBD_16 | DDBD_24; + desc7->dwMinTextureWidth = 1; + desc7->dwMinTextureHeight = 1; + + /* Convert DWORDs safely to WORDs */ + if (wined3d_caps.MaxTextureBlendStages > 0xffff) desc7->wMaxTextureBlendStages = 0xffff; + else desc7->wMaxTextureBlendStages = (WORD)wined3d_caps.MaxTextureBlendStages; + if (wined3d_caps.MaxSimultaneousTextures > 0xffff) desc7->wMaxSimultaneousTextures = 0xffff; + else desc7->wMaxSimultaneousTextures = (WORD)wined3d_caps.MaxSimultaneousTextures; + + if (wined3d_caps.MaxUserClipPlanes > 0xffff) desc7->wMaxUserClipPlanes = 0xffff; + else desc7->wMaxUserClipPlanes = (WORD)wined3d_caps.MaxUserClipPlanes; + if (wined3d_caps.MaxVertexBlendMatrices > 0xffff) desc7->wMaxVertexBlendMatrices = 0xffff; + else desc7->wMaxVertexBlendMatrices = (WORD)wined3d_caps.MaxVertexBlendMatrices; + + desc7->deviceGUID = IID_IDirect3DTnLHalDevice; + + desc7->dwReserved1 = 0; + desc7->dwReserved2 = 0; + desc7->dwReserved3 = 0; + desc7->dwReserved4 = 0; + + /* Fill the old structure */ + memset(desc1, 0, sizeof(*desc1)); + desc1->dwSize = sizeof(D3DDEVICEDESC); + desc1->dwFlags = D3DDD_COLORMODEL + | D3DDD_DEVCAPS + | D3DDD_TRANSFORMCAPS + | D3DDD_BCLIPPING + | D3DDD_LIGHTINGCAPS + | D3DDD_LINECAPS + | D3DDD_TRICAPS + | D3DDD_DEVICERENDERBITDEPTH + | D3DDD_DEVICEZBUFFERBITDEPTH + | D3DDD_MAXBUFFERSIZE + | D3DDD_MAXVERTEXCOUNT; + + desc1->dcmColorModel = D3DCOLOR_RGB; + desc1->dwDevCaps = desc7->dwDevCaps; + desc1->dtcTransformCaps.dwSize = sizeof(D3DTRANSFORMCAPS); + desc1->dtcTransformCaps.dwCaps = D3DTRANSFORMCAPS_CLIP; + desc1->bClipping = TRUE; + desc1->dlcLightingCaps.dwSize = sizeof(D3DLIGHTINGCAPS); + desc1->dlcLightingCaps.dwCaps = D3DLIGHTCAPS_DIRECTIONAL + | D3DLIGHTCAPS_PARALLELPOINT + | D3DLIGHTCAPS_POINT + | D3DLIGHTCAPS_SPOT; + + desc1->dlcLightingCaps.dwLightingModel = D3DLIGHTINGMODEL_RGB; + desc1->dlcLightingCaps.dwNumLights = desc7->dwMaxActiveLights; + + desc1->dpcLineCaps.dwSize = sizeof(D3DPRIMCAPS); + desc1->dpcLineCaps.dwMiscCaps = desc7->dpcLineCaps.dwMiscCaps; + desc1->dpcLineCaps.dwRasterCaps = desc7->dpcLineCaps.dwRasterCaps; + desc1->dpcLineCaps.dwZCmpCaps = desc7->dpcLineCaps.dwZCmpCaps; + desc1->dpcLineCaps.dwSrcBlendCaps = desc7->dpcLineCaps.dwSrcBlendCaps; + desc1->dpcLineCaps.dwDestBlendCaps = desc7->dpcLineCaps.dwDestBlendCaps; + desc1->dpcLineCaps.dwShadeCaps = desc7->dpcLineCaps.dwShadeCaps; + desc1->dpcLineCaps.dwTextureCaps = desc7->dpcLineCaps.dwTextureCaps; + desc1->dpcLineCaps.dwTextureFilterCaps = desc7->dpcLineCaps.dwTextureFilterCaps; + desc1->dpcLineCaps.dwTextureBlendCaps = desc7->dpcLineCaps.dwTextureBlendCaps; + desc1->dpcLineCaps.dwTextureAddressCaps = desc7->dpcLineCaps.dwTextureAddressCaps; + desc1->dpcLineCaps.dwStippleWidth = desc7->dpcLineCaps.dwStippleWidth; + desc1->dpcLineCaps.dwAlphaCmpCaps = desc7->dpcLineCaps.dwAlphaCmpCaps; + + desc1->dpcTriCaps.dwSize = sizeof(D3DPRIMCAPS); + desc1->dpcTriCaps.dwMiscCaps = desc7->dpcTriCaps.dwMiscCaps; + desc1->dpcTriCaps.dwRasterCaps = desc7->dpcTriCaps.dwRasterCaps; + desc1->dpcTriCaps.dwZCmpCaps = desc7->dpcTriCaps.dwZCmpCaps; + desc1->dpcTriCaps.dwSrcBlendCaps = desc7->dpcTriCaps.dwSrcBlendCaps; + desc1->dpcTriCaps.dwDestBlendCaps = desc7->dpcTriCaps.dwDestBlendCaps; + desc1->dpcTriCaps.dwShadeCaps = desc7->dpcTriCaps.dwShadeCaps; + desc1->dpcTriCaps.dwTextureCaps = desc7->dpcTriCaps.dwTextureCaps; + desc1->dpcTriCaps.dwTextureFilterCaps = desc7->dpcTriCaps.dwTextureFilterCaps; + desc1->dpcTriCaps.dwTextureBlendCaps = desc7->dpcTriCaps.dwTextureBlendCaps; + desc1->dpcTriCaps.dwTextureAddressCaps = desc7->dpcTriCaps.dwTextureAddressCaps; + desc1->dpcTriCaps.dwStippleWidth = desc7->dpcTriCaps.dwStippleWidth; + desc1->dpcTriCaps.dwAlphaCmpCaps = desc7->dpcTriCaps.dwAlphaCmpCaps; + + desc1->dwDeviceRenderBitDepth = desc7->dwDeviceRenderBitDepth; + desc1->dwDeviceZBufferBitDepth = desc7->dwDeviceZBufferBitDepth; + desc1->dwMaxBufferSize = 0; + desc1->dwMaxVertexCount = 65536; + desc1->dwMinTextureWidth = desc7->dwMinTextureWidth; + desc1->dwMinTextureHeight = desc7->dwMinTextureHeight; + desc1->dwMaxTextureWidth = desc7->dwMaxTextureWidth; + desc1->dwMaxTextureHeight = desc7->dwMaxTextureHeight; + desc1->dwMinStippleWidth = 1; + desc1->dwMinStippleHeight = 1; + desc1->dwMaxStippleWidth = 32; + desc1->dwMaxStippleHeight = 32; + desc1->dwMaxTextureRepeat = desc7->dwMaxTextureRepeat; + desc1->dwMaxTextureAspectRatio = desc7->dwMaxTextureAspectRatio; + desc1->dwMaxAnisotropy = desc7->dwMaxAnisotropy; + desc1->dvGuardBandLeft = desc7->dvGuardBandLeft; + desc1->dvGuardBandRight = desc7->dvGuardBandRight; + desc1->dvGuardBandTop = desc7->dvGuardBandTop; + desc1->dvGuardBandBottom = desc7->dvGuardBandBottom; + desc1->dvExtentsAdjust = desc7->dvExtentsAdjust; + desc1->dwStencilCaps = desc7->dwStencilCaps; + desc1->dwFVFCaps = desc7->dwFVFCaps; + desc1->dwTextureOpCaps = desc7->dwTextureOpCaps; + desc1->wMaxTextureBlendStages = desc7->wMaxTextureBlendStages; + desc1->wMaxSimultaneousTextures = desc7->wMaxSimultaneousTextures; + + return DD_OK; +} + /***************************************************************************** * IDirectDraw7 VTable *****************************************************************************/ -const IDirectDraw7Vtbl IDirectDraw7_Vtbl = +static const struct IDirectDraw7Vtbl ddraw7_vtbl = { - /*** IUnknown ***/ - IDirectDrawImpl_QueryInterface, - IDirectDrawImpl_AddRef, - IDirectDrawImpl_Release, - /*** IDirectDraw ***/ - IDirectDrawImpl_Compact, - IDirectDrawImpl_CreateClipper, - IDirectDrawImpl_CreatePalette, - IDirectDrawImpl_CreateSurface, - IDirectDrawImpl_DuplicateSurface, - IDirectDrawImpl_EnumDisplayModes, - IDirectDrawImpl_EnumSurfaces, - IDirectDrawImpl_FlipToGDISurface, - IDirectDrawImpl_GetCaps, - IDirectDrawImpl_GetDisplayMode, - IDirectDrawImpl_GetFourCCCodes, - IDirectDrawImpl_GetGDISurface, - IDirectDrawImpl_GetMonitorFrequency, - IDirectDrawImpl_GetScanLine, - IDirectDrawImpl_GetVerticalBlankStatus, - IDirectDrawImpl_Initialize, - IDirectDrawImpl_RestoreDisplayMode, - IDirectDrawImpl_SetCooperativeLevel, - IDirectDrawImpl_SetDisplayMode, - IDirectDrawImpl_WaitForVerticalBlank, - /*** IDirectDraw2 ***/ - IDirectDrawImpl_GetAvailableVidMem, - /*** IDirectDraw3 ***/ - IDirectDrawImpl_GetSurfaceFromDC, - /*** IDirectDraw4 ***/ - IDirectDrawImpl_RestoreAllSurfaces, - IDirectDrawImpl_TestCooperativeLevel, - IDirectDrawImpl_GetDeviceIdentifier, - /*** IDirectDraw7 ***/ - IDirectDrawImpl_StartModeTest, - IDirectDrawImpl_EvaluateMode + /* IUnknown */ + ddraw7_QueryInterface, + ddraw7_AddRef, + ddraw7_Release, + /* IDirectDraw */ + ddraw7_Compact, + ddraw7_CreateClipper, + ddraw7_CreatePalette, + ddraw7_CreateSurface, + ddraw7_DuplicateSurface, + ddraw7_EnumDisplayModes, + ddraw7_EnumSurfaces, + ddraw7_FlipToGDISurface, + ddraw7_GetCaps, + ddraw7_GetDisplayMode, + ddraw7_GetFourCCCodes, + ddraw7_GetGDISurface, + ddraw7_GetMonitorFrequency, + ddraw7_GetScanLine, + ddraw7_GetVerticalBlankStatus, + ddraw7_Initialize, + ddraw7_RestoreDisplayMode, + ddraw7_SetCooperativeLevel, + ddraw7_SetDisplayMode, + ddraw7_WaitForVerticalBlank, + /* IDirectDraw2 */ + ddraw7_GetAvailableVidMem, + /* IDirectDraw3 */ + ddraw7_GetSurfaceFromDC, + /* IDirectDraw4 */ + ddraw7_RestoreAllSurfaces, + ddraw7_TestCooperativeLevel, + ddraw7_GetDeviceIdentifier, + /* IDirectDraw7 */ + ddraw7_StartModeTest, + ddraw7_EvaluateMode +}; + +static const struct IDirectDraw4Vtbl ddraw4_vtbl = +{ + /* IUnknown */ + ddraw4_QueryInterface, + ddraw4_AddRef, + ddraw4_Release, + /* IDirectDraw */ + ddraw4_Compact, + ddraw4_CreateClipper, + ddraw4_CreatePalette, + ddraw4_CreateSurface, + ddraw4_DuplicateSurface, + ddraw4_EnumDisplayModes, + ddraw4_EnumSurfaces, + ddraw4_FlipToGDISurface, + ddraw4_GetCaps, + ddraw4_GetDisplayMode, + ddraw4_GetFourCCCodes, + ddraw4_GetGDISurface, + ddraw4_GetMonitorFrequency, + ddraw4_GetScanLine, + ddraw4_GetVerticalBlankStatus, + ddraw4_Initialize, + ddraw4_RestoreDisplayMode, + ddraw4_SetCooperativeLevel, + ddraw4_SetDisplayMode, + ddraw4_WaitForVerticalBlank, + /* IDirectDraw2 */ + ddraw4_GetAvailableVidMem, + /* IDirectDraw3 */ + ddraw4_GetSurfaceFromDC, + /* IDirectDraw4 */ + ddraw4_RestoreAllSurfaces, + ddraw4_TestCooperativeLevel, + ddraw4_GetDeviceIdentifier, +}; + +static const struct IDirectDraw3Vtbl ddraw3_vtbl = +{ + /* IUnknown */ + ddraw3_QueryInterface, + ddraw3_AddRef, + ddraw3_Release, + /* IDirectDraw */ + ddraw3_Compact, + ddraw3_CreateClipper, + ddraw3_CreatePalette, + ddraw3_CreateSurface, + ddraw3_DuplicateSurface, + ddraw3_EnumDisplayModes, + ddraw3_EnumSurfaces, + ddraw3_FlipToGDISurface, + ddraw3_GetCaps, + ddraw3_GetDisplayMode, + ddraw3_GetFourCCCodes, + ddraw3_GetGDISurface, + ddraw3_GetMonitorFrequency, + ddraw3_GetScanLine, + ddraw3_GetVerticalBlankStatus, + ddraw3_Initialize, + ddraw3_RestoreDisplayMode, + ddraw3_SetCooperativeLevel, + ddraw3_SetDisplayMode, + ddraw3_WaitForVerticalBlank, + /* IDirectDraw2 */ + ddraw3_GetAvailableVidMem, + /* IDirectDraw3 */ + ddraw3_GetSurfaceFromDC, +}; + +static const struct IDirectDraw2Vtbl ddraw2_vtbl = +{ + /* IUnknown */ + ddraw2_QueryInterface, + ddraw2_AddRef, + ddraw2_Release, + /* IDirectDraw */ + ddraw2_Compact, + ddraw2_CreateClipper, + ddraw2_CreatePalette, + ddraw2_CreateSurface, + ddraw2_DuplicateSurface, + ddraw2_EnumDisplayModes, + ddraw2_EnumSurfaces, + ddraw2_FlipToGDISurface, + ddraw2_GetCaps, + ddraw2_GetDisplayMode, + ddraw2_GetFourCCCodes, + ddraw2_GetGDISurface, + ddraw2_GetMonitorFrequency, + ddraw2_GetScanLine, + ddraw2_GetVerticalBlankStatus, + ddraw2_Initialize, + ddraw2_RestoreDisplayMode, + ddraw2_SetCooperativeLevel, + ddraw2_SetDisplayMode, + ddraw2_WaitForVerticalBlank, + /* IDirectDraw2 */ + ddraw2_GetAvailableVidMem, +}; + +static const struct IDirectDrawVtbl ddraw1_vtbl = +{ + /* IUnknown */ + ddraw1_QueryInterface, + ddraw1_AddRef, + ddraw1_Release, + /* IDirectDraw */ + ddraw1_Compact, + ddraw1_CreateClipper, + ddraw1_CreatePalette, + ddraw1_CreateSurface, + ddraw1_DuplicateSurface, + ddraw1_EnumDisplayModes, + ddraw1_EnumSurfaces, + ddraw1_FlipToGDISurface, + ddraw1_GetCaps, + ddraw1_GetDisplayMode, + ddraw1_GetFourCCCodes, + ddraw1_GetGDISurface, + ddraw1_GetMonitorFrequency, + ddraw1_GetScanLine, + ddraw1_GetVerticalBlankStatus, + ddraw1_Initialize, + ddraw1_RestoreDisplayMode, + ddraw1_SetCooperativeLevel, + ddraw1_SetDisplayMode, + ddraw1_WaitForVerticalBlank, +}; + +static const struct IDirect3D7Vtbl d3d7_vtbl = +{ + /* IUnknown methods */ + d3d7_QueryInterface, + d3d7_AddRef, + d3d7_Release, + /* IDirect3D7 methods */ + d3d7_EnumDevices, + d3d7_CreateDevice, + d3d7_CreateVertexBuffer, + d3d7_EnumZBufferFormats, + d3d7_EvictManagedTextures +}; + +static const struct IDirect3D3Vtbl d3d3_vtbl = +{ + /* IUnknown methods */ + d3d3_QueryInterface, + d3d3_AddRef, + d3d3_Release, + /* IDirect3D3 methods */ + d3d3_EnumDevices, + d3d3_CreateLight, + d3d3_CreateMaterial, + d3d3_CreateViewport, + d3d3_FindDevice, + d3d3_CreateDevice, + d3d3_CreateVertexBuffer, + d3d3_EnumZBufferFormats, + d3d3_EvictManagedTextures +}; + +static const struct IDirect3D2Vtbl d3d2_vtbl = +{ + /* IUnknown methods */ + d3d2_QueryInterface, + d3d2_AddRef, + d3d2_Release, + /* IDirect3D2 methods */ + d3d2_EnumDevices, + d3d2_CreateLight, + d3d2_CreateMaterial, + d3d2_CreateViewport, + d3d2_FindDevice, + d3d2_CreateDevice +}; + +static const struct IDirect3DVtbl d3d1_vtbl = +{ + /* IUnknown methods */ + d3d1_QueryInterface, + d3d1_AddRef, + d3d1_Release, + /* IDirect3D methods */ + d3d1_Initialize, + d3d1_EnumDevices, + d3d1_CreateLight, + d3d1_CreateMaterial, + d3d1_CreateViewport, + d3d1_FindDevice }; /***************************************************************************** - * IDirectDrawImpl_FindDecl + * ddraw_find_decl * * Finds the WineD3D vertex declaration for a specific fvf, and creates one * if none was found. @@ -3189,9 +5432,7 @@ const IDirectDraw7Vtbl IDirectDraw7_Vtbl = * fvf otherwise. * *****************************************************************************/ -IWineD3DVertexDeclaration * -IDirectDrawImpl_FindDecl(IDirectDrawImpl *This, - DWORD fvf) +IWineD3DVertexDeclaration *ddraw_find_decl(IDirectDrawImpl *This, DWORD fvf) { HRESULT hr; IWineD3DVertexDeclaration* pDecl = NULL; @@ -3216,8 +5457,8 @@ IDirectDrawImpl_FindDecl(IDirectDrawImpl *This, } TRACE("not found. Creating and inserting at position %d.\n", low); - hr = IWineD3DDevice_CreateVertexDeclarationFromFVF(This->wineD3DDevice, &pDecl, - (IUnknown *)This, &ddraw_null_wined3d_parent_ops, fvf); + hr = IWineD3DDevice_CreateVertexDeclarationFromFVF(This->wineD3DDevice, + fvf, This, &ddraw_null_wined3d_parent_ops, &pDecl); if (hr != S_OK) return NULL; if(This->declArraySize == This->numConvertedDecls) { @@ -3252,19 +5493,19 @@ static inline struct IDirectDrawImpl *ddraw_from_device_parent(IWineD3DDevicePar static HRESULT STDMETHODCALLTYPE device_parent_QueryInterface(IWineD3DDeviceParent *iface, REFIID riid, void **object) { struct IDirectDrawImpl *This = ddraw_from_device_parent(iface); - return IDirectDrawImpl_QueryInterface((IDirectDraw7 *)This, riid, object); + return ddraw7_QueryInterface((IDirectDraw7 *)This, riid, object); } static ULONG STDMETHODCALLTYPE device_parent_AddRef(IWineD3DDeviceParent *iface) { struct IDirectDrawImpl *This = ddraw_from_device_parent(iface); - return IDirectDrawImpl_AddRef((IDirectDraw7 *)This); + return ddraw7_AddRef((IDirectDraw7 *)This); } static ULONG STDMETHODCALLTYPE device_parent_Release(IWineD3DDeviceParent *iface) { struct IDirectDrawImpl *This = ddraw_from_device_parent(iface); - return IDirectDrawImpl_Release((IDirectDraw7 *)This); + return ddraw7_Release((IDirectDraw7 *)This); } /* IWineD3DDeviceParent methods */ @@ -3275,7 +5516,7 @@ static void STDMETHODCALLTYPE device_parent_WineD3DDeviceCreated(IWineD3DDeviceP } static HRESULT STDMETHODCALLTYPE device_parent_CreateSurface(IWineD3DDeviceParent *iface, - IUnknown *superior, UINT width, UINT height, WINED3DFORMAT format, DWORD usage, + IUnknown *superior, UINT width, UINT height, enum wined3d_format_id format, DWORD usage, WINED3DPOOL pool, UINT level, WINED3DCUBEMAP_FACES face, IWineD3DSurface **surface) { struct IDirectDrawImpl *This = ddraw_from_device_parent(iface); @@ -3344,9 +5585,31 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSurface(IWineD3DDeviceParen return D3D_OK; } +static HRESULT WINAPI findRenderTarget(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *surface_desc, void *ctx) +{ + IDirectDrawSurfaceImpl *s = (IDirectDrawSurfaceImpl *)surface; + IDirectDrawSurfaceImpl **target = ctx; + + if (!s->isRenderTarget) + { + *target = s; + IDirectDrawSurface7_Release(surface); + return DDENUMRET_CANCEL; + } + + /* Recurse into the surface tree */ + IDirectDrawSurface7_EnumAttachedSurfaces(surface, ctx, findRenderTarget); + + IDirectDrawSurface7_Release(surface); + if (*target) return DDENUMRET_CANCEL; + + return DDENUMRET_OK; +} + static HRESULT STDMETHODCALLTYPE device_parent_CreateRenderTarget(IWineD3DDeviceParent *iface, - IUnknown *superior, UINT width, UINT height, WINED3DFORMAT format, WINED3DMULTISAMPLE_TYPE multisample_type, - DWORD multisample_quality, BOOL lockable, IWineD3DSurface **surface) + IUnknown *superior, UINT width, UINT height, enum wined3d_format_id format, + WINED3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality, BOOL lockable, + IWineD3DSurface **surface) { struct IDirectDrawImpl *This = ddraw_from_device_parent(iface); IDirectDrawSurfaceImpl *d3d_surface = This->d3d_target; @@ -3383,7 +5646,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateRenderTarget(IWineD3DDevice } static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3DDeviceParent *iface, - IUnknown *superior, UINT width, UINT height, WINED3DFORMAT format, WINED3DMULTISAMPLE_TYPE multisample_type, + UINT width, UINT height, enum wined3d_format_id format, WINED3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality, BOOL discard, IWineD3DSurface **surface) { struct IDirectDrawImpl *This = ddraw_from_device_parent(iface); @@ -3391,9 +5654,9 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3 DDSURFACEDESC2 ddsd; HRESULT hr; - TRACE("iface %p, superior %p, width %u, height %u, format %#x, multisample_type %#x,\n" + TRACE("iface %p, width %u, height %u, format %#x, multisample_type %#x,\n" "\tmultisample_quality %u, discard %u, surface %p\n", - iface, superior, width, height, format, multisample_type, multisample_quality, discard, surface); + iface, width, height, format, multisample_type, multisample_quality, discard, surface); *surface = NULL; @@ -3431,7 +5694,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3 } static HRESULT STDMETHODCALLTYPE device_parent_CreateVolume(IWineD3DDeviceParent *iface, - IUnknown *superior, UINT width, UINT height, UINT depth, WINED3DFORMAT format, + IUnknown *superior, UINT width, UINT height, UINT depth, enum wined3d_format_id format, WINED3DPOOL pool, DWORD usage, IWineD3DVolume **volume) { TRACE("iface %p, superior %p, width %u, height %u, depth %u, format %#x, pool %#x, usage %#x, volume %p\n", @@ -3460,11 +5723,10 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSwapChain(IWineD3DDevicePar return DDERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &IParent_Vtbl; - object->ref = 1; + ddraw_parent_init(object); hr = IWineD3DDevice_CreateSwapChain(This->wineD3DDevice, present_parameters, - swapchain, (IUnknown *)object, This->ImplType); + This->ImplType, object, swapchain); if (FAILED(hr)) { FIXME("(%p) CreateSwapChain failed, returning %#x\n", iface, hr); @@ -3485,7 +5747,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSwapChain(IWineD3DDevicePar return hr; } -const IWineD3DDeviceParentVtbl ddraw_wined3d_device_parent_vtbl = +static const IWineD3DDeviceParentVtbl ddraw_wined3d_device_parent_vtbl = { /* IUnknown methods */ device_parent_QueryInterface, @@ -3499,3 +5761,62 @@ const IWineD3DDeviceParentVtbl ddraw_wined3d_device_parent_vtbl = device_parent_CreateVolume, device_parent_CreateSwapChain, }; + +HRESULT ddraw_init(IDirectDrawImpl *ddraw, WINED3DDEVTYPE device_type) +{ + HRESULT hr; + HDC hDC; + + ddraw->lpVtbl = &ddraw7_vtbl; + ddraw->IDirectDraw_vtbl = &ddraw1_vtbl; + ddraw->IDirectDraw2_vtbl = &ddraw2_vtbl; + ddraw->IDirectDraw3_vtbl = &ddraw3_vtbl; + ddraw->IDirectDraw4_vtbl = &ddraw4_vtbl; + ddraw->IDirect3D_vtbl = &d3d1_vtbl; + ddraw->IDirect3D2_vtbl = &d3d2_vtbl; + ddraw->IDirect3D3_vtbl = &d3d3_vtbl; + ddraw->IDirect3D7_vtbl = &d3d7_vtbl; + ddraw->device_parent_vtbl = &ddraw_wined3d_device_parent_vtbl; + ddraw->numIfaces = 1; + ddraw->ref7 = 1; + + /* See comments in IDirectDrawImpl_CreateNewSurface for a description of + * this field. */ + ddraw->ImplType = DefaultSurfaceType; + + /* Get the current screen settings. */ + hDC = GetDC(0); + ddraw->orig_bpp = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); + ReleaseDC(0, hDC); + ddraw->orig_width = GetSystemMetrics(SM_CXSCREEN); + ddraw->orig_height = GetSystemMetrics(SM_CYSCREEN); + + if (!LoadWineD3D()) + { + ERR("Failed to load wined3d - broken OpenGL setup?\n"); + return DDERR_NODIRECTDRAWSUPPORT; + } + + ddraw->wineD3D = pWineDirect3DCreate(7, (IUnknown *)ddraw); + if (!ddraw->wineD3D) + { + WARN("Failed to create a wined3d object.\n"); + return E_OUTOFMEMORY; + } + + hr = IWineD3D_CreateDevice(ddraw->wineD3D, WINED3DADAPTER_DEFAULT, device_type, NULL, 0, + (IWineD3DDeviceParent *)&ddraw->device_parent_vtbl, &ddraw->wineD3DDevice); + if (FAILED(hr)) + { + WARN("Failed to create a wined3d device, hr %#x.\n", hr); + IWineD3D_Release(ddraw->wineD3D); + return hr; + } + + /* Get the amount of video memory */ + ddraw->total_vidmem = IWineD3DDevice_GetAvailableTextureMem(ddraw->wineD3DDevice); + + list_init(&ddraw->surface_list); + + return DD_OK; +} diff --git a/dll/directx/wine/ddraw/ddraw_private.h b/dll/directx/wine/ddraw/ddraw_private.h index bea5ad2cb5a..91662fe3003 100644 --- a/dll/directx/wine/ddraw/ddraw_private.h +++ b/dll/directx/wine/ddraw/ddraw_private.h @@ -19,25 +19,24 @@ #ifndef __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H #define __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H -/* MAY NOT CONTAIN X11 or DGA specific includes/defines/structs! */ +#include +#define COBJMACROS +#define NONAMELESSSTRUCT +#define NONAMELESSUNION +#include "wine/debug.h" -#include -#include - -#include "windef.h" #include "winbase.h" -#include "wtypes.h" #include "wingdi.h" #include "winuser.h" -#include "ddraw.h" -#include "ddrawi.h" -#include "d3d.h" -#include "wine/list.h" +#include "d3d.h" +#include "ddraw.h" #ifdef DDRAW_INIT_GUID #include "initguid.h" #endif +#include "wine/list.h" #include "wine/wined3d.h" +#include "legacy.h" extern const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops DECLSPEC_HIDDEN; @@ -100,6 +99,7 @@ struct IDirectDrawImpl /* IUnknown fields */ const IDirectDraw7Vtbl *lpVtbl; const IDirectDraw4Vtbl *IDirectDraw4_vtbl; + const IDirectDraw3Vtbl *IDirectDraw3_vtbl; const IDirectDraw2Vtbl *IDirectDraw2_vtbl; const IDirectDrawVtbl *IDirectDraw_vtbl; const IDirect3D7Vtbl *IDirect3D7_vtbl; @@ -142,11 +142,6 @@ struct IDirectDrawImpl /* The surface type to request */ WINED3DSURFTYPE ImplType; - - /* Our private window class */ - char classname[32]; - WNDCLASSA wnd_class; - /* Helpers for surface creation */ IDirectDrawSurfaceImpl *tex_root; BOOL depthstencil; @@ -164,12 +159,9 @@ struct IDirectDrawImpl UINT numConvertedDecls, declArraySize; }; -/* Declare the VTables. They can be found ddraw.c */ -extern const IDirectDraw7Vtbl IDirectDraw7_Vtbl DECLSPEC_HIDDEN; -extern const IDirectDraw4Vtbl IDirectDraw4_Vtbl DECLSPEC_HIDDEN; -extern const IDirectDraw2Vtbl IDirectDraw2_Vtbl DECLSPEC_HIDDEN; -extern const IDirectDrawVtbl IDirectDraw1_Vtbl DECLSPEC_HIDDEN; -extern const IWineD3DDeviceParentVtbl ddraw_wined3d_device_parent_vtbl DECLSPEC_HIDDEN; +#define DDRAW_WINDOW_CLASS_NAME "ddraw_wc" + +HRESULT ddraw_init(IDirectDrawImpl *ddraw, WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN; /* Helper structures */ typedef struct EnumDisplayModesCBS @@ -189,10 +181,9 @@ typedef struct EnumSurfacesCBS /* Utility functions */ void DDRAW_Convert_DDSCAPS_1_To_2(const DDSCAPS *pIn, DDSCAPS2 *pOut) DECLSPEC_HIDDEN; void DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(const DDDEVICEIDENTIFIER2 *pIn, DDDEVICEIDENTIFIER *pOut) DECLSPEC_HIDDEN; -void IDirectDrawImpl_Destroy(IDirectDrawImpl *This) DECLSPEC_HIDDEN; -HRESULT WINAPI IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf, +HRESULT WINAPI ddraw_recreate_surfaces_cb(IDirectDrawSurface7 *surf, DDSURFACEDESC2 *desc, void *Context) DECLSPEC_HIDDEN; -IWineD3DVertexDeclaration *IDirectDrawImpl_FindDecl(IDirectDrawImpl *This, DWORD fvf) DECLSPEC_HIDDEN; +IWineD3DVertexDeclaration *ddraw_find_decl(IDirectDrawImpl *This, DWORD fvf) DECLSPEC_HIDDEN; static inline IDirectDrawImpl *ddraw_from_d3d1(IDirect3D *iface) { @@ -214,24 +205,13 @@ static inline IDirectDrawImpl *ddraw_from_d3d7(IDirect3D7 *iface) return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirect3D7_vtbl)); } -static inline IDirectDrawImpl *ddraw_from_ddraw1(IDirectDraw *iface) -{ - return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirectDraw_vtbl)); -} - -static inline IDirectDrawImpl *ddraw_from_ddraw2(IDirectDraw2 *iface) -{ - return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirectDraw2_vtbl)); -} - -static inline IDirectDrawImpl *ddraw_from_ddraw4(IDirectDraw4 *iface) -{ - return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirectDraw4_vtbl)); -} - /* The default surface type */ extern WINED3DSURFTYPE DefaultSurfaceType DECLSPEC_HIDDEN; +extern typeof(WineDirect3DCreateClipper) *pWineDirect3DCreateClipper DECLSPEC_HIDDEN; +extern typeof(WineDirect3DCreate) *pWineDirect3DCreate DECLSPEC_HIDDEN; + + /***************************************************************************** * IDirectDrawSurface implementation structure *****************************************************************************/ @@ -292,16 +272,9 @@ struct IDirectDrawSurfaceImpl DWORD Handle; }; -/* VTable declaration. It's located in surface.c / surface_thunks.c */ -extern const IDirectDrawSurface7Vtbl IDirectDrawSurface7_Vtbl DECLSPEC_HIDDEN; -extern const IDirectDrawSurface3Vtbl IDirectDrawSurface3_Vtbl DECLSPEC_HIDDEN; -extern const IDirectDrawGammaControlVtbl IDirectDrawGammaControl_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DTexture2Vtbl IDirect3DTexture2_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DTextureVtbl IDirect3DTexture1_Vtbl DECLSPEC_HIDDEN; - -HRESULT WINAPI IDirectDrawSurfaceImpl_AddAttachedSurface(IDirectDrawSurfaceImpl *This, - IDirectDrawSurfaceImpl *Surf) DECLSPEC_HIDDEN; -void IDirectDrawSurfaceImpl_Destroy(IDirectDrawSurfaceImpl *This) DECLSPEC_HIDDEN; +void ddraw_surface_destroy(IDirectDrawSurfaceImpl *surface) DECLSPEC_HIDDEN; +HRESULT ddraw_surface_init(IDirectDrawSurfaceImpl *surface, IDirectDrawImpl *ddraw, + DDSURFACEDESC2 *desc, UINT mip_level, WINED3DSURFTYPE surface_type) DECLSPEC_HIDDEN; static inline IDirectDrawSurfaceImpl *surface_from_texture1(IDirect3DTexture *iface) { @@ -336,26 +309,43 @@ struct IParentImpl }; -extern const IParentVtbl IParent_Vtbl DECLSPEC_HIDDEN; +void ddraw_parent_init(IParentImpl *parent) DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DDevice implementation *****************************************************************************/ -typedef enum -{ - DDrawHandle_Unknown = 0, - DDrawHandle_Texture = 1, - DDrawHandle_Material = 2, - DDrawHandle_Matrix = 3, - DDrawHandle_StateBlock = 4 -} DDrawHandleTypes; -struct HandleEntry +#define DDRAW_INVALID_HANDLE ~0U + +enum ddraw_handle_type { - void *ptr; - DDrawHandleTypes type; + DDRAW_HANDLE_FREE, + DDRAW_HANDLE_MATERIAL, + DDRAW_HANDLE_MATRIX, + DDRAW_HANDLE_STATEBLOCK, + DDRAW_HANDLE_SURFACE, }; +struct ddraw_handle_entry +{ + void *object; + enum ddraw_handle_type type; +}; + +struct ddraw_handle_table +{ + struct ddraw_handle_entry *entries; + struct ddraw_handle_entry *free_entries; + UINT table_size; + UINT entry_count; +}; + +BOOL ddraw_handle_table_init(struct ddraw_handle_table *t, UINT initial_size) DECLSPEC_HIDDEN; +void ddraw_handle_table_destroy(struct ddraw_handle_table *t) DECLSPEC_HIDDEN; +DWORD ddraw_allocate_handle(struct ddraw_handle_table *t, void *object, enum ddraw_handle_type type) DECLSPEC_HIDDEN; +void *ddraw_free_handle(struct ddraw_handle_table *t, DWORD handle, enum ddraw_handle_type type) DECLSPEC_HIDDEN; +void *ddraw_get_object(struct ddraw_handle_table *t, DWORD handle, enum ddraw_handle_type type) DECLSPEC_HIDDEN; + struct IDirect3DDeviceImpl { /* IUnknown */ @@ -370,7 +360,6 @@ struct IDirect3DDeviceImpl IDirectDrawImpl *ddraw; IWineD3DBuffer *indexbuffer; IDirectDrawSurfaceImpl *target; - BOOL OffScreenTarget; /* Viewport management */ IDirect3DViewportImpl *viewport_list; @@ -393,24 +382,18 @@ struct IDirect3DDeviceImpl DWORD buffer_size; /* Handle management */ - struct HandleEntry *Handles; - DWORD numHandles; + struct ddraw_handle_table handle_table; D3DMATRIXHANDLE world, proj, view; }; -/* Vtables in various versions */ -extern const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUSetup_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUPreserve_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DDevice3Vtbl IDirect3DDevice3_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DDevice2Vtbl IDirect3DDevice2_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DDeviceVtbl IDirect3DDevice1_Vtbl DECLSPEC_HIDDEN; +HRESULT d3d_device_init(IDirect3DDeviceImpl *device, IDirectDrawImpl *ddraw, + IDirectDrawSurfaceImpl *target) DECLSPEC_HIDDEN; /* The IID */ extern const GUID IID_D3DDEVICE_WineD3D DECLSPEC_HIDDEN; /* Helper functions */ HRESULT IDirect3DImpl_GetCaps(IWineD3D *WineD3D, D3DDEVICEDESC *Desc123, D3DDEVICEDESC7 *Desc7) DECLSPEC_HIDDEN; -DWORD IDirect3DDeviceImpl_CreateHandle(IDirect3DDeviceImpl *This) DECLSPEC_HIDDEN; WINED3DZBUFFERTYPE IDirect3DDeviceImpl_UpdateDepthStencil(IDirect3DDeviceImpl *This) DECLSPEC_HIDDEN; static inline IDirect3DDeviceImpl *device_from_device1(IDirect3DDevice *iface) @@ -436,18 +419,6 @@ struct EnumTextureFormatsCBS void *Context; }; -/***************************************************************************** - * IDirect3D implementation - *****************************************************************************/ - -/* No implementation structure as this is only another interface to DirectDraw */ - -/* the Vtables */ -extern const IDirect3DVtbl IDirect3D1_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3D2Vtbl IDirect3D2_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3D3Vtbl IDirect3D3_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3D7Vtbl IDirect3D7_Vtbl DECLSPEC_HIDDEN; - /* Structure for EnumZBufferFormats */ struct EnumZBufferFormatsData { @@ -465,12 +436,10 @@ struct IDirectDrawClipperImpl LONG ref; IWineD3DClipper *wineD3DClipper; - IDirectDrawImpl *ddraw_owner; + BOOL initialized; }; -extern const IDirectDrawClipperVtbl IDirectDrawClipper_Vtbl DECLSPEC_HIDDEN; - -typeof(WineDirect3DCreateClipper) *pWineDirect3DCreateClipper DECLSPEC_HIDDEN; +HRESULT ddraw_clipper_init(IDirectDrawClipperImpl *clipper) DECLSPEC_HIDDEN; /***************************************************************************** * IDirectDrawPalette implementation structure @@ -485,10 +454,11 @@ struct IDirectDrawPaletteImpl IWineD3DPalette *wineD3DPalette; /* IDirectDrawPalette fields */ - IDirectDrawImpl *ddraw_owner; IUnknown *ifaceToRelease; }; -extern const IDirectDrawPaletteVtbl IDirectDrawPalette_Vtbl DECLSPEC_HIDDEN; + +HRESULT ddraw_palette_init(IDirectDrawPaletteImpl *palette, + IDirectDrawImpl *ddraw, DWORD flags, PALETTEENTRY *entries) DECLSPEC_HIDDEN; /****************************************************************************** * DirectDraw ClassFactory implementation - incomplete @@ -530,20 +500,12 @@ struct IDirect3DLightImpl /* Chained list used for adding / removing from viewports */ IDirect3DLightImpl *next; - - /* Activation function */ - void (*activate)(IDirect3DLightImpl*); - void (*desactivate)(IDirect3DLightImpl*); - void (*update)(IDirect3DLightImpl*); }; -/* Vtable */ -extern const IDirect3DLightVtbl IDirect3DLight_Vtbl DECLSPEC_HIDDEN; - /* Helper functions */ -void light_update(IDirect3DLightImpl *This) DECLSPEC_HIDDEN; -void light_activate(IDirect3DLightImpl *This) DECLSPEC_HIDDEN; -void light_desactivate(IDirect3DLightImpl *This) DECLSPEC_HIDDEN; +void light_activate(IDirect3DLightImpl *light) DECLSPEC_HIDDEN; +void light_deactivate(IDirect3DLightImpl *light) DECLSPEC_HIDDEN; +void d3d_light_init(IDirect3DLightImpl *light, IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN; /****************************************************************************** * IDirect3DMaterial implementation structure - Wraps to D3D7 @@ -561,17 +523,11 @@ struct IDirect3DMaterialImpl D3DMATERIAL mat; DWORD Handle; - - void (*activate)(IDirect3DMaterialImpl* this); }; -/* VTables in various versions */ -extern const IDirect3DMaterialVtbl IDirect3DMaterial_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DMaterial2Vtbl IDirect3DMaterial2_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DMaterial3Vtbl IDirect3DMaterial3_Vtbl DECLSPEC_HIDDEN; - /* Helper functions */ void material_activate(IDirect3DMaterialImpl* This) DECLSPEC_HIDDEN; +void d3d_material_init(IDirect3DMaterialImpl *material, IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DViewport - Wraps to D3D7 @@ -598,9 +554,6 @@ struct IDirect3DViewportImpl D3DVIEWPORT2 vp2; } viewports; - /* Activation function */ - void (*activate)(IDirect3DViewportImpl*, BOOL); - /* Field used to chain viewports together */ IDirect3DViewportImpl *next; @@ -611,11 +564,9 @@ struct IDirect3DViewportImpl IDirect3DMaterialImpl *background; }; -/* Vtable */ -extern const IDirect3DViewport3Vtbl IDirect3DViewport3_Vtbl DECLSPEC_HIDDEN; - /* Helper functions */ void viewport_activate(IDirect3DViewportImpl* This, BOOL ignore_lights) DECLSPEC_HIDDEN; +void d3d_viewport_init(IDirect3DViewportImpl *viewport, IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DExecuteBuffer - Wraps to D3D7 @@ -644,8 +595,8 @@ struct IDirect3DExecuteBufferImpl BOOL need_free; }; -/* The VTable */ -extern const IDirect3DExecuteBufferVtbl IDirect3DExecuteBuffer_Vtbl DECLSPEC_HIDDEN; +HRESULT d3d_execute_buffer_init(IDirect3DExecuteBufferImpl *execute_buffer, + IDirect3DDeviceImpl *device, D3DEXECUTEBUFFERDESC *desc) DECLSPEC_HIDDEN; /* The execute function */ void IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, @@ -671,9 +622,8 @@ struct IDirect3DVertexBufferImpl DWORD fvf; }; -/* The Vtables */ -extern const IDirect3DVertexBuffer7Vtbl IDirect3DVertexBuffer7_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DVertexBufferVtbl IDirect3DVertexBuffer1_Vtbl DECLSPEC_HIDDEN; +HRESULT d3d_vertex_buffer_init(IDirect3DVertexBufferImpl *buffer, + IDirectDrawImpl *ddraw, D3DVERTEXBUFFERDESC *desc) DECLSPEC_HIDDEN; static inline IDirect3DVertexBufferImpl *vb_from_vb1(IDirect3DVertexBuffer *iface) { @@ -691,8 +641,8 @@ static inline IDirect3DVertexBufferImpl *vb_from_vb1(IDirect3DVertexBuffer *ifac #define GET_TEXCOORD_SIZE_FROM_FVF(d3dvtVertexType, tex_num) \ (((((d3dvtVertexType) >> (16 + (2 * (tex_num)))) + 1) & 0x03) + 1) -void PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, WINED3DFORMAT WineD3DFormat) DECLSPEC_HIDDEN; -WINED3DFORMAT PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) DECLSPEC_HIDDEN; +void PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, enum wined3d_format_id WineD3DFormat) DECLSPEC_HIDDEN; +enum wined3d_format_id PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) DECLSPEC_HIDDEN; void DDRAW_dump_surface_desc(const DDSURFACEDESC2 *lpddsd) DECLSPEC_HIDDEN; void dump_D3DMATRIX(const D3DMATRIX *mat) DECLSPEC_HIDDEN; void DDRAW_dump_DDCAPS(const DDCAPS *lpcaps) DECLSPEC_HIDDEN; diff --git a/dll/directx/wine/ddraw/ddraw_thunks.c b/dll/directx/wine/ddraw/ddraw_thunks.c deleted file mode 100644 index 9d606245272..00000000000 --- a/dll/directx/wine/ddraw/ddraw_thunks.c +++ /dev/null @@ -1,912 +0,0 @@ -/* Direct Draw Thunks and old vtables - * Copyright 2000 TransGaming Technologies Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "wine/port.h" - -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - -#include "ddraw_private.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(ddraw_thunk); -WINE_DECLARE_DEBUG_CHANNEL(ddraw); - -static HRESULT WINAPI -IDirectDrawImpl_QueryInterface(LPDIRECTDRAW This, REFIID iid, LPVOID *ppObj) -{ - return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw1(This), iid, ppObj); -} - -static HRESULT WINAPI -IDirectDraw2Impl_QueryInterface(LPDIRECTDRAW2 This, REFIID iid, LPVOID *ppObj) -{ - return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw2(This), iid, ppObj); -} - -static HRESULT WINAPI -IDirectDraw4Impl_QueryInterface(LPDIRECTDRAW4 This, REFIID iid, LPVOID *ppObj) -{ - return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw4(This), iid, ppObj); -} - -static ULONG WINAPI -IDirectDrawImpl_AddRef(LPDIRECTDRAW iface) -{ - IDirectDrawImpl *This = ddraw_from_ddraw1(iface); - ULONG ref = InterlockedIncrement(&This->ref1); - - TRACE("(%p) : incrementing IDirectDraw refcount from %u.\n", This, ref -1); - - if(ref == 1) InterlockedIncrement(&This->numIfaces); - - return ref; -} - -static ULONG WINAPI -IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 iface) -{ - IDirectDrawImpl *This = ddraw_from_ddraw2(iface); - ULONG ref = InterlockedIncrement(&This->ref2); - - TRACE("(%p) : incrementing IDirectDraw2 refcount from %u.\n", This, ref -1); - - if(ref == 1) InterlockedIncrement(&This->numIfaces); - - return ref; -} - -static ULONG WINAPI -IDirectDraw4Impl_AddRef(LPDIRECTDRAW4 iface) -{ - IDirectDrawImpl *This = ddraw_from_ddraw4(iface); - ULONG ref = InterlockedIncrement(&This->ref4); - - TRACE("(%p) : incrementing IDirectDraw4 refcount from %u.\n", This, ref -1); - - if(ref == 1) InterlockedIncrement(&This->numIfaces); - - return ref; -} - -static ULONG WINAPI -IDirectDrawImpl_Release(LPDIRECTDRAW iface) -{ - IDirectDrawImpl *This = ddraw_from_ddraw1(iface); - ULONG ref = InterlockedDecrement(&This->ref1); - - TRACE_(ddraw)("(%p)->() decrementing IDirectDraw refcount from %u.\n", This, ref +1); - - if(ref == 0) - { - ULONG ifacecount = InterlockedDecrement(&This->numIfaces); - if(ifacecount == 0) IDirectDrawImpl_Destroy(This); - } - - return ref; -} - -static ULONG WINAPI -IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface) -{ - IDirectDrawImpl *This = ddraw_from_ddraw2(iface); - ULONG ref = InterlockedDecrement(&This->ref2); - - TRACE_(ddraw)("(%p)->() decrementing IDirectDraw2 refcount from %u.\n", This, ref +1); - - if(ref == 0) - { - ULONG ifacecount = InterlockedDecrement(&This->numIfaces); - if(ifacecount == 0) IDirectDrawImpl_Destroy(This); - } - - return ref; -} - -static ULONG WINAPI -IDirectDraw4Impl_Release(LPDIRECTDRAW4 iface) -{ - IDirectDrawImpl *This = ddraw_from_ddraw4(iface); - ULONG ref = InterlockedDecrement(&This->ref4); - - TRACE_(ddraw)("(%p)->() decrementing IDirectDraw4 refcount from %u.\n", This, ref +1); - - if(ref == 0) - { - ULONG ifacecount = InterlockedDecrement(&This->numIfaces); - if(ifacecount == 0) IDirectDrawImpl_Destroy(This); - } - - return ref; -} - -static HRESULT WINAPI -IDirectDrawImpl_Compact(LPDIRECTDRAW This) -{ - return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw1(This)); -} - -static HRESULT WINAPI -IDirectDraw2Impl_Compact(LPDIRECTDRAW2 This) -{ - return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw2(This)); -} - -static HRESULT WINAPI -IDirectDraw4Impl_Compact(LPDIRECTDRAW4 This) -{ - return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw4(This)); -} - -static HRESULT WINAPI -IDirectDrawImpl_CreateClipper(LPDIRECTDRAW This, DWORD dwFlags, - LPDIRECTDRAWCLIPPER *ppClipper, - IUnknown *pUnkOuter) -{ - return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, ppClipper, pUnkOuter); -} - -static HRESULT WINAPI -IDirectDraw2Impl_CreateClipper(LPDIRECTDRAW2 This, DWORD dwFlags, - LPDIRECTDRAWCLIPPER *ppClipper, - IUnknown *pUnkOuter) -{ - return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, ppClipper, pUnkOuter); -} - -static HRESULT WINAPI -IDirectDraw4Impl_CreateClipper(LPDIRECTDRAW4 This, DWORD dwFlags, - LPDIRECTDRAWCLIPPER *ppClipper, - IUnknown *pUnkOuter) -{ - return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, ppClipper, pUnkOuter); -} - -static HRESULT WINAPI -IDirectDrawImpl_CreatePalette(LPDIRECTDRAW This, DWORD dwFlags, - LPPALETTEENTRY pEntries, - LPDIRECTDRAWPALETTE *ppPalette, - IUnknown *pUnkOuter) -{ - HRESULT hr; - hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, pEntries, ppPalette, pUnkOuter); - if(SUCCEEDED(hr) && *ppPalette) - { - IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette; - IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This)); - impl->ifaceToRelease = NULL; - - } - return hr; -} - -static HRESULT WINAPI -IDirectDraw2Impl_CreatePalette(LPDIRECTDRAW2 This, DWORD dwFlags, - LPPALETTEENTRY pEntries, - LPDIRECTDRAWPALETTE *ppPalette, - IUnknown *pUnkOuter) -{ - HRESULT hr; - hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, pEntries, ppPalette, pUnkOuter); - if(SUCCEEDED(hr) && *ppPalette) - { - IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette; - IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This)); - impl->ifaceToRelease = NULL; - } - return hr; -} - -static HRESULT WINAPI -IDirectDraw4Impl_CreatePalette(LPDIRECTDRAW4 This, DWORD dwFlags, - LPPALETTEENTRY pEntries, - LPDIRECTDRAWPALETTE *ppPalette, - IUnknown *pUnkOuter) -{ - HRESULT hr; - hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, pEntries, ppPalette, pUnkOuter); - if(SUCCEEDED(hr) && *ppPalette) - { - IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette; - IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw4(This)); - IDirectDraw4_AddRef(This); - impl->ifaceToRelease = (IUnknown *) This; - } - return hr; -} - -/* Must set all attached surfaces (e.g. mipmaps) versions as well */ -static void set_surf_version(IDirectDrawSurfaceImpl *surf, int version) -{ - int i; - TRACE("%p->version(%d) = %d\n", surf, surf->version, version); - surf->version = version; - for(i = 0; i < MAX_COMPLEX_ATTACHED; i++) - { - if(!surf->complex_array[i]) break; - set_surf_version(surf->complex_array[i], version); - } - while( (surf = surf->next_attached) ) - { - set_surf_version(surf, version); - } -} - -static HRESULT WINAPI -IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc, - LPDIRECTDRAWSURFACE *ppSurface, - IUnknown *pUnkOuter) -{ - LPDIRECTDRAWSURFACE7 pSurface7; - IDirectDrawSurfaceImpl *impl; - HRESULT hr; - - /* Remove front buffer flag, this causes failure in v7, and its added to normal - * primaries anyway - */ - pSDesc->ddsCaps.dwCaps &= ~DDSCAPS_FRONTBUFFER; - /* the LPDDSURFACEDESC -> LPDDSURFACEDESC2 conversion should be ok, - * since the data layout is the same */ - hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw1(This), - (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter); - if (FAILED(hr)) - { - *ppSurface = NULL; - return hr; - } - - impl = (IDirectDrawSurfaceImpl *)pSurface7; - *ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl; - set_surf_version(impl, 1); - IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This)); - impl->ifaceToRelease = NULL; - - return hr; -} - -static HRESULT WINAPI -IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc, - LPDIRECTDRAWSURFACE *ppSurface, - IUnknown *pUnkOuter) -{ - LPDIRECTDRAWSURFACE7 pSurface7; - IDirectDrawSurfaceImpl *impl; - HRESULT hr; - - hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw2(This), - (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter); - if (FAILED(hr)) - { - *ppSurface = NULL; - return hr; - } - - impl = (IDirectDrawSurfaceImpl *)pSurface7; - *ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl; - set_surf_version(impl, 2); - IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This)); - impl->ifaceToRelease = NULL; - - return hr; -} - -static HRESULT WINAPI -IDirectDraw4Impl_CreateSurface(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pSDesc, - LPDIRECTDRAWSURFACE4 *ppSurface, - IUnknown *pUnkOuter) -{ - HRESULT hr; - IDirectDrawSurfaceImpl *impl; - - hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw4(This), - pSDesc, (LPDIRECTDRAWSURFACE7 *)ppSurface, pUnkOuter); - impl = (IDirectDrawSurfaceImpl *)*ppSurface; - if(SUCCEEDED(hr) && impl) - { - set_surf_version(impl, 4); - IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw4(This)); - IDirectDraw4_AddRef(This); - impl->ifaceToRelease = (IUnknown *) This; - } - return hr; -} - -static HRESULT WINAPI -IDirectDrawImpl_DuplicateSurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE pSrc, - LPDIRECTDRAWSURFACE *ppDst) -{ - LPDIRECTDRAWSURFACE7 pDst7; - HRESULT hr; - - hr = IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw1(This), - pSrc ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)pSrc) : NULL, &pDst7); - - /* This coercion is safe, since the IDirectDrawSurface3 vtable has the - * IDirectDrawSurface vtable layout at the beginning */ - *ppDst = pDst7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pDst7)->IDirectDrawSurface3_vtbl : NULL; - - return hr; -} - -static HRESULT WINAPI -IDirectDraw2Impl_DuplicateSurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE pSrc, - LPDIRECTDRAWSURFACE *ppDst) -{ - LPDIRECTDRAWSURFACE7 pDst7; - HRESULT hr; - - hr = IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw2(This), - pSrc ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)pSrc) : NULL, &pDst7); - - /* This coercion is safe, since the IDirectDrawSurface3 vtable has the - * IDirectDrawSurface vtable layout at the beginning */ - *ppDst = pDst7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pDst7)->IDirectDrawSurface3_vtbl : NULL; - - return hr; -} - -static HRESULT WINAPI -IDirectDraw4Impl_DuplicateSurface(LPDIRECTDRAW4 This, - LPDIRECTDRAWSURFACE4 pSrc, - LPDIRECTDRAWSURFACE4 *ppDst) -{ - return IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw4(This), - (LPDIRECTDRAWSURFACE7)pSrc, (LPDIRECTDRAWSURFACE7 *)ppDst); -} - -struct displaymodescallback_context -{ - LPDDENUMMODESCALLBACK func; - LPVOID context; -}; - -static HRESULT CALLBACK -EnumDisplayModesCallbackThunk(LPDDSURFACEDESC2 pDDSD2, LPVOID context) -{ - DDSURFACEDESC DDSD; - struct displaymodescallback_context *cbcontext = context; - - memcpy(&DDSD,pDDSD2,sizeof(DDSD)); - DDSD.dwSize = sizeof(DDSD); - - return cbcontext->func(&DDSD, cbcontext->context); -} - -static HRESULT WINAPI -IDirectDrawImpl_EnumDisplayModes(LPDIRECTDRAW This, DWORD dwFlags, - LPDDSURFACEDESC pDDSD, LPVOID context, - LPDDENUMMODESCALLBACK cb) -{ - struct displaymodescallback_context cbcontext; - - cbcontext.func = cb; - cbcontext.context = context; - - return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw1(This), - dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumDisplayModesCallbackThunk); -} - -static HRESULT WINAPI -IDirectDraw2Impl_EnumDisplayModes(LPDIRECTDRAW2 This, DWORD dwFlags, - LPDDSURFACEDESC pDDSD, LPVOID context, - LPDDENUMMODESCALLBACK cb) -{ - struct displaymodescallback_context cbcontext; - - cbcontext.func = cb; - cbcontext.context = context; - - return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw2(This), - dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumDisplayModesCallbackThunk); -} - -static HRESULT WINAPI -IDirectDraw4Impl_EnumDisplayModes(LPDIRECTDRAW4 This, DWORD dwFlags, - LPDDSURFACEDESC2 pDDSD, LPVOID context, - LPDDENUMMODESCALLBACK2 cb) -{ - return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, pDDSD, context, cb); -} - -struct surfacescallback_context -{ - LPDDENUMSURFACESCALLBACK func; - LPVOID context; -}; - -static HRESULT CALLBACK -EnumSurfacesCallbackThunk(LPDIRECTDRAWSURFACE7 pSurf, LPDDSURFACEDESC2 pDDSD, - LPVOID context) -{ - struct surfacescallback_context *cbcontext = context; - - /* This coercion is safe, since the IDirectDrawSurface3 vtable has the - * IDirectDrawSurface vtable layout at the beginning */ - return cbcontext->func( - pSurf ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf)->IDirectDrawSurface3_vtbl : NULL, - (LPDDSURFACEDESC)pDDSD, cbcontext->context); -} - -static HRESULT WINAPI -IDirectDrawImpl_EnumSurfaces(LPDIRECTDRAW This, DWORD dwFlags, - LPDDSURFACEDESC pDDSD, LPVOID context, - LPDDENUMSURFACESCALLBACK cb) -{ - struct surfacescallback_context cbcontext; - - cbcontext.func = cb; - cbcontext.context = context; - - return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw1(This), - dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumSurfacesCallbackThunk); -} - -static HRESULT WINAPI -IDirectDraw2Impl_EnumSurfaces(LPDIRECTDRAW2 This, DWORD dwFlags, - LPDDSURFACEDESC pDDSD, LPVOID context, - LPDDENUMSURFACESCALLBACK cb) -{ - struct surfacescallback_context cbcontext; - - cbcontext.func = cb; - cbcontext.context = context; - - return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw2(This), - dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumSurfacesCallbackThunk); -} - -static HRESULT WINAPI -IDirectDraw4Impl_EnumSurfaces(LPDIRECTDRAW4 This, DWORD dwFlags, - LPDDSURFACEDESC2 pDDSD, LPVOID context, - LPDDENUMSURFACESCALLBACK2 cb) -{ - return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw4(This), - dwFlags, pDDSD, context, (LPDDENUMSURFACESCALLBACK7)cb); -} - -static HRESULT WINAPI -IDirectDrawImpl_FlipToGDISurface(LPDIRECTDRAW This) -{ - return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw1(This)); -} - -static HRESULT WINAPI -IDirectDraw2Impl_FlipToGDISurface(LPDIRECTDRAW2 This) -{ - return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw2(This)); -} - -static HRESULT WINAPI -IDirectDraw4Impl_FlipToGDISurface(LPDIRECTDRAW4 This) -{ - return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw4(This)); -} - -static HRESULT WINAPI -IDirectDrawImpl_GetCaps(LPDIRECTDRAW This, LPDDCAPS pDDC1, LPDDCAPS pDDC2) -{ - return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw1(This), pDDC1, pDDC2); -} - -static HRESULT WINAPI -IDirectDraw2Impl_GetCaps(LPDIRECTDRAW2 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2) -{ - return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw2(This), pDDC1, pDDC2); -} - -static HRESULT WINAPI -IDirectDraw4Impl_GetCaps(LPDIRECTDRAW4 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2) -{ - return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw4(This), pDDC1, pDDC2); -} - -static HRESULT WINAPI -IDirectDrawImpl_GetDisplayMode(LPDIRECTDRAW This, LPDDSURFACEDESC pDDSD) -{ - return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This), (LPDDSURFACEDESC2)pDDSD); -} - -static HRESULT WINAPI -IDirectDraw2Impl_GetDisplayMode(LPDIRECTDRAW2 This, LPDDSURFACEDESC pDDSD) -{ - return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This), (LPDDSURFACEDESC2)pDDSD); -} - -static HRESULT WINAPI -IDirectDraw4Impl_GetDisplayMode(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pDDSD) -{ - return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This), (LPDDSURFACEDESC2)pDDSD); -} - -static HRESULT WINAPI -IDirectDrawImpl_GetFourCCCodes(LPDIRECTDRAW This, LPDWORD lpNumCodes, - LPDWORD lpCodes) -{ - return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw1(This), lpNumCodes, lpCodes); -} - -static HRESULT WINAPI -IDirectDraw2Impl_GetFourCCCodes(LPDIRECTDRAW2 This, LPDWORD lpNumCodes, - LPDWORD lpCodes) -{ - return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw2(This), lpNumCodes, lpCodes); -} - -static HRESULT WINAPI -IDirectDraw4Impl_GetFourCCCodes(LPDIRECTDRAW4 This, LPDWORD lpNumCodes, - LPDWORD lpCodes) -{ - return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw4(This), lpNumCodes, lpCodes); -} - -static HRESULT WINAPI -IDirectDrawImpl_GetGDISurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE *ppSurf) -{ - LPDIRECTDRAWSURFACE7 pSurf7; - HRESULT hr; - - hr = IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw1(This), &pSurf7); - - /* This coercion is safe, since the IDirectDrawSurface3 vtable has the - * IDirectDrawSurface vtable layout at the beginning */ - *ppSurf = pSurf7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf7)->IDirectDrawSurface3_vtbl : NULL; - - return hr; -} - -static HRESULT WINAPI -IDirectDraw2Impl_GetGDISurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE *ppSurf) -{ - LPDIRECTDRAWSURFACE7 pSurf7; - HRESULT hr; - - hr = IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw2(This), &pSurf7); - - /* This coercion is safe, since the IDirectDrawSurface3 vtable has the - * IDirectDrawSurface vtable layout at the beginning */ - *ppSurf = pSurf7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf7)->IDirectDrawSurface3_vtbl : NULL; - - return hr; -} - -static HRESULT WINAPI -IDirectDraw4Impl_GetGDISurface(LPDIRECTDRAW4 This, - LPDIRECTDRAWSURFACE4 *ppSurf) -{ - return IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw4(This), (LPDIRECTDRAWSURFACE7 *)ppSurf); -} - -static HRESULT WINAPI -IDirectDrawImpl_GetMonitorFrequency(LPDIRECTDRAW This, LPDWORD pdwFreq) -{ - return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw1(This), pdwFreq); -} - -static HRESULT WINAPI -IDirectDraw2Impl_GetMonitorFrequency(LPDIRECTDRAW2 This, LPDWORD pdwFreq) -{ - return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw2(This), pdwFreq); -} - -static HRESULT WINAPI -IDirectDraw4Impl_GetMonitorFrequency(LPDIRECTDRAW4 This, LPDWORD pdwFreq) -{ - return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw4(This), pdwFreq); -} - -static HRESULT WINAPI -IDirectDrawImpl_GetScanLine(LPDIRECTDRAW This, LPDWORD pdwLine) -{ - return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw1(This), pdwLine); -} - -static HRESULT WINAPI -IDirectDraw2Impl_GetScanLine(LPDIRECTDRAW2 This, LPDWORD pdwLine) -{ - return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw2(This), pdwLine); -} - -static HRESULT WINAPI -IDirectDraw4Impl_GetScanLine(LPDIRECTDRAW4 This, LPDWORD pdwLine) -{ - return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw4(This), pdwLine); -} - -static HRESULT WINAPI -IDirectDrawImpl_GetVerticalBlankStatus(LPDIRECTDRAW This, LPBOOL lpbIsInVB) -{ - return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw1(This), lpbIsInVB); -} - -static HRESULT WINAPI -IDirectDraw2Impl_GetVerticalBlankStatus(LPDIRECTDRAW2 This, LPBOOL lpbIsInVB) -{ - return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw2(This), lpbIsInVB); -} - -static HRESULT WINAPI -IDirectDraw4Impl_GetVerticalBlankStatus(LPDIRECTDRAW4 This, LPBOOL lpbIsInVB) -{ - return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw4(This), lpbIsInVB); -} - -static HRESULT WINAPI -IDirectDrawImpl_Initialize(LPDIRECTDRAW iface, LPGUID pGUID) -{ - IDirectDrawImpl *This = ddraw_from_ddraw1(iface); - HRESULT ret_value; - - ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID); - - return ret_value; -} - -static HRESULT WINAPI -IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface, LPGUID pGUID) -{ - IDirectDrawImpl *This = ddraw_from_ddraw2(iface); - HRESULT ret_value; - - ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID); - - return ret_value; -} - -static HRESULT WINAPI -IDirectDraw4Impl_Initialize(LPDIRECTDRAW4 iface, LPGUID pGUID) -{ - IDirectDrawImpl *This = ddraw_from_ddraw4(iface); - HRESULT ret_value; - - ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID); - - return ret_value; -} - - -static HRESULT WINAPI -IDirectDrawImpl_RestoreDisplayMode(LPDIRECTDRAW This) -{ - return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This)); -} - -static HRESULT WINAPI -IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 This) -{ - return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This)); -} - -static HRESULT WINAPI -IDirectDraw4Impl_RestoreDisplayMode(LPDIRECTDRAW4 This) -{ - return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This)); -} - -static HRESULT WINAPI -IDirectDrawImpl_SetCooperativeLevel(LPDIRECTDRAW This, HWND hWnd, - DWORD dwFlags) -{ - return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw1(This), hWnd, dwFlags); -} - -static HRESULT WINAPI -IDirectDraw2Impl_SetCooperativeLevel(LPDIRECTDRAW2 This, HWND hWnd, - DWORD dwFlags) -{ - return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw2(This), hWnd, dwFlags); -} - -static HRESULT WINAPI -IDirectDraw4Impl_SetCooperativeLevel(LPDIRECTDRAW4 This, HWND hWnd, - DWORD dwFlags) -{ - return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw4(This), hWnd, dwFlags); -} - -static HRESULT WINAPI -IDirectDrawImpl_SetDisplayMode(LPDIRECTDRAW This, DWORD a, DWORD b, DWORD c) -{ - return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This), a, b, c, 0, 0); -} - -static HRESULT WINAPI -IDirectDraw2Impl_SetDisplayMode(LPDIRECTDRAW2 This, DWORD a, DWORD b, DWORD c, - DWORD d, DWORD e) -{ - return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This), a, b, c, d, e); -} - -static HRESULT WINAPI -IDirectDraw4Impl_SetDisplayMode(LPDIRECTDRAW4 This, DWORD a, DWORD b, DWORD c, - DWORD d, DWORD e) -{ - return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This), a, b, c, d, e); -} - -static HRESULT WINAPI -IDirectDrawImpl_WaitForVerticalBlank(LPDIRECTDRAW This, DWORD dwFlags, - HANDLE hEvent) -{ - return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, hEvent); -} - -static HRESULT WINAPI -IDirectDraw2Impl_WaitForVerticalBlank(LPDIRECTDRAW2 This, DWORD dwFlags, - HANDLE hEvent) -{ - return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, hEvent); -} - -static HRESULT WINAPI -IDirectDraw4Impl_WaitForVerticalBlank(LPDIRECTDRAW4 This, DWORD dwFlags, - HANDLE hEvent) -{ - return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, hEvent); -} - -static HRESULT WINAPI -IDirectDraw2Impl_GetAvailableVidMem(LPDIRECTDRAW2 This, LPDDSCAPS pCaps, - LPDWORD pdwTotal, LPDWORD pdwFree) -{ - DDSCAPS2 Caps2; - DDRAW_Convert_DDSCAPS_1_To_2(pCaps, &Caps2); - - return IDirectDraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw2(This), &Caps2, pdwTotal, pdwFree); -} - -static HRESULT WINAPI -IDirectDraw4Impl_GetAvailableVidMem(LPDIRECTDRAW4 This, LPDDSCAPS2 pCaps, - LPDWORD pdwTotal, LPDWORD pdwFree) -{ - return IDirectDraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw4(This), pCaps, pdwTotal, pdwFree); -} - -static HRESULT WINAPI -IDirectDraw4Impl_GetSurfaceFromDC(LPDIRECTDRAW4 This, HDC hDC, - LPDIRECTDRAWSURFACE4 *pSurf) -{ - return IDirectDraw7_GetSurfaceFromDC((IDirectDraw7 *)ddraw_from_ddraw4(This), hDC, (LPDIRECTDRAWSURFACE7 *)pSurf); -} - -static HRESULT WINAPI -IDirectDraw4Impl_RestoreAllSurfaces(LPDIRECTDRAW4 This) -{ - return IDirectDraw7_RestoreAllSurfaces((IDirectDraw7 *)ddraw_from_ddraw4(This)); -} - -static HRESULT WINAPI -IDirectDraw4Impl_TestCooperativeLevel(LPDIRECTDRAW4 This) -{ - return IDirectDraw7_TestCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw4(This)); -} - -static HRESULT WINAPI -IDirectDraw4Impl_GetDeviceIdentifier(LPDIRECTDRAW4 This, - LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags) -{ - DDDEVICEIDENTIFIER2 DDDI2; - HRESULT hr; - - hr = IDirectDraw7_GetDeviceIdentifier((IDirectDraw7 *)ddraw_from_ddraw4(This), &DDDI2, dwFlags); - - DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(&DDDI2, pDDDI); - - return hr; -} - -const IDirectDrawVtbl IDirectDraw1_Vtbl = -{ - IDirectDrawImpl_QueryInterface, - IDirectDrawImpl_AddRef, - IDirectDrawImpl_Release, - IDirectDrawImpl_Compact, - IDirectDrawImpl_CreateClipper, - IDirectDrawImpl_CreatePalette, - IDirectDrawImpl_CreateSurface, - IDirectDrawImpl_DuplicateSurface, - IDirectDrawImpl_EnumDisplayModes, - IDirectDrawImpl_EnumSurfaces, - IDirectDrawImpl_FlipToGDISurface, - IDirectDrawImpl_GetCaps, - IDirectDrawImpl_GetDisplayMode, - IDirectDrawImpl_GetFourCCCodes, - IDirectDrawImpl_GetGDISurface, - IDirectDrawImpl_GetMonitorFrequency, - IDirectDrawImpl_GetScanLine, - IDirectDrawImpl_GetVerticalBlankStatus, - IDirectDrawImpl_Initialize, - IDirectDrawImpl_RestoreDisplayMode, - IDirectDrawImpl_SetCooperativeLevel, - IDirectDrawImpl_SetDisplayMode, - IDirectDrawImpl_WaitForVerticalBlank, -}; - -const IDirectDraw2Vtbl IDirectDraw2_Vtbl = -{ - IDirectDraw2Impl_QueryInterface, - IDirectDraw2Impl_AddRef, - IDirectDraw2Impl_Release, - IDirectDraw2Impl_Compact, - IDirectDraw2Impl_CreateClipper, - IDirectDraw2Impl_CreatePalette, - IDirectDraw2Impl_CreateSurface, - IDirectDraw2Impl_DuplicateSurface, - IDirectDraw2Impl_EnumDisplayModes, - IDirectDraw2Impl_EnumSurfaces, - IDirectDraw2Impl_FlipToGDISurface, - IDirectDraw2Impl_GetCaps, - IDirectDraw2Impl_GetDisplayMode, - IDirectDraw2Impl_GetFourCCCodes, - IDirectDraw2Impl_GetGDISurface, - IDirectDraw2Impl_GetMonitorFrequency, - IDirectDraw2Impl_GetScanLine, - IDirectDraw2Impl_GetVerticalBlankStatus, - IDirectDraw2Impl_Initialize, - IDirectDraw2Impl_RestoreDisplayMode, - IDirectDraw2Impl_SetCooperativeLevel, - IDirectDraw2Impl_SetDisplayMode, - IDirectDraw2Impl_WaitForVerticalBlank, - IDirectDraw2Impl_GetAvailableVidMem -}; - -const IDirectDraw4Vtbl IDirectDraw4_Vtbl = -{ - IDirectDraw4Impl_QueryInterface, - IDirectDraw4Impl_AddRef, - IDirectDraw4Impl_Release, - IDirectDraw4Impl_Compact, - IDirectDraw4Impl_CreateClipper, - IDirectDraw4Impl_CreatePalette, - IDirectDraw4Impl_CreateSurface, - IDirectDraw4Impl_DuplicateSurface, - IDirectDraw4Impl_EnumDisplayModes, - IDirectDraw4Impl_EnumSurfaces, - IDirectDraw4Impl_FlipToGDISurface, - IDirectDraw4Impl_GetCaps, - IDirectDraw4Impl_GetDisplayMode, - IDirectDraw4Impl_GetFourCCCodes, - IDirectDraw4Impl_GetGDISurface, - IDirectDraw4Impl_GetMonitorFrequency, - IDirectDraw4Impl_GetScanLine, - IDirectDraw4Impl_GetVerticalBlankStatus, - IDirectDraw4Impl_Initialize, - IDirectDraw4Impl_RestoreDisplayMode, - IDirectDraw4Impl_SetCooperativeLevel, - IDirectDraw4Impl_SetDisplayMode, - IDirectDraw4Impl_WaitForVerticalBlank, - IDirectDraw4Impl_GetAvailableVidMem, - IDirectDraw4Impl_GetSurfaceFromDC, - IDirectDraw4Impl_RestoreAllSurfaces, - IDirectDraw4Impl_TestCooperativeLevel, - IDirectDraw4Impl_GetDeviceIdentifier -}; diff --git a/dll/directx/wine/ddraw/device.c b/dll/directx/wine/ddraw/device.c index 9a4e5c73204..9f0f631724c 100644 --- a/dll/directx/wine/ddraw/device.c +++ b/dll/directx/wine/ddraw/device.c @@ -30,28 +30,9 @@ #include "config.h" #include "wine/port.h" -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - #include "ddraw_private.h" -#include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); -WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk); +WINE_DEFAULT_DEBUG_CHANNEL(ddraw); /* The device ID */ const GUID IID_D3DDEVICE_WineD3D = { @@ -121,7 +102,8 @@ IDirect3DDeviceImpl_7_QueryInterface(IDirect3DDevice7 *iface, void **obj) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(refiid), obj); + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(refiid), obj); /* According to COM docs, if the QueryInterface fails, obj should be set to NULL */ *obj = NULL; @@ -214,9 +196,9 @@ Thunk_IDirect3DDeviceImpl_3_QueryInterface(IDirect3DDevice3 *iface, REFIID riid, void **obj) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", This, debugstr_guid(riid), obj); - return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)This, riid, obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); + + return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)device_from_device3(iface), riid, obj); } static HRESULT WINAPI @@ -224,9 +206,9 @@ Thunk_IDirect3DDeviceImpl_2_QueryInterface(IDirect3DDevice2 *iface, REFIID riid, void **obj) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", This, debugstr_guid(riid), obj); - return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)This, riid, obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); + + return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)device_from_device2(iface), riid, obj); } static HRESULT WINAPI @@ -234,9 +216,9 @@ Thunk_IDirect3DDeviceImpl_1_QueryInterface(IDirect3DDevice *iface, REFIID riid, void **obp) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", This, debugstr_guid(riid), obp); - return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)This, riid, obp); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp); + + return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)device_from_device1(iface), riid, obp); } /***************************************************************************** @@ -257,7 +239,7 @@ IDirect3DDeviceImpl_7_AddRef(IDirect3DDevice7 *iface) IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p) : incrementing from %u.\n", This, ref -1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -265,23 +247,24 @@ IDirect3DDeviceImpl_7_AddRef(IDirect3DDevice7 *iface) static ULONG WINAPI Thunk_IDirect3DDeviceImpl_3_AddRef(IDirect3DDevice3 *iface) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_AddRef((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_AddRef((IDirect3DDevice7 *)device_from_device3(iface)); } static ULONG WINAPI Thunk_IDirect3DDeviceImpl_2_AddRef(IDirect3DDevice2 *iface) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_AddRef((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_AddRef((IDirect3DDevice7 *)device_from_device2(iface)); } static ULONG WINAPI Thunk_IDirect3DDeviceImpl_1_AddRef(IDirect3DDevice *iface) { - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface); + TRACE("iface %p.\n", iface); + return IDirect3DDevice7_AddRef((IDirect3DDevice7 *)device_from_device1(iface)); } @@ -303,7 +286,7 @@ IDirect3DDeviceImpl_7_Release(IDirect3DDevice7 *iface) IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref +1); + TRACE("%p decreasing refcount to %u.\n", This, ref); /* This method doesn't destroy the WineD3DDevice, because it's still in use for * 2D rendering. IDirectDrawSurface7::Release will destroy the WineD3DDevice @@ -317,10 +300,8 @@ IDirect3DDeviceImpl_7_Release(IDirect3DDevice7 *iface) EnterCriticalSection(&ddraw_cs); /* Free the index buffer. */ IWineD3DDevice_SetIndexBuffer(This->wineD3DDevice, NULL, WINED3DFMT_UNKNOWN); - IWineD3DBuffer_GetParent(This->indexbuffer, - (IUnknown **) &IndexBufferParent); - IParent_Release(IndexBufferParent); /* Once for the getParent */ - if( IParent_Release(IndexBufferParent) != 0) /* And now to destroy it */ + IndexBufferParent = IWineD3DBuffer_GetParent(This->indexbuffer); + if (IParent_Release(IndexBufferParent)) { ERR(" (%p) Something is still holding the index buffer parent %p\n", This, IndexBufferParent); } @@ -330,34 +311,10 @@ IDirect3DDeviceImpl_7_Release(IDirect3DDevice7 *iface) * IDirect3DVertexBuffer::Release will unset it. */ - /* Restore the render targets */ - if(This->OffScreenTarget) - { - WINED3DVIEWPORT vp; - - vp.X = 0; - vp.Y = 0; - vp.Width = This->ddraw->d3d_target->surface_desc.dwWidth; - vp.Height = This->ddraw->d3d_target->surface_desc.dwHeight; - vp.MinZ = 0.0; - vp.MaxZ = 1.0; - IWineD3DDevice_SetViewport(This->wineD3DDevice, - &vp); - - /* Set the device up to render to the front buffer since the back buffer will - * vanish soon. - */ - IWineD3DDevice_SetRenderTarget(This->wineD3DDevice, 0, - This->ddraw->d3d_target->WineD3DSurface, - FALSE); - /* This->target is the offscreen target. - * This->ddraw->d3d_target is the target used by DDraw - */ - TRACE("(%p) Release: Using %p as front buffer, %p as back buffer\n", This, This->ddraw->d3d_target, NULL); - IWineD3DDevice_SetFrontBackBuffers(This->wineD3DDevice, - This->ddraw->d3d_target->WineD3DSurface, - NULL); - } + /* Set the device up to render to the front buffer since the back + * buffer will vanish soon. */ + IWineD3DDevice_SetRenderTarget(This->wineD3DDevice, 0, + This->ddraw->d3d_target->WineD3DSurface, TRUE); /* Release the WineD3DDevice. This won't destroy it */ if(IWineD3DDevice_Release(This->wineD3DDevice) <= 0) @@ -366,53 +323,55 @@ IDirect3DDeviceImpl_7_Release(IDirect3DDevice7 *iface) } /* The texture handles should be unset by now, but there might be some bits - * missing in our reference counting(needs test). Do a sanity check - */ - for(i = 0; i < This->numHandles; i++) + * missing in our reference counting(needs test). Do a sanity check. */ + for (i = 0; i < This->handle_table.entry_count; ++i) { - if(This->Handles[i].ptr) + struct ddraw_handle_entry *entry = &This->handle_table.entries[i]; + + switch (entry->type) { - switch(This->Handles[i].type) + case DDRAW_HANDLE_FREE: + break; + + case DDRAW_HANDLE_MATERIAL: { - case DDrawHandle_Texture: - { - IDirectDrawSurfaceImpl *surf = This->Handles[i].ptr; - FIXME("Texture Handle %d not unset properly\n", i + 1); - surf->Handle = 0; - } + IDirect3DMaterialImpl *m = entry->object; + FIXME("Material handle %#x (%p) not unset properly.\n", i + 1, m); + m->Handle = 0; break; - - case DDrawHandle_Material: - { - IDirect3DMaterialImpl *mat = This->Handles[i].ptr; - FIXME("Material handle %d not unset properly\n", i + 1); - mat->Handle = 0; - } - break; - - case DDrawHandle_Matrix: - { - /* No fixme here because this might happen because of sloppy apps */ - WARN("Leftover matrix handle %d, deleting\n", i + 1); - IDirect3DDevice_DeleteMatrix((IDirect3DDevice *)&This->IDirect3DDevice_vtbl, i + 1); - } - break; - - case DDrawHandle_StateBlock: - { - /* No fixme here because this might happen because of sloppy apps */ - WARN("Leftover stateblock handle %d, deleting\n", i + 1); - IDirect3DDevice7_DeleteStateBlock((IDirect3DDevice7 *)This, i + 1); - } - break; - - default: - FIXME("Unknown handle %d not unset properly\n", i + 1); } + + case DDRAW_HANDLE_MATRIX: + { + /* No FIXME here because this might happen because of sloppy applications. */ + WARN("Leftover matrix handle %#x (%p), deleting.\n", i + 1, entry->object); + IDirect3DDevice_DeleteMatrix((IDirect3DDevice *)&This->IDirect3DDevice_vtbl, i + 1); + break; + } + + case DDRAW_HANDLE_STATEBLOCK: + { + /* No FIXME here because this might happen because of sloppy applications. */ + WARN("Leftover stateblock handle %#x (%p), deleting.\n", i + 1, entry->object); + IDirect3DDevice7_DeleteStateBlock(iface, i + 1); + break; + } + + case DDRAW_HANDLE_SURFACE: + { + IDirectDrawSurfaceImpl *surf = entry->object; + FIXME("Texture handle %#x (%p) not unset properly.\n", i + 1, surf); + surf->Handle = 0; + break; + } + + default: + FIXME("Handle %#x (%p) has unknown type %#x.\n", i + 1, entry->object, entry->type); + break; } } - HeapFree(GetProcessHeap(), 0, This->Handles); + ddraw_handle_table_destroy(&This->handle_table); TRACE("Releasing target %p %p\n", This->target, This->ddraw->d3d_target); /* Release the render target and the WineD3D render target @@ -436,25 +395,25 @@ IDirect3DDeviceImpl_7_Release(IDirect3DDevice7 *iface) static ULONG WINAPI Thunk_IDirect3DDeviceImpl_3_Release(IDirect3DDevice3 *iface) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_Release((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_Release((IDirect3DDevice7 *)device_from_device3(iface)); } static ULONG WINAPI Thunk_IDirect3DDeviceImpl_2_Release(IDirect3DDevice2 *iface) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_Release((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_Release((IDirect3DDevice7 *)device_from_device2(iface)); } static ULONG WINAPI Thunk_IDirect3DDeviceImpl_1_Release(IDirect3DDevice *iface) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_Release((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_Release((IDirect3DDevice7 *)device_from_device1(iface)); } /***************************************************************************** @@ -480,12 +439,10 @@ IDirect3DDeviceImpl_1_Initialize(IDirect3DDevice *iface, IDirect3D *Direct3D, GUID *guid, D3DDEVICEDESC *Desc) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - /* It shouldn't be crucial, but print a FIXME, I'm interested if - * any game calls it and when - */ - FIXME("(%p)->(%p,%p,%p): No-op!\n", This, Direct3D, guid, Desc); + * any game calls it and when. */ + FIXME("iface %p, d3d %p, guid %s, device_desc %p nop!\n", + iface, Direct3D, debugstr_guid(guid), Desc); return D3D_OK; } @@ -512,7 +469,8 @@ IDirect3DDeviceImpl_7_GetCaps(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; D3DDEVICEDESC OldDesc; - TRACE("(%p)->(%p)\n", This, Desc); + + TRACE("iface %p, device_desc %p.\n", iface, Desc); /* Call the same function used by IDirect3D, this saves code */ return IDirect3DImpl_GetCaps(This->ddraw->wineD3D, &OldDesc, Desc); @@ -563,7 +521,8 @@ IDirect3DDeviceImpl_3_GetCaps(IDirect3DDevice3 *iface, IDirect3DDeviceImpl *This = device_from_device3(iface); D3DDEVICEDESC7 newDesc; HRESULT hr; - TRACE("(%p)->(%p,%p)\n", iface, HWDesc, HelDesc); + + TRACE("iface %p, hw_desc %p, hel_desc %p.\n", iface, HWDesc, HelDesc); hr = IDirect3DImpl_GetCaps(This->ddraw->wineD3D, HWDesc, &newDesc); if(hr != D3D_OK) return hr; @@ -578,7 +537,7 @@ Thunk_IDirect3DDeviceImpl_2_GetCaps(IDirect3DDevice2 *iface, D3DDEVICEDESC *D3DHELDevDesc) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice3 interface.\n", This, D3DHWDevDesc, D3DHELDevDesc); + TRACE("iface %p, hw_desc %p, hel_desc %p.\n", iface, D3DHWDevDesc, D3DHELDevDesc); return IDirect3DDevice3_GetCaps((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, D3DHWDevDesc, D3DHELDevDesc); } @@ -588,7 +547,7 @@ Thunk_IDirect3DDeviceImpl_1_GetCaps(IDirect3DDevice *iface, D3DDEVICEDESC *D3DHELDevDesc) { IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice3 interface.\n", This, D3DHWDevDesc, D3DHELDevDesc); + TRACE("iface %p, hw_desc %p, hel_desc %p.\n", iface, D3DHWDevDesc, D3DHELDevDesc); return IDirect3DDevice3_GetCaps((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, D3DHWDevDesc, D3DHELDevDesc); } @@ -610,18 +569,21 @@ IDirect3DDeviceImpl_2_SwapTextureHandles(IDirect3DDevice2 *iface, IDirect3DTexture2 *Tex2) { IDirect3DDeviceImpl *This = device_from_device2(iface); - DWORD swap; IDirectDrawSurfaceImpl *surf1 = surface_from_texture2(Tex1); IDirectDrawSurfaceImpl *surf2 = surface_from_texture2(Tex2); - TRACE("(%p)->(%p,%p)\n", This, surf1, surf2); + DWORD h1, h2; + + TRACE("iface %p, tex1 %p, tex2 %p.\n", iface, Tex1, Tex2); EnterCriticalSection(&ddraw_cs); - This->Handles[surf1->Handle - 1].ptr = surf2; - This->Handles[surf2->Handle - 1].ptr = surf1; - swap = surf2->Handle; - surf2->Handle = surf1->Handle; - surf1->Handle = swap; + h1 = surf1->Handle - 1; + h2 = surf2->Handle - 1; + This->handle_table.entries[h1].object = surf2; + This->handle_table.entries[h2].object = surf1; + surf2->Handle = h1 + 1; + surf1->Handle = h2 + 1; + LeaveCriticalSection(&ddraw_cs); return D3D_OK; @@ -637,7 +599,9 @@ Thunk_IDirect3DDeviceImpl_1_SwapTextureHandles(IDirect3DDevice *iface, IDirectDrawSurfaceImpl *surf2 = surface_from_texture1(D3DTex2); IDirect3DTexture2 *t1 = surf1 ? (IDirect3DTexture2 *)&surf1->IDirect3DTexture2_vtbl : NULL; IDirect3DTexture2 *t2 = surf2 ? (IDirect3DTexture2 *)&surf2->IDirect3DTexture2_vtbl : NULL; - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice2 interface.\n", This, surf1, surf2); + + TRACE("iface %p, tex1 %p, tex2 %p.\n", iface, D3DTex1, D3DTex2); + return IDirect3DDevice2_SwapTextureHandles((IDirect3DDevice2 *)&This->IDirect3DDevice2_vtbl, t1, t2); } @@ -663,8 +627,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_3_GetStats(IDirect3DDevice3 *iface, D3DSTATS *Stats) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - FIXME("(%p)->(%p): Stub!\n", This, Stats); + FIXME("iface %p, stats %p stub!\n", iface, Stats); if(!Stats) return DDERR_INVALIDPARAMS; @@ -684,7 +647,9 @@ Thunk_IDirect3DDeviceImpl_2_GetStats(IDirect3DDevice2 *iface, D3DSTATS *Stats) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, Stats); + + TRACE("iface %p, stats %p.\n", iface, Stats); + return IDirect3DDevice3_GetStats((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, Stats); } @@ -693,7 +658,9 @@ Thunk_IDirect3DDeviceImpl_1_GetStats(IDirect3DDevice *iface, D3DSTATS *Stats) { IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, Stats); + + TRACE("iface %p, stats %p.\n", iface, Stats); + return IDirect3DDevice3_GetStats((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, Stats); } @@ -725,7 +692,10 @@ IDirect3DDeviceImpl_1_CreateExecuteBuffer(IDirect3DDevice *iface, { IDirect3DDeviceImpl *This = device_from_device1(iface); IDirect3DExecuteBufferImpl* object; - TRACE("(%p)->(%p,%p,%p)!\n", This, Desc, ExecuteBuffer, UnkOuter); + HRESULT hr; + + TRACE("iface %p, buffer_desc %p, buffer %p, outer_unknown %p.\n", + iface, Desc, ExecuteBuffer, UnkOuter); if(UnkOuter) return CLASS_E_NOAGGREGATION; @@ -738,45 +708,13 @@ IDirect3DDeviceImpl_1_CreateExecuteBuffer(IDirect3DDevice *iface, return DDERR_OUTOFMEMORY; } - object->lpVtbl = &IDirect3DExecuteBuffer_Vtbl; - object->ref = 1; - object->d3ddev = This; - - /* Initializes memory */ - memcpy(&object->desc, Desc, Desc->dwSize); - - /* No buffer given */ - if ((object->desc.dwFlags & D3DDEB_LPDATA) == 0) - object->desc.lpData = NULL; - - /* No buffer size given */ - if ((object->desc.dwFlags & D3DDEB_BUFSIZE) == 0) - object->desc.dwBufferSize = 0; - - /* Create buffer if asked */ - if ((object->desc.lpData == NULL) && (object->desc.dwBufferSize > 0)) + hr = d3d_execute_buffer_init(object, This, Desc); + if (FAILED(hr)) { - object->need_free = TRUE; - object->desc.lpData = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,object->desc.dwBufferSize); - if(!object->desc.lpData) - { - ERR("Out of memory when allocating the execute buffer data\n"); - HeapFree(GetProcessHeap(), 0, object); - return DDERR_OUTOFMEMORY; - } + WARN("Failed to initialize execute buffer, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; } - else - { - object->need_free = FALSE; - } - - /* No vertices for the moment */ - object->vertex_data = NULL; - - object->desc.dwFlags |= D3DDEB_LPDATA; - - object->indices = NULL; - object->nb_indices = 0; *ExecuteBuffer = (IDirect3DExecuteBuffer *)object; @@ -810,7 +748,7 @@ IDirect3DDeviceImpl_1_Execute(IDirect3DDevice *iface, IDirect3DExecuteBufferImpl *Direct3DExecuteBufferImpl = (IDirect3DExecuteBufferImpl *)ExecuteBuffer; IDirect3DViewportImpl *Direct3DViewportImpl = (IDirect3DViewportImpl *)Viewport; - TRACE("(%p)->(%p,%p,%08x)\n", This, Direct3DExecuteBufferImpl, Direct3DViewportImpl, Flags); + TRACE("iface %p, buffer %p, viewport %p, flags %#x.\n", iface, ExecuteBuffer, Viewport, Flags); if(!Direct3DExecuteBufferImpl) return DDERR_INVALIDPARAMS; @@ -847,7 +785,7 @@ IDirect3DDeviceImpl_3_AddViewport(IDirect3DDevice3 *iface, IDirect3DDeviceImpl *This = device_from_device3(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Viewport; - TRACE("(%p)->(%p)\n", This, vp); + TRACE("iface %p, viewport %p.\n", iface, Viewport); /* Sanity check */ if(!vp) @@ -869,7 +807,9 @@ Thunk_IDirect3DDeviceImpl_2_AddViewport(IDirect3DDevice2 *iface, { IDirect3DDeviceImpl *This = device_from_device2(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Direct3DViewport2; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2); + return IDirect3DDevice3_AddViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp); } @@ -879,7 +819,9 @@ Thunk_IDirect3DDeviceImpl_1_AddViewport(IDirect3DDevice *iface, { IDirect3DDeviceImpl *This = device_from_device1(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Direct3DViewport; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport); + return IDirect3DDevice3_AddViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp); } @@ -907,7 +849,7 @@ IDirect3DDeviceImpl_3_DeleteViewport(IDirect3DDevice3 *iface, IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *) Viewport; IDirect3DViewportImpl *cur_viewport, *prev_viewport = NULL; - TRACE("(%p)->(%p)\n", This, vp); + TRACE("iface %p, viewport %p.\n", iface, Viewport); EnterCriticalSection(&ddraw_cs); cur_viewport = This->viewport_list; @@ -935,7 +877,9 @@ Thunk_IDirect3DDeviceImpl_2_DeleteViewport(IDirect3DDevice2 *iface, { IDirect3DDeviceImpl *This = device_from_device2(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Direct3DViewport2; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2); + return IDirect3DDevice3_DeleteViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp); } @@ -945,7 +889,9 @@ Thunk_IDirect3DDeviceImpl_1_DeleteViewport(IDirect3DDevice *iface, { IDirect3DDeviceImpl *This = device_from_device1(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Direct3DViewport; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport); + return IDirect3DDevice3_DeleteViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp); } @@ -977,7 +923,8 @@ IDirect3DDeviceImpl_3_NextViewport(IDirect3DDevice3 *iface, IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Viewport3; IDirect3DViewportImpl *res = NULL; - TRACE("(%p)->(%p,%p,%08x)\n", This, vp, lplpDirect3DViewport3, Flags); + TRACE("iface %p, viewport %p, next %p, flags %#x.\n", + iface, Viewport3, lplpDirect3DViewport3, Flags); if(!vp) { @@ -1030,7 +977,10 @@ Thunk_IDirect3DDeviceImpl_2_NextViewport(IDirect3DDevice2 *iface, IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Viewport2; IDirect3DViewport3 *res; HRESULT hr; - TRACE_(ddraw_thunk)("(%p)->(%p,%p,%08x) thunking to IDirect3DDevice3 interface.\n", This, vp, lplpDirect3DViewport2, Flags); + + TRACE("iface %p, viewport %p, next %p, flags %#x.\n", + iface, Viewport2, lplpDirect3DViewport2, Flags); + hr = IDirect3DDevice3_NextViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp, &res, Flags); *lplpDirect3DViewport2 = (IDirect3DViewport2 *)res; @@ -1047,7 +997,10 @@ Thunk_IDirect3DDeviceImpl_1_NextViewport(IDirect3DDevice *iface, IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Viewport; IDirect3DViewport3 *res; HRESULT hr; - TRACE_(ddraw_thunk)("(%p)->(%p,%p,%08x) thunking to IDirect3DDevice3 interface.\n", This, vp, lplpDirect3DViewport, Flags); + + TRACE("iface %p, viewport %p, next %p, flags %#x.\n", + iface, Viewport, lplpDirect3DViewport, Flags); + hr = IDirect3DDevice3_NextViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp, &res, Flags); *lplpDirect3DViewport = (IDirect3DViewport *)res; @@ -1082,10 +1035,8 @@ IDirect3DDeviceImpl_1_Pick(IDirect3DDevice *iface, DWORD Flags, D3DRECT *Rect) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - IDirect3DExecuteBufferImpl *execbuf = (IDirect3DExecuteBufferImpl *)ExecuteBuffer; - IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Viewport; - FIXME("(%p)->(%p,%p,%08x,%p): stub!\n", This, execbuf, vp, Flags, Rect); + FIXME("iface %p, buffer %p, viewport %p, flags %#x, rect %s stub!\n", + iface, ExecuteBuffer, Viewport, Flags, wine_dbgstr_rect((RECT *)Rect)); return D3D_OK; } @@ -1111,8 +1062,7 @@ IDirect3DDeviceImpl_1_GetPickRecords(IDirect3DDevice *iface, DWORD *Count, D3DPICKRECORD *D3DPickRec) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - FIXME("(%p)->(%p,%p): stub!\n", This, Count, D3DPickRec); + FIXME("iface %p, count %p, records %p stub!\n", iface, Count, D3DPickRec); return D3D_OK; } @@ -1146,7 +1096,8 @@ IDirect3DDeviceImpl_7_EnumTextureFormats(IDirect3DDevice7 *iface, WINED3DDISPLAYMODE mode; unsigned int i; - WINED3DFORMAT FormatList[] = { + static const enum wined3d_format_id FormatList[] = + { /* 32 bit */ WINED3DFMT_B8G8R8A8_UNORM, WINED3DFMT_B8G8R8X8_UNORM, @@ -1166,17 +1117,17 @@ IDirect3DDeviceImpl_7_EnumTextureFormats(IDirect3DDevice7 *iface, WINED3DFMT_DXT5, }; - WINED3DFORMAT BumpFormatList[] = { + static const enum wined3d_format_id BumpFormatList[] = + { WINED3DFMT_R8G8_SNORM, WINED3DFMT_R5G5_SNORM_L6_UNORM, WINED3DFMT_R8G8_SNORM_L8X8_UNORM, - WINED3DFMT_R8G8B8A8_SNORM, WINED3DFMT_R16G16_SNORM, WINED3DFMT_R10G11B11_SNORM, WINED3DFMT_R10G10B10_SNORM_A2_UNORM }; - TRACE("(%p)->(%p,%p): Relay\n", This, Callback, Arg); + TRACE("iface %p, callback %p, context %p.\n", iface, Callback, Arg); if(!Callback) return DDERR_INVALIDPARAMS; @@ -1193,7 +1144,7 @@ IDirect3DDeviceImpl_7_EnumTextureFormats(IDirect3DDevice7 *iface, return hr; } - for(i = 0; i < sizeof(FormatList) / sizeof(WINED3DFORMAT); i++) + for (i = 0; i < sizeof(FormatList) / sizeof(*FormatList); ++i) { hr = IWineD3D_CheckDeviceFormat(This->ddraw->wineD3D, WINED3DADAPTER_DEFAULT, @@ -1222,7 +1173,7 @@ IDirect3DDeviceImpl_7_EnumTextureFormats(IDirect3DDevice7 *iface, } } - for(i = 0; i < sizeof(BumpFormatList) / sizeof(WINED3DFORMAT); i++) + for (i = 0; i < sizeof(BumpFormatList) / sizeof(*BumpFormatList); ++i) { hr = IWineD3D_CheckDeviceFormat(This->ddraw->wineD3D, WINED3DADAPTER_DEFAULT, @@ -1284,7 +1235,9 @@ Thunk_IDirect3DDeviceImpl_3_EnumTextureFormats(IDirect3DDevice3 *iface, void *Arg) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice7 interface.\n", This, Callback, Arg); + + TRACE("iface %p, callback %p, context %p.\n", iface, Callback, Arg); + return IDirect3DDevice7_EnumTextureFormats((IDirect3DDevice7 *)This, Callback, Arg); } @@ -1308,7 +1261,8 @@ IDirect3DDeviceImpl_2_EnumTextureFormats(IDirect3DDevice2 *iface, unsigned int i; WINED3DDISPLAYMODE mode; - WINED3DFORMAT FormatList[] = { + static const enum wined3d_format_id FormatList[] = + { /* 32 bit */ WINED3DFMT_B8G8R8A8_UNORM, WINED3DFMT_B8G8R8X8_UNORM, @@ -1325,7 +1279,7 @@ IDirect3DDeviceImpl_2_EnumTextureFormats(IDirect3DDevice2 *iface, /* FOURCC codes - Not in this version*/ }; - TRACE("(%p)->(%p,%p): Relay\n", This, Callback, Arg); + TRACE("iface %p, callback %p, context %p.\n", iface, Callback, Arg); if(!Callback) return DDERR_INVALIDPARAMS; @@ -1342,7 +1296,7 @@ IDirect3DDeviceImpl_2_EnumTextureFormats(IDirect3DDevice2 *iface, return hr; } - for(i = 0; i < sizeof(FormatList) / sizeof(WINED3DFORMAT); i++) + for (i = 0; i < sizeof(FormatList) / sizeof(*FormatList); ++i) { hr = IWineD3D_CheckDeviceFormat(This->ddraw->wineD3D, 0 /* Adapter */, @@ -1384,7 +1338,9 @@ Thunk_IDirect3DDeviceImpl_1_EnumTextureFormats(IDirect3DDevice *iface, void *Arg) { IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice2 interface.\n", This, Callback, Arg); + + TRACE("iface %p, callback %p, context %p.\n", iface, Callback, Arg); + return IDirect3DDevice2_EnumTextureFormats((IDirect3DDevice2 *)&This->IDirect3DDevice2_vtbl, Callback, Arg); } @@ -1409,7 +1365,9 @@ IDirect3DDeviceImpl_1_CreateMatrix(IDirect3DDevice *iface, D3DMATRIXHANDLE *D3DM { IDirect3DDeviceImpl *This = device_from_device1(iface); D3DMATRIX *Matrix; - TRACE("(%p)->(%p)\n", This, D3DMatHandle); + DWORD h; + + TRACE("iface %p, matrix_handle %p.\n", iface, D3DMatHandle); if(!D3DMatHandle) return DDERR_INVALIDPARAMS; @@ -1422,16 +1380,18 @@ IDirect3DDeviceImpl_1_CreateMatrix(IDirect3DDevice *iface, D3DMATRIXHANDLE *D3DM } EnterCriticalSection(&ddraw_cs); - *D3DMatHandle = IDirect3DDeviceImpl_CreateHandle(This); - if(!(*D3DMatHandle)) + + h = ddraw_allocate_handle(&This->handle_table, Matrix, DDRAW_HANDLE_MATRIX); + if (h == DDRAW_INVALID_HANDLE) { - ERR("Failed to create a matrix handle\n"); + ERR("Failed to allocate a matrix handle.\n"); HeapFree(GetProcessHeap(), 0, Matrix); LeaveCriticalSection(&ddraw_cs); return DDERR_OUTOFMEMORY; } - This->Handles[*D3DMatHandle - 1].ptr = Matrix; - This->Handles[*D3DMatHandle - 1].type = DDrawHandle_Matrix; + + *D3DMatHandle = h + 1; + TRACE(" returning matrix handle %d\n", *D3DMatHandle); LeaveCriticalSection(&ddraw_cs); @@ -1462,29 +1422,26 @@ IDirect3DDeviceImpl_1_SetMatrix(IDirect3DDevice *iface, D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE("(%p)->(%08x,%p)\n", This, D3DMatHandle, D3DMatrix); + D3DMATRIX *m; - if( (!D3DMatHandle) || (!D3DMatrix) ) - return DDERR_INVALIDPARAMS; + TRACE("iface %p, matrix_handle %#x, matrix %p.\n", iface, D3DMatHandle, D3DMatrix); + + if (!D3DMatrix) return DDERR_INVALIDPARAMS; EnterCriticalSection(&ddraw_cs); - if(D3DMatHandle > This->numHandles) + + m = ddraw_get_object(&This->handle_table, D3DMatHandle - 1, DDRAW_HANDLE_MATRIX); + if (!m) { - ERR("Handle %d out of range\n", D3DMatHandle); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } - else if(This->Handles[D3DMatHandle - 1].type != DDrawHandle_Matrix) - { - ERR("Handle %d is not a matrix handle\n", D3DMatHandle); + WARN("Invalid matrix handle.\n"); LeaveCriticalSection(&ddraw_cs); return DDERR_INVALIDPARAMS; } - if (TRACE_ON(d3d7)) + if (TRACE_ON(ddraw)) dump_D3DMATRIX(D3DMatrix); - *((D3DMATRIX *) This->Handles[D3DMatHandle - 1].ptr) = *D3DMatrix; + *m = *D3DMatrix; if(This->world == D3DMatHandle) { @@ -1510,7 +1467,7 @@ IDirect3DDeviceImpl_1_SetMatrix(IDirect3DDevice *iface, } /***************************************************************************** - * IDirect3DDevice::SetMatrix + * IDirect3DDevice::GetMatrix * * Returns the content of a D3DMATRIX handle * @@ -1531,29 +1488,23 @@ IDirect3DDeviceImpl_1_GetMatrix(IDirect3DDevice *iface, D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE("(%p)->(%08x,%p)\n", This, D3DMatHandle, D3DMatrix); + D3DMATRIX *m; - if(!D3DMatrix) - return DDERR_INVALIDPARAMS; - if(!D3DMatHandle) - return DDERR_INVALIDPARAMS; + TRACE("iface %p, matrix_handle %#x, matrix %p.\n", iface, D3DMatHandle, D3DMatrix); + + if (!D3DMatrix) return DDERR_INVALIDPARAMS; EnterCriticalSection(&ddraw_cs); - if(D3DMatHandle > This->numHandles) + + m = ddraw_get_object(&This->handle_table, D3DMatHandle - 1, DDRAW_HANDLE_MATRIX); + if (!m) { - ERR("Handle %d out of range\n", D3DMatHandle); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } - else if(This->Handles[D3DMatHandle - 1].type != DDrawHandle_Matrix) - { - ERR("Handle %d is not a matrix handle\n", D3DMatHandle); + WARN("Invalid matrix handle.\n"); LeaveCriticalSection(&ddraw_cs); return DDERR_INVALIDPARAMS; } - /* The handle is simply a pointer to a D3DMATRIX structure */ - *D3DMatrix = *((D3DMATRIX *) This->Handles[D3DMatHandle - 1].ptr); + *D3DMatrix = *m; LeaveCriticalSection(&ddraw_cs); return D3D_OK; @@ -1579,30 +1530,24 @@ IDirect3DDeviceImpl_1_DeleteMatrix(IDirect3DDevice *iface, D3DMATRIXHANDLE D3DMatHandle) { IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE("(%p)->(%08x)\n", This, D3DMatHandle); + D3DMATRIX *m; - if(!D3DMatHandle) - return DDERR_INVALIDPARAMS; + TRACE("iface %p, matrix_handle %#x.\n", iface, D3DMatHandle); EnterCriticalSection(&ddraw_cs); - if(D3DMatHandle > This->numHandles) - { - ERR("Handle %d out of range\n", D3DMatHandle); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } - else if(This->Handles[D3DMatHandle - 1].type != DDrawHandle_Matrix) - { - ERR("Handle %d is not a matrix handle\n", D3DMatHandle); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } - HeapFree(GetProcessHeap(), 0, This->Handles[D3DMatHandle - 1].ptr); - This->Handles[D3DMatHandle - 1].ptr = NULL; - This->Handles[D3DMatHandle - 1].type = DDrawHandle_Unknown; + m = ddraw_free_handle(&This->handle_table, D3DMatHandle - 1, DDRAW_HANDLE_MATRIX); + if (!m) + { + WARN("Invalid matrix handle.\n"); + LeaveCriticalSection(&ddraw_cs); + return DDERR_INVALIDPARAMS; + } LeaveCriticalSection(&ddraw_cs); + + HeapFree(GetProcessHeap(), 0, m); + return D3D_OK; } @@ -1625,7 +1570,8 @@ IDirect3DDeviceImpl_7_BeginScene(IDirect3DDevice7 *iface) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p): Relay\n", This); + + TRACE("iface %p.\n", iface); EnterCriticalSection(&ddraw_cs); hr = IWineD3DDevice_BeginScene(This->wineD3DDevice); @@ -1656,25 +1602,25 @@ IDirect3DDeviceImpl_7_BeginScene_FPUPreserve(IDirect3DDevice7 *iface) static HRESULT WINAPI Thunk_IDirect3DDeviceImpl_3_BeginScene(IDirect3DDevice3 *iface) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)device_from_device3(iface)); } static HRESULT WINAPI Thunk_IDirect3DDeviceImpl_2_BeginScene(IDirect3DDevice2 *iface) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)device_from_device2(iface)); } static HRESULT WINAPI Thunk_IDirect3DDeviceImpl_1_BeginScene(IDirect3DDevice *iface) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)device_from_device1(iface)); } /***************************************************************************** @@ -1696,7 +1642,8 @@ IDirect3DDeviceImpl_7_EndScene(IDirect3DDevice7 *iface) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p): Relay\n", This); + + TRACE("iface %p.\n", iface); EnterCriticalSection(&ddraw_cs); hr = IWineD3DDevice_EndScene(This->wineD3DDevice); @@ -1727,25 +1674,25 @@ IDirect3DDeviceImpl_7_EndScene_FPUPreserve(IDirect3DDevice7 *iface) static HRESULT WINAPI DECLSPEC_HOTPATCH Thunk_IDirect3DDeviceImpl_3_EndScene(IDirect3DDevice3 *iface) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)device_from_device3(iface)); } static HRESULT WINAPI DECLSPEC_HOTPATCH Thunk_IDirect3DDeviceImpl_2_EndScene(IDirect3DDevice2 *iface) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)device_from_device2(iface)); } static HRESULT WINAPI DECLSPEC_HOTPATCH Thunk_IDirect3DDeviceImpl_1_EndScene(IDirect3DDevice *iface) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)device_from_device1(iface)); } /***************************************************************************** @@ -1767,7 +1714,8 @@ IDirect3DDeviceImpl_7_GetDirect3D(IDirect3DDevice7 *iface, IDirect3D7 **Direct3D7) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - TRACE("(%p)->(%p)\n", This, Direct3D7); + + TRACE("iface %p, d3d %p.\n", iface, Direct3D7); if(!Direct3D7) return DDERR_INVALIDPARAMS; @@ -1787,7 +1735,8 @@ Thunk_IDirect3DDeviceImpl_3_GetDirect3D(IDirect3DDevice3 *iface, HRESULT ret; IDirect3D7 *ret_ptr; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, Direct3D3); + TRACE("iface %p, d3d %p.\n", iface, Direct3D3); + ret = IDirect3DDevice7_GetDirect3D((IDirect3DDevice7 *)This, &ret_ptr); if(ret != D3D_OK) return ret; @@ -1804,7 +1753,8 @@ Thunk_IDirect3DDeviceImpl_2_GetDirect3D(IDirect3DDevice2 *iface, HRESULT ret; IDirect3D7 *ret_ptr; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, Direct3D2); + TRACE("iface %p, d3d %p.\n", iface, Direct3D2); + ret = IDirect3DDevice7_GetDirect3D((IDirect3DDevice7 *)This, &ret_ptr); if(ret != D3D_OK) return ret; @@ -1821,7 +1771,8 @@ Thunk_IDirect3DDeviceImpl_1_GetDirect3D(IDirect3DDevice *iface, HRESULT ret; IDirect3D7 *ret_ptr; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, Direct3D); + TRACE("iface %p, d3d %p.\n", iface, Direct3D); + ret = IDirect3DDevice7_GetDirect3D((IDirect3DDevice7 *)This, &ret_ptr); if(ret != D3D_OK) return ret; @@ -1852,7 +1803,8 @@ IDirect3DDeviceImpl_3_SetCurrentViewport(IDirect3DDevice3 *iface, { IDirect3DDeviceImpl *This = device_from_device3(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Direct3DViewport3; - TRACE("(%p)->(%p)\n", This, Direct3DViewport3); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport3); EnterCriticalSection(&ddraw_cs); /* Do nothing if the specified viewport is the same as the current one */ @@ -1878,7 +1830,7 @@ IDirect3DDeviceImpl_3_SetCurrentViewport(IDirect3DDevice3 *iface, /* Activate this viewport */ This->current_viewport->active_device = This; - This->current_viewport->activate(This->current_viewport, FALSE); + viewport_activate(This->current_viewport, FALSE); LeaveCriticalSection(&ddraw_cs); return D3D_OK; @@ -1890,7 +1842,9 @@ Thunk_IDirect3DDeviceImpl_2_SetCurrentViewport(IDirect3DDevice2 *iface, { IDirect3DDeviceImpl *This = device_from_device2(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Direct3DViewport2; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2); + return IDirect3DDevice3_SetCurrentViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp); } @@ -1915,7 +1869,8 @@ IDirect3DDeviceImpl_3_GetCurrentViewport(IDirect3DDevice3 *iface, IDirect3DViewport3 **Direct3DViewport3) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE("(%p)->(%p)\n", This, Direct3DViewport3); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport3); if(!Direct3DViewport3) return DDERR_INVALIDPARAMS; @@ -1938,7 +1893,9 @@ Thunk_IDirect3DDeviceImpl_2_GetCurrentViewport(IDirect3DDevice2 *iface, { IDirect3DDeviceImpl *This = device_from_device2(iface); HRESULT hr; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, Direct3DViewport2); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2); + hr = IDirect3DDevice3_GetCurrentViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 **)Direct3DViewport2); if(hr != D3D_OK) return hr; @@ -1971,7 +1928,8 @@ IDirect3DDeviceImpl_7_SetRenderTarget(IDirect3DDevice7 *iface, IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; IDirectDrawSurfaceImpl *Target = (IDirectDrawSurfaceImpl *)NewTarget; HRESULT hr; - TRACE("(%p)->(%p,%08x): Relay\n", This, NewTarget, Flags); + + TRACE("iface %p, target %p, flags %#x.\n", iface, NewTarget, Flags); EnterCriticalSection(&ddraw_cs); /* Flags: Not used */ @@ -2030,7 +1988,9 @@ Thunk_IDirect3DDeviceImpl_3_SetRenderTarget(IDirect3DDevice3 *iface, { IDirect3DDeviceImpl *This = device_from_device3(iface); IDirectDrawSurfaceImpl *Target = (IDirectDrawSurfaceImpl *)NewRenderTarget; - TRACE_(ddraw_thunk)("(%p)->(%p,%08x) thunking to IDirect3DDevice7 interface.\n", This, Target, Flags); + + TRACE("iface %p, target %p, flags %#x.\n", iface, NewRenderTarget, Flags); + return IDirect3DDevice7_SetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 *)Target, Flags); } @@ -2041,7 +2001,9 @@ Thunk_IDirect3DDeviceImpl_2_SetRenderTarget(IDirect3DDevice2 *iface, { IDirect3DDeviceImpl *This = device_from_device2(iface); IDirectDrawSurfaceImpl *Target = (IDirectDrawSurfaceImpl *)NewRenderTarget; - TRACE_(ddraw_thunk)("(%p)->(%p,%08x) thunking to IDirect3DDevice7 interface.\n", This, Target, Flags); + + TRACE("iface %p, target %p, flags %#x.\n", iface, NewRenderTarget, Flags); + return IDirect3DDevice7_SetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 *)Target, Flags); } @@ -2067,7 +2029,8 @@ IDirect3DDeviceImpl_7_GetRenderTarget(IDirect3DDevice7 *iface, IDirectDrawSurface7 **RenderTarget) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - TRACE("(%p)->(%p): Relay\n", This, RenderTarget); + + TRACE("iface %p, target %p.\n", iface, RenderTarget); if(!RenderTarget) return DDERR_INVALIDPARAMS; @@ -2086,7 +2049,9 @@ Thunk_IDirect3DDeviceImpl_3_GetRenderTarget(IDirect3DDevice3 *iface, { IDirect3DDeviceImpl *This = device_from_device3(iface); HRESULT hr; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, RenderTarget); + + TRACE("iface %p, target %p.\n", iface, RenderTarget); + hr = IDirect3DDevice7_GetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 **)RenderTarget); if(hr != D3D_OK) return hr; return D3D_OK; @@ -2098,7 +2063,9 @@ Thunk_IDirect3DDeviceImpl_2_GetRenderTarget(IDirect3DDevice2 *iface, { IDirect3DDeviceImpl *This = device_from_device2(iface); HRESULT hr; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, RenderTarget); + + TRACE("iface %p, target %p.\n", iface, RenderTarget); + hr = IDirect3DDevice7_GetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 **)RenderTarget); if(hr != D3D_OK) return hr; *RenderTarget = *RenderTarget ? @@ -2131,7 +2098,9 @@ IDirect3DDeviceImpl_3_Begin(IDirect3DDevice3 *iface, DWORD Flags) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE("(%p)->(%d,%d,%08x)\n", This, PrimitiveType, VertexTypeDesc, Flags); + + TRACE("iface %p, primitive_type %#x, FVF %#x, flags %#x.\n", + iface, PrimitiveType, VertexTypeDesc, Flags); EnterCriticalSection(&ddraw_cs); This->primitive_type = PrimitiveType; @@ -2152,7 +2121,9 @@ Thunk_IDirect3DDeviceImpl_2_Begin(IDirect3DDevice2 *iface, { DWORD FVF; IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p/%p)->(%08x,%08x,%08x): Thunking to IDirect3DDevice3\n", This, iface, d3dpt, dwVertexTypeDesc, dwFlags); + + TRACE("iface %p, primitive_type %#x, vertex_type %#x, flags %#x.\n", + iface, d3dpt, dwVertexTypeDesc, dwFlags); switch(dwVertexTypeDesc) { @@ -2194,8 +2165,9 @@ IDirect3DDeviceImpl_3_BeginIndexed(IDirect3DDevice3 *iface, DWORD NumVertices, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - FIXME("(%p)->(%08x,%08x,%p,%08x,%08x): stub!\n", This, PrimitiveType, VertexType, Vertices, NumVertices, Flags); + FIXME("iface %p, primitive_type %#x, FVF %#x, vertices %p, vertex_count %u, flags %#x stub!\n", + iface, PrimitiveType, VertexType, Vertices, NumVertices, Flags); + return D3D_OK; } @@ -2210,7 +2182,9 @@ Thunk_IDirect3DDeviceImpl_2_BeginIndexed(IDirect3DDevice2 *iface, { DWORD FVF; IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p/%p)->(%08x,%08x,%p,%08x,%08x): Thunking to IDirect3DDevice3\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwNumVertices, dwFlags); + + TRACE("iface %p, primitive_type %#x, vertex_type %#x, vertices %p, vertex_count %u, flags %#x stub!\n", + iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwNumVertices, dwFlags); switch(d3dvtVertexType) { @@ -2248,7 +2222,8 @@ IDirect3DDeviceImpl_3_Vertex(IDirect3DDevice3 *iface, void *Vertex) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE("(%p)->(%p)\n", This, Vertex); + + TRACE("iface %p, vertex %p.\n", iface, Vertex); if(!Vertex) return DDERR_INVALIDPARAMS; @@ -2278,7 +2253,9 @@ Thunk_IDirect3DDeviceImpl_2_Vertex(IDirect3DDevice2 *iface, void *lpVertexType) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, lpVertexType); + + TRACE("iface %p, vertex %p.\n", iface, lpVertexType); + return IDirect3DDevice3_Vertex((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, lpVertexType); } @@ -2299,8 +2276,8 @@ static HRESULT WINAPI IDirect3DDeviceImpl_3_Index(IDirect3DDevice3 *iface, WORD VertexIndex) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - FIXME("(%p)->(%04x): stub!\n", This, VertexIndex); + FIXME("iface %p, index %#x stub!\n", iface, VertexIndex); + return D3D_OK; } @@ -2309,7 +2286,9 @@ Thunk_IDirect3DDeviceImpl_2_Index(IDirect3DDevice2 *iface, WORD wVertexIndex) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%04x) thunking to IDirect3DDevice3 interface.\n", This, wVertexIndex); + + TRACE("iface %p, index %#x.\n", iface, wVertexIndex); + return IDirect3DDevice3_Index((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, wVertexIndex); } @@ -2336,7 +2315,8 @@ IDirect3DDeviceImpl_3_End(IDirect3DDevice3 *iface, DWORD Flags) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE("(%p)->(%08x)\n", This, Flags); + + TRACE("iface %p, flags %#x.\n", iface, Flags); return IDirect3DDevice7_DrawPrimitive((IDirect3DDevice7 *)This, This->primitive_type, This->vertex_type, This->vertex_buffer, This->nb_vertices, This->render_flags); @@ -2347,7 +2327,9 @@ Thunk_IDirect3DDeviceImpl_2_End(IDirect3DDevice2 *iface, DWORD dwFlags) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x) thunking to IDirect3DDevice3 interface.\n", This, dwFlags); + + TRACE("iface %p, flags %#x.\n", iface, dwFlags); + return IDirect3DDevice3_End((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, dwFlags); } @@ -2375,7 +2357,8 @@ IDirect3DDeviceImpl_7_GetRenderState(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay\n", This, RenderStateType, Value); + + TRACE("iface %p, state %#x, value %p.\n", iface, RenderStateType, Value); if(!Value) return DDERR_INVALIDPARAMS; @@ -2484,6 +2467,12 @@ IDirect3DDeviceImpl_7_GetRenderState(IDirect3DDevice7 *iface, hr = E_NOTIMPL; break; + case D3DRENDERSTATE_TEXTUREHANDLE: + case D3DRENDERSTATE_TEXTUREMAPBLEND: + WARN("Render state %#x is invalid in d3d7.\n", RenderStateType); + hr = DDERR_INVALIDPARAMS; + break; + default: if (RenderStateType >= D3DRENDERSTATE_STIPPLEPATTERN00 && RenderStateType <= D3DRENDERSTATE_STIPPLEPATTERN31) @@ -2531,7 +2520,8 @@ IDirect3DDeviceImpl_3_GetRenderState(IDirect3DDevice3 *iface, { IDirect3DDeviceImpl *This = device_from_device3(iface); HRESULT hr; - TRACE("(%p)->(%08x,%p)\n", This, dwRenderStateType, lpdwRenderState); + + TRACE("iface %p, state %#x, value %p.\n", iface, dwRenderStateType, lpdwRenderState); switch(dwRenderStateType) { @@ -2545,24 +2535,13 @@ IDirect3DDeviceImpl_3_GetRenderState(IDirect3DDevice3 *iface, EnterCriticalSection(&ddraw_cs); - hr = IWineD3DDevice_GetTexture(This->wineD3DDevice, - 0, - &tex); - - if(hr == WINED3D_OK && tex) + hr = IWineD3DDevice_GetTexture(This->wineD3DDevice, 0, &tex); + if (SUCCEEDED(hr) && tex) { - IDirectDrawSurface7 *parent = NULL; - hr = IWineD3DBaseTexture_GetParent(tex, - (IUnknown **) &parent); - if(parent) - { - /* The parent of the texture is the IDirectDrawSurface7 interface - * of the ddraw surface - */ - IDirectDrawSurfaceImpl *texImpl = (IDirectDrawSurfaceImpl *)parent; - *lpdwRenderState = texImpl->Handle; - IDirectDrawSurface7_Release(parent); - } + /* The parent of the texture is the IDirectDrawSurface7 + * interface of the ddraw surface. */ + IDirectDrawSurfaceImpl *parent = IWineD3DBaseTexture_GetParent(tex); + if (parent) *lpdwRenderState = parent->Handle; IWineD3DBaseTexture_Release(tex); } @@ -2655,7 +2634,9 @@ Thunk_IDirect3DDeviceImpl_2_GetRenderState(IDirect3DDevice2 *iface, DWORD *lpdwRenderState) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice3 interface.\n", This, dwRenderStateType, lpdwRenderState); + + TRACE("iface %p, state %#x, value %p.\n", iface, dwRenderStateType, lpdwRenderState); + return IDirect3DDevice3_GetRenderState((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, dwRenderStateType, lpdwRenderState); } @@ -2684,7 +2665,8 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%d): Relay\n", This, RenderStateType, Value); + + TRACE("iface %p, state %#x, value %#x.\n", iface, RenderStateType, Value); EnterCriticalSection(&ddraw_cs); /* Some render states need special care */ @@ -2801,6 +2783,12 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface, hr = E_NOTIMPL; break; + case D3DRENDERSTATE_TEXTUREHANDLE: + case D3DRENDERSTATE_TEXTUREMAPBLEND: + WARN("Render state %#x is invalid in d3d7.\n", RenderStateType); + hr = DDERR_INVALIDPARAMS; + break; + default: if (RenderStateType >= D3DRENDERSTATE_STIPPLEPATTERN00 && RenderStateType <= D3DRENDERSTATE_STIPPLEPATTERN31) @@ -2869,7 +2857,8 @@ IDirect3DDeviceImpl_3_SetRenderState(IDirect3DDevice3 *iface, HRESULT hr; IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE("(%p)->(%08x,%d)\n", This, RenderStateType, Value); + + TRACE("iface %p, state %#x, value %#x.\n", iface, RenderStateType, Value); EnterCriticalSection(&ddraw_cs); @@ -2877,6 +2866,8 @@ IDirect3DDeviceImpl_3_SetRenderState(IDirect3DDevice3 *iface, { case D3DRENDERSTATE_TEXTUREHANDLE: { + IDirectDrawSurfaceImpl *surf; + if(Value == 0) { hr = IWineD3DDevice_SetTexture(This->wineD3DDevice, @@ -2885,25 +2876,16 @@ IDirect3DDeviceImpl_3_SetRenderState(IDirect3DDevice3 *iface, break; } - if(Value > This->numHandles) + surf = ddraw_get_object(&This->handle_table, Value - 1, DDRAW_HANDLE_SURFACE); + if (!surf) { - FIXME("Specified handle %d out of range\n", Value); + WARN("Invalid texture handle.\n"); hr = DDERR_INVALIDPARAMS; break; } - if(This->Handles[Value - 1].type != DDrawHandle_Texture) - { - FIXME("Handle %d isn't a texture handle\n", Value); - hr = DDERR_INVALIDPARAMS; - break; - } - else - { - IDirectDrawSurfaceImpl *surf = This->Handles[Value - 1].ptr; - IDirect3DTexture2 *tex = surf ? (IDirect3DTexture2 *)&surf->IDirect3DTexture2_vtbl : NULL; - hr = IDirect3DDevice3_SetTexture(iface, 0, tex); - break; - } + + hr = IDirect3DDevice3_SetTexture(iface, 0, (IDirect3DTexture2 *)&surf->IDirect3DTexture2_vtbl); + break; } case D3DRENDERSTATE_TEXTUREMAPBLEND: @@ -3007,7 +2989,9 @@ Thunk_IDirect3DDeviceImpl_2_SetRenderState(IDirect3DDevice2 *iface, DWORD Value) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%d) thunking to IDirect3DDevice3 interface.\n", This, RenderStateType, Value); + + TRACE("iface %p, state %#x, value %#x.\n", iface, RenderStateType, Value); + return IDirect3DDevice3_SetRenderState((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, RenderStateType, Value); } @@ -3037,7 +3021,7 @@ IDirect3DDeviceImpl_3_SetLightState(IDirect3DDevice3 *iface, IDirect3DDeviceImpl *This = device_from_device3(iface); HRESULT hr; - TRACE("(%p)->(%08x,%08x)\n", This, LightStateType, Value); + TRACE("iface %p, state %#x, value %#x.\n", iface, LightStateType, Value); if (!LightStateType || (LightStateType > D3DLIGHTSTATE_COLORVERTEX)) { @@ -3048,35 +3032,17 @@ IDirect3DDeviceImpl_3_SetLightState(IDirect3DDevice3 *iface, EnterCriticalSection(&ddraw_cs); if (LightStateType == D3DLIGHTSTATE_MATERIAL /* 1 */) { - IDirect3DMaterialImpl *mat; - - if(Value == 0) mat = NULL; - else if(Value > This->numHandles) + IDirect3DMaterialImpl *m = ddraw_get_object(&This->handle_table, Value - 1, DDRAW_HANDLE_MATERIAL); + if (!m) { - ERR("Material handle out of range(%d)\n", Value); + WARN("Invalid material handle.\n"); LeaveCriticalSection(&ddraw_cs); return DDERR_INVALIDPARAMS; } - else if(This->Handles[Value - 1].type != DDrawHandle_Material) - { - ERR("Invalid handle %d\n", Value); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } - else - { - mat = This->Handles[Value - 1].ptr; - } - if (mat != NULL) - { - TRACE(" activating material %p.\n", mat); - mat->activate(mat); - } - else - { - FIXME(" D3DLIGHTSTATE_MATERIAL called with NULL material !!!\n"); - } + TRACE(" activating material %p.\n", m); + material_activate(m); + This->material = Value; } else if (LightStateType == D3DLIGHTSTATE_COLORMODEL /* 3 */) @@ -3103,7 +3069,7 @@ IDirect3DDeviceImpl_3_SetLightState(IDirect3DDevice3 *iface, { case D3DLIGHTSTATE_AMBIENT: /* 2 */ rs = D3DRENDERSTATE_AMBIENT; - break; + break; case D3DLIGHTSTATE_FOGMODE: /* 4 */ rs = D3DRENDERSTATE_FOGVERTEXMODE; break; @@ -3140,7 +3106,9 @@ Thunk_IDirect3DDeviceImpl_2_SetLightState(IDirect3DDevice2 *iface, DWORD Value) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x) thunking to IDirect3DDevice3 interface.\n", This, LightStateType, Value); + + TRACE("iface %p, state %#x, value %#x.\n", iface, LightStateType, Value); + return IDirect3DDevice3_SetLightState((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, LightStateType, Value); } @@ -3170,7 +3138,7 @@ IDirect3DDeviceImpl_3_GetLightState(IDirect3DDevice3 *iface, IDirect3DDeviceImpl *This = device_from_device3(iface); HRESULT hr; - TRACE("(%p)->(%08x,%p)\n", This, LightStateType, Value); + TRACE("iface %p, state %#x, value %p.\n", iface, LightStateType, Value); if (!LightStateType || (LightStateType > D3DLIGHTSTATE_COLORVERTEX)) { @@ -3197,7 +3165,7 @@ IDirect3DDeviceImpl_3_GetLightState(IDirect3DDevice3 *iface, { case D3DLIGHTSTATE_AMBIENT: /* 2 */ rs = D3DRENDERSTATE_AMBIENT; - break; + break; case D3DLIGHTSTATE_FOGMODE: /* 4 */ rs = D3DRENDERSTATE_FOGVERTEXMODE; break; @@ -3234,7 +3202,9 @@ Thunk_IDirect3DDeviceImpl_2_GetLightState(IDirect3DDevice2 *iface, DWORD *Value) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice3 interface.\n", This, LightStateType, Value); + + TRACE("iface %p, state %#x, value %p.\n", iface, LightStateType, Value); + return IDirect3DDevice3_GetLightState((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, LightStateType, Value); } @@ -3267,7 +3237,8 @@ IDirect3DDeviceImpl_7_SetTransform(IDirect3DDevice7 *iface, IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; D3DTRANSFORMSTATETYPE type; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay\n", This, TransformStateType, Matrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, Matrix); switch(TransformStateType) { @@ -3319,7 +3290,9 @@ Thunk_IDirect3DDeviceImpl_3_SetTransform(IDirect3DDevice3 *iface, D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); + return IDirect3DDevice7_SetTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix); } @@ -3329,7 +3302,9 @@ Thunk_IDirect3DDeviceImpl_2_SetTransform(IDirect3DDevice2 *iface, D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); + return IDirect3DDevice7_SetTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix); } @@ -3358,7 +3333,8 @@ IDirect3DDeviceImpl_7_GetTransform(IDirect3DDevice7 *iface, IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; D3DTRANSFORMSTATETYPE type; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay\n", This, TransformStateType, Matrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, Matrix); switch(TransformStateType) { @@ -3408,7 +3384,9 @@ Thunk_IDirect3DDeviceImpl_3_GetTransform(IDirect3DDevice3 *iface, D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); + return IDirect3DDevice7_GetTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix); } @@ -3418,7 +3396,9 @@ Thunk_IDirect3DDeviceImpl_2_GetTransform(IDirect3DDevice2 *iface, D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); + return IDirect3DDevice7_GetTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix); } @@ -3448,7 +3428,8 @@ IDirect3DDeviceImpl_7_MultiplyTransform(IDirect3DDevice7 *iface, IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; D3DTRANSFORMSTATETYPE type; - TRACE("(%p)->(%08x,%p): Relay\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); switch(TransformStateType) { @@ -3497,7 +3478,9 @@ Thunk_IDirect3DDeviceImpl_3_MultiplyTransform(IDirect3DDevice3 *iface, D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); + return IDirect3DDevice7_MultiplyTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix); } @@ -3507,7 +3490,9 @@ Thunk_IDirect3DDeviceImpl_2_MultiplyTransform(IDirect3DDevice2 *iface, D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); + return IDirect3DDevice7_MultiplyTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix); } @@ -3543,7 +3528,9 @@ IDirect3DDeviceImpl_7_DrawPrimitive(IDirect3DDevice7 *iface, IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; UINT stride; HRESULT hr; - TRACE("(%p)->(%08x,%08x,%p,%08x,%08x): Relay!\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Flags); + + TRACE("iface %p, primitive_type %#x, FVF %#x, vertices %p, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, Vertices, VertexCount, Flags); if(!Vertices) return DDERR_INVALIDPARAMS; @@ -3553,8 +3540,7 @@ IDirect3DDeviceImpl_7_DrawPrimitive(IDirect3DDevice7 *iface, /* Set the FVF */ EnterCriticalSection(&ddraw_cs); - hr = IWineD3DDevice_SetVertexDeclaration(This->wineD3DDevice, - IDirectDrawImpl_FindDecl(This->ddraw, VertexType)); + hr = IWineD3DDevice_SetVertexDeclaration(This->wineD3DDevice, ddraw_find_decl(This->ddraw, VertexType)); if(hr != D3D_OK) { LeaveCriticalSection(&ddraw_cs); @@ -3605,9 +3591,10 @@ Thunk_IDirect3DDeviceImpl_3_DrawPrimitive(IDirect3DDevice3 *iface, DWORD VertexCount, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Flags); - return IDirect3DDevice7_DrawPrimitive((IDirect3DDevice7 *)This, + TRACE("iface %p, primitive_type %#x, FVF %#x, vertices %p, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, Vertices, VertexCount, Flags); + + return IDirect3DDevice7_DrawPrimitive((IDirect3DDevice7 *)device_from_device3(iface), PrimitiveType, VertexType, Vertices, VertexCount, Flags); } @@ -3619,9 +3606,10 @@ Thunk_IDirect3DDeviceImpl_2_DrawPrimitive(IDirect3DDevice2 *iface, DWORD VertexCount, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device2(iface); DWORD FVF; - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Flags); + + TRACE("iface %p, primitive_type %#x, vertex_type %#x, vertices %p, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, Vertices, VertexCount, Flags); switch(VertexType) { @@ -3633,7 +3621,8 @@ Thunk_IDirect3DDeviceImpl_2_DrawPrimitive(IDirect3DDevice2 *iface, return DDERR_INVALIDPARAMS; /* Should never happen */ } - return IDirect3DDevice7_DrawPrimitive((IDirect3DDevice7 *)This, PrimitiveType, FVF, Vertices, VertexCount, Flags); + return IDirect3DDevice7_DrawPrimitive((IDirect3DDevice7 *)device_from_device2(iface), + PrimitiveType, FVF, Vertices, VertexCount, Flags); } /***************************************************************************** @@ -3672,12 +3661,13 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitive(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x): Relay!\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); + + TRACE("iface %p, primitive_type %#x, FVF %#x, vertices %p, vertex_count %u, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); /* Set the D3DDevice's FVF */ EnterCriticalSection(&ddraw_cs); - hr = IWineD3DDevice_SetVertexDeclaration(This->wineD3DDevice, - IDirectDrawImpl_FindDecl(This->ddraw, VertexType)); + hr = IWineD3DDevice_SetVertexDeclaration(This->wineD3DDevice, ddraw_find_decl(This->ddraw, VertexType)); if(FAILED(hr)) { ERR(" (%p) Setting the FVF failed, hr = %x!\n", This, hr); @@ -3735,9 +3725,10 @@ Thunk_IDirect3DDeviceImpl_3_DrawIndexedPrimitive(IDirect3DDevice3 *iface, DWORD IndexCount, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); - return IDirect3DDevice7_DrawIndexedPrimitive((IDirect3DDevice7 *)This, + TRACE("iface %p, primitive_type %#x, FVF %#x, vertices %p, vertex_count %u, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); + + return IDirect3DDevice7_DrawIndexedPrimitive((IDirect3DDevice7 *)device_from_device3(iface), PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); } @@ -3752,8 +3743,9 @@ Thunk_IDirect3DDeviceImpl_2_DrawIndexedPrimitive(IDirect3DDevice2 *iface, DWORD Flags) { DWORD FVF; - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); + + TRACE("iface %p, primitive_type %#x, vertex_type %#x, vertices %p, vertex_count %u, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); switch(VertexType) { @@ -3765,7 +3757,7 @@ Thunk_IDirect3DDeviceImpl_2_DrawIndexedPrimitive(IDirect3DDevice2 *iface, return DDERR_INVALIDPARAMS; /* Should never happen */ } - return IDirect3DDevice7_DrawIndexedPrimitive((IDirect3DDevice7 *)This, + return IDirect3DDevice7_DrawIndexedPrimitive((IDirect3DDevice7 *)device_from_device2(iface), PrimitiveType, FVF, Vertices, VertexCount, Indices, IndexCount, Flags); } @@ -3789,8 +3781,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_7_SetClipStatus(IDirect3DDevice7 *iface, D3DCLIPSTATUS *ClipStatus) { - IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - FIXME("(%p)->(%p): Stub!\n", This, ClipStatus); + FIXME("iface %p, clip_status %p stub!\n", iface, ClipStatus); /* D3DCLIPSTATUS and WINED3DCLIPSTATUS are different. I don't know how to convert them * Perhaps this needs a new data type and an additional IWineD3DDevice method @@ -3803,18 +3794,18 @@ static HRESULT WINAPI Thunk_IDirect3DDeviceImpl_3_SetClipStatus(IDirect3DDevice3 *iface, D3DCLIPSTATUS *ClipStatus) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, ClipStatus); - return IDirect3DDevice7_SetClipStatus((IDirect3DDevice7 *)This, ClipStatus); + TRACE("iface %p, clip_status %p.\n", iface, ClipStatus); + + return IDirect3DDevice7_SetClipStatus((IDirect3DDevice7 *)device_from_device3(iface), ClipStatus); } static HRESULT WINAPI Thunk_IDirect3DDeviceImpl_2_SetClipStatus(IDirect3DDevice2 *iface, D3DCLIPSTATUS *ClipStatus) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, ClipStatus); - return IDirect3DDevice7_SetClipStatus((IDirect3DDevice7 *)This, ClipStatus); + TRACE("iface %p, clip_status %p.\n", iface, ClipStatus); + + return IDirect3DDevice7_SetClipStatus((IDirect3DDevice7 *)device_from_device2(iface), ClipStatus); } /***************************************************************************** @@ -3833,8 +3824,7 @@ static HRESULT WINAPI IDirect3DDeviceImpl_7_GetClipStatus(IDirect3DDevice7 *iface, D3DCLIPSTATUS *ClipStatus) { - IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - FIXME("(%p)->(%p): Stub!\n", This, ClipStatus); + FIXME("iface %p, clip_status %p stub!\n", iface, ClipStatus); /* D3DCLIPSTATUS and WINED3DCLIPSTATUS are different. I don't know how to convert them */ /* return IWineD3DDevice_GetClipStatus(This->wineD3DDevice, ClipStatus);*/ @@ -3845,18 +3835,18 @@ static HRESULT WINAPI Thunk_IDirect3DDeviceImpl_3_GetClipStatus(IDirect3DDevice3 *iface, D3DCLIPSTATUS *ClipStatus) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, ClipStatus); - return IDirect3DDevice7_GetClipStatus((IDirect3DDevice7 *)This, ClipStatus); + TRACE("iface %p, clip_status %p.\n", iface, ClipStatus); + + return IDirect3DDevice7_GetClipStatus((IDirect3DDevice7 *)device_from_device3(iface), ClipStatus); } static HRESULT WINAPI Thunk_IDirect3DDeviceImpl_2_GetClipStatus(IDirect3DDevice2 *iface, D3DCLIPSTATUS *ClipStatus) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, ClipStatus); - return IDirect3DDevice7_GetClipStatus((IDirect3DDevice7 *)This, ClipStatus); + TRACE("iface %p, clip_status %p.\n", iface, ClipStatus); + + return IDirect3DDevice7_GetClipStatus((IDirect3DDevice7 *)device_from_device2(iface), ClipStatus); } /***************************************************************************** @@ -3893,7 +3883,8 @@ IDirect3DDeviceImpl_7_DrawPrimitiveStrided(IDirect3DDevice7 *iface, DWORD i; HRESULT hr; - TRACE("(%p)->(%08x,%08x,%p,%08x,%08x): stub!\n", This, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Flags); + TRACE("iface %p, primitive_type %#x, FVF %#x, strided_data %p, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Flags); memset(&WineD3DStrided, 0, sizeof(WineD3DStrided)); /* Get the strided data right. the wined3d structure is a bit bigger @@ -3996,9 +3987,10 @@ Thunk_IDirect3DDeviceImpl_3_DrawPrimitiveStrided(IDirect3DDevice3 *iface, DWORD VertexCount, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Flags); - return IDirect3DDevice7_DrawPrimitiveStrided((IDirect3DDevice7 *)This, + TRACE("iface %p, primitive_type %#x, FVF %#x, strided_data %p, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Flags); + + return IDirect3DDevice7_DrawPrimitiveStrided((IDirect3DDevice7 *)device_from_device3(iface), PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Flags); } @@ -4034,7 +4026,8 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveStrided(IDirect3DDevice7 *iface, DWORD i; HRESULT hr; - TRACE("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x)\n", This, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags); + TRACE("iface %p, primitive_type %#x, FVF %#x, strided_data %p, vertex_count %u, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags); memset(&WineD3DStrided, 0, sizeof(WineD3DStrided)); /* Get the strided data right. the wined3d structure is a bit bigger @@ -4144,10 +4137,11 @@ Thunk_IDirect3DDeviceImpl_3_DrawIndexedPrimitiveStrided(IDirect3DDevice3 *iface, DWORD IndexCount, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", iface, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags); - return IDirect3DDevice7_DrawIndexedPrimitiveStrided((IDirect3DDevice7 *)This, PrimitiveType, - VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags); + TRACE("iface %p, primitive_type %#x, FVF %#x, strided_data %p, vertex_count %u, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags); + + return IDirect3DDevice7_DrawIndexedPrimitiveStrided((IDirect3DDevice7 *)device_from_device3(iface), + PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags); } /***************************************************************************** @@ -4182,7 +4176,8 @@ IDirect3DDeviceImpl_7_DrawPrimitiveVB(IDirect3DDevice7 *iface, HRESULT hr; DWORD stride; - TRACE("(%p)->(%08x,%p,%08x,%08x,%08x)\n", This, PrimitiveType, D3DVertexBuf, StartVertex, NumVertices, Flags); + TRACE("iface %p, primitive_type %#x, vb %p, start_vertex %u, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, D3DVertexBuf, StartVertex, NumVertices, Flags); /* Sanity checks */ if(!vb) @@ -4259,11 +4254,13 @@ Thunk_IDirect3DDeviceImpl_3_DrawPrimitiveVB(IDirect3DDevice3 *iface, DWORD NumVertices, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); IDirect3DVertexBufferImpl *vb = D3DVertexBuf ? vb_from_vb1(D3DVertexBuf) : NULL; - TRACE_(ddraw_thunk)("(%p)->(%08x,%p,%08x,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, vb, StartVertex, NumVertices, Flags); - return IDirect3DDevice7_DrawPrimitiveVB((IDirect3DDevice7 *)This, PrimitiveType, - (IDirect3DVertexBuffer7 *)vb, StartVertex, NumVertices, Flags); + + TRACE("iface %p, primitive_type %#x, vb %p, start_vertex %u, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, D3DVertexBuf, StartVertex, NumVertices, Flags); + + return IDirect3DDevice7_DrawPrimitiveVB((IDirect3DDevice7 *)device_from_device3(iface), + PrimitiveType, (IDirect3DVertexBuffer7 *)vb, StartVertex, NumVertices, Flags); } @@ -4299,8 +4296,10 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface, DWORD stride = get_flexible_vertex_size(vb->fvf); WORD *LockedIndices; HRESULT hr; + WINED3DBUFFER_DESC desc; - TRACE("(%p)->(%08x,%p,%d,%d,%p,%d,%08x)\n", This, PrimitiveType, vb, StartVertex, NumVertices, Indices, IndexCount, Flags); + TRACE("iface %p, primitive_type %#x, vb %p, start_vertex %u, vertex_count %u, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, D3DVertexBuf, StartVertex, NumVertices, Indices, IndexCount, Flags); /* Steps: * 1) Upload the Indices to the index buffer @@ -4320,6 +4319,33 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface, return hr; } + /* check that the buffer is large enough to hold the indices, + * reallocate if necessary. */ + IWineD3DBuffer_GetDesc(This->indexbuffer, &desc); + if (desc.Size < IndexCount * sizeof(WORD)) + { + UINT size = max(desc.Size * 2, IndexCount * sizeof(WORD)); + IWineD3DBuffer *buffer; + IParentImpl *parent; + + TRACE("Growing index buffer to %u bytes\n", size); + + parent = IWineD3DBuffer_GetParent(This->indexbuffer); + hr = IWineD3DDevice_CreateIndexBuffer(This->wineD3DDevice, size, WINED3DUSAGE_DYNAMIC /* Usage */, + WINED3DPOOL_DEFAULT, parent, &ddraw_null_wined3d_parent_ops, &buffer); + if (FAILED(hr)) + { + ERR("(%p) IWineD3DDevice::CreateIndexBuffer failed with hr = %08x\n", This, hr); + LeaveCriticalSection(&ddraw_cs); + return hr; + } + + IWineD3DBuffer_Release(This->indexbuffer); + This->indexbuffer = buffer; + + parent->child = (IUnknown *)buffer; + } + /* copy the index stream into the index buffer. * A new IWineD3DDevice method could be created * which takes an user pointer containing the indices @@ -4331,7 +4357,6 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface, IndexCount * sizeof(WORD), (BYTE **) &LockedIndices, 0 /* Flags */); - assert(IndexCount < 0x100000); if(hr != D3D_OK) { ERR("(%p) IWineD3DBuffer::Map failed with hr = %08x\n", This, hr); @@ -4414,12 +4439,13 @@ Thunk_IDirect3DDeviceImpl_3_DrawIndexedPrimitiveVB(IDirect3DDevice3 *iface, DWORD IndexCount, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); IDirect3DVertexBufferImpl *VB = vb_from_vb1(D3DVertexBuf); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VB, Indices, IndexCount, Flags); - return IDirect3DDevice7_DrawIndexedPrimitiveVB((IDirect3DDevice7 *)This, PrimitiveType, - (IDirect3DVertexBuffer7 *)VB, 0, IndexCount, Indices, IndexCount, Flags); + TRACE("iface %p, primitive_type %#x, vb %p, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, D3DVertexBuf, Indices, IndexCount, Flags); + + return IDirect3DDevice7_DrawIndexedPrimitiveVB((IDirect3DDevice7 *)device_from_device3(iface), + PrimitiveType, (IDirect3DVertexBuffer7 *)VB, 0, IndexCount, Indices, IndexCount, Flags); } /***************************************************************************** @@ -4475,7 +4501,8 @@ IDirect3DDeviceImpl_7_ComputeSphereVisibility(IDirect3DDevice7 *iface, HRESULT hr; UINT i, j; - TRACE("(%p)->(%p,%p,%08x,%08x,%p)\n", iface, Centers, Radii, NumSpheres, Flags, ReturnValues); + TRACE("iface %p, centers %p, radii %p, sphere_count %u, flags %#x, return_values %p.\n", + iface, Centers, Radii, NumSpheres, Flags, ReturnValues); hr = IDirect3DDeviceImpl_7_GetTransform(iface, D3DTRANSFORMSTATE_WORLD, &m); if ( hr != DD_OK ) return DDERR_INVALIDPARAMS; @@ -4540,9 +4567,10 @@ Thunk_IDirect3DDeviceImpl_3_ComputeSphereVisibility(IDirect3DDevice3 *iface, DWORD Flags, DWORD *ReturnValues) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%p,%p,%08x,%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, Centers, Radii, NumSpheres, Flags, ReturnValues); - return IDirect3DDevice7_ComputeSphereVisibility((IDirect3DDevice7 *)This, + TRACE("iface %p, centers %p, radii %p, sphere_count %u, flags %#x, return_values %p.\n", + iface, Centers, Radii, NumSpheres, Flags, ReturnValues); + + return IDirect3DDevice7_ComputeSphereVisibility((IDirect3DDevice7 *)device_from_device3(iface), Centers, Radii, NumSpheres, Flags, ReturnValues); } @@ -4573,7 +4601,8 @@ IDirect3DDeviceImpl_7_GetTexture(IDirect3DDevice7 *iface, IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; IWineD3DBaseTexture *Surf; HRESULT hr; - TRACE("(%p)->(%d,%p): Relay\n", This, Stage, Texture); + + TRACE("iface %p, stage %u, texture %p.\n", iface, Stage, Texture); if(!Texture) { @@ -4590,11 +4619,8 @@ IDirect3DDeviceImpl_7_GetTexture(IDirect3DDevice7 *iface, return hr; } - /* GetParent AddRef()s, which is perfectly OK. - * We have passed the IDirectDrawSurface7 interface to WineD3D, so that's OK too. - */ - hr = IWineD3DBaseTexture_GetParent(Surf, - (IUnknown **) Texture); + *Texture = IWineD3DBaseTexture_GetParent(Surf); + IDirectDrawSurface7_AddRef(*Texture); LeaveCriticalSection(&ddraw_cs); return hr; } @@ -4627,16 +4653,16 @@ Thunk_IDirect3DDeviceImpl_3_GetTexture(IDirect3DDevice3 *iface, DWORD Stage, IDirect3DTexture2 **Texture2) { - IDirect3DDeviceImpl *This = device_from_device3(iface); HRESULT ret; IDirectDrawSurface7 *ret_val; - TRACE_(ddraw_thunk)("(%p)->(%d,%p) thunking to IDirect3DDevice7 interface.\n", This, Stage, Texture2); - ret = IDirect3DDevice7_GetTexture((IDirect3DDevice7 *)This, Stage, &ret_val); + TRACE("iface %p, stage %u, texture %p.\n", iface, Stage, Texture2); + + ret = IDirect3DDevice7_GetTexture((IDirect3DDevice7 *)device_from_device3(iface), Stage, &ret_val); *Texture2 = ret_val ? (IDirect3DTexture2 *)&((IDirectDrawSurfaceImpl *)ret_val)->IDirect3DTexture2_vtbl : NULL; - TRACE_(ddraw_thunk)(" returning interface %p.\n", *Texture2); + TRACE("Returning texture %p.\n", *Texture2); return ret; } @@ -4665,7 +4691,8 @@ IDirect3DDeviceImpl_7_SetTexture(IDirect3DDevice7 *iface, IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; IDirectDrawSurfaceImpl *surf = (IDirectDrawSurfaceImpl *)Texture; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay!\n", This, Stage, surf); + + TRACE("iface %p, stage %u, texture %p.\n", iface, Stage, Texture); /* Texture may be NULL here */ EnterCriticalSection(&ddraw_cs); @@ -4708,7 +4735,8 @@ IDirect3DDeviceImpl_3_SetTexture(IDirect3DDevice3 *iface, IDirectDrawSurfaceImpl *tex = Texture2 ? surface_from_texture2(Texture2) : NULL; DWORD texmapblend; HRESULT hr; - TRACE("(%p)->(%d,%p)\n", This, Stage, tex); + + TRACE("iface %p, stage %u, texture %p.\n", iface, Stage, Texture2); EnterCriticalSection(&ddraw_cs); @@ -4817,8 +4845,10 @@ IDirect3DDeviceImpl_7_GetTextureStageState(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - const struct tss_lookup *l = &tss_lookup[TexStageStateType]; - TRACE("(%p)->(%08x,%08x,%p): Relay!\n", This, Stage, TexStageStateType, State); + const struct tss_lookup *l; + + TRACE("iface %p, stage %u, state %#x, value %p.\n", + iface, Stage, TexStageStateType, State); if(!State) return DDERR_INVALIDPARAMS; @@ -4826,10 +4856,11 @@ IDirect3DDeviceImpl_7_GetTextureStageState(IDirect3DDevice7 *iface, if (TexStageStateType > D3DTSS_TEXTURETRANSFORMFLAGS) { WARN("Invalid TexStageStateType %#x passed.\n", TexStageStateType); - *State = 0; return DD_OK; } + l = &tss_lookup[TexStageStateType]; + EnterCriticalSection(&ddraw_cs); if (l->sampler_state) @@ -4916,9 +4947,11 @@ Thunk_IDirect3DDeviceImpl_3_GetTextureStageState(IDirect3DDevice3 *iface, D3DTEXTURESTAGESTATETYPE TexStageStateType, DWORD *State) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, Stage, TexStageStateType, State); - return IDirect3DDevice7_GetTextureStageState((IDirect3DDevice7 *)This, Stage, TexStageStateType, State); + TRACE("iface %p, stage %u, state %#x, value %p.\n", + iface, Stage, TexStageStateType, State); + + return IDirect3DDevice7_GetTextureStageState((IDirect3DDevice7 *)device_from_device3(iface), + Stage, TexStageStateType, State); } /***************************************************************************** @@ -4946,9 +4979,11 @@ IDirect3DDeviceImpl_7_SetTextureStageState(IDirect3DDevice7 *iface, DWORD State) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - const struct tss_lookup *l = &tss_lookup[TexStageStateType]; + const struct tss_lookup *l; HRESULT hr; - TRACE("(%p)->(%08x,%08x,%08x): Relay!\n", This, Stage, TexStageStateType, State); + + TRACE("iface %p, stage %u, state %#x, value %#x.\n", + iface, Stage, TexStageStateType, State); if (TexStageStateType > D3DTSS_TEXTURETRANSFORMFLAGS) { @@ -4956,6 +4991,8 @@ IDirect3DDeviceImpl_7_SetTextureStageState(IDirect3DDevice7 *iface, return DD_OK; } + l = &tss_lookup[TexStageStateType]; + EnterCriticalSection(&ddraw_cs); if (l->sampler_state) @@ -5047,9 +5084,11 @@ Thunk_IDirect3DDeviceImpl_3_SetTextureStageState(IDirect3DDevice3 *iface, D3DTEXTURESTAGESTATETYPE TexStageStateType, DWORD State) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, Stage, TexStageStateType, State); - return IDirect3DDevice7_SetTextureStageState((IDirect3DDevice7 *)This, Stage, TexStageStateType, State); + TRACE("iface %p, stage %u, state %#x, value %#x.\n", + iface, Stage, TexStageStateType, State); + + return IDirect3DDevice7_SetTextureStageState((IDirect3DDevice7 *)device_from_device3(iface), + Stage, TexStageStateType, State); } /***************************************************************************** @@ -5076,7 +5115,8 @@ IDirect3DDeviceImpl_7_ValidateDevice(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p): Relay\n", This, NumPasses); + + TRACE("iface %p, pass_count %p.\n", iface, NumPasses); EnterCriticalSection(&ddraw_cs); hr = IWineD3DDevice_ValidateDevice(This->wineD3DDevice, NumPasses); @@ -5109,9 +5149,9 @@ static HRESULT WINAPI Thunk_IDirect3DDeviceImpl_3_ValidateDevice(IDirect3DDevice3 *iface, DWORD *Passes) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, Passes); - return IDirect3DDevice7_ValidateDevice((IDirect3DDevice7 *)This, Passes); + TRACE("iface %p, pass_count %p.\n", iface, Passes); + + return IDirect3DDevice7_ValidateDevice((IDirect3DDevice7 *)device_from_device3(iface), Passes); } /***************************************************************************** @@ -5146,11 +5186,12 @@ IDirect3DDeviceImpl_7_Clear(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%p,%08x,%08x,%f,%08x): Relay\n", This, Count, Rects, Flags, Color, Z, Stencil); - /* Note; D3DRECT is compatible with WINED3DRECT */ + TRACE("iface %p, count %u, rects %p, flags %#x, color 0x%08x, z %.8e, stencil %#x.\n", + iface, Count, Rects, Flags, Color, Z, Stencil); + EnterCriticalSection(&ddraw_cs); - hr = IWineD3DDevice_Clear(This->wineD3DDevice, Count, (WINED3DRECT*) Rects, Flags, Color, Z, Stencil); + hr = IWineD3DDevice_Clear(This->wineD3DDevice, Count, (RECT *)Rects, Flags, Color, Z, Stencil); LeaveCriticalSection(&ddraw_cs); return hr; } @@ -5209,7 +5250,8 @@ IDirect3DDeviceImpl_7_SetViewport(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p) Relay!\n", This, Data); + + TRACE("iface %p, viewport %p.\n", iface, Data); if(!Data) return DDERR_INVALIDPARAMS; @@ -5265,7 +5307,8 @@ IDirect3DDeviceImpl_7_GetViewport(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p) Relay!\n", This, Data); + + TRACE("iface %p, viewport %p.\n", iface, Data); if(!Data) return DDERR_INVALIDPARAMS; @@ -5322,7 +5365,8 @@ IDirect3DDeviceImpl_7_SetMaterial(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p): Relay!\n", This, Mat); + + TRACE("iface %p, material %p.\n", iface, Mat); if (!Mat) return DDERR_INVALIDPARAMS; /* Note: D3DMATERIAL7 is compatible with WINED3DMATERIAL */ @@ -5376,7 +5420,8 @@ IDirect3DDeviceImpl_7_GetMaterial(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p): Relay!\n", This, Mat); + + TRACE("iface %p, material %p.\n", iface, Mat); EnterCriticalSection(&ddraw_cs); /* Note: D3DMATERIAL7 is compatible with WINED3DMATERIAL */ @@ -5430,7 +5475,8 @@ IDirect3DDeviceImpl_7_SetLight(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay!\n", This, LightIndex, Light); + + TRACE("iface %p, light_idx %u, light %p.\n", iface, LightIndex, Light); EnterCriticalSection(&ddraw_cs); /* Note: D3DLIGHT7 is compatible with WINED3DLIGHT */ @@ -5485,7 +5531,8 @@ IDirect3DDeviceImpl_7_GetLight(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT rc; - TRACE("(%p)->(%08x,%p): Relay!\n", This, LightIndex, Light); + + TRACE("iface %p, light_idx %u, light %p.\n", iface, LightIndex, Light); EnterCriticalSection(&ddraw_cs); /* Note: D3DLIGHT7 is compatible with WINED3DLIGHT */ @@ -5538,7 +5585,8 @@ IDirect3DDeviceImpl_7_BeginStateBlock(IDirect3DDevice7 *iface) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(): Relay!\n", This); + + TRACE("iface %p.\n", iface); EnterCriticalSection(&ddraw_cs); hr = IWineD3DDevice_BeginStateBlock(This->wineD3DDevice); @@ -5587,8 +5635,11 @@ IDirect3DDeviceImpl_7_EndStateBlock(IDirect3DDevice7 *iface, DWORD *BlockHandle) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; + IWineD3DStateBlock *wined3d_sb; HRESULT hr; - TRACE("(%p)->(%p): Relay!\n", This, BlockHandle); + DWORD h; + + TRACE("iface %p, stateblock %p.\n", iface, BlockHandle); if(!BlockHandle) { @@ -5597,17 +5648,29 @@ IDirect3DDeviceImpl_7_EndStateBlock(IDirect3DDevice7 *iface, } EnterCriticalSection(&ddraw_cs); - *BlockHandle = IDirect3DDeviceImpl_CreateHandle(This); - if(!*BlockHandle) + + hr = IWineD3DDevice_EndStateBlock(This->wineD3DDevice, &wined3d_sb); + if (FAILED(hr)) { - ERR("Cannot get a handle number for the stateblock\n"); + WARN("Failed to end stateblock, hr %#x.\n", hr); LeaveCriticalSection(&ddraw_cs); + *BlockHandle = 0; + return hr_ddraw_from_wined3d(hr); + } + + h = ddraw_allocate_handle(&This->handle_table, wined3d_sb, DDRAW_HANDLE_STATEBLOCK); + if (h == DDRAW_INVALID_HANDLE) + { + ERR("Failed to allocate a stateblock handle.\n"); + IWineD3DStateBlock_Release(wined3d_sb); + LeaveCriticalSection(&ddraw_cs); + *BlockHandle = 0; return DDERR_OUTOFMEMORY; } - This->Handles[*BlockHandle - 1].type = DDrawHandle_StateBlock; - hr = IWineD3DDevice_EndStateBlock(This->wineD3DDevice, - (IWineD3DStateBlock **) &This->Handles[*BlockHandle - 1].ptr); + LeaveCriticalSection(&ddraw_cs); + *BlockHandle = h + 1; + return hr_ddraw_from_wined3d(hr); } @@ -5653,10 +5716,9 @@ static HRESULT IDirect3DDeviceImpl_7_PreLoad(IDirect3DDevice7 *iface, IDirectDrawSurface7 *Texture) { - IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; IDirectDrawSurfaceImpl *surf = (IDirectDrawSurfaceImpl *)Texture; - TRACE("(%p)->(%p): Relay!\n", This, surf); + TRACE("iface %p, texture %p.\n", iface, Texture); if(!Texture) return DDERR_INVALIDPARAMS; @@ -5706,25 +5768,24 @@ IDirect3DDeviceImpl_7_ApplyStateBlock(IDirect3DDevice7 *iface, DWORD BlockHandle) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; + IWineD3DStateBlock *wined3d_sb; HRESULT hr; - TRACE("(%p)->(%08x): Relay!\n", This, BlockHandle); + + TRACE("iface %p, stateblock %#x.\n", iface, BlockHandle); EnterCriticalSection(&ddraw_cs); - if(!BlockHandle || BlockHandle > This->numHandles) + + wined3d_sb = ddraw_get_object(&This->handle_table, BlockHandle - 1, DDRAW_HANDLE_STATEBLOCK); + if (!wined3d_sb) { - WARN("Out of range handle %d, returning D3DERR_INVALIDSTATEBLOCK\n", BlockHandle); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_INVALIDSTATEBLOCK; - } - if(This->Handles[BlockHandle - 1].type != DDrawHandle_StateBlock) - { - WARN("Handle %d is not a stateblock, returning D3DERR_INVALIDSTATEBLOCK\n", BlockHandle); + WARN("Invalid stateblock handle.\n"); LeaveCriticalSection(&ddraw_cs); return D3DERR_INVALIDSTATEBLOCK; } - hr = IWineD3DStateBlock_Apply((IWineD3DStateBlock *) This->Handles[BlockHandle - 1].ptr); + hr = IWineD3DStateBlock_Apply(wined3d_sb); LeaveCriticalSection(&ddraw_cs); + return hr_ddraw_from_wined3d(hr); } @@ -5770,24 +5831,22 @@ IDirect3DDeviceImpl_7_CaptureStateBlock(IDirect3DDevice7 *iface, DWORD BlockHandle) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; + IWineD3DStateBlock *wined3d_sb; HRESULT hr; - TRACE("(%p)->(%08x): Relay!\n", This, BlockHandle); + + TRACE("iface %p, stateblock %#x.\n", iface, BlockHandle); EnterCriticalSection(&ddraw_cs); - if(BlockHandle == 0 || BlockHandle > This->numHandles) + + wined3d_sb = ddraw_get_object(&This->handle_table, BlockHandle - 1, DDRAW_HANDLE_STATEBLOCK); + if (!wined3d_sb) { - WARN("Out of range handle %d, returning D3DERR_INVALIDSTATEBLOCK\n", BlockHandle); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_INVALIDSTATEBLOCK; - } - if(This->Handles[BlockHandle - 1].type != DDrawHandle_StateBlock) - { - WARN("Handle %d is not a stateblock, returning D3DERR_INVALIDSTATEBLOCK\n", BlockHandle); + WARN("Invalid stateblock handle.\n"); LeaveCriticalSection(&ddraw_cs); return D3DERR_INVALIDSTATEBLOCK; } - hr = IWineD3DStateBlock_Capture((IWineD3DStateBlock *) This->Handles[BlockHandle - 1].ptr); + hr = IWineD3DStateBlock_Capture(wined3d_sb); LeaveCriticalSection(&ddraw_cs); return hr_ddraw_from_wined3d(hr); } @@ -5833,30 +5892,25 @@ IDirect3DDeviceImpl_7_DeleteStateBlock(IDirect3DDevice7 *iface, DWORD BlockHandle) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; + IWineD3DStateBlock *wined3d_sb; ULONG ref; - TRACE("(%p)->(%08x): Relay!\n", This, BlockHandle); + + TRACE("iface %p, stateblock %#x.\n", iface, BlockHandle); EnterCriticalSection(&ddraw_cs); - if(BlockHandle == 0 || BlockHandle > This->numHandles) + + wined3d_sb = ddraw_free_handle(&This->handle_table, BlockHandle - 1, DDRAW_HANDLE_STATEBLOCK); + if (!wined3d_sb) { - WARN("Out of range handle %d, returning D3DERR_INVALIDSTATEBLOCK\n", BlockHandle); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_INVALIDSTATEBLOCK; - } - if(This->Handles[BlockHandle - 1].type != DDrawHandle_StateBlock) - { - WARN("Handle %d is not a stateblock, returning D3DERR_INVALIDSTATEBLOCK\n", BlockHandle); + WARN("Invalid stateblock handle.\n"); LeaveCriticalSection(&ddraw_cs); return D3DERR_INVALIDSTATEBLOCK; } - ref = IWineD3DStateBlock_Release((IWineD3DStateBlock *) This->Handles[BlockHandle - 1].ptr); - if(ref) + if ((ref = IWineD3DStateBlock_Release(wined3d_sb))) { - ERR("Something is still holding the stateblock %p(Handle %d). Ref = %d\n", This->Handles[BlockHandle - 1].ptr, BlockHandle, ref); + ERR("Something is still holding stateblock %p (refcount %u).\n", wined3d_sb, ref); } - This->Handles[BlockHandle - 1].ptr = NULL; - This->Handles[BlockHandle - 1].type = DDrawHandle_Unknown; LeaveCriticalSection(&ddraw_cs); return D3D_OK; @@ -5905,8 +5959,11 @@ IDirect3DDeviceImpl_7_CreateStateBlock(IDirect3DDevice7 *iface, DWORD *BlockHandle) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; + IWineD3DStateBlock *wined3d_sb; HRESULT hr; - TRACE("(%p)->(%08x,%p)!\n", This, Type, BlockHandle); + DWORD h; + + TRACE("iface %p, type %#x, stateblock %p.\n", iface, Type, BlockHandle); if(!BlockHandle) { @@ -5920,21 +5977,28 @@ IDirect3DDeviceImpl_7_CreateStateBlock(IDirect3DDevice7 *iface, } EnterCriticalSection(&ddraw_cs); - *BlockHandle = IDirect3DDeviceImpl_CreateHandle(This); - if(!*BlockHandle) + + /* The D3DSTATEBLOCKTYPE enum is fine here. */ + hr = IWineD3DDevice_CreateStateBlock(This->wineD3DDevice, Type, &wined3d_sb); + if (FAILED(hr)) { - ERR("Cannot get a handle number for the stateblock\n"); + WARN("Failed to create stateblock, hr %#x.\n", hr); + LeaveCriticalSection(&ddraw_cs); + return hr_ddraw_from_wined3d(hr); + } + + h = ddraw_allocate_handle(&This->handle_table, wined3d_sb, DDRAW_HANDLE_STATEBLOCK); + if (h == DDRAW_INVALID_HANDLE) + { + ERR("Failed to allocate stateblock handle.\n"); + IWineD3DStateBlock_Release(wined3d_sb); LeaveCriticalSection(&ddraw_cs); return DDERR_OUTOFMEMORY; } - This->Handles[*BlockHandle - 1].type = DDrawHandle_StateBlock; - /* The D3DSTATEBLOCKTYPE enum is fine here */ - hr = IWineD3DDevice_CreateStateBlock(This->wineD3DDevice, - Type, - (IWineD3DStateBlock **) &This->Handles[*BlockHandle - 1].ptr, - NULL /* Parent, hope that works */); + *BlockHandle = h + 1; LeaveCriticalSection(&ddraw_cs); + return hr_ddraw_from_wined3d(hr); } @@ -6074,7 +6138,7 @@ static void copy_mipmap_chain(IDirect3DDeviceImpl *device, /* Try UpdateSurface that may perform a more direct opengl loading. But skip this if destination is paletted texture and has no palette. * Some games like Sacrifice set palette after Load, and it is a waste of effort to try to load texture without palette and generates * warnings in wined3d. */ - if (!palette_missing) + if (!palette_missing) hr = IWineD3DDevice_UpdateSurface(device->wineD3DDevice, src_level->WineD3DSurface, &rect, dest_level->WineD3DSurface, &point); @@ -6154,7 +6218,9 @@ IDirect3DDeviceImpl_7_Load(IDirect3DDevice7 *iface, IDirectDrawSurfaceImpl *src = (IDirectDrawSurfaceImpl *)SrcTex; POINT destpoint; RECT srcrect; - TRACE("(%p)->(%p,%p,%p,%p,%08x)\n", This, dest, DestPoint, src, SrcRect, Flags); + + TRACE("iface %p, dst_texture %p, dst_pos %s, src_texture %p, src_rect %s, flags %#x.\n", + iface, DestTex, wine_dbgstr_point(DestPoint), SrcTex, wine_dbgstr_rect(SrcRect), Flags); if( (!src) || (!dest) ) return DDERR_INVALIDPARAMS; @@ -6364,7 +6430,8 @@ IDirect3DDeviceImpl_7_LightEnable(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%d): Relay!\n", This, LightIndex, Enable); + + TRACE("iface %p, light_idx %u, enabled %#x.\n", iface, LightIndex, Enable); EnterCriticalSection(&ddraw_cs); hr = IWineD3DDevice_SetLightEnable(This->wineD3DDevice, LightIndex, Enable); @@ -6419,7 +6486,8 @@ IDirect3DDeviceImpl_7_GetLightEnable(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay\n", This, LightIndex, Enable); + + TRACE("iface %p, light_idx %u, enabled %p.\n", iface, LightIndex, Enable); if(!Enable) return DDERR_INVALIDPARAMS; @@ -6477,7 +6545,8 @@ IDirect3DDeviceImpl_7_SetClipPlane(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay!\n", This, Index, PlaneEquation); + + TRACE("iface %p, idx %u, plane %p.\n", iface, Index, PlaneEquation); if(!PlaneEquation) return DDERR_INVALIDPARAMS; @@ -6533,7 +6602,8 @@ IDirect3DDeviceImpl_7_GetClipPlane(IDirect3DDevice7 *iface, { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%d,%p): Relay!\n", This, Index, PlaneEquation); + + TRACE("iface %p, idx %u, plane %p.\n", iface, Index, PlaneEquation); if(!PlaneEquation) return DDERR_INVALIDPARAMS; @@ -6589,10 +6659,10 @@ IDirect3DDeviceImpl_7_GetInfo(IDirect3DDevice7 *iface, void *DevInfoStruct, DWORD Size) { - IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - TRACE("(%p)->(%08x,%p,%08x)\n", This, DevInfoID, DevInfoStruct, Size); + TRACE("iface %p, info_id %#x, info %p, info_size %u.\n", + iface, DevInfoID, DevInfoStruct, Size); - if (TRACE_ON(d3d7)) + if (TRACE_ON(ddraw)) { TRACE(" info requested : "); switch (DevInfoID) @@ -6617,7 +6687,7 @@ IDirect3DDeviceImpl_7_GetInfo(IDirect3DDevice7 *iface, * Device created with DDSCL_FPUPRESERVE - resets and restores FPU mode when necessary in * d3d calls (FPU may be in a mode non-suitable for d3d when the app calls d3d). Required * by Sacrifice (game). */ -const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUSetup_Vtbl = +static const struct IDirect3DDevice7Vtbl d3d_device7_fpu_setup_vtbl = { /*** IUnknown Methods ***/ IDirect3DDeviceImpl_7_QueryInterface, @@ -6672,7 +6742,7 @@ const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUSetup_Vtbl = IDirect3DDeviceImpl_7_GetInfo }; -const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUPreserve_Vtbl = +static const struct IDirect3DDevice7Vtbl d3d_device7_fpu_preserve_vtbl = { /*** IUnknown Methods ***/ IDirect3DDeviceImpl_7_QueryInterface, @@ -6727,7 +6797,7 @@ const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUPreserve_Vtbl = IDirect3DDeviceImpl_7_GetInfo }; -const IDirect3DDevice3Vtbl IDirect3DDevice3_Vtbl = +static const struct IDirect3DDevice3Vtbl d3d_device3_vtbl = { /*** IUnknown Methods ***/ Thunk_IDirect3DDeviceImpl_3_QueryInterface, @@ -6775,7 +6845,7 @@ const IDirect3DDevice3Vtbl IDirect3DDevice3_Vtbl = Thunk_IDirect3DDeviceImpl_3_ValidateDevice }; -const IDirect3DDevice2Vtbl IDirect3DDevice2_Vtbl = +static const struct IDirect3DDevice2Vtbl d3d_device2_vtbl = { /*** IUnknown Methods ***/ Thunk_IDirect3DDeviceImpl_2_QueryInterface, @@ -6814,7 +6884,7 @@ const IDirect3DDevice2Vtbl IDirect3DDevice2_Vtbl = Thunk_IDirect3DDeviceImpl_2_GetClipStatus }; -const IDirect3DDeviceVtbl IDirect3DDevice1_Vtbl = +static const struct IDirect3DDeviceVtbl d3d_device1_vtbl = { /*** IUnknown Methods ***/ Thunk_IDirect3DDeviceImpl_1_QueryInterface, @@ -6842,71 +6912,6 @@ const IDirect3DDeviceVtbl IDirect3DDevice1_Vtbl = Thunk_IDirect3DDeviceImpl_1_GetDirect3D }; -/***************************************************************************** - * IDirect3DDeviceImpl_CreateHandle - * - * Not called from the VTable - * - * Some older interface versions operate with handles, which are basically - * DWORDs which identify an interface, for example - * IDirect3DDevice::SetRenderState with DIRECT3DRENDERSTATE_TEXTUREHANDLE - * - * Those handle could be just casts to the interface pointers or vice versa, - * but that is not 64 bit safe and would mean blindly derefering a DWORD - * passed by the app. Instead there is a dynamic array in the device which - * keeps a DWORD to pointer information and a type for the handle. - * - * Basically this array only grows, when a handle is freed its pointer is - * just set to NULL. There will be much more reads from the array than - * insertion operations, so a dynamic array is fine. - * - * Params: - * This: D3DDevice implementation for which this handle should be created - * - * Returns: - * A free handle on success - * 0 on failure - * - *****************************************************************************/ -DWORD -IDirect3DDeviceImpl_CreateHandle(IDirect3DDeviceImpl *This) -{ - DWORD i; - struct HandleEntry *oldHandles = This->Handles; - - TRACE("(%p)\n", This); - - for(i = 0; i < This->numHandles; i++) - { - if(This->Handles[i].ptr == NULL && - This->Handles[i].type == DDrawHandle_Unknown) - { - TRACE("Reusing freed handle %d\n", i + 1); - return i + 1; - } - } - - TRACE("Growing the handle array\n"); - - This->numHandles++; - This->Handles = HeapAlloc(GetProcessHeap(), 0, sizeof(struct HandleEntry) * This->numHandles); - if(!This->Handles) - { - ERR("Out of memory\n"); - This->Handles = oldHandles; - This->numHandles--; - return 0; - } - if(oldHandles) - { - memcpy(This->Handles, oldHandles, (This->numHandles - 1) * sizeof(struct HandleEntry)); - HeapFree(GetProcessHeap(), 0, oldHandles); - } - - TRACE("Returning %d\n", This->numHandles); - return This->numHandles; -} - /***************************************************************************** * IDirect3DDeviceImpl_UpdateDepthStencil * @@ -6941,3 +6946,85 @@ IDirect3DDeviceImpl_UpdateDepthStencil(IDirect3DDeviceImpl *This) IDirectDrawSurface7_Release(depthStencil); return WINED3DZB_TRUE; } + +HRESULT d3d_device_init(IDirect3DDeviceImpl *device, IDirectDrawImpl *ddraw, IDirectDrawSurfaceImpl *target) +{ + IParentImpl *index_buffer_parent; + HRESULT hr; + + if (ddraw->cooperative_level & DDSCL_FPUPRESERVE) + device->lpVtbl = &d3d_device7_fpu_preserve_vtbl; + else + device->lpVtbl = &d3d_device7_fpu_setup_vtbl; + + device->IDirect3DDevice3_vtbl = &d3d_device3_vtbl; + device->IDirect3DDevice2_vtbl = &d3d_device2_vtbl; + device->IDirect3DDevice_vtbl = &d3d_device1_vtbl; + device->ref = 1; + device->ddraw = ddraw; + device->target = target; + + if (!ddraw_handle_table_init(&device->handle_table, 64)) + { + ERR("Failed to initialize handle table.\n"); + return DDERR_OUTOFMEMORY; + } + + device->legacyTextureBlending = FALSE; + + /* Create an index buffer, it's needed for indexed drawing */ + index_buffer_parent = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*index_buffer_parent)); + if (!index_buffer_parent) + { + ERR("Failed to allocate index buffer parent memory.\n"); + ddraw_handle_table_destroy(&device->handle_table); + return DDERR_OUTOFMEMORY; + } + + ddraw_parent_init(index_buffer_parent); + + hr = IWineD3DDevice_CreateIndexBuffer(ddraw->wineD3DDevice, 0x40000 /* Length. Don't know how long it should be */, + WINED3DUSAGE_DYNAMIC /* Usage */, WINED3DPOOL_DEFAULT, index_buffer_parent, + &ddraw_null_wined3d_parent_ops, &device->indexbuffer); + if (FAILED(hr)) + { + ERR("Failed to create an index buffer, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, index_buffer_parent); + ddraw_handle_table_destroy(&device->handle_table); + return hr; + } + index_buffer_parent->child = (IUnknown *)device->indexbuffer; + + /* This is for convenience. */ + device->wineD3DDevice = ddraw->wineD3DDevice; + IWineD3DDevice_AddRef(ddraw->wineD3DDevice); + + /* Render to the back buffer */ + hr = IWineD3DDevice_SetRenderTarget(ddraw->wineD3DDevice, 0, target->WineD3DSurface, TRUE); + if (FAILED(hr)) + { + ERR("Failed to set render target, hr %#x.\n", hr); + IParent_Release((IParent *)index_buffer_parent); + ddraw_handle_table_destroy(&device->handle_table); + return hr; + } + + /* FIXME: This is broken. The target AddRef() makes some sense, because + * we store a pointer during initialization, but then that's also where + * the AddRef() should be. We don't store ddraw->d3d_target anywhere. */ + /* AddRef the render target. Also AddRef the render target from ddraw, + * because if it is released before the app releases the D3D device, the + * D3D capabilities of wined3d will be uninitialized, which has bad effects. + * + * In most cases, those surfaces are the same anyway, but this will simply + * add another ref which is released when the device is destroyed. */ + IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)target); + IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)ddraw->d3d_target); + + ddraw->d3ddevice = device; + + IWineD3DDevice_SetRenderState(ddraw->wineD3DDevice, WINED3DRS_ZENABLE, + IDirect3DDeviceImpl_UpdateDepthStencil(device)); + + return D3D_OK; +} diff --git a/dll/directx/wine/ddraw/direct3d.c b/dll/directx/wine/ddraw/direct3d.c deleted file mode 100644 index 3f2410fe8a7..00000000000 --- a/dll/directx/wine/ddraw/direct3d.c +++ /dev/null @@ -1,1595 +0,0 @@ -/* - * Copyright (c) 2006 Stefan Dテカsinger - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "wine/port.h" -#include "wine/debug.h" - -#include -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - -#include "ddraw_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); - -/***************************************************************************** - * IDirect3D7::QueryInterface - * - * QueryInterface implementation with thunks to IDirectDraw7 - * - *****************************************************************************/ -static HRESULT WINAPI -Thunk_IDirect3DImpl_7_QueryInterface(IDirect3D7 *iface, - REFIID refiid, - void **obj) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - TRACE("(%p)->(%s,%p): Thunking to IDirectDraw7\n", This, debugstr_guid(refiid), obj); - - return IDirectDraw7_QueryInterface((IDirectDraw7 *)This, refiid, obj); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_3_QueryInterface(IDirect3D3 *iface, - REFIID refiid, - void **obj) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - TRACE("(%p)->(%s,%p): Thunking to IDirectDraw7\n", This, debugstr_guid(refiid), obj); - - return IDirectDraw7_QueryInterface((IDirectDraw7 *)This, refiid, obj); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_QueryInterface(IDirect3D2 *iface, - REFIID refiid, - void **obj) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p)->(%s,%p): Thunking to IDirectDraw7\n", This, debugstr_guid(refiid), obj); - - return IDirectDraw7_QueryInterface((IDirectDraw7 *)This, refiid, obj); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_1_QueryInterface(IDirect3D *iface, - REFIID refiid, - void **obj) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p)->(%s,%p): Thunking to IDirectDraw7\n", This, debugstr_guid(refiid), obj); - - return IDirectDraw7_QueryInterface((IDirectDraw7 *)This, refiid, obj); -} - -/***************************************************************************** - * IDirect3D7::AddRef - * - * DirectDraw refcounting is a bit odd. Every version of the ddraw interface - * has its own refcount, but IDirect3D 1/2/3 refcounts are linked to - * IDirectDraw, and IDirect3D7 is linked to IDirectDraw7 - * - * IDirect3D7 -> IDirectDraw7 - * IDirect3D3 -> IDirectDraw - * IDirect3D2 -> IDirectDraw - * IDirect3D -> IDirectDraw - * - * So every AddRef implementation thunks to a different interface, and the - * IDirectDrawX::AddRef implementations have different counters... - * - * Returns - * The new refcount - * - *****************************************************************************/ -static ULONG WINAPI -Thunk_IDirect3DImpl_7_AddRef(IDirect3D7 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - TRACE("(%p) : Thunking to IDirectDraw7.\n", This); - - return IDirectDraw7_AddRef((IDirectDraw7 *)This); -} - -static ULONG WINAPI -Thunk_IDirect3DImpl_3_AddRef(IDirect3D3 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - TRACE("(%p) : Thunking to IDirectDraw.\n", This); - - return IDirectDraw_AddRef((IDirectDraw *)&This->IDirectDraw_vtbl); -} - -static ULONG WINAPI -Thunk_IDirect3DImpl_2_AddRef(IDirect3D2 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p) : Thunking to IDirectDraw.\n", This); - - return IDirectDraw_AddRef((IDirectDraw *)&This->IDirectDraw_vtbl); -} - -static ULONG WINAPI -Thunk_IDirect3DImpl_1_AddRef(IDirect3D *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p) : Thunking to IDirectDraw.\n", This); - - return IDirectDraw_AddRef((IDirectDraw *)&This->IDirectDraw_vtbl); -} - -/***************************************************************************** - * IDirect3D7::Release - * - * Same story as IDirect3D7::AddRef - * - * Returns: The new refcount - * - *****************************************************************************/ -static ULONG WINAPI -Thunk_IDirect3DImpl_7_Release(IDirect3D7 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - TRACE("(%p) : Thunking to IDirectDraw7.\n", This); - - return IDirectDraw7_Release((IDirectDraw7 *)This); -} - -static ULONG WINAPI -Thunk_IDirect3DImpl_3_Release(IDirect3D3 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - TRACE("(%p) : Thunking to IDirectDraw.\n", This); - - return IDirectDraw_Release((IDirectDraw *)&This->IDirectDraw_vtbl); -} - -static ULONG WINAPI -Thunk_IDirect3DImpl_2_Release(IDirect3D2 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p) : Thunking to IDirectDraw.\n", This); - - return IDirectDraw_Release((IDirectDraw *)&This->IDirectDraw_vtbl); -} - -static ULONG WINAPI -Thunk_IDirect3DImpl_1_Release(IDirect3D *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p) : Thunking to IDirectDraw.\n", This); - - return IDirectDraw_Release((IDirectDraw *)&This->IDirectDraw_vtbl); -} - -/***************************************************************************** - * IDirect3D Methods - *****************************************************************************/ - -/***************************************************************************** - * IDirect3D::Initialize - * - * Initializes the IDirect3D interface. This is a no-op implementation, - * as all initialization is done at create time. - * - * Version 1 - * - * Params: - * refiid: ? - * - * Returns: - * D3D_OK, because it's a no-op - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_1_Initialize(IDirect3D *iface, - REFIID refiid) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - - TRACE("(%p)->(%s) no-op...\n", This, debugstr_guid(refiid)); - return D3D_OK; -} - -/***************************************************************************** - * IDirect3D7::EnumDevices - * - * The EnumDevices method for IDirect3D7. It enumerates all supported - * D3D7 devices. Currently the T&L, HAL and RGB devices are enumerated. - * - * Params: - * Callback: Function to call for each enumerated device - * Context: Pointer to pass back to the app - * - * Returns: - * D3D_OK, or the return value of the GetCaps call - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_7_EnumDevices(IDirect3D7 *iface, - LPD3DENUMDEVICESCALLBACK7 Callback, - void *Context) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - char interface_name_tnl[] = "WINE Direct3D7 Hardware Transform and Lighting acceleration using WineD3D"; - char device_name_tnl[] = "Wine D3D7 T&L HAL"; - char interface_name_hal[] = "WINE Direct3D7 Hardware acceleration using WineD3D"; - char device_name_hal[] = "Wine D3D7 HAL"; - char interface_name_rgb[] = "WINE Direct3D7 RGB Software Emulation using WineD3D"; - char device_name_rgb[] = "Wine D3D7 RGB"; - D3DDEVICEDESC7 ddesc; - D3DDEVICEDESC oldDesc; - HRESULT hr; - - TRACE("(%p)->(%p,%p)\n", This, Callback, Context); - EnterCriticalSection(&ddraw_cs); - - TRACE("(%p) Enumerating WineD3D D3Device7 interface\n", This); - hr = IDirect3DImpl_GetCaps(This->wineD3D, &oldDesc, &ddesc); - if(hr != D3D_OK) - { - LeaveCriticalSection(&ddraw_cs); - return hr; - } - Callback(interface_name_tnl, device_name_tnl, &ddesc, Context); - - ddesc.deviceGUID = IID_IDirect3DHALDevice; - Callback(interface_name_hal, device_name_hal, &ddesc, Context); - - ddesc.deviceGUID = IID_IDirect3DRGBDevice; - Callback(interface_name_rgb, device_name_rgb, &ddesc, Context); - - TRACE("(%p) End of enumeration\n", This); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; -} - -/***************************************************************************** - * IDirect3D3::EnumDevices - * - * Enumerates all supported Direct3DDevice interfaces. This is the - * implementation for Direct3D 1 to Direc3D 3, Version 7 has its own. - * - * Version 1, 2 and 3 - * - * Params: - * Callback: Application-provided routine to call for each enumerated device - * Context: Pointer to pass to the callback - * - * Returns: - * D3D_OK on success, - * The result of IDirect3DImpl_GetCaps if it failed - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_3_EnumDevices(IDirect3D3 *iface, - LPD3DENUMDEVICESCALLBACK Callback, - void *Context) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - D3DDEVICEDESC dref, d1, d2; - D3DDEVICEDESC7 newDesc; - static CHAR wined3d_description[] = "Wine D3DDevice using WineD3D and OpenGL"; - HRESULT hr; - - /* Some games (Motoracer 2 demo) have the bad idea to modify the device name string. - Let's put the string in a sufficiently sized array in writable memory. */ - char device_name[50]; - strcpy(device_name,"Direct3D HEL"); - - TRACE("(%p)->(%p,%p)\n", This, Callback, Context); - EnterCriticalSection(&ddraw_cs); - - hr = IDirect3DImpl_GetCaps(This->wineD3D, &dref, &newDesc); - if(hr != D3D_OK) - { - LeaveCriticalSection(&ddraw_cs); - return hr; - } - - /* Do I have to enumerate the reference id? Note from old d3d7: - * "It seems that enumerating the reference IID on Direct3D 1 games - * (AvP / Motoracer2) breaks them". So do not enumerate this iid in V1 - * - * There's a registry key HKLM\Software\Microsoft\Direct3D\Drivers, EnumReference - * which enables / disables enumerating the reference rasterizer. It's a DWORD, - * 0 means disabled, 2 means enabled. The enablerefrast.reg and disablerefrast.reg - * files in the DirectX 7.0 sdk demo directory suggest this. - * - * Some games(GTA 2) seem to use the second enumerated device, so I have to enumerate - * at least 2 devices. So enumerate the reference device to have 2 devices. - * - * Other games(Rollcage) tell emulation and hal device apart by certain flags. - * Rollcage expects D3DPTEXTURECAPS_POW2 to be set(yeah, it is a limitation flag), - * and it refuses all devices that have the perspective flag set. This way it refuses - * the emulation device, and HAL devices never have POW2 unset in d3d7 on windows. - */ - - if(This->d3dversion != 1) - { - static CHAR reference_description[] = "RGB Direct3D emulation"; - - TRACE("(%p) Enumerating WineD3D D3DDevice interface\n", This); - d1 = dref; - d2 = dref; - /* The rgb device has the pow2 flag set in the hel caps, but not in the hal caps */ - d1.dpcLineCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); - d1.dpcTriCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); - hr = Callback( (LPIID) &IID_IDirect3DRGBDevice, reference_description, device_name, &d1, &d2, Context); - if(hr != D3DENUMRET_OK) - { - TRACE("Application cancelled the enumeration\n"); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; - } - } - - strcpy(device_name,"Direct3D HAL"); - - TRACE("(%p) Enumerating HAL Direct3D device\n", This); - d1 = dref; - d2 = dref; - /* The hal device does not have the pow2 flag set in hel, but in hal */ - d2.dpcLineCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); - d2.dpcTriCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); - hr = Callback( (LPIID) &IID_IDirect3DHALDevice, wined3d_description, device_name, &d1, &d2, Context); - if(hr != D3DENUMRET_OK) - { - TRACE("Application cancelled the enumeration\n"); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; - } - TRACE("(%p) End of enumeration\n", This); - - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_EnumDevices(IDirect3D2 *iface, - LPD3DENUMDEVICESCALLBACK Callback, - void *Context) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Callback, Context); - return IDirect3D3_EnumDevices((IDirect3D3 *)&This->IDirect3D3_vtbl, Callback, Context); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_1_EnumDevices(IDirect3D *iface, - LPD3DENUMDEVICESCALLBACK Callback, - void *Context) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Callback, Context); - return IDirect3D3_EnumDevices((IDirect3D3 *)&This->IDirect3D3_vtbl, Callback, Context); -} - -/***************************************************************************** - * IDirect3D3::CreateLight - * - * Creates an IDirect3DLight interface. This interface is used in - * Direct3D3 or earlier for lighting. In Direct3D7 it has been replaced - * by the DIRECT3DLIGHT7 structure. Wine's Direct3DLight implementation - * uses the IDirect3DDevice7 interface with D3D7 lights. - * - * Version 1, 2 and 3 - * - * Params: - * Light: Address to store the new interface pointer - * UnkOuter: Basically for aggregation, but ddraw doesn't support it. - * Must be NULL - * - * Returns: - * D3D_OK on success - * DDERR_OUTOFMEMORY if memory allocation failed - * CLASS_E_NOAGGREGATION if UnkOuter != NULL - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_3_CreateLight(IDirect3D3 *iface, - IDirect3DLight **Light, - IUnknown *UnkOuter ) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - IDirect3DLightImpl *object; - - TRACE("(%p)->(%p,%p)\n", This, Light, UnkOuter); - - if(UnkOuter) - return CLASS_E_NOAGGREGATION; - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DLightImpl)); - if (object == NULL) - return DDERR_OUTOFMEMORY; - - object->lpVtbl = &IDirect3DLight_Vtbl; - object->ref = 1; - object->ddraw = This; - object->next = NULL; - object->active_viewport = NULL; - - /* Update functions */ - object->activate = light_update; - object->desactivate = light_activate; - object->update = light_desactivate; - object->active_viewport = NULL; - - *Light = (IDirect3DLight *)object; - - TRACE("(%p) creating implementation at %p.\n", This, object); - - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_CreateLight(IDirect3D2 *iface, - IDirect3DLight **Direct3DLight, - IUnknown *UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Direct3DLight, UnkOuter); - return IDirect3D3_CreateLight((IDirect3D3 *)&This->IDirect3D3_vtbl, Direct3DLight, UnkOuter); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_1_CreateLight(IDirect3D *iface, - IDirect3DLight **Direct3DLight, - IUnknown *UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Direct3DLight, UnkOuter); - return IDirect3D3_CreateLight((IDirect3D3 *)&This->IDirect3D3_vtbl, Direct3DLight, UnkOuter); -} - -/***************************************************************************** - * IDirect3D3::CreateMaterial - * - * Creates an IDirect3DMaterial interface. This interface is used by Direct3D3 - * and older versions. The IDirect3DMaterial implementation wraps its - * functionality to IDirect3DDevice7::SetMaterial and friends. - * - * Version 1, 2 and 3 - * - * Params: - * Material: Address to store the new interface's pointer to - * UnkOuter: Basically for aggregation, but ddraw doesn't support it. - * Must be NULL - * - * Returns: - * D3D_OK on success - * DDERR_OUTOFMEMORY if memory allocation failed - * CLASS_E_NOAGGREGATION if UnkOuter != NULL - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_3_CreateMaterial(IDirect3D3 *iface, - IDirect3DMaterial3 **Material, - IUnknown *UnkOuter ) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - IDirect3DMaterialImpl *object; - - TRACE("(%p)->(%p,%p)\n", This, Material, UnkOuter); - - if(UnkOuter) - return CLASS_E_NOAGGREGATION; - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DMaterialImpl)); - if (object == NULL) - return DDERR_OUTOFMEMORY; - - object->lpVtbl = &IDirect3DMaterial3_Vtbl; - object->IDirect3DMaterial2_vtbl = &IDirect3DMaterial2_Vtbl; - object->IDirect3DMaterial_vtbl = &IDirect3DMaterial_Vtbl; - object->ref = 1; - object->ddraw = This; - object->activate = material_activate; - - *Material = (IDirect3DMaterial3 *)object; - - TRACE("(%p) creating implementation at %p.\n", This, object); - - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_CreateMaterial(IDirect3D2 *iface, - IDirect3DMaterial2 **Direct3DMaterial, - IUnknown* UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - HRESULT ret; - IDirect3DMaterial3 *ret_val; - - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Direct3DMaterial, UnkOuter); - ret = IDirect3D3_CreateMaterial((IDirect3D3 *)&This->IDirect3D3_vtbl, &ret_val, UnkOuter); - - *Direct3DMaterial = ret_val ? - (IDirect3DMaterial2 *)&((IDirect3DMaterialImpl *)ret_val)->IDirect3DMaterial2_vtbl : NULL; - - TRACE(" returning interface %p.\n", *Direct3DMaterial); - - return ret; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_1_CreateMaterial(IDirect3D *iface, - IDirect3DMaterial **Direct3DMaterial, - IUnknown* UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - HRESULT ret; - LPDIRECT3DMATERIAL3 ret_val; - - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Direct3DMaterial, UnkOuter); - ret = IDirect3D3_CreateMaterial((IDirect3D3 *)&This->IDirect3D3_vtbl, &ret_val, UnkOuter); - - *Direct3DMaterial = ret_val ? - (IDirect3DMaterial *)&((IDirect3DMaterialImpl *)ret_val)->IDirect3DMaterial_vtbl : NULL; - - TRACE(" returning interface %p.\n", *Direct3DMaterial); - - return ret; -} - -/***************************************************************************** - * IDirect3D3::CreateViewport - * - * Creates an IDirect3DViewport interface. This interface is used - * by Direct3D and earlier versions for Viewport management. In Direct3D7 - * it has been replaced by a viewport structure and - * IDirect3DDevice7::*Viewport. Wine's IDirect3DViewport implementation - * uses the IDirect3DDevice7 methods for its functionality - * - * Params: - * Viewport: Address to store the new interface pointer - * UnkOuter: Basically for aggregation, but ddraw doesn't support it. - * Must be NULL - * - * Returns: - * D3D_OK on success - * DDERR_OUTOFMEMORY if memory allocation failed - * CLASS_E_NOAGGREGATION if UnkOuter != NULL - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_3_CreateViewport(IDirect3D3 *iface, - IDirect3DViewport3 **Viewport, - IUnknown *UnkOuter ) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - IDirect3DViewportImpl *object; - - if(UnkOuter) - return CLASS_E_NOAGGREGATION; - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DViewportImpl)); - if (object == NULL) - return DDERR_OUTOFMEMORY; - - object->lpVtbl = &IDirect3DViewport3_Vtbl; - object->ref = 1; - object->ddraw = This; - object->activate = viewport_activate; - object->use_vp2 = 0xFF; - object->next = NULL; - object->lights = NULL; - object->num_lights = 0; - object->map_lights = 0; - - *Viewport = (IDirect3DViewport3 *)object; - - TRACE("(%p) creating implementation at %p.\n",This, object); - - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_CreateViewport(IDirect3D2 *iface, - IDirect3DViewport2 **D3DViewport2, - IUnknown *UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, D3DViewport2, UnkOuter); - - return IDirect3D3_CreateViewport((IDirect3D3 *)&This->IDirect3D3_vtbl, - (IDirect3DViewport3 **) D3DViewport2 /* No need to cast here */, - UnkOuter); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_1_CreateViewport(IDirect3D *iface, - IDirect3DViewport **D3DViewport, - IUnknown* UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, D3DViewport, UnkOuter); - - return IDirect3D3_CreateViewport((IDirect3D3 *)&This->IDirect3D3_vtbl, - (IDirect3DViewport3 **) D3DViewport /* No need to cast here */, - UnkOuter); -} - -/***************************************************************************** - * IDirect3D3::FindDevice - * - * This method finds a device with the requested properties and returns a - * device description - * - * Verion 1, 2 and 3 - * Params: - * D3DDFS: Describes the requested device characteristics - * D3DFDR: Returns the device description - * - * Returns: - * D3D_OK on success - * DDERR_INVALIDPARAMS if no device was found - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_3_FindDevice(IDirect3D3 *iface, - D3DFINDDEVICESEARCH *D3DDFS, - D3DFINDDEVICERESULT *D3DFDR) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - D3DDEVICEDESC desc; - D3DDEVICEDESC7 newDesc; - HRESULT hr; - - TRACE("(%p)->(%p,%p)\n", This, D3DDFS, D3DFDR); - - if ((D3DDFS->dwFlags & D3DFDS_COLORMODEL) && - (D3DDFS->dcmColorModel != D3DCOLOR_RGB)) - { - TRACE(" trying to request a non-RGB D3D color model. Not supported.\n"); - return DDERR_INVALIDPARAMS; /* No real idea what to return here :-) */ - } - if (D3DDFS->dwFlags & D3DFDS_GUID) - { - TRACE(" trying to match guid %s.\n", debugstr_guid(&(D3DDFS->guid))); - if ((IsEqualGUID(&IID_D3DDEVICE_WineD3D, &(D3DDFS->guid)) == 0) && - (IsEqualGUID(&IID_IDirect3DHALDevice, &(D3DDFS->guid)) == 0) && - (IsEqualGUID(&IID_IDirect3DRefDevice, &(D3DDFS->guid)) == 0)) - { - TRACE(" no match for this GUID.\n"); - return DDERR_INVALIDPARAMS; - } - } - - /* Get the caps */ - hr = IDirect3DImpl_GetCaps(This->wineD3D, &desc, &newDesc); - if(hr != D3D_OK) return hr; - - /* Now return our own GUID */ - D3DFDR->guid = IID_D3DDEVICE_WineD3D; - D3DFDR->ddHwDesc = desc; - D3DFDR->ddSwDesc = desc; - - TRACE(" returning Wine's WineD3D device with (undumped) capabilities\n"); - - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_FindDevice(IDirect3D2 *iface, - D3DFINDDEVICESEARCH *D3DDFS, - D3DFINDDEVICERESULT *D3DFDR) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, D3DDFS, D3DFDR); - return IDirect3D3_FindDevice((IDirect3D3 *)&This->IDirect3D3_vtbl, D3DDFS, D3DFDR); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_1_FindDevice(IDirect3D *iface, - D3DFINDDEVICESEARCH *D3DDFS, - D3DFINDDEVICERESULT *D3DDevice) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, D3DDFS, D3DDevice); - return IDirect3D3_FindDevice((IDirect3D3 *)&This->IDirect3D3_vtbl, D3DDFS, D3DDevice); -} - -/***************************************************************************** - * IDirect3D7::CreateDevice - * - * Creates an IDirect3DDevice7 interface. - * - * Version 2, 3 and 7. IDirect3DDevice 1 interfaces are interfaces to - * DirectDraw surfaces and are created with - * IDirectDrawSurface::QueryInterface. This method uses CreateDevice to - * create the device object and QueryInterfaces for IDirect3DDevice - * - * Params: - * refiid: IID of the device to create - * Surface: Initial rendertarget - * Device: Address to return the interface pointer - * - * Returns: - * D3D_OK on success - * DDERR_OUTOFMEMORY if memory allocation failed - * DDERR_INVALIDPARAMS if a device exists already - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_7_CreateDevice(IDirect3D7 *iface, - REFCLSID refiid, - IDirectDrawSurface7 *Surface, - IDirect3DDevice7 **Device) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - IDirect3DDeviceImpl *object; - IParentImpl *IndexBufferParent; - HRESULT hr; - IDirectDrawSurfaceImpl *target = (IDirectDrawSurfaceImpl *)Surface; - TRACE("(%p)->(%s,%p,%p)\n", iface, debugstr_guid(refiid), Surface, Device); - - EnterCriticalSection(&ddraw_cs); - *Device = NULL; - - /* Fail device creation if non-opengl surfaces are used */ - if(This->ImplType != SURFACE_OPENGL) - { - ERR("The application wants to create a Direct3D device, but non-opengl surfaces are set in the registry. Please set the surface implementation to opengl or autodetection to allow 3D rendering\n"); - - /* We only hit this path if a default surface is set in the registry. Incorrect autodetection - * is caught in CreateSurface or QueryInterface - */ - LeaveCriticalSection(&ddraw_cs); - return DDERR_NO3D; - } - - /* So far we can only create one device per ddraw object */ - if(This->d3ddevice) - { - FIXME("(%p): Only one Direct3D device per DirectDraw object supported\n", This); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } - - object = HeapAlloc(GetProcessHeap(), 0, sizeof(IDirect3DDeviceImpl)); - if(!object) - { - ERR("Out of memory when allocating a IDirect3DDevice implementation\n"); - LeaveCriticalSection(&ddraw_cs); - return DDERR_OUTOFMEMORY; - } - - if (This->cooperative_level & DDSCL_FPUPRESERVE) - object->lpVtbl = &IDirect3DDevice7_FPUPreserve_Vtbl; - else - object->lpVtbl = &IDirect3DDevice7_FPUSetup_Vtbl; - - object->IDirect3DDevice3_vtbl = &IDirect3DDevice3_Vtbl; - object->IDirect3DDevice2_vtbl = &IDirect3DDevice2_Vtbl; - object->IDirect3DDevice_vtbl = &IDirect3DDevice1_Vtbl; - object->ref = 1; - object->ddraw = This; - object->viewport_list = NULL; - object->current_viewport = NULL; - object->material = 0; - object->target = target; - - object->Handles = NULL; - object->numHandles = 0; - - object->legacyTextureBlending = FALSE; - - /* This is for convenience */ - object->wineD3DDevice = This->wineD3DDevice; - - /* Create an index buffer, it's needed for indexed drawing */ - IndexBufferParent = HeapAlloc(GetProcessHeap(), 0, sizeof(IParentImpl)); - if(!IndexBufferParent) - { - ERR("Allocating memory for an index buffer parent failed\n"); - HeapFree(GetProcessHeap(), 0, object); - LeaveCriticalSection(&ddraw_cs); - return DDERR_OUTOFMEMORY; - } - IndexBufferParent->lpVtbl = &IParent_Vtbl; - IndexBufferParent->ref = 1; - - /* Create an Index Buffer. WineD3D needs one for Drawing indexed primitives - * Create a (hopefully) long enough buffer, and copy the indices into it - * Ideally, a IWineD3DBuffer::SetData method could be created, which - * takes the pointer and avoids the memcpy - */ - hr = IWineD3DDevice_CreateIndexBuffer(This->wineD3DDevice, 0x40000 /* Length. Don't know how long it should be */, - WINED3DUSAGE_DYNAMIC /* Usage */, WINED3DPOOL_DEFAULT, &object->indexbuffer, (IUnknown *)IndexBufferParent, - &ddraw_null_wined3d_parent_ops); - - if(FAILED(hr)) - { - ERR("Failed to create an index buffer\n"); - HeapFree(GetProcessHeap(), 0, object); - LeaveCriticalSection(&ddraw_cs); - return hr; - } - IndexBufferParent->child = (IUnknown *) object->indexbuffer; - - /* No need to set the indices, it's done when necessary */ - - /* AddRef the WineD3D Device */ - IWineD3DDevice_AddRef(This->wineD3DDevice); - - /* Don't forget to return the interface ;) */ - *Device = (IDirect3DDevice7 *)object; - - TRACE(" (%p) Created an IDirect3DDeviceImpl object at %p\n", This, object); - - /* This is for apps which create a non-flip, non-d3d primary surface - * and an offscreen D3DDEVICE surface, then render to the offscreen surface - * and do a Blt from the offscreen to the primary surface. - * - * Set the offscreen D3DDDEVICE surface(=target) as the back buffer, - * and the primary surface(=This->d3d_target) as the front buffer. - * - * This way the app will render to the D3DDEVICE surface and WineD3D - * will catch the Blt was Back Buffer -> Front buffer blt and perform - * a flip instead. This way we don't have to deal with a mixed GL / GDI - * environment. - * - * This should be checked against windowed apps. The only app tested with - * this is moto racer 2 during the loading screen. - */ - TRACE("Isrendertarget: %s, d3d_target=%p\n", target->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE ? "true" : "false", This->d3d_target); - if(!(target->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && - (This->d3d_target != target)) - { - TRACE("(%p) Using %p as front buffer, %p as back buffer\n", This, This->d3d_target, target); - hr = IWineD3DDevice_SetFrontBackBuffers(This->wineD3DDevice, - This->d3d_target->WineD3DSurface, - target->WineD3DSurface); - if(hr != D3D_OK) - ERR("(%p) Error %08x setting the front and back buffer\n", This, hr); - - /* Render to the back buffer */ - IWineD3DDevice_SetRenderTarget(This->wineD3DDevice, 0, - target->WineD3DSurface, - TRUE); - object->OffScreenTarget = TRUE; - } - else - { - object->OffScreenTarget = FALSE; - } - - /* AddRef the render target. Also AddRef the render target from ddraw, - * because if it is released before the app releases the D3D device, the D3D capabilities - * of WineD3D will be uninitialized, which has bad effects. - * - * In most cases, those surfaces are the surfaces are the same anyway, but this will simply - * add another ref which is released when the device is destroyed. - */ - IDirectDrawSurface7_AddRef(Surface); - IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)This->d3d_target); - - This->d3ddevice = object; - - IWineD3DDevice_SetRenderState(This->wineD3DDevice, - WINED3DRS_ZENABLE, - IDirect3DDeviceImpl_UpdateDepthStencil(object)); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_3_CreateDevice(IDirect3D3 *iface, - REFCLSID refiid, - IDirectDrawSurface4 *Surface, - IDirect3DDevice3 **Device, - IUnknown *UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - HRESULT hr; - TRACE("(%p)->(%s,%p,%p,%p): Thunking to IDirect3D7\n", This, debugstr_guid(refiid), Surface, Device, UnkOuter); - - if(UnkOuter != NULL) - return CLASS_E_NOAGGREGATION; - - hr = IDirect3D7_CreateDevice((IDirect3D7 *)&This->IDirect3D7_vtbl, refiid, - (IDirectDrawSurface7 *)Surface /* Same VTables */, (IDirect3DDevice7 **)Device); - - *Device = *Device ? (IDirect3DDevice3 *)&((IDirect3DDeviceImpl *)*Device)->IDirect3DDevice3_vtbl : NULL; - return hr; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_CreateDevice(IDirect3D2 *iface, - REFCLSID refiid, - IDirectDrawSurface *Surface, - IDirect3DDevice2 **Device) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - HRESULT hr; - TRACE("(%p)->(%s,%p,%p): Thunking to IDirect3D7\n", This, debugstr_guid(refiid), Surface, Device); - - hr = IDirect3D7_CreateDevice((IDirect3D7 *)&This->IDirect3D7_vtbl, refiid, - Surface ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)Surface) : NULL, - (IDirect3DDevice7 **)Device); - - *Device = *Device ? (IDirect3DDevice2 *)&((IDirect3DDeviceImpl *)*Device)->IDirect3DDevice2_vtbl : NULL; - return hr; -} - -/***************************************************************************** - * IDirect3D7::CreateVertexBuffer - * - * Creates a new vertex buffer object and returns a IDirect3DVertexBuffer7 - * interface. - * - * Version 3 and 7 - * - * Params: - * Desc: Requested Vertex buffer properties - * VertexBuffer: Address to return the interface pointer at - * Flags: Some flags, must be 0 - * - * Returns - * D3D_OK on success - * DDERR_OUTOFMEMORY if memory allocation failed - * The return value of IWineD3DDevice::CreateVertexBuffer if this call fails - * DDERR_INVALIDPARAMS if Desc or VertexBuffer are NULL, or Flags != 0 - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_7_CreateVertexBuffer(IDirect3D7 *iface, - D3DVERTEXBUFFERDESC *Desc, - IDirect3DVertexBuffer7 **VertexBuffer, - DWORD Flags) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - IDirect3DVertexBufferImpl *object; - HRESULT hr; - DWORD usage; - TRACE("(%p)->(%p,%p,%08x)\n", This, Desc, VertexBuffer, Flags); - - TRACE("(%p) Vertex buffer description:\n", This); - TRACE("(%p) dwSize=%d\n", This, Desc->dwSize); - TRACE("(%p) dwCaps=%08x\n", This, Desc->dwCaps); - TRACE("(%p) FVF=%08x\n", This, Desc->dwFVF); - TRACE("(%p) dwNumVertices=%d\n", This, Desc->dwNumVertices); - - /* D3D7 SDK: "No Flags are currently defined for this method. This - * parameter must be 0" - * - * Never trust the documentation - this is wrong - if(Flags != 0) - { - ERR("(%p) Flags is %08lx, returning DDERR_INVALIDPARAMS\n", This, Flags); - return DDERR_INVALIDPARAMS; - } - */ - - /* Well, this sounds sane */ - if( (!VertexBuffer) || (!Desc) ) - return DDERR_INVALIDPARAMS; - - /* Now create the vertex buffer */ - object = HeapAlloc(GetProcessHeap(), 0, sizeof(IDirect3DVertexBufferImpl)); - if(!object) - { - ERR("(%p) Out of memory when allocating a IDirect3DVertexBufferImpl structure\n", This); - return DDERR_OUTOFMEMORY; - } - - object->ref = 1; - object->lpVtbl = &IDirect3DVertexBuffer7_Vtbl; - object->IDirect3DVertexBuffer_vtbl = &IDirect3DVertexBuffer1_Vtbl; - - object->Caps = Desc->dwCaps; - object->ddraw = This; - object->fvf = Desc->dwFVF; - - usage = Desc->dwCaps & D3DVBCAPS_WRITEONLY ? WINED3DUSAGE_WRITEONLY : 0; - usage |= WINED3DUSAGE_STATICDECL; - - EnterCriticalSection(&ddraw_cs); - hr = IWineD3DDevice_CreateVertexBuffer(This->wineD3DDevice, - get_flexible_vertex_size(Desc->dwFVF) * Desc->dwNumVertices, - usage, Desc->dwCaps & D3DVBCAPS_SYSTEMMEMORY ? WINED3DPOOL_SYSTEMMEM : WINED3DPOOL_DEFAULT, - &object->wineD3DVertexBuffer, (IUnknown *)object, &ddraw_null_wined3d_parent_ops); - if(hr != D3D_OK) - { - ERR("(%p) IWineD3DDevice::CreateVertexBuffer failed with hr=%08x\n", This, hr); - HeapFree(GetProcessHeap(), 0, object); - LeaveCriticalSection(&ddraw_cs); - if (hr == WINED3DERR_INVALIDCALL) - return DDERR_INVALIDPARAMS; - else - return hr; - } - - object->wineD3DVertexDeclaration = IDirectDrawImpl_FindDecl(This, - Desc->dwFVF); - if(!object->wineD3DVertexDeclaration) - { - ERR("Cannot find the vertex declaration for fvf %08x\n", Desc->dwFVF); - IWineD3DBuffer_Release(object->wineD3DVertexBuffer); - HeapFree(GetProcessHeap(), 0, object); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } - IWineD3DVertexDeclaration_AddRef(object->wineD3DVertexDeclaration); - - /* Return the interface */ - *VertexBuffer = (IDirect3DVertexBuffer7 *)object; - - TRACE("(%p) Created new vertex buffer implementation at %p, returning interface at %p\n", This, object, *VertexBuffer); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_3_CreateVertexBuffer(IDirect3D3 *iface, - D3DVERTEXBUFFERDESC *Desc, - IDirect3DVertexBuffer **VertexBuffer, - DWORD Flags, - IUnknown *UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - HRESULT hr; - TRACE("(%p)->(%p,%p,%08x,%p): Relaying to IDirect3D7\n", This, Desc, VertexBuffer, Flags, UnkOuter); - - if(UnkOuter != NULL) return CLASS_E_NOAGGREGATION; - - hr = IDirect3D7_CreateVertexBuffer((IDirect3D7 *)&This->IDirect3D7_vtbl, - Desc, (IDirect3DVertexBuffer7 **)VertexBuffer, Flags); - - *VertexBuffer = *VertexBuffer ? - (IDirect3DVertexBuffer *)&((IDirect3DVertexBufferImpl *)*VertexBuffer)->IDirect3DVertexBuffer_vtbl : NULL; - - return hr; -} - - -/***************************************************************************** - * IDirect3D7::EnumZBufferFormats - * - * Enumerates all supported Z buffer pixel formats - * - * Version 3 and 7 - * - * Params: - * refiidDevice: - * Callback: Callback to call for each pixel format - * Context: Pointer to pass back to the callback - * - * Returns: - * D3D_OK on success - * DDERR_INVALIDPARAMS if Callback is NULL - * For details, see IWineD3DDevice::EnumZBufferFormats - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_7_EnumZBufferFormats(IDirect3D7 *iface, - REFCLSID refiidDevice, - LPD3DENUMPIXELFORMATSCALLBACK Callback, - void *Context) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - HRESULT hr; - unsigned int i; - WINED3DDISPLAYMODE d3ddm; - WINED3DDEVTYPE type; - - /* Order matters. Specifically, BattleZone II (full version) expects the - * 16-bit depth formats to be listed before the 24 and 32 ones. */ - WINED3DFORMAT FormatList[] = { - WINED3DFMT_S1_UINT_D15_UNORM, - WINED3DFMT_D16_UNORM, - WINED3DFMT_X8D24_UNORM, - WINED3DFMT_S4X4_UINT_D24_UNORM, - WINED3DFMT_D24_UNORM_S8_UINT, - WINED3DFMT_D32_UNORM, - }; - - TRACE("(%p)->(%s,%p,%p): Relay\n", iface, debugstr_guid(refiidDevice), Callback, Context); - - if(!Callback) - return DDERR_INVALIDPARAMS; - - if(IsEqualGUID(refiidDevice, &IID_IDirect3DHALDevice) || - IsEqualGUID(refiidDevice, &IID_IDirect3DTnLHalDevice) || - IsEqualGUID(refiidDevice, &IID_D3DDEVICE_WineD3D)) - { - TRACE("Asked for HAL device\n"); - type = WINED3DDEVTYPE_HAL; - } - else if(IsEqualGUID(refiidDevice, &IID_IDirect3DRGBDevice) || - IsEqualGUID(refiidDevice, &IID_IDirect3DMMXDevice)) - { - TRACE("Asked for SW device\n"); - type = WINED3DDEVTYPE_SW; - } - else if(IsEqualGUID(refiidDevice, &IID_IDirect3DRefDevice)) - { - TRACE("Asked for REF device\n"); - type = WINED3DDEVTYPE_REF; - } - else if(IsEqualGUID(refiidDevice, &IID_IDirect3DNullDevice)) - { - TRACE("Asked for NULLREF device\n"); - type = WINED3DDEVTYPE_NULLREF; - } - else - { - FIXME("Unexpected device GUID %s\n", debugstr_guid(refiidDevice)); - type = WINED3DDEVTYPE_HAL; - } - - EnterCriticalSection(&ddraw_cs); - /* We need an adapter format from somewhere to please wined3d and WGL. Use the current display mode. - * So far all cards offer the same depth stencil format for all modes, but if some do not and apps - * do not like that we'll have to find some workaround, like iterating over all imaginable formats - * and collecting all the depth stencil formats we can get - */ - hr = IWineD3DDevice_GetDisplayMode(This->wineD3DDevice, - 0 /* swapchain 0 */, - &d3ddm); - - for(i = 0; i < (sizeof(FormatList) / sizeof(FormatList[0])); i++) - { - hr = IWineD3D_CheckDeviceFormat(This->wineD3D, - WINED3DADAPTER_DEFAULT /* Adapter */, - type /* DeviceType */, - d3ddm.Format /* AdapterFormat */, - WINED3DUSAGE_DEPTHSTENCIL /* Usage */, - WINED3DRTYPE_SURFACE, - FormatList[i], - SURFACE_OPENGL); - if(hr == D3D_OK) - { - DDPIXELFORMAT pformat; - - memset(&pformat, 0, sizeof(pformat)); - pformat.dwSize = sizeof(pformat); - PixelFormat_WineD3DtoDD(&pformat, FormatList[i]); - - TRACE("Enumerating WineD3DFormat %d\n", FormatList[i]); - hr = Callback(&pformat, Context); - if(hr != DDENUMRET_OK) - { - TRACE("Format enumeration cancelled by application\n"); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; - } - } - } - TRACE("End of enumeration\n"); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_3_EnumZBufferFormats(IDirect3D3 *iface, - REFCLSID riidDevice, - LPD3DENUMPIXELFORMATSCALLBACK Callback, - void *Context) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - TRACE("(%p)->(%s,%p,%p) thunking to IDirect3D7 interface.\n", This, debugstr_guid(riidDevice), Callback, Context); - return IDirect3D7_EnumZBufferFormats((IDirect3D7 *)&This->IDirect3D7_vtbl, riidDevice, Callback, Context); -} - -/***************************************************************************** - * IDirect3D7::EvictManagedTextures - * - * Removes all managed textures (=surfaces with DDSCAPS2_TEXTUREMANAGE or - * DDSCAPS2_D3DTEXTUREMANAGE caps) to be removed from video memory. - * - * Version 3 and 7 - * - * Returns: - * D3D_OK, because it's a stub - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_7_EvictManagedTextures(IDirect3D7 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - FIXME("(%p): Stub!\n", This); - - /* Implementation idea: - * Add an IWineD3DSurface method which sets the opengl texture - * priority low or even removes the opengl texture. - */ - - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_3_EvictManagedTextures(IDirect3D3 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - TRACE("(%p)->() thunking to IDirect3D7 interface.\n", This); - return IDirect3D7_EvictManagedTextures((IDirect3D7 *)&This->IDirect3D7_vtbl); -} - -/***************************************************************************** - * IDirect3DImpl_GetCaps - * - * This function retrieves the device caps from wined3d - * and converts it into a D3D7 and D3D - D3D3 structure - * This is a helper function called from various places in ddraw - * - * Params: - * WineD3D: The interface to get the caps from - * Desc123: Old D3D <3 structure to fill (needed) - * Desc7: D3D7 device desc structure to fill (needed) - * - * Returns - * D3D_OK on success, or the return value of IWineD3D::GetCaps - * - *****************************************************************************/ -HRESULT -IDirect3DImpl_GetCaps(IWineD3D *WineD3D, - D3DDEVICEDESC *Desc123, - D3DDEVICEDESC7 *Desc7) -{ - WINED3DCAPS WCaps; - HRESULT hr; - - /* Some variables to assign to the pointers in WCaps */ - TRACE("()->(%p,%p,%p\n", WineD3D, Desc123, Desc7); - - memset(&WCaps, 0, sizeof(WCaps)); - EnterCriticalSection(&ddraw_cs); - hr = IWineD3D_GetDeviceCaps(WineD3D, 0, WINED3DDEVTYPE_HAL, &WCaps); - LeaveCriticalSection(&ddraw_cs); - if(hr != D3D_OK) - { - return hr; - } - - /* Copy the results into the d3d7 and d3d3 structures */ - Desc7->dwDevCaps = WCaps.DevCaps; - Desc7->dpcLineCaps.dwMiscCaps = WCaps.PrimitiveMiscCaps; - Desc7->dpcLineCaps.dwRasterCaps = WCaps.RasterCaps; - Desc7->dpcLineCaps.dwZCmpCaps = WCaps.ZCmpCaps; - Desc7->dpcLineCaps.dwSrcBlendCaps = WCaps.SrcBlendCaps; - Desc7->dpcLineCaps.dwDestBlendCaps = WCaps.DestBlendCaps; - Desc7->dpcLineCaps.dwAlphaCmpCaps = WCaps.AlphaCmpCaps; - Desc7->dpcLineCaps.dwShadeCaps = WCaps.ShadeCaps; - Desc7->dpcLineCaps.dwTextureCaps = WCaps.TextureCaps; - Desc7->dpcLineCaps.dwTextureFilterCaps = WCaps.TextureFilterCaps; - Desc7->dpcLineCaps.dwTextureAddressCaps = WCaps.TextureAddressCaps; - - Desc7->dwMaxTextureWidth = WCaps.MaxTextureWidth; - Desc7->dwMaxTextureHeight = WCaps.MaxTextureHeight; - - Desc7->dwMaxTextureRepeat = WCaps.MaxTextureRepeat; - Desc7->dwMaxTextureAspectRatio = WCaps.MaxTextureAspectRatio; - Desc7->dwMaxAnisotropy = WCaps.MaxAnisotropy; - Desc7->dvMaxVertexW = WCaps.MaxVertexW; - - Desc7->dvGuardBandLeft = WCaps.GuardBandLeft; - Desc7->dvGuardBandTop = WCaps.GuardBandTop; - Desc7->dvGuardBandRight = WCaps.GuardBandRight; - Desc7->dvGuardBandBottom = WCaps.GuardBandBottom; - - Desc7->dvExtentsAdjust = WCaps.ExtentsAdjust; - Desc7->dwStencilCaps = WCaps.StencilCaps; - - Desc7->dwFVFCaps = WCaps.FVFCaps; - Desc7->dwTextureOpCaps = WCaps.TextureOpCaps; - - Desc7->dwVertexProcessingCaps = WCaps.VertexProcessingCaps; - Desc7->dwMaxActiveLights = WCaps.MaxActiveLights; - - /* Remove all non-d3d7 caps */ - Desc7->dwDevCaps &= ( - D3DDEVCAPS_FLOATTLVERTEX | D3DDEVCAPS_SORTINCREASINGZ | D3DDEVCAPS_SORTDECREASINGZ | - D3DDEVCAPS_SORTEXACT | D3DDEVCAPS_EXECUTESYSTEMMEMORY | D3DDEVCAPS_EXECUTEVIDEOMEMORY | - D3DDEVCAPS_TLVERTEXSYSTEMMEMORY | D3DDEVCAPS_TLVERTEXVIDEOMEMORY | D3DDEVCAPS_TEXTURESYSTEMMEMORY | - D3DDEVCAPS_TEXTUREVIDEOMEMORY | D3DDEVCAPS_DRAWPRIMTLVERTEX | D3DDEVCAPS_CANRENDERAFTERFLIP | - D3DDEVCAPS_TEXTURENONLOCALVIDMEM | D3DDEVCAPS_DRAWPRIMITIVES2 | D3DDEVCAPS_SEPARATETEXTUREMEMORIES | - D3DDEVCAPS_DRAWPRIMITIVES2EX | D3DDEVCAPS_HWTRANSFORMANDLIGHT | D3DDEVCAPS_CANBLTSYSTONONLOCAL | - D3DDEVCAPS_HWRASTERIZATION); - - Desc7->dwStencilCaps &= ( - D3DSTENCILCAPS_KEEP | D3DSTENCILCAPS_ZERO | D3DSTENCILCAPS_REPLACE | - D3DSTENCILCAPS_INCRSAT | D3DSTENCILCAPS_DECRSAT | D3DSTENCILCAPS_INVERT | - D3DSTENCILCAPS_INCR | D3DSTENCILCAPS_DECR); - - /* FVF caps ?*/ - - Desc7->dwTextureOpCaps &= ( - D3DTEXOPCAPS_DISABLE | D3DTEXOPCAPS_SELECTARG1 | D3DTEXOPCAPS_SELECTARG2 | - D3DTEXOPCAPS_MODULATE | D3DTEXOPCAPS_MODULATE2X | D3DTEXOPCAPS_MODULATE4X | - D3DTEXOPCAPS_ADD | D3DTEXOPCAPS_ADDSIGNED | D3DTEXOPCAPS_ADDSIGNED2X | - D3DTEXOPCAPS_SUBTRACT | D3DTEXOPCAPS_ADDSMOOTH | D3DTEXOPCAPS_BLENDTEXTUREALPHA | - D3DTEXOPCAPS_BLENDFACTORALPHA | D3DTEXOPCAPS_BLENDTEXTUREALPHAPM | D3DTEXOPCAPS_BLENDCURRENTALPHA | - D3DTEXOPCAPS_PREMODULATE | D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR | D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA | - D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR | D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA | D3DTEXOPCAPS_BUMPENVMAP | - D3DTEXOPCAPS_BUMPENVMAPLUMINANCE | D3DTEXOPCAPS_DOTPRODUCT3); - - Desc7->dwVertexProcessingCaps &= ( - D3DVTXPCAPS_TEXGEN | D3DVTXPCAPS_MATERIALSOURCE7 | D3DVTXPCAPS_VERTEXFOG | - D3DVTXPCAPS_DIRECTIONALLIGHTS | D3DVTXPCAPS_POSITIONALLIGHTS | D3DVTXPCAPS_LOCALVIEWER); - - Desc7->dpcLineCaps.dwMiscCaps &= ( - D3DPMISCCAPS_MASKPLANES | D3DPMISCCAPS_MASKZ | D3DPMISCCAPS_LINEPATTERNREP | - D3DPMISCCAPS_CONFORMANT | D3DPMISCCAPS_CULLNONE | D3DPMISCCAPS_CULLCW | - D3DPMISCCAPS_CULLCCW); - - Desc7->dpcLineCaps.dwRasterCaps &= ( - D3DPRASTERCAPS_DITHER | D3DPRASTERCAPS_ROP2 | D3DPRASTERCAPS_XOR | - D3DPRASTERCAPS_PAT | D3DPRASTERCAPS_ZTEST | D3DPRASTERCAPS_SUBPIXEL | - D3DPRASTERCAPS_SUBPIXELX | D3DPRASTERCAPS_FOGVERTEX | D3DPRASTERCAPS_FOGTABLE | - D3DPRASTERCAPS_STIPPLE | D3DPRASTERCAPS_ANTIALIASSORTDEPENDENT | D3DPRASTERCAPS_ANTIALIASSORTINDEPENDENT | - D3DPRASTERCAPS_ANTIALIASEDGES | D3DPRASTERCAPS_MIPMAPLODBIAS | D3DPRASTERCAPS_ZBIAS | - D3DPRASTERCAPS_ZBUFFERLESSHSR | D3DPRASTERCAPS_FOGRANGE | D3DPRASTERCAPS_ANISOTROPY | - D3DPRASTERCAPS_WBUFFER | D3DPRASTERCAPS_TRANSLUCENTSORTINDEPENDENT | D3DPRASTERCAPS_WFOG | - D3DPRASTERCAPS_ZFOG); - - Desc7->dpcLineCaps.dwZCmpCaps &= ( - D3DPCMPCAPS_NEVER | D3DPCMPCAPS_LESS | D3DPCMPCAPS_EQUAL | - D3DPCMPCAPS_LESSEQUAL | D3DPCMPCAPS_GREATER | D3DPCMPCAPS_NOTEQUAL | - D3DPCMPCAPS_GREATEREQUAL | D3DPCMPCAPS_ALWAYS); - - Desc7->dpcLineCaps.dwSrcBlendCaps &= ( - D3DPBLENDCAPS_ZERO | D3DPBLENDCAPS_ONE | D3DPBLENDCAPS_SRCCOLOR | - D3DPBLENDCAPS_INVSRCCOLOR | D3DPBLENDCAPS_SRCALPHA | D3DPBLENDCAPS_INVSRCALPHA | - D3DPBLENDCAPS_DESTALPHA | D3DPBLENDCAPS_INVDESTALPHA | D3DPBLENDCAPS_DESTCOLOR | - D3DPBLENDCAPS_INVDESTCOLOR | D3DPBLENDCAPS_SRCALPHASAT | D3DPBLENDCAPS_BOTHSRCALPHA | - D3DPBLENDCAPS_BOTHINVSRCALPHA); - - Desc7->dpcLineCaps.dwDestBlendCaps &= ( - D3DPBLENDCAPS_ZERO | D3DPBLENDCAPS_ONE | D3DPBLENDCAPS_SRCCOLOR | - D3DPBLENDCAPS_INVSRCCOLOR | D3DPBLENDCAPS_SRCALPHA | D3DPBLENDCAPS_INVSRCALPHA | - D3DPBLENDCAPS_DESTALPHA | D3DPBLENDCAPS_INVDESTALPHA | D3DPBLENDCAPS_DESTCOLOR | - D3DPBLENDCAPS_INVDESTCOLOR | D3DPBLENDCAPS_SRCALPHASAT | D3DPBLENDCAPS_BOTHSRCALPHA | - D3DPBLENDCAPS_BOTHINVSRCALPHA); - - Desc7->dpcLineCaps.dwAlphaCmpCaps &= ( - D3DPCMPCAPS_NEVER | D3DPCMPCAPS_LESS | D3DPCMPCAPS_EQUAL | - D3DPCMPCAPS_LESSEQUAL | D3DPCMPCAPS_GREATER | D3DPCMPCAPS_NOTEQUAL | - D3DPCMPCAPS_GREATEREQUAL | D3DPCMPCAPS_ALWAYS); - - Desc7->dpcLineCaps.dwShadeCaps &= ( - D3DPSHADECAPS_COLORFLATMONO | D3DPSHADECAPS_COLORFLATRGB | D3DPSHADECAPS_COLORGOURAUDMONO | - D3DPSHADECAPS_COLORGOURAUDRGB | D3DPSHADECAPS_COLORPHONGMONO | D3DPSHADECAPS_COLORPHONGRGB | - D3DPSHADECAPS_SPECULARFLATMONO | D3DPSHADECAPS_SPECULARFLATRGB | D3DPSHADECAPS_SPECULARGOURAUDMONO | - D3DPSHADECAPS_SPECULARGOURAUDRGB | D3DPSHADECAPS_SPECULARPHONGMONO | D3DPSHADECAPS_SPECULARPHONGRGB | - D3DPSHADECAPS_ALPHAFLATBLEND | D3DPSHADECAPS_ALPHAFLATSTIPPLED | D3DPSHADECAPS_ALPHAGOURAUDBLEND | - D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED | D3DPSHADECAPS_ALPHAPHONGBLEND | D3DPSHADECAPS_ALPHAPHONGSTIPPLED | - D3DPSHADECAPS_FOGFLAT | D3DPSHADECAPS_FOGGOURAUD | D3DPSHADECAPS_FOGPHONG); - - Desc7->dpcLineCaps.dwTextureCaps &= ( - D3DPTEXTURECAPS_PERSPECTIVE | D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_ALPHA | - D3DPTEXTURECAPS_TRANSPARENCY | D3DPTEXTURECAPS_BORDER | D3DPTEXTURECAPS_SQUAREONLY | - D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE | D3DPTEXTURECAPS_ALPHAPALETTE| D3DPTEXTURECAPS_NONPOW2CONDITIONAL | - D3DPTEXTURECAPS_PROJECTED | D3DPTEXTURECAPS_CUBEMAP | D3DPTEXTURECAPS_COLORKEYBLEND); - - Desc7->dpcLineCaps.dwTextureFilterCaps &= ( - D3DPTFILTERCAPS_NEAREST | D3DPTFILTERCAPS_LINEAR | D3DPTFILTERCAPS_MIPNEAREST | - D3DPTFILTERCAPS_MIPLINEAR | D3DPTFILTERCAPS_LINEARMIPNEAREST | D3DPTFILTERCAPS_LINEARMIPLINEAR | - D3DPTFILTERCAPS_MINFPOINT | D3DPTFILTERCAPS_MINFLINEAR | D3DPTFILTERCAPS_MINFANISOTROPIC | - D3DPTFILTERCAPS_MIPFPOINT | D3DPTFILTERCAPS_MIPFLINEAR | D3DPTFILTERCAPS_MAGFPOINT | - D3DPTFILTERCAPS_MAGFLINEAR | D3DPTFILTERCAPS_MAGFANISOTROPIC | D3DPTFILTERCAPS_MAGFAFLATCUBIC | - D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC); - - Desc7->dpcLineCaps.dwTextureBlendCaps &= ( - D3DPTBLENDCAPS_DECAL | D3DPTBLENDCAPS_MODULATE | D3DPTBLENDCAPS_DECALALPHA | - D3DPTBLENDCAPS_MODULATEALPHA | D3DPTBLENDCAPS_DECALMASK | D3DPTBLENDCAPS_MODULATEMASK | - D3DPTBLENDCAPS_COPY | D3DPTBLENDCAPS_ADD); - - Desc7->dpcLineCaps.dwTextureAddressCaps &= ( - D3DPTADDRESSCAPS_WRAP | D3DPTADDRESSCAPS_MIRROR | D3DPTADDRESSCAPS_CLAMP | - D3DPTADDRESSCAPS_BORDER | D3DPTADDRESSCAPS_INDEPENDENTUV); - - if(!(Desc7->dpcLineCaps.dwTextureCaps & D3DPTEXTURECAPS_POW2)) { - /* DirectX7 always has the np2 flag set, no matter what the card supports. Some old games(rollcage) - * check the caps incorrectly. If wined3d supports nonpow2 textures it also has np2 conditional support - */ - Desc7->dpcLineCaps.dwTextureCaps |= D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_NONPOW2CONDITIONAL; - } - /* Fill the missing members, and do some fixup */ - Desc7->dpcLineCaps.dwSize = sizeof(Desc7->dpcLineCaps); - Desc7->dpcLineCaps.dwTextureBlendCaps = D3DPTBLENDCAPS_ADD | D3DPTBLENDCAPS_MODULATEMASK | - D3DPTBLENDCAPS_COPY | D3DPTBLENDCAPS_DECAL | - D3DPTBLENDCAPS_DECALALPHA | D3DPTBLENDCAPS_DECALMASK | - D3DPTBLENDCAPS_MODULATE | D3DPTBLENDCAPS_MODULATEALPHA; - Desc7->dpcLineCaps.dwStippleWidth = 32; - Desc7->dpcLineCaps.dwStippleHeight = 32; - /* Use the same for the TriCaps */ - Desc7->dpcTriCaps = Desc7->dpcLineCaps; - - Desc7->dwDeviceRenderBitDepth = DDBD_16 | DDBD_24 | DDBD_32; - Desc7->dwDeviceZBufferBitDepth = DDBD_16 | DDBD_24; - Desc7->dwMinTextureWidth = 1; - Desc7->dwMinTextureHeight = 1; - - /* Convert DWORDs safely to WORDs */ - if(WCaps.MaxTextureBlendStages > 65535) Desc7->wMaxTextureBlendStages = 65535; - else Desc7->wMaxTextureBlendStages = (WORD) WCaps.MaxTextureBlendStages; - if(WCaps.MaxSimultaneousTextures > 65535) Desc7->wMaxSimultaneousTextures = 65535; - else Desc7->wMaxSimultaneousTextures = (WORD) WCaps.MaxSimultaneousTextures; - - if(WCaps.MaxUserClipPlanes > 65535) Desc7->wMaxUserClipPlanes = 65535; - else Desc7->wMaxUserClipPlanes = (WORD) WCaps.MaxUserClipPlanes; - if(WCaps.MaxVertexBlendMatrices > 65535) Desc7->wMaxVertexBlendMatrices = 65535; - else Desc7->wMaxVertexBlendMatrices = (WORD) WCaps.MaxVertexBlendMatrices; - - Desc7->deviceGUID = IID_IDirect3DTnLHalDevice; - - Desc7->dwReserved1 = 0; - Desc7->dwReserved2 = 0; - Desc7->dwReserved3 = 0; - Desc7->dwReserved4 = 0; - - /* Fill the old structure */ - memset(Desc123, 0x0, sizeof(D3DDEVICEDESC)); - Desc123->dwSize = sizeof(D3DDEVICEDESC); - Desc123->dwFlags = D3DDD_COLORMODEL | - D3DDD_DEVCAPS | - D3DDD_TRANSFORMCAPS | - D3DDD_BCLIPPING | - D3DDD_LIGHTINGCAPS | - D3DDD_LINECAPS | - D3DDD_TRICAPS | - D3DDD_DEVICERENDERBITDEPTH | - D3DDD_DEVICEZBUFFERBITDEPTH | - D3DDD_MAXBUFFERSIZE | - D3DDD_MAXVERTEXCOUNT; - Desc123->dcmColorModel = D3DCOLOR_RGB; - Desc123->dwDevCaps = Desc7->dwDevCaps; - Desc123->dtcTransformCaps.dwSize = sizeof(D3DTRANSFORMCAPS); - Desc123->dtcTransformCaps.dwCaps = D3DTRANSFORMCAPS_CLIP; - Desc123->bClipping = TRUE; - Desc123->dlcLightingCaps.dwSize = sizeof(D3DLIGHTINGCAPS); - Desc123->dlcLightingCaps.dwCaps = D3DLIGHTCAPS_DIRECTIONAL | D3DLIGHTCAPS_PARALLELPOINT | D3DLIGHTCAPS_POINT | D3DLIGHTCAPS_SPOT; - Desc123->dlcLightingCaps.dwLightingModel = D3DLIGHTINGMODEL_RGB; - Desc123->dlcLightingCaps.dwNumLights = Desc7->dwMaxActiveLights; - - Desc123->dpcLineCaps.dwSize = sizeof(D3DPRIMCAPS); - Desc123->dpcLineCaps.dwMiscCaps = Desc7->dpcLineCaps.dwMiscCaps; - Desc123->dpcLineCaps.dwRasterCaps = Desc7->dpcLineCaps.dwRasterCaps; - Desc123->dpcLineCaps.dwZCmpCaps = Desc7->dpcLineCaps.dwZCmpCaps; - Desc123->dpcLineCaps.dwSrcBlendCaps = Desc7->dpcLineCaps.dwSrcBlendCaps; - Desc123->dpcLineCaps.dwDestBlendCaps = Desc7->dpcLineCaps.dwDestBlendCaps; - Desc123->dpcLineCaps.dwShadeCaps = Desc7->dpcLineCaps.dwShadeCaps; - Desc123->dpcLineCaps.dwTextureCaps = Desc7->dpcLineCaps.dwTextureCaps; - Desc123->dpcLineCaps.dwTextureFilterCaps = Desc7->dpcLineCaps.dwTextureFilterCaps; - Desc123->dpcLineCaps.dwTextureBlendCaps = Desc7->dpcLineCaps.dwTextureBlendCaps; - Desc123->dpcLineCaps.dwTextureAddressCaps = Desc7->dpcLineCaps.dwTextureAddressCaps; - Desc123->dpcLineCaps.dwStippleWidth = Desc7->dpcLineCaps.dwStippleWidth; - Desc123->dpcLineCaps.dwAlphaCmpCaps = Desc7->dpcLineCaps.dwAlphaCmpCaps; - - Desc123->dpcTriCaps.dwSize = sizeof(D3DPRIMCAPS); - Desc123->dpcTriCaps.dwMiscCaps = Desc7->dpcTriCaps.dwMiscCaps; - Desc123->dpcTriCaps.dwRasterCaps = Desc7->dpcTriCaps.dwRasterCaps; - Desc123->dpcTriCaps.dwZCmpCaps = Desc7->dpcTriCaps.dwZCmpCaps; - Desc123->dpcTriCaps.dwSrcBlendCaps = Desc7->dpcTriCaps.dwSrcBlendCaps; - Desc123->dpcTriCaps.dwDestBlendCaps = Desc7->dpcTriCaps.dwDestBlendCaps; - Desc123->dpcTriCaps.dwShadeCaps = Desc7->dpcTriCaps.dwShadeCaps; - Desc123->dpcTriCaps.dwTextureCaps = Desc7->dpcTriCaps.dwTextureCaps; - Desc123->dpcTriCaps.dwTextureFilterCaps = Desc7->dpcTriCaps.dwTextureFilterCaps; - Desc123->dpcTriCaps.dwTextureBlendCaps = Desc7->dpcTriCaps.dwTextureBlendCaps; - Desc123->dpcTriCaps.dwTextureAddressCaps = Desc7->dpcTriCaps.dwTextureAddressCaps; - Desc123->dpcTriCaps.dwStippleWidth = Desc7->dpcTriCaps.dwStippleWidth; - Desc123->dpcTriCaps.dwAlphaCmpCaps = Desc7->dpcTriCaps.dwAlphaCmpCaps; - - Desc123->dwDeviceRenderBitDepth = Desc7->dwDeviceRenderBitDepth; - Desc123->dwDeviceZBufferBitDepth = Desc7->dwDeviceZBufferBitDepth; - Desc123->dwMaxBufferSize = 0; - Desc123->dwMaxVertexCount = 65536; - Desc123->dwMinTextureWidth = Desc7->dwMinTextureWidth; - Desc123->dwMinTextureHeight = Desc7->dwMinTextureHeight; - Desc123->dwMaxTextureWidth = Desc7->dwMaxTextureWidth; - Desc123->dwMaxTextureHeight = Desc7->dwMaxTextureHeight; - Desc123->dwMinStippleWidth = 1; - Desc123->dwMinStippleHeight = 1; - Desc123->dwMaxStippleWidth = 32; - Desc123->dwMaxStippleHeight = 32; - Desc123->dwMaxTextureRepeat = Desc7->dwMaxTextureRepeat; - Desc123->dwMaxTextureAspectRatio = Desc7->dwMaxTextureAspectRatio; - Desc123->dwMaxAnisotropy = Desc7->dwMaxAnisotropy; - Desc123->dvGuardBandLeft = Desc7->dvGuardBandLeft; - Desc123->dvGuardBandRight = Desc7->dvGuardBandRight; - Desc123->dvGuardBandTop = Desc7->dvGuardBandTop; - Desc123->dvGuardBandBottom = Desc7->dvGuardBandBottom; - Desc123->dvExtentsAdjust = Desc7->dvExtentsAdjust; - Desc123->dwStencilCaps = Desc7->dwStencilCaps; - Desc123->dwFVFCaps = Desc7->dwFVFCaps; - Desc123->dwTextureOpCaps = Desc7->dwTextureOpCaps; - Desc123->wMaxTextureBlendStages = Desc7->wMaxTextureBlendStages; - Desc123->wMaxSimultaneousTextures = Desc7->wMaxSimultaneousTextures; - - return DD_OK; -} -/***************************************************************************** - * IDirect3D vtables in various versions - *****************************************************************************/ - -const IDirect3DVtbl IDirect3D1_Vtbl = -{ - /*** IUnknown methods ***/ - Thunk_IDirect3DImpl_1_QueryInterface, - Thunk_IDirect3DImpl_1_AddRef, - Thunk_IDirect3DImpl_1_Release, - /*** IDirect3D methods ***/ - IDirect3DImpl_1_Initialize, - Thunk_IDirect3DImpl_1_EnumDevices, - Thunk_IDirect3DImpl_1_CreateLight, - Thunk_IDirect3DImpl_1_CreateMaterial, - Thunk_IDirect3DImpl_1_CreateViewport, - Thunk_IDirect3DImpl_1_FindDevice -}; - -const IDirect3D2Vtbl IDirect3D2_Vtbl = -{ - /*** IUnknown methods ***/ - Thunk_IDirect3DImpl_2_QueryInterface, - Thunk_IDirect3DImpl_2_AddRef, - Thunk_IDirect3DImpl_2_Release, - /*** IDirect3D2 methods ***/ - Thunk_IDirect3DImpl_2_EnumDevices, - Thunk_IDirect3DImpl_2_CreateLight, - Thunk_IDirect3DImpl_2_CreateMaterial, - Thunk_IDirect3DImpl_2_CreateViewport, - Thunk_IDirect3DImpl_2_FindDevice, - Thunk_IDirect3DImpl_2_CreateDevice -}; - -const IDirect3D3Vtbl IDirect3D3_Vtbl = -{ - /*** IUnknown methods ***/ - Thunk_IDirect3DImpl_3_QueryInterface, - Thunk_IDirect3DImpl_3_AddRef, - Thunk_IDirect3DImpl_3_Release, - /*** IDirect3D3 methods ***/ - IDirect3DImpl_3_EnumDevices, - IDirect3DImpl_3_CreateLight, - IDirect3DImpl_3_CreateMaterial, - IDirect3DImpl_3_CreateViewport, - IDirect3DImpl_3_FindDevice, - Thunk_IDirect3DImpl_3_CreateDevice, - Thunk_IDirect3DImpl_3_CreateVertexBuffer, - Thunk_IDirect3DImpl_3_EnumZBufferFormats, - Thunk_IDirect3DImpl_3_EvictManagedTextures -}; - -const IDirect3D7Vtbl IDirect3D7_Vtbl = -{ - /*** IUnknown methods ***/ - Thunk_IDirect3DImpl_7_QueryInterface, - Thunk_IDirect3DImpl_7_AddRef, - Thunk_IDirect3DImpl_7_Release, - /*** IDirect3D7 methods ***/ - IDirect3DImpl_7_EnumDevices, - IDirect3DImpl_7_CreateDevice, - IDirect3DImpl_7_CreateVertexBuffer, - IDirect3DImpl_7_EnumZBufferFormats, - IDirect3DImpl_7_EvictManagedTextures -}; diff --git a/dll/directx/wine/ddraw/executebuffer.c b/dll/directx/wine/ddraw/executebuffer.c index 29fd65e25a9..d4d2dd0b72f 100644 --- a/dll/directx/wine/ddraw/executebuffer.c +++ b/dll/directx/wine/ddraw/executebuffer.c @@ -23,27 +23,9 @@ #include "config.h" #include "wine/port.h" -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - #include "ddraw_private.h" -#include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); +WINE_DEFAULT_DEBUG_CHANNEL(ddraw); /***************************************************************************** * _dump_executedata @@ -103,10 +85,10 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, /* Activate the viewport */ lpViewport->active_device = lpDevice; - lpViewport->activate(lpViewport, FALSE); + viewport_activate(lpViewport, FALSE); TRACE("ExecuteData :\n"); - if (TRACE_ON(d3d7)) + if (TRACE_ON(ddraw)) _dump_executedata(&(This->data)); while (1) { @@ -142,27 +124,28 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, for (i = 0; i < count; i++) { LPD3DTRIANGLE ci = (LPD3DTRIANGLE) instr; - TRACE_(d3d7)(" v1: %d v2: %d v3: %d\n",ci->u1.v1, ci->u2.v2, ci->u3.v3); - TRACE_(d3d7)(" Flags : "); - if (TRACE_ON(d3d7)) { - /* Wireframe */ - if (ci->wFlags & D3DTRIFLAG_EDGEENABLE1) - TRACE_(d3d7)("EDGEENABLE1 "); - if (ci->wFlags & D3DTRIFLAG_EDGEENABLE2) - TRACE_(d3d7)("EDGEENABLE2 "); - if (ci->wFlags & D3DTRIFLAG_EDGEENABLE1) - TRACE_(d3d7)("EDGEENABLE3 "); - /* Strips / Fans */ - if (ci->wFlags == D3DTRIFLAG_EVEN) - TRACE_(d3d7)("EVEN "); - if (ci->wFlags == D3DTRIFLAG_ODD) - TRACE_(d3d7)("ODD "); - if (ci->wFlags == D3DTRIFLAG_START) - TRACE_(d3d7)("START "); - if ((ci->wFlags > 0) && (ci->wFlags < 30)) - TRACE_(d3d7)("STARTFLAT(%d) ", ci->wFlags); - TRACE_(d3d7)("\n"); - } + TRACE(" v1: %d v2: %d v3: %d\n",ci->u1.v1, ci->u2.v2, ci->u3.v3); + TRACE(" Flags : "); + if (TRACE_ON(ddraw)) + { + /* Wireframe */ + if (ci->wFlags & D3DTRIFLAG_EDGEENABLE1) + TRACE("EDGEENABLE1 "); + if (ci->wFlags & D3DTRIFLAG_EDGEENABLE2) + TRACE("EDGEENABLE2 "); + if (ci->wFlags & D3DTRIFLAG_EDGEENABLE1) + TRACE("EDGEENABLE3 "); + /* Strips / Fans */ + if (ci->wFlags == D3DTRIFLAG_EVEN) + TRACE("EVEN "); + if (ci->wFlags == D3DTRIFLAG_ODD) + TRACE("ODD "); + if (ci->wFlags == D3DTRIFLAG_START) + TRACE("START "); + if ((ci->wFlags > 0) && (ci->wFlags < 30)) + TRACE("STARTFLAT(%u) ", ci->wFlags); + TRACE("\n"); + } This->indices[(i * 3) ] = ci->u1.v1; This->indices[(i * 3) + 1] = ci->u2.v2; This->indices[(i * 3) + 2] = ci->u3.v3; @@ -188,25 +171,24 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, int i; TRACE("MATRIXMULTIPLY (%d)\n", count); - for (i = 0; i < count; i++) { - LPD3DMATRIXMULTIPLY ci = (LPD3DMATRIXMULTIPLY) instr; - LPD3DMATRIX a, b, c; + for (i = 0; i < count; ++i) + { + D3DMATRIXMULTIPLY *ci = (D3DMATRIXMULTIPLY *)instr; + D3DMATRIX *a, *b, *c; - if(!ci->hDestMatrix || ci->hDestMatrix > lpDevice->numHandles || - !ci->hSrcMatrix1 || ci->hSrcMatrix1 > lpDevice->numHandles || - !ci->hSrcMatrix2 || ci->hSrcMatrix2 > lpDevice->numHandles) { - ERR("Handles out of bounds\n"); - } else if (lpDevice->Handles[ci->hDestMatrix - 1].type != DDrawHandle_Matrix || - lpDevice->Handles[ci->hSrcMatrix1 - 1].type != DDrawHandle_Matrix || - lpDevice->Handles[ci->hSrcMatrix2 - 1].type != DDrawHandle_Matrix) { - ERR("Handle types invalid\n"); - } else { - a = (LPD3DMATRIX) lpDevice->Handles[ci->hDestMatrix - 1].ptr; - b = (LPD3DMATRIX) lpDevice->Handles[ci->hSrcMatrix1 - 1].ptr; - c = (LPD3DMATRIX) lpDevice->Handles[ci->hSrcMatrix2 - 1].ptr; - TRACE(" Dest : %p Src1 : %p Src2 : %p\n", - a, b, c); - multiply_matrix(a,c,b); + a = ddraw_get_object(&lpDevice->handle_table, ci->hDestMatrix - 1, DDRAW_HANDLE_MATRIX); + b = ddraw_get_object(&lpDevice->handle_table, ci->hSrcMatrix1 - 1, DDRAW_HANDLE_MATRIX); + c = ddraw_get_object(&lpDevice->handle_table, ci->hSrcMatrix2 - 1, DDRAW_HANDLE_MATRIX); + + if (!a || !b || !c) + { + ERR("Invalid matrix handle (a %#x -> %p, b %#x -> %p, c %#x -> %p).\n", + ci->hDestMatrix, a, ci->hSrcMatrix1, b, ci->hSrcMatrix2, c); + } + else + { + TRACE("dst %p, src1 %p, src2 %p.\n", a, b, c); + multiply_matrix(a, c, b); } instr += size; @@ -217,27 +199,30 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, int i; TRACE("STATETRANSFORM (%d)\n", count); - for (i = 0; i < count; i++) { - LPD3DSTATE ci = (LPD3DSTATE) instr; + for (i = 0; i < count; ++i) + { + D3DSTATE *ci = (D3DSTATE *)instr; + D3DMATRIX *m; - if(!ci->u2.dwArg[0]) { - ERR("Setting a NULL matrix handle, what should I do?\n"); - } else if(ci->u2.dwArg[0] > lpDevice->numHandles) { - ERR("Handle %d is out of bounds\n", ci->u2.dwArg[0]); - } else if(lpDevice->Handles[ci->u2.dwArg[0] - 1].type != DDrawHandle_Matrix) { - ERR("Handle %d is not a matrix handle\n", ci->u2.dwArg[0]); - } else { - if(ci->u1.dtstTransformStateType == D3DTRANSFORMSTATE_WORLD) + m = ddraw_get_object(&lpDevice->handle_table, ci->u2.dwArg[0] - 1, DDRAW_HANDLE_MATRIX); + if (!m) + { + ERR("Invalid matrix handle %#x.\n", ci->u2.dwArg[0]); + } + else + { + if (ci->u1.dtstTransformStateType == D3DTRANSFORMSTATE_WORLD) lpDevice->world = ci->u2.dwArg[0]; - if(ci->u1.dtstTransformStateType == D3DTRANSFORMSTATE_VIEW) + if (ci->u1.dtstTransformStateType == D3DTRANSFORMSTATE_VIEW) lpDevice->view = ci->u2.dwArg[0]; - if(ci->u1.dtstTransformStateType == D3DTRANSFORMSTATE_PROJECTION) + if (ci->u1.dtstTransformStateType == D3DTRANSFORMSTATE_PROJECTION) lpDevice->proj = ci->u2.dwArg[0]; IDirect3DDevice7_SetTransform((IDirect3DDevice7 *)lpDevice, - ci->u1.dtstTransformStateType, (LPD3DMATRIX)lpDevice->Handles[ci->u2.dwArg[0] - 1].ptr); + ci->u1.dtstTransformStateType, m); } - instr += size; - } + + instr += size; + } } break; case D3DOP_STATELIGHT: { @@ -251,22 +236,18 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, if (!ci->u1.dlstLightStateType || (ci->u1.dlstLightStateType > D3DLIGHTSTATE_COLORVERTEX)) ERR("Unexpected Light State Type %d\n", ci->u1.dlstLightStateType); - else if (ci->u1.dlstLightStateType == D3DLIGHTSTATE_MATERIAL /* 1 */) { - DWORD matHandle = ci->u2.dwArg[0]; + else if (ci->u1.dlstLightStateType == D3DLIGHTSTATE_MATERIAL /* 1 */) + { + IDirect3DMaterialImpl *m; - if (!matHandle) { - FIXME(" D3DLIGHTSTATE_MATERIAL called with NULL material !!!\n"); - } else if (matHandle >= lpDevice->numHandles) { - WARN("Material handle %d is invalid\n", matHandle); - } else if (lpDevice->Handles[matHandle - 1].type != DDrawHandle_Material) { - WARN("Handle %d is not a material handle\n", matHandle); - } else { - IDirect3DMaterialImpl *mat = - lpDevice->Handles[matHandle - 1].ptr; - - mat->activate(mat); - } - } else if (ci->u1.dlstLightStateType == D3DLIGHTSTATE_COLORMODEL /* 3 */) { + m = ddraw_get_object(&lpDevice->handle_table, ci->u2.dwArg[0] - 1, DDRAW_HANDLE_MATERIAL); + if (!m) + ERR("Invalid material handle %#x.\n", ci->u2.dwArg[0]); + else + material_activate(m); + } + else if (ci->u1.dlstLightStateType == D3DLIGHTSTATE_COLORMODEL /* 3 */) + { switch (ci->u2.dwArg[0]) { case D3DCOLOR_MONO: ERR("DDCOLOR_MONO should not happen!\n"); @@ -354,7 +335,8 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, TRACE(" Start : %d Dest : %d Count : %d\n", ci->wStart, ci->wDest, ci->dwCount); TRACE(" Flags : "); - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { if (ci->dwFlags & D3DPROCESSVERTICES_COPY) TRACE("COPY "); if (ci->dwFlags & D3DPROCESSVERTICES_NOCOLOR) @@ -404,7 +386,8 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, D3DMATRIX mat; D3DVIEWPORT* Viewport = &lpViewport->viewports.vp1; - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { TRACE(" Projection Matrix : (%p)\n", &proj_mat); dump_D3DMATRIX(&proj_mat); TRACE(" View Matrix : (%p)\n", &view_mat); @@ -448,7 +431,8 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, D3DMATRIX mat; D3DVIEWPORT* Viewport = &lpViewport->viewports.vp1; - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { TRACE(" Projection Matrix : (%p)\n", &proj_mat); dump_D3DMATRIX(&proj_mat); TRACE(" View Matrix : (%p)\n",&view_mat); @@ -591,7 +575,7 @@ IDirect3DExecuteBufferImpl_QueryInterface(IDirect3DExecuteBuffer *iface, REFIID riid, void **obj) { - TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); *obj = NULL; @@ -627,7 +611,7 @@ IDirect3DExecuteBufferImpl_AddRef(IDirect3DExecuteBuffer *iface) IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - FIXME("(%p)->()incrementing from %u.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -647,7 +631,7 @@ IDirect3DExecuteBufferImpl_Release(IDirect3DExecuteBuffer *iface) IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->()decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (!ref) { if (This->need_free) @@ -671,13 +655,11 @@ IDirect3DExecuteBufferImpl_Release(IDirect3DExecuteBuffer *iface) * D3D_OK * *****************************************************************************/ -static HRESULT WINAPI -IDirect3DExecuteBufferImpl_Initialize(IDirect3DExecuteBuffer *iface, - IDirect3DDevice *lpDirect3DDevice, - D3DEXECUTEBUFFERDESC *lpDesc) +static HRESULT WINAPI IDirect3DExecuteBufferImpl_Initialize(IDirect3DExecuteBuffer *iface, + IDirect3DDevice *device, D3DEXECUTEBUFFERDESC *desc) { - IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; - TRACE("(%p)->(%p,%p) no-op....\n", This, lpDirect3DDevice, lpDesc); + TRACE("iface %p, device %p, desc %p.\n", iface, device, desc); + return D3D_OK; } @@ -700,12 +682,14 @@ IDirect3DExecuteBufferImpl_Lock(IDirect3DExecuteBuffer *iface, { IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; DWORD dwSize; - TRACE("(%p)->(%p)\n", This, lpDesc); + + TRACE("iface %p, desc %p.\n", iface, lpDesc); dwSize = lpDesc->dwSize; memcpy(lpDesc, &This->desc, dwSize); - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { TRACE(" Returning description :\n"); _dump_D3DEXECUTEBUFFERDESC(lpDesc); } @@ -721,11 +705,10 @@ IDirect3DExecuteBufferImpl_Lock(IDirect3DExecuteBuffer *iface, * This implementation always returns D3D_OK * *****************************************************************************/ -static HRESULT WINAPI -IDirect3DExecuteBufferImpl_Unlock(IDirect3DExecuteBuffer *iface) +static HRESULT WINAPI IDirect3DExecuteBufferImpl_Unlock(IDirect3DExecuteBuffer *iface) { - IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; - TRACE("(%p)->() no-op...\n", This); + TRACE("iface %p.\n", iface); + return D3D_OK; } @@ -749,7 +732,8 @@ IDirect3DExecuteBufferImpl_SetExecuteData(IDirect3DExecuteBuffer *iface, { IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; DWORD nbvert; - TRACE("(%p)->(%p)\n", This, lpData); + + TRACE("iface %p, data %p.\n", iface, lpData); memcpy(&This->data, lpData, lpData->dwSize); @@ -760,9 +744,8 @@ IDirect3DExecuteBufferImpl_SetExecuteData(IDirect3DExecuteBuffer *iface, HeapFree(GetProcessHeap(), 0, This->vertex_data); This->vertex_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nbvert * sizeof(D3DTLVERTEX)); - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) _dump_executedata(lpData); - } return D3D_OK; } @@ -785,12 +768,14 @@ IDirect3DExecuteBufferImpl_GetExecuteData(IDirect3DExecuteBuffer *iface, { IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; DWORD dwSize; - TRACE("(%p)->(%p): stub!\n", This, lpData); + + TRACE("iface %p, data %p.\n", iface, lpData); dwSize = lpData->dwSize; memcpy(lpData, &This->data, dwSize); - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { TRACE("Returning data :\n"); _dump_executedata(lpData); } @@ -811,15 +796,14 @@ IDirect3DExecuteBufferImpl_GetExecuteData(IDirect3DExecuteBuffer *iface, * DDERR_UNSUPPORTED, because it's not implemented in Windows. * *****************************************************************************/ -static HRESULT WINAPI -IDirect3DExecuteBufferImpl_Validate(IDirect3DExecuteBuffer *iface, - DWORD *Offset, - LPD3DVALIDATECALLBACK Func, - void *UserArg, - DWORD Reserved) +static HRESULT WINAPI IDirect3DExecuteBufferImpl_Validate(IDirect3DExecuteBuffer *iface, + DWORD *offset, LPD3DVALIDATECALLBACK callback, void *context, DWORD reserved) { - IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; - TRACE("(%p)->(%p,%p,%p,%08x): Unimplemented!\n", This, Offset, Func, UserArg, Reserved); + TRACE("iface %p, offset %p, callback %p, context %p, reserved %#x.\n", + iface, offset, callback, context, reserved); + + WARN("Not implemented.\n"); + return DDERR_UNSUPPORTED; /* Unchecked */ } @@ -836,16 +820,16 @@ IDirect3DExecuteBufferImpl_Validate(IDirect3DExecuteBuffer *iface, * DDERR_UNSUPPORTED, because it's not implemented in Windows. * *****************************************************************************/ -static HRESULT WINAPI -IDirect3DExecuteBufferImpl_Optimize(IDirect3DExecuteBuffer *iface, - DWORD Dummy) +static HRESULT WINAPI IDirect3DExecuteBufferImpl_Optimize(IDirect3DExecuteBuffer *iface, DWORD reserved) { - IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; - TRACE("(%p)->(%08x): Unimplemented\n", This, Dummy); + TRACE("iface %p, reserved %#x.\n", iface, reserved); + + WARN("Not implemented.\n"); + return DDERR_UNSUPPORTED; /* Unchecked */ } -const IDirect3DExecuteBufferVtbl IDirect3DExecuteBuffer_Vtbl = +static const struct IDirect3DExecuteBufferVtbl d3d_execute_buffer_vtbl = { IDirect3DExecuteBufferImpl_QueryInterface, IDirect3DExecuteBufferImpl_AddRef, @@ -858,3 +842,38 @@ const IDirect3DExecuteBufferVtbl IDirect3DExecuteBuffer_Vtbl = IDirect3DExecuteBufferImpl_Validate, IDirect3DExecuteBufferImpl_Optimize, }; + +HRESULT d3d_execute_buffer_init(IDirect3DExecuteBufferImpl *execute_buffer, + IDirect3DDeviceImpl *device, D3DEXECUTEBUFFERDESC *desc) +{ + execute_buffer->lpVtbl = &d3d_execute_buffer_vtbl; + execute_buffer->ref = 1; + execute_buffer->d3ddev = device; + + /* Initializes memory */ + memcpy(&execute_buffer->desc, desc, desc->dwSize); + + /* No buffer given */ + if (!(execute_buffer->desc.dwFlags & D3DDEB_LPDATA)) + execute_buffer->desc.lpData = NULL; + + /* No buffer size given */ + if (!(execute_buffer->desc.dwFlags & D3DDEB_BUFSIZE)) + execute_buffer->desc.dwBufferSize = 0; + + /* Create buffer if asked */ + if (!execute_buffer->desc.lpData && execute_buffer->desc.dwBufferSize) + { + execute_buffer->need_free = TRUE; + execute_buffer->desc.lpData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, execute_buffer->desc.dwBufferSize); + if (!execute_buffer->desc.lpData) + { + ERR("Failed to allocate execute buffer data.\n"); + return DDERR_OUTOFMEMORY; + } + } + + execute_buffer->desc.dwFlags |= D3DDEB_LPDATA; + + return D3D_OK; +} diff --git a/dll/directx/wine/ddraw/gamma.c b/dll/directx/wine/ddraw/gamma.c deleted file mode 100644 index df631a4d6bf..00000000000 --- a/dll/directx/wine/ddraw/gamma.c +++ /dev/null @@ -1,220 +0,0 @@ -/* DirectDrawGammaControl implementation - * - * Copyright 2001 TransGaming Technologies Inc. - * Copyright 2006 Stefan Dテカsinger - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "wine/port.h" -#include "wine/debug.h" - -#include -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - -#include "ddraw_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(ddraw); -WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk); - -static inline IDirectDrawSurfaceImpl *surface_from_gamma_control(IDirectDrawGammaControl *iface) -{ - return (IDirectDrawSurfaceImpl *)((char*)iface - - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirectDrawGammaControl_vtbl)); -} - -/********************************************************** - * IUnknown parts follow - **********************************************************/ - -/********************************************************** - * IDirectDrawGammaControl::QueryInterface - * - * QueryInterface, thunks to IDirectDrawSurface - * - * Params: - * riid: Interface id queried for - * obj: Returns the interface pointer - * - * Returns: - * S_OK or E_NOINTERFACE: See IDirectDrawSurface7::QueryInterface - * - **********************************************************/ -static HRESULT WINAPI -IDirectDrawGammaControlImpl_QueryInterface(IDirectDrawGammaControl *iface, REFIID riid, - void **obj) -{ - IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface); - TRACE_(ddraw_thunk)("(%p)->(%s,%p): Thunking to IDirectDrawSurface7\n", This, debugstr_guid(riid), obj); - - return IDirectDrawSurface7_QueryInterface((IDirectDrawSurface7 *)This, riid, obj); -} - -/********************************************************** - * IDirectDrawGammaControl::AddRef - * - * Addref, thunks to IDirectDrawSurface - * - * Returns: - * The new refcount - * - **********************************************************/ -static ULONG WINAPI -IDirectDrawGammaControlImpl_AddRef(IDirectDrawGammaControl *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface); - TRACE_(ddraw_thunk)("(%p)->() Thunking to IDirectDrawSurface7\n", This); - - return IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)This); -} - -/********************************************************** - * IDirectDrawGammaControl::Release - * - * Release, thunks to IDirectDrawSurface - * - * Returns: - * The new refcount - * - **********************************************************/ -static ULONG WINAPI -IDirectDrawGammaControlImpl_Release(IDirectDrawGammaControl *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface); - TRACE_(ddraw_thunk)("(%p)->() Thunking to IDirectDrawSurface7\n", This); - - return IDirectDrawSurface7_Release((IDirectDrawSurface7 *)This); -} - -/********************************************************** - * IDirectDrawGammaControl - **********************************************************/ - -/********************************************************** - * IDirectDrawGammaControl::GetGammaRamp - * - * Returns the current gamma ramp for a surface - * - * Params: - * Flags: Ignored - * GammaRamp: Address to write the ramp to - * - * Returns: - * DD_OK on success - * DDERR_INVALIDPARAMS if GammaRamp is NULL - * - **********************************************************/ -static HRESULT WINAPI -IDirectDrawGammaControlImpl_GetGammaRamp(IDirectDrawGammaControl *iface, - DWORD Flags, - DDGAMMARAMP *GammaRamp) -{ - IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface); - TRACE("(%p)->(%08x,%p)\n", This,Flags,GammaRamp); - - /* This looks sane */ - if(!GammaRamp) - { - ERR("(%p) GammaRamp is NULL, returning DDERR_INVALIDPARAMS\n", This); - return DDERR_INVALIDPARAMS; - } - - EnterCriticalSection(&ddraw_cs); - if(This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) - { - /* Note: DDGAMMARAMP is compatible with WINED3DGAMMARAMP */ - IWineD3DDevice_GetGammaRamp(This->ddraw->wineD3DDevice, - 0 /* Swapchain */, - (WINED3DGAMMARAMP *) GammaRamp); - } - else - { - ERR("(%p) Unimplemented for non-primary surfaces\n", This); - } - LeaveCriticalSection(&ddraw_cs); - - return DD_OK; -} - -/********************************************************** - * IDirectDrawGammaControl::SetGammaRamp - * - * Sets the red, green and blue gamma ramps for - * - * Params: - * Flags: Can be DDSGR_CALIBRATE to request calibration - * GammaRamp: Structure containing the new gamma ramp - * - * Returns: - * DD_OK on success - * DDERR_INVALIDPARAMS if GammaRamp is NULL - * - **********************************************************/ -static HRESULT WINAPI -IDirectDrawGammaControlImpl_SetGammaRamp(IDirectDrawGammaControl *iface, - DWORD Flags, - DDGAMMARAMP *GammaRamp) -{ - IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface); - TRACE("(%p)->(%08x,%p)\n", This,Flags,GammaRamp); - - /* This looks sane */ - if(!GammaRamp) - { - ERR("(%p) GammaRamp is NULL, returning DDERR_INVALIDPARAMS\n", This); - return DDERR_INVALIDPARAMS; - } - - EnterCriticalSection(&ddraw_cs); - if(This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) - { - - /* Note: DDGAMMARAMP is compatible with WINED3DGAMMARAMP */ - IWineD3DDevice_SetGammaRamp(This->ddraw->wineD3DDevice, - 0 /* Swapchain */, - Flags, - (WINED3DGAMMARAMP *) GammaRamp); - } - else - { - ERR("(%p) Unimplemented for non-primary surfaces\n", This); - } - LeaveCriticalSection(&ddraw_cs); - - return DD_OK; -} - -const IDirectDrawGammaControlVtbl IDirectDrawGammaControl_Vtbl = -{ - IDirectDrawGammaControlImpl_QueryInterface, - IDirectDrawGammaControlImpl_AddRef, - IDirectDrawGammaControlImpl_Release, - IDirectDrawGammaControlImpl_GetGammaRamp, - IDirectDrawGammaControlImpl_SetGammaRamp -}; diff --git a/dll/directx/wine/ddraw/legacy.h b/dll/directx/wine/ddraw/legacy.h new file mode 100644 index 00000000000..c9da1e7d5f9 --- /dev/null +++ b/dll/directx/wine/ddraw/legacy.h @@ -0,0 +1,130 @@ +/* +* Copyright (C) the Wine project +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + /***************************************************************************** + * IDirectDraw3 interface + */ + +#if defined( _WIN32 ) && !defined( _NO_COM ) + #define INTERFACE IDirectDraw3 + DECLARE_INTERFACE_(IDirectDraw3,IUnknown) + { + /*** IUnknown methods ***/ + /*00*/ STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + /*04*/ STDMETHOD_(ULONG,AddRef)(THIS) PURE; + /*08*/ STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectDraw2 methods ***/ + /*0c*/ STDMETHOD(Compact)(THIS) PURE; + /*10*/ STDMETHOD(CreateClipper)(THIS_ DWORD dwFlags, LPDIRECTDRAWCLIPPER *lplpDDClipper, IUnknown *pUnkOuter) PURE; + /*14*/ STDMETHOD(CreatePalette)(THIS_ DWORD dwFlags, LPPALETTEENTRY lpColorTable, LPDIRECTDRAWPALETTE *lplpDDPalette, IUnknown *pUnkOuter) PURE; + /*18*/ STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE *lplpDDSurface, IUnknown *pUnkOuter) PURE; + /*1c*/ STDMETHOD(DuplicateSurface)(THIS_ LPDIRECTDRAWSURFACE lpDDSurface, LPDIRECTDRAWSURFACE *lplpDupDDSurface) PURE; + /*20*/ STDMETHOD(EnumDisplayModes)(THIS_ DWORD dwFlags, LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext, LPDDENUMMODESCALLBACK lpEnumModesCallback) PURE; + /*24*/ STDMETHOD(EnumSurfaces)(THIS_ DWORD dwFlags, LPDDSURFACEDESC lpDDSD, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) PURE; + /*28*/ STDMETHOD(FlipToGDISurface)(THIS) PURE; + /*2c*/ STDMETHOD(GetCaps)(THIS_ LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDHELCaps) PURE; + /*30*/ STDMETHOD(GetDisplayMode)(THIS_ LPDDSURFACEDESC lpDDSurfaceDesc) PURE; + /*34*/ STDMETHOD(GetFourCCCodes)(THIS_ LPDWORD lpNumCodes, LPDWORD lpCodes) PURE; + /*38*/ STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE *lplpGDIDDSurface) PURE; + /*3c*/ STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD lpdwFrequency) PURE; + /*40*/ STDMETHOD(GetScanLine)(THIS_ LPDWORD lpdwScanLine) PURE; + /*44*/ STDMETHOD(GetVerticalBlankStatus)(THIS_ BOOL *lpbIsInVB) PURE; + /*48*/ STDMETHOD(Initialize)(THIS_ GUID *lpGUID) PURE; + /*4c*/ STDMETHOD(RestoreDisplayMode)(THIS) PURE; + /*50*/ STDMETHOD(SetCooperativeLevel)(THIS_ HWND hWnd, DWORD dwFlags) PURE; + /*54*/ STDMETHOD(SetDisplayMode)(THIS_ DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags) PURE; + /*58*/ STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD dwFlags, HANDLE hEvent) PURE; + /* added in v2 */ + /*5c*/ STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) PURE; + /* added in v3 */ + /*60*/ STDMETHOD(GetSurfaceFromDC)(THIS_ HDC hdc, LPDIRECTDRAWSURFACE *pSurf) PURE; + }; + #undef INTERFACE + + #if !defined(__cplusplus) || defined(CINTERFACE) + /*** IUnknown methods ***/ + #define IDirectDraw3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) + #define IDirectDraw3_AddRef(p) (p)->lpVtbl->AddRef(p) + #define IDirectDraw3_Release(p) (p)->lpVtbl->Release(p) + /*** IDirectDraw methods ***/ + #define IDirectDraw3_Compact(p) (p)->lpVtbl->Compact(p) + #define IDirectDraw3_CreateClipper(p,a,b,c) (p)->lpVtbl->CreateClipper(p,a,b,c) + #define IDirectDraw3_CreatePalette(p,a,b,c,d) (p)->lpVtbl->CreatePalette(p,a,b,c,d) + #define IDirectDraw3_CreateSurface(p,a,b,c) (p)->lpVtbl->CreateSurface(p,a,b,c) + #define IDirectDraw3_DuplicateSurface(p,a,b) (p)->lpVtbl->DuplicateSurface(p,a,b) + #define IDirectDraw3_EnumDisplayModes(p,a,b,c,d) (p)->lpVtbl->EnumDisplayModes(p,a,b,c,d) + #define IDirectDraw3_EnumSurfaces(p,a,b,c,d) (p)->lpVtbl->EnumSurfaces(p,a,b,c,d) + #define IDirectDraw3_FlipToGDISurface(p) (p)->lpVtbl->FlipToGDISurface(p) + #define IDirectDraw3_GetCaps(p,a,b) (p)->lpVtbl->GetCaps(p,a,b) + #define IDirectDraw3_GetDisplayMode(p,a) (p)->lpVtbl->GetDisplayMode(p,a) + #define IDirectDraw3_GetFourCCCodes(p,a,b) (p)->lpVtbl->GetFourCCCodes(p,a,b) + #define IDirectDraw3_GetGDISurface(p,a) (p)->lpVtbl->GetGDISurface(p,a) + #define IDirectDraw3_GetMonitorFrequency(p,a) (p)->lpVtbl->GetMonitorFrequency(p,a) + #define IDirectDraw3_GetScanLine(p,a) (p)->lpVtbl->GetScanLine(p,a) + #define IDirectDraw3_GetVerticalBlankStatus(p,a) (p)->lpVtbl->GetVerticalBlankStatus(p,a) + #define IDirectDraw3_Initialize(p,a) (p)->lpVtbl->Initialize(p,a) + #define IDirectDraw3_RestoreDisplayMode(p) (p)->lpVtbl->RestoreDisplayMode(p) + #define IDirectDraw3_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b) + #define IDirectDraw3_SetDisplayMode(p,a,b,c,d,e) (p)->lpVtbl->SetDisplayMode(p,a,b,c,d,e) + #define IDirectDraw3_WaitForVerticalBlank(p,a,b) (p)->lpVtbl->WaitForVerticalBlank(p,a,b) + /*** IDirectDraw2 methods ***/ + #define IDirectDraw3_GetAvailableVidMem(p,a,b,c) (p)->lpVtbl->GetAvailableVidMem(p,a,b,c) + /*** IDirectDraw3 methods ***/ + #define IDirectDraw3_GetSurfaceFromDC(p,a,b) (p)->lpVtbl->GetSurfaceFromDC(p,a,b) + #else + /*** IUnknown methods ***/ + #define IDirectDraw3_QueryInterface(p,a,b) (p)->QueryInterface(a,b) + #define IDirectDraw3_AddRef(p) (p)->AddRef() + #define IDirectDraw3_Release(p) (p)->Release() + /*** IDirectDraw methods ***/ + #define IDirectDraw3_Compact(p) (p)->Compact() + #define IDirectDraw3_CreateClipper(p,a,b,c) (p)->CreateClipper(a,b,c) + #define IDirectDraw3_CreatePalette(p,a,b,c,d) (p)->CreatePalette(a,b,c,d) + #define IDirectDraw3_CreateSurface(p,a,b,c) (p)->CreateSurface(a,b,c) + #define IDirectDraw3_DuplicateSurface(p,a,b) (p)->DuplicateSurface(a,b) + #define IDirectDraw3_EnumDisplayModes(p,a,b,c,d) (p)->EnumDisplayModes(a,b,c,d) + #define IDirectDraw3_EnumSurfaces(p,a,b,c,d) (p)->EnumSurfaces(a,b,c,d) + #define IDirectDraw3_FlipToGDISurface(p) (p)->FlipToGDISurface() + #define IDirectDraw3_GetCaps(p,a,b) (p)->GetCaps(a,b) + #define IDirectDraw3_GetDisplayMode(p,a) (p)->GetDisplayMode(a) + #define IDirectDraw3_GetFourCCCodes(p,a,b) (p)->GetFourCCCodes(a,b) + #define IDirectDraw3_GetGDISurface(p,a) (p)->GetGDISurface(a) + #define IDirectDraw3_GetMonitorFrequency(p,a) (p)->GetMonitorFrequency(a) + #define IDirectDraw3_GetScanLine(p,a) (p)->GetScanLine(a) + #define IDirectDraw3_GetVerticalBlankStatus(p,a) (p)->GetVerticalBlankStatus(a) + #define IDirectDraw3_Initialize(p,a) (p)->Initialize(a) + #define IDirectDraw3_RestoreDisplayMode(p) (p)->RestoreDisplayMode() + #define IDirectDraw3_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b) + #define IDirectDraw3_SetDisplayMode(p,a,b,c,d,e) (p)->SetDisplayMode(a,b,c,d,e) + #define IDirectDraw3_WaitForVerticalBlank(p,a,b) (p)->WaitForVerticalBlank(a,b) + /*** IDirectDraw2 methods ***/ + #define IDirectDraw3_GetAvailableVidMem(p,a,b,c) (p)->GetAvailableVidMem(a,b,c) + /*** IDirectDraw3 methods ***/ + #define IDirectDraw3_GetSurfaceFromDC(p,a,b) (p)->GetSurfaceFromDC(a,b) + #endif +#undef INTERFACE +#endif + +#ifdef __cplusplus +} +#endif diff --git a/dll/directx/wine/ddraw/light.c b/dll/directx/wine/ddraw/light.c index 030dcf030c4..a6a3cad8b94 100644 --- a/dll/directx/wine/ddraw/light.c +++ b/dll/directx/wine/ddraw/light.c @@ -21,27 +21,75 @@ #include "config.h" #include "wine/port.h" -#include "wine/debug.h" - -#include -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" #include "ddraw_private.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); +WINE_DEFAULT_DEBUG_CHANNEL(ddraw); + +/***************************************************************************** + * light_update + * + * Updates the Direct3DDevice7 lighting parameters + * + *****************************************************************************/ +static void light_update(IDirect3DLightImpl *light) +{ + IDirect3DDeviceImpl *device; + + TRACE("light %p.\n", light); + + if (!light->active_viewport || !light->active_viewport->active_device) return; + device = light->active_viewport->active_device; + + IDirect3DDevice7_SetLight((IDirect3DDevice7 *)device, light->dwLightIndex, &light->light7); +} + +/***************************************************************************** + * light_activate + * + * Uses the Direct3DDevice7::LightEnable method to active the light + * + *****************************************************************************/ +void light_activate(IDirect3DLightImpl *light) +{ + IDirect3DDeviceImpl *device; + + TRACE("light %p.\n", light); + + if (!light->active_viewport || !light->active_viewport->active_device) return; + device = light->active_viewport->active_device; + + light_update(light); + if (!(light->light.dwFlags & D3DLIGHT_ACTIVE)) + { + IDirect3DDevice7_LightEnable((IDirect3DDevice7 *)device, light->dwLightIndex, TRUE); + light->light.dwFlags |= D3DLIGHT_ACTIVE; + } +} + +/***************************************************************************** + * + * light_deactivate + * + * Uses the Direct3DDevice7::LightEnable method to deactivate the light + * + *****************************************************************************/ +void light_deactivate(IDirect3DLightImpl *light) +{ + IDirect3DDeviceImpl *device; + + TRACE("light %p.\n", light); + + if (!light->active_viewport || !light->active_viewport->active_device) return; + device = light->active_viewport->active_device; + + /* If was not active, activate it */ + if (light->light.dwFlags & D3DLIGHT_ACTIVE) + { + IDirect3DDevice7_LightEnable((IDirect3DDevice7 *)device, light->dwLightIndex, FALSE); + light->light.dwFlags &= ~D3DLIGHT_ACTIVE; + } +} /***************************************************************************** * IUnknown Methods. @@ -60,14 +108,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d7); * Returns: * E_NOINTERFACE, because it's a stub *****************************************************************************/ -static HRESULT WINAPI -IDirect3DLightImpl_QueryInterface(IDirect3DLight *iface, - REFIID riid, - void **obp) +static HRESULT WINAPI IDirect3DLightImpl_QueryInterface(IDirect3DLight *iface, REFIID riid, void **object) { - IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface; - FIXME("(%p)->(%s,%p): stub!\n", This, debugstr_guid(riid), obp); - *obp = NULL; + FIXME("iface %p, riid %s, object %p stub!\n", iface, debugstr_guid(riid), object); + + *object = NULL; return E_NOINTERFACE; } @@ -86,7 +131,7 @@ IDirect3DLightImpl_AddRef(IDirect3DLight *iface) IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->() incrementing from %u.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -107,11 +152,11 @@ IDirect3DLightImpl_Release(IDirect3DLight *iface) IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (!ref) { HeapFree(GetProcessHeap(), 0, This); - return 0; + return 0; } return ref; } @@ -133,13 +178,10 @@ IDirect3DLightImpl_Release(IDirect3DLight *iface) * D3D_OK * *****************************************************************************/ -static HRESULT WINAPI -IDirect3DLightImpl_Initialize(IDirect3DLight *iface, - IDirect3D *lpDirect3D) +static HRESULT WINAPI IDirect3DLightImpl_Initialize(IDirect3DLight *iface, IDirect3D *d3d) { - IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface; - IDirectDrawImpl *d3d = lpDirect3D ? ddraw_from_d3d1(lpDirect3D) : NULL; - TRACE("(%p)->(%p) no-op...\n", This, d3d); + TRACE("iface %p, d3d %p.\n", iface, d3d); + return D3D_OK; } @@ -171,10 +213,13 @@ IDirect3DLightImpl_SetLight(IDirect3DLight *iface, { IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface; LPD3DLIGHT7 light7 = &(This->light7); - TRACE("(%p)->(%p)\n", This, lpLight); - if (TRACE_ON(d3d7)) { + + TRACE("iface %p, light %p.\n", iface, lpLight); + + if (TRACE_ON(ddraw)) + { TRACE(" Light definition :\n"); - dump_light((LPD3DLIGHT2) lpLight); + dump_light((LPD3DLIGHT2) lpLight); } if ( (lpLight->dltType == 0) || (lpLight->dltType > D3DLIGHT_PARALLELPOINT) ) @@ -203,9 +248,8 @@ IDirect3DLightImpl_SetLight(IDirect3DLight *iface, EnterCriticalSection(&ddraw_cs); memcpy(&This->light, lpLight, lpLight->dwSize); - if ((This->light.dwFlags & D3DLIGHT_ACTIVE) != 0) { - This->update(This); - } + if (This->light.dwFlags & D3DLIGHT_ACTIVE) + light_update(This); LeaveCriticalSection(&ddraw_cs); return D3D_OK; } @@ -227,10 +271,13 @@ IDirect3DLightImpl_GetLight(IDirect3DLight *iface, D3DLIGHT *lpLight) { IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface; - TRACE("(%p/%p)->(%p)\n", This, iface, lpLight); - if (TRACE_ON(d3d7)) { + + TRACE("iface %p, light %p.\n", iface, lpLight); + + if (TRACE_ON(ddraw)) + { TRACE(" Returning light definition :\n"); - dump_light(&This->light); + dump_light(&This->light); } EnterCriticalSection(&ddraw_cs); @@ -240,74 +287,7 @@ IDirect3DLightImpl_GetLight(IDirect3DLight *iface, return DD_OK; } -/***************************************************************************** - * light_update - * - * Updates the Direct3DDevice7 lighting parameters - * - *****************************************************************************/ -void light_update(IDirect3DLightImpl* This) -{ - IDirect3DDeviceImpl* device; - - TRACE("(%p)\n", This); - - if (!This->active_viewport || !This->active_viewport->active_device) - return; - device = This->active_viewport->active_device; - - IDirect3DDevice7_SetLight((IDirect3DDevice7 *)device, This->dwLightIndex, &(This->light7)); -} - -/***************************************************************************** - * light_activate - * - * Uses the Direct3DDevice7::LightEnable method to active the light - * - *****************************************************************************/ -void light_activate(IDirect3DLightImpl* This) -{ - IDirect3DDeviceImpl* device; - - TRACE("(%p)\n", This); - - if (!This->active_viewport || !This->active_viewport->active_device) - return; - device = This->active_viewport->active_device; - - light_update(This); - /* If was not active, activate it */ - if ((This->light.dwFlags & D3DLIGHT_ACTIVE) == 0) { - IDirect3DDevice7_LightEnable((IDirect3DDevice7 *)device, This->dwLightIndex, TRUE); - This->light.dwFlags |= D3DLIGHT_ACTIVE; - } -} - -/***************************************************************************** - * - * light_desactivate - * - * Uses the Direct3DDevice7::LightEnable method to deactivate the light - * - *****************************************************************************/ -void light_desactivate(IDirect3DLightImpl* This) -{ - IDirect3DDeviceImpl* device; - - TRACE("(%p)\n", This); - - if (!This->active_viewport || !This->active_viewport->active_device) - return; - device = This->active_viewport->active_device; - - /* If was not active, activate it */ - if ((This->light.dwFlags & D3DLIGHT_ACTIVE) != 0) { - IDirect3DDevice7_LightEnable((IDirect3DDevice7 *)device, This->dwLightIndex, FALSE); - This->light.dwFlags &= ~D3DLIGHT_ACTIVE; - } -} - -const IDirect3DLightVtbl IDirect3DLight_Vtbl = +static const struct IDirect3DLightVtbl d3d_light_vtbl = { /*** IUnknown Methods ***/ IDirect3DLightImpl_QueryInterface, @@ -318,3 +298,10 @@ const IDirect3DLightVtbl IDirect3DLight_Vtbl = IDirect3DLightImpl_SetLight, IDirect3DLightImpl_GetLight }; + +void d3d_light_init(IDirect3DLightImpl *light, IDirectDrawImpl *ddraw) +{ + light->lpVtbl = &d3d_light_vtbl; + light->ref = 1; + light->ddraw = ddraw; +} diff --git a/dll/directx/wine/ddraw/main.c b/dll/directx/wine/ddraw/main.c index 72426cdf26c..217a2cbcff8 100644 --- a/dll/directx/wine/ddraw/main.c +++ b/dll/directx/wine/ddraw/main.c @@ -26,35 +26,21 @@ #include "config.h" #include "wine/port.h" -#include "wine/debug.h" - -#include -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" -#include "winreg.h" - -#include "ddraw.h" -#include "d3d.h" #define DDRAW_INIT_GUID #include "ddraw_private.h" -static typeof(WineDirect3DCreate) *pWineDirect3DCreate; +#include "wine/exception.h" +#include "winreg.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw); /* The configured default surface */ WINED3DSURFTYPE DefaultSurfaceType = SURFACE_UNKNOWN; +typeof(WineDirect3DCreateClipper) *pWineDirect3DCreateClipper DECLSPEC_HIDDEN; +typeof(WineDirect3DCreate) *pWineDirect3DCreate DECLSPEC_HIDDEN; + /* DDraw list and critical section */ static struct list global_ddraw_list = LIST_INIT(global_ddraw_list); @@ -70,6 +56,117 @@ CRITICAL_SECTION ddraw_cs = { &ddraw_cs_debug, -1, 0, 0, 0, 0 }; /* value of ForceRefreshRate */ DWORD force_refresh_rate = 0; +/* Handle table functions */ +BOOL ddraw_handle_table_init(struct ddraw_handle_table *t, UINT initial_size) +{ + t->entries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, initial_size * sizeof(*t->entries)); + if (!t->entries) + { + ERR("Failed to allocate handle table memory.\n"); + return FALSE; + } + t->free_entries = NULL; + t->table_size = initial_size; + t->entry_count = 0; + + return TRUE; +} + +void ddraw_handle_table_destroy(struct ddraw_handle_table *t) +{ + HeapFree(GetProcessHeap(), 0, t->entries); + memset(t, 0, sizeof(*t)); +} + +DWORD ddraw_allocate_handle(struct ddraw_handle_table *t, void *object, enum ddraw_handle_type type) +{ + struct ddraw_handle_entry *entry; + + if (t->free_entries) + { + DWORD idx = t->free_entries - t->entries; + /* Use a free handle */ + entry = t->free_entries; + if (entry->type != DDRAW_HANDLE_FREE) + { + ERR("Handle %#x (%p) is in the free list, but has type %#x.\n", idx, entry->object, entry->type); + return DDRAW_INVALID_HANDLE; + } + t->free_entries = entry->object; + entry->object = object; + entry->type = type; + + return idx; + } + + if (!(t->entry_count < t->table_size)) + { + /* Grow the table */ + UINT new_size = t->table_size + (t->table_size >> 1); + struct ddraw_handle_entry *new_entries = HeapReAlloc(GetProcessHeap(), + 0, t->entries, new_size * sizeof(*t->entries)); + if (!new_entries) + { + ERR("Failed to grow the handle table.\n"); + return DDRAW_INVALID_HANDLE; + } + t->entries = new_entries; + t->table_size = new_size; + } + + entry = &t->entries[t->entry_count]; + entry->object = object; + entry->type = type; + + return t->entry_count++; +} + +void *ddraw_free_handle(struct ddraw_handle_table *t, DWORD handle, enum ddraw_handle_type type) +{ + struct ddraw_handle_entry *entry; + void *object; + + if (handle == DDRAW_INVALID_HANDLE || handle >= t->entry_count) + { + WARN("Invalid handle %#x passed.\n", handle); + return NULL; + } + + entry = &t->entries[handle]; + if (entry->type != type) + { + WARN("Handle %#x (%p) is not of type %#x.\n", handle, entry->object, type); + return NULL; + } + + object = entry->object; + entry->object = t->free_entries; + entry->type = DDRAW_HANDLE_FREE; + t->free_entries = entry; + + return object; +} + +void *ddraw_get_object(struct ddraw_handle_table *t, DWORD handle, enum ddraw_handle_type type) +{ + struct ddraw_handle_entry *entry; + + if (handle == DDRAW_INVALID_HANDLE || handle >= t->entry_count) + { + WARN("Invalid handle %#x passed.\n", handle); + return NULL; + } + + entry = &t->entries[handle]; + if (entry->type != type) + { + WARN("Handle %#x (%p) is not of type %#x.\n", handle, entry->object, type); + return NULL; + } + + return entry->object; +} + /* * Helper Function for DDRAW_Create and DirectDrawCreateClipper for * lazy loading of the Wine D3D driver. @@ -124,14 +221,12 @@ DDRAW_Create(const GUID *guid, IUnknown *UnkOuter, REFIID iid) { - IDirectDrawImpl *This = NULL; - HRESULT hr; - IWineD3D *wineD3D = NULL; - IWineD3DDevice *wineD3DDevice = NULL; - HDC hDC; WINED3DDEVTYPE devicetype; + IDirectDrawImpl *This; + HRESULT hr; - TRACE("(%s,%p,%p)\n", debugstr_guid(guid), DD, UnkOuter); + TRACE("driver_guid %s, ddraw %p, outer_unknown %p, interface_iid %s.\n", + debugstr_guid(guid), DD, UnkOuter, debugstr_guid(iid)); *DD = NULL; @@ -167,129 +262,19 @@ DDRAW_Create(const GUID *guid, return E_OUTOFMEMORY; } - /* The interfaces: - * IDirectDraw and IDirect3D are the same object, - * QueryInterface is used to get other interfaces. - */ - This->lpVtbl = &IDirectDraw7_Vtbl; - This->IDirectDraw_vtbl = &IDirectDraw1_Vtbl; - This->IDirectDraw2_vtbl = &IDirectDraw2_Vtbl; - This->IDirectDraw4_vtbl = &IDirectDraw4_Vtbl; - This->IDirect3D_vtbl = &IDirect3D1_Vtbl; - This->IDirect3D2_vtbl = &IDirect3D2_Vtbl; - This->IDirect3D3_vtbl = &IDirect3D3_Vtbl; - This->IDirect3D7_vtbl = &IDirect3D7_Vtbl; - This->device_parent_vtbl = &ddraw_wined3d_device_parent_vtbl; - - /* See comments in IDirectDrawImpl_CreateNewSurface for a description - * of this member. - * Read from a registry key, should add a winecfg option later - */ - This->ImplType = DefaultSurfaceType; - - /* Get the current screen settings */ - hDC = GetDC(0); - This->orig_bpp = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); - ReleaseDC(0, hDC); - This->orig_width = GetSystemMetrics(SM_CXSCREEN); - This->orig_height = GetSystemMetrics(SM_CYSCREEN); - - if (!LoadWineD3D()) + hr = ddraw_init(This, devicetype); + if (FAILED(hr)) { - ERR("Couldn't load WineD3D - OpenGL libs not present?\n"); - hr = DDERR_NODIRECTDRAWSUPPORT; - goto err_out; + WARN("Failed to initialize ddraw object, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, This); + return hr; } - /* Initialize WineD3D - * - * All Rendering (2D and 3D) is relayed to WineD3D, - * but DirectDraw specific management, like DDSURFACEDESC and DDPIXELFORMAT - * structure handling is handled in this lib. - */ - wineD3D = pWineDirect3DCreate(7 /* DXVersion */, (IUnknown *) This /* Parent */); - if(!wineD3D) - { - ERR("Failed to initialise WineD3D\n"); - hr = E_OUTOFMEMORY; - goto err_out; - } - This->wineD3D = wineD3D; - TRACE("WineD3D created at %p\n", wineD3D); - - /* Initialized member... - * - * It is set to false at creation time, and set to true in - * IDirectDraw7::Initialize. Its sole purpose is to return DD_OK on - * initialize only once - */ - This->initialized = FALSE; - - /* Initialize WineD3DDevice - * - * It is used for screen setup, surface and palette creation - * When a Direct3DDevice7 is created, the D3D capabilities of WineD3D are - * initialized - */ - hr = IWineD3D_CreateDevice(wineD3D, 0 /* D3D_ADAPTER_DEFAULT */, devicetype, NULL /* FocusWindow, don't know yet */, - 0 /* BehaviorFlags */, (IUnknown *)This, (IWineD3DDeviceParent *)&This->device_parent_vtbl, &wineD3DDevice); - if(FAILED(hr)) - { - ERR("Failed to create a wineD3DDevice, result = %x\n", hr); - goto err_out; - } - This->wineD3DDevice = wineD3DDevice; - TRACE("wineD3DDevice created at %p\n", This->wineD3DDevice); - - /* Register the window class - * - * It is used to create a hidden window for D3D - * rendering, if the application didn't pass one. - * It can also be used for Creating a device window - * from SetCooperativeLevel - * - * The name: DDRAW_
. The classname is - * 32 bit long, so a 64 bit address will fit nicely - * (Will this be compiled for 64 bit anyway?) - * - */ - sprintf(This->classname, "DDRAW_%p", This); - - memset(&This->wnd_class, 0, sizeof(This->wnd_class)); - This->wnd_class.style = CS_HREDRAW | CS_VREDRAW; - This->wnd_class.lpfnWndProc = DefWindowProcA; - This->wnd_class.cbClsExtra = 0; - This->wnd_class.cbWndExtra = 0; - This->wnd_class.hInstance = GetModuleHandleA(0); - This->wnd_class.hIcon = 0; - This->wnd_class.hCursor = 0; - This->wnd_class.hbrBackground = GetStockObject(BLACK_BRUSH); - This->wnd_class.lpszMenuName = NULL; - This->wnd_class.lpszClassName = This->classname; - if(!RegisterClassA(&This->wnd_class)) - { - ERR("RegisterClassA failed!\n"); - goto err_out; - } - - /* Get the amount of video memory */ - This->total_vidmem = IWineD3DDevice_GetAvailableTextureMem(This->wineD3DDevice); - - list_init(&This->surface_list); - list_add_head(&global_ddraw_list, &This->ddraw_list_entry); - - /* Call QueryInterface to get the pointer to the requested interface. This also initializes - * The required refcount - */ hr = IDirectDraw7_QueryInterface((IDirectDraw7 *)This, iid, DD); - if(SUCCEEDED(hr)) return DD_OK; + IDirectDraw7_Release((IDirectDraw7 *)This); + if (SUCCEEDED(hr)) list_add_head(&global_ddraw_list, &This->ddraw_list_entry); + else WARN("Failed to query interface %s from ddraw object %p.\n", debugstr_guid(iid), This); -err_out: - /* Let's hope we never need this ;) */ - if(wineD3DDevice) IWineD3DDevice_Release(wineD3DDevice); - if(wineD3D) IWineD3D_Release(wineD3D); - HeapFree(GetProcessHeap(), 0, This->decls); - HeapFree(GetProcessHeap(), 0, This); return hr; } @@ -308,7 +293,9 @@ DirectDrawCreate(GUID *GUID, IUnknown *UnkOuter) { HRESULT hr; - TRACE("(%s,%p,%p)\n", debugstr_guid(GUID), DD, UnkOuter); + + TRACE("driver_guid %s, ddraw %p, outer_unknown %p.\n", + debugstr_guid(GUID), DD, UnkOuter); EnterCriticalSection(&ddraw_cs); hr = DDRAW_Create(GUID, (void **) DD, UnkOuter, &IID_IDirectDraw); @@ -332,7 +319,9 @@ DirectDrawCreateEx(GUID *GUID, IUnknown *UnkOuter) { HRESULT hr; - TRACE("(%s,%p,%s,%p)\n", debugstr_guid(GUID), DD, debugstr_guid(iid), UnkOuter); + + TRACE("driver_guid %s, ddraw %p, interface_iid %s, outer_unknown %p.\n", + debugstr_guid(GUID), DD, debugstr_guid(iid), UnkOuter); if (!IsEqualGUID(iid, &IID_IDirectDraw7)) return DDERR_INVALIDPARAMS; @@ -363,11 +352,9 @@ DirectDrawCreateEx(GUID *GUID, * * ***********************************************************************/ -HRESULT WINAPI -DirectDrawEnumerateA(LPDDENUMCALLBACKA Callback, - LPVOID Context) +HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACKA Callback, void *Context) { - TRACE("(%p, %p)\n", Callback, Context); + TRACE("callback %p, context %p.\n", Callback, Context); TRACE(" Enumerating default DirectDraw HAL interface\n"); /* We only have one driver */ @@ -397,12 +384,9 @@ DirectDrawEnumerateA(LPDDENUMCALLBACKA Callback, * The Flag member is not supported right now. * ***********************************************************************/ -HRESULT WINAPI -DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA Callback, - LPVOID Context, - DWORD Flags) +HRESULT WINAPI DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA Callback, void *Context, DWORD Flags) { - TRACE("(%p, %p, 0x%08x)\n", Callback, Context, Flags); + TRACE("callback %p, context %p, flags %#x.\n", Callback, Context, Flags); if (Flags & ~(DDENUM_ATTACHEDSECONDARYDEVICES | DDENUM_DETACHEDSECONDARYDEVICES | @@ -440,13 +424,11 @@ DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA Callback, * This function is not implemented on Windows. * ***********************************************************************/ -HRESULT WINAPI -DirectDrawEnumerateW(LPDDENUMCALLBACKW Callback, - LPVOID Context) +HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW callback, void *context) { - TRACE("(%p, %p)\n", Callback, Context); + TRACE("callback %p, context %p.\n", callback, context); - if (!Callback) + if (!callback) return DDERR_INVALIDPARAMS; else return DDERR_UNSUPPORTED; @@ -459,12 +441,9 @@ DirectDrawEnumerateW(LPDDENUMCALLBACKW Callback, * This function is not implemented on Windows. * ***********************************************************************/ -HRESULT WINAPI -DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW Callback, - LPVOID Context, - DWORD Flags) +HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW callback, void *context, DWORD flags) { - TRACE("(%p, %p, 0x%x)\n", Callback, Context, Flags); + TRACE("callback %p, context %p, flags %#x.\n", callback, context, flags); return DDERR_UNSUPPORTED; } @@ -493,7 +472,7 @@ CF_CreateDirectDraw(IUnknown* UnkOuter, REFIID iid, { HRESULT hr; - TRACE("(%p,%s,%p)\n", UnkOuter, debugstr_guid(iid), obj); + TRACE("outer_unknown %p, riid %s, object %p.\n", UnkOuter, debugstr_guid(iid), obj); EnterCriticalSection(&ddraw_cs); hr = DDRAW_Create(NULL, obj, UnkOuter, iid); @@ -522,6 +501,8 @@ CF_CreateDirectDrawClipper(IUnknown* UnkOuter, REFIID riid, HRESULT hr; IDirectDrawClipper *Clip; + TRACE("outer_unknown %p, riid %s, object %p.\n", UnkOuter, debugstr_guid(riid), obj); + EnterCriticalSection(&ddraw_cs); hr = DirectDrawCreateClipper(0, &Clip, UnkOuter); if (hr != DD_OK) @@ -565,7 +546,7 @@ IDirectDrawClassFactoryImpl_QueryInterface(IClassFactory *iface, { IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IClassFactory)) @@ -594,7 +575,7 @@ IDirectDrawClassFactoryImpl_AddRef(IClassFactory *iface) IClassFactoryImpl *This = (IClassFactoryImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->() incrementing from %d.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -614,7 +595,8 @@ IDirectDrawClassFactoryImpl_Release(IClassFactory *iface) { IClassFactoryImpl *This = (IClassFactoryImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %d.\n", This, ref+1); + + TRACE("%p decreasing refcount to %u.\n", This, ref); if (ref == 0) HeapFree(GetProcessHeap(), 0, This); @@ -643,7 +625,8 @@ IDirectDrawClassFactoryImpl_CreateInstance(IClassFactory *iface, { IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - TRACE("(%p)->(%p,%s,%p)\n",This,UnkOuter,debugstr_guid(riid),obj); + TRACE("iface %p, outer_unknown %p, riid %s, object %p.\n", + iface, UnkOuter, debugstr_guid(riid), obj); return This->pfnCreateInstance(UnkOuter, riid, obj); } @@ -660,11 +643,10 @@ IDirectDrawClassFactoryImpl_CreateInstance(IClassFactory *iface, * S_OK, because it's a stub * *******************************************************************************/ -static HRESULT WINAPI -IDirectDrawClassFactoryImpl_LockServer(IClassFactory *iface,BOOL dolock) +static HRESULT WINAPI IDirectDrawClassFactoryImpl_LockServer(IClassFactory *iface, BOOL dolock) { - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - FIXME("(%p)->(%d),stub!\n",This,dolock); + FIXME("iface %p, dolock %#x stub!\n", iface, dolock); + return S_OK; } @@ -702,22 +684,23 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) unsigned int i; IClassFactoryImpl *factory; - TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + TRACE("rclsid %s, riid %s, object %p.\n", + debugstr_guid(rclsid), debugstr_guid(riid), ppv); - if ( !IsEqualGUID( &IID_IClassFactory, riid ) - && ! IsEqualGUID( &IID_IUnknown, riid) ) - return E_NOINTERFACE; + if (!IsEqualGUID(&IID_IClassFactory, riid) + && !IsEqualGUID(&IID_IUnknown, riid)) + return E_NOINTERFACE; for (i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++) { - if (IsEqualGUID(object_creation[i].clsid, rclsid)) - break; + if (IsEqualGUID(object_creation[i].clsid, rclsid)) + break; } if (i == sizeof(object_creation)/sizeof(object_creation[0])) { - FIXME("%s: no class found.\n", debugstr_guid(rclsid)); - return CLASS_E_CLASSNOTAVAILABLE; + FIXME("%s: no class found.\n", debugstr_guid(rclsid)); + return CLASS_E_CLASSNOTAVAILABLE; } factory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*factory)); @@ -742,6 +725,8 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) */ HRESULT WINAPI DllCanUnloadNow(void) { + TRACE("\n"); + return S_FALSE; } @@ -816,8 +801,28 @@ DllMain(HINSTANCE hInstDLL, DWORD size = sizeof(buffer); HKEY hkey = 0; HKEY appkey = 0; + WNDCLASSA wc; DWORD len; + /* Register the window class. This is used to create a hidden window + * for D3D rendering, if the application didn't pass one. It can also + * be used for creating a device window from SetCooperativeLevel(). */ + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = DefWindowProcA; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstDLL; + wc.hIcon = 0; + wc.hCursor = 0; + wc.hbrBackground = GetStockObject(BLACK_BRUSH); + wc.lpszMenuName = NULL; + wc.lpszClassName = DDRAW_WINDOW_CLASS_NAME; + if (!RegisterClassA(&wc)) + { + ERR("Failed to register ddraw window class, last error %#x.\n", GetLastError()); + return FALSE; + } + /* @@ Wine registry key: HKCU\Software\Wine\Direct3D */ if ( RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\Direct3D", &hkey ) ) hkey = 0; @@ -913,6 +918,7 @@ DllMain(HINSTANCE hInstDLL, /* Add references to each interface to avoid freeing them unexpectedly */ IDirectDraw_AddRef((IDirectDraw *)&ddraw->IDirectDraw_vtbl); IDirectDraw2_AddRef((IDirectDraw2 *)&ddraw->IDirectDraw2_vtbl); + IDirectDraw3_AddRef((IDirectDraw3 *)&ddraw->IDirectDraw3_vtbl); IDirectDraw4_AddRef((IDirectDraw4 *)&ddraw->IDirectDraw4_vtbl); IDirectDraw7_AddRef((IDirectDraw7 *)ddraw); @@ -948,10 +954,14 @@ DllMain(HINSTANCE hInstDLL, */ while(IDirectDraw_Release((IDirectDraw *)&ddraw->IDirectDraw_vtbl)); while(IDirectDraw2_Release((IDirectDraw2 *)&ddraw->IDirectDraw2_vtbl)); + while(IDirectDraw3_Release((IDirectDraw3 *)&ddraw->IDirectDraw3_vtbl)); while(IDirectDraw4_Release((IDirectDraw4 *)&ddraw->IDirectDraw4_vtbl)); while(IDirectDraw7_Release((IDirectDraw7 *)ddraw)); } } + + /* Unregister the window class. */ + UnregisterClassA(DDRAW_WINDOW_CLASS_NAME, hInstDLL); } return TRUE; diff --git a/dll/directx/wine/ddraw/material.c b/dll/directx/wine/ddraw/material.c index d75501ecd95..42d5edcbce5 100644 --- a/dll/directx/wine/ddraw/material.c +++ b/dll/directx/wine/ddraw/material.c @@ -22,28 +22,9 @@ #include "config.h" #include "wine/port.h" -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - #include "ddraw_private.h" -#include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); -WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk); +WINE_DEFAULT_DEBUG_CHANNEL(ddraw); static void dump_material(const D3DMATERIAL *mat) { @@ -85,33 +66,34 @@ IDirect3DMaterialImpl_QueryInterface(IDirect3DMaterial3 *iface, LPVOID* obp) { IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface; - TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), obp); + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp); *obp = NULL; if ( IsEqualGUID( &IID_IUnknown, riid ) ) { IUnknown_AddRef(iface); - *obp = iface; - TRACE(" Creating IUnknown interface at %p.\n", *obp); - return S_OK; + *obp = iface; + TRACE(" Creating IUnknown interface at %p.\n", *obp); + return S_OK; } if ( IsEqualGUID( &IID_IDirect3DMaterial, riid ) ) { IDirect3DMaterial_AddRef((IDirect3DMaterial *)&This->IDirect3DMaterial_vtbl); *obp = &This->IDirect3DMaterial_vtbl; - TRACE(" Creating IDirect3DMaterial interface %p\n", *obp); - return S_OK; + TRACE(" Creating IDirect3DMaterial interface %p\n", *obp); + return S_OK; } if ( IsEqualGUID( &IID_IDirect3DMaterial2, riid ) ) { IDirect3DMaterial_AddRef((IDirect3DMaterial2 *)&This->IDirect3DMaterial2_vtbl); *obp = &This->IDirect3DMaterial2_vtbl; - TRACE(" Creating IDirect3DMaterial2 interface %p\n", *obp); - return S_OK; + TRACE(" Creating IDirect3DMaterial2 interface %p\n", *obp); + return S_OK; } if ( IsEqualGUID( &IID_IDirect3DMaterial3, riid ) ) { IDirect3DMaterial3_AddRef((IDirect3DMaterial3 *)This); *obp = This; - TRACE(" Creating IDirect3DMaterial3 interface %p\n", *obp); - return S_OK; + TRACE(" Creating IDirect3DMaterial3 interface %p\n", *obp); + return S_OK; } FIXME("(%p): interface for IID %s NOT found!\n", This, debugstr_guid(riid)); return E_NOINTERFACE; @@ -132,7 +114,7 @@ IDirect3DMaterialImpl_AddRef(IDirect3DMaterial3 *iface) IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->() incrementing from %u.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -153,15 +135,14 @@ IDirect3DMaterialImpl_Release(IDirect3DMaterial3 *iface) IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (!ref) { if(This->Handle) { EnterCriticalSection(&ddraw_cs); - This->ddraw->d3ddevice->Handles[This->Handle - 1].ptr = NULL; - This->ddraw->d3ddevice->Handles[This->Handle - 1].type = DDrawHandle_Unknown; + ddraw_free_handle(&This->ddraw->d3ddevice->handle_table, This->Handle - 1, DDRAW_HANDLE_MATERIAL); LeaveCriticalSection(&ddraw_cs); } @@ -191,9 +172,7 @@ static HRESULT WINAPI IDirect3DMaterialImpl_Initialize(IDirect3DMaterial *iface, IDirect3D *Direct3D) { - IDirect3DMaterialImpl *This = material_from_material1(iface); - - TRACE("(%p)->(%p) no-op...!\n", This, Direct3D); + TRACE("iface %p, d3d %p.\n", iface, Direct3D); return D3D_OK; } @@ -211,8 +190,7 @@ IDirect3DMaterialImpl_Initialize(IDirect3DMaterial *iface, static HRESULT WINAPI IDirect3DMaterialImpl_Reserve(IDirect3DMaterial *iface) { - IDirect3DMaterialImpl *This = material_from_material1(iface); - TRACE("(%p)->() not implemented\n", This); + TRACE("iface %p.\n", iface); return DDERR_UNSUPPORTED; } @@ -229,8 +207,7 @@ IDirect3DMaterialImpl_Reserve(IDirect3DMaterial *iface) static HRESULT WINAPI IDirect3DMaterialImpl_Unreserve(IDirect3DMaterial *iface) { - IDirect3DMaterialImpl *This = material_from_material1(iface); - TRACE("(%p)->() not implemented.\n", This); + TRACE("iface %p.\n", iface); return DDERR_UNSUPPORTED; } @@ -253,8 +230,9 @@ IDirect3DMaterialImpl_SetMaterial(IDirect3DMaterial3 *iface, D3DMATERIAL *lpMat) { IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface; - TRACE("(%p)->(%p)\n", This, lpMat); - if (TRACE_ON(d3d7)) + + TRACE("iface %p, material %p.\n", iface, lpMat); + if (TRACE_ON(ddraw)) dump_material(lpMat); /* Stores the material */ @@ -285,8 +263,10 @@ IDirect3DMaterialImpl_GetMaterial(IDirect3DMaterial3 *iface, { IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface; DWORD dwSize; - TRACE("(%p)->(%p)\n", This, lpMat); - if (TRACE_ON(d3d7)) { + + TRACE("iface %p, material %p.\n", iface, lpMat); + if (TRACE_ON(ddraw)) + { TRACE(" Returning material : "); dump_material(&This->mat); } @@ -322,21 +302,22 @@ IDirect3DMaterialImpl_GetHandle(IDirect3DMaterial3 *iface, { IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface; IDirect3DDeviceImpl *device = device_from_device3(lpDirect3DDevice3); - TRACE("(%p/%p)->(%p,%p)\n", This, iface, device, lpHandle); + + TRACE("iface %p, device %p, handle %p.\n", iface, lpDirect3DDevice3, lpHandle); EnterCriticalSection(&ddraw_cs); This->active_device = device; if(!This->Handle) { - This->Handle = IDirect3DDeviceImpl_CreateHandle(device); - if(!This->Handle) + DWORD h = ddraw_allocate_handle(&device->handle_table, This, DDRAW_HANDLE_MATERIAL); + if (h == DDRAW_INVALID_HANDLE) { - ERR("Error creating a handle\n"); + ERR("Failed to allocate a material handle.\n"); LeaveCriticalSection(&ddraw_cs); return DDERR_INVALIDPARAMS; /* Unchecked */ } - device->Handles[This->Handle - 1].ptr = This; - device->Handles[This->Handle - 1].type = DDrawHandle_Material; + + This->Handle = h + 1; } *lpHandle = This->Handle; TRACE(" returning handle %08x.\n", *lpHandle); @@ -345,22 +326,20 @@ IDirect3DMaterialImpl_GetHandle(IDirect3DMaterial3 *iface, return D3D_OK; } -static HRESULT WINAPI -Thunk_IDirect3DMaterialImpl_2_GetHandle(LPDIRECT3DMATERIAL2 iface, - LPDIRECT3DDEVICE2 lpDirect3DDevice2, - LPD3DMATERIALHANDLE lpHandle) +static HRESULT WINAPI Thunk_IDirect3DMaterialImpl_2_GetHandle(IDirect3DMaterial2 *iface, + IDirect3DDevice2 *lpDirect3DDevice2, D3DMATERIALHANDLE *lpHandle) { - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpDirect3DDevice2, lpHandle); + TRACE("iface %p, device %p, handle %p.\n", iface, lpDirect3DDevice2, lpHandle); + return IDirect3DMaterial3_GetHandle((IDirect3DMaterial3 *)material_from_material2(iface), lpDirect3DDevice2 ? (IDirect3DDevice3 *)&device_from_device2(lpDirect3DDevice2)->IDirect3DDevice3_vtbl : NULL, lpHandle); } -static HRESULT WINAPI -Thunk_IDirect3DMaterialImpl_1_GetHandle(LPDIRECT3DMATERIAL iface, - LPDIRECT3DDEVICE lpDirect3DDevice, - LPD3DMATERIALHANDLE lpHandle) +static HRESULT WINAPI Thunk_IDirect3DMaterialImpl_1_GetHandle(IDirect3DMaterial *iface, + IDirect3DDevice *lpDirect3DDevice, D3DMATERIALHANDLE *lpHandle) { - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpDirect3DDevice, lpHandle); + TRACE("iface %p, device %p, handle %p.\n", iface, lpDirect3DDevice, lpHandle); + return IDirect3DMaterial3_GetHandle((IDirect3DMaterial3 *)material_from_material1(iface), lpDirect3DDevice ? (IDirect3DDevice3 *)&device_from_device1(lpDirect3DDevice)->IDirect3DDevice3_vtbl : NULL, lpHandle); } @@ -370,7 +349,8 @@ Thunk_IDirect3DMaterialImpl_2_QueryInterface(LPDIRECT3DMATERIAL2 iface, REFIID riid, LPVOID* obp) { - TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DMaterial3 interface.\n", iface, debugstr_guid(riid), obp); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp); + return IDirect3DMaterial3_QueryInterface((IDirect3DMaterial3 *)material_from_material2(iface), riid, obp); } @@ -379,35 +359,40 @@ Thunk_IDirect3DMaterialImpl_1_QueryInterface(LPDIRECT3DMATERIAL iface, REFIID riid, LPVOID* obp) { - TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DMaterial3 interface.\n", iface, debugstr_guid(riid), obp); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp); + return IDirect3DMaterial3_QueryInterface((IDirect3DMaterial3 *)material_from_material1(iface), riid, obp); } static ULONG WINAPI Thunk_IDirect3DMaterialImpl_2_AddRef(LPDIRECT3DMATERIAL2 iface) { - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DMaterial3 interface.\n", iface); + TRACE("iface %p.\n", iface); + return IDirect3DMaterial3_AddRef((IDirect3DMaterial3 *)material_from_material2(iface)); } static ULONG WINAPI Thunk_IDirect3DMaterialImpl_1_AddRef(LPDIRECT3DMATERIAL iface) { - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DMaterial3 interface.\n", iface); + TRACE("iface %p.\n", iface); + return IDirect3DMaterial3_AddRef((IDirect3DMaterial3 *)material_from_material1(iface)); } static ULONG WINAPI Thunk_IDirect3DMaterialImpl_2_Release(LPDIRECT3DMATERIAL2 iface) { - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DMaterial3 interface.\n", iface); + TRACE("iface %p.\n", iface); + return IDirect3DMaterial3_Release((IDirect3DMaterial3 *)material_from_material2(iface)); } static ULONG WINAPI Thunk_IDirect3DMaterialImpl_1_Release(LPDIRECT3DMATERIAL iface) { - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DMaterial3 interface.\n", iface); + TRACE("iface %p.\n", iface); + return IDirect3DMaterial3_Release((IDirect3DMaterial3 *)material_from_material1(iface)); } @@ -415,7 +400,8 @@ static HRESULT WINAPI Thunk_IDirect3DMaterialImpl_2_SetMaterial(LPDIRECT3DMATERIAL2 iface, LPD3DMATERIAL lpMat) { - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpMat); + TRACE("iface %p, material %p.\n", iface, lpMat); + return IDirect3DMaterial3_SetMaterial((IDirect3DMaterial3 *)material_from_material2(iface), lpMat); } @@ -423,7 +409,8 @@ static HRESULT WINAPI Thunk_IDirect3DMaterialImpl_1_SetMaterial(LPDIRECT3DMATERIAL iface, LPD3DMATERIAL lpMat) { - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpMat); + TRACE("iface %p, material %p.\n", iface, lpMat); + return IDirect3DMaterial3_SetMaterial((IDirect3DMaterial3 *)material_from_material1(iface), lpMat); } @@ -431,7 +418,8 @@ static HRESULT WINAPI Thunk_IDirect3DMaterialImpl_2_GetMaterial(LPDIRECT3DMATERIAL2 iface, LPD3DMATERIAL lpMat) { - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpMat); + TRACE("iface %p, material %p.\n", iface, lpMat); + return IDirect3DMaterial3_GetMaterial((IDirect3DMaterial3 *)material_from_material2(iface), lpMat); } @@ -439,7 +427,8 @@ static HRESULT WINAPI Thunk_IDirect3DMaterialImpl_1_GetMaterial(LPDIRECT3DMATERIAL iface, LPD3DMATERIAL lpMat) { - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpMat); + TRACE("iface %p, material %p.\n", iface, lpMat); + return IDirect3DMaterial3_GetMaterial((IDirect3DMaterial3 *)material_from_material1(iface), lpMat); } @@ -467,7 +456,7 @@ void material_activate(IDirect3DMaterialImpl* This) IDirect3DDevice7_SetMaterial((IDirect3DDevice7 *)This->active_device, &d3d7mat); } -const IDirect3DMaterial3Vtbl IDirect3DMaterial3_Vtbl = +static const struct IDirect3DMaterial3Vtbl d3d_material3_vtbl = { /*** IUnknown Methods ***/ IDirect3DMaterialImpl_QueryInterface, @@ -479,7 +468,7 @@ const IDirect3DMaterial3Vtbl IDirect3DMaterial3_Vtbl = IDirect3DMaterialImpl_GetHandle, }; -const IDirect3DMaterial2Vtbl IDirect3DMaterial2_Vtbl = +static const struct IDirect3DMaterial2Vtbl d3d_material2_vtbl = { /*** IUnknown Methods ***/ Thunk_IDirect3DMaterialImpl_2_QueryInterface, @@ -491,7 +480,7 @@ const IDirect3DMaterial2Vtbl IDirect3DMaterial2_Vtbl = Thunk_IDirect3DMaterialImpl_2_GetHandle, }; -const IDirect3DMaterialVtbl IDirect3DMaterial_Vtbl = +static const struct IDirect3DMaterialVtbl d3d_material1_vtbl = { /*** IUnknown Methods ***/ Thunk_IDirect3DMaterialImpl_1_QueryInterface, @@ -505,3 +494,12 @@ const IDirect3DMaterialVtbl IDirect3DMaterial_Vtbl = IDirect3DMaterialImpl_Reserve, IDirect3DMaterialImpl_Unreserve }; + +void d3d_material_init(IDirect3DMaterialImpl *material, IDirectDrawImpl *ddraw) +{ + material->lpVtbl = &d3d_material3_vtbl; + material->IDirect3DMaterial2_vtbl = &d3d_material2_vtbl; + material->IDirect3DMaterial_vtbl = &d3d_material1_vtbl; + material->ref = 1; + material->ddraw = ddraw; +} diff --git a/dll/directx/wine/ddraw/palette.c b/dll/directx/wine/ddraw/palette.c index 9ef0a7ce031..7064ba02790 100644 --- a/dll/directx/wine/ddraw/palette.c +++ b/dll/directx/wine/ddraw/palette.c @@ -1,5 +1,4 @@ -/* DirectDraw - IDirectPalette base interface - * +/* * Copyright 2006 Stefan Dテカsinger * * This library is free software; you can redistribute it and/or @@ -18,13 +17,7 @@ */ #include "config.h" -#include "winerror.h" -#include "wine/debug.h" - -#define COBJMACROS - -#include -#include +#include "wine/port.h" #include "ddraw_private.h" @@ -49,8 +42,7 @@ IDirectDrawPaletteImpl_QueryInterface(IDirectDrawPalette *iface, REFIID refiid, void **obj) { - IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface; - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(refiid), obj); if (IsEqualGUID(refiid, &IID_IUnknown) || IsEqualGUID(refiid, &IID_IDirectDrawPalette)) @@ -81,7 +73,7 @@ IDirectDrawPaletteImpl_AddRef(IDirectDrawPalette *iface) IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->() incrementing from %u.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -101,7 +93,7 @@ IDirectDrawPaletteImpl_Release(IDirectDrawPalette *iface) IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (ref == 0) { @@ -139,7 +131,9 @@ IDirectDrawPaletteImpl_Initialize(IDirectDrawPalette *iface, DWORD Flags, PALETTEENTRY *ColorTable) { - TRACE("(%p)->(%p,%x,%p)\n", iface, DD, Flags, ColorTable); + TRACE("iface %p, ddraw %p, flags %#x, entries %p.\n", + iface, DD, Flags, ColorTable); + return DDERR_ALREADYINITIALIZED; } @@ -163,7 +157,8 @@ IDirectDrawPaletteImpl_GetCaps(IDirectDrawPalette *iface, { IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p): Relay\n", This, Caps); + + TRACE("iface %p, caps %p.\n", iface, Caps); EnterCriticalSection(&ddraw_cs); hr = IWineD3DPalette_GetCaps(This->wineD3DPalette, Caps); @@ -198,7 +193,9 @@ IDirectDrawPaletteImpl_SetEntries(IDirectDrawPalette *iface, { IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface; HRESULT hr; - TRACE("(%p)->(%x,%d,%d,%p): Relay\n", This, Flags, Start, Count, PalEnt); + + TRACE("iface %p, flags %#x, start %u, count %u, entries %p.\n", + iface, Flags, Start, Count, PalEnt); if(!PalEnt) return DDERR_INVALIDPARAMS; @@ -235,7 +232,9 @@ IDirectDrawPaletteImpl_GetEntries(IDirectDrawPalette *iface, { IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface; HRESULT hr; - TRACE("(%p)->(%x,%d,%d,%p): Relay\n", This, Flags, Start, Count, PalEnt); + + TRACE("iface %p, flags %#x, start %u, count %u, entries %p.\n", + iface, Flags, Start, Count, PalEnt); if(!PalEnt) return DDERR_INVALIDPARAMS; @@ -246,7 +245,7 @@ IDirectDrawPaletteImpl_GetEntries(IDirectDrawPalette *iface, return hr; } -const IDirectDrawPaletteVtbl IDirectDrawPalette_Vtbl = +static const struct IDirectDrawPaletteVtbl ddraw_palette_vtbl = { /*** IUnknown ***/ IDirectDrawPaletteImpl_QueryInterface, @@ -258,3 +257,25 @@ const IDirectDrawPaletteVtbl IDirectDrawPalette_Vtbl = IDirectDrawPaletteImpl_Initialize, IDirectDrawPaletteImpl_SetEntries }; + +HRESULT ddraw_palette_init(IDirectDrawPaletteImpl *palette, + IDirectDrawImpl *ddraw, DWORD flags, PALETTEENTRY *entries) +{ + HRESULT hr; + + palette->lpVtbl = &ddraw_palette_vtbl; + palette->ref = 1; + + hr = IWineD3DDevice_CreatePalette(ddraw->wineD3DDevice, flags, + entries, palette, &palette->wineD3DPalette); + if (FAILED(hr)) + { + WARN("Failed to create wined3d palette, hr %#x.\n", hr); + return hr; + } + + palette->ifaceToRelease = (IUnknown *)ddraw; + IUnknown_AddRef(palette->ifaceToRelease); + + return DD_OK; +} diff --git a/dll/directx/wine/ddraw/parent.c b/dll/directx/wine/ddraw/parent.c index 473152ed740..871f0660e6e 100644 --- a/dll/directx/wine/ddraw/parent.c +++ b/dll/directx/wine/ddraw/parent.c @@ -23,23 +23,6 @@ #include "config.h" #include "wine/port.h" -#include "wine/debug.h" - -#include -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" #include "ddraw_private.h" @@ -68,7 +51,7 @@ IParentImpl_QueryInterface(IParent *iface, REFIID riid, void **obj) { - TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); *obj = NULL; if ( IsEqualGUID( &IID_IUnknown, riid ) || @@ -98,7 +81,7 @@ IParentImpl_AddRef(IParent *iface) IParentImpl *This = (IParentImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p) : AddRef from %d\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -122,7 +105,7 @@ static ULONG WINAPI IParentImpl_Release(IParent *iface) IParentImpl *This = (IParentImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p) : ReleaseRef to %d\n", This, ref); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (ref == 0) { @@ -138,9 +121,15 @@ static ULONG WINAPI IParentImpl_Release(IParent *iface) /***************************************************************************** * The VTable *****************************************************************************/ -const IParentVtbl IParent_Vtbl = +static const struct IParentVtbl ddraw_parent_vtbl = { IParentImpl_QueryInterface, IParentImpl_AddRef, IParentImpl_Release, }; + +void ddraw_parent_init(IParentImpl *parent) +{ + parent->lpVtbl = &ddraw_parent_vtbl; + parent->ref = 1; +} diff --git a/dll/directx/wine/ddraw/regsvr.c b/dll/directx/wine/ddraw/regsvr.c index 6ab75d12043..52a6fb77bda 100644 --- a/dll/directx/wine/ddraw/regsvr.c +++ b/dll/directx/wine/ddraw/regsvr.c @@ -18,20 +18,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include -#include +#include "config.h" +#include "wine/port.h" -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "wingdi.h" -#include "winuser.h" -#include "winerror.h" - -#include "ddraw.h" - -#include "wine/debug.h" +#include "ddraw_private.h" #include "wine/unicode.h" +#include "winreg.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw); diff --git a/dll/directx/wine/ddraw/surface.c b/dll/directx/wine/ddraw/surface.c index 44be26c86bf..cff2f95aab4 100644 --- a/dll/directx/wine/ddraw/surface.c +++ b/dll/directx/wine/ddraw/surface.c @@ -26,28 +26,16 @@ #include "config.h" #include "wine/port.h" -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - #include "ddraw_private.h" -#include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw); +static inline IDirectDrawSurfaceImpl *surface_from_gamma_control(IDirectDrawGammaControl *iface) +{ + return (IDirectDrawSurfaceImpl *)((char*)iface + - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirectDrawGammaControl_vtbl)); +} + /***************************************************************************** * IUnknown parts follow *****************************************************************************/ @@ -70,20 +58,18 @@ WINE_DEFAULT_DEBUG_CHANNEL(ddraw); * E_NOINTERFACE if the requested interface wasn't found * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_QueryInterface(IDirectDrawSurface7 *iface, - REFIID riid, - void **obj) +static HRESULT WINAPI ddraw_surface7_QueryInterface(IDirectDrawSurface7 *iface, REFIID riid, void **obj) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); + /* According to COM docs, if the QueryInterface fails, obj should be set to NULL */ *obj = NULL; if(!riid) return DDERR_INVALIDPARAMS; - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),obj); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirectDrawSurface7) || IsEqualGUID(riid, &IID_IDirectDrawSurface4) ) @@ -118,10 +104,15 @@ IDirectDrawSurfaceImpl_QueryInterface(IDirectDrawSurface7 *iface, /* Call into IDirect3D7 for creation */ IDirect3D7_CreateDevice((IDirect3D7 *)&This->ddraw->IDirect3D7_vtbl, riid, (IDirectDrawSurface7 *)This, &d3d); - *obj = d3d ? (IDirect3DDevice *)&((IDirect3DDeviceImpl *)d3d)->IDirect3DDevice_vtbl : NULL; - TRACE("(%p) Returning IDirect3DDevice interface at %p\n", This, *obj); + if (d3d) + { + *obj = (IDirect3DDevice *)&((IDirect3DDeviceImpl *)d3d)->IDirect3DDevice_vtbl; + TRACE("(%p) Returning IDirect3DDevice interface at %p\n", This, *obj); + return S_OK; + } - return S_OK; + WARN("Unable to create a IDirect3DDevice instance, returning E_NOINTERFACE\n"); + return E_NOINTERFACE; } else if (IsEqualGUID( &IID_IDirect3DTexture, riid ) || IsEqualGUID( &IID_IDirect3DTexture2, riid )) @@ -144,6 +135,34 @@ IDirectDrawSurfaceImpl_QueryInterface(IDirectDrawSurface7 *iface, return E_NOINTERFACE; } +static HRESULT WINAPI ddraw_surface3_QueryInterface(IDirectDrawSurface3 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw_surface7_QueryInterface((IDirectDrawSurface7 *)surface_from_surface3(iface), riid, object); +} + +static HRESULT WINAPI ddraw_gamma_control_QueryInterface(IDirectDrawGammaControl *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw_surface7_QueryInterface((IDirectDrawSurface7 *)surface_from_gamma_control(iface), riid, object); +} + +static HRESULT WINAPI d3d_texture2_QueryInterface(IDirect3DTexture2 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw_surface7_QueryInterface((IDirectDrawSurface7 *)surface_from_texture2(iface), riid, object); +} + +static HRESULT WINAPI d3d_texture1_QueryInterface(IDirect3DTexture *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw_surface7_QueryInterface((IDirectDrawSurface7 *)surface_from_texture1(iface), riid, object); +} + /***************************************************************************** * IDirectDrawSurface7::AddRef * @@ -153,12 +172,13 @@ IDirectDrawSurfaceImpl_QueryInterface(IDirectDrawSurface7 *iface, * The new refcount * *****************************************************************************/ -static ULONG WINAPI -IDirectDrawSurfaceImpl_AddRef(IDirectDrawSurface7 *iface) +static ULONG WINAPI ddraw_surface7_AddRef(IDirectDrawSurface7 *iface) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; ULONG refCount = InterlockedIncrement(&This->ref); + TRACE("%p increasing refcount to %u.\n", This, refCount); + if (refCount == 1 && This->WineD3DSurface) { EnterCriticalSection(&ddraw_cs); @@ -166,12 +186,39 @@ IDirectDrawSurfaceImpl_AddRef(IDirectDrawSurface7 *iface) LeaveCriticalSection(&ddraw_cs); } - TRACE("(%p) : AddRef increasing from %d\n", This, refCount - 1); return refCount; } +static ULONG WINAPI ddraw_surface3_AddRef(IDirectDrawSurface3 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_AddRef((IDirectDrawSurface7 *)surface_from_surface3(iface)); +} + +static ULONG WINAPI ddraw_gamma_control_AddRef(IDirectDrawGammaControl *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_AddRef((IDirectDrawSurface7 *)surface_from_gamma_control(iface)); +} + +static ULONG WINAPI d3d_texture2_AddRef(IDirect3DTexture2 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_AddRef((IDirectDrawSurface7 *)surface_from_texture2(iface)); +} + +static ULONG WINAPI d3d_texture1_AddRef(IDirect3DTexture *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_AddRef((IDirectDrawSurface7 *)surface_from_texture1(iface)); +} + /***************************************************************************** - * IDirectDrawSurfaceImpl_Destroy + * ddraw_surface_destroy * * A helper function for IDirectDrawSurface7::Release * @@ -182,9 +229,9 @@ IDirectDrawSurfaceImpl_AddRef(IDirectDrawSurface7 *iface) * This: Surface to free * *****************************************************************************/ -void IDirectDrawSurfaceImpl_Destroy(IDirectDrawSurfaceImpl *This) +void ddraw_surface_destroy(IDirectDrawSurfaceImpl *This) { - TRACE("(%p)\n", This); + TRACE("surface %p.\n", This); /* Check the refcount and give a warning */ if(This->ref > 1) @@ -235,8 +282,7 @@ void IDirectDrawSurfaceImpl_Destroy(IDirectDrawSurfaceImpl *This) /* Having a texture handle set implies that the device still exists */ if(This->Handle) { - This->ddraw->d3ddevice->Handles[This->Handle - 1].ptr = NULL; - This->ddraw->d3ddevice->Handles[This->Handle - 1].type = DDrawHandle_Unknown; + ddraw_free_handle(&This->ddraw->d3ddevice->handle_table, This->Handle - 1, DDRAW_HANDLE_SURFACE); } /* Reduce the ddraw surface count */ @@ -275,13 +321,12 @@ void IDirectDrawSurfaceImpl_Destroy(IDirectDrawSurfaceImpl *This) * The new refcount * *****************************************************************************/ -static ULONG WINAPI -IDirectDrawSurfaceImpl_Release(IDirectDrawSurface7 *iface) +static ULONG WINAPI ddraw_surface7_Release(IDirectDrawSurface7 *iface) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - ULONG ref; - TRACE("(%p) : Releasing from %d\n", This, This->ref); - ref = InterlockedDecrement(&This->ref); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("%p decreasing refcount to %u.\n", This, ref); if (ref == 0) { @@ -385,13 +430,12 @@ IDirectDrawSurfaceImpl_Release(IDirectDrawSurface7 *iface) { IDirectDrawSurfaceImpl *destroy = surf; surf = surf->complex_array[0]; /* Iterate through the "tree" */ - IDirectDrawSurfaceImpl_Destroy(destroy); /* Destroy it */ + ddraw_surface_destroy(destroy); /* Destroy it */ } } - /* Destroy the root surface. - */ - IDirectDrawSurfaceImpl_Destroy(This); + /* Destroy the root surface. */ + ddraw_surface_destroy(This); /* Reduce the ddraw refcount */ if(ifaceToRelease) IUnknown_Release(ifaceToRelease); @@ -401,6 +445,34 @@ IDirectDrawSurfaceImpl_Release(IDirectDrawSurface7 *iface) return ref; } +static ULONG WINAPI ddraw_surface3_Release(IDirectDrawSurface3 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_Release((IDirectDrawSurface7 *)surface_from_surface3(iface)); +} + +static ULONG WINAPI ddraw_gamma_control_Release(IDirectDrawGammaControl *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_Release((IDirectDrawSurface7 *)surface_from_gamma_control(iface)); +} + +static ULONG WINAPI d3d_texture2_Release(IDirect3DTexture2 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_Release((IDirectDrawSurface7 *)surface_from_texture2(iface)); +} + +static ULONG WINAPI d3d_texture1_Release(IDirect3DTexture *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_Release((IDirectDrawSurface7 *)surface_from_texture1(iface)); +} + /***************************************************************************** * IDirectDrawSurface7::GetAttachedSurface * @@ -428,17 +500,16 @@ IDirectDrawSurfaceImpl_Release(IDirectDrawSurface7 *iface) * DDERR_NOTFOUND if no surface was found * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetAttachedSurface(IDirectDrawSurface7 *iface, - DDSCAPS2 *Caps, - IDirectDrawSurface7 **Surface) +static HRESULT WINAPI ddraw_surface7_GetAttachedSurface(IDirectDrawSurface7 *iface, + DDSCAPS2 *Caps, IDirectDrawSurface7 **Surface) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawSurfaceImpl *surf; DDSCAPS2 our_caps; int i; - TRACE("(%p)->(%p,%p)\n", This, Caps, Surface); + TRACE("iface %p, caps %p, attachment %p.\n", iface, Caps, Surface); + EnterCriticalSection(&ddraw_cs); if(This->version < 7) @@ -482,7 +553,7 @@ IDirectDrawSurfaceImpl_GetAttachedSurface(IDirectDrawSurface7 *iface, TRACE("(%p): Returning surface %p\n", This, surf); TRACE("(%p): mipmapcount=%d\n", This, surf->mipmap_level); *Surface = (IDirectDrawSurface7 *)surf; - IDirectDrawSurface7_AddRef(*Surface); + ddraw_surface7_AddRef(*Surface); LeaveCriticalSection(&ddraw_cs); return DD_OK; } @@ -507,7 +578,7 @@ IDirectDrawSurfaceImpl_GetAttachedSurface(IDirectDrawSurface7 *iface, TRACE("(%p): Returning surface %p\n", This, surf); *Surface = (IDirectDrawSurface7 *)surf; - IDirectDrawSurface7_AddRef(*Surface); + ddraw_surface7_AddRef(*Surface); LeaveCriticalSection(&ddraw_cs); return DD_OK; } @@ -520,6 +591,29 @@ IDirectDrawSurfaceImpl_GetAttachedSurface(IDirectDrawSurface7 *iface, return DDERR_NOTFOUND; } +static HRESULT WINAPI ddraw_surface3_GetAttachedSurface(IDirectDrawSurface3 *iface, + DDSCAPS *caps, IDirectDrawSurface3 **attachment) +{ + IDirectDrawSurface7 *attachment7; + DDSCAPS2 caps2; + HRESULT hr; + + TRACE("iface %p, caps %p, attachment %p.\n", iface, caps, attachment); + + caps2.dwCaps = caps->dwCaps; + caps2.dwCaps2 = 0; + caps2.dwCaps3 = 0; + caps2.u1.dwCaps4 = 0; + + hr = ddraw_surface7_GetAttachedSurface((IDirectDrawSurface7 *)surface_from_surface3(iface), + &caps2, &attachment7); + if (FAILED(hr)) *attachment = NULL; + else *attachment = attachment7 ? + (IDirectDrawSurface3 *)&((IDirectDrawSurfaceImpl *)attachment7)->IDirectDrawSurface3_vtbl : NULL; + + return hr; +} + /***************************************************************************** * IDirectDrawSurface7::Lock * @@ -537,17 +631,15 @@ IDirectDrawSurfaceImpl_GetAttachedSurface(IDirectDrawSurface7 *iface, * For more details, see IWineD3DSurface::LockRect * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_Lock(IDirectDrawSurface7 *iface, - RECT *Rect, - DDSURFACEDESC2 *DDSD, - DWORD Flags, - HANDLE h) +static HRESULT WINAPI ddraw_surface7_Lock(IDirectDrawSurface7 *iface, + RECT *Rect, DDSURFACEDESC2 *DDSD, DWORD Flags, HANDLE h) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; WINED3DLOCKED_RECT LockedRect; HRESULT hr; - TRACE("(%p)->(%p,%p,%x,%p)\n", This, Rect, DDSD, Flags, h); + + TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n", + iface, wine_dbgstr_rect(Rect), DDSD, Flags, h); if(!DDSD) return DDERR_INVALIDPARAMS; @@ -621,6 +713,16 @@ IDirectDrawSurfaceImpl_Lock(IDirectDrawSurface7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw_surface3_Lock(IDirectDrawSurface3 *iface, RECT *rect, + DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h) +{ + TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n", + iface, wine_dbgstr_rect(rect), surface_desc, flags, h); + + return ddraw_surface7_Lock((IDirectDrawSurface7 *)surface_from_surface3(iface), + rect, (DDSURFACEDESC2 *)surface_desc, flags, h); +} + /***************************************************************************** * IDirectDrawSurface7::Unlock * @@ -634,13 +736,12 @@ IDirectDrawSurfaceImpl_Lock(IDirectDrawSurface7 *iface, * For more details, see IWineD3DSurface::UnlockRect * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_Unlock(IDirectDrawSurface7 *iface, - RECT *pRect) +static HRESULT WINAPI ddraw_surface7_Unlock(IDirectDrawSurface7 *iface, RECT *pRect) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p)\n", This, pRect); + + TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(pRect)); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_UnlockRect(This->WineD3DSurface); @@ -652,6 +753,14 @@ IDirectDrawSurfaceImpl_Unlock(IDirectDrawSurface7 *iface, return hr; } +static HRESULT WINAPI ddraw_surface3_Unlock(IDirectDrawSurface3 *iface, void *data) +{ + TRACE("iface %p, data %p.\n", iface, data); + + /* data might not be the LPRECT of later versions, so drop it. */ + return ddraw_surface7_Unlock((IDirectDrawSurface7 *)surface_from_surface3(iface), NULL); +} + /***************************************************************************** * IDirectDrawSurface7::Flip * @@ -671,16 +780,14 @@ IDirectDrawSurfaceImpl_Unlock(IDirectDrawSurface7 *iface, * For more details, see IWineD3DSurface::Flip * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_Flip(IDirectDrawSurface7 *iface, - IDirectDrawSurface7 *DestOverride, - DWORD Flags) +static HRESULT WINAPI ddraw_surface7_Flip(IDirectDrawSurface7 *iface, IDirectDrawSurface7 *DestOverride, DWORD Flags) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawSurfaceImpl *Override = (IDirectDrawSurfaceImpl *)DestOverride; IDirectDrawSurface7 *Override7; HRESULT hr; - TRACE("(%p)->(%p,%x)\n", This, DestOverride, Flags); + + TRACE("iface %p, dst %p, flags %#x.\n", iface, DestOverride, Flags); /* Flip has to be called from a front buffer * What about overlay surfaces, AFAIK they can flip too? @@ -697,7 +804,7 @@ IDirectDrawSurfaceImpl_Flip(IDirectDrawSurface7 *iface, memset(&Caps, 0, sizeof(Caps)); Caps.dwCaps |= DDSCAPS_BACKBUFFER; - hr = IDirectDrawSurface7_GetAttachedSurface(iface, &Caps, &Override7); + hr = ddraw_surface7_GetAttachedSurface(iface, &Caps, &Override7); if(hr != DD_OK) { ERR("Can't find a flip target\n"); @@ -707,7 +814,7 @@ IDirectDrawSurfaceImpl_Flip(IDirectDrawSurface7 *iface, Override = (IDirectDrawSurfaceImpl *)Override7; /* For the GetAttachedSurface */ - IDirectDrawSurface7_Release(Override7); + ddraw_surface7_Release(Override7); } hr = IWineD3DSurface_Flip(This->WineD3DSurface, @@ -717,6 +824,14 @@ IDirectDrawSurfaceImpl_Flip(IDirectDrawSurface7 *iface, return hr; } +static HRESULT WINAPI ddraw_surface3_Flip(IDirectDrawSurface3 *iface, IDirectDrawSurface3 *dst, DWORD flags) +{ + TRACE("iface %p, dst %p, flags %#x.\n", iface, dst, flags); + + return ddraw_surface7_Flip((IDirectDrawSurface7 *)surface_from_surface3(iface), + dst ? (IDirectDrawSurface7 *)surface_from_surface3(dst) : NULL, flags); +} + /***************************************************************************** * IDirectDrawSurface7::Blt * @@ -734,18 +849,15 @@ IDirectDrawSurfaceImpl_Flip(IDirectDrawSurface7 *iface, * See IWineD3DSurface::Blt for more details * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_Blt(IDirectDrawSurface7 *iface, - RECT *DestRect, - IDirectDrawSurface7 *SrcSurface, - RECT *SrcRect, - DWORD Flags, - DDBLTFX *DDBltFx) +static HRESULT WINAPI ddraw_surface7_Blt(IDirectDrawSurface7 *iface, RECT *DestRect, + IDirectDrawSurface7 *SrcSurface, RECT *SrcRect, DWORD Flags, DDBLTFX *DDBltFx) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawSurfaceImpl *Src = (IDirectDrawSurfaceImpl *)SrcSurface; HRESULT hr; - TRACE("(%p)->(%p,%p,%p,%x,%p)\n", This, DestRect, Src, SrcRect, Flags, DDBltFx); + + TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %p, flags %#x, fx %p.\n", + iface, wine_dbgstr_rect(DestRect), SrcSurface, wine_dbgstr_rect(SrcRect), Flags, DDBltFx); /* Check for validity of the flags here. WineD3D Has the software-opengl selection path and would have * to check at 2 places, and sometimes do double checks. This also saves the call to wined3d :-) @@ -812,6 +924,16 @@ IDirectDrawSurfaceImpl_Blt(IDirectDrawSurface7 *iface, } } +static HRESULT WINAPI ddraw_surface3_Blt(IDirectDrawSurface3 *iface, RECT *dst_rect, + IDirectDrawSurface3 *src_surface, RECT *src_rect, DWORD flags, DDBLTFX *fx) +{ + TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %p, flags %#x, fx %p.\n", + iface, wine_dbgstr_rect(dst_rect), src_surface, wine_dbgstr_rect(src_rect), flags, fx); + + return ddraw_surface7_Blt((IDirectDrawSurface7 *)surface_from_surface3(iface), dst_rect, + src_surface ? (IDirectDrawSurface7 *)surface_from_surface3(src_surface) : NULL, src_rect, flags, fx); +} + /***************************************************************************** * IDirectDrawSurface7::AddAttachedSurface * @@ -843,8 +965,8 @@ IDirectDrawSurfaceImpl_Blt(IDirectDrawSurface7 *iface, * switching between that and double buffering is not yet implemented in * WineD3D, so for 3D it might have unexpected results. * - * IDirectDrawSurfaceImpl_AddAttachedSurface is the real thing, - * IDirectDrawSurface7Impl_AddAttachedSurface is a wrapper around it that + * ddraw_surface_attach_surface is the real thing, + * ddraw_surface7_AddAttachedSurface is a wrapper around it that * performs additional checks. Version 7 of this interface is much more restrictive * than its predecessors. * @@ -856,11 +978,9 @@ IDirectDrawSurfaceImpl_Blt(IDirectDrawSurface7 *iface, * DDERR_CANNOTATTACHSURFACE if the surface can't be attached for some reason * *****************************************************************************/ -HRESULT WINAPI -IDirectDrawSurfaceImpl_AddAttachedSurface(IDirectDrawSurfaceImpl *This, - IDirectDrawSurfaceImpl *Surf) +static HRESULT ddraw_surface_attach_surface(IDirectDrawSurfaceImpl *This, IDirectDrawSurfaceImpl *Surf) { - TRACE("(%p)->(%p)\n", This, Surf); + TRACE("surface %p, attachment %p.\n", This, Surf); if(Surf == This) return DDERR_CANNOTATTACHSURFACE; /* unchecked */ @@ -868,13 +988,14 @@ IDirectDrawSurfaceImpl_AddAttachedSurface(IDirectDrawSurfaceImpl *This, EnterCriticalSection(&ddraw_cs); /* Check if the surface is already attached somewhere */ - if( (Surf->next_attached != NULL) || - (Surf->first_attached != Surf) ) + if (Surf->next_attached || Surf->first_attached != Surf) { - /* TODO: Test for the structure of the manual attachment. Is it a chain or a list? - * What happens if one surface is attached to 2 different surfaces? - */ - FIXME("(%p) The Surface %p is already attached somewhere else: next_attached = %p, first_attached = %p, can't handle by now\n", This, Surf, Surf->next_attached, Surf->first_attached); + /* TODO: Test for the structure of the manual attachment. Is it a + * chain or a list? What happens if one surface is attached to 2 + * different surfaces? */ + WARN("Surface %p is already attached somewhere. next_attached %p, first_attached %p.\n", + Surf, Surf->next_attached, Surf->first_attached); + LeaveCriticalSection(&ddraw_cs); return DDERR_SURFACEALREADYATTACHED; } @@ -890,18 +1011,18 @@ IDirectDrawSurfaceImpl_AddAttachedSurface(IDirectDrawSurfaceImpl *This, IDirect3DDeviceImpl_UpdateDepthStencil(This->ddraw->d3ddevice); } - IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)Surf); + ddraw_surface7_AddRef((IDirectDrawSurface7 *)Surf); LeaveCriticalSection(&ddraw_cs); return DD_OK; } -static HRESULT WINAPI -IDirectDrawSurface7Impl_AddAttachedSurface(IDirectDrawSurface7 *iface, - IDirectDrawSurface7 *Attach) +static HRESULT WINAPI ddraw_surface7_AddAttachedSurface(IDirectDrawSurface7 *iface, IDirectDrawSurface7 *Attach) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawSurfaceImpl *Surf = (IDirectDrawSurfaceImpl *)Attach; + TRACE("iface %p, attachment %p.\n", iface, Attach); + /* Version 7 of this interface seems to refuse everything except z buffers, as per msdn */ if(!(Surf->surface_desc.ddsCaps.dwCaps & DDSCAPS_ZBUFFER)) { @@ -911,9 +1032,47 @@ IDirectDrawSurface7Impl_AddAttachedSurface(IDirectDrawSurface7 *iface, return DDERR_CANNOTATTACHSURFACE; } - return IDirectDrawSurfaceImpl_AddAttachedSurface(This, - Surf); + return ddraw_surface_attach_surface(This, Surf); } + +static HRESULT WINAPI ddraw_surface3_AddAttachedSurface(IDirectDrawSurface3 *iface, IDirectDrawSurface3 *attachment) +{ + IDirectDrawSurfaceImpl *surface = surface_from_surface3(iface); + IDirectDrawSurfaceImpl *attach_impl = surface_from_surface3(attachment); + + TRACE("iface %p, attachment %p.\n", iface, attachment); + + /* Tests suggest that + * -> offscreen plain surfaces can be attached to other offscreen plain surfaces + * -> offscreen plain surfaces can be attached to primaries + * -> primaries can be attached to offscreen plain surfaces + * -> z buffers can be attached to primaries */ + if (surface->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN) + && attach_impl->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN)) + { + /* Sizes have to match */ + if (attach_impl->surface_desc.dwWidth != surface->surface_desc.dwWidth + || attach_impl->surface_desc.dwHeight != surface->surface_desc.dwHeight) + { + WARN("Surface sizes do not match.\n"); + return DDERR_CANNOTATTACHSURFACE; + } + /* OK */ + } + else if (surface->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE) + && attach_impl->surface_desc.ddsCaps.dwCaps & (DDSCAPS_ZBUFFER)) + { + /* OK */ + } + else + { + WARN("Invalid attachment combination.\n"); + return DDERR_CANNOTATTACHSURFACE; + } + + return ddraw_surface_attach_surface(surface, attach_impl); +} + /***************************************************************************** * IDirectDrawSurface7::DeleteAttachedSurface * @@ -929,15 +1088,14 @@ IDirectDrawSurface7Impl_AddAttachedSurface(IDirectDrawSurface7 *iface, * DDERR_SURFACENOTATTACHED if the surface isn't attached to * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_DeleteAttachedSurface(IDirectDrawSurface7 *iface, - DWORD Flags, - IDirectDrawSurface7 *Attach) +static HRESULT WINAPI ddraw_surface7_DeleteAttachedSurface(IDirectDrawSurface7 *iface, + DWORD Flags, IDirectDrawSurface7 *Attach) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawSurfaceImpl *Surf = (IDirectDrawSurfaceImpl *)Attach; IDirectDrawSurfaceImpl *Prev = This; - TRACE("(%p)->(%08x,%p)\n", This, Flags, Surf); + + TRACE("iface %p, flags %#x, attachment %p.\n", iface, Flags, Attach); EnterCriticalSection(&ddraw_cs); if (!Surf || (Surf->first_attached != This) || (Surf == This) ) @@ -976,11 +1134,20 @@ IDirectDrawSurfaceImpl_DeleteAttachedSurface(IDirectDrawSurface7 *iface, IDirect3DDeviceImpl_UpdateDepthStencil(This->ddraw->d3ddevice); } - IDirectDrawSurface7_Release(Attach); + ddraw_surface7_Release(Attach); LeaveCriticalSection(&ddraw_cs); return DD_OK; } +static HRESULT WINAPI ddraw_surface3_DeleteAttachedSurface(IDirectDrawSurface3 *iface, + DWORD flags, IDirectDrawSurface3 *attachment) +{ + TRACE("iface %p, flags %#x, attachment %p.\n", iface, flags, attachment); + + return ddraw_surface7_DeleteAttachedSurface((IDirectDrawSurface7 *)surface_from_surface3(iface), flags, + attachment ? (IDirectDrawSurface7 *)surface_from_surface3(attachment) : NULL); +} + /***************************************************************************** * IDirectDrawSurface7::AddOverlayDirtyRect * @@ -993,23 +1160,20 @@ IDirectDrawSurfaceImpl_DeleteAttachedSurface(IDirectDrawSurface7 *iface, * DDERR_UNSUPPORTED * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_AddOverlayDirtyRect(IDirectDrawSurface7 *iface, - LPRECT Rect) +static HRESULT WINAPI ddraw_surface7_AddOverlayDirtyRect(IDirectDrawSurface7 *iface, RECT *Rect) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n",This,Rect); + TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(Rect)); - /* MSDN says it's not implemented. I could forward it to WineD3D, - * then we'd implement it, but I don't think that's a good idea - * (Stefan Dテカsinger) - */ -#if 0 - return IWineD3DSurface_AddOverlayDirtyRect(This->WineD3DSurface, pRect); -#endif return DDERR_UNSUPPORTED; /* unchecked */ } +static HRESULT WINAPI ddraw_surface3_AddOverlayDirtyRect(IDirectDrawSurface3 *iface, RECT *rect) +{ + TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(rect)); + + return ddraw_surface7_AddOverlayDirtyRect((IDirectDrawSurface7 *)surface_from_surface3(iface), rect); +} + /***************************************************************************** * IDirectDrawSurface7::GetDC * @@ -1024,13 +1188,12 @@ IDirectDrawSurfaceImpl_AddOverlayDirtyRect(IDirectDrawSurface7 *iface, * For details, see IWineD3DSurface::GetDC * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetDC(IDirectDrawSurface7 *iface, - HDC *hdc) +static HRESULT WINAPI ddraw_surface7_GetDC(IDirectDrawSurface7 *iface, HDC *hdc) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p): Relay\n", This, hdc); + + TRACE("iface %p, dc %p.\n", iface, hdc); if(!hdc) return DDERR_INVALIDPARAMS; @@ -1052,6 +1215,13 @@ IDirectDrawSurfaceImpl_GetDC(IDirectDrawSurface7 *iface, } } +static HRESULT WINAPI ddraw_surface3_GetDC(IDirectDrawSurface3 *iface, HDC *dc) +{ + TRACE("iface %p, dc %p.\n", iface, dc); + + return ddraw_surface7_GetDC((IDirectDrawSurface7 *)surface_from_surface3(iface), dc); +} + /***************************************************************************** * IDirectDrawSurface7::ReleaseDC * @@ -1065,13 +1235,12 @@ IDirectDrawSurfaceImpl_GetDC(IDirectDrawSurface7 *iface, * For more details, see IWineD3DSurface::ReleaseDC * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_ReleaseDC(IDirectDrawSurface7 *iface, - HDC hdc) +static HRESULT WINAPI ddraw_surface7_ReleaseDC(IDirectDrawSurface7 *iface, HDC hdc) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p): Relay\n", This, hdc); + + TRACE("iface %p, dc %p.\n", iface, hdc); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_ReleaseDC(This->WineD3DSurface, hdc); @@ -1079,6 +1248,13 @@ IDirectDrawSurfaceImpl_ReleaseDC(IDirectDrawSurface7 *iface, return hr; } +static HRESULT WINAPI ddraw_surface3_ReleaseDC(IDirectDrawSurface3 *iface, HDC dc) +{ + TRACE("iface %p, dc %p.\n", iface, dc); + + return ddraw_surface7_ReleaseDC((IDirectDrawSurface7 *)surface_from_surface3(iface), dc); +} + /***************************************************************************** * IDirectDrawSurface7::GetCaps * @@ -1092,12 +1268,11 @@ IDirectDrawSurfaceImpl_ReleaseDC(IDirectDrawSurface7 *iface, * DDERR_INVALIDPARAMS if Caps is NULL * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetCaps(IDirectDrawSurface7 *iface, - DDSCAPS2 *Caps) +static HRESULT WINAPI ddraw_surface7_GetCaps(IDirectDrawSurface7 *iface, DDSCAPS2 *Caps) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n",This,Caps); + + TRACE("iface %p, caps %p.\n", iface, Caps); if(!Caps) return DDERR_INVALIDPARAMS; @@ -1106,6 +1281,20 @@ IDirectDrawSurfaceImpl_GetCaps(IDirectDrawSurface7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw_surface3_GetCaps(IDirectDrawSurface3 *iface, DDSCAPS *caps) +{ + DDSCAPS2 caps2; + HRESULT hr; + + TRACE("iface %p, caps %p.\n", iface, caps); + + hr = ddraw_surface7_GetCaps((IDirectDrawSurface7 *)surface_from_surface3(iface), &caps2); + if (FAILED(hr)) return hr; + + caps->dwCaps = caps2.dwCaps; + return hr; +} + /***************************************************************************** * IDirectDrawSurface7::SetPriority * @@ -1119,12 +1308,12 @@ IDirectDrawSurfaceImpl_GetCaps(IDirectDrawSurface7 *iface, * For more details, see IWineD3DSurface::SetPriority * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_SetPriority(IDirectDrawSurface7 *iface, DWORD Priority) +static HRESULT WINAPI ddraw_surface7_SetPriority(IDirectDrawSurface7 *iface, DWORD Priority) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%d): Relay!\n",This,Priority); + + TRACE("iface %p, priority %u.\n", iface, Priority); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_SetPriority(This->WineD3DSurface, Priority); @@ -1146,12 +1335,11 @@ IDirectDrawSurfaceImpl_SetPriority(IDirectDrawSurface7 *iface, DWORD Priority) * For more details, see IWineD3DSurface::GetPriority * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetPriority(IDirectDrawSurface7 *iface, - DWORD *Priority) +static HRESULT WINAPI ddraw_surface7_GetPriority(IDirectDrawSurface7 *iface, DWORD *Priority) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p): Relay\n",This,Priority); + + TRACE("iface %p, priority %p.\n", iface, Priority); if(!Priority) { @@ -1181,16 +1369,14 @@ IDirectDrawSurfaceImpl_GetPriority(IDirectDrawSurface7 *iface, * For more details, see IWineD3DSurface::SetPrivateData * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_SetPrivateData(IDirectDrawSurface7 *iface, - REFGUID tag, - void *Data, - DWORD Size, - DWORD Flags) +static HRESULT WINAPI ddraw_surface7_SetPrivateData(IDirectDrawSurface7 *iface, + REFGUID tag, void *Data, DWORD Size, DWORD Flags) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%s,%p,%d,%x): Relay\n", This, debugstr_guid(tag), Data, Size, Flags); + + TRACE("iface %p, tag %s, data %p, data_size %u, flags %#x.\n", + iface, debugstr_guid(tag), Data, Size, Flags); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_SetPrivateData(This->WineD3DSurface, @@ -1222,15 +1408,13 @@ IDirectDrawSurfaceImpl_SetPrivateData(IDirectDrawSurface7 *iface, * For more details, see IWineD3DSurface::GetPrivateData * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetPrivateData(IDirectDrawSurface7 *iface, - REFGUID tag, - void *Data, - DWORD *Size) +static HRESULT WINAPI ddraw_surface7_GetPrivateData(IDirectDrawSurface7 *iface, REFGUID tag, void *Data, DWORD *Size) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%s,%p,%p): Relay\n", This, debugstr_guid(tag), Data, Size); + + TRACE("iface %p, tag %s, data %p, data_size %p.\n", + iface, debugstr_guid(tag), Data, Size); if(!Data) return DDERR_INVALIDPARAMS; @@ -1257,13 +1441,12 @@ IDirectDrawSurfaceImpl_GetPrivateData(IDirectDrawSurface7 *iface, * For more details, see IWineD3DSurface::FreePrivateData * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_FreePrivateData(IDirectDrawSurface7 *iface, - REFGUID tag) +static HRESULT WINAPI ddraw_surface7_FreePrivateData(IDirectDrawSurface7 *iface, REFGUID tag) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%s): Relay\n", This, debugstr_guid(tag)); + + TRACE("iface %p, tag %s.\n", iface, debugstr_guid(tag)); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_FreePrivateData(This->WineD3DSurface, tag); @@ -1283,16 +1466,21 @@ IDirectDrawSurfaceImpl_FreePrivateData(IDirectDrawSurface7 *iface, * DD_OK, because it's a stub * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_PageLock(IDirectDrawSurface7 *iface, - DWORD Flags) +static HRESULT WINAPI ddraw_surface7_PageLock(IDirectDrawSurface7 *iface, DWORD Flags) { - TRACE("(%p)->(%x)\n", iface, Flags); + TRACE("iface %p, flags %#x.\n", iface, Flags); /* This is Windows memory management related - we don't need this */ return DD_OK; } +static HRESULT WINAPI ddraw_surface3_PageLock(IDirectDrawSurface3 *iface, DWORD flags) +{ + TRACE("iface %p, flags %#x.\n", iface, flags); + + return ddraw_surface7_PageLock((IDirectDrawSurface7 *)surface_from_surface3(iface), flags); +} + /***************************************************************************** * IDirectDrawSurface7::PageUnlock * @@ -1305,15 +1493,20 @@ IDirectDrawSurfaceImpl_PageLock(IDirectDrawSurface7 *iface, * DD_OK, because it's a stub * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_PageUnlock(IDirectDrawSurface7 *iface, - DWORD Flags) +static HRESULT WINAPI ddraw_surface7_PageUnlock(IDirectDrawSurface7 *iface, DWORD Flags) { - TRACE("(%p)->(%x)\n", iface, Flags); + TRACE("iface %p, flags %#x.\n", iface, Flags); return DD_OK; } +static HRESULT WINAPI ddraw_surface3_PageUnlock(IDirectDrawSurface3 *iface, DWORD flags) +{ + TRACE("iface %p, flags %#x.\n", iface, flags); + + return ddraw_surface7_PageUnlock((IDirectDrawSurface7 *)surface_from_surface3(iface), flags); +} + /***************************************************************************** * IDirectDrawSurface7::BltBatch * @@ -1326,14 +1519,21 @@ IDirectDrawSurfaceImpl_PageUnlock(IDirectDrawSurface7 *iface, * DDERR_UNSUPPORTED * *****************************************************************************/ -static HRESULT WINAPI IDirectDrawSurfaceImpl_BltBatch(IDirectDrawSurface7 *iface, DDBLTBATCH *Batch, DWORD Count, DWORD Flags) +static HRESULT WINAPI ddraw_surface7_BltBatch(IDirectDrawSurface7 *iface, DDBLTBATCH *Batch, DWORD Count, DWORD Flags) { - TRACE("(%p)->(%p,%d,%08x)\n",iface,Batch,Count,Flags); + TRACE("iface %p, batch %p, count %u, flags %#x.\n", iface, Batch, Count, Flags); /* MSDN: "not currently implemented" */ return DDERR_UNSUPPORTED; } +static HRESULT WINAPI ddraw_surface3_BltBatch(IDirectDrawSurface3 *iface, DDBLTBATCH *batch, DWORD count, DWORD flags) +{ + TRACE("iface %p, batch %p, count %u, flags %#x.\n", iface, batch, count, flags); + + return ddraw_surface7_BltBatch((IDirectDrawSurface7 *)surface_from_surface3(iface), batch, count, flags); +} + /***************************************************************************** * IDirectDrawSurface7::EnumAttachedSurfaces * @@ -1348,10 +1548,8 @@ static HRESULT WINAPI IDirectDrawSurfaceImpl_BltBatch(IDirectDrawSurface7 *iface * DDERR_INVALIDPARAMS if cb is NULL * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_EnumAttachedSurfaces(IDirectDrawSurface7 *iface, - void *context, - LPDDENUMSURFACESCALLBACK7 cb) +static HRESULT WINAPI ddraw_surface7_EnumAttachedSurfaces(IDirectDrawSurface7 *iface, + void *context, LPDDENUMSURFACESCALLBACK7 cb) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawSurfaceImpl *surf; @@ -1359,7 +1557,7 @@ IDirectDrawSurfaceImpl_EnumAttachedSurfaces(IDirectDrawSurface7 *iface, int i; /* Attached surfaces aren't handled in WineD3D */ - TRACE("(%p)->(%p,%p)\n",This,context,cb); + TRACE("iface %p, context %p, callback %p.\n", iface, context, cb); if(!cb) return DDERR_INVALIDPARAMS; @@ -1370,7 +1568,7 @@ IDirectDrawSurfaceImpl_EnumAttachedSurfaces(IDirectDrawSurface7 *iface, surf = This->complex_array[i]; if(!surf) break; - IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)surf); + ddraw_surface7_AddRef((IDirectDrawSurface7 *)surf); desc = surf->surface_desc; /* check: != DDENUMRET_OK or == DDENUMRET_CANCEL? */ if (cb((IDirectDrawSurface7 *)surf, &desc, context) == DDENUMRET_CANCEL) @@ -1382,7 +1580,7 @@ IDirectDrawSurfaceImpl_EnumAttachedSurfaces(IDirectDrawSurface7 *iface, for (surf = This->next_attached; surf != NULL; surf = surf->next_attached) { - IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)surf); + ddraw_surface7_AddRef((IDirectDrawSurface7 *)surf); desc = surf->surface_desc; /* check: != DDENUMRET_OK or == DDENUMRET_CANCEL? */ if (cb((IDirectDrawSurface7 *)surf, &desc, context) == DDENUMRET_CANCEL) @@ -1398,6 +1596,34 @@ IDirectDrawSurfaceImpl_EnumAttachedSurfaces(IDirectDrawSurface7 *iface, return DD_OK; } +struct callback_info +{ + LPDDENUMSURFACESCALLBACK callback; + void *context; +}; + +static HRESULT CALLBACK EnumCallback(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *surface_desc, void *context) +{ + const struct callback_info *info = context; + + return info->callback((IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)surface)->IDirectDrawSurface3_vtbl, + (DDSURFACEDESC *)surface_desc, info->context); +} + +static HRESULT WINAPI ddraw_surface3_EnumAttachedSurfaces(IDirectDrawSurface3 *iface, + void *context, LPDDENUMSURFACESCALLBACK callback) +{ + struct callback_info info; + + TRACE("iface %p, context %p, callback %p.\n", iface, context, callback); + + info.callback = callback; + info.context = context; + + return ddraw_surface7_EnumAttachedSurfaces((IDirectDrawSurface7 *)surface_from_surface3(iface), + &info, EnumCallback); +} + /***************************************************************************** * IDirectDrawSurface7::EnumOverlayZOrders * @@ -1412,17 +1638,28 @@ IDirectDrawSurfaceImpl_EnumAttachedSurfaces(IDirectDrawSurface7 *iface, * DD_OK, because it's a stub * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_EnumOverlayZOrders(IDirectDrawSurface7 *iface, - DWORD Flags, - void *context, - LPDDENUMSURFACESCALLBACK7 cb) +static HRESULT WINAPI ddraw_surface7_EnumOverlayZOrders(IDirectDrawSurface7 *iface, + DWORD Flags, void *context, LPDDENUMSURFACESCALLBACK7 cb) { - FIXME("(%p)->(%x,%p,%p): Stub!\n", iface, Flags, context, cb); + FIXME("iface %p, flags %#x, context %p, callback %p stub!\n", iface, Flags, context, cb); return DD_OK; } +static HRESULT WINAPI ddraw_surface3_EnumOverlayZOrders(IDirectDrawSurface3 *iface, + DWORD flags, void *context, LPDDENUMSURFACESCALLBACK callback) +{ + struct callback_info info; + + TRACE("iface %p, flags %#x, context %p, callback %p.\n", iface, flags, context, callback); + + info.callback = callback; + info.context = context; + + return ddraw_surface7_EnumOverlayZOrders((IDirectDrawSurface7 *)surface_from_surface3(iface), + flags, &info, EnumCallback); +} + /***************************************************************************** * IDirectDrawSurface7::GetBltStatus * @@ -1435,13 +1672,12 @@ IDirectDrawSurfaceImpl_EnumOverlayZOrders(IDirectDrawSurface7 *iface, * See IWineD3DSurface::Blt * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetBltStatus(IDirectDrawSurface7 *iface, - DWORD Flags) +static HRESULT WINAPI ddraw_surface7_GetBltStatus(IDirectDrawSurface7 *iface, DWORD Flags) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%x): Relay\n", This, Flags); + + TRACE("iface %p, flags %#x.\n", iface, Flags); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_GetBltStatus(This->WineD3DSurface, Flags); @@ -1453,6 +1689,13 @@ IDirectDrawSurfaceImpl_GetBltStatus(IDirectDrawSurface7 *iface, } } +static HRESULT WINAPI ddraw_surface3_GetBltStatus(IDirectDrawSurface3 *iface, DWORD flags) +{ + TRACE("iface %p, flags %#x.\n", iface, flags); + + return ddraw_surface7_GetBltStatus((IDirectDrawSurface7 *)surface_from_surface3(iface), flags); +} + /***************************************************************************** * IDirectDrawSurface7::GetColorKey * @@ -1467,13 +1710,11 @@ IDirectDrawSurfaceImpl_GetBltStatus(IDirectDrawSurface7 *iface, * DDERR_INVALIDPARAMS if CKey is NULL * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetColorKey(IDirectDrawSurface7 *iface, - DWORD Flags, - DDCOLORKEY *CKey) +static HRESULT WINAPI ddraw_surface7_GetColorKey(IDirectDrawSurface7 *iface, DWORD Flags, DDCOLORKEY *CKey) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%08x,%p)\n", This, Flags, CKey); + + TRACE("iface %p, flags %#x, color_key %p.\n", iface, Flags, CKey); if(!CKey) return DDERR_INVALIDPARAMS; @@ -1527,6 +1768,13 @@ IDirectDrawSurfaceImpl_GetColorKey(IDirectDrawSurface7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw_surface3_GetColorKey(IDirectDrawSurface3 *iface, DWORD flags, DDCOLORKEY *color_key) +{ + TRACE("iface %p, flags %#x, color_key %p.\n", iface, flags, color_key); + + return ddraw_surface7_GetColorKey((IDirectDrawSurface7 *)surface_from_surface3(iface), flags, color_key); +} + /***************************************************************************** * IDirectDrawSurface7::GetFlipStatus * @@ -1539,13 +1787,12 @@ IDirectDrawSurfaceImpl_GetColorKey(IDirectDrawSurface7 *iface, * See IWineD3DSurface::GetFlipStatus * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetFlipStatus(IDirectDrawSurface7 *iface, - DWORD Flags) +static HRESULT WINAPI ddraw_surface7_GetFlipStatus(IDirectDrawSurface7 *iface, DWORD Flags) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%x): Relay\n", This, Flags); + + TRACE("iface %p, flags %#x.\n", iface, Flags); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_GetFlipStatus(This->WineD3DSurface, Flags); @@ -1557,6 +1804,13 @@ IDirectDrawSurfaceImpl_GetFlipStatus(IDirectDrawSurface7 *iface, } } +static HRESULT WINAPI ddraw_surface3_GetFlipStatus(IDirectDrawSurface3 *iface, DWORD flags) +{ + TRACE("iface %p, flags %#x.\n", iface, flags); + + return ddraw_surface7_GetFlipStatus((IDirectDrawSurface7 *)surface_from_surface3(iface), flags); +} + /***************************************************************************** * IDirectDrawSurface7::GetOverlayPosition * @@ -1569,13 +1823,12 @@ IDirectDrawSurfaceImpl_GetFlipStatus(IDirectDrawSurface7 *iface, * Returns: * DDERR_NOTAOVERLAYSURFACE, because it's a stub *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetOverlayPosition(IDirectDrawSurface7 *iface, - LONG *X, - LONG *Y) { +static HRESULT WINAPI ddraw_surface7_GetOverlayPosition(IDirectDrawSurface7 *iface, LONG *X, LONG *Y) +{ IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p,%p): Relay\n", This, X, Y); + + TRACE("iface %p, x %p, y %p.\n", iface, X, Y); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_GetOverlayPosition(This->WineD3DSurface, @@ -1585,6 +1838,13 @@ IDirectDrawSurfaceImpl_GetOverlayPosition(IDirectDrawSurface7 *iface, return hr; } +static HRESULT WINAPI ddraw_surface3_GetOverlayPosition(IDirectDrawSurface3 *iface, LONG *x, LONG *y) +{ + TRACE("iface %p, x %p, y %p.\n", iface, x, y); + + return ddraw_surface7_GetOverlayPosition((IDirectDrawSurface7 *)surface_from_surface3(iface), x, y); +} + /***************************************************************************** * IDirectDrawSurface7::GetPixelFormat * @@ -1599,13 +1859,12 @@ IDirectDrawSurfaceImpl_GetOverlayPosition(IDirectDrawSurface7 *iface, * DDERR_INVALIDPARAMS if PixelFormat is NULL * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetPixelFormat(IDirectDrawSurface7 *iface, - DDPIXELFORMAT *PixelFormat) +static HRESULT WINAPI ddraw_surface7_GetPixelFormat(IDirectDrawSurface7 *iface, DDPIXELFORMAT *PixelFormat) { /* What is DDERR_INVALIDSURFACETYPE for here? */ IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n",This,PixelFormat); + + TRACE("iface %p, pixel_format %p.\n", iface, PixelFormat); if(!PixelFormat) return DDERR_INVALIDPARAMS; @@ -1617,6 +1876,12 @@ IDirectDrawSurfaceImpl_GetPixelFormat(IDirectDrawSurface7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw_surface3_GetPixelFormat(IDirectDrawSurface3 *iface, DDPIXELFORMAT *pixel_format) +{ + TRACE("iface %p, pixel_format %p.\n", iface, pixel_format); + + return ddraw_surface7_GetPixelFormat((IDirectDrawSurface7 *)surface_from_surface3(iface), pixel_format); +} /***************************************************************************** * IDirectDrawSurface7::GetSurfaceDesc @@ -1632,13 +1897,11 @@ IDirectDrawSurfaceImpl_GetPixelFormat(IDirectDrawSurface7 *iface, * DDERR_INVALIDPARAMS if DDSD is NULL * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetSurfaceDesc(IDirectDrawSurface7 *iface, - DDSURFACEDESC2 *DDSD) +static HRESULT WINAPI ddraw_surface7_GetSurfaceDesc(IDirectDrawSurface7 *iface, DDSURFACEDESC2 *DDSD) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n",This,DDSD); + TRACE("iface %p, surface_desc %p.\n", iface, DDSD); if(!DDSD) return DDERR_INVALIDPARAMS; @@ -1658,6 +1921,33 @@ IDirectDrawSurfaceImpl_GetSurfaceDesc(IDirectDrawSurface7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw_surface3_GetSurfaceDesc(IDirectDrawSurface3 *iface, DDSURFACEDESC *surface_desc) +{ + IDirectDrawSurfaceImpl *surface = surface_from_surface3(iface); + + TRACE("iface %p, surface_desc %p.\n", iface, surface_desc); + + if (!surface_desc) return DDERR_INVALIDPARAMS; + + if (surface_desc->dwSize != sizeof(DDSURFACEDESC)) + { + WARN("Incorrect structure size %u, returning DDERR_INVALIDPARAMS.\n", surface_desc->dwSize); + return DDERR_INVALIDPARAMS; + } + + EnterCriticalSection(&ddraw_cs); + DD_STRUCT_COPY_BYSIZE(surface_desc, (DDSURFACEDESC *)&surface->surface_desc); + TRACE("Returning surface desc:\n"); + if (TRACE_ON(ddraw)) + { + /* DDRAW_dump_surface_desc handles the smaller size */ + DDRAW_dump_surface_desc((DDSURFACEDESC2 *)surface_desc); + } + + LeaveCriticalSection(&ddraw_cs); + return DD_OK; +} + /***************************************************************************** * IDirectDrawSurface7::Initialize * @@ -1671,18 +1961,43 @@ IDirectDrawSurfaceImpl_GetSurfaceDesc(IDirectDrawSurface7 *iface, * DDERR_ALREADYINITIALIZED * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_Initialize(IDirectDrawSurface7 *iface, - IDirectDraw *DD, - DDSURFACEDESC2 *DDSD) +static HRESULT WINAPI ddraw_surface7_Initialize(IDirectDrawSurface7 *iface, + IDirectDraw *ddraw, DDSURFACEDESC2 *surface_desc) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - IDirectDrawImpl *ddimpl = DD ? ddraw_from_ddraw1(DD) : NULL; - TRACE("(%p)->(%p,%p)\n",This,ddimpl,DDSD); + TRACE("iface %p, ddraw %p, surface_desc %p.\n", iface, ddraw, surface_desc); return DDERR_ALREADYINITIALIZED; } +static HRESULT WINAPI ddraw_surface3_Initialize(IDirectDrawSurface3 *iface, + IDirectDraw *ddraw, DDSURFACEDESC *surface_desc) +{ + TRACE("iface %p, ddraw %p, surface_desc %p.\n", iface, ddraw, surface_desc); + + return ddraw_surface7_Initialize((IDirectDrawSurface7 *)surface_from_surface3(iface), + ddraw, (DDSURFACEDESC2 *)surface_desc); +} + +/***************************************************************************** + * IDirect3DTexture1::Initialize + * + * The sdk says it's not implemented + * + * Params: + * ? + * + * Returns + * DDERR_UNSUPPORTED + * + *****************************************************************************/ +static HRESULT WINAPI d3d_texture1_Initialize(IDirect3DTexture *iface, + IDirect3DDevice *device, IDirectDrawSurface *surface) +{ + TRACE("iface %p, device %p, surface %p.\n", iface, device, surface); + + return DDERR_UNSUPPORTED; /* Unchecked */ +} + /***************************************************************************** * IDirectDrawSurface7::IsLost * @@ -1694,12 +2009,12 @@ IDirectDrawSurfaceImpl_Initialize(IDirectDrawSurface7 *iface, * See IWineD3DSurface::IsLost for more details * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_IsLost(IDirectDrawSurface7 *iface) +static HRESULT WINAPI ddraw_surface7_IsLost(IDirectDrawSurface7 *iface) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)\n", This); + + TRACE("iface %p.\n", iface); EnterCriticalSection(&ddraw_cs); /* We lose the surface if the implementation was changed */ @@ -1726,6 +2041,13 @@ IDirectDrawSurfaceImpl_IsLost(IDirectDrawSurface7 *iface) } } +static HRESULT WINAPI ddraw_surface3_IsLost(IDirectDrawSurface3 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_IsLost((IDirectDrawSurface7 *)surface_from_surface3(iface)); +} + /***************************************************************************** * IDirectDrawSurface7::Restore * @@ -1737,27 +2059,32 @@ IDirectDrawSurfaceImpl_IsLost(IDirectDrawSurface7 *iface) * See IWineD3DSurface::Restore for more details * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_Restore(IDirectDrawSurface7 *iface) +static HRESULT WINAPI ddraw_surface7_Restore(IDirectDrawSurface7 *iface) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)\n", This); + + TRACE("iface %p.\n", iface); EnterCriticalSection(&ddraw_cs); if(This->ImplType != This->ddraw->ImplType) { /* Call the recreation callback. Make sure to AddRef first */ IDirectDrawSurface_AddRef(iface); - IDirectDrawImpl_RecreateSurfacesCallback(iface, - &This->surface_desc, - NULL /* Not needed */); + ddraw_recreate_surfaces_cb(iface, &This->surface_desc, NULL /* Not needed */); } hr = IWineD3DSurface_Restore(This->WineD3DSurface); LeaveCriticalSection(&ddraw_cs); return hr; } +static HRESULT WINAPI ddraw_surface3_Restore(IDirectDrawSurface3 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_Restore((IDirectDrawSurface7 *)surface_from_surface3(iface)); +} + /***************************************************************************** * IDirectDrawSurface7::SetOverlayPosition * @@ -1770,14 +2097,12 @@ IDirectDrawSurfaceImpl_Restore(IDirectDrawSurface7 *iface) * Returns: * DDERR_NOTAOVERLAYSURFACE, because we don't support overlays right now *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_SetOverlayPosition(IDirectDrawSurface7 *iface, - LONG X, - LONG Y) +static HRESULT WINAPI ddraw_surface7_SetOverlayPosition(IDirectDrawSurface7 *iface, LONG X, LONG Y) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%d,%d): Relay\n", This, X, Y); + + TRACE("iface %p, x %d, y %d.\n", iface, X, Y); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_SetOverlayPosition(This->WineD3DSurface, @@ -1787,6 +2112,13 @@ IDirectDrawSurfaceImpl_SetOverlayPosition(IDirectDrawSurface7 *iface, return hr; } +static HRESULT WINAPI ddraw_surface3_SetOverlayPosition(IDirectDrawSurface3 *iface, LONG x, LONG y) +{ + TRACE("iface %p, x %d, y %d.\n", iface, x, y); + + return ddraw_surface7_SetOverlayPosition((IDirectDrawSurface7 *)surface_from_surface3(iface), x, y); +} + /***************************************************************************** * IDirectDrawSurface7::UpdateOverlay * @@ -1802,18 +2134,15 @@ IDirectDrawSurfaceImpl_SetOverlayPosition(IDirectDrawSurface7 *iface, * DDERR_UNSUPPORTED, because we don't support overlays * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_UpdateOverlay(IDirectDrawSurface7 *iface, - LPRECT SrcRect, - IDirectDrawSurface7 *DstSurface, - LPRECT DstRect, - DWORD Flags, - LPDDOVERLAYFX FX) +static HRESULT WINAPI ddraw_surface7_UpdateOverlay(IDirectDrawSurface7 *iface, RECT *SrcRect, + IDirectDrawSurface7 *DstSurface, RECT *DstRect, DWORD Flags, DDOVERLAYFX *FX) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawSurfaceImpl *Dst = (IDirectDrawSurfaceImpl *)DstSurface; HRESULT hr; - TRACE("(%p)->(%p,%p,%p,%x,%p): Relay\n", This, SrcRect, Dst, DstRect, Flags, FX); + + TRACE("iface %p, src_rect %s, dst_surface %p, dst_rect %s, flags %#x, fx %p.\n", + iface, wine_dbgstr_rect(SrcRect), DstSurface, wine_dbgstr_rect(DstRect), Flags, FX); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_UpdateOverlay(This->WineD3DSurface, @@ -1832,6 +2161,16 @@ IDirectDrawSurfaceImpl_UpdateOverlay(IDirectDrawSurface7 *iface, } } +static HRESULT WINAPI ddraw_surface3_UpdateOverlay(IDirectDrawSurface3 *iface, RECT *src_rect, + IDirectDrawSurface3 *dst_surface, RECT *dst_rect, DWORD flags, DDOVERLAYFX *fx) +{ + TRACE("iface %p, src_rect %s, dst_surface %p, dst_rect %s, flags %#x, fx %p.\n", + iface, wine_dbgstr_rect(src_rect), dst_surface, wine_dbgstr_rect(dst_rect), flags, fx); + + return ddraw_surface7_UpdateOverlay((IDirectDrawSurface7 *)surface_from_surface3(iface), src_rect, + dst_surface ? (IDirectDrawSurface7 *)surface_from_surface3(dst_surface) : NULL, dst_rect, flags, fx); +} + /***************************************************************************** * IDirectDrawSurface7::UpdateOverlayDisplay * @@ -1843,15 +2182,20 @@ IDirectDrawSurfaceImpl_UpdateOverlay(IDirectDrawSurface7 *iface, * Returns: DDERR_UNSUPPORTED, because we don't support overlays * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_UpdateOverlayDisplay(IDirectDrawSurface7 *iface, - DWORD Flags) +static HRESULT WINAPI ddraw_surface7_UpdateOverlayDisplay(IDirectDrawSurface7 *iface, DWORD Flags) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%x)\n", This, Flags); + TRACE("iface %p, flags %#x.\n", iface, Flags); + return DDERR_UNSUPPORTED; } +static HRESULT WINAPI ddraw_surface3_UpdateOverlayDisplay(IDirectDrawSurface3 *iface, DWORD flags) +{ + TRACE("iface %p, flags %#x.\n", iface, flags); + + return ddraw_surface7_UpdateOverlayDisplay((IDirectDrawSurface7 *)surface_from_surface3(iface), flags); +} + /***************************************************************************** * IDirectDrawSurface7::UpdateOverlayZOrder * @@ -1865,16 +2209,15 @@ IDirectDrawSurfaceImpl_UpdateOverlayDisplay(IDirectDrawSurface7 *iface, * DDERR_NOTOVERLAYSURFACE, because we don't support overlays * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_UpdateOverlayZOrder(IDirectDrawSurface7 *iface, - DWORD Flags, - IDirectDrawSurface7 *DDSRef) +static HRESULT WINAPI ddraw_surface7_UpdateOverlayZOrder(IDirectDrawSurface7 *iface, + DWORD Flags, IDirectDrawSurface7 *DDSRef) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawSurfaceImpl *Ref = (IDirectDrawSurfaceImpl *)DDSRef; HRESULT hr; - TRACE("(%p)->(%x,%p): Relay\n", This, Flags, Ref); + TRACE("iface %p, flags %#x, reference %p.\n", iface, Flags, DDSRef); + EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_UpdateOverlayZOrder(This->WineD3DSurface, Flags, @@ -1883,6 +2226,15 @@ IDirectDrawSurfaceImpl_UpdateOverlayZOrder(IDirectDrawSurface7 *iface, return hr; } +static HRESULT WINAPI ddraw_surface3_UpdateOverlayZOrder(IDirectDrawSurface3 *iface, + DWORD flags, IDirectDrawSurface3 *reference) +{ + TRACE("iface %p, flags %#x, reference %p.\n", iface, flags, reference); + + return ddraw_surface7_UpdateOverlayZOrder((IDirectDrawSurface7 *)surface_from_surface3(iface), flags, + reference ? (IDirectDrawSurface7 *)surface_from_surface3(reference) : NULL); +} + /***************************************************************************** * IDirectDrawSurface7::GetDDInterface * @@ -1897,13 +2249,11 @@ IDirectDrawSurfaceImpl_UpdateOverlayZOrder(IDirectDrawSurface7 *iface, * DDERR_INVALIDPARAMS if DD is NULL * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetDDInterface(IDirectDrawSurface7 *iface, - void **DD) +static HRESULT WINAPI ddraw_surface7_GetDDInterface(IDirectDrawSurface7 *iface, void **DD) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n",This,DD); + TRACE("iface %p, ddraw %p.\n", iface, DD); if(!DD) return DDERR_INVALIDPARAMS; @@ -1932,13 +2282,21 @@ IDirectDrawSurfaceImpl_GetDDInterface(IDirectDrawSurface7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw_surface3_GetDDInterface(IDirectDrawSurface3 *iface, void **ddraw) +{ + TRACE("iface %p, ddraw %p.\n", iface, ddraw); + + return ddraw_surface7_GetDDInterface((IDirectDrawSurface7 *)surface_from_surface3(iface), ddraw); +} + /* This seems also windows implementation specific - I don't think WineD3D needs this */ -static HRESULT WINAPI IDirectDrawSurfaceImpl_ChangeUniquenessValue(IDirectDrawSurface7 *iface) +static HRESULT WINAPI ddraw_surface7_ChangeUniquenessValue(IDirectDrawSurface7 *iface) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; volatile IDirectDrawSurfaceImpl* vThis = This; - TRACE("(%p)\n",This); + TRACE("iface %p.\n", iface); + EnterCriticalSection(&ddraw_cs); /* A uniqueness value of 0 is apparently special. * This needs to be checked. @@ -1962,11 +2320,12 @@ static HRESULT WINAPI IDirectDrawSurfaceImpl_ChangeUniquenessValue(IDirectDrawSu return DD_OK; } -static HRESULT WINAPI IDirectDrawSurfaceImpl_GetUniquenessValue(IDirectDrawSurface7 *iface, LPDWORD pValue) +static HRESULT WINAPI ddraw_surface7_GetUniquenessValue(IDirectDrawSurface7 *iface, DWORD *pValue) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n",This,pValue); + TRACE("iface %p, value %p.\n", iface, pValue); + EnterCriticalSection(&ddraw_cs); *pValue = This->uniqueness_value; LeaveCriticalSection(&ddraw_cs); @@ -1986,13 +2345,12 @@ static HRESULT WINAPI IDirectDrawSurfaceImpl_GetUniquenessValue(IDirectDrawSurfa * DDERR_INVALIDOBJECT if the surface is invalid for this method * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_SetLOD(IDirectDrawSurface7 *iface, - DWORD MaxLOD) +static HRESULT WINAPI ddraw_surface7_SetLOD(IDirectDrawSurface7 *iface, DWORD MaxLOD) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%d)\n", This, MaxLOD); + + TRACE("iface %p, lod %u.\n", iface, MaxLOD); EnterCriticalSection(&ddraw_cs); if (!(This->surface_desc.ddsCaps.dwCaps2 & DDSCAPS2_TEXTUREMANAGE)) @@ -2028,12 +2386,11 @@ IDirectDrawSurfaceImpl_SetLOD(IDirectDrawSurface7 *iface, * DDERR_INVALIDOBJECT if the surface is invalid for this method * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetLOD(IDirectDrawSurface7 *iface, - DWORD *MaxLOD) +static HRESULT WINAPI ddraw_surface7_GetLOD(IDirectDrawSurface7 *iface, DWORD *MaxLOD) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n", This, MaxLOD); + + TRACE("iface %p, lod %p.\n", iface, MaxLOD); if(!MaxLOD) return DDERR_INVALIDPARAMS; @@ -2067,18 +2424,19 @@ IDirectDrawSurfaceImpl_GetLOD(IDirectDrawSurface7 *iface, * For more details, see IWineD3DSurface::BltFast * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_BltFast(IDirectDrawSurface7 *iface, - DWORD dstx, - DWORD dsty, - IDirectDrawSurface7 *Source, - RECT *rsrc, - DWORD trans) +static HRESULT WINAPI ddraw_surface7_BltFast(IDirectDrawSurface7 *iface, DWORD dstx, DWORD dsty, + IDirectDrawSurface7 *Source, RECT *rsrc, DWORD trans) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawSurfaceImpl *src = (IDirectDrawSurfaceImpl *)Source; + DWORD src_w, src_h, dst_w, dst_h; HRESULT hr; - TRACE("(%p)->(%d,%d,%p,%p,%d): Relay\n", This, dstx, dsty, Source, rsrc, trans); + + TRACE("iface %p, dst_x %u, dst_y %u, src_surface %p, src_rect %s, flags %#x.\n", + iface, dstx, dsty, Source, wine_dbgstr_rect(rsrc), trans); + + dst_w = This->surface_desc.dwWidth; + dst_h = This->surface_desc.dwHeight; /* Source must be != NULL, This is not checked by windows. Windows happily throws a 0xc0000005 * in that case @@ -2092,21 +2450,21 @@ IDirectDrawSurfaceImpl_BltFast(IDirectDrawSurface7 *iface, WARN("Source rectangle is invalid, returning DDERR_INVALIDRECT\n"); return DDERR_INVALIDRECT; } - if(dstx + rsrc->right - rsrc->left > This->surface_desc.dwWidth || - dsty + rsrc->bottom - rsrc->top > This->surface_desc.dwHeight) - { - WARN("Destination area out of bounds, returning DDERR_INVALIDRECT\n"); - return DDERR_INVALIDRECT; - } + + src_w = rsrc->right - rsrc->left; + src_h = rsrc->bottom - rsrc->top; } else { - if(dstx + src->surface_desc.dwWidth > This->surface_desc.dwWidth || - dsty + src->surface_desc.dwHeight > This->surface_desc.dwHeight) - { - WARN("Destination area out of bounds, returning DDERR_INVALIDRECT\n"); - return DDERR_INVALIDRECT; - } + src_w = src->surface_desc.dwWidth; + src_h = src->surface_desc.dwHeight; + } + + if (src_w > dst_w || dstx > dst_w - src_w + || src_h > dst_h || dsty > dst_h - src_h) + { + WARN("Destination area out of bounds, returning DDERR_INVALIDRECT.\n"); + return DDERR_INVALIDRECT; } EnterCriticalSection(&ddraw_cs); @@ -2124,6 +2482,16 @@ IDirectDrawSurfaceImpl_BltFast(IDirectDrawSurface7 *iface, } } +static HRESULT WINAPI ddraw_surface3_BltFast(IDirectDrawSurface3 *iface, DWORD dst_x, DWORD dst_y, + IDirectDrawSurface3 *src_surface, RECT *src_rect, DWORD flags) +{ + TRACE("iface %p, dst_x %u, dst_y %u, src_surface %p, src_rect %s, flags %#x.\n", + iface, dst_x, dst_y, src_surface, wine_dbgstr_rect(src_rect), flags); + + return ddraw_surface7_BltFast((IDirectDrawSurface7 *)surface_from_surface3(iface), dst_x, dst_y, + src_surface ? (IDirectDrawSurface7 *)surface_from_surface3(src_surface) : NULL, src_rect, flags); +} + /***************************************************************************** * IDirectDrawSurface7::GetClipper * @@ -2139,12 +2507,11 @@ IDirectDrawSurfaceImpl_BltFast(IDirectDrawSurface7 *iface, * DDERR_NOCLIPPERATTACHED if there's no clipper attached * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetClipper(IDirectDrawSurface7 *iface, - IDirectDrawClipper **Clipper) +static HRESULT WINAPI ddraw_surface7_GetClipper(IDirectDrawSurface7 *iface, IDirectDrawClipper **Clipper) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n", This, Clipper); + + TRACE("iface %p, clipper %p.\n", iface, Clipper); if(!Clipper) { @@ -2165,6 +2532,13 @@ IDirectDrawSurfaceImpl_GetClipper(IDirectDrawSurface7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw_surface3_GetClipper(IDirectDrawSurface3 *iface, IDirectDrawClipper **clipper) +{ + TRACE("iface %p, clipper %p.\n", iface, clipper); + + return ddraw_surface7_GetClipper((IDirectDrawSurface7 *)surface_from_surface3(iface), clipper); +} + /***************************************************************************** * IDirectDrawSurface7::SetClipper * @@ -2177,15 +2551,14 @@ IDirectDrawSurfaceImpl_GetClipper(IDirectDrawSurface7 *iface, * DD_OK on success * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_SetClipper(IDirectDrawSurface7 *iface, - IDirectDrawClipper *Clipper) +static HRESULT WINAPI ddraw_surface7_SetClipper(IDirectDrawSurface7 *iface, IDirectDrawClipper *Clipper) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawClipperImpl *oldClipper = This->clipper; HWND clipWindow; HRESULT hr; - TRACE("(%p)->(%p)\n",This,Clipper); + + TRACE("iface %p, clipper %p.\n", iface, Clipper); EnterCriticalSection(&ddraw_cs); if ((IDirectDrawClipperImpl *)Clipper == This->clipper) @@ -2222,6 +2595,13 @@ IDirectDrawSurfaceImpl_SetClipper(IDirectDrawSurface7 *iface, return hr; } +static HRESULT WINAPI ddraw_surface3_SetClipper(IDirectDrawSurface3 *iface, IDirectDrawClipper *clipper) +{ + TRACE("iface %p, clipper %p.\n", iface, clipper); + + return ddraw_surface7_SetClipper((IDirectDrawSurface7 *)surface_from_surface3(iface), clipper); +} + /***************************************************************************** * IDirectDrawSurface7::SetSurfaceDesc * @@ -2238,15 +2618,13 @@ IDirectDrawSurfaceImpl_SetClipper(IDirectDrawSurface7 *iface, * DDERR_INVALIDPARAMS if DDSD is NULL * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_SetSurfaceDesc(IDirectDrawSurface7 *iface, - DDSURFACEDESC2 *DDSD, - DWORD Flags) +static HRESULT WINAPI ddraw_surface7_SetSurfaceDesc(IDirectDrawSurface7 *iface, DDSURFACEDESC2 *DDSD, DWORD Flags) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - WINED3DFORMAT newFormat = WINED3DFMT_UNKNOWN; + enum wined3d_format_id newFormat = WINED3DFMT_UNKNOWN; HRESULT hr; - TRACE("(%p)->(%p,%x)\n", This, DDSD, Flags); + + TRACE("iface %p, surface_desc %p, flags %#x.\n", iface, DDSD, Flags); if(!DDSD) return DDERR_INVALIDPARAMS; @@ -2320,6 +2698,15 @@ IDirectDrawSurfaceImpl_SetSurfaceDesc(IDirectDrawSurface7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw_surface3_SetSurfaceDesc(IDirectDrawSurface3 *iface, + DDSURFACEDESC *surface_desc, DWORD flags) +{ + TRACE("iface %p, surface_desc %p, flags %#x.\n", iface, surface_desc, flags); + + return ddraw_surface7_SetSurfaceDesc((IDirectDrawSurface7 *)surface_from_surface3(iface), + (DDSURFACEDESC2 *)surface_desc, flags); +} + /***************************************************************************** * IDirectDrawSurface7::GetPalette * @@ -2334,14 +2721,13 @@ IDirectDrawSurfaceImpl_SetSurfaceDesc(IDirectDrawSurface7 *iface, * DDERR_INVALIDPARAMS if Pal is NULL * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_GetPalette(IDirectDrawSurface7 *iface, - IDirectDrawPalette **Pal) +static HRESULT WINAPI ddraw_surface7_GetPalette(IDirectDrawSurface7 *iface, IDirectDrawPalette **Pal) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IWineD3DPalette *wPal; HRESULT hr; - TRACE("(%p)->(%p): Relay\n", This, Pal); + + TRACE("iface %p, palette %p.\n", iface, Pal); if(!Pal) return DDERR_INVALIDPARAMS; @@ -2356,7 +2742,8 @@ IDirectDrawSurfaceImpl_GetPalette(IDirectDrawSurface7 *iface, if(wPal) { - hr = IWineD3DPalette_GetParent(wPal, (IUnknown **) Pal); + *Pal = IWineD3DPalette_GetParent(wPal); + IDirectDrawPalette_AddRef(*Pal); } else { @@ -2368,6 +2755,13 @@ IDirectDrawSurfaceImpl_GetPalette(IDirectDrawSurface7 *iface, return hr; } +static HRESULT WINAPI ddraw_surface3_GetPalette(IDirectDrawSurface3 *iface, IDirectDrawPalette **palette) +{ + TRACE("iface %p, palette %p.\n", iface, palette); + + return ddraw_surface7_GetPalette((IDirectDrawSurface7 *)surface_from_surface3(iface), palette); +} + /***************************************************************************** * SetColorKeyEnum * @@ -2400,10 +2794,9 @@ SetColorKeyEnum(IDirectDrawSurface7 *surface, ctx->ret = hr; } - IDirectDrawSurface7_EnumAttachedSurfaces(surface, - context, - SetColorKeyEnum); - IDirectDrawSurface7_Release(surface); + ddraw_surface7_EnumAttachedSurfaces(surface, context, SetColorKeyEnum); + ddraw_surface7_Release(surface); + return DDENUMRET_OK; } @@ -2423,15 +2816,13 @@ SetColorKeyEnum(IDirectDrawSurface7 *surface, * See IWineD3DSurface::SetColorKey for details * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_SetColorKey(IDirectDrawSurface7 *iface, - DWORD Flags, - DDCOLORKEY *CKey) +static HRESULT WINAPI ddraw_surface7_SetColorKey(IDirectDrawSurface7 *iface, DWORD Flags, DDCOLORKEY *CKey) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; DDCOLORKEY FixedCKey; struct SCKContext ctx = { DD_OK, (WINEDDCOLORKEY *) (CKey ? &FixedCKey : NULL), Flags }; - TRACE("(%p)->(%x,%p)\n", This, Flags, CKey); + + TRACE("iface %p, flags %#x, color_key %p.\n", iface, Flags, CKey); EnterCriticalSection(&ddraw_cs); if (CKey) @@ -2493,12 +2884,8 @@ IDirectDrawSurfaceImpl_SetColorKey(IDirectDrawSurface7 *iface, return DDERR_INVALIDPARAMS; } } - ctx.ret = IWineD3DSurface_SetColorKey(This->WineD3DSurface, - Flags, - ctx.CKey); - IDirectDrawSurface7_EnumAttachedSurfaces(iface, - &ctx, - SetColorKeyEnum); + ctx.ret = IWineD3DSurface_SetColorKey(This->WineD3DSurface, Flags, ctx.CKey); + ddraw_surface7_EnumAttachedSurfaces(iface, &ctx, SetColorKeyEnum); LeaveCriticalSection(&ddraw_cs); switch(ctx.ret) { @@ -2507,6 +2894,13 @@ IDirectDrawSurfaceImpl_SetColorKey(IDirectDrawSurface7 *iface, } } +static HRESULT WINAPI ddraw_surface3_SetColorKey(IDirectDrawSurface3 *iface, DWORD flags, DDCOLORKEY *color_key) +{ + TRACE("iface %p, flags %#x, color_key %p.\n", iface, flags, color_key); + + return ddraw_surface7_SetColorKey((IDirectDrawSurface7 *)surface_from_surface3(iface), flags, color_key); +} + /***************************************************************************** * IDirectDrawSurface7::SetPalette * @@ -2519,16 +2913,15 @@ IDirectDrawSurfaceImpl_SetColorKey(IDirectDrawSurface7 *iface, * DD_OK on success * *****************************************************************************/ -static HRESULT WINAPI -IDirectDrawSurfaceImpl_SetPalette(IDirectDrawSurface7 *iface, - IDirectDrawPalette *Pal) +static HRESULT WINAPI ddraw_surface7_SetPalette(IDirectDrawSurface7 *iface, IDirectDrawPalette *Pal) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawPalette *oldPal; IDirectDrawSurfaceImpl *surf; IDirectDrawPaletteImpl *PalImpl = (IDirectDrawPaletteImpl *)Pal; HRESULT hr; - TRACE("(%p)->(%p)\n", This, Pal); + + TRACE("iface %p, palette %p.\n", iface, Pal); if (!(This->surface_desc.u4.ddpfPixelFormat.dwFlags & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 | DDPF_PALETTEINDEXED4 | DDPF_PALETTEINDEXED8 | DDPF_PALETTEINDEXEDTO8))) { @@ -2567,17 +2960,16 @@ IDirectDrawSurfaceImpl_SetPalette(IDirectDrawSurface7 *iface, { IDirectDrawSurface7 *attach; HRESULT hr; - hr = IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)surf, &caps2, &attach); + hr = ddraw_surface7_GetAttachedSurface((IDirectDrawSurface7 *)surf, &caps2, &attach); if(hr != DD_OK) { break; } TRACE("Setting palette on %p\n", attach); - IDirectDrawSurface7_SetPalette(attach, - Pal); + ddraw_surface7_SetPalette(attach, Pal); surf = (IDirectDrawSurfaceImpl *)attach; - IDirectDrawSurface7_Release(attach); + ddraw_surface7_Release(attach); } } @@ -2585,65 +2977,677 @@ IDirectDrawSurfaceImpl_SetPalette(IDirectDrawSurface7 *iface, return DD_OK; } +static HRESULT WINAPI ddraw_surface3_SetPalette(IDirectDrawSurface3 *iface, IDirectDrawPalette *palette) +{ + TRACE("iface %p, palette %p.\n", iface, palette); + + return ddraw_surface7_SetPalette((IDirectDrawSurface7 *)surface_from_surface3(iface), palette); +} + +/********************************************************** + * IDirectDrawGammaControl::GetGammaRamp + * + * Returns the current gamma ramp for a surface + * + * Params: + * flags: Ignored + * gamma_ramp: Address to write the ramp to + * + * Returns: + * DD_OK on success + * DDERR_INVALIDPARAMS if gamma_ramp is NULL + * + **********************************************************/ +static HRESULT WINAPI ddraw_gamma_control_GetGammaRamp(IDirectDrawGammaControl *iface, + DWORD flags, DDGAMMARAMP *gamma_ramp) +{ + IDirectDrawSurfaceImpl *surface = surface_from_gamma_control(iface); + + TRACE("iface %p, flags %#x, gamma_ramp %p.\n", iface, flags, gamma_ramp); + + if (!gamma_ramp) + { + WARN("Invalid gamma_ramp passed.\n"); + return DDERR_INVALIDPARAMS; + } + + EnterCriticalSection(&ddraw_cs); + if (surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) + { + /* Note: DDGAMMARAMP is compatible with WINED3DGAMMARAMP. */ + IWineD3DDevice_GetGammaRamp(surface->ddraw->wineD3DDevice, 0, (WINED3DGAMMARAMP *)gamma_ramp); + } + else + { + ERR("Not implemented for non-primary surfaces.\n"); + } + LeaveCriticalSection(&ddraw_cs); + + return DD_OK; +} + +/********************************************************** + * IDirectDrawGammaControl::SetGammaRamp + * + * Sets the red, green and blue gamma ramps for + * + * Params: + * flags: Can be DDSGR_CALIBRATE to request calibration + * gamma_ramp: Structure containing the new gamma ramp + * + * Returns: + * DD_OK on success + * DDERR_INVALIDPARAMS if gamma_ramp is NULL + * + **********************************************************/ +static HRESULT WINAPI ddraw_gamma_control_SetGammaRamp(IDirectDrawGammaControl *iface, + DWORD flags, DDGAMMARAMP *gamma_ramp) +{ + IDirectDrawSurfaceImpl *surface = surface_from_gamma_control(iface); + + TRACE("iface %p, flags %#x, gamma_ramp %p.\n", iface, flags, gamma_ramp); + + if (!gamma_ramp) + { + WARN("Invalid gamma_ramp passed.\n"); + return DDERR_INVALIDPARAMS; + } + + EnterCriticalSection(&ddraw_cs); + if (surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) + { + /* Note: DDGAMMARAMP is compatible with WINED3DGAMMARAMP */ + IWineD3DDevice_SetGammaRamp(surface->ddraw->wineD3DDevice, 0, flags, (WINED3DGAMMARAMP *)gamma_ramp); + } + else + { + ERR("Not implemented for non-primary surfaces.\n"); + } + LeaveCriticalSection(&ddraw_cs); + + return DD_OK; +} + +/***************************************************************************** + * IDirect3DTexture2::PaletteChanged + * + * Informs the texture about a palette change + * + * Params: + * start: Start index of the change + * count: The number of changed entries + * + * Returns + * D3D_OK, because it's a stub + * + *****************************************************************************/ +static HRESULT WINAPI d3d_texture2_PaletteChanged(IDirect3DTexture2 *iface, DWORD start, DWORD count) +{ + FIXME("iface %p, start %u, count %u stub!\n", iface, start, count); + + return D3D_OK; +} + +static HRESULT WINAPI d3d_texture1_PaletteChanged(IDirect3DTexture *iface, DWORD start, DWORD count) +{ + IDirectDrawSurfaceImpl *surface = surface_from_texture1(iface); + + TRACE("iface %p, start %u, count %u.\n", iface, start, count); + + return d3d_texture2_PaletteChanged((IDirect3DTexture2 *)&surface->IDirect3DTexture2_vtbl, start, count); +} + +/***************************************************************************** + * IDirect3DTexture::Unload + * + * DX5 SDK: "The IDirect3DTexture2::Unload method is not implemented + * + * + * Returns: + * DDERR_UNSUPPORTED + * + *****************************************************************************/ +static HRESULT WINAPI d3d_texture1_Unload(IDirect3DTexture *iface) +{ + WARN("iface %p. Not implemented.\n", iface); + + return DDERR_UNSUPPORTED; +} + +/***************************************************************************** + * IDirect3DTexture2::GetHandle + * + * Returns handle for the texture. At the moment, the interface + * to the IWineD3DTexture is used. + * + * Params: + * device: Device this handle is assigned to + * handle: Address to store the handle at. + * + * Returns: + * D3D_OK + * + *****************************************************************************/ +static HRESULT WINAPI d3d_texture2_GetHandle(IDirect3DTexture2 *iface, + IDirect3DDevice2 *device, D3DTEXTUREHANDLE *handle) +{ + IDirectDrawSurfaceImpl *surface = surface_from_texture2(iface); + + TRACE("iface %p, device %p, handle %p.\n", iface, device, handle); + + EnterCriticalSection(&ddraw_cs); + + if (!surface->Handle) + { + DWORD h = ddraw_allocate_handle(&device_from_device2(device)->handle_table, surface, DDRAW_HANDLE_SURFACE); + if (h == DDRAW_INVALID_HANDLE) + { + ERR("Failed to allocate a texture handle.\n"); + LeaveCriticalSection(&ddraw_cs); + return DDERR_OUTOFMEMORY; + } + + surface->Handle = h + 1; + } + + TRACE("Returning handle %08x.\n", surface->Handle); + *handle = surface->Handle; + + LeaveCriticalSection(&ddraw_cs); + + return D3D_OK; +} + +static HRESULT WINAPI d3d_texture1_GetHandle(IDirect3DTexture *iface, + IDirect3DDevice *device, D3DTEXTUREHANDLE *handle) +{ + IDirect3DTexture2 *texture2 = (IDirect3DTexture2 *)&surface_from_texture1(iface)->IDirect3DTexture2_vtbl; + IDirect3DDevice2 *device2 = (IDirect3DDevice2 *)&device_from_device1(device)->IDirect3DDevice2_vtbl; + + TRACE("iface %p, device %p, handle %p.\n", iface, device, handle); + + return d3d_texture2_GetHandle(texture2, device2, handle); +} + +/***************************************************************************** + * get_sub_mimaplevel + * + * Helper function that returns the next mipmap level + * + * tex_ptr: Surface of which to return the next level + * + *****************************************************************************/ +static IDirectDrawSurfaceImpl *get_sub_mimaplevel(IDirectDrawSurfaceImpl *surface) +{ + /* Now go down the mipmap chain to the next surface */ + static DDSCAPS2 mipmap_caps = { DDSCAPS_MIPMAP | DDSCAPS_TEXTURE, 0, 0, {0} }; + IDirectDrawSurface7 *next_level; + HRESULT hr; + + hr = ddraw_surface7_GetAttachedSurface((IDirectDrawSurface7 *)surface, &mipmap_caps, &next_level); + if (FAILED(hr)) return NULL; + + ddraw_surface7_Release(next_level); + + return (IDirectDrawSurfaceImpl *)next_level; +} + +/***************************************************************************** + * IDirect3DTexture2::Load + * + * Loads a texture created with the DDSCAPS_ALLOCONLOAD + * + * This function isn't relayed to WineD3D because the whole interface is + * implemented in DDraw only. For speed improvements a implementation which + * takes OpenGL more into account could be placed into WineD3D. + * + * Params: + * src_texture: Address of the texture to load + * + * Returns: + * D3D_OK on success + * D3DERR_TEXTURE_LOAD_FAILED. + * + *****************************************************************************/ +static HRESULT WINAPI d3d_texture2_Load(IDirect3DTexture2 *iface, IDirect3DTexture2 *src_texture) +{ + IDirectDrawSurfaceImpl *dst_surface = surface_from_texture2(iface); + IDirectDrawSurfaceImpl *src_surface = surface_from_texture2(src_texture); + HRESULT hr; + + TRACE("iface %p, src_texture %p.\n", iface, src_texture); + + if (src_surface == dst_surface) + { + TRACE("copying surface %p to surface %p, why?\n", src_surface, dst_surface); + return D3D_OK; + } + + EnterCriticalSection(&ddraw_cs); + + if (((src_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) + != (dst_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP)) + || (src_surface->surface_desc.u2.dwMipMapCount != dst_surface->surface_desc.u2.dwMipMapCount)) + { + ERR("Trying to load surfaces with different mip-map counts.\n"); + } + + for (;;) + { + IWineD3DPalette *wined3d_dst_pal, *wined3d_src_pal; + IDirectDrawPalette *dst_pal = NULL, *src_pal = NULL; + DDSURFACEDESC *src_desc, *dst_desc; + + TRACE("Copying surface %p to surface %p (mipmap level %d).\n", + src_surface, dst_surface, src_surface->mipmap_level); + + /* Suppress the ALLOCONLOAD flag */ + dst_surface->surface_desc.ddsCaps.dwCaps &= ~DDSCAPS_ALLOCONLOAD; + + /* Get the palettes */ + hr = IWineD3DSurface_GetPalette(dst_surface->WineD3DSurface, &wined3d_dst_pal); + if (FAILED(hr)) + { + ERR("Failed to get destination palette, hr %#x.\n", hr); + LeaveCriticalSection(&ddraw_cs); + return D3DERR_TEXTURE_LOAD_FAILED; + } + if (wined3d_dst_pal) dst_pal = IWineD3DPalette_GetParent(wined3d_dst_pal); + + hr = IWineD3DSurface_GetPalette(src_surface->WineD3DSurface, &wined3d_src_pal); + if (FAILED(hr)) + { + ERR("Failed to get source palette, hr %#x.\n", hr); + LeaveCriticalSection(&ddraw_cs); + return D3DERR_TEXTURE_LOAD_FAILED; + } + if (wined3d_src_pal) src_pal = IWineD3DPalette_GetParent(wined3d_src_pal); + + if (src_pal) + { + PALETTEENTRY palent[256]; + + if (!dst_pal) + { + LeaveCriticalSection(&ddraw_cs); + return DDERR_NOPALETTEATTACHED; + } + IDirectDrawPalette_GetEntries(src_pal, 0, 0, 256, palent); + IDirectDrawPalette_SetEntries(dst_pal, 0, 0, 256, palent); + } + + /* Copy one surface on the other */ + dst_desc = (DDSURFACEDESC *)&(dst_surface->surface_desc); + src_desc = (DDSURFACEDESC *)&(src_surface->surface_desc); + + if ((src_desc->dwWidth != dst_desc->dwWidth) || (src_desc->dwHeight != dst_desc->dwHeight)) + { + /* Should also check for same pixel format, u1.lPitch, ... */ + ERR("Error in surface sizes.\n"); + LeaveCriticalSection(&ddraw_cs); + return D3DERR_TEXTURE_LOAD_FAILED; + } + else + { + WINED3DLOCKED_RECT src_rect, dst_rect; + + /* Copy also the ColorKeying stuff */ + if (src_desc->dwFlags & DDSD_CKSRCBLT) + { + dst_desc->dwFlags |= DDSD_CKSRCBLT; + dst_desc->ddckCKSrcBlt.dwColorSpaceLowValue = src_desc->ddckCKSrcBlt.dwColorSpaceLowValue; + dst_desc->ddckCKSrcBlt.dwColorSpaceHighValue = src_desc->ddckCKSrcBlt.dwColorSpaceHighValue; + } + + /* Copy the main memory texture into the surface that corresponds + * to the OpenGL texture object. */ + + hr = IWineD3DSurface_LockRect(src_surface->WineD3DSurface, &src_rect, NULL, 0); + if (FAILED(hr)) + { + ERR("Failed to lock source surface, hr %#x.\n", hr); + LeaveCriticalSection(&ddraw_cs); + return D3DERR_TEXTURE_LOAD_FAILED; + } + + hr = IWineD3DSurface_LockRect(dst_surface->WineD3DSurface, &dst_rect, NULL, 0); + if (FAILED(hr)) + { + ERR("Failed to lock destination surface, hr %#x.\n", hr); + IWineD3DSurface_UnlockRect(src_surface->WineD3DSurface); + LeaveCriticalSection(&ddraw_cs); + return D3DERR_TEXTURE_LOAD_FAILED; + } + + if (dst_surface->surface_desc.u4.ddpfPixelFormat.dwFlags & DDPF_FOURCC) + memcpy(dst_rect.pBits, src_rect.pBits, src_surface->surface_desc.u1.dwLinearSize); + else + memcpy(dst_rect.pBits, src_rect.pBits, src_rect.Pitch * src_desc->dwHeight); + + IWineD3DSurface_UnlockRect(src_surface->WineD3DSurface); + IWineD3DSurface_UnlockRect(dst_surface->WineD3DSurface); + } + + if (src_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) + src_surface = get_sub_mimaplevel(src_surface); + else + src_surface = NULL; + + if (dst_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) + dst_surface = get_sub_mimaplevel(dst_surface); + else + dst_surface = NULL; + + if (!src_surface || !dst_surface) + { + if (src_surface != dst_surface) + ERR("Loading surface with different mipmap structure.\n"); + break; + } + } + + LeaveCriticalSection(&ddraw_cs); + + return hr; +} + +static HRESULT WINAPI d3d_texture1_Load(IDirect3DTexture *iface, IDirect3DTexture *src_texture) +{ + TRACE("iface %p, src_texture %p.\n", iface, src_texture); + + return d3d_texture2_Load((IDirect3DTexture2 *)&surface_from_texture1(iface)->IDirect3DTexture2_vtbl, + src_texture ? (IDirect3DTexture2 *)&surface_from_texture1(src_texture)->IDirect3DTexture2_vtbl : NULL); +} + /***************************************************************************** * The VTable *****************************************************************************/ -const IDirectDrawSurface7Vtbl IDirectDrawSurface7_Vtbl = +static const struct IDirectDrawSurface7Vtbl ddraw_surface7_vtbl = { - /*** IUnknown ***/ - IDirectDrawSurfaceImpl_QueryInterface, - IDirectDrawSurfaceImpl_AddRef, - IDirectDrawSurfaceImpl_Release, - /*** IDirectDrawSurface ***/ - IDirectDrawSurface7Impl_AddAttachedSurface, - IDirectDrawSurfaceImpl_AddOverlayDirtyRect, - IDirectDrawSurfaceImpl_Blt, - IDirectDrawSurfaceImpl_BltBatch, - IDirectDrawSurfaceImpl_BltFast, - IDirectDrawSurfaceImpl_DeleteAttachedSurface, - IDirectDrawSurfaceImpl_EnumAttachedSurfaces, - IDirectDrawSurfaceImpl_EnumOverlayZOrders, - IDirectDrawSurfaceImpl_Flip, - IDirectDrawSurfaceImpl_GetAttachedSurface, - IDirectDrawSurfaceImpl_GetBltStatus, - IDirectDrawSurfaceImpl_GetCaps, - IDirectDrawSurfaceImpl_GetClipper, - IDirectDrawSurfaceImpl_GetColorKey, - IDirectDrawSurfaceImpl_GetDC, - IDirectDrawSurfaceImpl_GetFlipStatus, - IDirectDrawSurfaceImpl_GetOverlayPosition, - IDirectDrawSurfaceImpl_GetPalette, - IDirectDrawSurfaceImpl_GetPixelFormat, - IDirectDrawSurfaceImpl_GetSurfaceDesc, - IDirectDrawSurfaceImpl_Initialize, - IDirectDrawSurfaceImpl_IsLost, - IDirectDrawSurfaceImpl_Lock, - IDirectDrawSurfaceImpl_ReleaseDC, - IDirectDrawSurfaceImpl_Restore, - IDirectDrawSurfaceImpl_SetClipper, - IDirectDrawSurfaceImpl_SetColorKey, - IDirectDrawSurfaceImpl_SetOverlayPosition, - IDirectDrawSurfaceImpl_SetPalette, - IDirectDrawSurfaceImpl_Unlock, - IDirectDrawSurfaceImpl_UpdateOverlay, - IDirectDrawSurfaceImpl_UpdateOverlayDisplay, - IDirectDrawSurfaceImpl_UpdateOverlayZOrder, - /*** IDirectDrawSurface2 ***/ - IDirectDrawSurfaceImpl_GetDDInterface, - IDirectDrawSurfaceImpl_PageLock, - IDirectDrawSurfaceImpl_PageUnlock, - /*** IDirectDrawSurface3 ***/ - IDirectDrawSurfaceImpl_SetSurfaceDesc, - /*** IDirectDrawSurface4 ***/ - IDirectDrawSurfaceImpl_SetPrivateData, - IDirectDrawSurfaceImpl_GetPrivateData, - IDirectDrawSurfaceImpl_FreePrivateData, - IDirectDrawSurfaceImpl_GetUniquenessValue, - IDirectDrawSurfaceImpl_ChangeUniquenessValue, - /*** IDirectDrawSurface7 ***/ - IDirectDrawSurfaceImpl_SetPriority, - IDirectDrawSurfaceImpl_GetPriority, - IDirectDrawSurfaceImpl_SetLOD, - IDirectDrawSurfaceImpl_GetLOD + /* IUnknown */ + ddraw_surface7_QueryInterface, + ddraw_surface7_AddRef, + ddraw_surface7_Release, + /* IDirectDrawSurface */ + ddraw_surface7_AddAttachedSurface, + ddraw_surface7_AddOverlayDirtyRect, + ddraw_surface7_Blt, + ddraw_surface7_BltBatch, + ddraw_surface7_BltFast, + ddraw_surface7_DeleteAttachedSurface, + ddraw_surface7_EnumAttachedSurfaces, + ddraw_surface7_EnumOverlayZOrders, + ddraw_surface7_Flip, + ddraw_surface7_GetAttachedSurface, + ddraw_surface7_GetBltStatus, + ddraw_surface7_GetCaps, + ddraw_surface7_GetClipper, + ddraw_surface7_GetColorKey, + ddraw_surface7_GetDC, + ddraw_surface7_GetFlipStatus, + ddraw_surface7_GetOverlayPosition, + ddraw_surface7_GetPalette, + ddraw_surface7_GetPixelFormat, + ddraw_surface7_GetSurfaceDesc, + ddraw_surface7_Initialize, + ddraw_surface7_IsLost, + ddraw_surface7_Lock, + ddraw_surface7_ReleaseDC, + ddraw_surface7_Restore, + ddraw_surface7_SetClipper, + ddraw_surface7_SetColorKey, + ddraw_surface7_SetOverlayPosition, + ddraw_surface7_SetPalette, + ddraw_surface7_Unlock, + ddraw_surface7_UpdateOverlay, + ddraw_surface7_UpdateOverlayDisplay, + ddraw_surface7_UpdateOverlayZOrder, + /* IDirectDrawSurface2 */ + ddraw_surface7_GetDDInterface, + ddraw_surface7_PageLock, + ddraw_surface7_PageUnlock, + /* IDirectDrawSurface3 */ + ddraw_surface7_SetSurfaceDesc, + /* IDirectDrawSurface4 */ + ddraw_surface7_SetPrivateData, + ddraw_surface7_GetPrivateData, + ddraw_surface7_FreePrivateData, + ddraw_surface7_GetUniquenessValue, + ddraw_surface7_ChangeUniquenessValue, + /* IDirectDrawSurface7 */ + ddraw_surface7_SetPriority, + ddraw_surface7_GetPriority, + ddraw_surface7_SetLOD, + ddraw_surface7_GetLOD, }; + +static const struct IDirectDrawSurface3Vtbl ddraw_surface3_vtbl = +{ + /* IUnknown */ + ddraw_surface3_QueryInterface, + ddraw_surface3_AddRef, + ddraw_surface3_Release, + /* IDirectDrawSurface */ + ddraw_surface3_AddAttachedSurface, + ddraw_surface3_AddOverlayDirtyRect, + ddraw_surface3_Blt, + ddraw_surface3_BltBatch, + ddraw_surface3_BltFast, + ddraw_surface3_DeleteAttachedSurface, + ddraw_surface3_EnumAttachedSurfaces, + ddraw_surface3_EnumOverlayZOrders, + ddraw_surface3_Flip, + ddraw_surface3_GetAttachedSurface, + ddraw_surface3_GetBltStatus, + ddraw_surface3_GetCaps, + ddraw_surface3_GetClipper, + ddraw_surface3_GetColorKey, + ddraw_surface3_GetDC, + ddraw_surface3_GetFlipStatus, + ddraw_surface3_GetOverlayPosition, + ddraw_surface3_GetPalette, + ddraw_surface3_GetPixelFormat, + ddraw_surface3_GetSurfaceDesc, + ddraw_surface3_Initialize, + ddraw_surface3_IsLost, + ddraw_surface3_Lock, + ddraw_surface3_ReleaseDC, + ddraw_surface3_Restore, + ddraw_surface3_SetClipper, + ddraw_surface3_SetColorKey, + ddraw_surface3_SetOverlayPosition, + ddraw_surface3_SetPalette, + ddraw_surface3_Unlock, + ddraw_surface3_UpdateOverlay, + ddraw_surface3_UpdateOverlayDisplay, + ddraw_surface3_UpdateOverlayZOrder, + /* IDirectDrawSurface2 */ + ddraw_surface3_GetDDInterface, + ddraw_surface3_PageLock, + ddraw_surface3_PageUnlock, + /* IDirectDrawSurface3 */ + ddraw_surface3_SetSurfaceDesc, +}; + +static const struct IDirectDrawGammaControlVtbl ddraw_gamma_control_vtbl = +{ + ddraw_gamma_control_QueryInterface, + ddraw_gamma_control_AddRef, + ddraw_gamma_control_Release, + ddraw_gamma_control_GetGammaRamp, + ddraw_gamma_control_SetGammaRamp, +}; + +static const struct IDirect3DTexture2Vtbl d3d_texture2_vtbl = +{ + d3d_texture2_QueryInterface, + d3d_texture2_AddRef, + d3d_texture2_Release, + d3d_texture2_GetHandle, + d3d_texture2_PaletteChanged, + d3d_texture2_Load, +}; + +static const struct IDirect3DTextureVtbl d3d_texture1_vtbl = +{ + d3d_texture1_QueryInterface, + d3d_texture1_AddRef, + d3d_texture1_Release, + d3d_texture1_Initialize, + d3d_texture1_GetHandle, + d3d_texture1_PaletteChanged, + d3d_texture1_Load, + d3d_texture1_Unload, +}; + +HRESULT ddraw_surface_init(IDirectDrawSurfaceImpl *surface, IDirectDrawImpl *ddraw, + DDSURFACEDESC2 *desc, UINT mip_level, WINED3DSURFTYPE surface_type) +{ + WINED3DPOOL pool = WINED3DPOOL_DEFAULT; + WINED3DSURFACE_DESC wined3d_desc; + enum wined3d_format_id format; + DWORD usage = 0; + HRESULT hr; + + if (!(desc->ddsCaps.dwCaps & (DDSCAPS_VIDEOMEMORY | DDSCAPS_SYSTEMMEMORY)) + && !((desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE) + && (desc->ddsCaps.dwCaps2 & DDSCAPS2_TEXTUREMANAGE))) + { + /* Tests show surfaces without memory flags get these flags added + * right after creation. */ + desc->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY; + } + + if (desc->ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE)) + { + usage |= WINED3DUSAGE_RENDERTARGET; + desc->ddsCaps.dwCaps |= DDSCAPS_VISIBLE; + } + + if (desc->ddsCaps.dwCaps & (DDSCAPS_OVERLAY)) + { + usage |= WINED3DUSAGE_OVERLAY; + } + + if (ddraw->depthstencil || (desc->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)) + { + /* The depth stencil creation callback sets this flag. Set the + * wined3d usage to let it know it's a depth/stencil surface. */ + usage |= WINED3DUSAGE_DEPTHSTENCIL; + } + + if (desc->ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY) + { + pool = WINED3DPOOL_SYSTEMMEM; + } + else if (desc->ddsCaps.dwCaps2 & DDSCAPS2_TEXTUREMANAGE) + { + pool = WINED3DPOOL_MANAGED; + /* Managed textures have the system memory flag set. */ + desc->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + } + else if (desc->ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY) + { + /* Videomemory adds localvidmem. This is mutually exclusive with + * systemmemory and texturemanage. */ + desc->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM; + } + + format = PixelFormat_DD2WineD3D(&desc->u4.ddpfPixelFormat); + if (format == WINED3DFMT_UNKNOWN) + { + WARN("Unsupported / unknown pixelformat.\n"); + return DDERR_INVALIDPIXELFORMAT; + } + + surface->lpVtbl = &ddraw_surface7_vtbl; + surface->IDirectDrawSurface3_vtbl = &ddraw_surface3_vtbl; + surface->IDirectDrawGammaControl_vtbl = &ddraw_gamma_control_vtbl; + surface->IDirect3DTexture2_vtbl = &d3d_texture2_vtbl; + surface->IDirect3DTexture_vtbl = &d3d_texture1_vtbl; + surface->ref = 1; + surface->version = 7; + surface->ddraw = ddraw; + + surface->surface_desc.dwSize = sizeof(DDSURFACEDESC2); + surface->surface_desc.u4.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + DD_STRUCT_COPY_BYSIZE(&surface->surface_desc, desc); + + surface->first_attached = surface; + surface->ImplType = surface_type; + + hr = IWineD3DDevice_CreateSurface(ddraw->wineD3DDevice, desc->dwWidth, desc->dwHeight, format, + TRUE /* Lockable */, FALSE /* Discard */, mip_level, usage, pool, + WINED3DMULTISAMPLE_NONE, 0 /* MultiSampleQuality */, surface_type, surface, + &ddraw_null_wined3d_parent_ops, &surface->WineD3DSurface); + if (FAILED(hr)) + { + WARN("Failed to create wined3d surface, hr %#x.\n", hr); + return hr; + } + + surface->surface_desc.dwFlags |= DDSD_PIXELFORMAT; + IWineD3DSurface_GetDesc(surface->WineD3DSurface, &wined3d_desc); + + format = wined3d_desc.format; + if (format == WINED3DFMT_UNKNOWN) + { + FIXME("IWineD3DSurface::GetDesc returned WINED3DFMT_UNKNOWN.\n"); + } + PixelFormat_WineD3DtoDD(&surface->surface_desc.u4.ddpfPixelFormat, format); + + /* Anno 1602 stores the pitch right after surface creation, so make sure + * it's there. TODO: Test other fourcc formats. */ + if (format == WINED3DFMT_DXT1 || format == WINED3DFMT_DXT2 || format == WINED3DFMT_DXT3 + || format == WINED3DFMT_DXT4 || format == WINED3DFMT_DXT5) + { + surface->surface_desc.dwFlags |= DDSD_LINEARSIZE; + if (format == WINED3DFMT_DXT1) + { + surface->surface_desc.u1.dwLinearSize = max(4, wined3d_desc.width) * max(4, wined3d_desc.height) / 2; + } + else + { + surface->surface_desc.u1.dwLinearSize = max(4, wined3d_desc.width) * max(4, wined3d_desc.height); + } + } + else + { + surface->surface_desc.dwFlags |= DDSD_PITCH; + surface->surface_desc.u1.lPitch = IWineD3DSurface_GetPitch(surface->WineD3DSurface); + } + + if (desc->dwFlags & DDSD_CKDESTOVERLAY) + { + IWineD3DSurface_SetColorKey(surface->WineD3DSurface, + DDCKEY_DESTOVERLAY, (WINEDDCOLORKEY *)&desc->u3.ddckCKDestOverlay); + } + if (desc->dwFlags & DDSD_CKDESTBLT) + { + IWineD3DSurface_SetColorKey(surface->WineD3DSurface, + DDCKEY_DESTBLT, (WINEDDCOLORKEY *)&desc->ddckCKDestBlt); + } + if (desc->dwFlags & DDSD_CKSRCOVERLAY) + { + IWineD3DSurface_SetColorKey(surface->WineD3DSurface, + DDCKEY_SRCOVERLAY, (WINEDDCOLORKEY *)&desc->ddckCKSrcOverlay); + } + if (desc->dwFlags & DDSD_CKSRCBLT) + { + IWineD3DSurface_SetColorKey(surface->WineD3DSurface, + DDCKEY_SRCBLT, (WINEDDCOLORKEY *)&desc->ddckCKSrcBlt); + } + if (desc->dwFlags & DDSD_LPSURFACE) + { + hr = IWineD3DSurface_SetMem(surface->WineD3DSurface, desc->lpSurface); + if (FAILED(hr)) + { + ERR("Failed to set surface memory, hr %#x.\n", hr); + IWineD3DSurface_Release(surface->WineD3DSurface); + return hr; + } + } + + return DD_OK; +} diff --git a/dll/directx/wine/ddraw/surface_thunks.c b/dll/directx/wine/ddraw/surface_thunks.c deleted file mode 100644 index d235ff9d87d..00000000000 --- a/dll/directx/wine/ddraw/surface_thunks.c +++ /dev/null @@ -1,484 +0,0 @@ -/* IDirectDrawSurface3 -> IDirectDrawSurface7 thunks - * Copyright 2000 TransGaming Technologies Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "wine/port.h" -#include "wine/debug.h" -#include -#include - -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "ddraw.h" -#include "winerror.h" - -#include "ddraw_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(ddraw_thunk); -WINE_DECLARE_DEBUG_CHANNEL(ddraw); - -static HRESULT WINAPI -IDirectDrawSurface3Impl_QueryInterface(LPDIRECTDRAWSURFACE3 This, REFIID iid, - LPVOID *ppObj) -{ - return IDirectDrawSurface7_QueryInterface((IDirectDrawSurface7 *)surface_from_surface3(This), iid, ppObj); -} - -static ULONG WINAPI -IDirectDrawSurface3Impl_AddRef(LPDIRECTDRAWSURFACE3 This) -{ - return IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)surface_from_surface3(This)); -} - -static ULONG WINAPI -IDirectDrawSurface3Impl_Release(LPDIRECTDRAWSURFACE3 iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_surface3(iface); - TRACE("(%p)\n", This); - return IDirectDrawSurface7_Release((IDirectDrawSurface7 *)surface_from_surface3(iface)); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_AddAttachedSurface(LPDIRECTDRAWSURFACE3 iface, - LPDIRECTDRAWSURFACE3 pAttach) -{ - IDirectDrawSurfaceImpl *This = surface_from_surface3(iface); - IDirectDrawSurfaceImpl *Surf = surface_from_surface3(pAttach); - TRACE("(%p)->(%p)\n", This, Surf); - - /* Tests suggest that - * -> offscreen plain surfaces can be attached to other offscreen plain surfaces - * -> offscreen plain surfaces can be attached to primaries - * -> primaries can be attached to offscreen plain surfaces - * -> z buffers can be attached to primaries - * - */ - if(This->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN) && - Surf->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN)) - { - /* Sizes have to match */ - if(Surf->surface_desc.dwWidth != This->surface_desc.dwWidth || - Surf->surface_desc.dwHeight != This->surface_desc.dwHeight) - { - WARN("Surface sizes do not match\n"); - return DDERR_CANNOTATTACHSURFACE; - } - /* OK */ - } - else if(This->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE) && - Surf->surface_desc.ddsCaps.dwCaps & (DDSCAPS_ZBUFFER)) - { - /* OK */ - } - else - { - WARN("Invalid attachment combination\n"); - return DDERR_CANNOTATTACHSURFACE; - } - - return IDirectDrawSurfaceImpl_AddAttachedSurface(This, - Surf); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE3 This, - LPRECT pRect) -{ - return IDirectDrawSurface7_AddOverlayDirtyRect((IDirectDrawSurface7 *)surface_from_surface3(This), pRect); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_Blt(LPDIRECTDRAWSURFACE3 This, LPRECT prcDst, - LPDIRECTDRAWSURFACE3 pSrcSurf, LPRECT prcSrc, - DWORD dwFlags, LPDDBLTFX pFX) -{ - return IDirectDrawSurface7_Blt((IDirectDrawSurface7 *)surface_from_surface3(This), prcDst, - pSrcSurf ? (IDirectDrawSurface7 *)surface_from_surface3(pSrcSurf) : NULL, prcSrc, dwFlags, pFX); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_BltBatch(LPDIRECTDRAWSURFACE3 This, - LPDDBLTBATCH pBatch, DWORD dwCount, - DWORD dwFlags) -{ - return IDirectDrawSurface7_BltBatch((IDirectDrawSurface7 *)surface_from_surface3(This), pBatch, dwCount, dwFlags); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_BltFast(LPDIRECTDRAWSURFACE3 This, DWORD x, DWORD y, - LPDIRECTDRAWSURFACE3 pSrcSurf, LPRECT prcSrc, - DWORD dwTrans) -{ - return IDirectDrawSurface7_BltFast((IDirectDrawSurface7 *)surface_from_surface3(This), x, y, - pSrcSurf ? (IDirectDrawSurface7 *)surface_from_surface3(pSrcSurf) : NULL, prcSrc, dwTrans); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_DeleteAttachedSurface(LPDIRECTDRAWSURFACE3 This, - DWORD dwFlags, - LPDIRECTDRAWSURFACE3 pAttached) -{ - return IDirectDrawSurface7_DeleteAttachedSurface((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags, - pAttached ? (IDirectDrawSurface7 *)surface_from_surface3(pAttached) : NULL); -} - -struct callback_info -{ - LPDDENUMSURFACESCALLBACK callback; - LPVOID context; -}; - -static HRESULT CALLBACK -EnumCallback(LPDIRECTDRAWSURFACE7 iface, LPDDSURFACEDESC2 pDDSD, - LPVOID context) -{ - const struct callback_info* info = context; - -#if 0 - /* This is an outgoing conversion so we have to do it. */ - DDSURFACEDESC ddsd; - memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - DDRAW_Convert_DDSURFACEDESC_2_To_1(pDDSD, &ddsd); -#endif - - /* the LPDDSURFACEDESC2 -> LPDDSURFACEDESC coercion is safe, since - * the data format is compatible with older enum procs */ - return info->callback(iface ? - (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)iface)->IDirectDrawSurface3_vtbl : NULL, - (LPDDSURFACEDESC)pDDSD, info->context); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE3 This, - LPVOID context, - LPDDENUMSURFACESCALLBACK callback) -{ - struct callback_info info; - - info.callback = callback; - info.context = context; - - return IDirectDrawSurface7_EnumAttachedSurfaces((IDirectDrawSurface7 *)surface_from_surface3(This), - &info, EnumCallback); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_EnumOverlayZOrders(LPDIRECTDRAWSURFACE3 This, - DWORD dwFlags, LPVOID context, - LPDDENUMSURFACESCALLBACK callback) -{ - struct callback_info info; - - info.callback = callback; - info.context = context; - - return IDirectDrawSurface7_EnumOverlayZOrders((IDirectDrawSurface7 *)surface_from_surface3(This), - dwFlags, &info, EnumCallback); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_Flip(LPDIRECTDRAWSURFACE3 This, - LPDIRECTDRAWSURFACE3 pOverride, DWORD dwFlags) -{ - return IDirectDrawSurface7_Flip((IDirectDrawSurface7 *)surface_from_surface3(This), - pOverride ? (IDirectDrawSurface7 *)surface_from_surface3(pOverride) : NULL, dwFlags); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_GetAttachedSurface(LPDIRECTDRAWSURFACE3 This, - LPDDSCAPS pCaps, - LPDIRECTDRAWSURFACE3* ppAttached) -{ - DDSCAPS2 caps; - LPDIRECTDRAWSURFACE7 pAttached7; - HRESULT hr; - - caps.dwCaps = pCaps->dwCaps; - caps.dwCaps2 = 0; - caps.dwCaps3 = 0; - caps.dwCaps4 = 0; - - hr = IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)surface_from_surface3(This), &caps, &pAttached7); - if (FAILED(hr)) *ppAttached = NULL; - else *ppAttached = pAttached7 ? - (IDirectDrawSurface3 *)&((IDirectDrawSurfaceImpl *)pAttached7)->IDirectDrawSurface3_vtbl : NULL; - return hr; -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_GetBltStatus(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags) -{ - return IDirectDrawSurface7_GetBltStatus((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_GetCaps(LPDIRECTDRAWSURFACE3 This, LPDDSCAPS pCaps) -{ - DDSCAPS2 caps; - HRESULT hr; - - hr = IDirectDrawSurface7_GetCaps((IDirectDrawSurface7 *)surface_from_surface3(This), &caps); - if (FAILED(hr)) return hr; - - pCaps->dwCaps = caps.dwCaps; - return hr; -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_GetClipper(LPDIRECTDRAWSURFACE3 This, - LPDIRECTDRAWCLIPPER* ppClipper) -{ - return IDirectDrawSurface7_GetClipper((IDirectDrawSurface7 *)surface_from_surface3(This), ppClipper); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_GetColorKey(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags, - LPDDCOLORKEY pCKey) -{ - return IDirectDrawSurface7_GetColorKey((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags, pCKey); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_GetDC(LPDIRECTDRAWSURFACE3 This, HDC* phDC) -{ - return IDirectDrawSurface7_GetDC((IDirectDrawSurface7 *)surface_from_surface3(This), phDC); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_GetFlipStatus(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags) -{ - return IDirectDrawSurface7_GetFlipStatus((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_GetOverlayPosition(LPDIRECTDRAWSURFACE3 This, LPLONG pX, - LPLONG pY) -{ - return IDirectDrawSurface7_GetOverlayPosition((IDirectDrawSurface7 *)surface_from_surface3(This), pX, pY); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_GetPalette(LPDIRECTDRAWSURFACE3 This, - LPDIRECTDRAWPALETTE* ppPalette) -{ - return IDirectDrawSurface7_GetPalette((IDirectDrawSurface7 *)surface_from_surface3(This), ppPalette); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_GetPixelFormat(LPDIRECTDRAWSURFACE3 This, - LPDDPIXELFORMAT pPixelFormat) -{ - return IDirectDrawSurface7_GetPixelFormat((IDirectDrawSurface7 *)surface_from_surface3(This), pPixelFormat); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_GetSurfaceDesc(LPDIRECTDRAWSURFACE3 iface, - LPDDSURFACEDESC pDDSD) -{ - IDirectDrawSurfaceImpl *This = surface_from_surface3(iface); - - TRACE_(ddraw)("(%p)->(%p)\n",This,pDDSD); - - if(!pDDSD) - return DDERR_INVALIDPARAMS; - - if (pDDSD->dwSize != sizeof(DDSURFACEDESC)) - { - WARN("Incorrect struct size %d, returning DDERR_INVALIDPARAMS\n",pDDSD->dwSize); - return DDERR_INVALIDPARAMS; - } - - EnterCriticalSection(&ddraw_cs); - DD_STRUCT_COPY_BYSIZE(pDDSD,(DDSURFACEDESC *) &This->surface_desc); - TRACE("Returning surface desc:\n"); - if (TRACE_ON(ddraw)) - { - /* DDRAW_dump_surface_desc handles the smaller size */ - DDRAW_dump_surface_desc((DDSURFACEDESC2 *) pDDSD); - } - - LeaveCriticalSection(&ddraw_cs); - return DD_OK; -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_Initialize(LPDIRECTDRAWSURFACE3 This, LPDIRECTDRAW pDD, - LPDDSURFACEDESC pDDSD) -{ - return IDirectDrawSurface7_Initialize((IDirectDrawSurface7 *)surface_from_surface3(This), - pDD, (LPDDSURFACEDESC2)pDDSD); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_IsLost(LPDIRECTDRAWSURFACE3 This) -{ - return IDirectDrawSurface7_IsLost((IDirectDrawSurface7 *)surface_from_surface3(This)); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_Lock(LPDIRECTDRAWSURFACE3 This, LPRECT pRect, - LPDDSURFACEDESC pDDSD, DWORD dwFlags, HANDLE h) -{ - return IDirectDrawSurface7_Lock((IDirectDrawSurface7 *)surface_from_surface3(This), - pRect, (LPDDSURFACEDESC2)pDDSD, dwFlags, h); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_ReleaseDC(LPDIRECTDRAWSURFACE3 This, HDC hDC) -{ - return IDirectDrawSurface7_ReleaseDC((IDirectDrawSurface7 *)surface_from_surface3(This), hDC); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_Restore(LPDIRECTDRAWSURFACE3 This) -{ - return IDirectDrawSurface7_Restore((IDirectDrawSurface7 *)surface_from_surface3(This)); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_SetClipper(LPDIRECTDRAWSURFACE3 This, - LPDIRECTDRAWCLIPPER pClipper) -{ - return IDirectDrawSurface7_SetClipper((IDirectDrawSurface7 *)surface_from_surface3(This), pClipper); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_SetColorKey(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags, - LPDDCOLORKEY pCKey) -{ - return IDirectDrawSurface7_SetColorKey((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags, pCKey); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_SetOverlayPosition(LPDIRECTDRAWSURFACE3 This, LONG x, - LONG y) -{ - return IDirectDrawSurface7_SetOverlayPosition((IDirectDrawSurface7 *)surface_from_surface3(This), x, y); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_SetPalette(LPDIRECTDRAWSURFACE3 This, - LPDIRECTDRAWPALETTE pPalette) -{ - return IDirectDrawSurface7_SetPalette((IDirectDrawSurface7 *)surface_from_surface3(This), pPalette); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_Unlock(LPDIRECTDRAWSURFACE3 This, LPVOID data) -{ - /* data might not be the LPRECT of later versions, so drop it. */ - return IDirectDrawSurface7_Unlock((IDirectDrawSurface7 *)surface_from_surface3(This), NULL); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_UpdateOverlay(LPDIRECTDRAWSURFACE3 This, LPRECT prcSrc, - LPDIRECTDRAWSURFACE3 pDstSurf, - LPRECT prcDst, DWORD dwFlags, - LPDDOVERLAYFX pFX) -{ - return IDirectDrawSurface7_UpdateOverlay((IDirectDrawSurface7 *)surface_from_surface3(This), prcSrc, - pDstSurf ? (IDirectDrawSurface7 *)surface_from_surface3(pDstSurf) : NULL, prcDst, dwFlags, pFX); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_UpdateOverlayDisplay(LPDIRECTDRAWSURFACE3 This, - DWORD dwFlags) -{ - return IDirectDrawSurface7_UpdateOverlayDisplay((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_UpdateOverlayZOrder(LPDIRECTDRAWSURFACE3 This, - DWORD dwFlags, - LPDIRECTDRAWSURFACE3 pSurfReference) -{ - return IDirectDrawSurface7_UpdateOverlayZOrder((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags, - pSurfReference ? (IDirectDrawSurface7 *)surface_from_surface3(pSurfReference) : NULL); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_GetDDInterface(LPDIRECTDRAWSURFACE3 This, LPVOID* ppDD) -{ - return IDirectDrawSurface7_GetDDInterface((IDirectDrawSurface7 *)surface_from_surface3(This), ppDD); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_PageLock(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags) -{ - return IDirectDrawSurface7_PageLock((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_PageUnlock(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags) -{ - return IDirectDrawSurface7_PageUnlock((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags); -} - -static HRESULT WINAPI -IDirectDrawSurface3Impl_SetSurfaceDesc(LPDIRECTDRAWSURFACE3 This, - LPDDSURFACEDESC pDDSD, DWORD dwFlags) -{ - return IDirectDrawSurface7_SetSurfaceDesc((IDirectDrawSurface7 *)surface_from_surface3(This), - (LPDDSURFACEDESC2)pDDSD, dwFlags); -} - -const IDirectDrawSurface3Vtbl IDirectDrawSurface3_Vtbl = -{ - IDirectDrawSurface3Impl_QueryInterface, - IDirectDrawSurface3Impl_AddRef, - IDirectDrawSurface3Impl_Release, - IDirectDrawSurface3Impl_AddAttachedSurface, - IDirectDrawSurface3Impl_AddOverlayDirtyRect, - IDirectDrawSurface3Impl_Blt, - IDirectDrawSurface3Impl_BltBatch, - IDirectDrawSurface3Impl_BltFast, - IDirectDrawSurface3Impl_DeleteAttachedSurface, - IDirectDrawSurface3Impl_EnumAttachedSurfaces, - IDirectDrawSurface3Impl_EnumOverlayZOrders, - IDirectDrawSurface3Impl_Flip, - IDirectDrawSurface3Impl_GetAttachedSurface, - IDirectDrawSurface3Impl_GetBltStatus, - IDirectDrawSurface3Impl_GetCaps, - IDirectDrawSurface3Impl_GetClipper, - IDirectDrawSurface3Impl_GetColorKey, - IDirectDrawSurface3Impl_GetDC, - IDirectDrawSurface3Impl_GetFlipStatus, - IDirectDrawSurface3Impl_GetOverlayPosition, - IDirectDrawSurface3Impl_GetPalette, - IDirectDrawSurface3Impl_GetPixelFormat, - IDirectDrawSurface3Impl_GetSurfaceDesc, - IDirectDrawSurface3Impl_Initialize, - IDirectDrawSurface3Impl_IsLost, - IDirectDrawSurface3Impl_Lock, - IDirectDrawSurface3Impl_ReleaseDC, - IDirectDrawSurface3Impl_Restore, - IDirectDrawSurface3Impl_SetClipper, - IDirectDrawSurface3Impl_SetColorKey, - IDirectDrawSurface3Impl_SetOverlayPosition, - IDirectDrawSurface3Impl_SetPalette, - IDirectDrawSurface3Impl_Unlock, - IDirectDrawSurface3Impl_UpdateOverlay, - IDirectDrawSurface3Impl_UpdateOverlayDisplay, - IDirectDrawSurface3Impl_UpdateOverlayZOrder, - IDirectDrawSurface3Impl_GetDDInterface, - IDirectDrawSurface3Impl_PageLock, - IDirectDrawSurface3Impl_PageUnlock, - IDirectDrawSurface3Impl_SetSurfaceDesc -}; diff --git a/dll/directx/wine/ddraw/texture.c b/dll/directx/wine/ddraw/texture.c deleted file mode 100644 index 13b14f60085..00000000000 --- a/dll/directx/wine/ddraw/texture.c +++ /dev/null @@ -1,498 +0,0 @@ -/* Direct3D Texture - * Copyright (c) 1998 Lionel ULMER - * Copyright (c) 2006 Stefan Dテ亡INGER - * - * This file contains the implementation of interface Direct3DTexture2. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "wine/port.h" - -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - -#include "ddraw_private.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); -WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk); - -/***************************************************************************** - * IUnknown interfaces. They are thunks to IDirectDrawSurface7 - *****************************************************************************/ -static HRESULT WINAPI -Thunk_IDirect3DTextureImpl_2_QueryInterface(IDirect3DTexture2 *iface, - REFIID riid, - void **obj) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); - TRACE("(%p)->(%s,%p) thunking to IDirectDrawSurface7 interface.\n", This, debugstr_guid(riid), obj); - return IDirectDrawSurface7_QueryInterface((IDirectDrawSurface7 *)This, riid, obj); -} - -static HRESULT WINAPI -Thunk_IDirect3DTextureImpl_1_QueryInterface(IDirect3DTexture *iface, - REFIID riid, - void **obj) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - TRACE("(%p)->(%s,%p) thunking to IDirectDrawSurface7 interface.\n", This, debugstr_guid(riid), obj); - - return IDirectDrawSurface7_QueryInterface((IDirectDrawSurface7 *)This, riid, obj); -} - -static ULONG WINAPI -Thunk_IDirect3DTextureImpl_2_AddRef(IDirect3DTexture2 *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); - TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This); - - return IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)This); -} - -static ULONG WINAPI -Thunk_IDirect3DTextureImpl_1_AddRef(IDirect3DTexture *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This); - - return IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)This); -} - -static ULONG WINAPI -Thunk_IDirect3DTextureImpl_2_Release(IDirect3DTexture2 *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); - TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This); - - return IDirectDrawSurface7_Release((IDirectDrawSurface7 *)This); -} - - -static ULONG WINAPI -Thunk_IDirect3DTextureImpl_1_Release(IDirect3DTexture *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This); - - return IDirectDrawSurface7_Release((IDirectDrawSurface7 *)This); -} - -/***************************************************************************** - * IDirect3DTexture interface - *****************************************************************************/ - -/***************************************************************************** - * IDirect3DTexture1::Initialize - * - * The sdk says it's not implemented - * - * Params: - * ? - * - * Returns - * DDERR_UNSUPPORTED - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DTextureImpl_1_Initialize(IDirect3DTexture *iface, - IDirect3DDevice *Direct3DDevice, - IDirectDrawSurface *DDSurface) -{ - TRACE("(%p)->(%p,%p) Not implemented\n", iface, Direct3DDevice, DDSurface); - return DDERR_UNSUPPORTED; /* Unchecked */ -} - -/***************************************************************************** - * IDirect3DTexture2::PaletteChanged - * - * Informs the texture about a palette change - * - * Params: - * Start: Start index of the change - * Count: The number of changed entries - * - * Returns - * D3D_OK, because it's a stub - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DTextureImpl_PaletteChanged(IDirect3DTexture2 *iface, - DWORD Start, - DWORD Count) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); - FIXME("(%p)->(%08x,%08x): stub!\n", This, Start, Count); - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DTextureImpl_1_PaletteChanged(IDirect3DTexture *iface, - DWORD Start, - DWORD Count) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - TRACE("(%p)->(%08x,%08x) thunking to IDirect3DTexture2 interface.\n", This, Start, Count); - - return IDirect3DTexture2_PaletteChanged((IDirect3DTexture2 *)&This->IDirect3DTexture2_vtbl, Start, Count); -} - - -/***************************************************************************** - * IDirect3DTexture::Unload - * - * DX5 SDK: "The IDirect3DTexture2::Unload method is not implemented - * - * - * Returns: - * DDERR_UNSUPPORTED - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DTextureImpl_1_Unload(IDirect3DTexture *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - TRACE("(%p)->(): not implemented!\n", This); - return DDERR_UNSUPPORTED; -} - -/***************************************************************************** - * IDirect3DTexture2::GetHandle - * - * Returns handle for the texture. At the moment, the interface - * to the IWineD3DTexture is used. - * - * Params: - * Direct3DDevice2: Device this handle is assigned to - * Handle: Address to store the handle at. - * - * Returns: - * D3D_OK - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DTextureImpl_GetHandle(IDirect3DTexture2 *iface, - IDirect3DDevice2 *Direct3DDevice2, - D3DTEXTUREHANDLE *lpHandle) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); - IDirect3DDeviceImpl *d3d = device_from_device2(Direct3DDevice2); - - TRACE("(%p)->(%p,%p)\n", This, d3d, lpHandle); - - EnterCriticalSection(&ddraw_cs); - if(!This->Handle) - { - This->Handle = IDirect3DDeviceImpl_CreateHandle(d3d); - if(This->Handle) - { - d3d->Handles[This->Handle - 1].ptr = This; - d3d->Handles[This->Handle - 1].type = DDrawHandle_Texture; - } - } - *lpHandle = This->Handle; - - TRACE(" returning handle %08x.\n", *lpHandle); - - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DTextureImpl_1_GetHandle(IDirect3DTexture *iface, - LPDIRECT3DDEVICE lpDirect3DDevice, - LPD3DTEXTUREHANDLE lpHandle) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - IDirect3DDeviceImpl *d3d = device_from_device1(lpDirect3DDevice); - IDirect3DTexture2 *d3d_texture2 = (IDirect3DTexture2 *)&This->IDirect3DTexture2_vtbl; - IDirect3DDevice2 *d3d_device2 = (IDirect3DDevice2 *)&d3d->IDirect3DDevice2_vtbl; - - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DTexture2 interface.\n", This, d3d, lpHandle); - - return IDirect3DTexture2_GetHandle(d3d_texture2, d3d_device2, lpHandle); -} - - -/***************************************************************************** - * get_sub_mimaplevel - * - * Helper function that returns the next mipmap level - * - * tex_ptr: Surface of which to return the next level - * - *****************************************************************************/ -static IDirectDrawSurfaceImpl * -get_sub_mimaplevel(IDirectDrawSurfaceImpl *tex_ptr) -{ - /* Now go down the mipmap chain to the next surface */ - static DDSCAPS2 mipmap_caps = { DDSCAPS_MIPMAP | DDSCAPS_TEXTURE, 0, 0, {0} }; - LPDIRECTDRAWSURFACE7 next_level; - IDirectDrawSurfaceImpl *surf_ptr; - HRESULT hr; - - hr = IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)tex_ptr, &mipmap_caps, &next_level); - if (FAILED(hr)) return NULL; - - surf_ptr = (IDirectDrawSurfaceImpl *)next_level; - IDirectDrawSurface7_Release(next_level); - - return surf_ptr; -} - -/***************************************************************************** - * IDirect3DTexture2::Load - * - * Loads a texture created with the DDSCAPS_ALLOCONLOAD - * - * This function isn't relayed to WineD3D because the whole interface is - * implemented in DDraw only. For speed improvements a implementation which - * takes OpenGL more into account could be placed into WineD3D. - * - * Params: - * D3DTexture2: Address of the texture to load - * - * Returns: - * D3D_OK on success - * D3DERR_TEXTURE_LOAD_FAILED. - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DTextureImpl_Load(IDirect3DTexture2 *iface, - IDirect3DTexture2 *D3DTexture2) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); - IDirectDrawSurfaceImpl *src_ptr = surface_from_texture2(D3DTexture2); - HRESULT ret_value = D3D_OK; - if(src_ptr == This) - { - TRACE("copying surface %p to surface %p, why?\n", src_ptr, This); - return ret_value; - } - - TRACE("(%p)->(%p)\n", This, src_ptr); - EnterCriticalSection(&ddraw_cs); - - if (((src_ptr->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) != (This->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP)) || - (src_ptr->surface_desc.u2.dwMipMapCount != This->surface_desc.u2.dwMipMapCount)) - { - ERR("Trying to load surfaces with different mip-map counts !\n"); - } - - while(1) - { - IWineD3DPalette *wine_pal, *wine_pal_src; - IDirectDrawPalette *pal = NULL, *pal_src = NULL; - DDSURFACEDESC *src_d, *dst_d; - - TRACE(" copying surface %p to surface %p (mipmap level %d)\n", src_ptr, This, src_ptr->mipmap_level); - - /* Suppress the ALLOCONLOAD flag */ - This->surface_desc.ddsCaps.dwCaps &= ~DDSCAPS_ALLOCONLOAD; - - /* Get the palettes */ - ret_value = IWineD3DSurface_GetPalette(This->WineD3DSurface, &wine_pal); - if( ret_value != D3D_OK) - { - ERR("IWineD3DSurface::GetPalette failed! This is unexpected\n"); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - if(wine_pal) - { - ret_value = IWineD3DPalette_GetParent(wine_pal, (IUnknown **) &pal); - if(ret_value != D3D_OK) - { - ERR("IWineD3DPalette::GetParent failed! This is unexpected\n"); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - } - - ret_value = IWineD3DSurface_GetPalette(src_ptr->WineD3DSurface, &wine_pal_src); - if( ret_value != D3D_OK) - { - ERR("IWineD3DSurface::GetPalette failed! This is unexpected\n"); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - if(wine_pal_src) - { - ret_value = IWineD3DPalette_GetParent(wine_pal_src, (IUnknown **) &pal_src); - if(ret_value != D3D_OK) - { - ERR("IWineD3DPalette::GetParent failed! This is unexpected\n"); - if (pal) IDirectDrawPalette_Release(pal); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - } - - if (pal_src != NULL) - { - PALETTEENTRY palent[256]; - - if (pal == NULL) - { - IDirectDrawPalette_Release(pal_src); - LeaveCriticalSection(&ddraw_cs); - return DDERR_NOPALETTEATTACHED; - } - IDirectDrawPalette_GetEntries(pal_src, 0, 0, 256, palent); - IDirectDrawPalette_SetEntries(pal, 0, 0, 256, palent); - } - - if (pal) IDirectDrawPalette_Release(pal); - if (pal_src) IDirectDrawPalette_Release(pal_src); - - /* Copy one surface on the other */ - dst_d = (DDSURFACEDESC *)&(This->surface_desc); - src_d = (DDSURFACEDESC *)&(src_ptr->surface_desc); - - if ((src_d->dwWidth != dst_d->dwWidth) || (src_d->dwHeight != dst_d->dwHeight)) - { - /* Should also check for same pixel format, u1.lPitch, ... */ - ERR("Error in surface sizes\n"); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - else - { - WINED3DLOCKED_RECT pSrcRect, pDstRect; - - /* LPDIRECT3DDEVICE2 d3dd = (LPDIRECT3DDEVICE2) This->D3Ddevice; */ - /* I should put a macro for the calculus of bpp */ - - /* Copy also the ColorKeying stuff */ - if (src_d->dwFlags & DDSD_CKSRCBLT) - { - dst_d->dwFlags |= DDSD_CKSRCBLT; - dst_d->ddckCKSrcBlt.dwColorSpaceLowValue = src_d->ddckCKSrcBlt.dwColorSpaceLowValue; - dst_d->ddckCKSrcBlt.dwColorSpaceHighValue = src_d->ddckCKSrcBlt.dwColorSpaceHighValue; - } - - /* Copy the main memory texture into the surface that corresponds to the OpenGL - texture object. */ - - ret_value = IWineD3DSurface_LockRect(src_ptr->WineD3DSurface, &pSrcRect, NULL, 0); - if(ret_value != D3D_OK) - { - ERR(" (%p) Locking the source surface failed\n", This); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - - ret_value = IWineD3DSurface_LockRect(This->WineD3DSurface, &pDstRect, NULL, 0); - if(ret_value != D3D_OK) - { - ERR(" (%p) Locking the destination surface failed\n", This); - IWineD3DSurface_UnlockRect(src_ptr->WineD3DSurface); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - - if (This->surface_desc.u4.ddpfPixelFormat.dwFlags & DDPF_FOURCC) - memcpy(pDstRect.pBits, pSrcRect.pBits, src_ptr->surface_desc.u1.dwLinearSize); - else - memcpy(pDstRect.pBits, pSrcRect.pBits, pSrcRect.Pitch * src_d->dwHeight); - - IWineD3DSurface_UnlockRect(src_ptr->WineD3DSurface); - IWineD3DSurface_UnlockRect(This->WineD3DSurface); - } - - if (src_ptr->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) - { - src_ptr = get_sub_mimaplevel(src_ptr); - } - else - { - src_ptr = NULL; - } - if (This->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) - { - This = get_sub_mimaplevel(This); - } - else - { - This = NULL; - } - - if ((src_ptr == NULL) || (This == NULL)) - { - if (src_ptr != This) - { - ERR(" Loading surface with different mipmap structure !!!\n"); - } - break; - } - } - - LeaveCriticalSection(&ddraw_cs); - return ret_value; -} - -static HRESULT WINAPI -Thunk_IDirect3DTextureImpl_1_Load(IDirect3DTexture *iface, - IDirect3DTexture *D3DTexture) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - IDirectDrawSurfaceImpl *Texture = surface_from_texture1(D3DTexture); - TRACE("(%p)->(%p) thunking to IDirect3DTexture2 interface.\n", This, Texture); - - return IDirect3DTexture2_Load((IDirect3DTexture2 *)&This->IDirect3DTexture2_vtbl, - D3DTexture ? (IDirect3DTexture2 *)&surface_from_texture1(D3DTexture)->IDirect3DTexture2_vtbl : NULL); -} - -/***************************************************************************** - * The VTables - *****************************************************************************/ -const IDirect3DTexture2Vtbl IDirect3DTexture2_Vtbl = -{ - Thunk_IDirect3DTextureImpl_2_QueryInterface, - Thunk_IDirect3DTextureImpl_2_AddRef, - Thunk_IDirect3DTextureImpl_2_Release, - IDirect3DTextureImpl_GetHandle, - IDirect3DTextureImpl_PaletteChanged, - IDirect3DTextureImpl_Load, -}; - - -const IDirect3DTextureVtbl IDirect3DTexture1_Vtbl = -{ - Thunk_IDirect3DTextureImpl_1_QueryInterface, - Thunk_IDirect3DTextureImpl_1_AddRef, - Thunk_IDirect3DTextureImpl_1_Release, - IDirect3DTextureImpl_1_Initialize, - Thunk_IDirect3DTextureImpl_1_GetHandle, - Thunk_IDirect3DTextureImpl_1_PaletteChanged, - Thunk_IDirect3DTextureImpl_1_Load, - IDirect3DTextureImpl_1_Unload, -}; diff --git a/dll/directx/wine/ddraw/utils.c b/dll/directx/wine/ddraw/utils.c index 5166b167b4a..039a3a05776 100644 --- a/dll/directx/wine/ddraw/utils.c +++ b/dll/directx/wine/ddraw/utils.c @@ -22,11 +22,9 @@ */ #include "config.h" - -#define NONAMELESSUNION +#include "wine/port.h" #include "ddraw_private.h" -#include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw); @@ -35,19 +33,17 @@ static void DDRAW_dump_pixelformat(const DDPIXELFORMAT *pf); /***************************************************************************** * PixelFormat_WineD3DtoDD * - * Converts an WINED3DFORMAT value into a DDPIXELFORMAT structure + * Converts an wined3d format ID into a DDPIXELFORMAT structure * * Params: * DDPixelFormat: Address of the structure to write the pixel format to * WineD3DFormat: Source format * *****************************************************************************/ -void -PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, - WINED3DFORMAT WineD3DFormat) +void PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, enum wined3d_format_id WineD3DFormat) { DWORD Size = DDPixelFormat->dwSize; - TRACE("Converting WINED3DFORMAT %d to DDRAW\n", WineD3DFormat); + TRACE("Converting wined3d format %#x to DDRAW.\n", WineD3DFormat); if(Size==0) return; @@ -315,6 +311,16 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwLuminanceAlphaBitMask = 0x00000000; break; + case WINED3DFMT_R16G16_SNORM: + DDPixelFormat->dwFlags = DDPF_BUMPDUDV; + DDPixelFormat->dwFourCC = 0; + DDPixelFormat->u1.dwBumpBitCount = 32; + DDPixelFormat->u2.dwBumpDuBitMask = 0x0000ffff; + DDPixelFormat->u3.dwBumpDvBitMask = 0xffff0000; + DDPixelFormat->u4.dwBumpLuminanceBitMask = 0x00000000; + DDPixelFormat->u5.dwLuminanceAlphaBitMask = 0x00000000; + break; + case WINED3DFMT_R5G5_SNORM_L6_UNORM: DDPixelFormat->dwFlags = DDPF_BUMPDUDV; DDPixelFormat->dwFourCC = 0; @@ -347,17 +353,17 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, /***************************************************************************** * PixelFormat_DD2WineD3D * - * Reads a DDPIXELFORMAT structure and returns the equal WINED3DFORMAT + * Reads a DDPIXELFORMAT structure and returns the equivalent wined3d + * format ID. * * Params: * DDPixelFormat: The source format * * Returns: - * The WINED3DFORMAT equal to the DDraw format + * The wined3d format ID equivalent to the DDraw format * WINED3DFMT_UNKNOWN if a matching format wasn't found *****************************************************************************/ -WINED3DFORMAT -PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) +enum wined3d_format_id PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) { TRACE("Convert a DirectDraw Pixelformat to a WineD3D Pixelformat\n"); if(TRACE_ON(ddraw)) @@ -572,47 +578,7 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) } else if(DDPixelFormat->dwFlags & DDPF_FOURCC) { - if(DDPixelFormat->dwFourCC == MAKEFOURCC('U', 'Y', 'V', 'Y')) - { - return WINED3DFMT_UYVY; - } - if(DDPixelFormat->dwFourCC == MAKEFOURCC('Y', 'U', 'Y', '2')) - { - return WINED3DFMT_YUY2; - } - if(DDPixelFormat->dwFourCC == MAKEFOURCC('Y', 'V', '1', '2')) - { - return WINED3DFMT_YV12; - } - if(DDPixelFormat->dwFourCC == MAKEFOURCC('D', 'X', 'T', '1')) - { - return WINED3DFMT_DXT1; - } - if(DDPixelFormat->dwFourCC == MAKEFOURCC('D', 'X', 'T', '2')) - { - return WINED3DFMT_DXT2; - } - if(DDPixelFormat->dwFourCC == MAKEFOURCC('D', 'X', 'T', '3')) - { - return WINED3DFMT_DXT3; - } - if(DDPixelFormat->dwFourCC == MAKEFOURCC('D', 'X', 'T', '4')) - { - return WINED3DFMT_DXT4; - } - if(DDPixelFormat->dwFourCC == MAKEFOURCC('D', 'X', 'T', '5')) - { - return WINED3DFMT_DXT5; - } - if(DDPixelFormat->dwFourCC == MAKEFOURCC('G', 'R', 'G', 'B')) - { - return WINED3DFMT_G8R8_G8B8; - } - if(DDPixelFormat->dwFourCC == MAKEFOURCC('R', 'G', 'B', 'G')) - { - return WINED3DFMT_R8G8_B8G8; - } - return WINED3DFMT_UNKNOWN; /* Abuse this as an error value */ + return DDPixelFormat->dwFourCC; } else if(DDPixelFormat->dwFlags & DDPF_BUMPDUDV) { @@ -623,6 +589,13 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) { return WINED3DFMT_R8G8_SNORM; } + else if ( (DDPixelFormat->u1.dwBumpBitCount == 32 ) && + (DDPixelFormat->u2.dwBumpDuBitMask == 0x0000ffff) && + (DDPixelFormat->u3.dwBumpDvBitMask == 0xffff0000) && + (DDPixelFormat->u4.dwBumpLuminanceBitMask == 0x00000000) ) + { + return WINED3DFMT_R16G16_SNORM; + } else if ( (DDPixelFormat->u1.dwBumpBitCount == 16 ) && (DDPixelFormat->u2.dwBumpDuBitMask == 0x0000001f) && (DDPixelFormat->u3.dwBumpDvBitMask == 0x000003e0) && @@ -668,7 +641,7 @@ DDRAW_dump_DDCOLORKEY(const DDCOLORKEY *ddck) static void DDRAW_dump_flags_nolf(DWORD flags, const flag_info* names, size_t num_names) { - unsigned int i; + unsigned int i; for (i=0; i < num_names; i++) if ((flags & names[i].val) || /* standard flag value */ diff --git a/dll/directx/wine/ddraw/vertexbuffer.c b/dll/directx/wine/ddraw/vertexbuffer.c index f16cf124392..36087f280f7 100644 --- a/dll/directx/wine/ddraw/vertexbuffer.c +++ b/dll/directx/wine/ddraw/vertexbuffer.c @@ -21,28 +21,10 @@ #include "config.h" #include "wine/port.h" -#include "wine/debug.h" - -#include -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" #include "ddraw_private.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); -WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk); +WINE_DEFAULT_DEBUG_CHANNEL(ddraw); /***************************************************************************** * IUnknown Methods @@ -69,7 +51,8 @@ IDirect3DVertexBufferImpl_QueryInterface(IDirect3DVertexBuffer7 *iface, void **obj) { IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; - TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), obj); + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); /* By default, set the object pointer to NULL */ *obj = NULL; @@ -104,10 +87,9 @@ Thunk_IDirect3DVertexBufferImpl_1_QueryInterface(IDirect3DVertexBuffer *iface, REFIID riid, void **obj) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); - TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DVertexBuffer7 interface.\n", This, debugstr_guid(riid), obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); - return IDirect3DVertexBuffer7_QueryInterface((IDirect3DVertexBuffer7 *)This, riid, obj); + return IDirect3DVertexBuffer7_QueryInterface((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), riid, obj); } /***************************************************************************** @@ -125,7 +107,7 @@ IDirect3DVertexBufferImpl_AddRef(IDirect3DVertexBuffer7 *iface) IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p/%p)->() incrementing from %u.\n", This, iface, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -133,10 +115,9 @@ IDirect3DVertexBufferImpl_AddRef(IDirect3DVertexBuffer7 *iface) static ULONG WINAPI Thunk_IDirect3DVertexBufferImpl_1_AddRef(IDirect3DVertexBuffer *iface) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DVertexBuffer7 interface.\n", This); + TRACE("iface %p.\n", iface); - return IDirect3DVertexBuffer7_AddRef((IDirect3DVertexBuffer7 *)This); + return IDirect3DVertexBuffer7_AddRef((IDirect3DVertexBuffer7 *)vb_from_vb1(iface)); } @@ -155,7 +136,7 @@ IDirect3DVertexBufferImpl_Release(IDirect3DVertexBuffer7 *iface) IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (ref == 0) { @@ -198,10 +179,9 @@ IDirect3DVertexBufferImpl_Release(IDirect3DVertexBuffer7 *iface) static ULONG WINAPI Thunk_IDirect3DVertexBufferImpl_1_Release(IDirect3DVertexBuffer *iface) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DVertexBuffer7 interface.\n", This); + TRACE("iface %p.\n", iface); - return IDirect3DVertexBuffer7_Release((IDirect3DVertexBuffer7 *)This); + return IDirect3DVertexBuffer7_Release((IDirect3DVertexBuffer7 *)vb_from_vb1(iface)); } /***************************************************************************** @@ -237,7 +217,8 @@ IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface, WINED3DBUFFER_DESC Desc; HRESULT hr; DWORD wined3d_flags = 0; - TRACE("(%p)->(%08x,%p,%p)\n", This, Flags, Data, Size); + + TRACE("iface %p, flags %#x, data %p, data_size %p.\n", iface, Flags, Data, Size); /* Writeonly: Pointless. Event: Unsupported by native according to the sdk * nosyslock: Not applicable @@ -251,13 +232,7 @@ IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface, if(Size) { /* Get the size, for returning it, and for locking */ - hr = IWineD3DBuffer_GetDesc(This->wineD3DVertexBuffer, &Desc); - if(hr != D3D_OK) - { - ERR("(%p) IWineD3DBuffer::GetDesc failed with hr=%08x\n", This, hr); - LeaveCriticalSection(&ddraw_cs); - return hr; - } + IWineD3DBuffer_GetDesc(This->wineD3DVertexBuffer, &Desc); *Size = Desc.Size; } @@ -273,10 +248,9 @@ Thunk_IDirect3DVertexBufferImpl_1_Lock(IDirect3DVertexBuffer *iface, void **Data, DWORD *Size) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p,%p) thunking to IDirect3DVertexBuffer7 interface.\n", This, Flags, Data, Size); + TRACE("iface %p, flags %#x, data %p, data_size %p.\n", iface, Flags, Data, Size); - return IDirect3DVertexBuffer7_Lock((IDirect3DVertexBuffer7 *)This, Flags, Data, Size); + return IDirect3DVertexBuffer7_Lock((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), Flags, Data, Size); } /***************************************************************************** @@ -293,7 +267,8 @@ IDirect3DVertexBufferImpl_Unlock(IDirect3DVertexBuffer7 *iface) { IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; HRESULT hr; - TRACE("(%p)->()\n", This); + + TRACE("iface %p.\n", iface); EnterCriticalSection(&ddraw_cs); hr = IWineD3DBuffer_Unmap(This->wineD3DVertexBuffer); @@ -305,10 +280,9 @@ IDirect3DVertexBufferImpl_Unlock(IDirect3DVertexBuffer7 *iface) static HRESULT WINAPI Thunk_IDirect3DVertexBufferImpl_1_Unlock(IDirect3DVertexBuffer *iface) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DVertexBuffer7 interface.\n", This); + TRACE("iface %p.\n", iface); - return IDirect3DVertexBuffer7_Unlock((IDirect3DVertexBuffer7 *)This); + return IDirect3DVertexBuffer7_Unlock((IDirect3DVertexBuffer7 *)vb_from_vb1(iface)); } @@ -350,7 +324,8 @@ IDirect3DVertexBufferImpl_ProcessVertices(IDirect3DVertexBuffer7 *iface, BOOL oldClip, doClip; HRESULT hr; - TRACE("(%p)->(%08x,%d,%d,%p,%d,%p,%08x)\n", This, VertexOp, DestIndex, Count, Src, SrcIndex, D3D, Flags); + TRACE("iface %p, vertex_op %#x, dst_idx %u, count %u, src_buffer %p, src_idx %u, device %p, flags %#x.\n", + iface, VertexOp, DestIndex, Count, SrcBuffer, SrcIndex, D3DDevice, Flags); /* Vertex operations: * D3DVOP_CLIP: Clips vertices outside the viewing frustrum. Needs clipping information @@ -415,14 +390,14 @@ Thunk_IDirect3DVertexBufferImpl_1_ProcessVertices(IDirect3DVertexBuffer *iface, IDirect3DDevice3 *D3DDevice, DWORD Flags) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); IDirect3DVertexBufferImpl *Src = SrcBuffer ? vb_from_vb1(SrcBuffer) : NULL; IDirect3DDeviceImpl *D3D = D3DDevice ? device_from_device3(D3DDevice) : NULL; - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%08x,%p,%08x,%p,%08x) thunking to IDirect3DVertexBuffer7 interface.\n", This, VertexOp, DestIndex, Count, Src, SrcIndex, D3D, Flags); + TRACE("iface %p, vertex_op %#x, dst_idx %u, count %u, src_buffer %p, src_idx %u, device %p, flags %#x.\n", + iface, VertexOp, DestIndex, Count, SrcBuffer, SrcIndex, D3DDevice, Flags); - return IDirect3DVertexBuffer7_ProcessVertices((IDirect3DVertexBuffer7 *)This, VertexOp, DestIndex, - Count, (IDirect3DVertexBuffer7 *)Src, SrcIndex, (IDirect3DDevice7 *)D3D, Flags); + return IDirect3DVertexBuffer7_ProcessVertices((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), VertexOp, + DestIndex, Count, (IDirect3DVertexBuffer7 *)Src, SrcIndex, (IDirect3DDevice7 *)D3D, Flags); } /***************************************************************************** @@ -444,25 +419,19 @@ IDirect3DVertexBufferImpl_GetVertexBufferDesc(IDirect3DVertexBuffer7 *iface, { IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; WINED3DBUFFER_DESC WDesc; - HRESULT hr; - TRACE("(%p)->(%p)\n", This, Desc); + + TRACE("iface %p, desc %p.\n", iface, Desc); if(!Desc) return DDERR_INVALIDPARAMS; EnterCriticalSection(&ddraw_cs); - hr = IWineD3DBuffer_GetDesc(This->wineD3DVertexBuffer, &WDesc); - if(hr != D3D_OK) - { - ERR("(%p) IWineD3DBuffer::GetDesc failed with hr=%08x\n", This, hr); - LeaveCriticalSection(&ddraw_cs); - return hr; - } + IWineD3DBuffer_GetDesc(This->wineD3DVertexBuffer, &WDesc); + LeaveCriticalSection(&ddraw_cs); /* Now fill the Desc structure */ Desc->dwCaps = This->Caps; Desc->dwFVF = This->fvf; Desc->dwNumVertices = WDesc.Size / get_flexible_vertex_size(This->fvf); - LeaveCriticalSection(&ddraw_cs); return D3D_OK; } @@ -471,10 +440,9 @@ static HRESULT WINAPI Thunk_IDirect3DVertexBufferImpl_1_GetVertexBufferDesc(IDirect3DVertexBuffer *iface, D3DVERTEXBUFFERDESC *Desc) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DVertexBuffer7 interface.\n", This, Desc); + TRACE("iface %p, desc %p.\n", iface, Desc); - return IDirect3DVertexBuffer7_GetVertexBufferDesc((IDirect3DVertexBuffer7 *)This, Desc); + return IDirect3DVertexBuffer7_GetVertexBufferDesc((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), Desc); } @@ -497,12 +465,13 @@ IDirect3DVertexBufferImpl_Optimize(IDirect3DVertexBuffer7 *iface, DWORD Flags) { IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; - IDirect3DDeviceImpl *D3D = (IDirect3DDeviceImpl *)D3DDevice; static BOOL hide = FALSE; + TRACE("iface %p, device %p, flags %#x.\n", iface, D3DDevice, Flags); + if (!hide) { - FIXME("(%p)->(%p,%08x): stub!\n", This, D3D, Flags); + FIXME("iface %p, device %p, flags %#x stub!\n", iface, D3DDevice, Flags); hide = TRUE; } @@ -521,11 +490,12 @@ Thunk_IDirect3DVertexBufferImpl_1_Optimize(IDirect3DVertexBuffer *iface, IDirect3DDevice3 *D3DDevice, DWORD Flags) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); IDirect3DDeviceImpl *D3D = D3DDevice ? device_from_device3(D3DDevice) : NULL; - TRACE_(ddraw_thunk)("(%p)->(%p,%08x) thunking to IDirect3DVertexBuffer7 interface.\n", This, D3D, Flags); - return IDirect3DVertexBuffer7_Optimize((IDirect3DVertexBuffer7 *)This, (IDirect3DDevice7 *)D3D, Flags); + TRACE("iface %p, device %p, flags %#x.\n", iface, D3DDevice, Flags); + + return IDirect3DVertexBuffer7_Optimize((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), + (IDirect3DDevice7 *)D3D, Flags); } /***************************************************************************** @@ -560,9 +530,9 @@ IDirect3DVertexBufferImpl_ProcessVerticesStrided(IDirect3DVertexBuffer7 *iface, IDirect3DDevice7 *D3DDevice, DWORD Flags) { - IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; - IDirect3DDeviceImpl *D3D = (IDirect3DDeviceImpl *)D3DDevice; - FIXME("(%p)->(%08x,%08x,%08x,%p,%08x,%p,%08x): stub!\n", This, VertexOp, DestIndex, Count, StrideData, VertexTypeDesc, D3D, Flags); + FIXME("iface %p, vertex_op %#x, dst_idx %u, count %u, data %p, vertex_type %#x, device %p, flags %#x stub!\n", + iface, VertexOp, DestIndex, Count, StrideData, VertexTypeDesc, D3DDevice, Flags); + return DD_OK; } @@ -570,7 +540,7 @@ IDirect3DVertexBufferImpl_ProcessVerticesStrided(IDirect3DVertexBuffer7 *iface, * The VTables *****************************************************************************/ -const IDirect3DVertexBuffer7Vtbl IDirect3DVertexBuffer7_Vtbl = +static const struct IDirect3DVertexBuffer7Vtbl d3d_vertex_buffer7_vtbl = { /*** IUnknown Methods ***/ IDirect3DVertexBufferImpl_QueryInterface, @@ -586,7 +556,7 @@ const IDirect3DVertexBuffer7Vtbl IDirect3DVertexBuffer7_Vtbl = IDirect3DVertexBufferImpl_ProcessVerticesStrided }; -const IDirect3DVertexBufferVtbl IDirect3DVertexBuffer1_Vtbl = +static const struct IDirect3DVertexBufferVtbl d3d_vertex_buffer1_vtbl = { /*** IUnknown Methods ***/ Thunk_IDirect3DVertexBufferImpl_1_QueryInterface, @@ -599,3 +569,53 @@ const IDirect3DVertexBufferVtbl IDirect3DVertexBuffer1_Vtbl = Thunk_IDirect3DVertexBufferImpl_1_GetVertexBufferDesc, Thunk_IDirect3DVertexBufferImpl_1_Optimize }; + +HRESULT d3d_vertex_buffer_init(IDirect3DVertexBufferImpl *buffer, + IDirectDrawImpl *ddraw, D3DVERTEXBUFFERDESC *desc) +{ + DWORD usage; + HRESULT hr; + + buffer->lpVtbl = &d3d_vertex_buffer7_vtbl; + buffer->IDirect3DVertexBuffer_vtbl = &d3d_vertex_buffer1_vtbl; + buffer->ref = 1; + + buffer->ddraw = ddraw; + buffer->Caps = desc->dwCaps; + buffer->fvf = desc->dwFVF; + + usage = desc->dwCaps & D3DVBCAPS_WRITEONLY ? WINED3DUSAGE_WRITEONLY : 0; + usage |= WINED3DUSAGE_STATICDECL; + + EnterCriticalSection(&ddraw_cs); + + hr = IWineD3DDevice_CreateVertexBuffer(ddraw->wineD3DDevice, + get_flexible_vertex_size(desc->dwFVF) * desc->dwNumVertices, + usage, desc->dwCaps & D3DVBCAPS_SYSTEMMEMORY ? WINED3DPOOL_SYSTEMMEM : WINED3DPOOL_DEFAULT, + buffer, &ddraw_null_wined3d_parent_ops, &buffer->wineD3DVertexBuffer); + if (FAILED(hr)) + { + WARN("Failed to create wined3d vertex buffer, hr %#x.\n", hr); + LeaveCriticalSection(&ddraw_cs); + + if (hr == WINED3DERR_INVALIDCALL) + return DDERR_INVALIDPARAMS; + else + return hr; + } + + buffer->wineD3DVertexDeclaration = ddraw_find_decl(ddraw, desc->dwFVF); + if (!buffer->wineD3DVertexDeclaration) + { + ERR("Failed to find vertex declaration for fvf %#x.\n", desc->dwFVF); + IWineD3DBuffer_Release(buffer->wineD3DVertexBuffer); + LeaveCriticalSection(&ddraw_cs); + + return DDERR_INVALIDPARAMS; + } + IWineD3DVertexDeclaration_AddRef(buffer->wineD3DVertexDeclaration); + + LeaveCriticalSection(&ddraw_cs); + + return D3D_OK; +} diff --git a/dll/directx/wine/ddraw/viewport.c b/dll/directx/wine/ddraw/viewport.c index b637df1b0f5..6e0725e604e 100644 --- a/dll/directx/wine/ddraw/viewport.c +++ b/dll/directx/wine/ddraw/viewport.c @@ -22,27 +22,9 @@ #include "config.h" #include "wine/port.h" -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - #include "ddraw_private.h" -#include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); +WINE_DEFAULT_DEBUG_CHANNEL(ddraw); /***************************************************************************** * Helper functions @@ -62,27 +44,31 @@ void viewport_activate(IDirect3DViewportImpl* This, BOOL ignore_lights) { /* Activate all the lights associated with this context */ light = This->lights; - while (light != NULL) { - light->activate(light); + while (light) + { + light_activate(light); light = light->next; } } /* And copy the values in the structure used by the device */ - if (This->use_vp2) { + if (This->use_vp2) + { vp.dwX = This->viewports.vp2.dwX; - vp.dwY = This->viewports.vp2.dwY; - vp.dwHeight = This->viewports.vp2.dwHeight; - vp.dwWidth = This->viewports.vp2.dwWidth; - vp.dvMinZ = This->viewports.vp2.dvMinZ; - vp.dvMaxZ = This->viewports.vp2.dvMaxZ; - } else { + vp.dwY = This->viewports.vp2.dwY; + vp.dwHeight = This->viewports.vp2.dwHeight; + vp.dwWidth = This->viewports.vp2.dwWidth; + vp.dvMinZ = This->viewports.vp2.dvMinZ; + vp.dvMaxZ = This->viewports.vp2.dvMaxZ; + } + else + { vp.dwX = This->viewports.vp1.dwX; - vp.dwY = This->viewports.vp1.dwY; - vp.dwHeight = This->viewports.vp1.dwHeight; - vp.dwWidth = This->viewports.vp1.dwWidth; - vp.dvMinZ = This->viewports.vp1.dvMinZ; - vp.dvMaxZ = This->viewports.vp1.dvMaxZ; + vp.dwY = This->viewports.vp1.dwY; + vp.dwHeight = This->viewports.vp1.dwHeight; + vp.dwWidth = This->viewports.vp1.dwWidth; + vp.dvMinZ = This->viewports.vp1.dvMinZ; + vp.dvMaxZ = This->viewports.vp1.dvMaxZ; } /* And also set the viewport */ @@ -98,29 +84,29 @@ void viewport_activate(IDirect3DViewportImpl* This, BOOL ignore_lights) { static void _dump_D3DVIEWPORT(const D3DVIEWPORT *lpvp) { TRACE(" - dwSize = %d dwX = %d dwY = %d\n", - lpvp->dwSize, lpvp->dwX, lpvp->dwY); + lpvp->dwSize, lpvp->dwX, lpvp->dwY); TRACE(" - dwWidth = %d dwHeight = %d\n", - lpvp->dwWidth, lpvp->dwHeight); + lpvp->dwWidth, lpvp->dwHeight); TRACE(" - dvScaleX = %f dvScaleY = %f\n", - lpvp->dvScaleX, lpvp->dvScaleY); + lpvp->dvScaleX, lpvp->dvScaleY); TRACE(" - dvMaxX = %f dvMaxY = %f\n", - lpvp->dvMaxX, lpvp->dvMaxY); + lpvp->dvMaxX, lpvp->dvMaxY); TRACE(" - dvMinZ = %f dvMaxZ = %f\n", - lpvp->dvMinZ, lpvp->dvMaxZ); + lpvp->dvMinZ, lpvp->dvMaxZ); } static void _dump_D3DVIEWPORT2(const D3DVIEWPORT2 *lpvp) { TRACE(" - dwSize = %d dwX = %d dwY = %d\n", - lpvp->dwSize, lpvp->dwX, lpvp->dwY); + lpvp->dwSize, lpvp->dwX, lpvp->dwY); TRACE(" - dwWidth = %d dwHeight = %d\n", - lpvp->dwWidth, lpvp->dwHeight); + lpvp->dwWidth, lpvp->dwHeight); TRACE(" - dvClipX = %f dvClipY = %f\n", - lpvp->dvClipX, lpvp->dvClipY); + lpvp->dvClipX, lpvp->dvClipY); TRACE(" - dvClipWidth = %f dvClipHeight = %f\n", - lpvp->dvClipWidth, lpvp->dvClipHeight); + lpvp->dvClipWidth, lpvp->dvClipHeight); TRACE(" - dvMinZ = %f dvMaxZ = %f\n", - lpvp->dvMinZ, lpvp->dvMaxZ); + lpvp->dvMinZ, lpvp->dvMaxZ); } /***************************************************************************** @@ -143,25 +129,23 @@ static void _dump_D3DVIEWPORT2(const D3DVIEWPORT2 *lpvp) * E_NOINTERFACE if the requested interface wasn't found * *****************************************************************************/ -static HRESULT WINAPI -IDirect3DViewportImpl_QueryInterface(IDirect3DViewport3 *iface, - REFIID riid, - void **obp) +static HRESULT WINAPI IDirect3DViewportImpl_QueryInterface(IDirect3DViewport3 *iface, REFIID riid, void **object) { - TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), obp); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); - *obp = NULL; - - if ( IsEqualGUID(&IID_IUnknown, riid) || - IsEqualGUID(&IID_IDirect3DViewport, riid) || - IsEqualGUID(&IID_IDirect3DViewport2, riid) || - IsEqualGUID(&IID_IDirect3DViewport3, riid) ) { + if (IsEqualGUID(&IID_IDirect3DViewport3, riid) + || IsEqualGUID(&IID_IDirect3DViewport2, riid) + || IsEqualGUID(&IID_IDirect3DViewport, riid) + || IsEqualGUID(&IID_IUnknown, riid)) + { IDirect3DViewport3_AddRef(iface); - *obp = iface; - TRACE(" Creating IDirect3DViewport1/2/3 interface %p\n", *obp); - return S_OK; + *object = iface; + return S_OK; } - FIXME("(%p): interface for IID %s NOT found!\n", iface, debugstr_guid(riid)); + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; return E_NOINTERFACE; } @@ -180,7 +164,7 @@ IDirect3DViewportImpl_AddRef(IDirect3DViewport3 *iface) IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->() incrementing from %u.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -200,11 +184,11 @@ IDirect3DViewportImpl_Release(IDirect3DViewport3 *iface) IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (!ref) { HeapFree(GetProcessHeap(), 0, This); - return 0; + return 0; } return ref; } @@ -229,7 +213,8 @@ static HRESULT WINAPI IDirect3DViewportImpl_Initialize(IDirect3DViewport3 *iface, IDirect3D *Direct3D) { - TRACE("(%p)->(%p) no-op...\n", iface, Direct3D); + TRACE("iface %p, d3d %p.\n", iface, Direct3D); + return DDERR_ALREADYINITIALIZED; } @@ -252,7 +237,8 @@ IDirect3DViewportImpl_GetViewport(IDirect3DViewport3 *iface, { IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; DWORD dwSize; - TRACE("(%p/%p)->(%p)\n", This, iface, lpData); + + TRACE("iface %p, data %p.\n", iface, lpData); EnterCriticalSection(&ddraw_cs); dwSize = lpData->dwSize; @@ -275,9 +261,10 @@ IDirect3DViewportImpl_GetViewport(IDirect3DViewport3 *iface, memcpy(lpData, &vp1, dwSize); } - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { TRACE(" returning D3DVIEWPORT :\n"); - _dump_D3DVIEWPORT(lpData); + _dump_D3DVIEWPORT(lpData); } LeaveCriticalSection(&ddraw_cs); @@ -303,11 +290,13 @@ IDirect3DViewportImpl_SetViewport(IDirect3DViewport3 *iface, { IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; LPDIRECT3DVIEWPORT3 current_viewport; - TRACE("(%p/%p)->(%p)\n", This, iface, lpData); - if (TRACE_ON(d3d7)) { + TRACE("iface %p, data %p.\n", iface, lpData); + + if (TRACE_ON(ddraw)) + { TRACE(" getting D3DVIEWPORT :\n"); - _dump_D3DVIEWPORT(lpData); + _dump_D3DVIEWPORT(lpData); } EnterCriticalSection(&ddraw_cs); @@ -324,8 +313,9 @@ IDirect3DViewportImpl_SetViewport(IDirect3DViewport3 *iface, if (This->active_device) { IDirect3DDevice3 *d3d_device3 = (IDirect3DDevice3 *)&This->active_device->IDirect3DDevice3_vtbl; IDirect3DDevice3_GetCurrentViewport(d3d_device3, ¤t_viewport); - if (current_viewport) { - if ((IDirect3DViewportImpl *)current_viewport == This) This->activate(This, FALSE); + if (current_viewport) + { + if ((IDirect3DViewportImpl *)current_viewport == This) viewport_activate(This, FALSE); IDirect3DViewport3_Release(current_viewport); } } @@ -376,7 +366,9 @@ IDirect3DViewportImpl_TransformVertices(IDirect3DViewport3 *iface, unsigned int i; D3DVIEWPORT vp = This->viewports.vp1; D3DHVERTEX *outH; - TRACE("(%p)->(%08x,%p,%08x,%p)\n", This, dwVertexCount, lpData, dwFlags, lpOffScreen); + + TRACE("iface %p, vertex_count %u, vertex_data %p, flags %#x, clip_plane %p.\n", + iface, dwVertexCount, lpData, dwFlags, lpOffScreen); /* Tests on windows show that Windows crashes when this occurs, * so don't return the (intuitive) return value @@ -507,8 +499,8 @@ IDirect3DViewportImpl_LightElements(IDirect3DViewport3 *iface, DWORD dwElementCount, LPD3DLIGHTDATA lpData) { - IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; - TRACE("(%p)->(%08x,%p): Unimplemented!\n", This, dwElementCount, lpData); + TRACE("iface %p, element_count %u, data %p.\n", iface, dwElementCount, lpData); + return DDERR_UNSUPPORTED; } @@ -529,37 +521,33 @@ IDirect3DViewportImpl_SetBackground(IDirect3DViewport3 *iface, D3DMATERIALHANDLE hMat) { IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; - TRACE("(%p)->(%d)\n", This, hMat); + IDirect3DMaterialImpl *m; + + TRACE("iface %p, material %#x.\n", iface, hMat); EnterCriticalSection(&ddraw_cs); - if(hMat && hMat > This->ddraw->d3ddevice->numHandles) - { - WARN("Specified Handle %d out of range\n", hMat); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } - else if(hMat && This->ddraw->d3ddevice->Handles[hMat - 1].type != DDrawHandle_Material) - { - WARN("Handle %d is not a material handle\n", hMat); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } - if(hMat) - { - This->background = This->ddraw->d3ddevice->Handles[hMat - 1].ptr; - TRACE(" setting background color : %f %f %f %f\n", - This->background->mat.u.diffuse.u1.r, - This->background->mat.u.diffuse.u2.g, - This->background->mat.u.diffuse.u3.b, - This->background->mat.u.diffuse.u4.a); - } - else + if (!hMat) { This->background = NULL; TRACE("Setting background to NULL\n"); + LeaveCriticalSection(&ddraw_cs); + return D3D_OK; } + m = ddraw_get_object(&This->ddraw->d3ddevice->handle_table, hMat - 1, DDRAW_HANDLE_MATERIAL); + if (!m) + { + WARN("Invalid material handle.\n"); + LeaveCriticalSection(&ddraw_cs); + return DDERR_INVALIDPARAMS; + } + + TRACE("Setting background color : %.8e %.8e %.8e %.8e.\n", + m->mat.u.diffuse.u1.r, m->mat.u.diffuse.u2.g, + m->mat.u.diffuse.u3.b, m->mat.u.diffuse.u4.a); + This->background = m; + LeaveCriticalSection(&ddraw_cs); return D3D_OK; } @@ -583,7 +571,8 @@ IDirect3DViewportImpl_GetBackground(IDirect3DViewport3 *iface, BOOL *lpValid) { IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; - TRACE("(%p)->(%p,%p)\n", This, lphMat, lpValid); + + TRACE("iface %p, material %p, valid %p.\n", iface, lphMat, lpValid); EnterCriticalSection(&ddraw_cs); if(lpValid) @@ -622,8 +611,8 @@ static HRESULT WINAPI IDirect3DViewportImpl_SetBackgroundDepth(IDirect3DViewport3 *iface, IDirectDrawSurface *lpDDSurface) { - IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; - FIXME("(%p)->(%p): stub!\n", This, lpDDSurface); + FIXME("iface %p, surface %p stub!\n", iface, lpDDSurface); + return D3D_OK; } @@ -646,8 +635,8 @@ IDirect3DViewportImpl_GetBackgroundDepth(IDirect3DViewport3 *iface, IDirectDrawSurface **lplpDDSurface, LPBOOL lpValid) { - IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; - FIXME("(%p)->(%p,%p): stub!\n", This, lplpDDSurface, lpValid); + FIXME("iface %p, surface %p, valid %p stub!\n", iface, lplpDDSurface, lpValid); + return DD_OK; } @@ -677,10 +666,11 @@ static HRESULT WINAPI IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface, LPDIRECT3DVIEWPORT3 current_viewport; IDirect3DDevice3 *d3d_device3; - TRACE("(%p/%p)->(%08x,%p,%08x)\n", This, iface, dwCount, lpRects, dwFlags); + TRACE("iface %p, rect_count %u, rects %p, flags %#x.\n", iface, dwCount, lpRects, dwFlags); + if (This->active_device == NULL) { ERR(" Trying to clear a viewport not attached to a device !\n"); - return D3DERR_VIEWPORTHASNODEVICE; + return D3DERR_VIEWPORTHASNODEVICE; } d3d_device3 = (IDirect3DDevice3 *)&This->active_device->IDirect3DDevice3_vtbl; @@ -700,7 +690,7 @@ static HRESULT WINAPI IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface, /* Need to temporarily activate viewport to clear it. Previously active one will be restored afterwards. */ - This->activate(This, TRUE); + viewport_activate(This, TRUE); hr = IDirect3DDevice7_Clear((IDirect3DDevice7 *)This->active_device, dwCount, lpRects, dwFlags & (D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET), color, 1.0, 0x00000000); @@ -708,7 +698,7 @@ static HRESULT WINAPI IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface, IDirect3DDevice3_GetCurrentViewport(d3d_device3, ¤t_viewport); if(current_viewport) { IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)current_viewport; - vp->activate(vp, TRUE); + viewport_activate(vp, TRUE); IDirect3DViewport3_Release(current_viewport); } @@ -739,7 +729,7 @@ IDirect3DViewportImpl_AddLight(IDirect3DViewport3 *iface, DWORD i = 0; DWORD map = This->map_lights; - TRACE("(%p)->(%p)\n", This, lpDirect3DLight); + TRACE("iface %p, light %p.\n", iface, lpDirect3DLight); EnterCriticalSection(&ddraw_cs); if (This->num_lights >= 8) @@ -749,9 +739,10 @@ IDirect3DViewportImpl_AddLight(IDirect3DViewport3 *iface, } /* Find a light number and update both light and viewports objects accordingly */ - while(map&1) { - map>>=1; - i++; + while (map & 1) + { + map >>= 1; + ++i; } lpDirect3DLightImpl->dwLightIndex = i; This->num_lights++; @@ -766,9 +757,8 @@ IDirect3DViewportImpl_AddLight(IDirect3DViewport3 *iface, lpDirect3DLightImpl->active_viewport = This; /* If active, activate the light */ - if (This->active_device != NULL) { - lpDirect3DLightImpl->activate(lpDirect3DLightImpl); - } + if (This->active_device) + light_activate(lpDirect3DLightImpl); LeaveCriticalSection(&ddraw_cs); return D3D_OK; @@ -795,25 +785,26 @@ IDirect3DViewportImpl_DeleteLight(IDirect3DViewport3 *iface, IDirect3DLightImpl *lpDirect3DLightImpl = (IDirect3DLightImpl *)lpDirect3DLight; IDirect3DLightImpl *cur_light, *prev_light = NULL; - TRACE("(%p)->(%p)\n", This, lpDirect3DLight); + TRACE("iface %p, light %p.\n", iface, lpDirect3DLight); EnterCriticalSection(&ddraw_cs); cur_light = This->lights; while (cur_light != NULL) { - if (cur_light == lpDirect3DLightImpl) { - lpDirect3DLightImpl->desactivate(lpDirect3DLightImpl); - if (prev_light == NULL) This->lights = cur_light->next; - else prev_light->next = cur_light->next; - /* Detach the light to the viewport */ - cur_light->active_viewport = NULL; - IDirect3DLight_Release( (IDirect3DLight *)cur_light ); - This->num_lights--; - This->map_lights &= ~(1<dwLightIndex); + if (cur_light == lpDirect3DLightImpl) + { + light_deactivate(lpDirect3DLightImpl); + if (!prev_light) This->lights = cur_light->next; + else prev_light->next = cur_light->next; + /* Detach the light from the viewport. */ + cur_light->active_viewport = NULL; + IDirect3DLight_Release((IDirect3DLight *)cur_light); + --This->num_lights; + This->map_lights &= ~(1 << lpDirect3DLightImpl->dwLightIndex); LeaveCriticalSection(&ddraw_cs); return D3D_OK; - } - prev_light = cur_light; - cur_light = cur_light->next; + } + prev_light = cur_light; + cur_light = cur_light->next; } LeaveCriticalSection(&ddraw_cs); @@ -842,7 +833,8 @@ IDirect3DViewportImpl_NextLight(IDirect3DViewport3 *iface, IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; IDirect3DLightImpl *cur_light, *prev_light = NULL; - TRACE("(%p)->(%p,%p,%08x)\n", This, lpDirect3DLight, lplpDirect3DLight, dwFlags); + TRACE("iface %p, light %p, next_light %p, flags %#x.\n", + iface, lpDirect3DLight, lplpDirect3DLight, dwFlags); if (!lplpDirect3DLight) return DDERR_INVALIDPARAMS; @@ -916,7 +908,8 @@ IDirect3DViewportImpl_GetViewport2(IDirect3DViewport3 *iface, { IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; DWORD dwSize; - TRACE("(%p)->(%p)\n", This, lpData); + + TRACE("iface %p, data %p.\n", iface, lpData); EnterCriticalSection(&ddraw_cs); dwSize = lpData->dwSize; @@ -939,9 +932,10 @@ IDirect3DViewportImpl_GetViewport2(IDirect3DViewport3 *iface, memcpy(lpData, &vp2, dwSize); } - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { TRACE(" returning D3DVIEWPORT2 :\n"); - _dump_D3DVIEWPORT2(lpData); + _dump_D3DVIEWPORT2(lpData); } LeaveCriticalSection(&ddraw_cs); @@ -966,11 +960,13 @@ IDirect3DViewportImpl_SetViewport2(IDirect3DViewport3 *iface, { IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; LPDIRECT3DVIEWPORT3 current_viewport; - TRACE("(%p/%p)->(%p)\n", This, iface, lpData); - if (TRACE_ON(d3d7)) { + TRACE("iface %p, data %p.\n", iface, lpData); + + if (TRACE_ON(ddraw)) + { TRACE(" getting D3DVIEWPORT2 :\n"); - _dump_D3DVIEWPORT2(lpData); + _dump_D3DVIEWPORT2(lpData); } EnterCriticalSection(&ddraw_cs); @@ -981,8 +977,9 @@ IDirect3DViewportImpl_SetViewport2(IDirect3DViewport3 *iface, if (This->active_device) { IDirect3DDevice3 *d3d_device3 = (IDirect3DDevice3 *)&This->active_device->IDirect3DDevice3_vtbl; IDirect3DDevice3_GetCurrentViewport(d3d_device3, ¤t_viewport); - if (current_viewport) { - if ((IDirect3DViewportImpl *)current_viewport == This) This->activate(This, FALSE); + if (current_viewport) + { + if ((IDirect3DViewportImpl *)current_viewport == This) viewport_activate(This, FALSE); IDirect3DViewport3_Release(current_viewport); } } @@ -1011,8 +1008,8 @@ static HRESULT WINAPI IDirect3DViewportImpl_SetBackgroundDepth2(IDirect3DViewport3 *iface, IDirectDrawSurface4 *lpDDS) { - IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; - FIXME("(%p)->(%p): stub!\n", This, lpDDS); + FIXME("iface %p, surface %p stub!\n", iface, lpDDS); + return D3D_OK; } @@ -1034,8 +1031,8 @@ IDirect3DViewportImpl_GetBackgroundDepth2(IDirect3DViewport3 *iface, IDirectDrawSurface4 **lplpDDS, BOOL *lpValid) { - IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; - FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lplpDDS, lpValid); + FIXME("iface %p, surface %p, valid %p stub!\n", iface, lplpDDS, lpValid); + return D3D_OK; } @@ -1068,7 +1065,9 @@ IDirect3DViewportImpl_Clear2(IDirect3DViewport3 *iface, HRESULT hr; LPDIRECT3DVIEWPORT3 current_viewport; IDirect3DDevice3 *d3d_device3; - TRACE("(%p)->(%08x,%p,%08x,%08x,%f,%08x)\n", This, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil); + + TRACE("iface %p, rect_count %u, rects %p, flags %#x, color 0x%08x, depth %.8e, stencil %u.\n", + iface, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil); EnterCriticalSection(&ddraw_cs); if (This->active_device == NULL) { @@ -1077,16 +1076,16 @@ IDirect3DViewportImpl_Clear2(IDirect3DViewport3 *iface, return D3DERR_VIEWPORTHASNODEVICE; } d3d_device3 = (IDirect3DDevice3 *)&This->active_device->IDirect3DDevice3_vtbl; - /* Need to temporarily activate viewport to clear it. Previously active one will be restored - afterwards. */ - This->activate(This, TRUE); + /* Need to temporarily activate viewport to clear it. Previously active + * one will be restored afterwards. */ + viewport_activate(This, TRUE); hr = IDirect3DDevice7_Clear((IDirect3DDevice7 *)This->active_device, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil); IDirect3DDevice3_GetCurrentViewport(d3d_device3, ¤t_viewport); if(current_viewport) { IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)current_viewport; - vp->activate(vp, TRUE); + viewport_activate(vp, TRUE); IDirect3DViewport3_Release(current_viewport); } LeaveCriticalSection(&ddraw_cs); @@ -1097,7 +1096,7 @@ IDirect3DViewportImpl_Clear2(IDirect3DViewport3 *iface, * The VTable *****************************************************************************/ -const IDirect3DViewport3Vtbl IDirect3DViewport3_Vtbl = +static const struct IDirect3DViewport3Vtbl d3d_viewport_vtbl = { /*** IUnknown Methods ***/ IDirect3DViewportImpl_QueryInterface, @@ -1125,3 +1124,11 @@ const IDirect3DViewport3Vtbl IDirect3DViewport3_Vtbl = IDirect3DViewportImpl_GetBackgroundDepth2, IDirect3DViewportImpl_Clear2, }; + +void d3d_viewport_init(IDirect3DViewportImpl *viewport, IDirectDrawImpl *ddraw) +{ + viewport->lpVtbl = &d3d_viewport_vtbl; + viewport->ref = 1; + viewport->ddraw = ddraw; + viewport->use_vp2 = 0xff; +} diff --git a/dll/directx/wine/wined3d/arb_program_shader.c b/dll/directx/wine/wined3d/arb_program_shader.c index 0824fedb571..c053e7faf10 100644 --- a/dll/directx/wine/wined3d/arb_program_shader.c +++ b/dll/directx/wine/wined3d/arb_program_shader.c @@ -175,9 +175,9 @@ static const char *arb_get_helper_value(enum wined3d_shader_type shader, enum ar } } -static inline BOOL ffp_clip_emul(IWineD3DStateBlockImpl *stateblock) +static inline BOOL ffp_clip_emul(const struct wined3d_state *state) { - return stateblock->lowest_disabled_stage < 7; + return state->lowest_disabled_stage < 7; } /* ARB_program_shader private data */ @@ -248,8 +248,8 @@ struct arb_vs_compile_args struct { WORD bools; - char clip_texcoord; - char clipplane_mask; + unsigned char clip_texcoord; + unsigned char clipplane_mask; } boolclip; DWORD boolclip_compare; } clip; @@ -503,8 +503,8 @@ static void shader_arb_load_np2fixup_constants( for (i = 0; active; active >>= 1, ++i) { const unsigned char idx = fixup->super.idx[i]; - const IWineD3DTextureImpl* const tex = (const IWineD3DTextureImpl*) stateBlock->textures[i]; - GLfloat* tex_dim = &np2fixup_constants[(idx >> 1) * 4]; + const IWineD3DBaseTextureImpl *tex = stateBlock->state.textures[i]; + GLfloat *tex_dim = &np2fixup_constants[(idx >> 1) * 4]; if (!(active & 1)) continue; @@ -542,8 +542,9 @@ static inline void shader_arb_ps_local_constants(IWineD3DDeviceImpl* deviceImpl) int texunit = gl_shader->bumpenvmatconst[i].texunit; /* The state manager takes care that this function is always called if the bump env matrix changes */ - const float *data = (const float *)&stateBlock->textureState[texunit][WINED3DTSS_BUMPENVMAT00]; - GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->bumpenvmatconst[i].const_num, data)); + const float *data = (const float *)&stateBlock->state.texture_states[texunit][WINED3DTSS_BUMPENVMAT00]; + GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, + gl_shader->bumpenvmatconst[i].const_num, data)); if (gl_shader->luminanceconst[i].const_num != WINED3D_CONST_NUM_UNUSED) { @@ -552,8 +553,9 @@ static inline void shader_arb_ps_local_constants(IWineD3DDeviceImpl* deviceImpl) * don't care about them. The pointers are valid for sure because the stateblock is bigger. * (they're WINED3DTSS_TEXTURETRANSFORMFLAGS and WINED3DTSS_ADDRESSW, so most likely 0 or NaN */ - const float *scale = (const float *)&stateBlock->textureState[texunit][WINED3DTSS_BUMPENVLSCALE]; - GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->luminanceconst[i].const_num, scale)); + const float *scale = (const float *)&stateBlock->state.texture_states[texunit][WINED3DTSS_BUMPENVLSCALE]; + GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, + gl_shader->luminanceconst[i].const_num, scale)); } } checkGLcall("Load bumpmap consts"); @@ -575,16 +577,16 @@ static inline void shader_arb_ps_local_constants(IWineD3DDeviceImpl* deviceImpl) checkGLcall("y correction loading"); } - if(gl_shader->num_int_consts == 0) return; + if (!gl_shader->num_int_consts) return; for(i = 0; i < MAX_CONST_I; i++) { if(gl_shader->int_consts[i] != WINED3D_CONST_NUM_UNUSED) { float val[4]; - val[0] = stateBlock->pixelShaderConstantI[4 * i]; - val[1] = stateBlock->pixelShaderConstantI[4 * i + 1]; - val[2] = stateBlock->pixelShaderConstantI[4 * i + 2]; + val[0] = (float)stateBlock->state.ps_consts_i[4 * i]; + val[1] = (float)stateBlock->state.ps_consts_i[4 * i + 1]; + val[2] = (float)stateBlock->state.ps_consts_i[4 * i + 2]; val[3] = -1.0f; GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->int_consts[i], val)); @@ -605,7 +607,7 @@ static inline void shader_arb_vs_local_constants(IWineD3DDeviceImpl* deviceImpl) /* Upload the position fixup */ GL_EXTCALL(glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, gl_shader->pos_fixup, deviceImpl->posFixup)); - if(gl_shader->num_int_consts == 0) return; + if (!gl_shader->num_int_consts) return; stateBlock = deviceImpl->stateBlock; @@ -614,9 +616,9 @@ static inline void shader_arb_vs_local_constants(IWineD3DDeviceImpl* deviceImpl) if(gl_shader->int_consts[i] != WINED3D_CONST_NUM_UNUSED) { float val[4]; - val[0] = stateBlock->vertexShaderConstantI[4 * i]; - val[1] = stateBlock->vertexShaderConstantI[4 * i + 1]; - val[2] = stateBlock->vertexShaderConstantI[4 * i + 2]; + val[0] = (float)stateBlock->state.vs_consts_i[4 * i]; + val[1] = (float)stateBlock->state.vs_consts_i[4 * i + 1]; + val[2] = (float)stateBlock->state.vs_consts_i[4 * i + 2]; val[3] = -1.0f; GL_EXTCALL(glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, gl_shader->int_consts[i], val)); @@ -638,21 +640,23 @@ static void shader_arb_load_constants(const struct wined3d_context *context, cha IWineD3DStateBlockImpl* stateBlock = device->stateBlock; const struct wined3d_gl_info *gl_info = context->gl_info; - if (useVertexShader) { - IWineD3DBaseShaderImpl* vshader = (IWineD3DBaseShaderImpl*) stateBlock->vertexShader; + if (useVertexShader) + { + IWineD3DBaseShaderImpl *vshader = (IWineD3DBaseShaderImpl *)stateBlock->state.vertex_shader; /* Load DirectX 9 float constants for vertex shader */ device->highest_dirty_vs_const = shader_arb_load_constantsF(vshader, gl_info, GL_VERTEX_PROGRAM_ARB, - device->highest_dirty_vs_const, stateBlock->vertexShaderConstantF, context->vshader_const_dirty); + device->highest_dirty_vs_const, stateBlock->state.vs_consts_f, context->vshader_const_dirty); shader_arb_vs_local_constants(device); } - if (usePixelShader) { - IWineD3DBaseShaderImpl* pshader = (IWineD3DBaseShaderImpl*) stateBlock->pixelShader; + if (usePixelShader) + { + IWineD3DBaseShaderImpl *pshader = (IWineD3DBaseShaderImpl *)stateBlock->state.pixel_shader; /* Load DirectX 9 float constants for pixel shader */ device->highest_dirty_ps_const = shader_arb_load_constantsF(pshader, gl_info, GL_FRAGMENT_PROGRAM_ARB, - device->highest_dirty_ps_const, stateBlock->pixelShaderConstantF, context->pshader_const_dirty); + device->highest_dirty_ps_const, stateBlock->state.ps_consts_f, context->pshader_const_dirty); shader_arb_ps_local_constants(device); } } @@ -922,7 +926,7 @@ static void shader_arb_request_a0(const struct wined3d_shader_instruction *ins, struct shader_arb_ctx_priv *priv = ins->ctx->backend_data; struct wined3d_shader_buffer *buffer = ins->ctx->buffer; - if(strcmp(priv->addr_reg, src) == 0) return; + if (!strcmp(priv->addr_reg, src)) return; strcpy(priv->addr_reg, src); shader_addline(buffer, "ARL A0.x, %s;\n", src); @@ -953,7 +957,7 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction { if(This->baseShader.reg_maps.shader_version.major < 3) { - if (reg->idx == 0) strcpy(register_name, "fragment.color.primary"); + if (!reg->idx) strcpy(register_name, "fragment.color.primary"); else strcpy(register_name, "fragment.color.secondary"); } else @@ -963,7 +967,7 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction char rel_reg[50]; shader_arb_get_src_param(ins, reg->rel_addr, 0, rel_reg); - if(strcmp(rel_reg, "**aL_emul**") == 0) + if (!strcmp(rel_reg, "**aL_emul**")) { DWORD idx = ctx->aL + reg->idx; if(idx < MAX_REG_INPUT) @@ -1045,7 +1049,8 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction } else { shader_arb_get_src_param(ins, reg->rel_addr, 0, rel_reg); if(ctx->target_version == ARB) { - if(strcmp(rel_reg, "**aL_emul**") == 0) { + if (!strcmp(rel_reg, "**aL_emul**")) + { aL = TRUE; } else { shader_arb_request_a0(ins, rel_reg); @@ -1058,7 +1063,7 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction else if (reg->idx >= rel_offset) sprintf(register_name, "C[%s + %u]", rel_reg, reg->idx - rel_offset); else - sprintf(register_name, "C[%s - %u]", rel_reg, -reg->idx + rel_offset); + sprintf(register_name, "C[%s - %u]", rel_reg, rel_offset - reg->idx); } else { @@ -1097,7 +1102,7 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction break; case WINED3DSPR_COLOROUT: - if(ctx->cur_ps_args->super.srgb_correction && reg->idx == 0) + if (ctx->cur_ps_args->super.srgb_correction && !reg->idx) { strcpy(register_name, "TMP_COLOR"); } @@ -1173,7 +1178,7 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction break; case WINED3DSPR_MISCTYPE: - if(reg->idx == 0) + if (!reg->idx) { sprintf(register_name, "vpos"); } @@ -1323,6 +1328,7 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD { struct wined3d_shader_buffer *buffer = ins->ctx->buffer; DWORD sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx]; + IWineD3DBaseTextureImpl *texture; const char *tex_type; BOOL np2_fixup = FALSE; IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader; @@ -1340,8 +1346,9 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD break; case WINED3DSTT_2D: - if(device->stateBlock->textures[sampler_idx] && - IWineD3DBaseTexture_GetTextureDimensions(device->stateBlock->textures[sampler_idx]) == GL_TEXTURE_RECTANGLE_ARB) { + texture = device->stateBlock->state.textures[sampler_idx]; + if (texture && texture->baseTexture.target == GL_TEXTURE_RECTANGLE_ARB) + { tex_type = "RECT"; } else { tex_type = "2D"; @@ -1807,7 +1814,7 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins) shader_addline(buffer, "ARL A0.x, %s;\n", src0_param); } } - else if(ins->dst[0].reg.type == WINED3DSPR_COLOROUT && ins->dst[0].reg.idx == 0 && pshader) + else if (ins->dst[0].reg.type == WINED3DSPR_COLOROUT && !ins->dst[0].reg.idx && pshader) { IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) shader; if(ctx->cur_ps_args->super.srgb_correction && ps->color0_mov) @@ -1877,8 +1884,7 @@ static void pshader_hw_texkill(const struct wined3d_shader_instruction *ins) static void pshader_hw_tex(const struct wined3d_shader_instruction *ins) { - IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; - IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device; + struct shader_arb_ctx_priv *priv = ins->ctx->backend_data; const struct wined3d_shader_dst_param *dst = &ins->dst[0]; DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major, ins->ctx->reg_maps->shader_version.minor); @@ -1887,7 +1893,7 @@ static void pshader_hw_tex(const struct wined3d_shader_instruction *ins) char reg_dest[40]; char reg_coord[40]; DWORD reg_sampler_code; - DWORD myflags = 0; + WORD myflags = 0; /* All versions have a destination register */ shader_arb_get_dst_param(ins, dst, reg_dest); @@ -1919,12 +1925,10 @@ static void pshader_hw_tex(const struct wined3d_shader_instruction *ins) if (shader_version < WINED3D_SHADER_VERSION(1,4)) { DWORD flags = 0; - if(reg_sampler_code < MAX_TEXTURES) { - flags = deviceImpl->stateBlock->textureState[reg_sampler_code][WINED3DTSS_TEXTURETRANSFORMFLAGS]; - } - if (flags & WINED3DTTFF_PROJECTED) { + if (reg_sampler_code < MAX_TEXTURES) + flags = priv->cur_ps_args->super.tex_transform >> reg_sampler_code * WINED3D_PSARGS_TEXTRANSFORM_SHIFT; + if (flags & WINED3D_PSARGS_PROJECTED) myflags |= TEX_PROJ; - } } else if (shader_version < WINED3D_SHADER_VERSION(2,0)) { @@ -1972,9 +1976,7 @@ static void pshader_hw_texcoord(const struct wined3d_shader_instruction *ins) static void pshader_hw_texreg2ar(const struct wined3d_shader_instruction *ins) { struct wined3d_shader_buffer *buffer = ins->ctx->buffer; - IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; - IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device; - DWORD flags; + DWORD flags = 0; DWORD reg1 = ins->dst[0].reg.idx; char dst_str[50]; @@ -1986,8 +1988,12 @@ static void pshader_hw_texreg2ar(const struct wined3d_shader_instruction *ins) /* Move .x first in case src_str is "TA" */ shader_addline(buffer, "MOV TA.y, %s.x;\n", src_str); shader_addline(buffer, "MOV TA.x, %s.w;\n", src_str); - flags = reg1 < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg1][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; - shader_hw_sample(ins, reg1, dst_str, "TA", flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL); + if (reg1 < MAX_TEXTURES) + { + struct shader_arb_ctx_priv *priv = ins->ctx->backend_data; + flags = priv->cur_ps_args->super.tex_transform >> reg1 * WINED3D_PSARGS_TEXTRANSFORM_SHIFT; + } + shader_hw_sample(ins, reg1, dst_str, "TA", flags & WINED3D_PSARGS_PROJECTED ? TEX_PROJ : 0, NULL, NULL); } static void pshader_hw_texreg2gb(const struct wined3d_shader_instruction *ins) @@ -2020,8 +2026,7 @@ static void pshader_hw_texreg2rgb(const struct wined3d_shader_instruction *ins) static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins) { - IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; - IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device; + struct shader_arb_ctx_priv *priv = ins->ctx->backend_data; const struct wined3d_shader_dst_param *dst = &ins->dst[0]; struct wined3d_shader_buffer *buffer = ins->ctx->buffer; char reg_coord[40], dst_reg[50], src_reg[50]; @@ -2053,7 +2058,8 @@ static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins) /* with projective textures, texbem only divides the static texture coord, not the displacement, * so we can't let the GL handle this. */ - if (device->stateBlock->textureState[reg_dest_code][WINED3DTSS_TEXTURETRANSFORMFLAGS] & WINED3DTTFF_PROJECTED) + if ((priv->cur_ps_args->super.tex_transform >> reg_dest_code * WINED3D_PSARGS_TEXTRANSFORM_SHIFT) + & WINED3D_PSARGS_PROJECTED) { shader_addline(buffer, "RCP TB.w, %s.w;\n", reg_coord); shader_addline(buffer, "MUL TB.xy, %s, TB.w;\n", reg_coord); @@ -2108,7 +2114,7 @@ static void pshader_hw_texm3x2tex(const struct wined3d_shader_instruction *ins) shader_arb_get_dst_param(ins, &ins->dst[0], dst_str); shader_arb_get_src_param(ins, &ins->src[0], 0, src0_name); shader_addline(buffer, "DP3 %s.y, fragment.texcoord[%u], %s;\n", dst_reg, reg, src0_name); - flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; + flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->state.texture_states[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; shader_hw_sample(ins, reg, dst_str, dst_reg, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL); } @@ -2153,7 +2159,7 @@ static void pshader_hw_texm3x3tex(const struct wined3d_shader_instruction *ins) /* Sample the texture using the calculated coordinates */ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str); - flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; + flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->state.texture_states[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; shader_hw_sample(ins, reg, dst_str, dst_name, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL); current_state->current_row = 0; } @@ -2195,7 +2201,7 @@ static void pshader_hw_texm3x3vspec(const struct wined3d_shader_instruction *ins /* Sample the texture using the calculated coordinates */ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str); - flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; + flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->state.texture_states[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; shader_hw_sample(ins, reg, dst_str, dst_reg, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL); current_state->current_row = 0; } @@ -2237,7 +2243,7 @@ static void pshader_hw_texm3x3spec(const struct wined3d_shader_instruction *ins) /* Sample the texture using the calculated coordinates */ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str); - flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; + flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->state.texture_states[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; shader_hw_sample(ins, reg, dst_str, dst_reg, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL); current_state->current_row = 0; } @@ -3052,7 +3058,7 @@ static void shader_hw_texldd(const struct wined3d_shader_instruction *ins) DWORD sampler_idx = ins->src[1].reg.idx; char reg_dest[40]; char reg_src[3][40]; - DWORD flags = TEX_DERIV; + WORD flags = TEX_DERIV; shader_arb_get_dst_param(ins, &ins->dst[0], reg_dest); shader_arb_get_src_param(ins, &ins->src[0], 0, reg_src[0]); @@ -3070,7 +3076,7 @@ static void shader_hw_texldl(const struct wined3d_shader_instruction *ins) DWORD sampler_idx = ins->src[1].reg.idx; char reg_dest[40]; char reg_coord[40]; - DWORD flags = TEX_LOD; + WORD flags = TEX_LOD; shader_arb_get_dst_param(ins, &ins->dst[0], reg_dest); shader_arb_get_src_param(ins, &ins->src[0], 0, reg_coord); @@ -3412,7 +3418,7 @@ static const DWORD *find_loop_control_values(IWineD3DBaseShaderImpl *This, DWORD static void init_ps_input(const IWineD3DPixelShaderImpl *This, const struct arb_ps_compile_args *args, struct shader_arb_ctx_priv *priv) { - const char *texcoords[8] = + static const char * const texcoords[8] = { "fragment.texcoord[0]", "fragment.texcoord[1]", "fragment.texcoord[2]", "fragment.texcoord[3]", "fragment.texcoord[4]", "fragment.texcoord[5]", "fragment.texcoord[6]", "fragment.texcoord[7]" @@ -3438,11 +3444,11 @@ static void init_ps_input(const IWineD3DPixelShaderImpl *This, const struct arb_ { semantic_name = sig[i].semantic_name; semantic_idx = sig[i].semantic_idx; - if(semantic_name == NULL) continue; + if (!semantic_name) continue; if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_COLOR)) { - if(semantic_idx == 0) priv->ps_input[i] = "fragment.color.primary"; + if (!semantic_idx) priv->ps_input[i] = "fragment.color.primary"; else if(semantic_idx == 1) priv->ps_input[i] = "fragment.color.secondary"; else priv->ps_input[i] = "0.0"; } @@ -3457,7 +3463,7 @@ static void init_ps_input(const IWineD3DPixelShaderImpl *This, const struct arb_ } else if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_FOG)) { - if(semantic_idx == 0) priv->ps_input[i] = "fragment.fogcoord"; + if (!semantic_idx) priv->ps_input[i] = "fragment.fogcoord"; else priv->ps_input[i] = "0.0"; } else @@ -3508,7 +3514,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct { if (!(map & 1) || (This->color0_mov && i == This->color0_reg) - || (reg_maps->shader_version.major < 2 && i == 0)) + || (reg_maps->shader_version.major < 2 && !i)) continue; sprintf(srgbtmp[found], "R%u", i); @@ -3827,15 +3833,14 @@ static int compare_sig(const struct wined3d_shader_signature_element *sig1, cons for(i = 0; i < MAX_REG_INPUT; i++) { - if(sig1[i].semantic_name == NULL || sig2[i].semantic_name == NULL) + if (!sig1[i].semantic_name || !sig2[i].semantic_name) { /* Compare pointers, not contents. One string is NULL(element does not exist), the other one is not NULL */ if(sig1[i].semantic_name != sig2[i].semantic_name) return sig1[i].semantic_name < sig2[i].semantic_name ? -1 : 1; continue; } - ret = strcmp(sig1[i].semantic_name, sig2[i].semantic_name); - if(ret != 0) return ret; + if ((ret = strcmp(sig1[i].semantic_name, sig2[i].semantic_name))) return ret; if(sig1[i].semantic_idx != sig2[i].semantic_idx) return sig1[i].semantic_idx < sig2[i].semantic_idx ? -1 : 1; if(sig1[i].sysval_semantic != sig2[i].sysval_semantic) return sig1[i].sysval_semantic < sig2[i].sysval_semantic ? -1 : 1; if(sig1[i].component_type != sig2[i].component_type) return sig1[i].sysval_semantic < sig2[i].component_type ? -1 : 1; @@ -3854,10 +3859,7 @@ static struct wined3d_shader_signature_element *clone_sig(const struct wined3d_s new = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*new) * MAX_REG_INPUT); for(i = 0; i < MAX_REG_INPUT; i++) { - if(sig[i].semantic_name == NULL) - { - continue; - } + if (!sig[i].semantic_name) continue; new[i] = sig[i]; /* Clone the semantic string */ @@ -3873,7 +3875,7 @@ static DWORD find_input_signature(struct shader_arb_priv *priv, const struct win struct wine_rb_entry *entry = wine_rb_get(&priv->signature_tree, sig); struct ps_signature *found_sig; - if(entry != NULL) + if (entry) { found_sig = WINE_RB_ENTRY_VALUE(entry, struct ps_signature, entry); TRACE("Found existing signature %u\n", found_sig->idx); @@ -3894,7 +3896,7 @@ static void init_output_registers(IWineD3DVertexShaderImpl *shader, DWORD sig_nu struct arb_vs_compiled_shader *compiled) { unsigned int i, j; - static const char *texcoords[8] = + static const char * const texcoords[8] = { "result.texcoord[0]", "result.texcoord[1]", "result.texcoord[2]", "result.texcoord[3]", "result.texcoord[4]", "result.texcoord[5]", "result.texcoord[6]", "result.texcoord[7]" @@ -3908,10 +3910,10 @@ static void init_output_registers(IWineD3DVertexShaderImpl *shader, DWORD sig_nu /* Write generic input varyings 0 to 7 to result.texcoord[], varying 8 to result.color.primary * and varying 9 to result.color.secondary */ - const char *decl_idx_to_string[MAX_REG_INPUT] = + static const char * const decl_idx_to_string[MAX_REG_INPUT] = { - texcoords[0], texcoords[1], texcoords[2], texcoords[3], - texcoords[4], texcoords[5], texcoords[6], texcoords[7], + "result.texcoord[0]", "result.texcoord[1]", "result.texcoord[2]", "result.texcoord[3]", + "result.texcoord[4]", "result.texcoord[5]", "result.texcoord[6]", "result.texcoord[7]", "result.color.primary", "result.color.secondary" }; @@ -3931,24 +3933,24 @@ static void init_output_registers(IWineD3DVertexShaderImpl *shader, DWORD sig_nu for (i = 0; i < (sizeof(baseshader->output_signature) / sizeof(*baseshader->output_signature)); ++i) { semantic_name = baseshader->output_signature[i].semantic_name; - if(semantic_name == NULL) continue; + if (!semantic_name) continue; if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_POSITION)) { TRACE("o%u is TMP_OUT\n", i); - if (baseshader->output_signature[i].semantic_idx == 0) priv_ctx->vs_output[i] = "TMP_OUT"; + if (!baseshader->output_signature[i].semantic_idx) priv_ctx->vs_output[i] = "TMP_OUT"; else priv_ctx->vs_output[i] = "TA"; } else if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_PSIZE)) { TRACE("o%u is result.pointsize\n", i); - if (baseshader->output_signature[i].semantic_idx == 0) priv_ctx->vs_output[i] = "result.pointsize"; + if (!baseshader->output_signature[i].semantic_idx) priv_ctx->vs_output[i] = "result.pointsize"; else priv_ctx->vs_output[i] = "TA"; } else if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_COLOR)) { TRACE("o%u is result.color.?, idx %u\n", i, baseshader->output_signature[i].semantic_idx); - if (baseshader->output_signature[i].semantic_idx == 0) + if (!baseshader->output_signature[i].semantic_idx) priv_ctx->vs_output[i] = "result.color.primary"; else if (baseshader->output_signature[i].semantic_idx == 1) priv_ctx->vs_output[i] = "result.color.secondary"; @@ -3977,7 +3979,7 @@ static void init_output_registers(IWineD3DVertexShaderImpl *shader, DWORD sig_nu /* Instead of searching for the signature in the signature list, read the one from the current pixel shader. * Its maybe not the shader where the signature came from, but it is the same signature and faster to find */ - sig = ((IWineD3DPixelShaderImpl *)device->stateBlock->pixelShader)->baseShader.input_signature; + sig = device->stateBlock->state.pixel_shader->baseShader.input_signature; TRACE("Pixel shader uses declared varyings\n"); /* Map builtin to declared. /dev/null the results by default to the TA temp reg */ @@ -3994,7 +3996,7 @@ static void init_output_registers(IWineD3DVertexShaderImpl *shader, DWORD sig_nu semantic_name = sig[i].semantic_name; semantic_idx = sig[i].semantic_idx; reg_idx = sig[i].register_idx; - if(semantic_name == NULL) continue; + if (!semantic_name) continue; /* If a declared input register is not written by builtin arguments, don't write to it. * GL_NV_vertex_program makes sure the input defaults to 0.0, which is correct with D3D @@ -4012,15 +4014,15 @@ static void init_output_registers(IWineD3DVertexShaderImpl *shader, DWORD sig_nu } else if(shader_match_semantic(semantic_name, WINED3DDECLUSAGE_FOG)) { - if(semantic_idx == 0) priv_ctx->fog_output = decl_idx_to_string[reg_idx]; + if (!semantic_idx) priv_ctx->fog_output = decl_idx_to_string[reg_idx]; } else { continue; } - if(strcmp(decl_idx_to_string[reg_idx], "result.color.primary") == 0 || - strcmp(decl_idx_to_string[reg_idx], "result.color.secondary") == 0) + if (!strcmp(decl_idx_to_string[reg_idx], "result.color.primary") + || !strcmp(decl_idx_to_string[reg_idx], "result.color.secondary")) { compiled->need_color_unclamp = TRUE; } @@ -4032,19 +4034,16 @@ static void init_output_registers(IWineD3DVertexShaderImpl *shader, DWORD sig_nu /* Write unread output to TA to throw them away */ priv_ctx->vs_output[i] = "TA"; semantic_name = baseshader->output_signature[i].semantic_name; - if(semantic_name == NULL) - { - continue; - } + if (!semantic_name) continue; if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_POSITION) - && baseshader->output_signature[i].semantic_idx == 0) + && !baseshader->output_signature[i].semantic_idx) { priv_ctx->vs_output[i] = "TMP_OUT"; continue; } else if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_PSIZE) - && baseshader->output_signature[i].semantic_idx == 0) + && !baseshader->output_signature[i].semantic_idx) { priv_ctx->vs_output[i] = "result.pointsize"; continue; @@ -4052,18 +4051,15 @@ static void init_output_registers(IWineD3DVertexShaderImpl *shader, DWORD sig_nu for(j = 0; j < MAX_REG_INPUT; j++) { - if(sig[j].semantic_name == NULL) - { - continue; - } + if (!sig[j].semantic_name) continue; - if (strcmp(sig[j].semantic_name, semantic_name) == 0 + if (!strcmp(sig[j].semantic_name, semantic_name) && sig[j].semantic_idx == baseshader->output_signature[i].semantic_idx) { priv_ctx->vs_output[i] = decl_idx_to_string[sig[j].register_idx]; - if(strcmp(priv_ctx->vs_output[i], "result.color.primary") == 0 || - strcmp(priv_ctx->vs_output[i], "result.color.secondary") == 0) + if (!strcmp(priv_ctx->vs_output[i], "result.color.primary") + || !strcmp(priv_ctx->vs_output[i], "result.color.secondary")) { compiled->need_color_unclamp = TRUE; } @@ -4175,10 +4171,9 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct const char *one = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_ONE); for(i = 0; i < min(8, MAX_REG_TEXCRD); i++) { - if (This->baseShader.reg_maps.texcoord_mask[i] != 0 && - This->baseShader.reg_maps.texcoord_mask[i] != WINED3DSP_WRITEMASK_ALL) { + if (This->baseShader.reg_maps.texcoord_mask[i] + && This->baseShader.reg_maps.texcoord_mask[i] != WINED3DSP_WRITEMASK_ALL) shader_addline(buffer, "MOV result.texcoord[%u].w, %s\n", i, one); - } } } } @@ -4236,6 +4231,7 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct /* GL locking is done by the caller */ static struct arb_ps_compiled_shader *find_arb_pshader(IWineD3DPixelShaderImpl *shader, const struct arb_ps_compile_args *args) { + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device; UINT i; DWORD new_size; struct arb_ps_compiled_shader *new_array; @@ -4245,7 +4241,6 @@ static struct arb_ps_compiled_shader *find_arb_pshader(IWineD3DPixelShaderImpl * if (!shader->baseShader.backend_data) { - IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) shader->baseShader.device; const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; struct shader_arb_priv *priv = device->shader_priv; @@ -4271,10 +4266,10 @@ static struct arb_ps_compiled_shader *find_arb_pshader(IWineD3DPixelShaderImpl * * so a linear search is more performant than a hashmap or a binary search * (cache coherency etc) */ - for(i = 0; i < shader_data->num_gl_shaders; i++) { - if(memcmp(&shader_data->gl_shaders[i].args, args, sizeof(*args)) == 0) { + for (i = 0; i < shader_data->num_gl_shaders; ++i) + { + if (!memcmp(&shader_data->gl_shaders[i].args, args, sizeof(*args))) return &shader_data->gl_shaders[i]; - } } TRACE("No matching GL shader found, compiling a new shader\n"); @@ -4300,7 +4295,7 @@ static struct arb_ps_compiled_shader *find_arb_pshader(IWineD3DPixelShaderImpl * shader_data->gl_shaders[shader_data->num_gl_shaders].args = *args; pixelshader_update_samplers(&shader->baseShader.reg_maps, - ((IWineD3DDeviceImpl *)shader->baseShader.device)->stateBlock->textures); + (IWineD3DBaseTexture **)device->stateBlock->state.textures); if (!shader_buffer_init(&buffer)) { @@ -4326,7 +4321,7 @@ static inline BOOL vs_args_equal(const struct arb_vs_compile_args *stored, const if(stored->vertex.samplers_compare != new->vertex.samplers_compare) return FALSE; if(skip_int) return TRUE; - return memcmp(stored->loop_ctrl, new->loop_ctrl, sizeof(stored->loop_ctrl)) == 0; + return !memcmp(stored->loop_ctrl, new->loop_ctrl, sizeof(stored->loop_ctrl)); } static struct arb_vs_compiled_shader *find_arb_vshader(IWineD3DVertexShaderImpl *shader, const struct arb_vs_compile_args *args) @@ -4395,35 +4390,34 @@ static struct arb_vs_compiled_shader *find_arb_vshader(IWineD3DVertexShaderImpl return &shader_data->gl_shaders[shader_data->num_gl_shaders++]; } -static inline void find_arb_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWineD3DStateBlockImpl *stateblock, - struct arb_ps_compile_args *args) +static void find_arb_ps_compile_args(const struct wined3d_state *state, + IWineD3DPixelShaderImpl *shader, struct arb_ps_compile_args *args) { int i; WORD int_skip; const struct wined3d_gl_info *gl_info = &((IWineD3DDeviceImpl *)shader->baseShader.device)->adapter->gl_info; - find_ps_compile_args(shader, stateblock, &args->super); + + find_ps_compile_args(state, shader, &args->super); /* This forces all local boolean constants to 1 to make them stateblock independent */ args->bools = shader->baseShader.reg_maps.local_bool_consts; for(i = 0; i < MAX_CONST_B; i++) { - if(stateblock->pixelShaderConstantB[i]) args->bools |= ( 1 << i); + if (state->ps_consts_b[i]) + args->bools |= ( 1 << i); } /* Only enable the clip plane emulation KIL if at least one clipplane is enabled. The KIL instruction * is quite expensive because it forces the driver to disable early Z discards. It is cheaper to * duplicate the shader than have a no-op KIL instruction in every shader */ - if((!((IWineD3DDeviceImpl *) shader->baseShader.device)->vs_clipping) && use_vs(stateblock) && - stateblock->renderState[WINED3DRS_CLIPPING] && stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]) - { + if ((!((IWineD3DDeviceImpl *)shader->baseShader.device)->vs_clipping) && use_vs(state) + && state->render_states[WINED3DRS_CLIPPING] + && state->render_states[WINED3DRS_CLIPPLANEENABLE]) args->clip = 1; - } else - { args->clip = 0; - } /* Skip if unused or local, or supported natively */ int_skip = ~shader->baseShader.reg_maps.integer_constants | shader->baseShader.reg_maps.local_int_consts; @@ -4443,26 +4437,27 @@ static inline void find_arb_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWi } else { - args->loop_ctrl[i][0] = stateblock->pixelShaderConstantI[i * 4]; - args->loop_ctrl[i][1] = stateblock->pixelShaderConstantI[i * 4 + 1]; - args->loop_ctrl[i][2] = stateblock->pixelShaderConstantI[i * 4 + 2]; + args->loop_ctrl[i][0] = state->ps_consts_i[i * 4]; + args->loop_ctrl[i][1] = state->ps_consts_i[i * 4 + 1]; + args->loop_ctrl[i][2] = state->ps_consts_i[i * 4 + 2]; } } } -static inline void find_arb_vs_compile_args(IWineD3DVertexShaderImpl *shader, IWineD3DStateBlockImpl *stateblock, - struct arb_vs_compile_args *args) +static void find_arb_vs_compile_args(const struct wined3d_state *state, + IWineD3DVertexShaderImpl *shader, struct arb_vs_compile_args *args) { int i; WORD int_skip; IWineD3DDeviceImpl *dev = (IWineD3DDeviceImpl *)shader->baseShader.device; const struct wined3d_gl_info *gl_info = &dev->adapter->gl_info; - find_vs_compile_args(shader, stateblock, &args->super); + + find_vs_compile_args(state, shader, &args->super); args->clip.boolclip_compare = 0; - if(use_ps(stateblock)) + if (use_ps(state)) { - IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) stateblock->pixelShader; + IWineD3DPixelShaderImpl *ps = state->pixel_shader; struct arb_pshader_private *shader_priv = ps->baseShader.backend_data; args->ps_signature = shader_priv->input_signature_idx; @@ -4473,17 +4468,15 @@ static inline void find_arb_vs_compile_args(IWineD3DVertexShaderImpl *shader, IW args->ps_signature = ~0; if(!dev->vs_clipping) { - args->clip.boolclip.clip_texcoord = ffp_clip_emul(stateblock) ? gl_info->limits.texture_stages : 0; + args->clip.boolclip.clip_texcoord = ffp_clip_emul(state) ? gl_info->limits.texture_stages : 0; } /* Otherwise: Setting boolclip_compare set clip_texcoord to 0 */ } - if(args->clip.boolclip.clip_texcoord) + if (args->clip.boolclip.clip_texcoord) { - if(stateblock->renderState[WINED3DRS_CLIPPING]) - { - args->clip.boolclip.clipplane_mask = stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]; - } + if (state->render_states[WINED3DRS_CLIPPING]) + args->clip.boolclip.clipplane_mask = (unsigned char)state->render_states[WINED3DRS_CLIPPLANEENABLE]; /* clipplane_mask was set to 0 by setting boolclip_compare to 0 */ } @@ -4492,7 +4485,8 @@ static inline void find_arb_vs_compile_args(IWineD3DVertexShaderImpl *shader, IW /* TODO: Figure out if it would be better to store bool constants as bitmasks in the stateblock */ for(i = 0; i < MAX_CONST_B; i++) { - if(stateblock->vertexShaderConstantB[i]) args->clip.boolclip.bools |= ( 1 << i); + if (state->vs_consts_b[i]) + args->clip.boolclip.bools |= ( 1 << i); } args->vertex.samplers[0] = dev->texUnitMap[MAX_FRAGMENT_SAMPLERS + 0]; @@ -4519,9 +4513,9 @@ static inline void find_arb_vs_compile_args(IWineD3DVertexShaderImpl *shader, IW } else { - args->loop_ctrl[i][0] = stateblock->vertexShaderConstantI[i * 4]; - args->loop_ctrl[i][1] = stateblock->vertexShaderConstantI[i * 4 + 1]; - args->loop_ctrl[i][2] = stateblock->vertexShaderConstantI[i * 4 + 2]; + args->loop_ctrl[i][0] = state->vs_consts_i[i * 4]; + args->loop_ctrl[i][1] = state->vs_consts_i[i * 4 + 1]; + args->loop_ctrl[i][2] = state->vs_consts_i[i * 4 + 2]; } } } @@ -4532,16 +4526,18 @@ static void shader_arb_select(const struct wined3d_context *context, BOOL usePS, IWineD3DDeviceImpl *This = context->swapchain->device; struct shader_arb_priv *priv = This->shader_priv; const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &This->stateBlock->state; int i; /* Deal with pixel shaders first so the vertex shader arg function has the input signature ready */ - if (usePS) { + if (usePS) + { + IWineD3DPixelShaderImpl *ps = state->pixel_shader; struct arb_ps_compile_args compile_args; struct arb_ps_compiled_shader *compiled; - IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) This->stateBlock->pixelShader; - TRACE("Using pixel shader %p\n", This->stateBlock->pixelShader); - find_arb_ps_compile_args(ps, This->stateBlock, &compile_args); + TRACE("Using pixel shader %p.\n", ps); + find_arb_ps_compile_args(state, ps, &compile_args); compiled = find_arb_pshader(ps, &compile_args); priv->current_fprogram_id = compiled->prgId; priv->compiled_fprog = compiled; @@ -4591,13 +4587,14 @@ static void shader_arb_select(const struct wined3d_context *context, BOOL usePS, priv->current_fprogram_id = 0; } - if (useVS) { + if (useVS) + { + IWineD3DVertexShaderImpl *vs = state->vertex_shader; struct arb_vs_compile_args compile_args; struct arb_vs_compiled_shader *compiled; - IWineD3DVertexShaderImpl *vs = (IWineD3DVertexShaderImpl *) This->stateBlock->vertexShader; - TRACE("Using vertex shader %p\n", This->stateBlock->vertexShader); - find_arb_vs_compile_args(vs, This->stateBlock, &compile_args); + TRACE("Using vertex shader %p\n", vs); + find_arb_vs_compile_args(state, vs, &compile_args); compiled = find_arb_vshader(vs, &compile_args); priv->current_vprogram_id = compiled->prgId; priv->compiled_vprog = compiled; @@ -4919,7 +4916,7 @@ static void shader_arb_add_instruction_modifiers(const struct wined3d_shader_ins dst = &ins->dst[0]; shift = dst->shift; - if(shift == 0) return; /* Saturate alone is handled by the instructions */ + if (!shift) return; /* Saturate alone is handled by the instructions */ shader_arb_get_write_mask(ins, dst, write_mask); shader_arb_get_register_name(ins, &dst->reg, regstr, &is_color); @@ -4936,6 +4933,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL { /* WINED3DSIH_ABS */ shader_hw_map2gl, /* WINED3DSIH_ADD */ shader_hw_map2gl, + /* WINED3DSIH_AND */ NULL, /* WINED3DSIH_BEM */ pshader_hw_bem, /* WINED3DSIH_BREAK */ shader_hw_break, /* WINED3DSIH_BREAKC */ shader_hw_breakc, @@ -4968,6 +4966,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL /* WINED3DSIH_IF */ NULL /* Hardcoded into the shader */, /* WINED3DSIH_IFC */ shader_hw_ifc, /* WINED3DSIH_IGE */ NULL, + /* WINED3DSIH_IMUL */ NULL, /* WINED3DSIH_LABEL */ shader_hw_label, /* WINED3DSIH_LIT */ shader_hw_map2gl, /* WINED3DSIH_LOG */ shader_hw_log_pow, @@ -4985,6 +4984,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL /* WINED3DSIH_MIN */ shader_hw_map2gl, /* WINED3DSIH_MOV */ shader_hw_mov, /* WINED3DSIH_MOVA */ shader_hw_mov, + /* WINED3DSIH_MOVC */ NULL, /* WINED3DSIH_MUL */ shader_hw_map2gl, /* WINED3DSIH_NOP */ shader_hw_nop, /* WINED3DSIH_NRM */ shader_hw_nrm, @@ -5244,7 +5244,8 @@ static void shader_arb_handle_instruction(const struct wined3d_shader_instructio if(control_frame->outer_loop) { - int iteration, aL = 0; + unsigned int iteration; + int aL = 0; struct list copy; /* Turn off recording before playback */ @@ -5276,11 +5277,11 @@ static void shader_arb_handle_instruction(const struct wined3d_shader_instructio if(ins->handler_idx == WINED3DSIH_ENDLOOP) { priv->aL = aL; - shader_addline(buffer, "#Iteration %d, aL=%d\n", iteration, aL); + shader_addline(buffer, "#Iteration %u, aL=%d\n", iteration, aL); } else { - shader_addline(buffer, "#Iteration %d\n", iteration); + shader_addline(buffer, "#Iteration %u\n", iteration); } LIST_FOR_EACH_ENTRY(rec_ins, ©, struct recorded_instruction, entry) @@ -5322,7 +5323,7 @@ static void shader_arb_handle_instruction(const struct wined3d_shader_instructio bool_const = get_bool_const(ins, This, ins->src[0].reg.idx); if(ins->src[0].modifiers == WINED3DSPSM_NOT) bool_const = !bool_const; - if(!priv->muted && bool_const == FALSE) + if (!priv->muted && !bool_const) { shader_addline(buffer, "#if(FALSE){\n"); priv->muted = TRUE; @@ -5536,45 +5537,51 @@ static void arbfp_get_caps(const struct wined3d_gl_info *gl_info, struct fragmen caps->MaxSimultaneousTextures = min(gl_info->limits.fragment_samplers, 8); } -static void state_texfactor_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void state_texfactor_arbfp(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; IWineD3DDeviceImpl *device = stateblock->device; float col[4]; /* Don't load the parameter if we're using an arbfp pixel shader, otherwise we'll overwrite * application provided constants */ - if(device->shader_backend == &arb_program_shader_backend) { - if (use_ps(stateblock)) return; + if (device->shader_backend == &arb_program_shader_backend) + { + if (use_ps(state)) return; context->pshader_const_dirty[ARB_FFP_CONST_TFACTOR] = 1; device->highest_dirty_ps_const = max(device->highest_dirty_ps_const, ARB_FFP_CONST_TFACTOR + 1); } - D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col); + D3DCOLORTOGLFLOAT4(state->render_states[WINED3DRS_TEXTUREFACTOR], col); GL_EXTCALL(glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, ARB_FFP_CONST_TFACTOR, col)); checkGLcall("glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, ARB_FFP_CONST_TFACTOR, col)"); } -static void state_arb_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void state_arb_specularenable(DWORD state_id, + IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; IWineD3DDeviceImpl *device = stateblock->device; float col[4]; /* Don't load the parameter if we're using an arbfp pixel shader, otherwise we'll overwrite * application provided constants */ - if(device->shader_backend == &arb_program_shader_backend) { - if (use_ps(stateblock)) return; + if (device->shader_backend == &arb_program_shader_backend) + { + if (use_ps(state)) return; context->pshader_const_dirty[ARB_FFP_CONST_SPECULAR_ENABLE] = 1; device->highest_dirty_ps_const = max(device->highest_dirty_ps_const, ARB_FFP_CONST_SPECULAR_ENABLE + 1); } - if(stateblock->renderState[WINED3DRS_SPECULARENABLE]) { + if (state->render_states[WINED3DRS_SPECULARENABLE]) + { /* The specular color has no alpha */ col[0] = 1.0f; col[1] = 1.0f; col[2] = 1.0f; col[3] = 0.0f; @@ -5586,17 +5593,18 @@ static void state_arb_specularenable(DWORD state, IWineD3DStateBlockImpl *stateb checkGLcall("glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, ARB_FFP_CONST_SPECULAR_ENABLE, col)"); } -static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void set_bumpmat_arbfp(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); + DWORD stage = (state_id - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; IWineD3DDeviceImpl *device = stateblock->device; float mat[2][2]; - if (use_ps(stateblock)) + if (use_ps(state)) { - if (stage != 0 - && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.bumpmat & (1 << stage))) + IWineD3DPixelShaderImpl *ps = state->pixel_shader; + if (stage && (ps->baseShader.reg_maps.bumpmat & (1 << stage))) { /* The pixel shader has to know the bump env matrix. Do a constants update if it isn't scheduled * anyway @@ -5614,26 +5622,27 @@ static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, s device->highest_dirty_ps_const = max(device->highest_dirty_ps_const, ARB_FFP_CONST_BUMPMAT(stage) + 1); } - mat[0][0] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT00]); - mat[0][1] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT01]); - mat[1][0] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT10]); - mat[1][1] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT11]); + mat[0][0] = *((float *)&state->texture_states[stage][WINED3DTSS_BUMPENVMAT00]); + mat[0][1] = *((float *)&state->texture_states[stage][WINED3DTSS_BUMPENVMAT01]); + mat[1][0] = *((float *)&state->texture_states[stage][WINED3DTSS_BUMPENVMAT10]); + mat[1][1] = *((float *)&state->texture_states[stage][WINED3DTSS_BUMPENVMAT11]); GL_EXTCALL(glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, ARB_FFP_CONST_BUMPMAT(stage), &mat[0][0])); checkGLcall("glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, ARB_FFP_CONST_BUMPMAT(stage), &mat[0][0])"); } -static void tex_bumpenvlum_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void tex_bumpenvlum_arbfp(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); + DWORD stage = (state_id - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; IWineD3DDeviceImpl *device = stateblock->device; float param[4]; - if (use_ps(stateblock)) + if (use_ps(state)) { - if (stage != 0 - && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.luminanceparams & (1 << stage))) + IWineD3DPixelShaderImpl *ps = state->pixel_shader; + if (stage && (ps->baseShader.reg_maps.luminanceparams & (1 << stage))) { /* The pixel shader has to know the luminance offset. Do a constants update if it * isn't scheduled anyway @@ -5651,8 +5660,8 @@ static void tex_bumpenvlum_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock device->highest_dirty_ps_const = max(device->highest_dirty_ps_const, ARB_FFP_CONST_LUMINANCE(stage) + 1); } - param[0] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVLSCALE]); - param[1] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVLOFFSET]); + param[0] = *((float *)&state->texture_states[stage][WINED3DTSS_BUMPENVLSCALE]); + param[1] = *((float *)&state->texture_states[stage][WINED3DTSS_BUMPENVLOFFSET]); param[2] = 0.0f; param[3] = 0.0f; @@ -5671,7 +5680,7 @@ static const char *get_argreg(struct wined3d_shader_buffer *buffer, DWORD argnum ret = "fragment.color.primary"; break; case WINED3DTA_CURRENT: - if(stage == 0) ret = "fragment.color.primary"; + if (!stage) ret = "fragment.color.primary"; else ret = "ret"; break; @@ -5752,7 +5761,7 @@ static void gen_ffp_instr(struct wined3d_shader_buffer *buffer, unsigned int sta switch(op) { case WINED3DTOP_DISABLE: - if(stage == 0) shader_addline(buffer, "MOV %s%s, fragment.color.primary;\n", dstreg, dstmask); + if (!stage) shader_addline(buffer, "MOV %s%s, fragment.color.primary;\n", dstreg, dstmask); break; case WINED3DTOP_SELECTARG2: @@ -5765,7 +5774,8 @@ static void gen_ffp_instr(struct wined3d_shader_buffer *buffer, unsigned int sta mul = 2; case WINED3DTOP_MODULATE2X: mul *= 2; - if(strcmp(dstreg, "result.color") == 0) { + if (!strcmp(dstreg, "result.color")) + { dstreg = "ret"; mul_final_dest = TRUE; } @@ -5775,7 +5785,8 @@ static void gen_ffp_instr(struct wined3d_shader_buffer *buffer, unsigned int sta case WINED3DTOP_ADDSIGNED2X: mul = 2; - if(strcmp(dstreg, "result.color") == 0) { + if (!strcmp(dstreg, "result.color")) + { dstreg = "ret"; mul_final_dest = TRUE; } @@ -5837,7 +5848,8 @@ static void gen_ffp_instr(struct wined3d_shader_buffer *buffer, unsigned int sta case WINED3DTOP_DOTPRODUCT3: mul = 4; - if(strcmp(dstreg, "result.color") == 0) { + if (!strcmp(dstreg, "result.color")) + { dstreg = "ret"; mul_final_dest = TRUE; } @@ -5982,7 +5994,8 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi srgb_sub_high, 0.0, 0.0, 0.0); } - if(ffp_clip_emul(stateblock) && settings->emul_clipplanes) shader_addline(&buffer, "KIL fragment.texcoord[7];\n"); + if (ffp_clip_emul(&stateblock->state) && settings->emul_clipplanes) + shader_addline(&buffer, "KIL fragment.texcoord[7];\n"); /* Generate texture sampling instructions) */ for(stage = 0; stage < MAX_TEXTURES && settings->op[stage].cop != WINED3DTOP_DISABLE; stage++) { @@ -6060,11 +6073,11 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi } /* Generate the main shader */ - for(stage = 0; stage < MAX_TEXTURES; stage++) { - if(settings->op[stage].cop == WINED3DTOP_DISABLE) { - if(stage == 0) { - final_combiner_src = "fragment.color.primary"; - } + for (stage = 0; stage < MAX_TEXTURES; ++stage) + { + if (settings->op[stage].cop == WINED3DTOP_DISABLE) + { + if (!stage) final_combiner_src = "fragment.color.primary"; break; } @@ -6091,10 +6104,11 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi gen_ffp_instr(&buffer, stage, TRUE, FALSE, settings->op[stage].dst, settings->op[stage].cop, settings->op[stage].carg0, settings->op[stage].carg1, settings->op[stage].carg2); - if(stage == 0) { + if (!stage) shader_addline(&buffer, "MOV ret.w, fragment.color.primary.w;\n"); - } - } else if(op_equal) { + } + else if (op_equal) + { gen_ffp_instr(&buffer, stage, TRUE, TRUE, settings->op[stage].dst, settings->op[stage].cop, settings->op[stage].carg0, settings->op[stage].carg1, settings->op[stage].carg2); @@ -6146,18 +6160,19 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi return ret; } -static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void fragment_prog_arbfp(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; IWineD3DDeviceImpl *device = stateblock->device; struct shader_arb_priv *priv = device->fragment_priv; - BOOL use_pshader = use_ps(stateblock); - BOOL use_vshader = use_vs(stateblock); + BOOL use_vshader = use_vs(state); + BOOL use_pshader = use_ps(state); struct ffp_frag_settings settings; const struct arbfp_ffp_desc *desc; unsigned int i; - TRACE("state %#x, stateblock %p, context %p\n", state, stateblock, context); + TRACE("state_id %#x, stateblock %p, context %p\n", state_id, stateblock, context); if(isStateDirty(context, STATE_RENDER(WINED3DRS_FOGENABLE))) { if(!use_pshader && device->shader_backend == &arb_program_shader_backend && context->last_was_pshader) { @@ -6243,27 +6258,31 @@ static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, * is that changing the fog start and fog end(which links to FOGENABLE in vertex) results in the * fragment_prog_arbfp function being called because FOGENABLE is dirty, which calls this function here */ -static void state_arbfp_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void state_arbfp_fog(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { + const struct wined3d_state *state = &stateblock->state; enum fogsource new_source; - TRACE("state %#x, stateblock %p, context %p\n", state, stateblock, context); + TRACE("state_id %#x, stateblock %p, context %p\n", state_id, stateblock, context); if(!isStateDirty(context, STATE_PIXELSHADER)) { - fragment_prog_arbfp(state, stateblock, context); + fragment_prog_arbfp(state_id, stateblock, context); } - if(!stateblock->renderState[WINED3DRS_FOGENABLE]) return; + if (!state->render_states[WINED3DRS_FOGENABLE]) return; - if(stateblock->renderState[WINED3DRS_FOGTABLEMODE] == WINED3DFOG_NONE) { - if(use_vs(stateblock)) { + if (state->render_states[WINED3DRS_FOGTABLEMODE] == WINED3DFOG_NONE) + { + if (use_vs(state)) + { new_source = FOGSOURCE_VS; - } else { - if(stateblock->renderState[WINED3DRS_FOGVERTEXMODE] == WINED3DFOG_NONE || context->last_was_rhw) { + } + else + { + if (state->render_states[WINED3DRS_FOGVERTEXMODE] == WINED3DFOG_NONE || context->last_was_rhw) new_source = FOGSOURCE_COORD; - } else { + else new_source = FOGSOURCE_FFP; - } } } else { new_source = FOGSOURCE_FFP; @@ -6981,15 +7000,15 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surfac GLenum shader; IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface; const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - float size[4] = {surface->pow2Width, surface->pow2Height, 1, 1}; + float size[4] = {(float) surface->pow2Width, (float) surface->pow2Height, 1.0f, 1.0f}; struct arbfp_blit_priv *priv = device->blit_priv; enum complex_fixup fixup; GLenum textype = surface->texture_target; - if (!is_complex_fixup(surface->resource.format_desc->color_fixup)) + if (!is_complex_fixup(surface->resource.format->color_fixup)) { TRACE("Fixup:\n"); - dump_color_fixup_desc(surface->resource.format_desc->color_fixup); + dump_color_fixup_desc(surface->resource.format->color_fixup); /* Don't bother setting up a shader for unconverted formats */ ENTER_GL(); glEnable(textype); @@ -6998,7 +7017,7 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surfac return WINED3D_OK; } - fixup = get_complex_fixup(surface->resource.format_desc->color_fixup); + fixup = get_complex_fixup(surface->resource.format->color_fixup); switch(fixup) { @@ -7068,10 +7087,8 @@ static void arbfp_blit_unset(IWineD3DDevice *iface) { } static BOOL arbfp_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op, - const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, - const struct wined3d_format_desc *src_format_desc, - const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, - const struct wined3d_format_desc *dst_format_desc) + const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, const struct wined3d_format *src_format, + const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, const struct wined3d_format *dst_format) { enum complex_fixup src_fixup; @@ -7081,27 +7098,27 @@ static BOOL arbfp_blit_supported(const struct wined3d_gl_info *gl_info, enum bli return FALSE; } - src_fixup = get_complex_fixup(src_format_desc->color_fixup); + src_fixup = get_complex_fixup(src_format->color_fixup); if (TRACE_ON(d3d_shader) && TRACE_ON(d3d)) { TRACE("Checking support for fixup:\n"); - dump_color_fixup_desc(src_format_desc->color_fixup); + dump_color_fixup_desc(src_format->color_fixup); } - if (!is_identity_fixup(dst_format_desc->color_fixup)) + if (!is_identity_fixup(dst_format->color_fixup)) { TRACE("Destination fixups are not supported\n"); return FALSE; } - if (is_identity_fixup(src_format_desc->color_fixup)) + if (is_identity_fixup(src_format->color_fixup)) { TRACE("[OK]\n"); return TRUE; } /* We only support YUV conversions. */ - if (!is_complex_fixup(src_format_desc->color_fixup)) + if (!is_complex_fixup(src_format->color_fixup)) { TRACE("[FAILED]\n"); return FALSE; @@ -7143,7 +7160,8 @@ HRESULT arbfp_blit_surface(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_ * Also beware of the origin difference(top left vs bottom left). * Also beware that the front buffer's surface size is screen width x screen height, * whereas the real gl drawable size is the size of the window. */ - dst_swapchain = (dst_surface->Flags & SFLAG_SWAPCHAIN) ? (IWineD3DSwapChainImpl *)dst_surface->container : NULL; + dst_swapchain = dst_surface->container.type == WINED3D_CONTAINER_SWAPCHAIN + ? dst_surface->container.u.swapchain : NULL; if (dst_swapchain && dst_surface == dst_swapchain->front_buffer) surface_translate_frontbuffer_coords(dst_surface, context->win_handle, &dst_rect); @@ -7166,11 +7184,13 @@ HRESULT arbfp_blit_surface(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_ context_release(context); - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INDRAWABLE, TRUE); + surface_modify_location(dst_surface, SFLAG_INDRAWABLE, TRUE); return WINED3D_OK; } -static HRESULT arbfp_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color) +/* Do not call while under the GL lock. */ +static HRESULT arbfp_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, + const RECT *dst_rect, const WINED3DCOLORVALUE *color) { FIXME("Color filling not implemented by arbfp_blit\n"); return WINED3DERR_INVALIDCALL; diff --git a/dll/directx/wine/wined3d/ati_fragment_shader.c b/dll/directx/wine/wined3d/ati_fragment_shader.c index 993ece0be8d..35838e18d73 100644 --- a/dll/directx/wine/wined3d/ati_fragment_shader.c +++ b/dll/directx/wine/wined3d/ati_fragment_shader.c @@ -273,11 +273,7 @@ static GLuint register_for_arg(DWORD arg, const struct wined3d_gl_info *gl_info, * instruction writing to reg0. Afterwards texture0 is not used any longer. * If we're reading from current */ - if(stage == 0) { - ret = GL_PRIMARY_COLOR; - } else { - ret = GL_REG_0_ATI; - } + ret = stage ? GL_REG_0_ATI : GL_PRIMARY_COLOR; break; case WINED3DTA_TEXTURE: @@ -517,9 +513,12 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con } /* Pass 4: Generate the arithmetic instructions */ - for(stage = 0; stage < MAX_TEXTURES; stage++) { - if(op[stage].cop == WINED3DTOP_DISABLE) { - if(stage == 0) { + for (stage = 0; stage < MAX_TEXTURES; ++stage) + { + if (op[stage].cop == WINED3DTOP_DISABLE) + { + if (!stage) + { /* Handle complete texture disabling gracefully */ wrap_op1(gl_info, GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_PRIMARY_COLOR, GL_NONE, GL_NONE); @@ -679,7 +678,8 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con switch(op[stage].aop) { case WINED3DTOP_DISABLE: /* Get the primary color to the output if on stage 0, otherwise leave register 0 untouched */ - if(stage == 0) { + if (!stage) + { wrap_op1(gl_info, GL_MOV_ATI, GL_REG_0_ATI, GL_ALPHA, GL_NONE, GL_PRIMARY_COLOR, GL_NONE, GL_NONE); } @@ -838,7 +838,7 @@ static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, st { GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage)); checkGLcall("glActiveTextureARB"); - texture_activate_dimensions(i, stateblock, context); + texture_activate_dimensions(stateblock->state.textures[i], gl_info); } } @@ -849,7 +849,7 @@ static void state_texfactor_atifs(DWORD state, IWineD3DStateBlockImpl *statebloc { const struct wined3d_gl_info *gl_info = context->gl_info; float col[4]; - D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col); + D3DCOLORTOGLFLOAT4(stateblock->state.render_states[WINED3DRS_TEXTUREFACTOR], col); GL_EXTCALL(glSetFragmentShaderConstantATI(ATI_FFP_CONST_TFACTOR, col)); checkGLcall("glSetFragmentShaderConstantATI(ATI_FFP_CONST_TFACTOR, col)"); @@ -861,10 +861,10 @@ static void set_bumpmat(DWORD state, IWineD3DStateBlockImpl *stateblock, struct const struct wined3d_gl_info *gl_info = context->gl_info; float mat[2][2]; - mat[0][0] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT00]); - mat[1][0] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT01]); - mat[0][1] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT10]); - mat[1][1] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT11]); + mat[0][0] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT00]); + mat[1][0] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT01]); + mat[0][1] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT10]); + mat[1][1] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT11]); /* GL_ATI_fragment_shader allows only constants from 0.0 to 1.0, but the bumpmat * constants can be in any range. While they should stay between [-1.0 and 1.0] because * Shader Model 1.x pixel shaders are clamped to that range negative values are used occasionally, @@ -887,12 +887,13 @@ static void textransform(DWORD state, IWineD3DStateBlockImpl *stateblock, struct } } -static void atifs_apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void atifs_apply_pixelshader(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { + const struct wined3d_state *state = &stateblock->state; IWineD3DDeviceImpl *device = stateblock->device; - BOOL use_vshader = use_vs(stateblock); + BOOL use_vshader = use_vs(state); - context->last_was_pshader = use_ps(stateblock); + context->last_was_pshader = use_ps(state); /* The ATIFS code does not support pixel shaders currently, but we have to provide a state handler * to call shader_select to select a vertex shader if one is applied because the vertex shader state * may defer calling the shader backend if the pshader state is dirty. @@ -912,6 +913,12 @@ static void atifs_apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *statebl } } +static void atifs_srgbwriteenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +{ + if (stateblock->state.render_states[WINED3DRS_SRGBWRITEENABLE]) + WARN("sRGB writes are not supported by this fragment pipe.\n"); +} + static const struct StateEntryTemplate atifs_fragmentstate_template[] = { {STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor_atifs }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE }, @@ -921,6 +928,7 @@ static const struct StateEntryTemplate atifs_fragmentstate_template[] = { {STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE }, + {STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), atifs_srgbwriteenable }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE }, diff --git a/dll/directx/wine/wined3d/basetexture.c b/dll/directx/wine/wined3d/basetexture.c index deab4fb2362..bf3b4d4ff70 100644 --- a/dll/directx/wine/wined3d/basetexture.c +++ b/dll/directx/wine/wined3d/basetexture.c @@ -29,13 +29,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture); HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT layer_count, UINT level_count, WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage, - const struct wined3d_format_desc *format_desc, WINED3DPOOL pool, IUnknown *parent, + const struct wined3d_format *format, WINED3DPOOL pool, void *parent, const struct wined3d_parent_ops *parent_ops) { HRESULT hr; hr = resource_init((IWineD3DResource *)texture, resource_type, device, - size, usage, format_desc, pool, parent, parent_ops); + size, usage, format, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize resource, returning %#x\n", hr); @@ -60,7 +60,7 @@ HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT layer_count, UIN texture->baseTexture.is_srgb = FALSE; texture->baseTexture.pow2Matrix_identity = TRUE; - if (texture->resource.format_desc->Flags & WINED3DFMT_FLAG_FILTERING) + if (texture->resource.format->Flags & WINED3DFMT_FLAG_FILTERING) { texture->baseTexture.minMipLookup = minMipLookup; texture->baseTexture.magLookup = magLookup; @@ -129,6 +129,8 @@ void basetexture_unload(IWineD3DBaseTexture *iface) This->baseTexture.texture_rgb.dirty = TRUE; This->baseTexture.texture_srgb.dirty = TRUE; + + resource_unload((IWineD3DResourceImpl *)This); } DWORD basetexture_set_lod(IWineD3DBaseTexture *iface, DWORD LODNew) @@ -182,7 +184,7 @@ HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface, WINED3DT { IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface; IWineD3DDeviceImpl *device = This->resource.device; - UINT textureDimensions = IWineD3DBaseTexture_GetTextureDimensions(iface); + GLenum textureDimensions = This->baseTexture.target; if (!(This->resource.usage & WINED3DUSAGE_AUTOGENMIPMAP)) { TRACE("(%p) : returning invalid call\n", This); @@ -260,7 +262,7 @@ HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surfac { IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface; HRESULT hr = WINED3D_OK; - UINT textureDimensions; + GLenum textureDimensions; BOOL isNewTexture = FALSE; struct gl_texture *gl_tex; TRACE("(%p) : About to bind texture\n", This); @@ -272,10 +274,11 @@ HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surfac gl_tex = &This->baseTexture.texture_rgb; } - textureDimensions = IWineD3DBaseTexture_GetTextureDimensions(iface); + textureDimensions = This->baseTexture.target; ENTER_GL(); /* Generate a texture name if we don't already have one */ - if (gl_tex->name == 0) { + if (!gl_tex->name) + { *set_surface_desc = TRUE; glGenTextures(1, &gl_tex->name); checkGLcall("glGenTextures"); @@ -317,7 +320,8 @@ HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surfac } /* Bind the texture */ - if (gl_tex->name != 0) { + if (gl_tex->name) + { glBindTexture(textureDimensions, gl_tex->name); checkGLcall("glBindTexture"); if (isNewTexture) { @@ -385,8 +389,8 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface, const struct wined3d_gl_info *gl_info) { IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface; + GLenum textureDimensions = This->baseTexture.target; DWORD state; - GLint textureDimensions = IWineD3DBaseTexture_GetTextureDimensions(iface); BOOL cond_np2 = IWineD3DBaseTexture_IsCondNP2(iface); DWORD aniso; struct gl_texture *gl_tex; @@ -518,10 +522,10 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface, gl_tex->states[WINED3DTEXSTA_MAXANISOTROPY] = aniso; } - if (!(This->resource.format_desc->Flags & WINED3DFMT_FLAG_SHADOW) + if (!(This->resource.format->Flags & WINED3DFMT_FLAG_SHADOW) != !gl_tex->states[WINED3DTEXSTA_SHADOW]) { - if (This->resource.format_desc->Flags & WINED3DFMT_FLAG_SHADOW) + if (This->resource.format->Flags & WINED3DFMT_FLAG_SHADOW) { glTexParameteri(textureDimensions, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE); glTexParameteri(textureDimensions, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB); diff --git a/dll/directx/wine/wined3d/buffer.c b/dll/directx/wine/wined3d/buffer.c index daece20c33d..23b4a4ad67c 100644 --- a/dll/directx/wine/wined3d/buffer.c +++ b/dll/directx/wine/wined3d/buffer.c @@ -78,7 +78,7 @@ static inline void buffer_clear_dirty_areas(struct wined3d_buffer *This) static inline BOOL buffer_is_dirty(struct wined3d_buffer *This) { - return This->modified_areas != 0; + return !!This->modified_areas; } static inline BOOL buffer_is_fully_dirty(struct wined3d_buffer *This) @@ -87,7 +87,7 @@ static inline BOOL buffer_is_fully_dirty(struct wined3d_buffer *This) for(i = 0; i < This->modified_areas; i++) { - if(This->maps[i].offset == 0 && This->maps[i].size == This->resource.size) + if (!This->maps[i].offset && This->maps[i].size == This->resource.size) { return TRUE; } @@ -231,10 +231,10 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This, const enum wined3d_buffer_conversion_type conversion_type, const struct wined3d_stream_info_element *attrib, DWORD *stride_this_run) { + DWORD offset = This->resource.device->stateBlock->state.streams[attrib->stream_idx].offset; DWORD attrib_size; BOOL ret = FALSE; unsigned int i; - DWORD offset = This->resource.device->stateBlock->streamOffset[attrib->stream_idx]; DWORD_PTR data; /* Check for some valid situations which cause us pain. One is if the buffer is used for @@ -245,7 +245,7 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This, if (!attrib->stride) { FIXME("%s used with stride 0, let's hope we get the vertex stride from somewhere else\n", - debug_d3dformat(attrib->format_desc->format)); + debug_d3dformat(attrib->format->id)); } else if(attrib->stride != *stride_this_run && *stride_this_run) { @@ -269,7 +269,7 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This, } data = (((DWORD_PTR)attrib->data) + offset) % This->stride; - attrib_size = attrib->format_desc->component_count * attrib->format_desc->component_size; + attrib_size = attrib->format->component_count * attrib->format->component_size; for (i = 0; i < attrib_size; ++i) { DWORD_PTR idx = (data + i) % This->stride; @@ -292,8 +292,8 @@ static BOOL buffer_check_attribute(struct wined3d_buffer *This, const struct win const struct wined3d_stream_info_element *attrib = &si->elements[attrib_idx]; IWineD3DDeviceImpl *device = This->resource.device; const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + enum wined3d_format_id format; BOOL ret = FALSE; - WINED3DFORMAT format; /* Ignore attributes that do not have our vbo. After that check we can be sure that the attribute is * there, on nonexistent attribs the vbo is 0. @@ -302,7 +302,7 @@ static BOOL buffer_check_attribute(struct wined3d_buffer *This, const struct win || attrib->buffer_object != This->buffer_object) return FALSE; - format = attrib->format_desc->format; + format = attrib->format->id; /* Look for newly appeared conversion */ if (!gl_info->supported[ARB_HALF_FLOAT_VERTEX] && (format == WINED3DFMT_R16G16_FLOAT || format == WINED3DFMT_R16G16B16A16_FLOAT)) @@ -346,11 +346,11 @@ static UINT *find_conversion_shift(struct wined3d_buffer *This, ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DWORD) * stride); for (i = 0; i < MAX_ATTRIBS; ++i) { - WINED3DFORMAT format; + enum wined3d_format_id format; if (!(strided->use_map & (1 << i)) || strided->elements[i].buffer_object != This->buffer_object) continue; - format = strided->elements[i].format_desc->format; + format = strided->elements[i].format->id; if (format == WINED3DFMT_R16G16_FLOAT) { shift = 4; @@ -374,8 +374,8 @@ static UINT *find_conversion_shift(struct wined3d_buffer *This, if (shift) { - orig_type_size = strided->elements[i].format_desc->component_count - * strided->elements[i].format_desc->component_size; + orig_type_size = strided->elements[i].format->component_count + * strided->elements[i].format->component_size; for (j = (DWORD_PTR)strided->elements[i].data + orig_type_size; j < stride; ++j) { ret[j] += shift; @@ -401,6 +401,7 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This) IWineD3DDeviceImpl *device = This->resource.device; const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; const struct wined3d_stream_info *si = &device->strided_streams; + const struct wined3d_state *state = &device->stateBlock->state; UINT stride_this_run = 0; BOOL float16_used = FALSE; BOOL ret = FALSE; @@ -460,14 +461,14 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This) * conversion types depend on the semantic as well, for example a FLOAT4 * texcoord needs no conversion while a FLOAT4 positiont needs one */ - if (use_vs(device->stateBlock)) + if (use_vs(state)) { TRACE("vshader\n"); /* If the current vertex declaration is marked for no half float conversion don't bother to * analyse the strided streams in depth, just set them up for no conversion. Return decl changed * if we used conversion before */ - if (!((IWineD3DVertexDeclarationImpl *) device->stateBlock->vertexDecl)->half_float_conv_needed) + if (!state->vertex_declaration->half_float_conv_needed) { if (This->conversion_map) { @@ -534,7 +535,7 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This) if (float16_used) FIXME("Float16 conversion used with fixed function vertex processing\n"); } - if (stride_this_run == 0 && This->conversion_map) + if (!stride_this_run && This->conversion_map) { /* Sanity test */ if (!ret) ERR("no converted attributes found, old conversion map exists, and no declaration change?\n"); @@ -686,6 +687,7 @@ BYTE *buffer_get_sysmem(struct wined3d_buffer *This, const struct wined3d_gl_inf return This->resource.allocatedMemory; } +/* Do not call while under the GL lock. */ static void STDMETHODCALLTYPE buffer_UnLoad(IWineD3DBuffer *iface) { struct wined3d_buffer *This = (struct wined3d_buffer *)iface; @@ -720,8 +722,11 @@ static void STDMETHODCALLTYPE buffer_UnLoad(IWineD3DBuffer *iface) This->conversion_stride = 0; This->flags &= ~WINED3D_BUFFER_HASDESC; } + + resource_unload((IWineD3DResourceImpl *)This); } +/* Do not call while under the GL lock. */ static ULONG STDMETHODCALLTYPE buffer_Release(IWineD3DBuffer *iface) { struct wined3d_buffer *This = (struct wined3d_buffer *)iface; @@ -742,10 +747,11 @@ static ULONG STDMETHODCALLTYPE buffer_Release(IWineD3DBuffer *iface) } /* IWineD3DBase methods */ - -static HRESULT STDMETHODCALLTYPE buffer_GetParent(IWineD3DBuffer *iface, IUnknown **parent) +static void * STDMETHODCALLTYPE buffer_GetParent(IWineD3DBuffer *iface) { - return resource_get_parent((IWineD3DResource *)iface, parent); + TRACE("iface %p.\n", iface); + + return ((struct wined3d_buffer *)iface)->resource.parent; } /* IWineD3DResource methods */ @@ -918,6 +924,7 @@ static void buffer_direct_upload(struct wined3d_buffer *This, const struct wined LEAVE_GL(); } +/* Do not call while under the GL lock. */ static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface) { struct wined3d_buffer *This = (struct wined3d_buffer *)iface; @@ -1000,7 +1007,7 @@ static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface) if(!buffer_add_dirty_area(This, 0, 0)) { ERR("buffer_add_dirty_area failed, this is not expected\n"); - return; + goto end; } /* Avoid unfenced updates, we might overwrite more areas of the buffer than the application * cleared for unsynchronized updates @@ -1342,7 +1349,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface) * number of Map calls, d3d returns always D3D_OK. * This is also needed to prevent Map from returning garbage on * the next call (this will happen if the lock_count is < 0). */ - if(This->lock_count == 0) + if (!This->lock_count) { TRACE("Unmap called without a previous Map call!\n"); return WINED3D_OK; @@ -1407,7 +1414,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface) return WINED3D_OK; } -static HRESULT STDMETHODCALLTYPE buffer_GetDesc(IWineD3DBuffer *iface, WINED3DBUFFER_DESC *desc) +static void STDMETHODCALLTYPE buffer_GetDesc(IWineD3DBuffer *iface, WINED3DBUFFER_DESC *desc) { struct wined3d_buffer *This = (struct wined3d_buffer *)iface; @@ -1417,8 +1424,6 @@ static HRESULT STDMETHODCALLTYPE buffer_GetDesc(IWineD3DBuffer *iface, WINED3DBU desc->Usage = This->resource.usage; desc->Pool = This->resource.pool; desc->Size = This->resource.size; - - return WINED3D_OK; } static const struct IWineD3DBufferVtbl wined3d_buffer_vtbl = @@ -1445,12 +1450,12 @@ static const struct IWineD3DBufferVtbl wined3d_buffer_vtbl = }; HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device, - UINT size, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, GLenum bind_hint, - const char *data, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + UINT size, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool, GLenum bind_hint, + const char *data, void *parent, const struct wined3d_parent_ops *parent_ops) { - const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, &device->adapter->gl_info); - HRESULT hr; const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + const struct wined3d_format *format = wined3d_get_format(gl_info, format_id); + HRESULT hr; BOOL dynamic_buffer_ok; if (!size) @@ -1462,7 +1467,7 @@ HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device, buffer->vtbl = &wined3d_buffer_vtbl; hr = resource_init((IWineD3DResource *)buffer, WINED3DRTYPE_BUFFER, - device, size, usage, format_desc, pool, parent, parent_ops); + device, size, usage, format, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize resource, hr %#x\n", hr); @@ -1471,7 +1476,7 @@ HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device, buffer->buffer_type_hint = bind_hint; TRACE("size %#x, usage %#x, format %s, memory @ %p, iface @ %p.\n", buffer->resource.size, buffer->resource.usage, - debug_d3dformat(buffer->resource.format_desc->format), buffer->resource.allocatedMemory, buffer); + debug_d3dformat(buffer->resource.format->id), buffer->resource.allocatedMemory, buffer); /* GL_ARB_map_buffer_range is disabled for now due to numerous bugs and no gains */ dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE]; diff --git a/dll/directx/wine/wined3d/clipper.c b/dll/directx/wine/wined3d/clipper.c index 8be3a95863b..48ce06f76d4 100644 --- a/dll/directx/wine/wined3d/clipper.c +++ b/dll/directx/wine/wined3d/clipper.c @@ -33,7 +33,6 @@ static HRESULT WINAPI IWineD3DClipperImpl_QueryInterface(IWineD3DClipper *iface, TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); if (IsEqualGUID(riid, &IID_IWineD3DClipper) - || IsEqualGUID(riid, &IID_IWineD3DBase) || IsEqualGUID(riid, &IID_IUnknown)) { IUnknown_AddRef(iface); @@ -64,22 +63,9 @@ static ULONG WINAPI IWineD3DClipperImpl_Release(IWineD3DClipper *iface) TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); - if (ref == 0) - { - HeapFree(GetProcessHeap(), 0, This); - return 0; - } - else return ref; -} + if (!ref) HeapFree(GetProcessHeap(), 0, This); -static HRESULT WINAPI IWineD3DClipperImpl_GetParent(IWineD3DClipper *iface, IUnknown **Parent) -{ - IWineD3DClipperImpl *This = (IWineD3DClipperImpl *)iface; - TRACE("(%p)->(%p)\n", This, Parent); - - *Parent = This->Parent; - IUnknown_AddRef(*Parent); - return WINED3D_OK; + return ref; } static HRESULT WINAPI IWineD3DClipperImpl_SetHwnd(IWineD3DClipper *iface, DWORD Flags, HWND hWnd) @@ -146,7 +132,7 @@ static HRESULT WINAPI IWineD3DClipperImpl_SetClipList(IWineD3DClipper *iface, co { static int warned = 0; - if (warned++ < 10 || rgn == NULL) + if (warned++ < 10 || !rgn) FIXME("iface %p, region %p, flags %#x stub!\n", iface, rgn, Flags); return WINED3D_OK; @@ -176,7 +162,6 @@ static const IWineD3DClipperVtbl IWineD3DClipper_Vtbl = IWineD3DClipperImpl_QueryInterface, IWineD3DClipperImpl_AddRef, IWineD3DClipperImpl_Release, - IWineD3DClipperImpl_GetParent, IWineD3DClipperImpl_GetClipList, IWineD3DClipperImpl_GetHwnd, IWineD3DClipperImpl_IsClipListChanged, @@ -184,11 +169,12 @@ static const IWineD3DClipperVtbl IWineD3DClipper_Vtbl = IWineD3DClipperImpl_SetHwnd }; -IWineD3DClipper* WINAPI WineDirect3DCreateClipper(IUnknown *Parent) +IWineD3DClipper * WINAPI WineDirect3DCreateClipper(void) { IWineD3DClipperImpl *obj; - TRACE("Creating clipper, parent %p\n", Parent); + TRACE("\n"); + obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*obj)); if(!obj) { @@ -197,7 +183,6 @@ IWineD3DClipper* WINAPI WineDirect3DCreateClipper(IUnknown *Parent) } obj->lpVtbl = &IWineD3DClipper_Vtbl; - obj->Parent = Parent; IWineD3DClipper_AddRef((IWineD3DClipper *)obj); return (IWineD3DClipper *) obj; diff --git a/dll/directx/wine/wined3d/context.c b/dll/directx/wine/wined3d/context.c index 5304af2f408..6f9d9d7ce22 100644 --- a/dll/directx/wine/wined3d/context.c +++ b/dll/directx/wine/wined3d/context.c @@ -112,29 +112,44 @@ static void context_destroy_fbo(struct wined3d_context *context, GLuint *fbo) } /* GL locking is done by the caller */ -static void context_apply_attachment_filter_states(IWineD3DSurfaceImpl *surface) +static void context_apply_attachment_filter_states(IWineD3DSurfaceImpl *surface, DWORD location) { - IWineD3DBaseTextureImpl *texture_impl; - /* Update base texture states array */ - if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface, - &IID_IWineD3DBaseTexture, (void **)&texture_impl))) + if (surface->container.type == WINED3D_CONTAINER_TEXTURE) { + IWineD3DBaseTextureImpl *texture_impl = surface->container.u.texture; IWineD3DDeviceImpl *device = surface->resource.device; BOOL update_minfilter = FALSE; BOOL update_magfilter = FALSE; + struct gl_texture *gl_tex; - if (texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] != WINED3DTEXF_POINT - || texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] != WINED3DTEXF_NONE) + switch (location) { - texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; - texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE; + case SFLAG_INTEXTURE: + gl_tex = &texture_impl->baseTexture.texture_rgb; + break; + + case SFLAG_INSRGBTEX: + gl_tex = &texture_impl->baseTexture.texture_srgb; + break; + + default: + ERR("Unsupported location %s (%#x).\n", debug_surflocation(location), location); + IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl); + return; + } + + if (gl_tex->states[WINED3DTEXSTA_MINFILTER] != WINED3DTEXF_POINT + || gl_tex->states[WINED3DTEXSTA_MIPFILTER] != WINED3DTEXF_NONE) + { + gl_tex->states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; + gl_tex->states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE; update_minfilter = TRUE; } - if (texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] != WINED3DTEXF_POINT) + if (gl_tex->states[WINED3DTEXSTA_MAGFILTER] != WINED3DTEXF_POINT) { - texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT; + gl_tex->states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT; update_magfilter = TRUE; } @@ -144,8 +159,6 @@ static void context_apply_attachment_filter_states(IWineD3DSurfaceImpl *surface) IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(texture_impl->baseTexture.sampler)); } - IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl); - if (update_minfilter || update_magfilter) { GLenum target, bind_target; @@ -168,7 +181,7 @@ static void context_apply_attachment_filter_states(IWineD3DSurfaceImpl *surface) glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARB, &old_binding); } - glBindTexture(bind_target, surface->texture_name); + glBindTexture(bind_target, gl_tex->name); if (update_minfilter) glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); if (update_magfilter) glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glBindTexture(bind_target, old_binding); @@ -188,7 +201,7 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context, if (depth_stencil) { - DWORD format_flags = depth_stencil->resource.format_desc->Flags; + DWORD format_flags = depth_stencil->resource.format->Flags; if (use_render_buffer && depth_stencil->current_renderbuffer) { @@ -209,7 +222,7 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context, else { surface_prepare_texture(depth_stencil, gl_info, FALSE); - context_apply_attachment_filter_states(depth_stencil); + context_apply_attachment_filter_states(depth_stencil, SFLAG_INTEXTURE); if (format_flags & WINED3DFMT_FLAG_DEPTH) { @@ -252,7 +265,7 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context, /* GL locking is done by the caller */ static void context_attach_surface_fbo(const struct wined3d_context *context, - GLenum fbo_target, DWORD idx, IWineD3DSurfaceImpl *surface) + GLenum fbo_target, DWORD idx, IWineD3DSurfaceImpl *surface, DWORD location) { const struct wined3d_gl_info *gl_info = context->gl_info; @@ -260,11 +273,26 @@ static void context_attach_surface_fbo(const struct wined3d_context *context, if (surface) { - surface_prepare_texture(surface, gl_info, FALSE); - context_apply_attachment_filter_states(surface); + switch (location) + { + case SFLAG_INTEXTURE: + surface_prepare_texture(surface, gl_info, FALSE); + context_apply_attachment_filter_states(surface, location); + gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, + surface->texture_target, surface->texture_name, surface->texture_level); + break; - gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, surface->texture_target, - surface->texture_name, surface->texture_level); + case SFLAG_INSRGBTEX: + surface_prepare_texture(surface, gl_info, TRUE); + context_apply_attachment_filter_states(surface, location); + gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, + surface->texture_target, surface->texture_name_srgb, surface->texture_level); + break; + + default: + ERR("Unsupported location %s (%#x).\n", debug_surflocation(location), location); + break; + } checkGLcall("glFramebufferTexture2D()"); } else @@ -295,6 +323,9 @@ static void context_check_fbo_status(struct wined3d_context *context, GLenum tar return; } + FIXME("\tLocation %s (%#x).\n", debug_surflocation(context->current_fbo->location), + context->current_fbo->location); + /* Dump the FBO attachments */ for (i = 0; i < gl_info->limits.buffers; ++i) { @@ -302,7 +333,7 @@ static void context_check_fbo_status(struct wined3d_context *context, GLenum tar if (attachment) { FIXME("\tColor attachment %d: (%p) %s %ux%u\n", - i, attachment, debug_d3dformat(attachment->resource.format_desc->format), + i, attachment, debug_d3dformat(attachment->resource.format->id), attachment->pow2Width, attachment->pow2Height); } } @@ -310,14 +341,14 @@ static void context_check_fbo_status(struct wined3d_context *context, GLenum tar if (attachment) { FIXME("\tDepth attachment: (%p) %s %ux%u\n", - attachment, debug_d3dformat(attachment->resource.format_desc->format), + attachment, debug_d3dformat(attachment->resource.format->id), attachment->pow2Width, attachment->pow2Height); } } } static struct fbo_entry *context_create_fbo_entry(struct wined3d_context *context, - IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil) + IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil, DWORD location) { const struct wined3d_gl_info *gl_info = context->gl_info; struct fbo_entry *entry; @@ -326,6 +357,7 @@ static struct fbo_entry *context_create_fbo_entry(struct wined3d_context *contex entry->render_targets = HeapAlloc(GetProcessHeap(), 0, gl_info->limits.buffers * sizeof(*entry->render_targets)); memcpy(entry->render_targets, render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets)); entry->depth_stencil = depth_stencil; + entry->location = location; entry->attached = FALSE; entry->id = 0; @@ -335,7 +367,7 @@ static struct fbo_entry *context_create_fbo_entry(struct wined3d_context *contex /* GL locking is done by the caller */ static void context_reuse_fbo_entry(struct wined3d_context *context, GLenum target, IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil, - struct fbo_entry *entry) + DWORD location, struct fbo_entry *entry) { const struct wined3d_gl_info *gl_info = context->gl_info; @@ -344,6 +376,7 @@ static void context_reuse_fbo_entry(struct wined3d_context *context, GLenum targ memcpy(entry->render_targets, render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets)); entry->depth_stencil = depth_stencil; + entry->location = location; entry->attached = FALSE; } @@ -364,7 +397,7 @@ static void context_destroy_fbo_entry(struct wined3d_context *context, struct fb /* GL locking is done by the caller */ static struct fbo_entry *context_find_fbo_entry(struct wined3d_context *context, GLenum target, - IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil) + IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil, DWORD location) { const struct wined3d_gl_info *gl_info = context->gl_info; struct fbo_entry *entry; @@ -373,7 +406,7 @@ static struct fbo_entry *context_find_fbo_entry(struct wined3d_context *context, { if (!memcmp(entry->render_targets, render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets)) - && entry->depth_stencil == depth_stencil) + && entry->depth_stencil == depth_stencil && entry->location == location) { list_remove(&entry->entry); list_add_head(&context->fbo_list, &entry->entry); @@ -383,14 +416,14 @@ static struct fbo_entry *context_find_fbo_entry(struct wined3d_context *context, if (context->fbo_entry_count < WINED3D_MAX_FBO_ENTRIES) { - entry = context_create_fbo_entry(context, render_targets, depth_stencil); + entry = context_create_fbo_entry(context, render_targets, depth_stencil, location); list_add_head(&context->fbo_list, &entry->entry); ++context->fbo_entry_count; } else { entry = LIST_ENTRY(list_tail(&context->fbo_list), struct fbo_entry, entry); - context_reuse_fbo_entry(context, target, render_targets, depth_stencil, entry); + context_reuse_fbo_entry(context, target, render_targets, depth_stencil, location, entry); list_remove(&entry->entry); list_add_head(&context->fbo_list, &entry->entry); } @@ -411,7 +444,7 @@ static void context_apply_fbo_entry(struct wined3d_context *context, GLenum targ /* Apply render targets */ for (i = 0; i < gl_info->limits.buffers; ++i) { - context_attach_surface_fbo(context, target, i, entry->render_targets[i]); + context_attach_surface_fbo(context, target, i, entry->render_targets[i], entry->location); } /* Apply depth targets */ @@ -429,16 +462,16 @@ static void context_apply_fbo_entry(struct wined3d_context *context, GLenum targ for (i = 0; i < gl_info->limits.buffers; ++i) { if (entry->render_targets[i]) - context_apply_attachment_filter_states(entry->render_targets[i]); + context_apply_attachment_filter_states(entry->render_targets[i], entry->location); } if (entry->depth_stencil) - context_apply_attachment_filter_states(entry->depth_stencil); + context_apply_attachment_filter_states(entry->depth_stencil, SFLAG_INTEXTURE); } } /* GL locking is done by the caller */ static void context_apply_fbo_state(struct wined3d_context *context, GLenum target, - IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil) + IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil, DWORD location) { struct fbo_entry *entry, *entry2; @@ -455,7 +488,7 @@ static void context_apply_fbo_state(struct wined3d_context *context, GLenum targ if (render_targets) { - context->current_fbo = context_find_fbo_entry(context, target, render_targets, depth_stencil); + context->current_fbo = context_find_fbo_entry(context, target, render_targets, depth_stencil, location); context_apply_fbo_entry(context, target, context->current_fbo); } else @@ -469,16 +502,18 @@ static void context_apply_fbo_state(struct wined3d_context *context, GLenum targ /* GL locking is done by the caller */ void context_apply_fbo_state_blit(struct wined3d_context *context, GLenum target, - IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil) + IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil, DWORD location) { if (surface_is_offscreen(render_target)) { + UINT clear_size = (context->gl_info->limits.buffers - 1) * sizeof(*context->blit_targets); context->blit_targets[0] = render_target; - context_apply_fbo_state(context, target, context->blit_targets, depth_stencil); + if (clear_size) memset(&context->blit_targets[1], 0, clear_size); + context_apply_fbo_state(context, target, context->blit_targets, depth_stencil, location); } else { - context_apply_fbo_state(context, target, NULL, NULL); + context_apply_fbo_state(context, target, NULL, NULL, location); } } @@ -611,50 +646,78 @@ void context_free_event_query(struct wined3d_event_query *query) context->free_event_queries[context->free_event_query_count++] = query->object; } -void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource, WINED3DRESOURCETYPE type) +typedef void (context_fbo_entry_func_t)(struct wined3d_context *context, struct fbo_entry *entry); + +static void context_enum_surface_fbo_entries(IWineD3DDeviceImpl *device, + IWineD3DSurfaceImpl *surface, context_fbo_entry_func_t *callback) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; UINT i; - if (!This->d3d_initialized) return; - - switch(type) + for (i = 0; i < device->numContexts; ++i) { - case WINED3DRTYPE_SURFACE: + struct wined3d_context *context = device->contexts[i]; + const struct wined3d_gl_info *gl_info = context->gl_info; + struct fbo_entry *entry, *entry2; + + if (context->current_rt == surface) context->current_rt = NULL; + + LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry) { - for (i = 0; i < This->numContexts; ++i) + UINT j; + + if (entry->depth_stencil == surface) { - struct wined3d_context *context = This->contexts[i]; - const struct wined3d_gl_info *gl_info = context->gl_info; - struct fbo_entry *entry, *entry2; - - if (context->current_rt == (IWineD3DSurfaceImpl *)resource) context->current_rt = NULL; - - LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry) - { - UINT j; - - if (entry->depth_stencil == (IWineD3DSurfaceImpl *)resource) - { - list_remove(&entry->entry); - list_add_head(&context->fbo_destroy_list, &entry->entry); - continue; - } - - for (j = 0; j < gl_info->limits.buffers; ++j) - { - if (entry->render_targets[j] == (IWineD3DSurfaceImpl *)resource) - { - list_remove(&entry->entry); - list_add_head(&context->fbo_destroy_list, &entry->entry); - break; - } - } - } + callback(context, entry); + continue; } - break; + for (j = 0; j < gl_info->limits.buffers; ++j) + { + if (entry->render_targets[j] == surface) + { + callback(context, entry); + break; + } + } } + } +} + +static void context_queue_fbo_entry_destruction(struct wined3d_context *context, struct fbo_entry *entry) +{ + list_remove(&entry->entry); + list_add_head(&context->fbo_destroy_list, &entry->entry); +} + +void context_resource_released(IWineD3DDeviceImpl *device, IWineD3DResource *resource, WINED3DRESOURCETYPE type) +{ + if (!device->d3d_initialized) return; + + switch (type) + { + case WINED3DRTYPE_SURFACE: + context_enum_surface_fbo_entries(device, (IWineD3DSurfaceImpl *)resource, + context_queue_fbo_entry_destruction); + break; + + default: + break; + } +} + +static void context_detach_fbo_entry(struct wined3d_context *context, struct fbo_entry *entry) +{ + entry->attached = FALSE; +} + +void context_resource_unloaded(IWineD3DDeviceImpl *device, IWineD3DResource *resource, WINED3DRESOURCETYPE type) +{ + switch (type) + { + case WINED3DRTYPE_SURFACE: + context_enum_surface_fbo_entries(device, (IWineD3DSurfaceImpl *)resource, + context_detach_fbo_entry); + break; default: break; @@ -770,6 +833,7 @@ err: context->valid = 0; } +/* Do not call while under the GL lock. */ static void context_validate(struct wined3d_context *context) { HWND wnd = WindowFromDC(context->hdc); @@ -785,6 +849,7 @@ static void context_validate(struct wined3d_context *context) context_update_window(context); } +/* Do not call while under the GL lock. */ static void context_destroy_gl_resources(struct wined3d_context *context) { const struct wined3d_gl_info *gl_info = context->gl_info; @@ -917,6 +982,7 @@ struct wined3d_context *context_get_current(void) return TlsGetValue(wined3d_context_tls_idx); } +/* Do not call while under the GL lock. */ BOOL context_set_current(struct wined3d_context *ctx) { struct wined3d_context *old = context_get_current(); @@ -1043,7 +1109,7 @@ static void Context_MarkStateDirty(struct wined3d_context *context, DWORD state, /* This function takes care of WineD3D pixel format selection. */ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc, - const struct wined3d_format_desc *color_format_desc, const struct wined3d_format_desc *ds_format_desc, + const struct wined3d_format *color_format, const struct wined3d_format *ds_format, BOOL auxBuffers, int numSamples, BOOL findCompatible) { int iPixelFormat=0; @@ -1051,11 +1117,14 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc, short redBits, greenBits, blueBits, alphaBits, colorBits; short depthBits=0, stencilBits=0; - struct match_type { + static const struct + { BOOL require_aux; BOOL exact_alpha; BOOL exact_color; - } matches[] = { + } + matches[] = + { /* First, try without alpha match buffers. MacOS supports aux buffers only * on A8R8G8B8, and we prefer better offscreen rendering over an alpha match. * Then try without aux buffers - this is the most common cause for not @@ -1075,17 +1144,17 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc, int nCfgs = This->adapter->nCfgs; TRACE("ColorFormat=%s, DepthStencilFormat=%s, auxBuffers=%d, numSamples=%d, findCompatible=%d\n", - debug_d3dformat(color_format_desc->format), debug_d3dformat(ds_format_desc->format), + debug_d3dformat(color_format->id), debug_d3dformat(ds_format->id), auxBuffers, numSamples, findCompatible); - if (!getColorBits(color_format_desc, &redBits, &greenBits, &blueBits, &alphaBits, &colorBits)) + if (!getColorBits(color_format, &redBits, &greenBits, &blueBits, &alphaBits, &colorBits)) { ERR("Unable to get color bits for format %s (%#x)!\n", - debug_d3dformat(color_format_desc->format), color_format_desc->format); + debug_d3dformat(color_format->id), color_format->id); return 0; } - getDepthStencilBits(ds_format_desc, &depthBits, &stencilBits); + getDepthStencilBits(ds_format, &depthBits, &stencilBits); for(matchtry = 0; matchtry < (sizeof(matches) / sizeof(matches[0])) && !iPixelFormat; matchtry++) { for(i=0; iformat), debug_d3dformat(ds_format_desc->format)); + iPixelFormat, debug_d3dformat(color_format->id), debug_d3dformat(ds_format->id)); return iPixelFormat; } -/***************************************************************************** - * context_create - * - * Creates a new context. - * - * * Params: - * This: Device to activate the context for - * target: Surface this context will render to - * win_handle: handle to the window which we are drawing to - * pPresentParameters: contains the pixelformats to use for onscreen rendering - * - *****************************************************************************/ -struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3DSurfaceImpl *target, - const struct wined3d_format_desc *ds_format_desc) +/* Do not call while under the GL lock. */ +struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, + IWineD3DSurfaceImpl *target, const struct wined3d_format *ds_format) { IWineD3DDeviceImpl *device = swapchain->device; const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - const struct wined3d_format_desc *color_format_desc; + const struct wined3d_format *color_format; struct wined3d_context *ret; PIXELFORMATDESCRIPTOR pfd; BOOL auxBuffers = FALSE; @@ -1241,7 +1299,7 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3 goto out; } - color_format_desc = target->resource.format_desc; + color_format = target->resource.format; /* In case of ORM_BACKBUFFER, make sure to request an alpha component for * X4R4G4B4/X8R8G8B8 as we might need it for the backbuffer. */ @@ -1249,10 +1307,10 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3 { auxBuffers = TRUE; - if (color_format_desc->format == WINED3DFMT_B4G4R4X4_UNORM) - color_format_desc = getFormatDescEntry(WINED3DFMT_B4G4R4A4_UNORM, gl_info); - else if (color_format_desc->format == WINED3DFMT_B8G8R8X8_UNORM) - color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info); + if (color_format->id == WINED3DFMT_B4G4R4X4_UNORM) + color_format = wined3d_get_format(gl_info, WINED3DFMT_B4G4R4A4_UNORM); + else if (color_format->id == WINED3DFMT_B8G8R8X8_UNORM) + color_format = wined3d_get_format(gl_info, WINED3DFMT_B8G8R8A8_UNORM); } /* DirectDraw supports 8bit paletted render targets and these are used by @@ -1261,8 +1319,8 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3 * conversion (ab)uses the alpha component for storing the palette index. * For this reason we require a format with 8bit alpha, so request * A8R8G8B8. */ - if (color_format_desc->format == WINED3DFMT_P8_UINT) - color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info); + if (color_format->id == WINED3DFMT_P8_UINT) + color_format = wined3d_get_format(gl_info, WINED3DFMT_B8G8R8A8_UNORM); /* D3D only allows multisampling when SwapEffect is set to WINED3DSWAPEFFECT_DISCARD. */ if (swapchain->presentParms.MultiSampleType && (swapchain->presentParms.SwapEffect == WINED3DSWAPEFFECT_DISCARD)) @@ -1277,14 +1335,14 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3 } /* Try to find a pixel format which matches our requirements. */ - pixel_format = WineD3D_ChoosePixelFormat(device, hdc, color_format_desc, ds_format_desc, + pixel_format = WineD3D_ChoosePixelFormat(device, hdc, color_format, ds_format, auxBuffers, numSamples, FALSE /* findCompatible */); /* Try to locate a compatible format if we weren't able to find anything. */ if (!pixel_format) { TRACE("Trying to locate a compatible pixel format because an exact match failed.\n"); - pixel_format = WineD3D_ChoosePixelFormat(device, hdc, color_format_desc, ds_format_desc, + pixel_format = WineD3D_ChoosePixelFormat(device, hdc, color_format, ds_format, auxBuffers, 0 /* numSamples */, TRUE /* findCompatible */); } @@ -1369,6 +1427,10 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3 gl_info->limits.buffers * sizeof(*ret->blit_targets)); if (!ret->blit_targets) goto out; + ret->draw_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + gl_info->limits.buffers * sizeof(*ret->draw_buffers)); + if (!ret->draw_buffers) goto out; + ret->free_occlusion_query_size = 4; ret->free_occlusion_queries = HeapAlloc(GetProcessHeap(), 0, ret->free_occlusion_query_size * sizeof(*ret->free_occlusion_queries)); @@ -1482,6 +1544,23 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3 checkGLcall("glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE)"); } + if (gl_info->supported[WINED3D_GL_VERSION_2_0]) + { + /* Windows doesn't support to query the glPointParameteri function pointer, so use the + * NV_POINT_SPRITE extension. + */ + if (glPointParameteri) + { + glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_UPPER_LEFT); + checkGLcall("glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_UPPER_LEFT)"); + } + else if (gl_info->supported[NV_POINT_SPRITE]) + { + GL_EXTCALL(glPointParameteriNV(GL_POINT_SPRITE_COORD_ORIGIN, GL_UPPER_LEFT)); + checkGLcall("glPointParameteriNV(GL_POINT_SPRITE_COORD_ORIGIN, GL_UPPER_LEFT)"); + } + } + if (gl_info->supported[ARB_PROVOKING_VERTEX]) { GL_EXTCALL(glProvokingVertex(GL_FIRST_VERTEX_CONVENTION)); @@ -1502,6 +1581,7 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3 out: HeapFree(GetProcessHeap(), 0, ret->free_event_queries); HeapFree(GetProcessHeap(), 0, ret->free_occlusion_queries); + HeapFree(GetProcessHeap(), 0, ret->draw_buffers); HeapFree(GetProcessHeap(), 0, ret->blit_targets); HeapFree(GetProcessHeap(), 0, ret->pshader_const_dirty); HeapFree(GetProcessHeap(), 0, ret->vshader_const_dirty); @@ -1509,16 +1589,7 @@ out: return NULL; } -/***************************************************************************** - * context_destroy - * - * Destroys a wined3d context - * - * Params: - * This: Device to activate the context for - * context: Context to destroy - * - *****************************************************************************/ +/* Do not call while under the GL lock. */ void context_destroy(IWineD3DDeviceImpl *This, struct wined3d_context *context) { BOOL destroy; @@ -1537,6 +1608,7 @@ void context_destroy(IWineD3DDeviceImpl *This, struct wined3d_context *context) destroy = FALSE; } + HeapFree(GetProcessHeap(), 0, context->draw_buffers); HeapFree(GetProcessHeap(), 0, context->blit_targets); HeapFree(GetProcessHeap(), 0, context->vshader_const_dirty); HeapFree(GetProcessHeap(), 0, context->pshader_const_dirty); @@ -1794,21 +1866,9 @@ static struct wined3d_context *findThreadContextForSwapChain(IWineD3DSwapChain * return swapchain_create_context_for_thread(swapchain); } -/***************************************************************************** - * FindContext - * - * Finds a context for the current render target and thread - * - * Parameters: - * target: Render target to find the context for - * tid: Thread to activate the context for - * - * Returns: The needed context - * - *****************************************************************************/ +/* Do not call while under the GL lock. */ static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target) { - IWineD3DSwapChain *swapchain = NULL; struct wined3d_context *current_context = context_get_current(); DWORD tid = GetCurrentThreadId(); struct wined3d_context *context; @@ -1837,11 +1897,13 @@ static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSur return current_context; } - if (target->Flags & SFLAG_SWAPCHAIN) + if (target->container.type == WINED3D_CONTAINER_SWAPCHAIN) { + IWineD3DSwapChain *swapchain; + TRACE("Rendering onscreen\n"); - swapchain = (IWineD3DSwapChain *)target->container; + swapchain = (IWineD3DSwapChain *)target->container.u.swapchain; context = findThreadContextForSwapChain(swapchain, tid); } else @@ -1871,18 +1933,13 @@ static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSur } /* Context activation is done by the caller. */ -static void context_apply_draw_buffer(struct wined3d_context *context, BOOL blit) +static void context_apply_draw_buffers(struct wined3d_context *context, UINT rt_count, IWineD3DSurfaceImpl **rts) { - const struct wined3d_gl_info *gl_info = context->gl_info; - IWineD3DSurfaceImpl *rt = context->current_rt; - IWineD3DDeviceImpl *device; - - device = rt->resource.device; - if (!surface_is_offscreen(rt)) + if (!surface_is_offscreen(rts[0])) { ENTER_GL(); - glDrawBuffer(surface_get_gl_buffer(rt)); - checkGLcall("glDrawBuffers()"); + glDrawBuffer(surface_get_gl_buffer(rts[0])); + checkGLcall("glDrawBuffer()"); LEAVE_GL(); } else @@ -1890,36 +1947,31 @@ static void context_apply_draw_buffer(struct wined3d_context *context, BOOL blit ENTER_GL(); if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - if (!blit) + const struct wined3d_gl_info *gl_info = context->gl_info; + unsigned int i; + + for (i = 0; i < gl_info->limits.buffers; ++i) { - unsigned int i; - - for (i = 0; i < gl_info->limits.buffers; ++i) - { - if (device->render_targets[i]) - device->draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i; - else - device->draw_buffers[i] = GL_NONE; - } - - if (gl_info->supported[ARB_DRAW_BUFFERS]) - { - GL_EXTCALL(glDrawBuffersARB(gl_info->limits.buffers, device->draw_buffers)); - checkGLcall("glDrawBuffers()"); - } + if (i < rt_count && rts[i]) + context->draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i; else - { - glDrawBuffer(device->draw_buffers[0]); - checkGLcall("glDrawBuffer()"); - } - } else { - glDrawBuffer(GL_COLOR_ATTACHMENT0); + context->draw_buffers[i] = GL_NONE; + } + + if (gl_info->supported[ARB_DRAW_BUFFERS]) + { + GL_EXTCALL(glDrawBuffersARB(gl_info->limits.buffers, context->draw_buffers)); + checkGLcall("glDrawBuffers()"); + } + else + { + glDrawBuffer(context->draw_buffers[0]); checkGLcall("glDrawBuffer()"); } } else { - glDrawBuffer(device->offscreenBuffer); + glDrawBuffer(rts[0]->resource.device->offscreenBuffer); checkGLcall("glDrawBuffer()"); } LEAVE_GL(); @@ -1937,8 +1989,27 @@ void context_set_draw_buffer(struct wined3d_context *context, GLenum buffer) static inline void context_set_render_offscreen(struct wined3d_context *context, const struct StateEntry *StateTable, BOOL offscreen) { + const struct wined3d_gl_info *gl_info = context->gl_info; + if (context->render_offscreen == offscreen) return; + if (gl_info->supported[WINED3D_GL_VERSION_2_0]) + { + /* Windows doesn't support to query the glPointParameteri function pointer, so use the + * NV_POINT_SPRITE extension. + */ + if (glPointParameteri) + { + glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, offscreen ? GL_LOWER_LEFT : GL_UPPER_LEFT); + checkGLcall("glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, ...)"); + } + else if (gl_info->supported[NV_POINT_SPRITE]) + { + GL_EXTCALL(glPointParameteriNV(GL_POINT_SPRITE_COORD_ORIGIN, offscreen ? GL_LOWER_LEFT : GL_UPPER_LEFT)); + checkGLcall("glPointParameteriNV(GL_POINT_SPRITE_COORD_ORIGIN, ...)"); + } + } + Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION), StateTable); Context_MarkStateDirty(context, STATE_VDECL, StateTable); Context_MarkStateDirty(context, STATE_VIEWPORT, StateTable); @@ -1947,8 +2018,8 @@ static inline void context_set_render_offscreen(struct wined3d_context *context, context->render_offscreen = offscreen; } -static BOOL match_depth_stencil_format(const struct wined3d_format_desc *existing, - const struct wined3d_format_desc *required) +static BOOL match_depth_stencil_format(const struct wined3d_format *existing, + const struct wined3d_format *required) { short existing_depth, existing_stencil, required_depth, required_stencil; @@ -1969,10 +2040,10 @@ static void context_validate_onscreen_formats(IWineD3DDeviceImpl *device, struct wined3d_context *context, IWineD3DSurfaceImpl *depth_stencil) { /* Onscreen surfaces are always in a swapchain */ - IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)context->current_rt->container; + IWineD3DSwapChainImpl *swapchain = context->current_rt->container.u.swapchain; if (context->render_offscreen || !depth_stencil) return; - if (match_depth_stencil_format(swapchain->ds_format, depth_stencil->resource.format_desc)) return; + if (match_depth_stencil_format(swapchain->ds_format, depth_stencil->resource.format)) return; /* TODO: If the requested format would satisfy the needs of the existing one(reverse match), * or no onscreen depth buffer was created, the OpenGL drawable could be changed to the new @@ -1980,7 +2051,7 @@ static void context_validate_onscreen_formats(IWineD3DDeviceImpl *device, WARN("Depth stencil format is not supported by WGL, rendering the backbuffer in an FBO\n"); /* The currently active context is the necessary context to access the swapchain's onscreen buffers */ - IWineD3DSurface_LoadLocation((IWineD3DSurface *)context->current_rt, SFLAG_INTEXTURE, NULL); + surface_load_location(context->current_rt, SFLAG_INTEXTURE, NULL); swapchain->render_to_fbo = TRUE; context_set_render_offscreen(context, device->StateTable, TRUE); } @@ -1998,7 +2069,7 @@ void context_apply_blit_state(struct wined3d_context *context, IWineD3DDeviceImp surface_internal_preload(context->current_rt, SRGB_RGB); ENTER_GL(); - context_apply_fbo_state_blit(context, GL_FRAMEBUFFER, context->current_rt, NULL); + context_apply_fbo_state_blit(context, GL_FRAMEBUFFER, context->current_rt, NULL, SFLAG_INTEXTURE); LEAVE_GL(); } else @@ -2013,7 +2084,7 @@ void context_apply_blit_state(struct wined3d_context *context, IWineD3DDeviceImp if (context->draw_buffer_dirty) { - context_apply_draw_buffer(context, TRUE); + context_apply_draw_buffers(context, 1, &context->current_rt); if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) context->draw_buffer_dirty = FALSE; } @@ -2023,30 +2094,40 @@ void context_apply_blit_state(struct wined3d_context *context, IWineD3DDeviceImp /* Context activation is done by the caller. */ void context_apply_clear_state(struct wined3d_context *context, IWineD3DDeviceImpl *device, - IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil) + UINT rt_count, IWineD3DSurfaceImpl **rts, IWineD3DSurfaceImpl *depth_stencil) { const struct StateEntry *state_table = device->StateTable; - GLenum buffer; + UINT i; if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { context_validate_onscreen_formats(device, context, depth_stencil); ENTER_GL(); - context_apply_fbo_state_blit(context, GL_FRAMEBUFFER, render_target, depth_stencil); + + if (surface_is_offscreen(rts[0])) + { + for (i = 0; i < rt_count; ++i) + { + context->blit_targets[i] = rts[i]; + } + while (i < context->gl_info->limits.buffers) + { + context->blit_targets[i] = NULL; + ++i; + } + context_apply_fbo_state(context, GL_FRAMEBUFFER, context->blit_targets, depth_stencil, SFLAG_INTEXTURE); + } + else + { + context_apply_fbo_state(context, GL_FRAMEBUFFER, NULL, NULL, SFLAG_INDRAWABLE); + } + LEAVE_GL(); } - if (!surface_is_offscreen(render_target)) - buffer = surface_get_gl_buffer(render_target); - else if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) - buffer = GL_COLOR_ATTACHMENT0; - else - buffer = device->offscreenBuffer; - - ENTER_GL(); - context_set_draw_buffer(context, buffer); - LEAVE_GL(); + context_apply_draw_buffers(context, rt_count, rts); + context->draw_buffer_dirty = TRUE; if (context->last_was_blit) { @@ -2074,6 +2155,14 @@ void context_apply_draw_state(struct wined3d_context *context, IWineD3DDeviceImp const struct StateEntry *state_table = device->StateTable; unsigned int i; + /* Preload resources before FBO setup. Texture preload in particular may + * result in changes to the current FBO, due to using e.g. FBO blits for + * updating a resource location. */ + IWineD3DDeviceImpl_FindTexUnitMap(device); + device_preload_textures(device); + if (isStateDirty(context, STATE_VDECL)) + device_update_stream_info(device, context->gl_info); + if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { context_validate_onscreen_formats(device, context, device->depth_stencil); @@ -2081,20 +2170,21 @@ void context_apply_draw_state(struct wined3d_context *context, IWineD3DDeviceImp if (!context->render_offscreen) { ENTER_GL(); - context_apply_fbo_state(context, GL_FRAMEBUFFER, NULL, NULL); + context_apply_fbo_state(context, GL_FRAMEBUFFER, NULL, NULL, SFLAG_INDRAWABLE); LEAVE_GL(); } else { ENTER_GL(); - context_apply_fbo_state(context, GL_FRAMEBUFFER, device->render_targets, device->depth_stencil); + context_apply_fbo_state(context, GL_FRAMEBUFFER, device->render_targets, + device->depth_stencil, SFLAG_INTEXTURE); LEAVE_GL(); } } if (context->draw_buffer_dirty) { - context_apply_draw_buffer(context, FALSE); + context_apply_draw_buffers(context, context->gl_info->limits.buffers, device->render_targets); context->draw_buffer_dirty = FALSE; } @@ -2103,11 +2193,6 @@ void context_apply_draw_state(struct wined3d_context *context, IWineD3DDeviceImp device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE); } - IWineD3DDeviceImpl_FindTexUnitMap(device); - device_preload_textures(device); - if (isStateDirty(context, STATE_VDECL)) - device_update_stream_info(device, context->gl_info); - ENTER_GL(); for (i = 0; i < context->numDirtyEntries; ++i) { @@ -2129,10 +2214,8 @@ static void context_setup_target(IWineD3DDeviceImpl *device, const struct StateEntry *StateTable = device->StateTable; if (!target) return; - else if (context->current_rt == target) return; render_offscreen = surface_is_offscreen(target); - - context_set_render_offscreen(context, StateTable, render_offscreen); + if (context->current_rt == target && render_offscreen == old_render_offscreen) return; /* To compensate the lack of format switching with some offscreen rendering methods and on onscreen buffers * the alpha blend state changes with different render target formats. */ @@ -2142,10 +2225,10 @@ static void context_setup_target(IWineD3DDeviceImpl *device, } else { - const struct wined3d_format_desc *old = context->current_rt->resource.format_desc; - const struct wined3d_format_desc *new = target->resource.format_desc; + const struct wined3d_format *old = context->current_rt->resource.format; + const struct wined3d_format *new = target->resource.format; - if (old->format != new->format) + if (old->id != new->id) { /* Disable blending when the alpha mask has changed and when a format doesn't support blending. */ if ((old->alpha_mask && !new->alpha_mask) || (!old->alpha_mask && new->alpha_mask) @@ -2153,6 +2236,11 @@ static void context_setup_target(IWineD3DDeviceImpl *device, { Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable); } + /* Update sRGB writing when switching between formats that do/do not support sRGB writing */ + if ((old->Flags & WINED3DFMT_FLAG_SRGB_WRITE) != (new->Flags & WINED3DFMT_FLAG_SRGB_WRITE)) + { + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), StateTable); + } } /* When switching away from an offscreen render target, and we're not @@ -2165,19 +2253,6 @@ static void context_setup_target(IWineD3DDeviceImpl *device, if (wined3d_settings.offscreen_rendering_mode != ORM_FBO && old_render_offscreen && context->current_rt != target) { - BOOL oldInDraw = device->isInDraw; - - /* surface_internal_preload() requires a context to load the - * texture, so it will call context_acquire(). Set isInDraw to true - * to signal surface_internal_preload() that it has a context. */ - - /* FIXME: This is just broken. There's no guarantee whatsoever - * that the currently active context, if any, is appropriate for - * reading back the render target. We should probably call - * context_set_current(context) here and then rely on - * context_acquire() doing the right thing. */ - device->isInDraw = TRUE; - /* Read the back buffer of the old drawable into the destination texture. */ if (context->current_rt->texture_name_srgb) { @@ -2188,29 +2263,16 @@ static void context_setup_target(IWineD3DDeviceImpl *device, surface_internal_preload(context->current_rt, SRGB_RGB); } - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)context->current_rt, SFLAG_INDRAWABLE, FALSE); - - device->isInDraw = oldInDraw; + surface_modify_location(context->current_rt, SFLAG_INDRAWABLE, FALSE); } } context->draw_buffer_dirty = TRUE; context->current_rt = target; + context_set_render_offscreen(context, StateTable, render_offscreen); } -/***************************************************************************** - * context_acquire - * - * Finds a rendering context and drawable matching the device and render - * target for the current thread, activates them and puts them into the - * requested state. - * - * Params: - * This: Device to activate the context for - * target: Requested render target - * usage: Prepares the context for blitting, drawing or other actions - * - *****************************************************************************/ +/* Do not call while under the GL lock. */ struct wined3d_context *context_acquire(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *target) { struct wined3d_context *current_context = context_get_current(); diff --git a/dll/directx/wine/wined3d/cubetexture.c b/dll/directx/wine/wined3d/cubetexture.c index 12acee26573..2d2c04c2c21 100644 --- a/dll/directx/wine/wined3d/cubetexture.c +++ b/dll/directx/wine/wined3d/cubetexture.c @@ -27,6 +27,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture); +/* Do not call while under the GL lock. */ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb) { /* Override the IWineD3DResource Preload method. */ @@ -70,8 +71,8 @@ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3 context = context_acquire(device, NULL); } - if (This->resource.format_desc->format == WINED3DFMT_P8_UINT - || This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM) + if (This->resource.format->id == WINED3DFMT_P8_UINT + || This->resource.format->id == WINED3DFMT_P8_UINT_A8_UNORM) { for (i = 0; i < sub_count; ++i) { @@ -81,10 +82,10 @@ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3 { TRACE("Reloading surface %p because the d3d8/9 palette was changed.\n", surface); /* TODO: This is not necessarily needed with hw palettized texture support. */ - IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, NULL); + surface_load_location(surface, SFLAG_INSYSMEM, NULL); /* Make sure the texture is reloaded because of the palette change, * this kills performance though :( */ - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INTEXTURE, FALSE); + surface_modify_location(surface, SFLAG_INTEXTURE, FALSE); } } } @@ -127,7 +128,7 @@ static void cubetexture_cleanup(IWineD3DCubeTextureImpl *This) surface_set_texture_name(surface, 0, TRUE); surface_set_texture_name(surface, 0, FALSE); surface_set_texture_target(surface, 0); - IWineD3DSurface_SetContainer((IWineD3DSurface *)surface, NULL); + surface_set_container(surface, WINED3D_CONTAINER_NONE, NULL); IWineD3DSurface_Release((IWineD3DSurface *)surface); } } @@ -161,6 +162,7 @@ static ULONG WINAPI IWineD3DCubeTextureImpl_AddRef(IWineD3DCubeTexture *iface) { return InterlockedIncrement(&This->resource.ref); } +/* Do not call while under the GL lock. */ static ULONG WINAPI IWineD3DCubeTextureImpl_Release(IWineD3DCubeTexture *iface) { IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface; ULONG ref; @@ -198,10 +200,12 @@ static DWORD WINAPI IWineD3DCubeTextureImpl_GetPriority(IWineD3DCubeTexture *ifa return resource_get_priority((IWineD3DResource *)iface); } +/* Do not call while under the GL lock. */ static void WINAPI IWineD3DCubeTextureImpl_PreLoad(IWineD3DCubeTexture *iface) { cubetexture_internal_preload((IWineD3DBaseTexture *) iface, SRGB_ANY); } +/* Do not call while under the GL lock. */ static void WINAPI IWineD3DCubeTextureImpl_UnLoad(IWineD3DCubeTexture *iface) { IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface; @@ -230,8 +234,11 @@ static WINED3DRESOURCETYPE WINAPI IWineD3DCubeTextureImpl_GetType(IWineD3DCubeTe return resource_get_type((IWineD3DResource *)iface); } -static HRESULT WINAPI IWineD3DCubeTextureImpl_GetParent(IWineD3DCubeTexture *iface, IUnknown **pParent) { - return resource_get_parent((IWineD3DResource *)iface, pParent); +static void * WINAPI IWineD3DCubeTextureImpl_GetParent(IWineD3DCubeTexture *iface) +{ + TRACE("iface %p.\n", iface); + + return ((IWineD3DCubeTextureImpl *)iface)->resource.parent; } /* ****************************************************** @@ -299,13 +306,6 @@ static HRESULT WINAPI IWineD3DCubeTextureImpl_BindTexture(IWineD3DCubeTexture *i return hr; } -static UINT WINAPI IWineD3DCubeTextureImpl_GetTextureDimensions(IWineD3DCubeTexture *iface) -{ - TRACE("iface %p.\n", iface); - - return GL_TEXTURE_CUBE_MAP_ARB; -} - static BOOL WINAPI IWineD3DCubeTextureImpl_IsCondNP2(IWineD3DCubeTexture *iface) { TRACE("iface %p.\n", iface); @@ -330,7 +330,9 @@ static HRESULT WINAPI IWineD3DCubeTextureImpl_GetLevelDesc(IWineD3DCubeTexture * return WINED3DERR_INVALIDCALL; } - return IWineD3DSurface_GetDesc(surface, desc); + IWineD3DSurface_GetDesc(surface, desc); + + return WINED3D_OK; } static HRESULT WINAPI IWineD3DCubeTextureImpl_GetCubeMapSurface(IWineD3DCubeTexture *iface, @@ -440,7 +442,6 @@ static const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl = IWineD3DCubeTextureImpl_SetDirty, IWineD3DCubeTextureImpl_GetDirty, IWineD3DCubeTextureImpl_BindTexture, - IWineD3DCubeTextureImpl_GetTextureDimensions, IWineD3DCubeTextureImpl_IsCondNP2, /* IWineD3DCubeTexture */ IWineD3DCubeTextureImpl_GetLevelDesc, @@ -451,11 +452,11 @@ static const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl = }; HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UINT levels, - IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + IWineD3DDeviceImpl *device, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool, + void *parent, const struct wined3d_parent_ops *parent_ops) { const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info); + const struct wined3d_format *format = wined3d_get_format(gl_info, format_id); UINT pow2_edge_length; unsigned int i, j; UINT tmp_w; @@ -463,7 +464,7 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN /* TODO: It should only be possible to create textures for formats * that are reported as supported. */ - if (WINED3DFMT_UNKNOWN >= format) + if (WINED3DFMT_UNKNOWN >= format_id) { WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); return WINED3DERR_INVALIDCALL; @@ -501,7 +502,7 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN texture->lpVtbl = &IWineD3DCubeTexture_Vtbl; hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, 6, levels, - WINED3DRTYPE_CUBETEXTURE, device, 0, usage, format_desc, pool, parent, parent_ops); + WINED3DRTYPE_CUBETEXTURE, device, 0, usage, format, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize basetexture, returning %#x\n", hr); @@ -529,6 +530,7 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN texture->baseTexture.pow2Matrix[15] = 1.0f; texture->baseTexture.pow2Matrix_identity = FALSE; } + texture->baseTexture.target = GL_TEXTURE_CUBE_MAP_ARB; /* Generate all the surfaces. */ tmp_w = edge_length; @@ -550,7 +552,7 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN IWineD3DSurface *surface; hr = IWineD3DDeviceParent_CreateSurface(device->device_parent, parent, tmp_w, tmp_w, - format, usage, pool, i /* Level */, j, &surface); + format_id, usage, pool, i /* Level */, j, &surface); if (FAILED(hr)) { FIXME("(%p) Failed to create surface, hr %#x.\n", texture, hr); @@ -558,7 +560,7 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN return hr; } - IWineD3DSurface_SetContainer(surface, (IWineD3DBase *)texture); + surface_set_container((IWineD3DSurfaceImpl *)surface, WINED3D_CONTAINER_TEXTURE, (IWineD3DBase *)texture); surface_set_texture_target((IWineD3DSurfaceImpl *)surface, cube_targets[j]); texture->baseTexture.sub_resources[idx] = (IWineD3DResourceImpl *)surface; TRACE("Created surface level %u @ %p.\n", i, surface); diff --git a/dll/directx/wine/wined3d/device.c b/dll/directx/wine/wined3d/device.c index 7eb9153fca9..97acd5f9946 100644 --- a/dll/directx/wine/wined3d/device.c +++ b/dll/directx/wine/wined3d/device.c @@ -146,17 +146,17 @@ static WINED3DPRIMITIVETYPE d3d_primitive_type_from_gl(GLenum primitive_type) static BOOL fixed_get_input(BYTE usage, BYTE usage_idx, unsigned int *regnum) { - if ((usage == WINED3DDECLUSAGE_POSITION || usage == WINED3DDECLUSAGE_POSITIONT) && usage_idx == 0) + if ((usage == WINED3DDECLUSAGE_POSITION || usage == WINED3DDECLUSAGE_POSITIONT) && !usage_idx) *regnum = WINED3D_FFP_POSITION; - else if (usage == WINED3DDECLUSAGE_BLENDWEIGHT && usage_idx == 0) + else if (usage == WINED3DDECLUSAGE_BLENDWEIGHT && !usage_idx) *regnum = WINED3D_FFP_BLENDWEIGHT; - else if (usage == WINED3DDECLUSAGE_BLENDINDICES && usage_idx == 0) + else if (usage == WINED3DDECLUSAGE_BLENDINDICES && !usage_idx) *regnum = WINED3D_FFP_BLENDINDICES; - else if (usage == WINED3DDECLUSAGE_NORMAL && usage_idx == 0) + else if (usage == WINED3DDECLUSAGE_NORMAL && !usage_idx) *regnum = WINED3D_FFP_NORMAL; - else if (usage == WINED3DDECLUSAGE_PSIZE && usage_idx == 0) + else if (usage == WINED3DDECLUSAGE_PSIZE && !usage_idx) *regnum = WINED3D_FFP_PSIZE; - else if (usage == WINED3DDECLUSAGE_COLOR && usage_idx == 0) + else if (usage == WINED3DDECLUSAGE_COLOR && !usage_idx) *regnum = WINED3D_FFP_DIFFUSE; else if (usage == WINED3DDECLUSAGE_COLOR && usage_idx == 1) *regnum = WINED3D_FFP_SPECULAR; @@ -177,7 +177,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, BOOL use_vshader, struct wined3d_stream_info *stream_info, BOOL *fixup) { /* We need to deal with frequency data! */ - IWineD3DVertexDeclarationImpl *declaration = (IWineD3DVertexDeclarationImpl *)This->stateBlock->vertexDecl; + IWineD3DVertexDeclarationImpl *declaration = This->stateBlock->state.vertex_declaration; unsigned int i; stream_info->use_map = 0; @@ -191,6 +191,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, for (i = 0; i < declaration->element_count; ++i) { const struct wined3d_vertex_declaration_element *element = &declaration->elements[i]; + struct wined3d_buffer *buffer = This->stateBlock->state.streams[element->input_slot].buffer; GLuint buffer_object = 0; const BYTE *data = NULL; BOOL stride_used; @@ -200,33 +201,32 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, TRACE("%p Element %p (%u of %u)\n", declaration->elements, element, i + 1, declaration->element_count); - if (!This->stateBlock->streamSource[element->input_slot]) continue; + if (!buffer) continue; - stride = This->stateBlock->streamStride[element->input_slot]; - if (This->stateBlock->streamIsUP) + stride = This->stateBlock->state.streams[element->input_slot].stride; + if (This->stateBlock->state.user_stream) { - TRACE("Stream %u is UP, %p\n", element->input_slot, This->stateBlock->streamSource[element->input_slot]); + TRACE("Stream %u is UP, %p\n", element->input_slot, buffer); buffer_object = 0; - data = (BYTE *)This->stateBlock->streamSource[element->input_slot]; + data = (BYTE *)buffer; } else { - TRACE("Stream %u isn't UP, %p\n", element->input_slot, This->stateBlock->streamSource[element->input_slot]); - data = buffer_get_memory(This->stateBlock->streamSource[element->input_slot], - &This->adapter->gl_info, &buffer_object); + TRACE("Stream %u isn't UP, %p\n", element->input_slot, buffer); + data = buffer_get_memory((IWineD3DBuffer *)buffer, &This->adapter->gl_info, &buffer_object); /* Can't use vbo's if the base vertex index is negative. OpenGL doesn't accept negative offsets * (or rather offsets bigger than the vbo, because the pointer is unsigned), so use system memory * sources. In most sane cases the pointer - offset will still be > 0, otherwise it will wrap * around to some big value. Hope that with the indices, the driver wraps it back internally. If * not, drawStridedSlow is needed, including a vertex buffer path. */ - if (This->stateBlock->loadBaseVertexIndex < 0) + if (This->stateBlock->state.load_base_vertex_index < 0) { - WARN("loadBaseVertexIndex is < 0 (%d), not using vbos\n", This->stateBlock->loadBaseVertexIndex); + WARN("load_base_vertex_index is < 0 (%d), not using VBOs.\n", + This->stateBlock->state.load_base_vertex_index); buffer_object = 0; - data = buffer_get_sysmem((struct wined3d_buffer *)This->stateBlock->streamSource[element->input_slot], - &This->adapter->gl_info); - if ((UINT_PTR)data < -This->stateBlock->loadBaseVertexIndex * stride) + data = buffer_get_sysmem(buffer, &This->adapter->gl_info); + if ((UINT_PTR)data < -This->stateBlock->state.load_base_vertex_index * stride) { FIXME("System memory vertex data load offset is negative!\n"); } @@ -260,7 +260,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, /* TODO: Assuming vertexdeclarations are usually used with the * same or a similar shader, it might be worth it to store the * last used output slot and try that one first. */ - stride_used = vshader_get_input(This->stateBlock->vertexShader, + stride_used = vshader_get_input(This->stateBlock->state.vertex_shader, element->usage, element->usage_idx, &idx); } else @@ -274,7 +274,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, if (!element->ffp_valid) { WARN("Skipping unsupported fixed function element of format %s and usage %s\n", - debug_d3dformat(element->format_desc->format), debug_d3ddeclusage(element->usage)); + debug_d3dformat(element->format->id), debug_d3ddeclusage(element->usage)); stride_used = FALSE; } else @@ -289,16 +289,16 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, "input_slot %u, offset %u, stride %u, format %s, buffer_object %u]\n", use_vshader ? "shader": "fixed function", idx, debug_d3ddeclusage(element->usage), element->usage_idx, element->input_slot, - element->offset, stride, debug_d3dformat(element->format_desc->format), buffer_object); + element->offset, stride, debug_d3dformat(element->format->id), buffer_object); - stream_info->elements[idx].format_desc = element->format_desc; + stream_info->elements[idx].format = element->format; stream_info->elements[idx].stride = stride; stream_info->elements[idx].data = data; stream_info->elements[idx].stream_idx = element->input_slot; stream_info->elements[idx].buffer_object = buffer_object; if (!This->adapter->gl_info.supported[ARB_VERTEX_ARRAY_BGRA] - && element->format_desc->format == WINED3DFMT_B8G8R8A8_UNORM) + && element->format->id == WINED3DFMT_B8G8R8A8_UNORM) { stream_info->swizzle_map |= 1 << idx; } @@ -307,7 +307,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, } This->num_buffer_queries = 0; - if (!This->stateBlock->streamIsUP) + if (!This->stateBlock->state.user_stream) { WORD map = stream_info->use_map; @@ -316,12 +316,11 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, { struct wined3d_stream_info_element *element; struct wined3d_buffer *buffer; - struct wined3d_event_query *query; if (!(map & 1)) continue; element = &stream_info->elements[i]; - buffer = (struct wined3d_buffer *)This->stateBlock->streamSource[element->stream_idx]; + buffer = This->stateBlock->state.streams[element->stream_idx].buffer; IWineD3DBuffer_PreLoad((IWineD3DBuffer *)buffer); /* If PreLoad dropped the buffer object, update the stream info. */ @@ -331,11 +330,8 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, element->data = buffer_get_sysmem(buffer, &This->adapter->gl_info) + (ptrdiff_t)element->data; } - query = ((struct wined3d_buffer *) buffer)->query; - if(query) - { - This->buffer_queries[This->num_buffer_queries++] = query; - } + if (buffer->query) + This->buffer_queries[This->num_buffer_queries++] = buffer->query; } } } @@ -343,8 +339,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, static void stream_info_element_from_strided(const struct wined3d_gl_info *gl_info, const struct WineDirect3DStridedData *strided, struct wined3d_stream_info_element *e) { - const struct wined3d_format_desc *format_desc = getFormatDescEntry(strided->format, gl_info); - e->format_desc = format_desc; + e->format = wined3d_get_format(gl_info, strided->format); e->stride = strided->dwStride; e->data = strided->lpData; e->stream_idx = 0; @@ -378,10 +373,10 @@ static void device_stream_info_from_strided(const struct wined3d_gl_info *gl_inf for (i = 0; i < sizeof(stream_info->elements) / sizeof(*stream_info->elements); ++i) { - if (!stream_info->elements[i].format_desc) continue; + if (!stream_info->elements[i].format) continue; if (!gl_info->supported[ARB_VERTEX_ARRAY_BGRA] - && stream_info->elements[i].format_desc->format == WINED3DFMT_B8G8R8A8_UNORM) + && stream_info->elements[i].format->id == WINED3DFMT_B8G8R8A8_UNORM) { stream_info->swizzle_map |= 1 << i; } @@ -413,8 +408,7 @@ static void device_trace_strided_stream_info(const struct wined3d_stream_info *s void device_update_stream_info(IWineD3DDeviceImpl *device, const struct wined3d_gl_info *gl_info) { struct wined3d_stream_info *stream_info = &device->strided_streams; - IWineD3DStateBlockImpl *stateblock = device->stateBlock; - BOOL vs = stateblock->vertexShader && device->vs_selected_mode != SHADER_NONE; + const struct wined3d_state *state = &device->stateBlock->state; BOOL fixup = FALSE; if (device->up_strided) @@ -427,12 +421,12 @@ void device_update_stream_info(IWineD3DDeviceImpl *device, const struct wined3d_ else { TRACE("============================= Vertex Declaration =============================\n"); - device_stream_info_from_declaration(device, vs, stream_info, &fixup); + device_stream_info_from_declaration(device, !!state->vertex_shader, stream_info, &fixup); } - if (vs && !stream_info->position_transformed) + if (state->vertex_shader && !stream_info->position_transformed) { - if (((IWineD3DVertexDeclarationImpl *)stateblock->vertexDecl)->half_float_conv_needed && !fixup) + if (state->vertex_declaration->half_float_conv_needed && !fixup) { TRACE("Using drawStridedSlow with vertex shaders for FLOAT16 conversion.\n"); device->useDrawStridedSlow = TRUE; @@ -459,36 +453,36 @@ void device_update_stream_info(IWineD3DDeviceImpl *device, const struct wined3d_ } } -static void device_preload_texture(IWineD3DStateBlockImpl *stateblock, unsigned int idx) +static void device_preload_texture(const struct wined3d_state *state, unsigned int idx) { IWineD3DBaseTextureImpl *texture; enum WINED3DSRGB srgb; - if (!(texture = (IWineD3DBaseTextureImpl *)stateblock->textures[idx])) return; - srgb = stateblock->samplerState[idx][WINED3DSAMP_SRGBTEXTURE] ? SRGB_SRGB : SRGB_RGB; + if (!(texture = state->textures[idx])) return; + srgb = state->sampler_states[idx][WINED3DSAMP_SRGBTEXTURE] ? SRGB_SRGB : SRGB_RGB; texture->baseTexture.internal_preload((IWineD3DBaseTexture *)texture, srgb); } void device_preload_textures(IWineD3DDeviceImpl *device) { - IWineD3DStateBlockImpl *stateblock = device->stateBlock; + const struct wined3d_state *state = &device->stateBlock->state; unsigned int i; - if (use_vs(stateblock)) + if (use_vs(state)) { for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i) { - if (((IWineD3DBaseShaderImpl *)stateblock->vertexShader)->baseShader.reg_maps.sampler_type[i]) - device_preload_texture(stateblock, MAX_FRAGMENT_SAMPLERS + i); + if (state->vertex_shader->baseShader.reg_maps.sampler_type[i]) + device_preload_texture(state, MAX_FRAGMENT_SAMPLERS + i); } } - if (use_ps(stateblock)) + if (use_ps(state)) { for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i) { - if (((IWineD3DBaseShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.sampler_type[i]) - device_preload_texture(stateblock, i); + if (state->pixel_shader->baseShader.reg_maps.sampler_type[i]) + device_preload_texture(state, i); } } else @@ -498,7 +492,7 @@ void device_preload_textures(IWineD3DDeviceImpl *device) for (i = 0; ffu_map; ffu_map >>= 1, ++i) { if (ffu_map & 1) - device_preload_texture(stateblock, i); + device_preload_texture(state, i); } } } @@ -567,16 +561,17 @@ void device_context_remove(IWineD3DDeviceImpl *device, struct wined3d_context *c void device_get_draw_rect(IWineD3DDeviceImpl *device, RECT *rect) { IWineD3DStateBlockImpl *stateblock = device->stateBlock; - WINED3DVIEWPORT *vp = &stateblock->viewport; + WINED3DVIEWPORT *vp = &stateblock->state.viewport; SetRect(rect, vp->X, vp->Y, vp->X + vp->Width, vp->Y + vp->Height); - if (stateblock->renderState[WINED3DRS_SCISSORTESTENABLE]) + if (stateblock->state.render_states[WINED3DRS_SCISSORTESTENABLE]) { - IntersectRect(rect, rect, &stateblock->scissorRect); + IntersectRect(rect, rect, &stateblock->state.scissor_rect); } } +/* Do not call while under the GL lock. */ void device_switch_onscreen_ds(IWineD3DDeviceImpl *device, struct wined3d_context *context, IWineD3DSurfaceImpl *depth_stencil) { @@ -592,23 +587,250 @@ void device_switch_onscreen_ds(IWineD3DDeviceImpl *device, IWineD3DSurface_AddRef((IWineD3DSurface *)device->onscreen_depth_stencil); } +static BOOL is_full_clear(IWineD3DSurfaceImpl *target, const RECT *draw_rect, const RECT *clear_rect) +{ + /* partial draw rect */ + if (draw_rect->left || draw_rect->top + || draw_rect->right < target->currentDesc.Width + || draw_rect->bottom < target->currentDesc.Height) + return FALSE; + + /* partial clear rect */ + if (clear_rect && (clear_rect->left > 0 || clear_rect->top > 0 + || clear_rect->right < target->currentDesc.Width + || clear_rect->bottom < target->currentDesc.Height)) + return FALSE; + + return TRUE; +} + +static void prepare_ds_clear(IWineD3DSurfaceImpl *ds, struct wined3d_context *context, + DWORD location, const RECT *draw_rect, UINT rect_count, const RECT *clear_rect) +{ + RECT current_rect, r; + + if (ds->Flags & location) + SetRect(¤t_rect, 0, 0, + ds->ds_current_size.cx, + ds->ds_current_size.cy); + else + SetRectEmpty(¤t_rect); + + IntersectRect(&r, draw_rect, ¤t_rect); + if (EqualRect(&r, draw_rect)) + { + /* current_rect 竓 draw_rect, modify only. */ + surface_modify_ds_location(ds, location, ds->ds_current_size.cx, ds->ds_current_size.cy); + return; + } + + if (EqualRect(&r, ¤t_rect)) + { + /* draw_rect 竓 current_rect, test if we're doing a full clear. */ + + if (!clear_rect) + { + /* Full clear, modify only. */ + surface_modify_ds_location(ds, location, draw_rect->right, draw_rect->bottom); + return; + } + + IntersectRect(&r, draw_rect, clear_rect); + if (EqualRect(&r, draw_rect)) + { + /* clear_rect 竓 draw_rect, modify only. */ + surface_modify_ds_location(ds, location, draw_rect->right, draw_rect->bottom); + return; + } + } + + /* Full load. */ + surface_load_ds_location(ds, context, location); + surface_modify_ds_location(ds, location, ds->ds_current_size.cx, ds->ds_current_size.cy); +} + +/* Do not call while under the GL lock. */ +HRESULT device_clear_render_targets(IWineD3DDeviceImpl *device, UINT rt_count, IWineD3DSurfaceImpl **rts, + UINT rect_count, const RECT *rects, const RECT *draw_rect, DWORD flags, + const WINED3DCOLORVALUE *color, float depth, DWORD stencil) +{ + const RECT *clear_rect = (rect_count > 0 && rects) ? (const RECT *)rects : NULL; + IWineD3DSurfaceImpl *depth_stencil = device->depth_stencil; + IWineD3DSurfaceImpl *target = rts[0]; + UINT drawable_width, drawable_height; + struct wined3d_context *context; + GLbitfield clear_mask = 0; + unsigned int i; + + /* When we're clearing parts of the drawable, make sure that the target surface is well up to date in the + * drawable. After the clear we'll mark the drawable up to date, so we have to make sure that this is true + * for the cleared parts, and the untouched parts. + * + * If we're clearing the whole target there is no need to copy it into the drawable, it will be overwritten + * anyway. If we're not clearing the color buffer we don't have to copy either since we're not going to set + * the drawable up to date. We have to check all settings that limit the clear area though. Do not bother + * checking all this if the dest surface is in the drawable anyway. */ + if (flags & WINED3DCLEAR_TARGET && !is_full_clear(target, draw_rect, clear_rect)) + { + for (i = 0; i < rt_count; ++i) + { + if (rts[i]) surface_load_location(rts[i], SFLAG_INDRAWABLE, NULL); + } + } + + context = context_acquire(device, target); + if (!context->valid) + { + context_release(context); + WARN("Invalid context, skipping clear.\n"); + return WINED3D_OK; + } + + context_apply_clear_state(context, device, rt_count, rts, depth_stencil); + + target->get_drawable_size(context, &drawable_width, &drawable_height); + + ENTER_GL(); + + /* Only set the values up once, as they are not changing. */ + if (flags & WINED3DCLEAR_STENCIL) + { + if (context->gl_info->supported[EXT_STENCIL_TWO_SIDE]) + { + glDisable(GL_STENCIL_TEST_TWO_SIDE_EXT); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_TWOSIDEDSTENCILMODE)); + } + glStencilMask(~0U); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_STENCILWRITEMASK)); + glClearStencil(stencil); + checkGLcall("glClearStencil"); + clear_mask = clear_mask | GL_STENCIL_BUFFER_BIT; + } + + if (flags & WINED3DCLEAR_ZBUFFER) + { + DWORD location = context->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN; + + if (location == SFLAG_DS_ONSCREEN && depth_stencil != device->onscreen_depth_stencil) + { + LEAVE_GL(); + device_switch_onscreen_ds(device, context, depth_stencil); + ENTER_GL(); + } + prepare_ds_clear(depth_stencil, context, location, draw_rect, rect_count, clear_rect); + surface_modify_location(depth_stencil, SFLAG_INDRAWABLE, TRUE); + + glDepthMask(GL_TRUE); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_ZWRITEENABLE)); + glClearDepth(depth); + checkGLcall("glClearDepth"); + clear_mask = clear_mask | GL_DEPTH_BUFFER_BIT; + } + + if (flags & WINED3DCLEAR_TARGET) + { + for (i = 0; i < rt_count; ++i) + { + if (rts[i]) surface_modify_location(rts[i], SFLAG_INDRAWABLE, TRUE); + } + + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE)); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1)); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2)); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3)); + glClearColor(color->r, color->g, color->b, color->a); + checkGLcall("glClearColor"); + clear_mask = clear_mask | GL_COLOR_BUFFER_BIT; + } + + if (!clear_rect) + { + if (context->render_offscreen) + { + glScissor(draw_rect->left, draw_rect->top, + draw_rect->right - draw_rect->left, draw_rect->bottom - draw_rect->top); + } + else + { + glScissor(draw_rect->left, drawable_height - draw_rect->bottom, + draw_rect->right - draw_rect->left, draw_rect->bottom - draw_rect->top); + } + checkGLcall("glScissor"); + glClear(clear_mask); + checkGLcall("glClear"); + } + else + { + RECT current_rect; + + /* Now process each rect in turn. */ + for (i = 0; i < rect_count; ++i) + { + /* Note that GL uses lower left, width/height. */ + IntersectRect(¤t_rect, draw_rect, &clear_rect[i]); + + TRACE("clear_rect[%u] %s, current_rect %s.\n", i, + wine_dbgstr_rect(&clear_rect[i]), + wine_dbgstr_rect(¤t_rect)); + + /* Tests show that rectangles where x1 > x2 or y1 > y2 are ignored silently. + * The rectangle is not cleared, no error is returned, but further rectanlges are + * still cleared if they are valid. */ + if (current_rect.left > current_rect.right || current_rect.top > current_rect.bottom) + { + TRACE("Rectangle with negative dimensions, ignoring.\n"); + continue; + } + + if (context->render_offscreen) + { + glScissor(current_rect.left, current_rect.top, + current_rect.right - current_rect.left, current_rect.bottom - current_rect.top); + } + else + { + glScissor(current_rect.left, drawable_height - current_rect.bottom, + current_rect.right - current_rect.left, current_rect.bottom - current_rect.top); + } + checkGLcall("glScissor"); + + glClear(clear_mask); + checkGLcall("glClear"); + } + } + + LEAVE_GL(); + + if (wined3d_settings.strict_draw_ordering || (target->container.type == WINED3D_CONTAINER_SWAPCHAIN + && target->container.u.swapchain->front_buffer == target)) + wglFlush(); /* Flush to ensure ordering across contexts. */ + + context_release(context); + + return WINED3D_OK; +} + + /********************************************************** * IUnknown parts follows **********************************************************/ -static HRESULT WINAPI IWineD3DDeviceImpl_QueryInterface(IWineD3DDevice *iface,REFIID riid,LPVOID *ppobj) +static HRESULT WINAPI IWineD3DDeviceImpl_QueryInterface(IWineD3DDevice *iface, REFIID riid, void **object) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppobj); - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IWineD3DBase) - || IsEqualGUID(riid, &IID_IWineD3DDevice)) { + if (IsEqualGUID(riid, &IID_IWineD3DDevice) + || IsEqualGUID(riid, &IID_IUnknown)) + { IUnknown_AddRef(iface); - *ppobj = This; + *object = iface; return S_OK; } - *ppobj = NULL; + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; return E_NOINTERFACE; } @@ -664,18 +886,8 @@ static ULONG WINAPI IWineD3DDeviceImpl_Release(IWineD3DDevice *iface) { return refCount; } -/********************************************************** - * IWineD3DDevice implementation follows - **********************************************************/ -static HRESULT WINAPI IWineD3DDeviceImpl_GetParent(IWineD3DDevice *iface, IUnknown **pParent) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - *pParent = This->parent; - IUnknown_AddRef(This->parent); - return WINED3D_OK; -} - static HRESULT WINAPI IWineD3DDeviceImpl_CreateBuffer(IWineD3DDevice *iface, struct wined3d_buffer_desc *desc, - const void *data, IUnknown *parent, const struct wined3d_parent_ops *parent_ops, IWineD3DBuffer **buffer) + const void *data, void *parent, const struct wined3d_parent_ops *parent_ops, IWineD3DBuffer **buffer) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; struct wined3d_buffer *object; @@ -710,8 +922,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateBuffer(IWineD3DDevice *iface, str } static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *iface, - UINT Size, DWORD Usage, WINED3DPOOL Pool, IWineD3DBuffer **ppVertexBuffer, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + UINT Size, DWORD Usage, WINED3DPOOL Pool, void *parent, + const struct wined3d_parent_ops *parent_ops, IWineD3DBuffer **ppVertexBuffer) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; struct wined3d_buffer *object; @@ -754,8 +966,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *ifac } static HRESULT WINAPI IWineD3DDeviceImpl_CreateIndexBuffer(IWineD3DDevice *iface, - UINT Length, DWORD Usage, WINED3DPOOL Pool, IWineD3DBuffer **ppIndexBuffer, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + UINT Length, DWORD Usage, WINED3DPOOL Pool, void *parent, + const struct wined3d_parent_ops *parent_ops, IWineD3DBuffer **ppIndexBuffer) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; struct wined3d_buffer *object; @@ -790,7 +1002,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateIndexBuffer(IWineD3DDevice *iface } static HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice *iface, - WINED3DSTATEBLOCKTYPE type, IWineD3DStateBlock **stateblock, IUnknown *parent) + WINED3DSTATEBLOCKTYPE type, IWineD3DStateBlock **stateblock) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DStateBlockImpl *object; @@ -818,9 +1030,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice *iface, } static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UINT Width, UINT Height, - WINED3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IWineD3DSurface **ppSurface, - DWORD Usage, WINED3DPOOL Pool, WINED3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, - WINED3DSURFTYPE Impl, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + enum wined3d_format_id Format, BOOL Lockable, BOOL Discard, UINT Level, DWORD Usage, WINED3DPOOL Pool, + WINED3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, WINED3DSURFTYPE Impl, + void *parent, const struct wined3d_parent_ops *parent_ops, IWineD3DSurface **surface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DSurfaceImpl *object; @@ -829,7 +1041,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UI TRACE("iface %p, width %u, height %u, format %s (%#x), lockable %#x, discard %#x, level %u\n", iface, Width, Height, debug_d3dformat(Format), Format, Lockable, Discard, Level); TRACE("surface %p, usage %s (%#x), pool %s (%#x), multisample_type %#x, multisample_quality %u\n", - ppSurface, debug_d3dusage(Usage), Usage, debug_d3dpool(Pool), Pool, MultiSample, MultisampleQuality); + surface, debug_d3dusage(Usage), Usage, debug_d3dpool(Pool), Pool, MultiSample, MultisampleQuality); TRACE("surface_type %#x, parent %p, parent_ops %p.\n", Impl, parent, parent_ops); if (Impl == SURFACE_OPENGL && !This->adapter) @@ -856,13 +1068,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UI TRACE("(%p) : Created surface %p\n", This, object); - *ppSurface = (IWineD3DSurface *)object; + *surface = (IWineD3DSurface *)object; return hr; } static HRESULT WINAPI IWineD3DDeviceImpl_CreateRendertargetView(IWineD3DDevice *iface, - IWineD3DResource *resource, IUnknown *parent, IWineD3DRendertargetView **rendertarget_view) + IWineD3DResource *resource, void *parent, IWineD3DRendertargetView **rendertarget_view) { struct wined3d_rendertarget_view *object; @@ -885,8 +1097,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateRendertargetView(IWineD3DDevice * } static HRESULT WINAPI IWineD3DDeviceImpl_CreateTexture(IWineD3DDevice *iface, - UINT Width, UINT Height, UINT Levels, DWORD Usage, WINED3DFORMAT Format, WINED3DPOOL Pool, - IWineD3DTexture **ppTexture, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + UINT Width, UINT Height, UINT Levels, DWORD Usage, enum wined3d_format_id Format, WINED3DPOOL Pool, + void *parent, const struct wined3d_parent_ops *parent_ops, IWineD3DTexture **ppTexture) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DTextureImpl *object; @@ -921,8 +1133,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateTexture(IWineD3DDevice *iface, } static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolumeTexture(IWineD3DDevice *iface, - UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, WINED3DFORMAT Format, WINED3DPOOL Pool, - IWineD3DVolumeTexture **ppVolumeTexture, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, enum wined3d_format_id Format, WINED3DPOOL Pool, + void *parent, const struct wined3d_parent_ops *parent_ops, IWineD3DVolumeTexture **ppVolumeTexture) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DVolumeTextureImpl *object; @@ -955,8 +1167,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolumeTexture(IWineD3DDevice *ifa } static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface, UINT Width, UINT Height, - UINT Depth, DWORD Usage, WINED3DFORMAT Format, WINED3DPOOL Pool, IWineD3DVolume **ppVolume, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + UINT Depth, DWORD Usage, enum wined3d_format_id Format, WINED3DPOOL Pool, void *parent, + const struct wined3d_parent_ops *parent_ops, IWineD3DVolume **ppVolume) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DVolumeImpl *object; @@ -988,8 +1200,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface, UIN } static HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface, UINT EdgeLength, UINT Levels, - DWORD Usage, WINED3DFORMAT Format, WINED3DPOOL Pool, IWineD3DCubeTexture **ppCubeTexture, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + DWORD Usage, enum wined3d_format_id Format, WINED3DPOOL Pool, void *parent, + const struct wined3d_parent_ops *parent_ops, IWineD3DCubeTexture **ppCubeTexture) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DCubeTextureImpl *object; /** NOTE: impl ref allowed since this is a create function **/ @@ -1019,13 +1231,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface } static HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface, - WINED3DQUERYTYPE type, IWineD3DQuery **query, IUnknown *parent) + WINED3DQUERYTYPE type, IWineD3DQuery **query) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DQueryImpl *object; HRESULT hr; - TRACE("iface %p, type %#x, query %p, parent %p.\n", iface, type, query, parent); + TRACE("iface %p, type %#x, query %p.\n", iface, type, query); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); if (!object) @@ -1034,7 +1246,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface, return E_OUTOFMEMORY; } - hr = query_init(object, This, type, parent); + hr = query_init(object, This, type); if (FAILED(hr)) { WARN("Failed to initialize query, hr %#x.\n", hr); @@ -1048,9 +1260,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface, return WINED3D_OK; } +/* Do not call while under the GL lock. */ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSwapChain(IWineD3DDevice *iface, - WINED3DPRESENT_PARAMETERS *present_parameters, IWineD3DSwapChain **swapchain, - IUnknown *parent, WINED3DSURFTYPE surface_type) + WINED3DPRESENT_PARAMETERS *present_parameters, WINED3DSURFTYPE surface_type, + void *parent, IWineD3DSwapChain **swapchain) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DSwapChainImpl *object; @@ -1105,8 +1318,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetSwapChain(IWineD3DDevice *iface, U } static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclaration(IWineD3DDevice *iface, - IWineD3DVertexDeclaration **declaration, IUnknown *parent, const struct wined3d_parent_ops *parent_ops, - const WINED3DVERTEXELEMENT *elements, UINT element_count) + const WINED3DVERTEXELEMENT *elements, UINT element_count, void *parent, + const struct wined3d_parent_ops *parent_ops, IWineD3DVertexDeclaration **declaration) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DVertexDeclarationImpl *object = NULL; @@ -1145,14 +1358,14 @@ struct wined3d_fvf_convert_state }; static void append_decl_element(struct wined3d_fvf_convert_state *state, - WINED3DFORMAT format, WINED3DDECLUSAGE usage, UINT usage_idx) + enum wined3d_format_id format_id, WINED3DDECLUSAGE usage, UINT usage_idx) { WINED3DVERTEXELEMENT *elements = state->elements; - const struct wined3d_format_desc *format_desc; + const struct wined3d_format *format; UINT offset = state->offset; UINT idx = state->idx; - elements[idx].format = format; + elements[idx].format = format_id; elements[idx].input_slot = 0; elements[idx].offset = offset; elements[idx].output_slot = 0; @@ -1160,8 +1373,8 @@ static void append_decl_element(struct wined3d_fvf_convert_state *state, elements[idx].usage = usage; elements[idx].usage_idx = usage_idx; - format_desc = getFormatDescEntry(format, state->gl_info); - state->offset += format_desc->component_count * format_desc->component_size; + format = wined3d_get_format(state->gl_info, format_id); + state->offset += format->component_count * format->component_size; ++state->idx; } @@ -1169,16 +1382,16 @@ static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the DWORD fvf, WINED3DVERTEXELEMENT **ppVertexElements) { const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; - BOOL has_pos = (fvf & WINED3DFVF_POSITION_MASK) != 0; + BOOL has_pos = !!(fvf & WINED3DFVF_POSITION_MASK); BOOL has_blend = (fvf & WINED3DFVF_XYZB5) > WINED3DFVF_XYZRHW; BOOL has_blend_idx = has_blend && (((fvf & WINED3DFVF_XYZB5) == WINED3DFVF_XYZB5) || (fvf & WINED3DFVF_LASTBETA_D3DCOLOR) || (fvf & WINED3DFVF_LASTBETA_UBYTE4)); - BOOL has_normal = (fvf & WINED3DFVF_NORMAL) != 0; - BOOL has_psize = (fvf & WINED3DFVF_PSIZE) != 0; - BOOL has_diffuse = (fvf & WINED3DFVF_DIFFUSE) != 0; - BOOL has_specular = (fvf & WINED3DFVF_SPECULAR) !=0; + BOOL has_normal = !!(fvf & WINED3DFVF_NORMAL); + BOOL has_psize = !!(fvf & WINED3DFVF_PSIZE); + BOOL has_diffuse = !!(fvf & WINED3DFVF_DIFFUSE); + BOOL has_specular = !!(fvf & WINED3DFVF_SPECULAR); DWORD num_textures = (fvf & WINED3DFVF_TEXCOUNT_MASK) >> WINED3DFVF_TEXCOUNT_SHIFT; DWORD texcoords = (fvf & 0xFFFF0000) >> 16; @@ -1274,8 +1487,8 @@ static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the } static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclarationFromFVF(IWineD3DDevice *iface, - IWineD3DVertexDeclaration **declaration, IUnknown *parent, - const struct wined3d_parent_ops *parent_ops, DWORD fvf) + DWORD fvf, void *parent, const struct wined3d_parent_ops *parent_ops, + IWineD3DVertexDeclaration **declaration) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; WINED3DVERTEXELEMENT *elements; @@ -1287,20 +1500,23 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclarationFromFVF(IWineD3D size = ConvertFvfToDeclaration(This, fvf, &elements); if (size == ~0U) return E_OUTOFMEMORY; - hr = IWineD3DDevice_CreateVertexDeclaration(iface, declaration, parent, parent_ops, elements, size); + hr = IWineD3DDeviceImpl_CreateVertexDeclaration(iface, elements, size, parent, parent_ops, declaration); HeapFree(GetProcessHeap(), 0, elements); return hr; } static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexShader(IWineD3DDevice *iface, const DWORD *pFunction, const struct wined3d_shader_signature *output_signature, - IWineD3DVertexShader **ppVertexShader, IUnknown *parent, - const struct wined3d_parent_ops *parent_ops) + void *parent, const struct wined3d_parent_ops *parent_ops, + IWineD3DVertexShader **ppVertexShader) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DVertexShaderImpl *object; HRESULT hr; + if (This->vs_selected_mode == SHADER_NONE) + return WINED3DERR_INVALIDCALL; + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); if (!object) { @@ -1324,8 +1540,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexShader(IWineD3DDevice *ifac static HRESULT WINAPI IWineD3DDeviceImpl_CreateGeometryShader(IWineD3DDevice *iface, const DWORD *byte_code, const struct wined3d_shader_signature *output_signature, - IWineD3DGeometryShader **shader, IUnknown *parent, - const struct wined3d_parent_ops *parent_ops) + void *parent, const struct wined3d_parent_ops *parent_ops, + IWineD3DGeometryShader **shader) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; struct wined3d_geometryshader *object; @@ -1354,13 +1570,16 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateGeometryShader(IWineD3DDevice *if static HRESULT WINAPI IWineD3DDeviceImpl_CreatePixelShader(IWineD3DDevice *iface, const DWORD *pFunction, const struct wined3d_shader_signature *output_signature, - IWineD3DPixelShader **ppPixelShader, IUnknown *parent, - const struct wined3d_parent_ops *parent_ops) + void *parent, const struct wined3d_parent_ops *parent_ops, + IWineD3DPixelShader **ppPixelShader) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DPixelShaderImpl *object; HRESULT hr; + if (This->ps_selected_mode == SHADER_NONE) + return WINED3DERR_INVALIDCALL; + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); if (!object) { @@ -1383,14 +1602,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreatePixelShader(IWineD3DDevice *iface } static HRESULT WINAPI IWineD3DDeviceImpl_CreatePalette(IWineD3DDevice *iface, DWORD Flags, - const PALETTEENTRY *PalEnt, IWineD3DPalette **Palette, IUnknown *Parent) + const PALETTEENTRY *PalEnt, void *parent, IWineD3DPalette **Palette) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; IWineD3DPaletteImpl *object; HRESULT hr; TRACE("iface %p, flags %#x, entries %p, palette %p, parent %p.\n", - iface, Flags, PalEnt, Palette, Parent); + iface, Flags, PalEnt, Palette, parent); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); if (!object) @@ -1399,7 +1618,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreatePalette(IWineD3DDevice *iface, DW return E_OUTOFMEMORY; } - hr = wined3d_palette_init(object, This, Flags, PalEnt, Parent); + hr = wined3d_palette_init(object, This, Flags, PalEnt, parent); if (FAILED(hr)) { WARN("Failed to initialize palette, hr %#x.\n", hr); @@ -1439,10 +1658,11 @@ static void IWineD3DDeviceImpl_LoadLogo(IWineD3DDeviceImpl *This, const char *fi } hr = IWineD3DDevice_CreateSurface((IWineD3DDevice *)This, bm.bmWidth, bm.bmHeight, WINED3DFMT_B5G6R5_UNORM, TRUE, - FALSE, 0, &This->logo_surface, 0, WINED3DPOOL_DEFAULT, WINED3DMULTISAMPLE_NONE, 0, SURFACE_OPENGL, - NULL, &wined3d_null_parent_ops); - if(FAILED(hr)) { - ERR("Wine logo requested, but failed to create surface\n"); + FALSE, 0, 0, WINED3DPOOL_DEFAULT, WINED3DMULTISAMPLE_NONE, 0, SURFACE_OPENGL, NULL, + &wined3d_null_parent_ops, &This->logo_surface); + if (FAILED(hr)) + { + ERR("Wine logo requested, but failed to create surface, hr %#x.\n", hr); goto out; } @@ -1455,9 +1675,12 @@ static void IWineD3DDeviceImpl_LoadLogo(IWineD3DDeviceImpl *This, const char *fi colorkey.dwColorSpaceLowValue = 0; colorkey.dwColorSpaceHighValue = 0; IWineD3DSurface_SetColorKey(This->logo_surface, WINEDDCKEY_SRCBLT, &colorkey); - } else { + } + else + { + const WINED3DCOLORVALUE c = {1.0f, 1.0f, 1.0f, 1.0f}; /* Fill the surface with a white color to show that wined3d is there */ - IWineD3DDevice_ColorFill((IWineD3DDevice *) This, This->logo_surface, NULL, 0xffffffff); + IWineD3DDevice_ColorFill((IWineD3DDevice *)This, This->logo_surface, NULL, &c); } out: @@ -1568,12 +1791,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, if(!This->adapter->opengl) return WINED3DERR_INVALIDCALL; TRACE("(%p) : Creating stateblock\n", This); - /* Creating the startup stateBlock - Note Special Case: 0 => Don't fill in yet! */ - hr = IWineD3DDevice_CreateStateBlock(iface, - WINED3DSBT_INIT, - (IWineD3DStateBlock **)&This->stateBlock, - NULL); - if (WINED3D_OK != hr) { /* Note: No parent needed for initial internal stateblock */ + hr = IWineD3DDevice_CreateStateBlock(iface, WINED3DSBT_INIT, (IWineD3DStateBlock **)&This->stateBlock); + if (FAILED(hr)) + { WARN("Failed to create stateblock\n"); goto err_out; } @@ -1583,12 +1803,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, This->render_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->render_targets) * gl_info->limits.buffers); - This->draw_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof(GLenum) * gl_info->limits.buffers); This->NumberOfPalettes = 1; This->palettes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PALETTEENTRY*)); - if(!This->palettes || !This->render_targets || !This->draw_buffers) { + if (!This->palettes || !This->render_targets) + { ERR("Out of memory!\n"); hr = E_OUTOFMEMORY; goto err_out; @@ -1674,7 +1893,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, /* Set up some starting GL setup */ /* Setup all the devices defaults */ - IWineD3DStateBlock_InitStartupStateBlock((IWineD3DStateBlock *)This->stateBlock); + stateblock_init_default_state(This->stateBlock); context = context_acquire(This, swapchain->front_buffer); @@ -1727,7 +1946,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, err_out: HeapFree(GetProcessHeap(), 0, This->render_targets); - HeapFree(GetProcessHeap(), 0, This->draw_buffers); HeapFree(GetProcessHeap(), 0, This->swapchains); This->NumberOfSwapChains = 0; if(This->palettes) { @@ -1889,13 +2107,19 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, This->onscreen_depth_stencil = NULL; } - TRACE("Releasing the depth stencil buffer at %p\n", This->depth_stencil); - if (This->depth_stencil && IWineD3DSurface_Release((IWineD3DSurface *)This->depth_stencil)) + if (This->depth_stencil) { - if (This->auto_depth_stencil != This->depth_stencil) - FIXME("(%p) Something is still holding the depth/stencil buffer.\n",This); + IWineD3DSurfaceImpl *ds = This->depth_stencil; + + TRACE("Releasing depth/stencil buffer %p.\n", ds); + + This->depth_stencil = NULL; + if (IWineD3DSurface_Release((IWineD3DSurface *)ds) + && ds != This->auto_depth_stencil) + { + ERR("Something is still holding a reference to depth/stencil buffer %p.\n", ds); + } } - This->depth_stencil = NULL; TRACE("Releasing the render target at %p\n", This->render_targets[0]); IWineD3DSurface_Release((IWineD3DSurface *)This->render_targets[0]); @@ -1931,9 +2155,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, This->NumberOfPalettes = 0; HeapFree(GetProcessHeap(), 0, This->render_targets); - HeapFree(GetProcessHeap(), 0, This->draw_buffers); This->render_targets = NULL; - This->draw_buffers = NULL; This->d3d_initialized = FALSE; @@ -1974,7 +2196,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetDisplayMode(IWineD3DDevice *iface, U const WINED3DDISPLAYMODE* pMode) { DEVMODEW devmode; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - const struct wined3d_format_desc *format_desc = getFormatDescEntry(pMode->Format, &This->adapter->gl_info); + const struct wined3d_format *format = wined3d_get_format(&This->adapter->gl_info, pMode->Format); LONG ret; RECT clip_rc; @@ -1989,26 +2211,24 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetDisplayMode(IWineD3DDevice *iface, U memset(&devmode, 0, sizeof(devmode)); devmode.dmSize = sizeof(devmode); devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; - devmode.dmBitsPerPel = format_desc->byte_count * 8; + devmode.dmBitsPerPel = format->byte_count * CHAR_BIT; devmode.dmPelsWidth = pMode->Width; devmode.dmPelsHeight = pMode->Height; devmode.dmDisplayFrequency = pMode->RefreshRate; - if (pMode->RefreshRate != 0) { + if (pMode->RefreshRate) devmode.dmFields |= DM_DISPLAYFREQUENCY; - } /* Only change the mode if necessary */ - if( (This->ddraw_width == pMode->Width) && - (This->ddraw_height == pMode->Height) && - (This->ddraw_format == pMode->Format) && - (pMode->RefreshRate == 0) ) { + if (This->ddraw_width == pMode->Width && This->ddraw_height == pMode->Height + && This->ddraw_format == pMode->Format && !pMode->RefreshRate) return WINED3D_OK; - } ret = ChangeDisplaySettingsExW(NULL, &devmode, NULL, CDS_FULLSCREEN, NULL); - if (ret != DISP_CHANGE_SUCCESSFUL) { - if(devmode.dmDisplayFrequency != 0) { + if (ret != DISP_CHANGE_SUCCESSFUL) + { + if (devmode.dmDisplayFrequency) + { WARN("ChangeDisplaySettingsExW failed, trying without the refresh rate\n"); devmode.dmFields &= ~DM_DISPLAYFREQUENCY; devmode.dmDisplayFrequency = 0; @@ -2056,8 +2276,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetStreamSource(IWineD3DDevice *iface, IWineD3DBuffer *pStreamData, UINT OffsetInBytes, UINT Stride) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + struct wined3d_stream_state *stream; IWineD3DBuffer *oldSrc; + TRACE("iface %p, stream_idx %u, buffer %p, offset %u, stride %u.\n", + iface, StreamNumber, pStreamData, OffsetInBytes, Stride); + if (StreamNumber >= MAX_STREAMS) { WARN("Stream out of range %d\n", StreamNumber); return WINED3DERR_INVALIDCALL; @@ -2066,22 +2290,24 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetStreamSource(IWineD3DDevice *iface, return WINED3DERR_INVALIDCALL; } - oldSrc = This->updateStateBlock->streamSource[StreamNumber]; - TRACE("(%p) : StreamNo: %u, OldStream (%p), NewStream (%p), OffsetInBytes %u, NewStride %u\n", This, StreamNumber, oldSrc, pStreamData, OffsetInBytes, Stride); + stream = &This->updateStateBlock->state.streams[StreamNumber]; + oldSrc = (IWineD3DBuffer *)stream->buffer; This->updateStateBlock->changed.streamSource |= 1 << StreamNumber; - if(oldSrc == pStreamData && - This->updateStateBlock->streamStride[StreamNumber] == Stride && - This->updateStateBlock->streamOffset[StreamNumber] == OffsetInBytes) { + if (oldSrc == pStreamData + && stream->stride == Stride + && stream->offset == OffsetInBytes) + { TRACE("Application is setting the old values over, nothing to do\n"); return WINED3D_OK; } - This->updateStateBlock->streamSource[StreamNumber] = pStreamData; - if (pStreamData) { - This->updateStateBlock->streamStride[StreamNumber] = Stride; - This->updateStateBlock->streamOffset[StreamNumber] = OffsetInBytes; + stream->buffer = (struct wined3d_buffer *)pStreamData; + if (pStreamData) + { + stream->stride = Stride; + stream->offset = OffsetInBytes; } /* Handle recording of state blocks */ @@ -2092,11 +2318,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetStreamSource(IWineD3DDevice *iface, return WINED3D_OK; } - if (pStreamData != NULL) { + if (pStreamData) + { InterlockedIncrement(&((struct wined3d_buffer *)pStreamData)->bind_count); IWineD3DBuffer_AddRef(pStreamData); } - if (oldSrc != NULL) { + if (oldSrc) + { InterlockedDecrement(&((struct wined3d_buffer *)oldSrc)->bind_count); IWineD3DBuffer_Release(oldSrc); } @@ -2110,68 +2338,76 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetStreamSource(IWineD3DDevice *iface, UINT StreamNumber, IWineD3DBuffer **pStream, UINT *pOffset, UINT *pStride) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + struct wined3d_stream_state *stream; - TRACE("(%p) : StreamNo: %u, Stream (%p), Offset %u, Stride %u\n", This, StreamNumber, - This->stateBlock->streamSource[StreamNumber], - This->stateBlock->streamOffset[StreamNumber], - This->stateBlock->streamStride[StreamNumber]); + TRACE("iface %p, stream_idx %u, buffer %p, offset %p, stride %p.\n", + iface, StreamNumber, pStream, pOffset, pStride); - if (StreamNumber >= MAX_STREAMS) { + if (StreamNumber >= MAX_STREAMS) + { WARN("Stream out of range %d\n", StreamNumber); return WINED3DERR_INVALIDCALL; } - *pStream = This->stateBlock->streamSource[StreamNumber]; - *pStride = This->stateBlock->streamStride[StreamNumber]; - if (pOffset) { - *pOffset = This->stateBlock->streamOffset[StreamNumber]; - } - if (*pStream != NULL) { - IWineD3DBuffer_AddRef(*pStream); /* We have created a new reference to the VB */ - } + stream = &This->stateBlock->state.streams[StreamNumber]; + *pStream = (IWineD3DBuffer *)stream->buffer; + *pStride = stream->stride; + if (pOffset) *pOffset = stream->offset; + + if (*pStream) IWineD3DBuffer_AddRef(*pStream); + return WINED3D_OK; } static HRESULT WINAPI IWineD3DDeviceImpl_SetStreamSourceFreq(IWineD3DDevice *iface, UINT StreamNumber, UINT Divider) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - UINT oldFlags = This->updateStateBlock->streamFlags[StreamNumber]; - UINT oldFreq = This->updateStateBlock->streamFreq[StreamNumber]; + struct wined3d_stream_state *stream; + UINT oldFlags, oldFreq; - /* Verify input at least in d3d9 this is invalid*/ - if( (Divider & WINED3DSTREAMSOURCE_INSTANCEDATA) && (Divider & WINED3DSTREAMSOURCE_INDEXEDDATA)){ + TRACE("iface %p, stream_idx %u, divider %#x.\n", iface, StreamNumber, Divider); + + /* Verify input at least in d3d9 this is invalid. */ + if ((Divider & WINED3DSTREAMSOURCE_INSTANCEDATA) && (Divider & WINED3DSTREAMSOURCE_INDEXEDDATA)) + { WARN("INSTANCEDATA and INDEXEDDATA were set, returning D3DERR_INVALIDCALL\n"); return WINED3DERR_INVALIDCALL; } - if( (Divider & WINED3DSTREAMSOURCE_INSTANCEDATA) && StreamNumber == 0 ){ + if ((Divider & WINED3DSTREAMSOURCE_INSTANCEDATA) && !StreamNumber) + { WARN("INSTANCEDATA used on stream 0, returning D3DERR_INVALIDCALL\n"); return WINED3DERR_INVALIDCALL; } - if( Divider == 0 ){ + if (!Divider) + { WARN("Divider is 0, returning D3DERR_INVALIDCALL\n"); return WINED3DERR_INVALIDCALL; } - TRACE("(%p) StreamNumber(%d), Divider(%d)\n", This, StreamNumber, Divider); - This->updateStateBlock->streamFlags[StreamNumber] = Divider & (WINED3DSTREAMSOURCE_INSTANCEDATA | WINED3DSTREAMSOURCE_INDEXEDDATA ); + stream = &This->updateStateBlock->state.streams[StreamNumber]; + oldFlags = stream->flags; + oldFreq = stream->frequency; + + stream->flags = Divider & (WINED3DSTREAMSOURCE_INSTANCEDATA | WINED3DSTREAMSOURCE_INDEXEDDATA); + stream->frequency = Divider & 0x7FFFFF; This->updateStateBlock->changed.streamFreq |= 1 << StreamNumber; - This->updateStateBlock->streamFreq[StreamNumber] = Divider & 0x7FFFFF; - if(This->updateStateBlock->streamFreq[StreamNumber] != oldFreq || - This->updateStateBlock->streamFlags[StreamNumber] != oldFlags) { + if (stream->frequency != oldFreq || stream->flags != oldFlags) IWineD3DDeviceImpl_MarkStateDirty(This, STATE_STREAMSRC); - } return WINED3D_OK; } static HRESULT WINAPI IWineD3DDeviceImpl_GetStreamSourceFreq(IWineD3DDevice *iface, UINT StreamNumber, UINT* Divider) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + struct wined3d_stream_state *stream; - TRACE("(%p) StreamNumber(%d), Divider(%p)\n", This, StreamNumber, Divider); - *Divider = This->updateStateBlock->streamFreq[StreamNumber] | This->updateStateBlock->streamFlags[StreamNumber]; + TRACE("iface %p, stream_idx %u, divider %p.\n", iface, StreamNumber, Divider); - TRACE("(%p) : returning %d\n", This, *Divider); + stream = &This->updateStateBlock->state.streams[StreamNumber]; + *Divider = stream->flags | stream->frequency; + + TRACE("Returning %#x.\n", *Divider); return WINED3D_OK; } @@ -2189,7 +2425,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTransform(IWineD3DDevice *iface, W if (This->isRecordingState) { TRACE("Recording... not performing anything\n"); This->updateStateBlock->changed.transform[d3dts >> 5] |= 1 << (d3dts & 0x1f); - This->updateStateBlock->transforms[d3dts] = *lpmatrix; + This->updateStateBlock->state.transforms[d3dts] = *lpmatrix; return WINED3D_OK; } @@ -2201,11 +2437,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTransform(IWineD3DDevice *iface, W * * From here on we assume that the new matrix is different, wherever it matters. */ - if (!memcmp(&This->stateBlock->transforms[d3dts].u.m[0][0], lpmatrix, sizeof(WINED3DMATRIX))) { + if (!memcmp(&This->stateBlock->state.transforms[d3dts].u.m[0][0], lpmatrix, sizeof(*lpmatrix))) + { TRACE("The app is setting the same matrix over again\n"); return WINED3D_OK; - } else { - conv_mat(lpmatrix, &This->stateBlock->transforms[d3dts].u.m[0][0]); + } + else + { + conv_mat(lpmatrix, &This->stateBlock->state.transforms[d3dts].u.m[0][0]); } /* @@ -2222,14 +2461,22 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTransform(IWineD3DDevice *iface, W /* Handled by the state manager */ } - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_TRANSFORM(d3dts)); + if (d3dts < WINED3DTS_WORLDMATRIX(This->adapter->gl_info.limits.blends)) + IWineD3DDeviceImpl_MarkStateDirty(This, STATE_TRANSFORM(d3dts)); + return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_GetTransform(IWineD3DDevice *iface, WINED3DTRANSFORMSTATETYPE State, WINED3DMATRIX* pMatrix) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - TRACE("(%p) : for Transform State %s\n", This, debug_d3dtstype(State)); - *pMatrix = This->stateBlock->transforms[State]; + +static HRESULT WINAPI IWineD3DDeviceImpl_GetTransform(IWineD3DDevice *iface, + WINED3DTRANSFORMSTATETYPE state, WINED3DMATRIX *matrix) +{ + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface; + + TRACE("iface %p, state %s, matrix %p.\n", iface, debug_d3dtstype(state), matrix); + + *matrix = device->stateBlock->state.transforms[state]; + return WINED3D_OK; } @@ -2247,8 +2494,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_MultiplyTransform(IWineD3DDevice *iface if (State <= HIGHEST_TRANSFORMSTATE) { - mat = &This->updateStateBlock->transforms[State]; - } else { + mat = &This->updateStateBlock->state.transforms[State]; + } + else + { FIXME("Unhandled transform state!!\n"); } @@ -2308,7 +2557,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I return WINED3DERR_INVALIDCALL; } - LIST_FOR_EACH(e, &This->updateStateBlock->lightMap[Hi]) + LIST_FOR_EACH(e, &This->updateStateBlock->state.light_map[Hi]) { object = LIST_ENTRY(e, struct wined3d_light_info, entry); if(object->OriginalIndex == Index) break; @@ -2322,7 +2571,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I ERR("Out of memory error when allocating a light\n"); return E_OUTOFMEMORY; } - list_add_head(&This->updateStateBlock->lightMap[Hi], &object->entry); + list_add_head(&This->updateStateBlock->state.light_map[Hi], &object->entry); object->glIndex = -1; object->OriginalIndex = Index; } @@ -2380,7 +2629,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I * however spot lights are rather rarely used in games (if ever used at all). * furthermore if still used, probably nobody pays attention to such details. */ - if (pLight->Falloff == 0) { + if (!pLight->Falloff) + { /* Falloff = 0 is easy, because d3d's and opengl's spot light equations have the * falloff resp. exponent parameter as an exponent, so the spot light lighting * will always be 1.0 for both of them, and we don't have to care for the @@ -2396,7 +2646,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I { object->exponent = 128.0f; } - object->cutoff = pLight->Phi*90/M_PI; + object->cutoff = (float) (pLight->Phi*90/M_PI); /* FIXME: Range */ break; @@ -2420,14 +2670,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetLight(IWineD3DDevice *iface, DWORD I struct list *e; TRACE("(%p) : Idx(%d), pLight(%p)\n", This, Index, pLight); - LIST_FOR_EACH(e, &This->stateBlock->lightMap[Hi]) + LIST_FOR_EACH(e, &This->stateBlock->state.light_map[Hi]) { lightInfo = LIST_ENTRY(e, struct wined3d_light_info, entry); if(lightInfo->OriginalIndex == Index) break; lightInfo = NULL; } - if (lightInfo == NULL) { + if (!lightInfo) + { TRACE("Light information requested but light not defined\n"); return WINED3DERR_INVALIDCALL; } @@ -2448,7 +2699,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLightEnable(IWineD3DDevice *iface, D struct list *e; TRACE("(%p) : Idx(%d), enable? %d\n", This, Index, Enable); - LIST_FOR_EACH(e, &This->updateStateBlock->lightMap[Hi]) + LIST_FOR_EACH(e, &This->updateStateBlock->state.light_map[Hi]) { lightInfo = LIST_ENTRY(e, struct wined3d_light_info, entry); if(lightInfo->OriginalIndex == Index) break; @@ -2457,19 +2708,20 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLightEnable(IWineD3DDevice *iface, D TRACE("Found light: %p\n", lightInfo); /* Special case - enabling an undefined light creates one with a strict set of parms! */ - if (lightInfo == NULL) { - + if (!lightInfo) + { TRACE("Light enabled requested but light not defined, so defining one!\n"); IWineD3DDeviceImpl_SetLight(iface, Index, &WINED3D_default_light); /* Search for it again! Should be fairly quick as near head of list */ - LIST_FOR_EACH(e, &This->updateStateBlock->lightMap[Hi]) + LIST_FOR_EACH(e, &This->updateStateBlock->state.light_map[Hi]) { lightInfo = LIST_ENTRY(e, struct wined3d_light_info, entry); if(lightInfo->OriginalIndex == Index) break; lightInfo = NULL; } - if (lightInfo == NULL) { + if (!lightInfo) + { FIXME("Adding default lights has failed dismally\n"); return WINED3DERR_INVALIDCALL; } @@ -2481,7 +2733,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLightEnable(IWineD3DDevice *iface, D IWineD3DDeviceImpl_MarkStateDirty(This, STATE_ACTIVELIGHT(lightInfo->glIndex)); } - This->updateStateBlock->activeLights[lightInfo->glIndex] = NULL; + This->updateStateBlock->state.lights[lightInfo->glIndex] = NULL; lightInfo->glIndex = -1; } else { TRACE("Light already disabled, nothing to do\n"); @@ -2495,9 +2747,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLightEnable(IWineD3DDevice *iface, D } else { int i; /* Find a free gl light */ - for(i = 0; i < This->maxConcurrentLights; i++) { - if(This->updateStateBlock->activeLights[i] == NULL) { - This->updateStateBlock->activeLights[i] = lightInfo; + for (i = 0; i < This->maxConcurrentLights; ++i) + { + if (!This->updateStateBlock->state.lights[i]) + { + This->updateStateBlock->state.lights[i] = lightInfo; lightInfo->glIndex = i; break; } @@ -2532,14 +2786,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetLightEnable(IWineD3DDevice *iface, D UINT Hi = LIGHTMAP_HASHFUNC(Index); TRACE("(%p) : for idx(%d)\n", This, Index); - LIST_FOR_EACH(e, &This->stateBlock->lightMap[Hi]) + LIST_FOR_EACH(e, &This->stateBlock->state.light_map[Hi]) { lightInfo = LIST_ENTRY(e, struct wined3d_light_info, entry); if(lightInfo->OriginalIndex == Index) break; lightInfo = NULL; } - if (lightInfo == NULL) { + if (!lightInfo) + { TRACE("Light enabled state requested but light not defined\n"); return WINED3DERR_INVALIDCALL; } @@ -2564,18 +2819,19 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetClipPlane(IWineD3DDevice *iface, DWO This->updateStateBlock->changed.clipplane |= 1 << Index; - if(This->updateStateBlock->clipplane[Index][0] == pPlane[0] && - This->updateStateBlock->clipplane[Index][1] == pPlane[1] && - This->updateStateBlock->clipplane[Index][2] == pPlane[2] && - This->updateStateBlock->clipplane[Index][3] == pPlane[3]) { + if (This->updateStateBlock->state.clip_planes[Index][0] == pPlane[0] + && This->updateStateBlock->state.clip_planes[Index][1] == pPlane[1] + && This->updateStateBlock->state.clip_planes[Index][2] == pPlane[2] + && This->updateStateBlock->state.clip_planes[Index][3] == pPlane[3]) + { TRACE("Application is setting old values over, nothing to do\n"); return WINED3D_OK; } - This->updateStateBlock->clipplane[Index][0] = pPlane[0]; - This->updateStateBlock->clipplane[Index][1] = pPlane[1]; - This->updateStateBlock->clipplane[Index][2] = pPlane[2]; - This->updateStateBlock->clipplane[Index][3] = pPlane[3]; + This->updateStateBlock->state.clip_planes[Index][0] = pPlane[0]; + This->updateStateBlock->state.clip_planes[Index][1] = pPlane[1]; + This->updateStateBlock->state.clip_planes[Index][2] = pPlane[2]; + This->updateStateBlock->state.clip_planes[Index][3] = pPlane[3]; /* Handle recording of state blocks */ if (This->isRecordingState) { @@ -2599,10 +2855,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetClipPlane(IWineD3DDevice *iface, DWO return WINED3DERR_INVALIDCALL; } - pPlane[0] = This->stateBlock->clipplane[Index][0]; - pPlane[1] = This->stateBlock->clipplane[Index][1]; - pPlane[2] = This->stateBlock->clipplane[Index][2]; - pPlane[3] = This->stateBlock->clipplane[Index][3]; + pPlane[0] = (float)This->stateBlock->state.clip_planes[Index][0]; + pPlane[1] = (float)This->stateBlock->state.clip_planes[Index][1]; + pPlane[2] = (float)This->stateBlock->state.clip_planes[Index][2]; + pPlane[3] = (float)This->stateBlock->state.clip_planes[Index][3]; return WINED3D_OK; } @@ -2613,22 +2869,24 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetClipPlane(IWineD3DDevice *iface, DWO static HRESULT WINAPI IWineD3DDeviceImpl_SetClipStatus(IWineD3DDevice *iface, CONST WINED3DCLIPSTATUS* pClipStatus) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; FIXME("(%p) : stub\n", This); - if (NULL == pClipStatus) { - return WINED3DERR_INVALIDCALL; - } - This->updateStateBlock->clip_status.ClipUnion = pClipStatus->ClipUnion; - This->updateStateBlock->clip_status.ClipIntersection = pClipStatus->ClipIntersection; + + if (!pClipStatus) + return WINED3DERR_INVALIDCALL; + + This->updateStateBlock->state.clip_status.ClipUnion = pClipStatus->ClipUnion; + This->updateStateBlock->state.clip_status.ClipIntersection = pClipStatus->ClipIntersection; return WINED3D_OK; } static HRESULT WINAPI IWineD3DDeviceImpl_GetClipStatus(IWineD3DDevice *iface, WINED3DCLIPSTATUS* pClipStatus) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; FIXME("(%p) : stub\n", This); - if (NULL == pClipStatus) { - return WINED3DERR_INVALIDCALL; - } - pClipStatus->ClipUnion = This->updateStateBlock->clip_status.ClipUnion; - pClipStatus->ClipIntersection = This->updateStateBlock->clip_status.ClipIntersection; + + if (!pClipStatus) + return WINED3DERR_INVALIDCALL; + + pClipStatus->ClipUnion = This->updateStateBlock->state.clip_status.ClipUnion; + pClipStatus->ClipIntersection = This->updateStateBlock->state.clip_status.ClipIntersection; return WINED3D_OK; } @@ -2639,7 +2897,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetMaterial(IWineD3DDevice *iface, CONS IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; This->updateStateBlock->changed.material = TRUE; - This->updateStateBlock->material = *pMaterial; + This->updateStateBlock->state.material = *pMaterial; /* Handle recording of state blocks */ if (This->isRecordingState) { @@ -2653,7 +2911,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetMaterial(IWineD3DDevice *iface, CONS static HRESULT WINAPI IWineD3DDeviceImpl_GetMaterial(IWineD3DDevice *iface, WINED3DMATERIAL* pMaterial) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - *pMaterial = This->updateStateBlock->material; + *pMaterial = This->updateStateBlock->state.material; TRACE("(%p) : Diffuse (%f,%f,%f,%f)\n", This, pMaterial->Diffuse.r, pMaterial->Diffuse.g, pMaterial->Diffuse.b, pMaterial->Diffuse.a); TRACE("(%p) : Ambient (%f,%f,%f,%f)\n", This, pMaterial->Ambient.r, pMaterial->Ambient.g, @@ -2671,17 +2929,17 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetMaterial(IWineD3DDevice *iface, WINE * Get / Set Indices *****/ static HRESULT WINAPI IWineD3DDeviceImpl_SetIndexBuffer(IWineD3DDevice *iface, - IWineD3DBuffer *pIndexData, WINED3DFORMAT fmt) + IWineD3DBuffer *pIndexData, enum wined3d_format_id fmt) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DBuffer *oldIdxs; TRACE("(%p) : Setting to %p\n", This, pIndexData); - oldIdxs = This->updateStateBlock->pIndexData; + oldIdxs = (IWineD3DBuffer *)This->updateStateBlock->state.index_buffer; This->updateStateBlock->changed.indices = TRUE; - This->updateStateBlock->pIndexData = pIndexData; - This->updateStateBlock->IndexFmt = fmt; + This->updateStateBlock->state.index_buffer = (struct wined3d_buffer *)pIndexData; + This->updateStateBlock->state.index_format = fmt; /* Handle recording of state blocks */ if (This->isRecordingState) { @@ -2710,7 +2968,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetIndexBuffer(IWineD3DDevice *iface, I { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - *ppIndexData = This->stateBlock->pIndexData; + *ppIndexData = (IWineD3DBuffer *)This->stateBlock->state.index_buffer; /* up ref count on ppindexdata */ if (*ppIndexData) { @@ -2729,12 +2987,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetBaseVertexIndex(IWineD3DDevice *ifac IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; TRACE("(%p)->(%d)\n", This, BaseIndex); - if(This->updateStateBlock->baseVertexIndex == BaseIndex) { + if (This->updateStateBlock->state.base_vertex_index == BaseIndex) + { TRACE("Application is setting the old value over, nothing to do\n"); return WINED3D_OK; } - This->updateStateBlock->baseVertexIndex = BaseIndex; + This->updateStateBlock->state.base_vertex_index = BaseIndex; if (This->isRecordingState) { TRACE("Recording... not performing anything\n"); @@ -2749,7 +3008,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetBaseVertexIndex(IWineD3DDevice *ifac IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; TRACE("(%p) : base_index %p\n", This, base_index); - *base_index = This->stateBlock->baseVertexIndex; + *base_index = This->stateBlock->state.base_vertex_index; TRACE("Returning %u\n", *base_index); @@ -2764,7 +3023,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetViewport(IWineD3DDevice *iface, CONS TRACE("(%p)\n", This); This->updateStateBlock->changed.viewport = TRUE; - This->updateStateBlock->viewport = *pViewport; + This->updateStateBlock->state.viewport = *pViewport; /* Handle recording of state blocks */ if (This->isRecordingState) { @@ -2783,23 +3042,20 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetViewport(IWineD3DDevice *iface, CONS static HRESULT WINAPI IWineD3DDeviceImpl_GetViewport(IWineD3DDevice *iface, WINED3DVIEWPORT* pViewport) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; TRACE("(%p)\n", This); - *pViewport = This->stateBlock->viewport; + *pViewport = This->stateBlock->state.viewport; return WINED3D_OK; } -/***** - * Get / Set Render States - * TODO: Verify against dx9 definitions - *****/ -static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderState(IWineD3DDevice *iface, WINED3DRENDERSTATETYPE State, DWORD Value) { +static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderState(IWineD3DDevice *iface, + WINED3DRENDERSTATETYPE State, DWORD Value) +{ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + DWORD oldValue = This->stateBlock->state.render_states[State]; - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - DWORD oldValue = This->stateBlock->renderState[State]; - - TRACE("(%p)->state = %s(%d), value = %d\n", This, debug_d3drenderstate(State), State, Value); + TRACE("iface %p, state %s (%#x), value %#x.\n", iface, debug_d3drenderstate(State), State, Value); This->updateStateBlock->changed.renderState[State >> 5] |= 1 << (State & 0x1f); - This->updateStateBlock->renderState[State] = Value; + This->updateStateBlock->state.render_states[State] = Value; /* Handle recording of state blocks */ if (This->isRecordingState) { @@ -2817,10 +3073,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderState(IWineD3DDevice *iface, W return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderState(IWineD3DDevice *iface, WINED3DRENDERSTATETYPE State, DWORD *pValue) { +static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderState(IWineD3DDevice *iface, + WINED3DRENDERSTATETYPE State, DWORD *pValue) +{ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - TRACE("(%p) for State %d = %d\n", This, State, This->stateBlock->renderState[State]); - *pValue = This->stateBlock->renderState[State]; + + TRACE("iface %p, state %s (%#x), value %p.\n", iface, debug_d3drenderstate(State), State, pValue); + + *pValue = This->stateBlock->state.render_states[State]; return WINED3D_OK; } @@ -2840,27 +3100,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetSamplerState(IWineD3DDevice *iface, Sampler -= (WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS); } - if (Sampler >= sizeof(This->stateBlock->samplerState)/sizeof(This->stateBlock->samplerState[0])) { + if (Sampler >= sizeof(This->stateBlock->state.sampler_states) / sizeof(*This->stateBlock->state.sampler_states)) + { ERR("Current Sampler overflows sampleState0 array (sampler %d)\n", Sampler); return WINED3D_OK; /* Windows accepts overflowing this array ... we do not. */ } - /** - * SetSampler is designed to allow for more than the standard up to 8 textures - * and Geforce has stopped supporting more than 6 standard textures in openGL. - * So I have to use ARB for Gforce. (maybe if the sampler > 4 then use ARB?) - * - * http://developer.nvidia.com/object/General_FAQ.html#t6 - * - * There are two new settings for GForce - * the sampler one: - * GL_MAX_TEXTURE_IMAGE_UNITS_ARB - * and the texture one: - * GL_MAX_TEXTURE_COORDS_ARB. - * Ok GForce say it's ok to use glTexParameter/glGetTexParameter(...). - ******************/ - oldValue = This->stateBlock->samplerState[Sampler][Type]; - This->updateStateBlock->samplerState[Sampler][Type] = Value; + oldValue = This->stateBlock->state.sampler_states[Sampler][Type]; + This->updateStateBlock->state.sampler_states[Sampler][Type] = Value; This->updateStateBlock->changed.samplerState[Sampler] |= 1 << Type; /* Handle recording of state blocks */ @@ -2889,11 +3136,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetSamplerState(IWineD3DDevice *iface, Sampler -= (WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS); } - if (Sampler >= sizeof(This->stateBlock->samplerState)/sizeof(This->stateBlock->samplerState[0])) { + if (Sampler >= sizeof(This->stateBlock->state.sampler_states) / sizeof(*This->stateBlock->state.sampler_states)) + { ERR("Current Sampler overflows sampleState0 array (sampler %d)\n", Sampler); return WINED3D_OK; /* Windows accepts overflowing this array ... we do not. */ } - *Value = This->stateBlock->samplerState[Sampler][Type]; + *Value = This->stateBlock->state.sampler_states[Sampler][Type]; TRACE("(%p) : Returning %#x\n", This, *Value); return WINED3D_OK; @@ -2903,11 +3151,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetScissorRect(IWineD3DDevice *iface, C IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; This->updateStateBlock->changed.scissorRect = TRUE; - if(EqualRect(&This->updateStateBlock->scissorRect, pRect)) { - TRACE("App is setting the old scissor rectangle over, nothing to do\n"); + if (EqualRect(&This->updateStateBlock->state.scissor_rect, pRect)) + { + TRACE("App is setting the old scissor rectangle over, nothing to do.\n"); return WINED3D_OK; } - CopyRect(&This->updateStateBlock->scissorRect, pRect); + CopyRect(&This->updateStateBlock->state.scissor_rect, pRect); if(This->isRecordingState) { TRACE("Recording... not performing anything\n"); @@ -2922,21 +3171,21 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetScissorRect(IWineD3DDevice *iface, C static HRESULT WINAPI IWineD3DDeviceImpl_GetScissorRect(IWineD3DDevice *iface, RECT* pRect) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - *pRect = This->updateStateBlock->scissorRect; + *pRect = This->updateStateBlock->state.scissor_rect; TRACE("(%p)Returning a Scissor Rect of %d:%d-%d:%d\n", This, pRect->left, pRect->top, pRect->right, pRect->bottom); return WINED3D_OK; } static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexDeclaration(IWineD3DDevice* iface, IWineD3DVertexDeclaration* pDecl) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; - IWineD3DVertexDeclaration *oldDecl = This->updateStateBlock->vertexDecl; + IWineD3DVertexDeclaration *oldDecl = (IWineD3DVertexDeclaration *)This->updateStateBlock->state.vertex_declaration; TRACE("(%p) : pDecl=%p\n", This, pDecl); if (pDecl) IWineD3DVertexDeclaration_AddRef(pDecl); if (oldDecl) IWineD3DVertexDeclaration_Release(oldDecl); - This->updateStateBlock->vertexDecl = pDecl; + This->updateStateBlock->state.vertex_declaration = (IWineD3DVertexDeclarationImpl *)pDecl; This->updateStateBlock->changed.vertexDecl = TRUE; if (This->isRecordingState) { @@ -2957,16 +3206,17 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetVertexDeclaration(IWineD3DDevice* if TRACE("(%p) : ppDecl=%p\n", This, ppDecl); - *ppDecl = This->stateBlock->vertexDecl; - if (NULL != *ppDecl) IWineD3DVertexDeclaration_AddRef(*ppDecl); + *ppDecl = (IWineD3DVertexDeclaration *)This->stateBlock->state.vertex_declaration; + if (*ppDecl) IWineD3DVertexDeclaration_AddRef(*ppDecl); return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShader(IWineD3DDevice *iface, IWineD3DVertexShader* pShader) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - IWineD3DVertexShader* oldShader = This->updateStateBlock->vertexShader; +static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShader(IWineD3DDevice *iface, IWineD3DVertexShader *pShader) +{ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + IWineD3DVertexShader *oldShader = (IWineD3DVertexShader *)This->updateStateBlock->state.vertex_shader; - This->updateStateBlock->vertexShader = pShader; + This->updateStateBlock->state.vertex_shader = (IWineD3DVertexShaderImpl *)pShader; This->updateStateBlock->changed.vertexShader = TRUE; if (This->isRecordingState) { @@ -2989,18 +3239,18 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShader(IWineD3DDevice *iface, return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_GetVertexShader(IWineD3DDevice *iface, IWineD3DVertexShader** ppShader) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; +static IWineD3DVertexShader * WINAPI IWineD3DDeviceImpl_GetVertexShader(IWineD3DDevice *iface) +{ + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface; + IWineD3DVertexShader *shader; - if (NULL == ppShader) { - return WINED3DERR_INVALIDCALL; - } - *ppShader = This->stateBlock->vertexShader; - if( NULL != *ppShader) - IWineD3DVertexShader_AddRef(*ppShader); + TRACE("iface %p.\n", iface); - TRACE("(%p) : returning %p\n", This, *ppShader); - return WINED3D_OK; + shader = (IWineD3DVertexShader *)device->stateBlock->state.vertex_shader; + if (shader) IWineD3DVertexShader_AddRef(shader); + + TRACE("Returning %p.\n", shader); + return shader; } static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShaderConstantB( @@ -3017,7 +3267,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShaderConstantB( if (!srcData || start >= MAX_CONST_B) return WINED3DERR_INVALIDCALL; - memcpy(&This->updateStateBlock->vertexShaderConstantB[start], srcData, cnt * sizeof(BOOL)); + memcpy(&This->updateStateBlock->state.vs_consts_b[start], srcData, cnt * sizeof(BOOL)); for (i = 0; i < cnt; i++) TRACE("Set BOOL constant %u to %s\n", start + i, srcData[i]? "true":"false"); @@ -3042,10 +3292,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetVertexShaderConstantB( TRACE("(iface %p, dstData %p, start %d, count %d)\n", iface, dstData, start, count); - if (dstData == NULL || cnt < 0) + if (!dstData || cnt < 0) return WINED3DERR_INVALIDCALL; - memcpy(dstData, &This->stateBlock->vertexShaderConstantB[start], cnt * sizeof(BOOL)); + memcpy(dstData, &This->stateBlock->state.vs_consts_b[start], cnt * sizeof(BOOL)); return WINED3D_OK; } @@ -3063,7 +3313,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShaderConstantI( if (!srcData || start >= MAX_CONST_I) return WINED3DERR_INVALIDCALL; - memcpy(&This->updateStateBlock->vertexShaderConstantI[start * 4], srcData, cnt * sizeof(int) * 4); + memcpy(&This->updateStateBlock->state.vs_consts_i[start * 4], srcData, cnt * sizeof(int) * 4); for (i = 0; i < cnt; i++) TRACE("Set INT constant %u to { %d, %d, %d, %d }\n", start + i, srcData[i*4], srcData[i*4+1], srcData[i*4+2], srcData[i*4+3]); @@ -3089,10 +3339,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetVertexShaderConstantI( TRACE("(iface %p, dstData %p, start %d, count %d)\n", iface, dstData, start, count); - if (dstData == NULL || ((signed int) MAX_CONST_I - (signed int) start) <= 0) + if (!dstData || ((signed int)MAX_CONST_I - (signed int)start) <= 0) return WINED3DERR_INVALIDCALL; - memcpy(dstData, &This->stateBlock->vertexShaderConstantI[start * 4], cnt * sizeof(int) * 4); + memcpy(dstData, &This->stateBlock->state.vs_consts_i[start * 4], cnt * sizeof(int) * 4); return WINED3D_OK; } @@ -3109,10 +3359,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShaderConstantF( iface, srcData, start, count); /* Specifically test start > limit to catch MAX_UINT overflows when adding start + count */ - if (srcData == NULL || start + count > This->d3d_vshader_constantF || start > This->d3d_vshader_constantF) + if (!srcData || start + count > This->d3d_vshader_constantF || start > This->d3d_vshader_constantF) return WINED3DERR_INVALIDCALL; - memcpy(&This->updateStateBlock->vertexShaderConstantF[start * 4], srcData, count * sizeof(float) * 4); + memcpy(&This->updateStateBlock->state.vs_consts_f[start * 4], srcData, count * sizeof(float) * 4); if(TRACE_ON(d3d)) { for (i = 0; i < count; i++) TRACE("Set FLOAT constant %u to { %f, %f, %f, %f }\n", start + i, @@ -3143,10 +3393,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetVertexShaderConstantF( TRACE("(iface %p, dstData %p, start %d, count %d)\n", iface, dstData, start, count); - if (dstData == NULL || cnt < 0) + if (!dstData || cnt < 0) return WINED3DERR_INVALIDCALL; - memcpy(dstData, &This->stateBlock->vertexShaderConstantF[start * 4], cnt * sizeof(float) * 4); + memcpy(dstData, &This->stateBlock->state.vs_consts_f[start * 4], cnt * sizeof(float) * 4); return WINED3D_OK; } @@ -3180,15 +3430,17 @@ static void device_update_fixed_function_usage_map(IWineD3DDeviceImpl *This) { int i; This->fixed_function_usage_map = 0; - for (i = 0; i < MAX_TEXTURES; ++i) { - WINED3DTEXTUREOP color_op = This->stateBlock->textureState[i][WINED3DTSS_COLOROP]; - WINED3DTEXTUREOP alpha_op = This->stateBlock->textureState[i][WINED3DTSS_ALPHAOP]; - DWORD color_arg1 = This->stateBlock->textureState[i][WINED3DTSS_COLORARG1] & WINED3DTA_SELECTMASK; - DWORD color_arg2 = This->stateBlock->textureState[i][WINED3DTSS_COLORARG2] & WINED3DTA_SELECTMASK; - DWORD color_arg3 = This->stateBlock->textureState[i][WINED3DTSS_COLORARG0] & WINED3DTA_SELECTMASK; - DWORD alpha_arg1 = This->stateBlock->textureState[i][WINED3DTSS_ALPHAARG1] & WINED3DTA_SELECTMASK; - DWORD alpha_arg2 = This->stateBlock->textureState[i][WINED3DTSS_ALPHAARG2] & WINED3DTA_SELECTMASK; - DWORD alpha_arg3 = This->stateBlock->textureState[i][WINED3DTSS_ALPHAARG0] & WINED3DTA_SELECTMASK; + for (i = 0; i < MAX_TEXTURES; ++i) + { + const struct wined3d_state *state = &This->stateBlock->state; + WINED3DTEXTUREOP color_op = state->texture_states[i][WINED3DTSS_COLOROP]; + WINED3DTEXTUREOP alpha_op = state->texture_states[i][WINED3DTSS_ALPHAOP]; + DWORD color_arg1 = state->texture_states[i][WINED3DTSS_COLORARG1] & WINED3DTA_SELECTMASK; + DWORD color_arg2 = state->texture_states[i][WINED3DTSS_COLORARG2] & WINED3DTA_SELECTMASK; + DWORD color_arg3 = state->texture_states[i][WINED3DTSS_COLORARG0] & WINED3DTA_SELECTMASK; + DWORD alpha_arg1 = state->texture_states[i][WINED3DTSS_ALPHAARG1] & WINED3DTA_SELECTMASK; + DWORD alpha_arg2 = state->texture_states[i][WINED3DTSS_ALPHAARG2] & WINED3DTA_SELECTMASK; + DWORD alpha_arg3 = state->texture_states[i][WINED3DTSS_ALPHAARG0] & WINED3DTA_SELECTMASK; if (color_op == WINED3DTOP_DISABLE) { /* Not used, and disable higher stages */ @@ -3219,7 +3471,7 @@ static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This, const s ffu_map = This->fixed_function_usage_map; if (This->max_ffp_textures == gl_info->limits.texture_stages - || This->stateBlock->lowest_disabled_stage <= This->max_ffp_textures) + || This->stateBlock->state.lowest_disabled_stage <= This->max_ffp_textures) { for (i = 0; ffu_map; ffu_map >>= 1, ++i) { @@ -3253,7 +3505,7 @@ static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This, const s static void device_map_psamplers(IWineD3DDeviceImpl *This, const struct wined3d_gl_info *gl_info) { const WINED3DSAMPLER_TEXTURE_TYPE *sampler_type = - ((IWineD3DPixelShaderImpl *)This->stateBlock->pixelShader)->baseShader.reg_maps.sampler_type; + This->stateBlock->state.pixel_shader->baseShader.reg_maps.sampler_type; unsigned int i; for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i) { @@ -3269,8 +3521,8 @@ static void device_map_psamplers(IWineD3DDeviceImpl *This, const struct wined3d_ } } -static BOOL device_unit_free_for_vs(IWineD3DDeviceImpl *This, const DWORD *pshader_sampler_tokens, - const DWORD *vshader_sampler_tokens, DWORD unit) +static BOOL device_unit_free_for_vs(IWineD3DDeviceImpl *This, const WINED3DSAMPLER_TEXTURE_TYPE *pshader_sampler_tokens, + const WINED3DSAMPLER_TEXTURE_TYPE *vshader_sampler_tokens, DWORD unit) { DWORD current_mapping = This->rev_tex_unit_map[unit]; @@ -3296,13 +3548,14 @@ static BOOL device_unit_free_for_vs(IWineD3DDeviceImpl *This, const DWORD *pshad static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps, const struct wined3d_gl_info *gl_info) { const WINED3DSAMPLER_TEXTURE_TYPE *vshader_sampler_type = - ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->baseShader.reg_maps.sampler_type; + This->stateBlock->state.vertex_shader->baseShader.reg_maps.sampler_type; const WINED3DSAMPLER_TEXTURE_TYPE *pshader_sampler_type = NULL; int start = min(MAX_COMBINED_SAMPLERS, gl_info->limits.combined_samplers) - 1; int i; - if (ps) { - IWineD3DPixelShaderImpl *pshader = (IWineD3DPixelShaderImpl *)This->stateBlock->pixelShader; + if (ps) + { + IWineD3DPixelShaderImpl *pshader = This->stateBlock->state.pixel_shader; /* Note that we only care if a sampler is sampled or not, not the sampler's specific type. * Otherwise we'd need to call shader_update_samplers() here for 1.x pixelshaders. */ @@ -3338,8 +3591,9 @@ static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps, const struct void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) { const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; - BOOL vs = use_vs(This->stateBlock); - BOOL ps = use_ps(This->stateBlock); + const struct wined3d_state *state = &This->stateBlock->state; + BOOL vs = use_vs(state); + BOOL ps = use_ps(state); /* * Rules are: * -> Pixel shaders need a 1:1 map. In theory the shader input could be mapped too, but @@ -3353,10 +3607,11 @@ void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) if (vs) device_map_vsamplers(This, ps, gl_info); } -static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, IWineD3DPixelShader *pShader) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - IWineD3DPixelShader *oldShader = This->updateStateBlock->pixelShader; - This->updateStateBlock->pixelShader = pShader; +static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, IWineD3DPixelShader *pShader) +{ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + IWineD3DPixelShader *oldShader = (IWineD3DPixelShader *)This->updateStateBlock->state.pixel_shader; + This->updateStateBlock->state.pixel_shader = (IWineD3DPixelShaderImpl *)pShader; This->updateStateBlock->changed.pixelShader = TRUE; /* Handle recording of state blocks */ @@ -3385,20 +3640,18 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, I return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_GetPixelShader(IWineD3DDevice *iface, IWineD3DPixelShader **ppShader) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; +static IWineD3DPixelShader * WINAPI IWineD3DDeviceImpl_GetPixelShader(IWineD3DDevice *iface) +{ + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface; + IWineD3DPixelShader *shader; - if (NULL == ppShader) { - WARN("(%p) : PShader is NULL, returning INVALIDCALL\n", This); - return WINED3DERR_INVALIDCALL; - } + TRACE("iface %p.\n", iface); - *ppShader = This->stateBlock->pixelShader; - if (NULL != *ppShader) { - IWineD3DPixelShader_AddRef(*ppShader); - } - TRACE("(%p) : returning %p\n", This, *ppShader); - return WINED3D_OK; + shader = (IWineD3DPixelShader *)device->stateBlock->state.pixel_shader; + if (shader) IWineD3DPixelShader_AddRef(shader); + + TRACE("Returning %p.\n", shader); + return shader; } static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShaderConstantB( @@ -3415,7 +3668,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShaderConstantB( if (!srcData || start >= MAX_CONST_B) return WINED3DERR_INVALIDCALL; - memcpy(&This->updateStateBlock->pixelShaderConstantB[start], srcData, cnt * sizeof(BOOL)); + memcpy(&This->updateStateBlock->state.ps_consts_b[start], srcData, cnt * sizeof(BOOL)); for (i = 0; i < cnt; i++) TRACE("Set BOOL constant %u to %s\n", start + i, srcData[i]? "true":"false"); @@ -3440,10 +3693,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetPixelShaderConstantB( TRACE("(iface %p, dstData %p, start %d, count %d)\n", iface, dstData, start, count); - if (dstData == NULL || cnt < 0) + if (!dstData || cnt < 0) return WINED3DERR_INVALIDCALL; - memcpy(dstData, &This->stateBlock->pixelShaderConstantB[start], cnt * sizeof(BOOL)); + memcpy(dstData, &This->stateBlock->state.ps_consts_b[start], cnt * sizeof(BOOL)); return WINED3D_OK; } @@ -3461,7 +3714,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShaderConstantI( if (!srcData || start >= MAX_CONST_I) return WINED3DERR_INVALIDCALL; - memcpy(&This->updateStateBlock->pixelShaderConstantI[start * 4], srcData, cnt * sizeof(int) * 4); + memcpy(&This->updateStateBlock->state.ps_consts_i[start * 4], srcData, cnt * sizeof(int) * 4); for (i = 0; i < cnt; i++) TRACE("Set INT constant %u to { %d, %d, %d, %d }\n", start + i, srcData[i*4], srcData[i*4+1], srcData[i*4+2], srcData[i*4+3]); @@ -3487,10 +3740,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetPixelShaderConstantI( TRACE("(iface %p, dstData %p, start %d, count %d)\n", iface, dstData, start, count); - if (dstData == NULL || cnt < 0) + if (!dstData || cnt < 0) return WINED3DERR_INVALIDCALL; - memcpy(dstData, &This->stateBlock->pixelShaderConstantI[start * 4], cnt * sizeof(int) * 4); + memcpy(dstData, &This->stateBlock->state.ps_consts_i[start * 4], cnt * sizeof(int) * 4); return WINED3D_OK; } @@ -3507,10 +3760,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShaderConstantF( iface, srcData, start, count); /* Specifically test start > limit to catch MAX_UINT overflows when adding start + count */ - if (srcData == NULL || start + count > This->d3d_pshader_constantF || start > This->d3d_pshader_constantF) + if (!srcData || start + count > This->d3d_pshader_constantF || start > This->d3d_pshader_constantF) return WINED3DERR_INVALIDCALL; - memcpy(&This->updateStateBlock->pixelShaderConstantF[start * 4], srcData, count * sizeof(float) * 4); + memcpy(&This->updateStateBlock->state.ps_consts_f[start * 4], srcData, count * sizeof(float) * 4); if(TRACE_ON(d3d)) { for (i = 0; i < count; i++) TRACE("Set FLOAT constant %u to { %f, %f, %f, %f }\n", start + i, @@ -3541,14 +3794,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetPixelShaderConstantF( TRACE("(iface %p, dstData %p, start %d, count %d)\n", iface, dstData, start, count); - if (dstData == NULL || cnt < 0) + if (!dstData || cnt < 0) return WINED3DERR_INVALIDCALL; - memcpy(dstData, &This->stateBlock->pixelShaderConstantF[start * 4], cnt * sizeof(float) * 4); + memcpy(dstData, &This->stateBlock->state.ps_consts_f[start * 4], cnt * sizeof(float) * 4); return WINED3D_OK; } /* Context activation is done by the caller. */ +/* Do not call while under the GL lock. */ #define copy_and_next(dest, src, size) memcpy(dest, src, size); dest += (size) static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIndex, DWORD dwCount, const struct wined3d_stream_info *stream_info, struct wined3d_buffer *dest, DWORD dwFlags, @@ -3573,9 +3827,6 @@ static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIn return WINED3DERR_INVALIDCALL; } - /* We might access VBOs from this code, so hold the lock */ - ENTER_GL(); - if (!dest->resource.allocatedMemory) buffer_get_sysmem(dest, gl_info); @@ -3604,11 +3855,8 @@ static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIn dest_conv = dest_conv_addr; } - /* Should I clip? - * a) WINED3DRS_CLIPPING is enabled - * b) WINED3DVOP_CLIP is passed - */ - if(This->stateBlock->renderState[WINED3DRS_CLIPPING]) { + if (This->stateBlock->state.render_states[WINED3DRS_CLIPPING]) + { static BOOL warned = FALSE; /* * The clipping code is not quite correct. Some things need @@ -3878,22 +4126,27 @@ static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIn } } - if(dest_conv) { + if (dest_conv) + { + ENTER_GL(); + GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, dest->buffer_object)); checkGLcall("glBindBufferARB(GL_ARRAY_BUFFER_ARB)"); GL_EXTCALL(glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, dwDestIndex * get_flexible_vertex_size(DestFVF), dwCount * get_flexible_vertex_size(DestFVF), dest_conv_addr)); checkGLcall("glBufferSubDataARB(GL_ARRAY_BUFFER_ARB)"); + + LEAVE_GL(); + HeapFree(GetProcessHeap(), 0, dest_conv_addr); } - LEAVE_GL(); - return WINED3D_OK; } #undef copy_and_next +/* Do not call while under the GL lock. */ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface, UINT SrcStartIndex, UINT DestIndex, UINT VertexCount, IWineD3DBuffer *pDestBuffer, IWineD3DVertexDeclaration *pVertexDecl, DWORD Flags, DWORD DestFVF) @@ -3902,7 +4155,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface, struct wined3d_stream_info stream_info; const struct wined3d_gl_info *gl_info; struct wined3d_context *context; - BOOL vbo = FALSE, streamWasUP = This->stateBlock->streamIsUP; + BOOL vbo = FALSE, streamWasUP = This->stateBlock->state.user_stream; HRESULT hr; TRACE("(%p)->(%d,%d,%d,%p,%p,%d\n", This, SrcStartIndex, DestIndex, VertexCount, pDestBuffer, pVertexDecl, Flags); @@ -3918,9 +4171,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface, /* ProcessVertices reads from vertex buffers, which have to be assigned. DrawPrimitive and DrawPrimitiveUP * control the streamIsUP flag, thus restore it afterwards. */ - This->stateBlock->streamIsUP = FALSE; + This->stateBlock->state.user_stream = FALSE; device_stream_info_from_declaration(This, FALSE, &stream_info, &vbo); - This->stateBlock->streamIsUP = streamWasUP; + This->stateBlock->state.user_stream = streamWasUP; if(vbo || SrcStartIndex) { unsigned int i; @@ -3938,7 +4191,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface, e = &stream_info.elements[i]; if (e->buffer_object) { - struct wined3d_buffer *vb = (struct wined3d_buffer *)This->stateBlock->streamSource[e->stream_idx]; + struct wined3d_buffer *vb = This->stateBlock->state.streams[e->stream_idx].buffer; e->buffer_object = 0; e->data = (BYTE *)((ULONG_PTR)e->data + (ULONG_PTR)buffer_get_sysmem(vb, gl_info)); ENTER_GL(); @@ -3962,13 +4215,20 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface, * Get / Set Texture Stage States * TODO: Verify against dx9 definitions *****/ -static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD Value) { +static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD Value) +{ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - DWORD oldValue = This->updateStateBlock->textureState[Stage][Type]; const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; + DWORD oldValue; TRACE("(%p) : Stage=%d, Type=%s(%d), Value=%d\n", This, Stage, debug_d3dtexturestate(Type), Type, Value); + if (Type > WINED3D_HIGHEST_TEXTURE_STATE) + { + WARN("Invalid Type %d passed.\n", Type); + return WINED3D_OK; + } + if (Stage >= gl_info->limits.texture_stages) { WARN("Attempting to set stage %u which is higher than the max stage %u, ignoring.\n", @@ -3976,8 +4236,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *if return WINED3D_OK; } + oldValue = This->updateStateBlock->state.texture_states[Stage][Type]; This->updateStateBlock->changed.textureState[Stage] |= 1 << Type; - This->updateStateBlock->textureState[Stage][Type] = Value; + This->updateStateBlock->state.texture_states[Stage][Type] = Value; if (This->isRecordingState) { TRACE("Recording... not performing anything\n"); @@ -3990,8 +4251,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *if return WINED3D_OK; } - if(Stage > This->stateBlock->lowest_disabled_stage && - This->StateTable[STATE_TEXTURESTAGE(0, Type)].representative == STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP)) { + if (Stage > This->stateBlock->state.lowest_disabled_stage + && This->StateTable[STATE_TEXTURESTAGE(0, Type)].representative + == STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP)) + { /* Colorop change above lowest disabled stage? That won't change anything in the gl setup * Changes in other states are important on disabled stages too */ @@ -4007,11 +4270,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *if * * The current stage is dirtified below. */ - for(i = Stage + 1; i < This->stateBlock->lowest_disabled_stage; i++) { + for (i = Stage + 1; i < This->stateBlock->state.lowest_disabled_stage; ++i) + { TRACE("Additionally dirtifying stage %u\n", i); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP)); } - This->stateBlock->lowest_disabled_stage = Stage; + This->stateBlock->state.lowest_disabled_stage = Stage; TRACE("New lowest disabled: %u\n", Stage); } else if(Value != WINED3DTOP_DISABLE && oldValue == WINED3DTOP_DISABLE) { /* Previously disabled stage enabled. Stages above it may need enabling @@ -4023,13 +4287,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *if for (i = Stage + 1; i < This->adapter->gl_info.limits.texture_stages; ++i) { - if(This->updateStateBlock->textureState[i][WINED3DTSS_COLOROP] == WINED3DTOP_DISABLE) { + if (This->updateStateBlock->state.texture_states[i][WINED3DTSS_COLOROP] == WINED3DTOP_DISABLE) break; - } TRACE("Additionally dirtifying stage %u due to enable\n", i); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP)); } - This->stateBlock->lowest_disabled_stage = i; + This->stateBlock->state.lowest_disabled_stage = i; TRACE("New lowest disabled: %u\n", i); } } @@ -4039,10 +4302,22 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *if return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_GetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD* pValue) { +static HRESULT WINAPI IWineD3DDeviceImpl_GetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD *pValue) +{ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - TRACE("(%p) : requesting Stage %d, Type %d getting %d\n", This, Stage, Type, This->updateStateBlock->textureState[Stage][Type]); - *pValue = This->updateStateBlock->textureState[Stage][Type]; + + TRACE("iface %p, stage %u, state %s, value %p.\n", + iface, Stage, debug_d3dtexturestate(Type), pValue); + + if (Type > WINED3D_HIGHEST_TEXTURE_STATE) + { + WARN("Invalid Type %d passed.\n", Type); + return WINED3D_OK; + } + + *pValue = This->updateStateBlock->state.texture_states[Stage][Type]; + TRACE("Returning %#x.\n", *pValue); + return WINED3D_OK; } @@ -4062,7 +4337,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface, stage -= (WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS); /* Windows accepts overflowing this array... we do not. */ - if (stage >= sizeof(This->stateBlock->textures) / sizeof(*This->stateBlock->textures)) + if (stage >= sizeof(This->stateBlock->state.textures) / sizeof(*This->stateBlock->state.textures)) { WARN("Ignoring invalid stage %u.\n", stage); return WINED3D_OK; @@ -4077,7 +4352,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface, This->updateStateBlock->changed.textures |= 1 << stage; - prev = This->updateStateBlock->textures[stage]; + prev = (IWineD3DBaseTexture *)This->updateStateBlock->state.textures[stage]; TRACE("Previous texture %p.\n", prev); if (texture == prev) @@ -4087,7 +4362,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface, } TRACE("Setting new texture to %p.\n", texture); - This->updateStateBlock->textures[stage] = texture; + This->updateStateBlock->state.textures[stage] = (IWineD3DBaseTextureImpl *)texture; if (This->isRecordingState) { @@ -4103,14 +4378,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface, { IWineD3DBaseTextureImpl *t = (IWineD3DBaseTextureImpl *)texture; LONG bind_count = InterlockedIncrement(&t->baseTexture.bindCount); - UINT dimensions = IWineD3DBaseTexture_GetTextureDimensions(texture); + GLenum dimensions = t->baseTexture.target; IWineD3DBaseTexture_AddRef(texture); - if (!prev || dimensions != IWineD3DBaseTexture_GetTextureDimensions(prev)) - { + if (!prev || dimensions != ((IWineD3DBaseTextureImpl *)prev)->baseTexture.target) IWineD3DDeviceImpl_MarkStateDirty(This, STATE_PIXELSHADER); - } if (!prev && stage < gl_info->limits.texture_stages) { @@ -4146,7 +4419,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface, TRACE("Searching for other stages the texture is bound to.\n"); for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i) { - if (This->updateStateBlock->textures[i] == prev) + if (This->updateStateBlock->state.textures[i] == t) { TRACE("Texture is also bound to stage %u.\n", i); t->baseTexture.sampler = i; @@ -4170,12 +4443,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetTexture(IWineD3DDevice *iface, DWORD Stage -= (WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS); } - if (Stage >= sizeof(This->stateBlock->textures)/sizeof(This->stateBlock->textures[0])) { + if (Stage >= sizeof(This->stateBlock->state.textures) / sizeof(*This->stateBlock->state.textures)) + { ERR("Current stage overflows textures array (stage %d)\n", Stage); return WINED3D_OK; /* Windows accepts overflowing this array ... we do not. */ } - *ppTexture=This->stateBlock->textures[Stage]; + *ppTexture = (IWineD3DBaseTexture *)This->stateBlock->state.textures[Stage]; if (*ppTexture) IWineD3DBaseTexture_AddRef(*ppTexture); @@ -4264,7 +4538,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_BeginStateBlock(IWineD3DDevice *iface) if (This->isRecordingState) return WINED3DERR_INVALIDCALL; - hr = IWineD3DDeviceImpl_CreateStateBlock(iface, WINED3DSBT_RECORDED, &stateblock, NULL); + hr = IWineD3DDeviceImpl_CreateStateBlock(iface, WINED3DSBT_RECORDED, &stateblock); if (FAILED(hr)) return hr; IWineD3DStateBlock_Release((IWineD3DStateBlock*)This->updateStateBlock); @@ -4350,7 +4624,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Present(IWineD3DDevice *iface, for(i = 0 ; i < swapchains ; i ++) { IWineD3DDeviceImpl_GetSwapChain(iface, i, &swapChain); - TRACE("presentinng chain %d, %p\n", i, swapChain); + TRACE("Presenting chain %d, %p.\n", i, swapChain); IWineD3DSwapChain_Present(swapChain, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion, 0); IWineD3DSwapChain_Release(swapChain); } @@ -4358,239 +4632,28 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Present(IWineD3DDevice *iface, return WINED3D_OK; } -static BOOL is_full_clear(IWineD3DSurfaceImpl *target, const RECT *draw_rect, const RECT *clear_rect) +/* Do not call while under the GL lock. */ +static HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD rect_count, + const RECT *rects, DWORD flags, WINED3DCOLOR color, float depth, DWORD stencil) { - /* partial draw rect */ - if (draw_rect->left || draw_rect->top - || draw_rect->right < target->currentDesc.Width - || draw_rect->bottom < target->currentDesc.Height) - return FALSE; - - /* partial clear rect */ - if (clear_rect && (clear_rect->left > 0 || clear_rect->top > 0 - || clear_rect->right < target->currentDesc.Width - || clear_rect->bottom < target->currentDesc.Height)) - return FALSE; - - return TRUE; -} - -static void prepare_ds_clear(IWineD3DSurfaceImpl *ds, struct wined3d_context *context, - DWORD location, const RECT *draw_rect, UINT rect_count, const RECT *clear_rect) -{ - RECT current_rect, r; - - if (ds->Flags & location) - SetRect(¤t_rect, 0, 0, - ds->ds_current_size.cx, - ds->ds_current_size.cy); - else - SetRectEmpty(¤t_rect); - - IntersectRect(&r, draw_rect, ¤t_rect); - if (EqualRect(&r, draw_rect)) - { - /* current_rect 竓 draw_rect, modify only. */ - surface_modify_ds_location(ds, location, ds->ds_current_size.cx, ds->ds_current_size.cy); - return; - } - - if (EqualRect(&r, ¤t_rect)) - { - /* draw_rect 竓 current_rect, test if we're doing a full clear. */ - - if (!clear_rect) - { - /* Full clear, modify only. */ - surface_modify_ds_location(ds, location, draw_rect->right, draw_rect->bottom); - return; - } - - IntersectRect(&r, draw_rect, clear_rect); - if (EqualRect(&r, draw_rect)) - { - /* clear_rect 竓 draw_rect, modify only. */ - surface_modify_ds_location(ds, location, draw_rect->right, draw_rect->bottom); - return; - } - } - - /* Full load. */ - surface_load_ds_location(ds, context, location); - surface_modify_ds_location(ds, location, ds->ds_current_size.cx, ds->ds_current_size.cy); -} - -/* Not called from the VTable (internal subroutine) */ -HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count, - const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil) -{ - const RECT *clear_rect = (Count > 0 && pRects) ? (const RECT *)pRects : NULL; - IWineD3DSurfaceImpl *depth_stencil = This->depth_stencil; - GLbitfield glMask = 0; - unsigned int i; - UINT drawable_width, drawable_height; - struct wined3d_context *context; + const WINED3DCOLORVALUE c = {D3DCOLOR_R(color), D3DCOLOR_G(color), D3DCOLOR_B(color), D3DCOLOR_A(color)}; + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface; RECT draw_rect; - device_get_draw_rect(This, &draw_rect); + TRACE("iface %p, rect_count %u, rects %p, flags %#x, color 0x%08x, depth %.8e, stencil %u.\n", + iface, rect_count, rects, flags, color, depth, stencil); - /* When we're clearing parts of the drawable, make sure that the target surface is well up to date in the - * drawable. After the clear we'll mark the drawable up to date, so we have to make sure that this is true - * for the cleared parts, and the untouched parts. - * - * If we're clearing the whole target there is no need to copy it into the drawable, it will be overwritten - * anyway. If we're not clearing the color buffer we don't have to copy either since we're not going to set - * the drawable up to date. We have to check all settings that limit the clear area though. Do not bother - * checking all this if the dest surface is in the drawable anyway. - */ - if (Flags & WINED3DCLEAR_TARGET && !(target->Flags & SFLAG_INDRAWABLE)) - { - if (!is_full_clear(target, &draw_rect, clear_rect)) - IWineD3DSurface_LoadLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, NULL); - } - - context = context_acquire(This, target); - if (!context->valid) - { - context_release(context); - WARN("Invalid context, skipping clear.\n"); - return WINED3D_OK; - } - - context_apply_clear_state(context, This, target, depth_stencil); - - target->get_drawable_size(context, &drawable_width, &drawable_height); - - ENTER_GL(); - - /* Only set the values up once, as they are not changing */ - if (Flags & WINED3DCLEAR_STENCIL) - { - if (context->gl_info->supported[EXT_STENCIL_TWO_SIDE]) - { - glDisable(GL_STENCIL_TEST_TWO_SIDE_EXT); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_TWOSIDEDSTENCILMODE)); - } - glStencilMask(~0U); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILWRITEMASK)); - glClearStencil(Stencil); - checkGLcall("glClearStencil"); - glMask = glMask | GL_STENCIL_BUFFER_BIT; - } - - if (Flags & WINED3DCLEAR_ZBUFFER) - { - DWORD location = context->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN; - - if (location == SFLAG_DS_ONSCREEN && depth_stencil != This->onscreen_depth_stencil) - device_switch_onscreen_ds(This, context, depth_stencil); - prepare_ds_clear(depth_stencil, context, location, &draw_rect, Count, clear_rect); - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)depth_stencil, SFLAG_INDRAWABLE, TRUE); - - glDepthMask(GL_TRUE); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZWRITEENABLE)); - glClearDepth(Z); - checkGLcall("glClearDepth"); - glMask = glMask | GL_DEPTH_BUFFER_BIT; - } - - if (Flags & WINED3DCLEAR_TARGET) - { - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, TRUE); - - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE)); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1)); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2)); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3)); - glClearColor(D3DCOLOR_R(Color), D3DCOLOR_G(Color), D3DCOLOR_B(Color), D3DCOLOR_A(Color)); - checkGLcall("glClearColor"); - glMask = glMask | GL_COLOR_BUFFER_BIT; - } - - if (!clear_rect) - { - if (context->render_offscreen) - { - glScissor(draw_rect.left, draw_rect.top, - draw_rect.right - draw_rect.left, draw_rect.bottom - draw_rect.top); - } - else - { - glScissor(draw_rect.left, drawable_height - draw_rect.bottom, - draw_rect.right - draw_rect.left, draw_rect.bottom - draw_rect.top); - } - checkGLcall("glScissor"); - glClear(glMask); - checkGLcall("glClear"); - } - else - { - RECT current_rect; - - /* Now process each rect in turn. */ - for (i = 0; i < Count; ++i) - { - /* Note gl uses lower left, width/height */ - IntersectRect(¤t_rect, &draw_rect, &clear_rect[i]); - - TRACE("clear_rect[%u] %s, current_rect %s.\n", i, - wine_dbgstr_rect(&clear_rect[i]), - wine_dbgstr_rect(¤t_rect)); - - /* Tests show that rectangles where x1 > x2 or y1 > y2 are ignored silently. - * The rectangle is not cleared, no error is returned, but further rectanlges are - * still cleared if they are valid. */ - if (current_rect.left > current_rect.right || current_rect.top > current_rect.bottom) - { - TRACE("Rectangle with negative dimensions, ignoring.\n"); - continue; - } - - if (context->render_offscreen) - { - glScissor(current_rect.left, current_rect.top, - current_rect.right - current_rect.left, current_rect.bottom - current_rect.top); - } - else - { - glScissor(current_rect.left, drawable_height - current_rect.bottom, - current_rect.right - current_rect.left, current_rect.bottom - current_rect.top); - } - checkGLcall("glScissor"); - - glClear(glMask); - checkGLcall("glClear"); - } - } - - LEAVE_GL(); - - if (wined3d_settings.strict_draw_ordering || ((target->Flags & SFLAG_SWAPCHAIN) - && ((IWineD3DSwapChainImpl *)target->container)->front_buffer == target)) - wglFlush(); /* Flush to ensure ordering across contexts. */ - - context_release(context); - - return WINED3D_OK; -} - -static HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Count, - const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil) -{ - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - - TRACE("(%p) Count (%d), pRects (%p), Flags (%x), Color (0x%08x), Z (%f), Stencil (%d)\n", This, - Count, pRects, Flags, Color, Z, Stencil); - - if (Flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL) && !This->depth_stencil) + if (flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL) && !device->depth_stencil) { WARN("Clearing depth and/or stencil without a depth stencil buffer attached, returning WINED3DERR_INVALIDCALL\n"); /* TODO: What about depth stencil buffers without stencil bits? */ return WINED3DERR_INVALIDCALL; } - return IWineD3DDeviceImpl_ClearSurface(This, This->render_targets[0], Count, pRects, Flags, Color, Z, Stencil); + device_get_draw_rect(device, &draw_rect); + + return device_clear_render_targets(device, device->adapter->gl_info.limits.buffers, + device->render_targets, rect_count, rects, &draw_rect, flags, &c, depth, stencil); } /***** @@ -4605,7 +4668,7 @@ static void WINAPI IWineD3DDeviceImpl_SetPrimitiveType(IWineD3DDevice *iface, TRACE("iface %p, primitive_type %s\n", iface, debug_d3dprimitivetype(primitive_type)); This->updateStateBlock->changed.primitive_type = TRUE; - This->updateStateBlock->gl_primitive_type = gl_primitive_type_from_d3d(primitive_type); + This->updateStateBlock->state.gl_primitive_type = gl_primitive_type_from_d3d(primitive_type); } static void WINAPI IWineD3DDeviceImpl_GetPrimitiveType(IWineD3DDevice *iface, @@ -4615,7 +4678,7 @@ static void WINAPI IWineD3DDeviceImpl_GetPrimitiveType(IWineD3DDevice *iface, TRACE("iface %p, primitive_type %p\n", iface, primitive_type); - *primitive_type = d3d_primitive_type_from_gl(This->stateBlock->gl_primitive_type); + *primitive_type = d3d_primitive_type_from_gl(This->stateBlock->state.gl_primitive_type); TRACE("Returning %s\n", debug_d3dprimitivetype(*primitive_type)); } @@ -4626,19 +4689,22 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitive(IWineD3DDevice *iface, UI TRACE("(%p) : start %u, count %u\n", This, StartVertex, vertex_count); - if(!This->stateBlock->vertexDecl) { + if (!This->stateBlock->state.vertex_declaration) + { WARN("(%p) : Called without a valid vertex declaration set\n", This); return WINED3DERR_INVALIDCALL; } /* The index buffer is not needed here, but restore it, otherwise it is hell to keep track of */ - if(This->stateBlock->streamIsUP) { + if (This->stateBlock->state.user_stream) + { IWineD3DDeviceImpl_MarkStateDirty(This, STATE_INDEXBUFFER); - This->stateBlock->streamIsUP = FALSE; + This->stateBlock->state.user_stream = FALSE; } - if(This->stateBlock->loadBaseVertexIndex != 0) { - This->stateBlock->loadBaseVertexIndex = 0; + if (This->stateBlock->state.load_base_vertex_index) + { + This->stateBlock->state.load_base_vertex_index = 0; IWineD3DDeviceImpl_MarkStateDirty(This, STATE_STREAMSRC); } /* Account for the loading offset due to index buffers. Instead of reloading all sources correct it with the startvertex parameter */ @@ -4648,13 +4714,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitive(IWineD3DDevice *iface, UI static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitive(IWineD3DDevice *iface, UINT startIndex, UINT index_count) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + struct wined3d_buffer *index_buffer; UINT idxStride = 2; - IWineD3DBuffer *pIB; GLuint vbo; - pIB = This->stateBlock->pIndexData; - if (!pIB) { + index_buffer = This->stateBlock->state.index_buffer; + if (!index_buffer) + { /* D3D9 returns D3DERR_INVALIDCALL when DrawIndexedPrimitive is called * without an index buffer set. (The first time at least...) * D3D8 simply dies, but I doubt it can do much harm to return @@ -4663,32 +4730,34 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitive(IWineD3DDevice *if return WINED3DERR_INVALIDCALL; } - if(!This->stateBlock->vertexDecl) { + if (!This->stateBlock->state.vertex_declaration) + { WARN("(%p) : Called without a valid vertex declaration set\n", This); return WINED3DERR_INVALIDCALL; } - if(This->stateBlock->streamIsUP) { + if (This->stateBlock->state.user_stream) + { IWineD3DDeviceImpl_MarkStateDirty(This, STATE_INDEXBUFFER); - This->stateBlock->streamIsUP = FALSE; + This->stateBlock->state.user_stream = FALSE; } - vbo = ((struct wined3d_buffer *) pIB)->buffer_object; + vbo = index_buffer->buffer_object; TRACE("(%p) : startIndex %u, index count %u.\n", This, startIndex, index_count); - if (This->stateBlock->IndexFmt == WINED3DFMT_R16_UINT) { + if (This->stateBlock->state.index_format == WINED3DFMT_R16_UINT) idxStride = 2; - } else { + else idxStride = 4; - } - if(This->stateBlock->loadBaseVertexIndex != This->stateBlock->baseVertexIndex) { - This->stateBlock->loadBaseVertexIndex = This->stateBlock->baseVertexIndex; + if (This->stateBlock->state.load_base_vertex_index != This->stateBlock->state.base_vertex_index) + { + This->stateBlock->state.load_base_vertex_index = This->stateBlock->state.base_vertex_index; IWineD3DDeviceImpl_MarkStateDirty(This, STATE_STREAMSRC); } drawPrimitive(iface, index_count, startIndex, idxStride, - vbo ? NULL : ((struct wined3d_buffer *)pIB)->resource.allocatedMemory); + vbo ? NULL : index_buffer->resource.allocatedMemory); return WINED3D_OK; } @@ -4697,24 +4766,27 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitiveUP(IWineD3DDevice *iface, const void *pVertexStreamZeroData, UINT VertexStreamZeroStride) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + struct wined3d_stream_state *stream; IWineD3DBuffer *vb; TRACE("(%p) : vertex count %u, pVtxData %p, stride %u\n", This, vertex_count, pVertexStreamZeroData, VertexStreamZeroStride); - if(!This->stateBlock->vertexDecl) { + if (!This->stateBlock->state.vertex_declaration) + { WARN("(%p) : Called without a valid vertex declaration set\n", This); return WINED3DERR_INVALIDCALL; } /* Note in the following, it's not this type, but that's the purpose of streamIsUP */ - vb = This->stateBlock->streamSource[0]; - This->stateBlock->streamSource[0] = (IWineD3DBuffer *)pVertexStreamZeroData; + stream = &This->stateBlock->state.streams[0]; + vb = (IWineD3DBuffer *)stream->buffer; + stream->buffer = (struct wined3d_buffer *)pVertexStreamZeroData; if (vb) IWineD3DBuffer_Release(vb); - This->stateBlock->streamOffset[0] = 0; - This->stateBlock->streamStride[0] = VertexStreamZeroStride; - This->stateBlock->streamIsUP = TRUE; - This->stateBlock->loadBaseVertexIndex = 0; + stream->offset = 0; + stream->stride = VertexStreamZeroStride; + This->stateBlock->state.user_stream = TRUE; + This->stateBlock->state.load_base_vertex_index = 0; /* TODO: Only mark dirty if drawing from a different UP address */ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_STREAMSRC); @@ -4722,8 +4794,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitiveUP(IWineD3DDevice *iface, drawPrimitive(iface, vertex_count, 0 /* start_idx */, 0 /* indxSize*/, NULL /* indxData */); /* MSDN specifies stream zero settings must be set to NULL */ - This->stateBlock->streamStride[0] = 0; - This->stateBlock->streamSource[0] = NULL; + stream->buffer = NULL; + stream->stride = 0; /* stream zero settings set to null at end, as per the msdn. No need to mark dirty here, the app has to set * the new stream sources or use UP drawing again @@ -4732,18 +4804,20 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitiveUP(IWineD3DDevice *iface, } static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitiveUP(IWineD3DDevice *iface, - UINT index_count, const void *pIndexData, WINED3DFORMAT IndexDataFormat, + UINT index_count, const void *pIndexData, enum wined3d_format_id IndexDataFormat, const void *pVertexStreamZeroData, UINT VertexStreamZeroStride) { int idxStride; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + struct wined3d_stream_state *stream; IWineD3DBuffer *vb; IWineD3DBuffer *ib; TRACE("(%p) : index count %u, pidxdata %p, IdxFmt %u, pVtxdata %p, stride=%u.\n", This, index_count, pIndexData, IndexDataFormat, pVertexStreamZeroData, VertexStreamZeroStride); - if(!This->stateBlock->vertexDecl) { + if (!This->stateBlock->state.vertex_declaration) + { WARN("(%p) : Called without a valid vertex declaration set\n", This); return WINED3DERR_INVALIDCALL; } @@ -4754,17 +4828,17 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitiveUP(IWineD3DDevice * idxStride = 4; } - /* Note in the following, it's not this type, but that's the purpose of streamIsUP */ - vb = This->stateBlock->streamSource[0]; - This->stateBlock->streamSource[0] = (IWineD3DBuffer *)pVertexStreamZeroData; + stream = &This->stateBlock->state.streams[0]; + vb = (IWineD3DBuffer *)stream->buffer; + stream->buffer = (struct wined3d_buffer *)pVertexStreamZeroData; if (vb) IWineD3DBuffer_Release(vb); - This->stateBlock->streamIsUP = TRUE; - This->stateBlock->streamOffset[0] = 0; - This->stateBlock->streamStride[0] = VertexStreamZeroStride; + stream->offset = 0; + stream->stride = VertexStreamZeroStride; + This->stateBlock->state.user_stream = TRUE; /* Set to 0 as per msdn. Do it now due to the stream source loading during drawPrimitive */ - This->stateBlock->baseVertexIndex = 0; - This->stateBlock->loadBaseVertexIndex = 0; + This->stateBlock->state.base_vertex_index = 0; + This->stateBlock->state.load_base_vertex_index = 0; /* Mark the state dirty until we have nicer tracking of the stream source pointers */ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VDECL); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_INDEXBUFFER); @@ -4772,12 +4846,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitiveUP(IWineD3DDevice * drawPrimitive(iface, index_count, 0 /* start_idx */, idxStride, pIndexData); /* MSDN specifies stream zero settings and index buffer must be set to NULL */ - This->stateBlock->streamSource[0] = NULL; - This->stateBlock->streamStride[0] = 0; - ib = This->stateBlock->pIndexData; - if(ib) { + stream->buffer = NULL; + stream->stride = 0; + ib = (IWineD3DBuffer *)This->stateBlock->state.index_buffer; + if (ib) + { IWineD3DBuffer_Release(ib); - This->stateBlock->pIndexData = NULL; + This->stateBlock->state.index_buffer = NULL; } /* No need to mark the stream source state dirty here. Either the app calls UP drawing again, or it has to call * SetStreamSource to specify a vertex buffer @@ -4797,7 +4872,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitiveStrided(IWineD3DDevice *if */ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VDECL); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_INDEXBUFFER); - This->stateBlock->baseVertexIndex = 0; + This->stateBlock->state.base_vertex_index = 0; This->up_strided = DrawPrimStrideData; drawPrimitive(iface, vertex_count, 0, 0, NULL); This->up_strided = NULL; @@ -4806,7 +4881,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitiveStrided(IWineD3DDevice *if static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitiveStrided(IWineD3DDevice *iface, UINT vertex_count, const WineDirect3DVertexStridedData *DrawPrimStrideData, - UINT NumVertices, const void *pIndexData, WINED3DFORMAT IndexDataFormat) + UINT NumVertices, const void *pIndexData, enum wined3d_format_id IndexDataFormat) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; DWORD idxSize = (IndexDataFormat == WINED3DFMT_R32_UINT ? 4 : 2); @@ -4817,8 +4892,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitiveStrided(IWineD3DDev */ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VDECL); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_INDEXBUFFER); - This->stateBlock->streamIsUP = TRUE; - This->stateBlock->baseVertexIndex = 0; + This->stateBlock->state.user_stream = TRUE; + This->stateBlock->state.base_vertex_index = 0; This->up_strided = DrawPrimStrideData; drawPrimitive(iface, vertex_count, 0 /* start_idx */, idxSize, pIndexData); This->up_strided = NULL; @@ -4982,14 +5057,20 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateTexture(IWineD3DDevice *iface, return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_GetFrontBufferData(IWineD3DDevice *iface,UINT iSwapChain, IWineD3DSurface *pDestSurface) { - IWineD3DSwapChain *swapChain; +static HRESULT WINAPI IWineD3DDeviceImpl_GetFrontBufferData(IWineD3DDevice *iface, + UINT swapchain_idx, IWineD3DSurface *dst_surface) +{ + IWineD3DSwapChain *swapchain; HRESULT hr; - hr = IWineD3DDeviceImpl_GetSwapChain(iface, iSwapChain, &swapChain); - if(hr == WINED3D_OK) { - hr = IWineD3DSwapChain_GetFrontBufferData(swapChain, pDestSurface); - IWineD3DSwapChain_Release(swapChain); - } + + TRACE("iface %p, swapchain_idx %u, dst_surface %p.\n", iface, swapchain_idx, dst_surface); + + hr = IWineD3DDeviceImpl_GetSwapChain(iface, swapchain_idx, &swapchain); + if (FAILED(hr)) return hr; + + hr = IWineD3DSwapChain_GetFrontBufferData(swapchain, dst_surface); + IWineD3DSwapChain_Release(swapchain); + return hr; } @@ -5000,29 +5081,35 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ValidateDevice(IWineD3DDevice *iface, TRACE("(%p) : %p\n", This, pNumPasses); - for(i = 0; i < MAX_COMBINED_SAMPLERS; i++) { - if(This->stateBlock->samplerState[i][WINED3DSAMP_MINFILTER] == WINED3DTEXF_NONE) { + for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i) + { + if (This->stateBlock->state.sampler_states[i][WINED3DSAMP_MINFILTER] == WINED3DTEXF_NONE) + { WARN("Sampler state %u has minfilter D3DTEXF_NONE, returning D3DERR_UNSUPPORTEDTEXTUREFILTER\n", i); return WINED3DERR_UNSUPPORTEDTEXTUREFILTER; } - if(This->stateBlock->samplerState[i][WINED3DSAMP_MAGFILTER] == WINED3DTEXF_NONE) { + if (This->stateBlock->state.sampler_states[i][WINED3DSAMP_MAGFILTER] == WINED3DTEXF_NONE) + { WARN("Sampler state %u has magfilter D3DTEXF_NONE, returning D3DERR_UNSUPPORTEDTEXTUREFILTER\n", i); return WINED3DERR_UNSUPPORTEDTEXTUREFILTER; } - texture = (IWineD3DBaseTextureImpl *) This->stateBlock->textures[i]; - if (!texture || texture->resource.format_desc->Flags & WINED3DFMT_FLAG_FILTERING) continue; + texture = This->stateBlock->state.textures[i]; + if (!texture || texture->resource.format->Flags & WINED3DFMT_FLAG_FILTERING) continue; - if(This->stateBlock->samplerState[i][WINED3DSAMP_MAGFILTER] != WINED3DTEXF_POINT) { + if (This->stateBlock->state.sampler_states[i][WINED3DSAMP_MAGFILTER] != WINED3DTEXF_POINT) + { WARN("Non-filterable texture and mag filter enabled on samper %u, returning E_FAIL\n", i); return E_FAIL; } - if(This->stateBlock->samplerState[i][WINED3DSAMP_MINFILTER] != WINED3DTEXF_POINT) { + if (This->stateBlock->state.sampler_states[i][WINED3DSAMP_MINFILTER] != WINED3DTEXF_POINT) + { WARN("Non-filterable texture and min filter enabled on samper %u, returning E_FAIL\n", i); return E_FAIL; } - if(This->stateBlock->samplerState[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_NONE && - This->stateBlock->samplerState[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_POINT /* sic! */) { + if (This->stateBlock->state.sampler_states[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_NONE + && This->stateBlock->state.sampler_states[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_POINT) + { WARN("Non-filterable texture and mip filter enabled on samper %u, returning E_FAIL\n", i); return E_FAIL; } @@ -5041,9 +5128,9 @@ static void dirtify_p8_texture_samplers(IWineD3DDeviceImpl *device) for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i) { - IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl*)device->stateBlock->textures[i]; - if (texture && (texture->resource.format_desc->format == WINED3DFMT_P8_UINT - || texture->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM)) + IWineD3DBaseTextureImpl *texture = device->stateBlock->state.textures[i]; + if (texture && (texture->resource.format->id == WINED3DFMT_P8_UINT + || texture->resource.format->id == WINED3DFMT_P8_UINT_A8_UNORM)) { IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(i)); } @@ -5136,7 +5223,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCurrentTexturePalette(IWineD3DDevi static HRESULT WINAPI IWineD3DDeviceImpl_GetCurrentTexturePalette(IWineD3DDevice *iface, UINT* PaletteNumber) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - if (PaletteNumber == NULL) { + + if (!PaletteNumber) + { WARN("(%p) : returning Invalid Call\n", This); return WINED3DERR_INVALIDCALL; } @@ -5229,8 +5318,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface, IWineD3DSurfaceImpl *src_impl = (IWineD3DSurfaceImpl *)src_surface; IWineD3DSurfaceImpl *dst_impl = (IWineD3DSurfaceImpl *)dst_surface; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - const struct wined3d_format_desc *src_format; - const struct wined3d_format_desc *dst_format; + const struct wined3d_format *src_format; + const struct wined3d_format *dst_format; const struct wined3d_gl_info *gl_info; struct wined3d_context *context; const unsigned char *data; @@ -5239,7 +5328,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface, UINT src_w, src_h; UINT dst_x, dst_y; DWORD sampler; - struct wined3d_format_desc desc; + struct wined3d_format format; TRACE("iface %p, src_surface %p, src_rect %s, dst_surface %p, dst_point %s.\n", iface, src_surface, wine_dbgstr_rect(src_rect), @@ -5252,10 +5341,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface, return WINED3DERR_INVALIDCALL; } - src_format = src_impl->resource.format_desc; - dst_format = dst_impl->resource.format_desc; + src_format = src_impl->resource.format; + dst_format = dst_impl->resource.format; - if (src_format->format != dst_format->format) + if (src_format->id != dst_format->id) { WARN("Source and destination surfaces should have the same format.\n"); return WINED3DERR_INVALIDCALL; @@ -5268,8 +5357,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface, * surface to the destination's sysmem copy. If surface conversion is * needed, use BltFast instead to copy in sysmem and use regular surface * loading. */ - d3dfmt_get_conv(dst_impl, FALSE, TRUE, &desc, &convert); - if (convert != NO_CONVERSION || desc.convert) + d3dfmt_get_conv(dst_impl, FALSE, TRUE, &format, &convert); + if (convert != NO_CONVERSION || format.convert) return IWineD3DSurface_BltFast(dst_surface, dst_x, dst_y, src_surface, src_rect, 0); context = context_acquire(This, NULL); @@ -5296,9 +5385,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface, if (dst_format->Flags & WINED3DFMT_FLAG_COMPRESSED) { - UINT row_length = (update_w / src_format->block_width) * src_format->block_byte_count; - UINT row_count = update_h / src_format->block_height; - UINT src_pitch = IWineD3DSurface_GetPitch(src_surface); + UINT row_length = wined3d_format_calculate_size(src_format, 1, update_w, 1); + UINT row_count = (update_h + src_format->block_height - 1) / src_format->block_height; + UINT src_pitch = wined3d_format_calculate_size(src_format, 1, src_w, 1); if (src_rect) { @@ -5353,7 +5442,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface, LEAVE_GL(); context_release(context); - IWineD3DSurface_ModifyLocation(dst_surface, SFLAG_INTEXTURE, TRUE); + surface_modify_location(dst_impl, SFLAG_INTEXTURE, TRUE); sampler = This->rev_tex_unit_map[0]; if (sampler != WINED3D_UNMAPPED_STAGE) { @@ -5409,9 +5498,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawRectPatch(IWineD3DDevice *iface, UI patch = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*patch)); } - if(pNumSegs[0] != patch->numSegs[0] || pNumSegs[1] != patch->numSegs[1] || - pNumSegs[2] != patch->numSegs[2] || pNumSegs[3] != patch->numSegs[3] || - (pRectPatchInfo && memcmp(pRectPatchInfo, &patch->RectPatchInfo, sizeof(*pRectPatchInfo)) != 0) ) { + if (pNumSegs[0] != patch->numSegs[0] || pNumSegs[1] != patch->numSegs[1] + || pNumSegs[2] != patch->numSegs[2] || pNumSegs[3] != patch->numSegs[3] + || (pRectPatchInfo && memcmp(pRectPatchInfo, &patch->RectPatchInfo, sizeof(*pRectPatchInfo)))) + { HRESULT hr; TRACE("Tesselation density or patch info changed, retesselating\n"); @@ -5436,10 +5526,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawRectPatch(IWineD3DDevice *iface, UI } This->currentPatch = patch; - old_primitive_type = This->stateBlock->gl_primitive_type; - This->stateBlock->gl_primitive_type = GL_TRIANGLES; + old_primitive_type = This->stateBlock->state.gl_primitive_type; + This->stateBlock->state.gl_primitive_type = GL_TRIANGLES; IWineD3DDevice_DrawPrimitiveStrided(iface, patch->numSegs[0] * patch->numSegs[1] * 2 * 3, &patch->strided); - This->stateBlock->gl_primitive_type = old_primitive_type; + This->stateBlock->state.gl_primitive_type = old_primitive_type; This->currentPatch = NULL; /* Destroy uncached patches */ @@ -5483,83 +5573,30 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DeletePatch(IWineD3DDevice *iface, UINT return WINED3DERR_INVALIDCALL; } -static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface, - const WINED3DRECT *rect, const float color[4]) -{ - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; - struct wined3d_context *context; - - if (rect) IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INDRAWABLE, NULL); - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INDRAWABLE, TRUE); - - context = context_acquire(This, surface); - context_apply_clear_state(context, This, surface, NULL); - - ENTER_GL(); - - if (rect) - { - if (surface_is_offscreen(surface)) - glScissor(rect->x1, rect->y1, rect->x2 - rect->x1, rect->y2 - rect->y1); - else - glScissor(rect->x1, surface->currentDesc.Height - rect->y2, - rect->x2 - rect->x1, rect->y2 - rect->y1); - checkGLcall("glScissor"); - } - else - { - glDisable(GL_SCISSOR_TEST); - } - - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE)); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1)); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2)); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3)); - - glClearColor(color[0], color[1], color[2], color[3]); - glClear(GL_COLOR_BUFFER_BIT); - checkGLcall("glClear"); - - LEAVE_GL(); - - if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */ - - context_release(context); -} - +/* Do not call while under the GL lock. */ static HRESULT WINAPI IWineD3DDeviceImpl_ColorFill(IWineD3DDevice *iface, - IWineD3DSurface *pSurface, const WINED3DRECT *pRect, WINED3DCOLOR color) + IWineD3DSurface *surface, const RECT *rect, const WINED3DCOLORVALUE *color) { - IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *) pSurface; - WINEDDBLTFX BltFx; + IWineD3DSurfaceImpl *s = (IWineD3DSurfaceImpl *)surface; - TRACE("iface %p, surface %p, rect %p, color 0x%08x.\n", iface, pSurface, pRect, color); + TRACE("iface %p, surface %p, rect %s, color {%.8e, %.8e, %.8e, %.8e}.\n", + iface, surface, wine_dbgstr_rect(rect), + color->r, color->g, color->b, color->a); - if (surface->resource.pool != WINED3DPOOL_DEFAULT && surface->resource.pool != WINED3DPOOL_SYSTEMMEM) { + if (s->resource.pool != WINED3DPOOL_DEFAULT && s->resource.pool != WINED3DPOOL_SYSTEMMEM) + { FIXME("call to colorfill with non WINED3DPOOL_DEFAULT or WINED3DPOOL_SYSTEMMEM surface\n"); return WINED3DERR_INVALIDCALL; } - if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - const float c[4] = {D3DCOLOR_R(color), D3DCOLOR_G(color), D3DCOLOR_B(color), D3DCOLOR_A(color)}; - color_fill_fbo(iface, surface, pRect, c); - return WINED3D_OK; - } else { - /* Just forward this to the DirectDraw blitting engine */ - memset(&BltFx, 0, sizeof(BltFx)); - BltFx.dwSize = sizeof(BltFx); - BltFx.u5.dwFillColor = color_convert_argb_to_fmt(color, surface->resource.format_desc->format); - return IWineD3DSurface_Blt(pSurface, (const RECT *)pRect, NULL, NULL, - WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT); - } + return surface_color_fill(s, rect, color); } +/* Do not call while under the GL lock. */ static void WINAPI IWineD3DDeviceImpl_ClearRendertargetView(IWineD3DDevice *iface, - IWineD3DRendertargetView *rendertarget_view, const float color[4]) + IWineD3DRendertargetView *rendertarget_view, const WINED3DCOLORVALUE *color) { IWineD3DResource *resource; - IWineD3DSurfaceImpl *surface; HRESULT hr; hr = IWineD3DRendertargetView_GetResource(rendertarget_view, &resource); @@ -5576,349 +5613,122 @@ static void WINAPI IWineD3DDeviceImpl_ClearRendertargetView(IWineD3DDevice *ifac return; } - surface = (IWineD3DSurfaceImpl *)resource; - - if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) - { - color_fill_fbo(iface, surface, NULL, color); - } - else - { - WINEDDBLTFX BltFx; - WINED3DCOLOR c; - - WARN("Converting to WINED3DCOLOR, this might give incorrect results\n"); - - c = ((DWORD)(color[2] * 255.0f)); - c |= ((DWORD)(color[1] * 255.0f)) << 8; - c |= ((DWORD)(color[0] * 255.0f)) << 16; - c |= ((DWORD)(color[3] * 255.0f)) << 24; - - /* Just forward this to the DirectDraw blitting engine */ - memset(&BltFx, 0, sizeof(BltFx)); - BltFx.dwSize = sizeof(BltFx); - BltFx.u5.dwFillColor = color_convert_argb_to_fmt(c, surface->resource.format_desc->format); - hr = IWineD3DSurface_Blt((IWineD3DSurface *)surface, NULL, NULL, NULL, - WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT); - if (FAILED(hr)) - { - ERR("Blt failed, hr %#x\n", hr); - } - } + hr = surface_color_fill((IWineD3DSurfaceImpl *)resource, NULL, color); + if (FAILED(hr)) ERR("Color fill failed, hr %#x.\n", hr); IWineD3DResource_Release(resource); } /* rendertarget and depth stencil functions */ -static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderTarget(IWineD3DDevice* iface,DWORD RenderTargetIndex, IWineD3DSurface **ppRenderTarget) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; +static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderTarget(IWineD3DDevice *iface, + DWORD render_target_idx, IWineD3DSurface **render_target) +{ + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface; - if (RenderTargetIndex >= This->adapter->gl_info.limits.buffers) + TRACE("iface %p, render_target_idx %u, render_target %p.\n", + iface, render_target_idx, render_target); + + if (render_target_idx >= device->adapter->gl_info.limits.buffers) { - ERR("(%p) : Only %d render targets are supported.\n", - This, This->adapter->gl_info.limits.buffers); + WARN("Only %u render targets are supported.\n", device->adapter->gl_info.limits.buffers); return WINED3DERR_INVALIDCALL; } - *ppRenderTarget = (IWineD3DSurface *)This->render_targets[RenderTargetIndex]; - TRACE("(%p) : RenderTarget %d Index returning %p\n", This, RenderTargetIndex, *ppRenderTarget); - /* Note inc ref on returned surface */ - if(*ppRenderTarget != NULL) - IWineD3DSurface_AddRef(*ppRenderTarget); + *render_target = (IWineD3DSurface *)device->render_targets[render_target_idx]; + if (*render_target) IWineD3DSurface_AddRef(*render_target); + + TRACE("Returning render target %p.\n", *render_target); + return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *iface, - IWineD3DSurface *front, IWineD3DSurface *back) +static HRESULT WINAPI IWineD3DDeviceImpl_GetDepthStencilSurface(IWineD3DDevice *iface, IWineD3DSurface **depth_stencil) { - IWineD3DSurfaceImpl *front_impl = (IWineD3DSurfaceImpl *)front; - IWineD3DSurfaceImpl *back_impl = (IWineD3DSurfaceImpl *)back; - IWineD3DSwapChainImpl *swapchain; - HRESULT hr; + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface; - TRACE("iface %p, front %p, back %p.\n", iface, front, back); + TRACE("iface %p, depth_stencil %p.\n", iface, depth_stencil); - if (FAILED(hr = IWineD3DDevice_GetSwapChain(iface, 0, (IWineD3DSwapChain **)&swapchain))) - { - ERR("Failed to get the swapchain, hr %#x.\n", hr); - return hr; - } + *depth_stencil = (IWineD3DSurface *)device->depth_stencil; + TRACE("Returning depth/stencil surface %p.\n", *depth_stencil); + if (!*depth_stencil) return WINED3DERR_NOTFOUND; + IWineD3DSurface_AddRef(*depth_stencil); - if (front_impl && !(front_impl->resource.usage & WINED3DUSAGE_RENDERTARGET)) - { - ERR("Trying to set a front buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage.\n"); - IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain); - return WINED3DERR_INVALIDCALL; - } - - if (back_impl) - { - if (!(back_impl->resource.usage & WINED3DUSAGE_RENDERTARGET)) - { - ERR("Trying to set a back buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage.\n"); - IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain); - return WINED3DERR_INVALIDCALL; - } - - if (!swapchain->back_buffers) - { - swapchain->back_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*swapchain->back_buffers)); - if (!swapchain->back_buffers) - { - ERR("Failed to allocate back buffer array memory.\n"); - IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain); - return E_OUTOFMEMORY; - } - } - } - - if (swapchain->front_buffer != front_impl) - { - TRACE("Changing the front buffer from %p to %p.\n", swapchain->front_buffer, front_impl); - - if (swapchain->front_buffer) - { - IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->front_buffer, NULL); - swapchain->front_buffer->Flags &= ~SFLAG_SWAPCHAIN; - } - swapchain->front_buffer = front_impl; - - if (front) - { - IWineD3DSurface_SetContainer(front, (IWineD3DBase *)swapchain); - front_impl->Flags |= SFLAG_SWAPCHAIN; - } - } - - if (swapchain->back_buffers[0] != back_impl) - { - TRACE("Changing the back buffer from %p to %p.\n", swapchain->back_buffers[0], back_impl); - - if (swapchain->back_buffers[0]) - { - IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->back_buffers[0], NULL); - swapchain->back_buffers[0]->Flags &= ~SFLAG_SWAPCHAIN; - } - swapchain->back_buffers[0] = back_impl; - - if (back) - { - swapchain->presentParms.BackBufferWidth = back_impl->currentDesc.Width; - swapchain->presentParms.BackBufferHeight = back_impl->currentDesc.Height; - swapchain->presentParms.BackBufferFormat = back_impl->resource.format_desc->format; - swapchain->presentParms.BackBufferCount = 1; - - IWineD3DSurface_SetContainer(back, (IWineD3DBase *)swapchain); - back_impl->Flags |= SFLAG_SWAPCHAIN; - } - else - { - swapchain->presentParms.BackBufferCount = 0; - HeapFree(GetProcessHeap(), 0, swapchain->back_buffers); - swapchain->back_buffers = NULL; - } - } - - IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain); return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_GetDepthStencilSurface(IWineD3DDevice* iface, IWineD3DSurface **ppZStencilSurface) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - *ppZStencilSurface = (IWineD3DSurface *)This->depth_stencil; - TRACE("(%p) : zStencilSurface returning %p\n", This, *ppZStencilSurface); - - if(*ppZStencilSurface != NULL) { - /* Note inc ref on returned surface */ - IWineD3DSurface_AddRef(*ppZStencilSurface); - return WINED3D_OK; - } else { - return WINED3DERR_NOTFOUND; - } -} - -void stretch_rect_fbo(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_surface, const RECT *src_rect_in, - IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect_in, const WINED3DTEXTUREFILTERTYPE filter) +static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface, + DWORD render_target_idx, IWineD3DSurface *render_target, BOOL set_viewport) { - GLbitfield mask = GL_COLOR_BUFFER_BIT; /* TODO: Support blitting depth/stencil surfaces */ - const struct wined3d_gl_info *gl_info; - struct wined3d_context *context; - GLenum gl_filter; - RECT src_rect, dst_rect; + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface; + IWineD3DSurfaceImpl *prev; - TRACE("device %p, src_surface %p, src_rect_in %s, dst_surface %p, dst_rect_in %s, filter %s (0x%08x).\n", - device, src_surface, wine_dbgstr_rect(src_rect_in), dst_surface, - wine_dbgstr_rect(dst_rect_in), debug_d3dtexturefiltertype(filter), filter); + TRACE("iface %p, render_target_idx %u, render_target %p, set_viewport %#x.\n", + iface, render_target_idx, render_target, set_viewport); - src_rect = *src_rect_in; - dst_rect = *dst_rect_in; - - switch (filter) { - case WINED3DTEXF_LINEAR: - gl_filter = GL_LINEAR; - break; - - default: - FIXME("Unsupported filter mode %s (0x%08x)\n", debug_d3dtexturefiltertype(filter), filter); - case WINED3DTEXF_NONE: - case WINED3DTEXF_POINT: - gl_filter = GL_NEAREST; - break; - } - - /* Make sure the drawables are up-to-date. Note that loading the - * destination surface isn't strictly required if we overwrite the - * entire surface. */ - IWineD3DSurface_LoadLocation((IWineD3DSurface *)src_surface, SFLAG_INDRAWABLE, NULL); - IWineD3DSurface_LoadLocation((IWineD3DSurface *)dst_surface, SFLAG_INDRAWABLE, NULL); - - if (!surface_is_offscreen(src_surface)) context = context_acquire(device, src_surface); - else if (!surface_is_offscreen(dst_surface)) context = context_acquire(device, dst_surface); - else context = context_acquire(device, NULL); - - if (!context->valid) + if (render_target_idx >= device->adapter->gl_info.limits.buffers) { - context_release(context); - WARN("Invalid context, skipping blit.\n"); - return; - } - - gl_info = context->gl_info; - - if (!surface_is_offscreen(src_surface)) - { - GLenum buffer = surface_get_gl_buffer(src_surface); - - TRACE("Source surface %p is onscreen\n", src_surface); - - if (buffer == GL_FRONT) - surface_translate_frontbuffer_coords(src_surface, context->win_handle, &src_rect); - - src_rect.top = src_surface->currentDesc.Height - src_rect.top; - src_rect.bottom = src_surface->currentDesc.Height - src_rect.bottom; - - ENTER_GL(); - context_bind_fbo(context, GL_READ_FRAMEBUFFER, NULL); - glReadBuffer(buffer); - checkGLcall("glReadBuffer()"); - } else { - TRACE("Source surface %p is offscreen\n", src_surface); - ENTER_GL(); - context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, src_surface, NULL); - glReadBuffer(GL_COLOR_ATTACHMENT0); - checkGLcall("glReadBuffer()"); - } - LEAVE_GL(); - - /* Attach dst surface to dst fbo */ - if (!surface_is_offscreen(dst_surface)) - { - GLenum buffer = surface_get_gl_buffer(dst_surface); - - TRACE("Destination surface %p is onscreen\n", dst_surface); - - if (buffer == GL_FRONT) - surface_translate_frontbuffer_coords(dst_surface, context->win_handle, &dst_rect); - - dst_rect.top = dst_surface->currentDesc.Height - dst_rect.top; - dst_rect.bottom = dst_surface->currentDesc.Height - dst_rect.bottom; - - ENTER_GL(); - context_bind_fbo(context, GL_DRAW_FRAMEBUFFER, NULL); - context_set_draw_buffer(context, buffer); - } - else - { - TRACE("Destination surface %p is offscreen\n", dst_surface); - - ENTER_GL(); - context_apply_fbo_state_blit(context, GL_DRAW_FRAMEBUFFER, dst_surface, NULL); - context_set_draw_buffer(context, GL_COLOR_ATTACHMENT0); - } - glDisable(GL_SCISSOR_TEST); - IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE)); - - gl_info->fbo_ops.glBlitFramebuffer(src_rect.left, src_rect.top, src_rect.right, src_rect.bottom, - dst_rect.left, dst_rect.top, dst_rect.right, dst_rect.bottom, mask, gl_filter); - checkGLcall("glBlitFramebuffer()"); - - LEAVE_GL(); - - if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */ - - context_release(context); - - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INDRAWABLE, TRUE); -} - -static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface, DWORD RenderTargetIndex, IWineD3DSurface *pRenderTarget, - BOOL set_viewport) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - - TRACE("(%p) : Setting rendertarget %d to %p\n", This, RenderTargetIndex, pRenderTarget); - - if (RenderTargetIndex >= This->adapter->gl_info.limits.buffers) - { - WARN("(%p) : Unsupported target %u set, returning WINED3DERR_INVALIDCALL(only %u supported)\n", - This, RenderTargetIndex, This->adapter->gl_info.limits.buffers); + WARN("Only %u render targets are supported.\n", device->adapter->gl_info.limits.buffers); return WINED3DERR_INVALIDCALL; } - /* MSDN says that null disables the render target - but a device must always be associated with a render target - nope MSDN says that we return invalid call to a null rendertarget with an index of 0 - */ - if (RenderTargetIndex == 0 && pRenderTarget == NULL) { - FIXME("Trying to set render target 0 to NULL\n"); - return WINED3DERR_INVALIDCALL; - } - if (pRenderTarget && !(((IWineD3DSurfaceImpl *)pRenderTarget)->resource.usage & WINED3DUSAGE_RENDERTARGET)) { - FIXME("(%p)Trying to set the render target to a surface(%p) that wasn't created with a usage of WINED3DUSAGE_RENDERTARGET\n",This ,pRenderTarget); - return WINED3DERR_INVALIDCALL; - } - - /* If we are trying to set what we already have, don't bother */ - if (pRenderTarget == (IWineD3DSurface *)This->render_targets[RenderTargetIndex]) + prev = device->render_targets[render_target_idx]; + if (render_target == (IWineD3DSurface *)prev) { - TRACE("Trying to do a NOP SetRenderTarget operation\n"); + TRACE("Trying to do a NOP SetRenderTarget operation.\n"); return WINED3D_OK; } - if (pRenderTarget) - IWineD3DSurface_AddRef(pRenderTarget); - if (This->render_targets[RenderTargetIndex]) - IWineD3DSurface_Release((IWineD3DSurface *)This->render_targets[RenderTargetIndex]); - This->render_targets[RenderTargetIndex] = (IWineD3DSurfaceImpl *)pRenderTarget; - /* Render target 0 is special */ - if(RenderTargetIndex == 0 && set_viewport) { - /* Finally, reset the viewport and scissor rect as the MSDN states. - * Tests show that stateblock recording is ignored, the change goes - * directly into the primary stateblock. - */ - This->stateBlock->viewport.Height = This->render_targets[0]->currentDesc.Height; - This->stateBlock->viewport.Width = This->render_targets[0]->currentDesc.Width; - This->stateBlock->viewport.X = 0; - This->stateBlock->viewport.Y = 0; - This->stateBlock->viewport.MaxZ = 1.0f; - This->stateBlock->viewport.MinZ = 0.0f; - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VIEWPORT); - - This->stateBlock->scissorRect.top = 0; - This->stateBlock->scissorRect.left = 0; - This->stateBlock->scissorRect.right = This->stateBlock->viewport.Width; - This->stateBlock->scissorRect.bottom = This->stateBlock->viewport.Height; - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SCISSORRECT); + /* Render target 0 can't be set to NULL. */ + if (!render_target && !render_target_idx) + { + WARN("Trying to set render target 0 to NULL.\n"); + return WINED3DERR_INVALIDCALL; } + + if (render_target && !(((IWineD3DSurfaceImpl *)render_target)->resource.usage & WINED3DUSAGE_RENDERTARGET)) + { + FIXME("Surface %p doesn't have render target usage.\n", render_target); + return WINED3DERR_INVALIDCALL; + } + + if (render_target) IWineD3DSurface_AddRef(render_target); + device->render_targets[render_target_idx] = (IWineD3DSurfaceImpl *)render_target; + /* Release after the assignment, to prevent device_resource_released() + * from seeing the surface as still in use. */ + if (prev) IWineD3DSurface_Release((IWineD3DSurface *)prev); + + /* Render target 0 is special. */ + if (!render_target_idx && set_viewport) + { + /* Set the viewport and scissor rectangles, if requested. Tests show + * that stateblock recording is ignored, the change goes directly + * into the primary stateblock. */ + device->stateBlock->state.viewport.Height = device->render_targets[0]->currentDesc.Height; + device->stateBlock->state.viewport.Width = device->render_targets[0]->currentDesc.Width; + device->stateBlock->state.viewport.X = 0; + device->stateBlock->state.viewport.Y = 0; + device->stateBlock->state.viewport.MaxZ = 1.0f; + device->stateBlock->state.viewport.MinZ = 0.0f; + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_VIEWPORT); + + device->stateBlock->state.scissor_rect.top = 0; + device->stateBlock->state.scissor_rect.left = 0; + device->stateBlock->state.scissor_rect.right = device->stateBlock->state.viewport.Width; + device->stateBlock->state.scissor_rect.bottom = device->stateBlock->state.viewport.Height; + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SCISSORRECT); + } + return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_SetDepthStencilSurface(IWineD3DDevice *iface, IWineD3DSurface *pNewZStencil) { +static HRESULT WINAPI IWineD3DDeviceImpl_SetDepthStencilSurface(IWineD3DDevice *iface, IWineD3DSurface *depth_stencil) +{ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DSurfaceImpl *tmp; - TRACE("device %p, depth_stencil %p, old depth_stencil %p.\n", This, pNewZStencil, This->depth_stencil); + TRACE("device %p, depth_stencil %p, old depth_stencil %p.\n", This, depth_stencil, This->depth_stencil); - if (This->depth_stencil == (IWineD3DSurfaceImpl *)pNewZStencil) + if (This->depth_stencil == (IWineD3DSurfaceImpl *)depth_stencil) { TRACE("Trying to do a NOP SetRenderTarget operation.\n"); return WINED3D_OK; @@ -5941,11 +5751,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetDepthStencilSurface(IWineD3DDevice * } tmp = This->depth_stencil; - This->depth_stencil = (IWineD3DSurfaceImpl *)pNewZStencil; + This->depth_stencil = (IWineD3DSurfaceImpl *)depth_stencil; if (This->depth_stencil) IWineD3DSurface_AddRef((IWineD3DSurface *)This->depth_stencil); if (tmp) IWineD3DSurface_Release((IWineD3DSurface *)tmp); - if ((!tmp && pNewZStencil) || (!pNewZStencil && tmp)) + if ((!tmp && depth_stencil) || (!depth_stencil && tmp)) { /* Swapping NULL / non NULL depth stencil affects the depth and tests */ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZENABLE)); @@ -5956,14 +5766,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetDepthStencilSurface(IWineD3DDevice * return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* iface, UINT XHotSpot, - UINT YHotSpot, IWineD3DSurface *pCursorBitmap) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; - /* TODO: the use of Impl is deprecated. */ - IWineD3DSurfaceImpl * pSur = (IWineD3DSurfaceImpl *) pCursorBitmap; +static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice *iface, + UINT XHotSpot, UINT YHotSpot, IWineD3DSurface *cursor_image) +{ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + IWineD3DSurfaceImpl *s = (IWineD3DSurfaceImpl *)cursor_image; WINED3DLOCKED_RECT lockedRect; - TRACE("(%p) : Spot Pos(%u,%u)\n", This, XHotSpot, YHotSpot); + TRACE("iface %p, hotspot_x %u, hotspot_y %u, cursor_image %p.\n", + iface, XHotSpot, YHotSpot, cursor_image); /* some basic validation checks */ if (This->cursorTexture) @@ -5976,25 +5787,28 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i This->cursorTexture = 0; } - if ( (pSur->currentDesc.Width == 32) && (pSur->currentDesc.Height == 32) ) + if ((s->currentDesc.Width == 32) && (s->currentDesc.Height == 32)) This->haveHardwareCursor = TRUE; else This->haveHardwareCursor = FALSE; - if(pCursorBitmap) { + if (cursor_image) + { WINED3DLOCKED_RECT rect; /* MSDN: Cursor must be A8R8G8B8 */ - if (pSur->resource.format_desc->format != WINED3DFMT_B8G8R8A8_UNORM) + if (s->resource.format->id != WINED3DFMT_B8G8R8A8_UNORM) { - ERR("(%p) : surface(%p) has an invalid format\n", This, pCursorBitmap); + WARN("surface %p has an invalid format.\n", cursor_image); return WINED3DERR_INVALIDCALL; } /* MSDN: Cursor must be smaller than the display mode */ - if(pSur->currentDesc.Width > This->ddraw_width || - pSur->currentDesc.Height > This->ddraw_height) { - ERR("(%p) : Surface(%p) is %dx%d pixels, but screen res is %dx%d\n", This, pSur, pSur->currentDesc.Width, pSur->currentDesc.Height, This->ddraw_width, This->ddraw_height); + if (s->currentDesc.Width > This->ddraw_width + || s->currentDesc.Height > This->ddraw_height) + { + WARN("Surface %p dimensions are %ux%u, but screen dimensions are %ux%u.\n", + s, s->currentDesc.Width, s->currentDesc.Height, This->ddraw_width, This->ddraw_height); return WINED3DERR_INVALIDCALL; } @@ -6007,20 +5821,20 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i * creating circular refcount dependencies. Copy out the gl texture * instead. */ - This->cursorWidth = pSur->currentDesc.Width; - This->cursorHeight = pSur->currentDesc.Height; - if (SUCCEEDED(IWineD3DSurface_LockRect(pCursorBitmap, &rect, NULL, WINED3DLOCK_READONLY))) + This->cursorWidth = s->currentDesc.Width; + This->cursorHeight = s->currentDesc.Height; + if (SUCCEEDED(IWineD3DSurface_LockRect(cursor_image, &rect, NULL, WINED3DLOCK_READONLY))) { const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; - const struct wined3d_format_desc *format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info); + const struct wined3d_format *format = wined3d_get_format(gl_info, WINED3DFMT_B8G8R8A8_UNORM); struct wined3d_context *context; char *mem, *bits = rect.pBits; - GLint intfmt = format_desc->glInternal; - GLint format = format_desc->glFormat; - GLint type = format_desc->glType; + GLint intfmt = format->glInternal; + GLint gl_format = format->glFormat; + GLint type = format->glType; INT height = This->cursorHeight; INT width = This->cursorWidth; - INT bpp = format_desc->byte_count; + INT bpp = format->byte_count; DWORD sampler; INT i; @@ -6029,7 +5843,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i mem = HeapAlloc(GetProcessHeap(), 0, width * height * bpp); for(i = 0; i < height; i++) memcpy(&mem[width * bpp * i], &bits[rect.Pitch * i], width * bpp); - IWineD3DSurface_UnlockRect(pCursorBitmap); + IWineD3DSurface_UnlockRect(cursor_image); context = context_acquire(This, NULL); @@ -6055,7 +5869,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i glBindTexture(GL_TEXTURE_2D, This->cursorTexture); checkGLcall("glBindTexture"); /* Copy the bitmap memory into the cursor texture */ - glTexImage2D(GL_TEXTURE_2D, 0, intfmt, width, height, 0, format, type, mem); + glTexImage2D(GL_TEXTURE_2D, 0, intfmt, width, height, 0, gl_format, type, mem); HeapFree(GetProcessHeap(), 0, mem); checkGLcall("glTexImage2D"); @@ -6084,22 +5898,17 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i * 32-bit cursors. 32x32 bits split into 32-bit chunks == 32 * chunks. */ DWORD *maskBits = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - (pSur->currentDesc.Width * pSur->currentDesc.Height / 8)); - IWineD3DSurface_LockRect(pCursorBitmap, &lockedRect, NULL, - WINED3DLOCK_NO_DIRTY_UPDATE | - WINED3DLOCK_READONLY - ); - TRACE("width: %i height: %i\n", pSur->currentDesc.Width, - pSur->currentDesc.Height); + (s->currentDesc.Width * s->currentDesc.Height / 8)); + IWineD3DSurface_LockRect(cursor_image, &lockedRect, NULL, + WINED3DLOCK_NO_DIRTY_UPDATE | WINED3DLOCK_READONLY); + TRACE("width: %u height: %u.\n", s->currentDesc.Width, s->currentDesc.Height); cursorInfo.fIcon = FALSE; cursorInfo.xHotspot = XHotSpot; cursorInfo.yHotspot = YHotSpot; - cursorInfo.hbmMask = CreateBitmap(pSur->currentDesc.Width, pSur->currentDesc.Height, - 1, 1, maskBits); - cursorInfo.hbmColor = CreateBitmap(pSur->currentDesc.Width, pSur->currentDesc.Height, - 1, 32, lockedRect.pBits); - IWineD3DSurface_UnlockRect(pCursorBitmap); + cursorInfo.hbmMask = CreateBitmap(s->currentDesc.Width, s->currentDesc.Height, 1, 1, maskBits); + cursorInfo.hbmColor = CreateBitmap(s->currentDesc.Width, s->currentDesc.Height, 1, 32, lockedRect.pBits); + IWineD3DSurface_UnlockRect(cursor_image); /* Create our cursor and clean up. */ cursor = CreateIconIndirect(&cursorInfo); SetCursor(cursor); @@ -6174,6 +5983,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_EvictManagedResources(IWineD3DDevice *i TRACE("iface %p.\n", iface); IWineD3DDevice_EnumResources(iface, evict_managed_resource, NULL); + /* Invalidate stream sources, the buffer(s) may have been evicted. */ + IWineD3DDeviceImpl_MarkStateDirty((IWineD3DDeviceImpl *)iface, STATE_STREAMSRC); + return WINED3D_OK; } @@ -6196,7 +6008,7 @@ static HRESULT updateSurfaceDesc(IWineD3DSurfaceImpl *surface, const WINED3DPRES surface->currentDesc.Width = pPresentationParameters->BackBufferWidth; surface->currentDesc.Height = pPresentationParameters->BackBufferHeight; if (gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO] || gl_info->supported[ARB_TEXTURE_RECTANGLE] - || gl_info->supported[WINE_NORMALIZED_TEXRECT]) + || gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT]) { surface->pow2Width = pPresentationParameters->BackBufferWidth; surface->pow2Height = pPresentationParameters->BackBufferHeight; @@ -6270,6 +6082,7 @@ static BOOL is_display_mode_supported(IWineD3DDeviceImpl *This, const WINED3DPRE return FALSE; } +/* Do not call while under the GL lock. */ static void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChainImpl *swapchain) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; @@ -6314,6 +6127,7 @@ static void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChainImpl swapchain->num_contexts = 0; } +/* Do not call while under the GL lock. */ static HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChainImpl *swapchain) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; @@ -6378,7 +6192,10 @@ err: return hr; } -static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRESENT_PARAMETERS* pPresentationParameters) { +/* Do not call while under the GL lock. */ +static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice *iface, + WINED3DPRESENT_PARAMETERS *pPresentationParameters) +{ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; IWineD3DSwapChainImpl *swapchain; HRESULT hr; @@ -6429,18 +6246,19 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE swapchain->presentParms.FullScreen_RefreshRateInHz = pPresentationParameters->FullScreen_RefreshRateInHz; /* What to do about these? */ - if(pPresentationParameters->BackBufferCount != 0 && - pPresentationParameters->BackBufferCount != swapchain->presentParms.BackBufferCount) { + if (pPresentationParameters->BackBufferCount + && pPresentationParameters->BackBufferCount != swapchain->presentParms.BackBufferCount) ERR("Cannot change the back buffer count yet\n"); - } + if(pPresentationParameters->BackBufferFormat != WINED3DFMT_UNKNOWN && pPresentationParameters->BackBufferFormat != swapchain->presentParms.BackBufferFormat) { ERR("Cannot change the back buffer format yet\n"); } - if(pPresentationParameters->hDeviceWindow != NULL && - pPresentationParameters->hDeviceWindow != swapchain->presentParms.hDeviceWindow) { + + if (pPresentationParameters->hDeviceWindow + && pPresentationParameters->hDeviceWindow != swapchain->presentParms.hDeviceWindow) ERR("Cannot change the device window yet\n"); - } + if (pPresentationParameters->EnableAutoDepthStencil && !This->auto_depth_stencil) { HRESULT hrc; @@ -6448,7 +6266,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE TRACE("Creating the depth stencil buffer\n"); hrc = IWineD3DDeviceParent_CreateDepthStencilSurface(This->device_parent, - This->parent, pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight, pPresentationParameters->AutoDepthStencilFormat, @@ -6495,9 +6312,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE } /* Should Width == 800 && Height == 0 set 800x600? */ - if(pPresentationParameters->BackBufferWidth != 0 && pPresentationParameters->BackBufferHeight != 0 && - (pPresentationParameters->BackBufferWidth != swapchain->presentParms.BackBufferWidth || - pPresentationParameters->BackBufferHeight != swapchain->presentParms.BackBufferHeight)) + if (pPresentationParameters->BackBufferWidth && pPresentationParameters->BackBufferHeight + && (pPresentationParameters->BackBufferWidth != swapchain->presentParms.BackBufferWidth + || pPresentationParameters->BackBufferHeight != swapchain->presentParms.BackBufferHeight)) { UINT i; @@ -6537,15 +6354,30 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE if (!pPresentationParameters->Windowed != !swapchain->presentParms.Windowed || DisplayModeChanged) { + BOOL filter = This->filter_messages; + This->filter_messages = TRUE; + IWineD3DDevice_SetDisplayMode(iface, 0, &mode); if (!pPresentationParameters->Windowed) { - if(swapchain->presentParms.Windowed) { + if (swapchain->presentParms.Windowed) + { + HWND focus_window = This->createParms.hFocusWindow; + if (!focus_window) focus_window = pPresentationParameters->hDeviceWindow; + if (FAILED(hr = IWineD3DDevice_AcquireFocusWindow(iface, focus_window))) + { + ERR("Failed to acquire focus window, hr %#x.\n", hr); + IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain); + return hr; + } + /* switch from windowed to fs */ swapchain_setup_fullscreen_window(swapchain, pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight); - } else { + } + else + { /* Fullscreen -> fullscreen mode change */ MoveWindow(swapchain->device_window, 0, 0, pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight, @@ -6556,9 +6388,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE { /* Fullscreen -> windowed switch */ swapchain_restore_fullscreen_window(swapchain); + IWineD3DDevice_ReleaseFocusWindow(iface); } swapchain->presentParms.Windowed = pPresentationParameters->Windowed; - } else if(!pPresentationParameters->Windowed) { + + This->filter_messages = filter; + } + else if (!pPresentationParameters->Windowed) + { DWORD style = This->style, exStyle = This->exStyle; /* If we're in fullscreen, and the mode wasn't changed, we have to get the window back into * the right position. Some applications(Battlefield 2, Guild Wars) move it and then call @@ -6573,16 +6410,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE } /* Note: No parent needed for initial internal stateblock */ - hr = IWineD3DDevice_CreateStateBlock(iface, WINED3DSBT_INIT, (IWineD3DStateBlock **)&This->stateBlock, NULL); + hr = IWineD3DDevice_CreateStateBlock(iface, WINED3DSBT_INIT, (IWineD3DStateBlock **)&This->stateBlock); if (FAILED(hr)) ERR("Resetting the stateblock failed with error 0x%08x\n", hr); else TRACE("Created stateblock %p\n", This->stateBlock); This->updateStateBlock = This->stateBlock; IWineD3DStateBlock_AddRef((IWineD3DStateBlock *)This->updateStateBlock); - hr = IWineD3DStateBlock_InitStartupStateBlock((IWineD3DStateBlock *) This->stateBlock); - if(FAILED(hr)) { - ERR("Resetting the stateblock failed with error 0x%08x\n", hr); - } + stateblock_init_default_state(This->stateBlock); if(wined3d_settings.offscreen_rendering_mode == ORM_FBO) { @@ -6682,100 +6516,103 @@ static void device_resource_remove(IWineD3DDeviceImpl *This, IWineD3DResource *r list_remove(&((IWineD3DResourceImpl *) resource)->resource.resource_list_entry); } -void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource) +void device_resource_released(IWineD3DDeviceImpl *device, IWineD3DResource *resource) { WINED3DRESOURCETYPE type = IWineD3DResource_GetType(resource); - int counter; + unsigned int i; - TRACE("(%p) : resource %p\n", This, resource); + TRACE("device %p, resource %p, type %s.\n", device, resource, debug_d3dresourcetype(type)); - context_resource_released((IWineD3DDevice *)This, resource, type); + context_resource_released(device, resource, type); - switch (type) { - /* TODO: check front and back buffers, rendertargets etc.. possibly swapchains? */ - case WINED3DRTYPE_SURFACE: { - unsigned int i; + switch (type) + { + case WINED3DRTYPE_SURFACE: + if (!device->d3d_initialized) break; - if (This->d3d_initialized) + for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i) { - for (i = 0; i < This->adapter->gl_info.limits.buffers; ++i) + if (device->render_targets[i] == (IWineD3DSurfaceImpl *)resource) { - if (This->render_targets[i] == (IWineD3DSurfaceImpl *)resource) - This->render_targets[i] = NULL; + ERR("Surface %p is still in use as render target %u.\n", resource, i); + device->render_targets[i] = NULL; } - if (This->depth_stencil == (IWineD3DSurfaceImpl *)resource) - This->depth_stencil = NULL; } + if (device->depth_stencil == (IWineD3DSurfaceImpl *)resource) + { + ERR("Surface %p is still in use as depth/stencil buffer.\n", resource); + device->depth_stencil = NULL; + } break; - } + case WINED3DRTYPE_TEXTURE: case WINED3DRTYPE_CUBETEXTURE: case WINED3DRTYPE_VOLUMETEXTURE: - for (counter = 0; counter < MAX_COMBINED_SAMPLERS; counter++) { - if (This->stateBlock != NULL && This->stateBlock->textures[counter] == (IWineD3DBaseTexture *)resource) { - WARN("Texture being released is still by a stateblock, Stage = %u Texture = %p\n", counter, resource); - This->stateBlock->textures[counter] = NULL; - } - if (This->updateStateBlock != This->stateBlock ){ - if (This->updateStateBlock->textures[counter] == (IWineD3DBaseTexture *)resource) { - WARN("Texture being released is still by a stateblock, Stage = %u Texture = %p\n", counter, resource); - This->updateStateBlock->textures[counter] = NULL; - } - } + for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i) + { + if (device->stateBlock && device->stateBlock->state.textures[i] == (IWineD3DBaseTextureImpl *)resource) + { + ERR("Texture %p is still in use by stateblock %p, stage %u.\n", + resource, device->stateBlock, i); + device->stateBlock->state.textures[i] = NULL; } - break; - case WINED3DRTYPE_VOLUME: - /* TODO: nothing really? */ - break; + + if (device->updateStateBlock != device->stateBlock + && device->updateStateBlock->state.textures[i] == (IWineD3DBaseTextureImpl *)resource) + { + ERR("Texture %p is still in use by stateblock %p, stage %u.\n", + resource, device->updateStateBlock, i); + device->updateStateBlock->state.textures[i] = NULL; + } + } + break; + case WINED3DRTYPE_BUFFER: - { - int streamNumber; - TRACE("Cleaning up stream pointers\n"); + for (i = 0; i < MAX_STREAMS; ++i) + { + if (device->stateBlock + && device->stateBlock->state.streams[i].buffer == (struct wined3d_buffer *)resource) + { + ERR("Buffer %p is still in use by stateblock %p, stream %u.\n", + resource, device->stateBlock, i); + device->stateBlock->state.streams[i].buffer = NULL; + } - for(streamNumber = 0; streamNumber < MAX_STREAMS; streamNumber ++){ - /* FINDOUT: should a warn be generated if were recording and updateStateBlock->streamSource is lost? - FINDOUT: should changes.streamSource[StreamNumber] be set ? - */ - if (This->updateStateBlock != NULL ) { /* ==NULL when device is being destroyed */ - if ((IWineD3DResource *)This->updateStateBlock->streamSource[streamNumber] == resource) { - FIXME("Vertex buffer released while bound to a state block, stream %d\n", streamNumber); - This->updateStateBlock->streamSource[streamNumber] = 0; - /* Set changed flag? */ - } - } - if (This->stateBlock != NULL ) { /* only happens if there is an error in the application, or on reset/release (because we don't manage internal tracking properly) */ - if ((IWineD3DResource *)This->stateBlock->streamSource[streamNumber] == resource) { - TRACE("Vertex buffer released while bound to a state block, stream %d\n", streamNumber); - This->stateBlock->streamSource[streamNumber] = 0; - } + if (device->updateStateBlock != device->stateBlock + && device->updateStateBlock->state.streams[i].buffer == (struct wined3d_buffer *)resource) + { + ERR("Buffer %p is still in use by stateblock %p, stream %u.\n", + resource, device->updateStateBlock, i); + device->updateStateBlock->state.streams[i].buffer = NULL; } + } - if (This->updateStateBlock != NULL ) { /* ==NULL when device is being destroyed */ - if (This->updateStateBlock->pIndexData == (IWineD3DBuffer *)resource) { - This->updateStateBlock->pIndexData = NULL; - } + if (device->stateBlock && device->stateBlock->state.index_buffer == (struct wined3d_buffer *)resource) + { + ERR("Buffer %p is still in use by stateblock %p as index buffer.\n", + resource, device->stateBlock); + device->stateBlock->state.index_buffer = NULL; } - if (This->stateBlock != NULL ) { /* ==NULL when device is being destroyed */ - if (This->stateBlock->pIndexData == (IWineD3DBuffer *)resource) { - This->stateBlock->pIndexData = NULL; - } + + if (device->updateStateBlock != device->stateBlock + && device->updateStateBlock->state.index_buffer == (struct wined3d_buffer *)resource) + { + ERR("Buffer %p is still in use by stateblock %p as index buffer.\n", + resource, device->updateStateBlock); + device->updateStateBlock->state.index_buffer = NULL; } - } - break; + break; default: - FIXME("(%p) unknown resource type %p %u\n", This, resource, IWineD3DResource_GetType(resource)); - break; + break; } - /* Remove the resource from the resourceStore */ - device_resource_remove(This, resource); - - TRACE("Resource released\n"); + device_resource_remove(device, resource); + TRACE("Resource released.\n"); } static HRESULT WINAPI IWineD3DDeviceImpl_EnumResources(IWineD3DDevice *iface, D3DCB_ENUMRESOURCES pCallback, void *pData) { @@ -6829,7 +6666,6 @@ static const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl = IWineD3DDeviceImpl_AddRef, IWineD3DDeviceImpl_Release, /*** IWineD3DDevice methods ***/ - IWineD3DDeviceImpl_GetParent, /*** Creation methods**/ IWineD3DDeviceImpl_CreateBuffer, IWineD3DDeviceImpl_CreateVertexBuffer, @@ -6908,7 +6744,6 @@ static const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl = IWineD3DDeviceImpl_GetRenderState, IWineD3DDeviceImpl_SetRenderTarget, IWineD3DDeviceImpl_GetRenderTarget, - IWineD3DDeviceImpl_SetFrontBackBuffers, IWineD3DDeviceImpl_SetSamplerState, IWineD3DDeviceImpl_GetSamplerState, IWineD3DDeviceImpl_SetScissorRect, @@ -6974,7 +6809,7 @@ static const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl = HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d, UINT adapter_idx, WINED3DDEVTYPE device_type, HWND focus_window, DWORD flags, - IUnknown *parent, IWineD3DDeviceParent *device_parent) + IWineD3DDeviceParent *device_parent) { struct wined3d_adapter *adapter = &wined3d->adapters[adapter_idx]; const struct fragment_pipeline *fragment_pipeline; @@ -6989,7 +6824,6 @@ HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d, device->wined3d = (IWineD3D *)wined3d; IWineD3D_AddRef(device->wined3d); device->adapter = wined3d->adapter_count ? adapter : NULL; - device->parent = parent; device->device_parent = device_parent; list_init(&device->resources); list_init(&device->shaders); diff --git a/dll/directx/wine/wined3d/directx.c b/dll/directx/wine/wined3d/directx.c index 29061476ddd..1df2eaa8082 100644 --- a/dll/directx/wine/wined3d/directx.c +++ b/dll/directx/wine/wined3d/directx.c @@ -77,6 +77,7 @@ static const struct { {"GL_ARB_sync", ARB_SYNC, 0 }, {"GL_ARB_texture_border_clamp", ARB_TEXTURE_BORDER_CLAMP, 0 }, {"GL_ARB_texture_compression", ARB_TEXTURE_COMPRESSION, 0 }, + {"GL_ARB_texture_compression_rgtc", ARB_TEXTURE_COMPRESSION_RGTC, 0 }, {"GL_ARB_texture_cube_map", ARB_TEXTURE_CUBE_MAP, 0 }, {"GL_ARB_texture_env_add", ARB_TEXTURE_ENV_ADD, 0 }, {"GL_ARB_texture_env_combine", ARB_TEXTURE_ENV_COMBINE, 0 }, @@ -104,6 +105,7 @@ static const struct { {"GL_EXT_blend_equation_separate", EXT_BLEND_EQUATION_SEPARATE, 0 }, {"GL_EXT_blend_func_separate", EXT_BLEND_FUNC_SEPARATE, 0 }, {"GL_EXT_blend_minmax", EXT_BLEND_MINMAX, 0 }, + {"GL_EXT_depth_bounds_test", EXT_DEPTH_BOUNDS_TEST, 0 }, {"GL_EXT_draw_buffers2", EXT_DRAW_BUFFERS2, 0 }, {"GL_EXT_fog_coord", EXT_FOG_COORD, 0 }, {"GL_EXT_framebuffer_blit", EXT_FRAMEBUFFER_BLIT, 0 }, @@ -138,6 +140,7 @@ static const struct { {"GL_NV_fragment_program_option", NV_FRAGMENT_PROGRAM_OPTION, 0 }, {"GL_NV_half_float", NV_HALF_FLOAT, 0 }, {"GL_NV_light_max_exponent", NV_LIGHT_MAX_EXPONENT, 0 }, + {"GL_NV_point_sprite", NV_POINT_SPRITE, 0 }, {"GL_NV_register_combiners", NV_REGISTER_COMBINERS, 0 }, {"GL_NV_register_combiners2", NV_REGISTER_COMBINERS2, 0 }, {"GL_NV_texgen_reflection", NV_TEXGEN_REFLECTION, 0 }, @@ -158,8 +161,6 @@ static const struct { * Utility functions follow **********************************************************/ -static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, WINED3DFORMAT AdapterFormat, DWORD Usage, WINED3DRESOURCETYPE RType, WINED3DFORMAT CheckFormat, WINED3DSURFTYPE SurfaceType); - const struct min_lookup minMipLookup[] = { /* NONE POINT LINEAR */ @@ -243,6 +244,7 @@ static void WineD3D_ReleaseFakeGLContext(struct wined3d_fake_gl_ctx *ctx) } } +/* Do not call while under the GL lock. */ static BOOL WineD3D_CreateFakeGLContext(struct wined3d_fake_gl_ctx *ctx) { PIXELFORMATDESCRIPTOR pfd; @@ -337,7 +339,7 @@ unsigned int WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *device, unsigned int static void wined3d_adapter_cleanup(struct wined3d_adapter *adapter) { - HeapFree(GetProcessHeap(), 0, adapter->gl_info.gl_formats); + HeapFree(GetProcessHeap(), 0, adapter->gl_info.formats); HeapFree(GetProcessHeap(), 0, adapter->cfgs); } @@ -374,7 +376,9 @@ static ULONG WINAPI IWineD3DImpl_Release(IWineD3D *iface) { ULONG ref; TRACE("(%p) : Releasing from %d\n", This, This->ref); ref = InterlockedDecrement(&This->ref); - if (ref == 0) { + + if (!ref) + { unsigned int i; for (i = 0; i < This->adapter_count; ++i) @@ -413,7 +417,8 @@ static inline BOOL test_arb_vs_offset_limit(const struct wined3d_gl_info *gl_inf GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prog)); GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(testcode), testcode)); - if(glGetError() != 0) { + if (glGetError()) + { TRACE("OpenGL implementation does not allow indirect addressing offsets > 63\n"); TRACE("error: %s\n", debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); ret = TRUE; @@ -452,7 +457,9 @@ static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, const char *gl { if (card_vendor == HW_VENDOR_NVIDIA) { - if (device == CARD_NVIDIA_GEFORCEFX_5800 || device == CARD_NVIDIA_GEFORCEFX_5600) + if (device == CARD_NVIDIA_GEFORCEFX_5200 || + device == CARD_NVIDIA_GEFORCEFX_5600 || + device == CARD_NVIDIA_GEFORCEFX_5800) { return TRUE; } @@ -707,7 +714,7 @@ static BOOL match_fbo_tex_update(const struct wined3d_gl_info *gl_info, const ch glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data); checkGLcall("glTexSubImage2D"); - glClearColor(0.996, 0.729, 0.745, 0.792); + glClearColor(0.996f, 0.729f, 0.745f, 0.792f); glClear(GL_COLOR_BUFFER_BIT); checkGLcall("glClear"); @@ -786,7 +793,7 @@ static void quirk_ati_dx9(struct wined3d_gl_info *gl_info) { TRACE("GL_ARB_texture_non_power_of_two advertised on R500 or earlier card, removing.\n"); gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO] = FALSE; - gl_info->supported[WINE_NORMALIZED_TEXRECT] = TRUE; + gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT] = TRUE; } /* fglrx has the same structural issues as the one described in quirk_apple_glsl_constants, although @@ -960,89 +967,183 @@ static const struct driver_quirk quirk_table[] = * 7 -> Vista * 8 -> Win 7 * - * "y" is the Direct3D level the driver supports: + * "y" is the maximum Direct3D version the driver supports. + * y -> d3d version mapping: * 11 -> d3d6 * 12 -> d3d7 * 13 -> d3d8 * 14 -> d3d9 * 15 -> d3d10 + * 16 -> d3d10.1 + * 17 -> d3d11 * - * "z" is unknown, possibly vendor specific. + * "z" is the subversion number. * - * "w" is the vendor specific driver version. + * "w" is the vendor specific driver build number. */ + struct driver_version_information +{ + enum wined3d_display_driver driver; + enum wined3d_driver_model driver_model; + const char *driver_name; /* name of Windows driver */ + WORD version; /* version word ('y'), contained in low word of DriverVersion.HighPart */ + WORD subversion; /* subversion word ('z'), contained in high word of DriverVersion.LowPart */ + WORD build; /* build number ('w'), contained in low word of DriverVersion.LowPart */ +}; + +/* The driver version table contains driver information for different devices on several OS versions. */ +static const struct driver_version_information driver_version_table[] = +{ + /* ATI + * - Radeon HD2x00 (R600) and up supported by current drivers. + * - Radeon 9500 (R300) - X1*00 (R5xx) supported upto Catalyst 9.3 (Linux) and 10.2 (XP/Vista/Win7) + * - Radeon 7xxx (R100) - 9250 (RV250) supported upto Catalyst 6.11 (XP) + * - Rage 128 supported upto XP, latest official build 6.13.3279 dated October 2001 */ + {DRIVER_ATI_RAGE_128PRO, DRIVER_MODEL_NT5X, "ati2dvaa.dll", 13, 3279, 0}, + {DRIVER_ATI_R100, DRIVER_MODEL_NT5X, "ati2dvag.dll", 14, 10, 6614}, + {DRIVER_ATI_R300, DRIVER_MODEL_NT5X, "ati2dvag.dll", 14, 10, 6764}, + {DRIVER_ATI_R600, DRIVER_MODEL_NT5X, "ati2dvag.dll", 14, 10, 8681}, + {DRIVER_ATI_R300, DRIVER_MODEL_NT6X, "atiumdag.dll", 14, 10, 741 }, + {DRIVER_ATI_R600, DRIVER_MODEL_NT6X, "atiumdag.dll", 14, 10, 741 }, + + /* Intel + * The drivers are unified but not all versions support all GPUs. At some point the 2k/xp + * drivers used ialmrnt5.dll for GMA800/GMA900 but at some point the file was renamed to + * igxprd32.dll but the GMA800 driver was never updated. */ + {DRIVER_INTEL_GMA800, DRIVER_MODEL_NT5X, "ialmrnt5.dll", 14, 10, 3889}, + {DRIVER_INTEL_GMA900, DRIVER_MODEL_NT5X, "igxprd32.dll", 14, 10, 4764}, + {DRIVER_INTEL_GMA950, DRIVER_MODEL_NT5X, "igxprd32.dll", 14, 10, 4926}, + {DRIVER_INTEL_GMA3000, DRIVER_MODEL_NT5X, "igxprd32.dll", 14, 10, 5218}, + {DRIVER_INTEL_GMA950, DRIVER_MODEL_NT6X, "igdumd32.dll", 14, 10, 1504}, + {DRIVER_INTEL_GMA3000, DRIVER_MODEL_NT6X, "igdumd32.dll", 15, 10, 1666}, + + /* Nvidia + * - Geforce6 and newer cards are supported by the current driver (197.x) on XP-Win7 + * - GeforceFX support is up to 173.x on <= XP + * - Geforce2MX/3/4 up to 96.x on <= XP + * - TNT/Geforce1/2 up to 71.x on <= XP + * All version numbers used below are from the Linux nvidia drivers. */ + {DRIVER_NVIDIA_TNT, DRIVER_MODEL_NT5X, "nv4_disp.dll", 14, 10, 7186}, + {DRIVER_NVIDIA_GEFORCE2MX, DRIVER_MODEL_NT5X, "nv4_disp.dll", 14, 10, 9371}, + {DRIVER_NVIDIA_GEFORCEFX, DRIVER_MODEL_NT5X, "nv4_disp.dll", 14, 11, 7516}, + {DRIVER_NVIDIA_GEFORCE6, DRIVER_MODEL_NT5X, "nv4_disp.dll", 15, 11, 9745}, + {DRIVER_NVIDIA_GEFORCE6, DRIVER_MODEL_NT6X, "nvd3dum.dll", 15, 11, 9745}, +}; + +struct gpu_description { WORD vendor; /* reported PCI card vendor ID */ WORD card; /* reported PCI card device ID */ const char *description; /* Description of the card e.g. NVIDIA RIVA TNT */ - WORD d3d_level; /* driver hiword to report */ - WORD lopart_hi, lopart_lo; /* driver loword to report */ + enum wined3d_display_driver driver; + unsigned int vidmem; }; -static const struct driver_version_information driver_version_table[] = +/* The amount of video memory stored in the gpu description table is the minimum amount of video memory + * found on a board containing a specific GPU. */ +static const struct gpu_description gpu_description_table[] = { - /* Nvidia drivers. Geforce6 and newer cards are supported by the current driver (180.x) - * GeforceFX support is up to 173.x, - driver uses numbering x.y.11.7341 for 173.41 where x is the windows revision (6=2000/xp, 7=vista), y is unknown - * Geforce2MX/3/4 up to 96.x - driver uses numbering 9.6.8.9 for 96.89 - * TNT/Geforce1/2 up to 71.x - driver uses numbering 7.1.8.6 for 71.86 - * - * All version numbers used below are from the Linux nvidia drivers. */ - {HW_VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT, "NVIDIA RIVA TNT", 1, 8, 6 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT2, "NVIDIA RIVA TNT2/TNT2 Pro", 1, 8, 6 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE, "NVIDIA GeForce 256", 1, 8, 6 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2_MX, "NVIDIA GeForce2 MX/MX 400", 6, 4, 3 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2, "NVIDIA GeForce2 GTS/GeForce2 Pro", 1, 8, 6 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE3, "NVIDIA GeForce3", 6, 10, 9371 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_MX, "NVIDIA GeForce4 MX 460", 6, 10, 9371 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_TI4200, "NVIDIA GeForce4 Ti 4200", 6, 10, 9371 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5200, "NVIDIA GeForce FX 5200", 15, 11, 7516 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5600, "NVIDIA GeForce FX 5600", 15, 11, 7516 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5800, "NVIDIA GeForce FX 5800", 15, 11, 7516 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6200, "NVIDIA GeForce 6200", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6600GT, "NVIDIA GeForce 6600 GT", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6800, "NVIDIA GeForce 6800", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7300, "NVIDIA GeForce Go 7300", 15, 11, 8585 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7400, "NVIDIA GeForce Go 7400", 15, 11, 8585 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7600, "NVIDIA GeForce 7600 GT", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7800GT, "NVIDIA GeForce 7800 GT", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8300GS, "NVIDIA GeForce 8300 GS", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600GT, "NVIDIA GeForce 8600 GT", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600MGT, "NVIDIA GeForce 8600M GT", 15, 11, 8585 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8800GTS, "NVIDIA GeForce 8800 GTS", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9200, "NVIDIA GeForce 9200", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9400GT, "NVIDIA GeForce 9400 GT", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9500GT, "NVIDIA GeForce 9500 GT", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9600GT, "NVIDIA GeForce 9600 GT", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9800GT, "NVIDIA GeForce 9800 GT", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX260, "NVIDIA GeForce GTX 260", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX275, "NVIDIA GeForce GTX 275", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX280, "NVIDIA GeForce GTX 280", 15, 11, 8618 }, - {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT240, "NVIDIA GeForce GT 240", 15, 11, 8618 }, - - /* ATI cards. The driver versions are somewhat similar, but not quite the same. Let's hardcode. */ - {HW_VENDOR_ATI, CARD_ATI_RADEON_9500, "ATI Radeon 9500", 14, 10, 6764 }, - {HW_VENDOR_ATI, CARD_ATI_RADEON_X700, "ATI Radeon X700 SE", 14, 10, 6764 }, - {HW_VENDOR_ATI, CARD_ATI_RADEON_X1600, "ATI Radeon X1600 Series", 14, 10, 6764 }, - {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2350, "ATI Mobility Radeon HD 2350", 14, 10, 6764 }, - {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2600, "ATI Mobility Radeon HD 2600", 14, 10, 6764 }, - {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2900, "ATI Radeon HD 2900 XT", 14, 10, 6764 }, - {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4350, "ATI Radeon HD 4350", 14, 10, 6764 }, - {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4600, "ATI Radeon HD 4600 Series", 14, 10, 6764 }, - {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4700, "ATI Radeon HD 4700 Series", 14, 10, 6764 }, - {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4800, "ATI Radeon HD 4800 Series", 14, 10, 6764 }, - {HW_VENDOR_ATI, CARD_ATI_RADEON_HD5700, "ATI Radeon HD 5700 Series", 14, 10, 8681 }, - {HW_VENDOR_ATI, CARD_ATI_RADEON_HD5800, "ATI Radeon HD 5800 Series", 14, 10, 8681 }, - - /* TODO: Add information about legacy ATI hardware, Intel and other cards. */ + /* Nvidia cards */ + {HW_VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT, "NVIDIA RIVA TNT", DRIVER_NVIDIA_TNT, 16 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT2, "NVIDIA RIVA TNT2/TNT2 Pro", DRIVER_NVIDIA_TNT, 32 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE, "NVIDIA GeForce 256", DRIVER_NVIDIA_TNT, 32 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2, "NVIDIA GeForce2 GTS/GeForce2 Pro", DRIVER_NVIDIA_TNT, 32 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2_MX, "NVIDIA GeForce2 MX/MX 400", DRIVER_NVIDIA_GEFORCE2MX,32 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE3, "NVIDIA GeForce3", DRIVER_NVIDIA_GEFORCE2MX,64 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_MX, "NVIDIA GeForce4 MX 460", DRIVER_NVIDIA_GEFORCE2MX,64 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_TI4200, "NVIDIA GeForce4 Ti 4200", DRIVER_NVIDIA_GEFORCE2MX,64, }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5200, "NVIDIA GeForce FX 5200", DRIVER_NVIDIA_GEFORCEFX, 64 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5600, "NVIDIA GeForce FX 5600", DRIVER_NVIDIA_GEFORCEFX, 128 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5800, "NVIDIA GeForce FX 5800", DRIVER_NVIDIA_GEFORCEFX, 256 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6200, "NVIDIA GeForce 6200", DRIVER_NVIDIA_GEFORCE6, 64 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6600GT, "NVIDIA GeForce 6600 GT", DRIVER_NVIDIA_GEFORCE6, 128 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6800, "NVIDIA GeForce 6800", DRIVER_NVIDIA_GEFORCE6, 128 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7300, "NVIDIA GeForce Go 7300", DRIVER_NVIDIA_GEFORCE6, 256 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7400, "NVIDIA GeForce Go 7400", DRIVER_NVIDIA_GEFORCE6, 256 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7600, "NVIDIA GeForce 7600 GT", DRIVER_NVIDIA_GEFORCE6, 256 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7800GT, "NVIDIA GeForce 7800 GT", DRIVER_NVIDIA_GEFORCE6, 256 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8300GS, "NVIDIA GeForce 8300 GS", DRIVER_NVIDIA_GEFORCE6, 128 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8400GS, "NVIDIA GeForce 8400 GS", DRIVER_NVIDIA_GEFORCE6, 128 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600GT, "NVIDIA GeForce 8600 GT", DRIVER_NVIDIA_GEFORCE6, 256 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600MGT, "NVIDIA GeForce 8600M GT", DRIVER_NVIDIA_GEFORCE6, 512 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8800GTS, "NVIDIA GeForce 8800 GTS", DRIVER_NVIDIA_GEFORCE6, 320 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8800GTX, "NVIDIA GeForce 8800 GTX", DRIVER_NVIDIA_GEFORCE6, 768 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9200, "NVIDIA GeForce 9200", DRIVER_NVIDIA_GEFORCE6, 256 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9400GT, "NVIDIA GeForce 9400 GT", DRIVER_NVIDIA_GEFORCE6, 256 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9500GT, "NVIDIA GeForce 9500 GT", DRIVER_NVIDIA_GEFORCE6, 256 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9600GT, "NVIDIA GeForce 9600 GT", DRIVER_NVIDIA_GEFORCE6, 384 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9800GT, "NVIDIA GeForce 9800 GT", DRIVER_NVIDIA_GEFORCE6, 512 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_210, "NVIDIA GeForce 210", DRIVER_NVIDIA_GEFORCE6, 512 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT220, "NVIDIA GeForce GT 220", DRIVER_NVIDIA_GEFORCE6, 512 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT240, "NVIDIA GeForce GT 240", DRIVER_NVIDIA_GEFORCE6, 512 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX260, "NVIDIA GeForce GTX 260", DRIVER_NVIDIA_GEFORCE6, 1024}, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX275, "NVIDIA GeForce GTX 275", DRIVER_NVIDIA_GEFORCE6, 896 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX280, "NVIDIA GeForce GTX 280", DRIVER_NVIDIA_GEFORCE6, 1024}, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT325M, "NVIDIA GeForce GT 325M", DRIVER_NVIDIA_GEFORCE6, 1024}, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTS350M, "NVIDIA GeForce GTS 350M", DRIVER_NVIDIA_GEFORCE6, 1024}, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX460, "NVIDIA GeForce GTX 460", DRIVER_NVIDIA_GEFORCE6, 768 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX465, "NVIDIA GeForce GTX 465", DRIVER_NVIDIA_GEFORCE6, 1024}, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX470, "NVIDIA GeForce GTX 470", DRIVER_NVIDIA_GEFORCE6, 1280}, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX480, "NVIDIA GeForce GTX 480", DRIVER_NVIDIA_GEFORCE6, 1536}, + /* ATI cards */ + {HW_VENDOR_ATI, CARD_ATI_RAGE_128PRO, "ATI Rage Fury", DRIVER_ATI_RAGE_128PRO, 16 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_7200, "ATI RADEON 7200 SERIES", DRIVER_ATI_R100, 32 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_8500, "ATI RADEON 8500 SERIES", DRIVER_ATI_R100, 64 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_9500, "ATI Radeon 9500", DRIVER_ATI_R300, 64 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_XPRESS_200M, "ATI RADEON XPRESS 200M Series", DRIVER_ATI_R300, 64 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_X700, "ATI Radeon X700 SE", DRIVER_ATI_R300, 128 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_X1600, "ATI Radeon X1600 Series", DRIVER_ATI_R300, 128 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2350, "ATI Mobility Radeon HD 2350", DRIVER_ATI_R600, 256 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2600, "ATI Mobility Radeon HD 2600", DRIVER_ATI_R600, 256 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2900, "ATI Radeon HD 2900 XT", DRIVER_ATI_R600, 512 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD3200, "ATI Radeon HD 3200 Graphics", DRIVER_ATI_R600, 128 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4350, "ATI Radeon HD 4350", DRIVER_ATI_R600, 256 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4600, "ATI Radeon HD 4600 Series", DRIVER_ATI_R600, 512 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4700, "ATI Radeon HD 4700 Series", DRIVER_ATI_R600, 512 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4800, "ATI Radeon HD 4800 Series", DRIVER_ATI_R600, 512 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD5700, "ATI Radeon HD 5700 Series", DRIVER_ATI_R600, 512 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD5800, "ATI Radeon HD 5800 Series", DRIVER_ATI_R600, 1024}, + /* Intel cards */ + {HW_VENDOR_INTEL, CARD_INTEL_I830G, "Intel(R) 82830M Graphics Controller", DRIVER_INTEL_GMA800, 32 }, + {HW_VENDOR_INTEL, CARD_INTEL_I855G, "Intel(R) 82852/82855 GM/GME Graphics Controller", DRIVER_INTEL_GMA800, 32 }, + {HW_VENDOR_INTEL, CARD_INTEL_I865G, "Intel(R) 82865G Graphics Controller", DRIVER_INTEL_GMA800, 32 }, + {HW_VENDOR_INTEL, CARD_INTEL_I915G, "Intel(R) 82915G/GV/910GL Express Chipset Family", DRIVER_INTEL_GMA900, 64 }, + {HW_VENDOR_INTEL, CARD_INTEL_I915GM, "Mobile Intel(R) 915GM/GMS,910GML Express Chipset Family", DRIVER_INTEL_GMA900, 64 }, + {HW_VENDOR_INTEL, CARD_INTEL_I945GM, "Mobile Intel(R) 945GM Express Chipset Family", DRIVER_INTEL_GMA950, 64 }, + {HW_VENDOR_INTEL, CARD_INTEL_X3100, "Mobile Intel(R) 965 Express Chipset Family", DRIVER_INTEL_GMA3000, 128} }; +static const struct driver_version_information *get_driver_version_info(enum wined3d_display_driver driver, + enum wined3d_driver_model driver_model) +{ + unsigned int i; + + TRACE("Looking up version info for driver=%d driver_model=%d\n", driver, driver_model); + for (i = 0; i < (sizeof(driver_version_table) / sizeof(driver_version_table[0])); i++) + { + const struct driver_version_information *entry = &driver_version_table[i]; + + if (entry->driver == driver && entry->driver_model == driver_model) + { + TRACE_(d3d_caps)("Found driver '%s' version=%d subversion=%d build=%d\n", + entry->driver_name, entry->version, entry->subversion, entry->build); + + return entry; + } + } + return NULL; +} + static void init_driver_info(struct wined3d_driver_info *driver_info, enum wined3d_pci_vendor vendor, enum wined3d_pci_device device) { OSVERSIONINFOW os_version; WORD driver_os_version; unsigned int i; + enum wined3d_display_driver driver = DRIVER_UNKNOWN; + enum wined3d_driver_model driver_model; + const struct driver_version_information *version_info; if (wined3d_settings.pci_vendor_id != PCI_VENDOR_NONE) { @@ -1058,22 +1159,9 @@ static void init_driver_info(struct wined3d_driver_info *driver_info, } driver_info->device = device; - switch (vendor) - { - case HW_VENDOR_ATI: - driver_info->name = "ati2dvag.dll"; - break; - - case HW_VENDOR_NVIDIA: - driver_info->name = "nv4_disp.dll"; - break; - - case HW_VENDOR_INTEL: - default: - FIXME_(d3d_caps)("Unhandled vendor %04x.\n", vendor); - driver_info->name = "Display"; - break; - } + /* Set a default amount of video memory (64MB). In general this code isn't used unless the user + * overrides the pci ids to a card which is not in our database. */ + driver_info->vidmem = WINE_DEFAULT_VIDMEM; memset(&os_version, 0, sizeof(os_version)); os_version.dwOSVersionInfoSize = sizeof(os_version); @@ -1081,6 +1169,7 @@ static void init_driver_info(struct wined3d_driver_info *driver_info, { ERR("Failed to get OS version, reporting 2000/XP.\n"); driver_os_version = 6; + driver_model = DRIVER_MODEL_NT5X; } else { @@ -1088,17 +1177,23 @@ static void init_driver_info(struct wined3d_driver_info *driver_info, switch (os_version.dwMajorVersion) { case 4: + /* If needed we could distinguish between 9x and NT4, but this code won't make + * sense for NT4 since it had no way to obtain this info through DirectDraw 3.0. + */ driver_os_version = 4; + driver_model = DRIVER_MODEL_WIN9X; break; case 5: driver_os_version = 6; + driver_model = DRIVER_MODEL_NT5X; break; case 6: if (os_version.dwMinorVersion == 0) { driver_os_version = 7; + driver_model = DRIVER_MODEL_NT6X; } else { @@ -1108,6 +1203,7 @@ static void init_driver_info(struct wined3d_driver_info *driver_info, os_version.dwMajorVersion, os_version.dwMinorVersion); } driver_os_version = 8; + driver_model = DRIVER_MODEL_NT6X; } break; @@ -1115,28 +1211,73 @@ static void init_driver_info(struct wined3d_driver_info *driver_info, FIXME("Unhandled OS version %u.%u, reporting 2000/XP.\n", os_version.dwMajorVersion, os_version.dwMinorVersion); driver_os_version = 6; + driver_model = DRIVER_MODEL_NT5X; break; } } - driver_info->description = "Direct3D HAL"; - driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, 15); - driver_info->version_low = MAKEDWORD_VERSION(8, 6); /* Nvidia RIVA TNT, arbitrary */ - - for (i = 0; i < (sizeof(driver_version_table) / sizeof(driver_version_table[0])); ++i) + /* When we reach this stage we always have a vendor or device id (it can be a default one). + * This means that unless the ids are overriden, we will always find a GPU description. */ + for (i = 0; i < (sizeof(gpu_description_table) / sizeof(gpu_description_table[0])); i++) { - if (vendor == driver_version_table[i].vendor && device == driver_version_table[i].card) + if (vendor == gpu_description_table[i].vendor && device == gpu_description_table[i].card) { TRACE_(d3d_caps)("Found card %04x:%04x in driver DB.\n", vendor, device); - driver_info->description = driver_version_table[i].description; - driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, driver_version_table[i].d3d_level); - driver_info->version_low = MAKEDWORD_VERSION(driver_version_table[i].lopart_hi, - driver_version_table[i].lopart_lo); + driver_info->description = gpu_description_table[i].description; + driver_info->vidmem = gpu_description_table[i].vidmem * 1024*1024; + driver = gpu_description_table[i].driver; break; } } + if (wined3d_settings.emulated_textureram) + { + TRACE_(d3d_caps)("Overriding amount of video memory with: %d byte\n", wined3d_settings.emulated_textureram); + driver_info->vidmem = wined3d_settings.emulated_textureram; + } + + /* Try to obtain driver version information for the current Windows version. This fails in + * some cases: + * - the gpu is not available on the currently selected OS version: + * - Geforce GTX480 on Win98. When running applications in compatibility mode on Windows, + * version information for the current Windows version is returned instead of faked info. + * We do the same and assume the default Windows version to emulate is WinXP. + * + * - Videocard is a Riva TNT but winver is set to win7 (there are no drivers for this beast) + * For now return the XP driver info. Perhaps later on we should return VESA. + * + * - the gpu is not in our database (can happen when the user overrides the vendor_id / device_id) + * This could be an indication that our database is not up to date, so this should be fixed. + */ + version_info = get_driver_version_info(driver, driver_model); + if (version_info) + { + driver_info->name = version_info->driver_name; + driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, version_info->version); + driver_info->version_low = MAKEDWORD_VERSION(version_info->subversion, version_info->build); + } + else + { + version_info = get_driver_version_info(driver, DRIVER_MODEL_NT5X); + if (version_info) + { + driver_info->name = version_info->driver_name; + driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, version_info->version); + driver_info->version_low = MAKEDWORD_VERSION(version_info->subversion, version_info->build); + } + else + { + driver_info->description = "Direct3D HAL"; + driver_info->name = "Display"; + driver_info->version_high = MAKEDWORD_VERSION(driver_os_version, 15); + driver_info->version_low = MAKEDWORD_VERSION(8, 6); /* Nvidia RIVA TNT, arbitrary */ + + FIXME("Unable to find a driver/device info for vendor_id=%#x device_id=%#x for driver_model=%d\n", + vendor, device, driver_model); + } + } + TRACE_(d3d_caps)("Reporting (fake) driver version 0x%08x-0x%08x.\n", driver_info->version_high, driver_info->version_low); } @@ -1232,7 +1373,11 @@ static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_s if (strstr(gl_vendor_string, "ATI") || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.") || strstr(gl_vendor_string, "X.Org R300 Project") - || strstr(gl_vendor_string, "DRI R300 Project")) + || strstr(gl_renderer, "R100") + || strstr(gl_renderer, "R200") + || strstr(gl_renderer, "R300") + || strstr(gl_renderer, "R600") + || strstr(gl_renderer, "R700")) return HW_VENDOR_ATI; if (strstr(gl_vendor_string, "Intel(R)") @@ -1254,52 +1399,99 @@ static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_s static enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl_info *gl_info, - const char *gl_renderer, unsigned int *vidmem) + const char *gl_renderer) { if (WINE_D3D10_CAPABLE(gl_info)) { + /* Geforce 400 - highend */ + if (strstr(gl_renderer, "GTX 480")) + { + return CARD_NVIDIA_GEFORCE_GTX480; + } + + /* Geforce 400 - midend high */ + if (strstr(gl_renderer, "GTX 470")) + { + return CARD_NVIDIA_GEFORCE_GTX470; + } + + /* Geforce 400 - midend */ + if (strstr(gl_renderer, "GTX 465")) + { + return CARD_NVIDIA_GEFORCE_GTX465; + } + + /* Geforce 400 - midend */ + if (strstr(gl_renderer, "GTX 460")) + { + return CARD_NVIDIA_GEFORCE_GTX460; + } + + /* Geforce 300 highend mobile */ + if (strstr(gl_renderer, "GTS 350M") + || strstr(gl_renderer, "GTS 360M")) + { + return CARD_NVIDIA_GEFORCE_GTS350M; + } + + /* Geforce 300 midend mobile (Geforce GT 325M/330M use the same core) */ + if (strstr(gl_renderer, "GT 325M") + || strstr(gl_renderer, "GT 330M")) + { + return CARD_NVIDIA_GEFORCE_GT325M; + } + /* Geforce 200 - highend */ if (strstr(gl_renderer, "GTX 280") || strstr(gl_renderer, "GTX 285") || strstr(gl_renderer, "GTX 295")) { - *vidmem = 1024; return CARD_NVIDIA_GEFORCE_GTX280; } /* Geforce 200 - midend high */ if (strstr(gl_renderer, "GTX 275")) { - *vidmem = 896; return CARD_NVIDIA_GEFORCE_GTX275; } /* Geforce 200 - midend */ if (strstr(gl_renderer, "GTX 260")) { - *vidmem = 1024; return CARD_NVIDIA_GEFORCE_GTX260; } /* Geforce 200 - midend */ if (strstr(gl_renderer, "GT 240")) { - *vidmem = 512; return CARD_NVIDIA_GEFORCE_GT240; } + /* Geforce 200 lowend */ + if (strstr(gl_renderer, "GT 220")) + { + return CARD_NVIDIA_GEFORCE_GT220; + } + /* Geforce 200 lowend (Geforce 305/310 use the same core) */ + if (strstr(gl_renderer, "Geforce 210") + || strstr(gl_renderer, "G 210") + || strstr(gl_renderer, "Geforce 305") + || strstr(gl_renderer, "Geforce 310")) + { + return CARD_NVIDIA_GEFORCE_210; + } + /* Geforce9 - highend / Geforce 200 - midend (GTS 150/250 are based on the same core) */ if (strstr(gl_renderer, "9800") || strstr(gl_renderer, "GTS 150") || strstr(gl_renderer, "GTS 250")) { - *vidmem = 512; return CARD_NVIDIA_GEFORCE_9800GT; } - /* Geforce9 - midend */ - if (strstr(gl_renderer, "9600")) + /* Geforce9 - midend (GT 140 uses the same core as the 9600GT) */ + if (strstr(gl_renderer, "9600") + || strstr(gl_renderer, "GT 140")) { - *vidmem = 384; /* The 9600GSO has 384MB, the 9600GT has 512-1024MB */ return CARD_NVIDIA_GEFORCE_9600GT; } @@ -1308,14 +1500,12 @@ static enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl || strstr(gl_renderer, "GT 120") || strstr(gl_renderer, "GT 130")) { - *vidmem = 256; /* The 9500GT has 256-1024MB */ return CARD_NVIDIA_GEFORCE_9500GT; } /* Geforce9 - lowend */ if (strstr(gl_renderer, "9400")) { - *vidmem = 256; /* The 9400GT has 256-1024MB */ return CARD_NVIDIA_GEFORCE_9400GT; } @@ -1325,21 +1515,24 @@ static enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl || strstr(gl_renderer, "9300") || strstr(gl_renderer, "G 100")) { - *vidmem = 256; /* The 9100-9300 cards have 256MB */ return CARD_NVIDIA_GEFORCE_9200; } + /* Geforce8 - highend high*/ + if (strstr(gl_renderer, "8800 GTX")) + { + return CARD_NVIDIA_GEFORCE_8800GTX; + } + /* Geforce8 - highend */ if (strstr(gl_renderer, "8800")) { - *vidmem = 320; /* The 8800GTS uses 320MB, a 8800GTX can have 768MB */ return CARD_NVIDIA_GEFORCE_8800GTS; } /* Geforce8 - midend mobile */ if (strstr(gl_renderer, "8600 M")) { - *vidmem = 512; return CARD_NVIDIA_GEFORCE_8600MGT; } @@ -1347,23 +1540,25 @@ static enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl if (strstr(gl_renderer, "8600") || strstr(gl_renderer, "8700")) { - *vidmem = 256; return CARD_NVIDIA_GEFORCE_8600GT; } + /* Geforce8 - mid-lowend */ + if (strstr(gl_renderer, "8400") + || strstr(gl_renderer, "8500")) + { + return CARD_NVIDIA_GEFORCE_8400GS; + } + /* Geforce8 - lowend */ if (strstr(gl_renderer, "8100") || strstr(gl_renderer, "8200") - || strstr(gl_renderer, "8300") - || strstr(gl_renderer, "8400") - || strstr(gl_renderer, "8500")) + || strstr(gl_renderer, "8300")) { - *vidmem = 128; /* 128-256MB for a 8300, 256-512MB for a 8400 */ return CARD_NVIDIA_GEFORCE_8300GS; } /* Geforce8-compatible fall back if the GPU is not in the list yet */ - *vidmem = 128; return CARD_NVIDIA_GEFORCE_8300GS; } @@ -1379,7 +1574,6 @@ static enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl || strstr(gl_renderer, "Quadro FX 4") || strstr(gl_renderer, "Quadro FX 5")) { - *vidmem = 256; /* A 7800GT uses 256MB while highend 7900 cards can use 512MB */ return CARD_NVIDIA_GEFORCE_7800GT; } @@ -1387,28 +1581,24 @@ static enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl if (strstr(gl_renderer, "7600") || strstr(gl_renderer, "7700")) { - *vidmem = 256; /* The 7600 uses 256-512MB */ return CARD_NVIDIA_GEFORCE_7600; } /* Geforce7 lower medium */ if (strstr(gl_renderer, "7400")) { - *vidmem = 256; /* The 7400 uses 256-512MB */ return CARD_NVIDIA_GEFORCE_7400; } /* Geforce7 lowend */ if (strstr(gl_renderer, "7300")) { - *vidmem = 256; /* Mac Pros with this card have 256 MB */ return CARD_NVIDIA_GEFORCE_7300; } /* Geforce6 highend */ if (strstr(gl_renderer, "6800")) { - *vidmem = 128; /* The 6800 uses 128-256MB, the 7600 uses 256-512MB */ return CARD_NVIDIA_GEFORCE_6800; } @@ -1417,12 +1607,10 @@ static enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl || strstr(gl_renderer, "6610") || strstr(gl_renderer, "6700")) { - *vidmem = 128; /* A 6600GT has 128-256MB */ return CARD_NVIDIA_GEFORCE_6600GT; } /* Geforce6/7 lowend */ - *vidmem = 64; /* */ return CARD_NVIDIA_GEFORCE_6200; /* Geforce 6100/6150/6200/7300/7400/7500 */ } @@ -1434,7 +1622,6 @@ static enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl || strstr(gl_renderer, "5950") || strstr(gl_renderer, "Quadro FX")) { - *vidmem = 256; /* 5800-5900 cards use 256MB */ return CARD_NVIDIA_GEFORCEFX_5800; } @@ -1444,12 +1631,10 @@ static enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl || strstr(gl_renderer, "5700") || strstr(gl_renderer, "5750")) { - *vidmem = 128; /* A 5600 uses 128-256MB */ return CARD_NVIDIA_GEFORCEFX_5600; } /* GeforceFX - lowend */ - *vidmem = 64; /* Normal FX5200 cards use 64-256MB; laptop (non-standard) can have less */ return CARD_NVIDIA_GEFORCEFX_5200; /* GeforceFX 5100/5200/5250/5300/5500 */ } @@ -1457,11 +1642,9 @@ static enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl { if (strstr(gl_renderer, "GeForce4 Ti") || strstr(gl_renderer, "Quadro4")) { - *vidmem = 64; /* Geforce4 Ti cards have 64-128MB */ return CARD_NVIDIA_GEFORCE4_TI4200; /* Geforce4 Ti4200/Ti4400/Ti4600/Ti4800, Quadro4 */ } - *vidmem = 64; /* Geforce3 cards have 64-128MB */ return CARD_NVIDIA_GEFORCE3; /* Geforce3 standard/Ti200/Ti500, Quadro DCC */ } @@ -1469,43 +1652,32 @@ static enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl { if (strstr(gl_renderer, "GeForce4 MX")) { - /* Most Geforce4MX GPUs have at least 64MB of memory, some - * early models had 32MB but most have 64MB or even 128MB. */ - *vidmem = 64; return CARD_NVIDIA_GEFORCE4_MX; /* MX420/MX440/MX460/MX4000 */ } if (strstr(gl_renderer, "GeForce2 MX") || strstr(gl_renderer, "Quadro2 MXR")) { - *vidmem = 32; /* Geforce2MX GPUs have 32-64MB of video memory */ return CARD_NVIDIA_GEFORCE2_MX; /* Geforce2 standard/MX100/MX200/MX400, Quadro2 MXR */ } if (strstr(gl_renderer, "GeForce2") || strstr(gl_renderer, "Quadro2")) { - *vidmem = 32; /* Geforce2 GPUs have 32-64MB of video memory */ return CARD_NVIDIA_GEFORCE2; /* Geforce2 GTS/Pro/Ti/Ultra, Quadro2 */ } - /* Most Geforce1 cards have 32MB, there are also some rare 16 - * and 64MB (Dell) models. */ - *vidmem = 32; return CARD_NVIDIA_GEFORCE; /* Geforce 256/DDR, Quadro */ } if (strstr(gl_renderer, "TNT2")) { - *vidmem = 32; /* Most TNT2 boards have 32MB, though there are 16MB boards too */ return CARD_NVIDIA_RIVA_TNT2; /* Riva TNT2 standard/M64/Pro/Ultra */ } - *vidmem = 16; /* Most TNT boards have 16MB, some rare models have 8MB */ return CARD_NVIDIA_RIVA_TNT; /* Riva TNT, Vanta */ - } static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_info, - const char *gl_renderer, unsigned int *vidmem) + const char *gl_renderer) { /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx * @@ -1518,7 +1690,6 @@ static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_in || strstr(gl_renderer, "HD 5850") /* Radeon EG CYPRESS XT */ || strstr(gl_renderer, "HD 5870")) /* Radeon EG CYPRESS PRO */ { - *vidmem = 1024; /* note: HD58xx cards use 1024MB */ return CARD_ATI_RADEON_HD5800; } @@ -1527,7 +1698,6 @@ static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_in || strstr(gl_renderer, "HD 5750") /* Radeon EG JUNIPER LE */ || strstr(gl_renderer, "HD 5770")) /* Radeon EG JUNIPER XT */ { - *vidmem = 512; /* note: HD5770 cards use 1024MB and HD5750 cards use 512MB or 1024MB */ return CARD_ATI_RADEON_HD5700; } @@ -1538,7 +1708,6 @@ static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_in || strstr(gl_renderer, "HD 4870") /* Radeon RV770 */ || strstr(gl_renderer, "HD 4890")) /* Radeon RV790 */ { - *vidmem = 512; /* note: HD4890 cards use 1024MB */ return CARD_ATI_RADEON_HD4800; } @@ -1546,7 +1715,6 @@ static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_in if (strstr(gl_renderer, "HD 4700") /* Radeon RV770 */ || strstr(gl_renderer, "HD 4770")) /* Radeon RV740 */ { - *vidmem = 512; return CARD_ATI_RADEON_HD4700; } @@ -1555,7 +1723,6 @@ static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_in || strstr(gl_renderer, "HD 4650") /* Radeon RV730 */ || strstr(gl_renderer, "HD 4670")) /* Radeon RV730 */ { - *vidmem = 512; return CARD_ATI_RADEON_HD4600; } @@ -1563,7 +1730,6 @@ static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_in if (strstr(gl_renderer, "HD 4350") /* Radeon RV710 */ || strstr(gl_renderer, "HD 4550")) /* Radeon RV710 */ { - *vidmem = 256; return CARD_ATI_RADEON_HD4350; } @@ -1572,7 +1738,6 @@ static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_in || strstr(gl_renderer, "HD 3870") || strstr(gl_renderer, "HD 3850")) { - *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */ return CARD_ATI_RADEON_HD2900; } @@ -1582,7 +1747,6 @@ static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_in || strstr(gl_renderer, "HD 3690") || strstr(gl_renderer, "HD 3650")) { - *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */ return CARD_ATI_RADEON_HD2600; } @@ -1595,7 +1759,6 @@ static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_in || strstr(gl_renderer, "HD 3430") || strstr(gl_renderer, "HD 3400")) { - *vidmem = 256; /* HD2350/2400 use 256MB, HD34xx use 256-512MB */ return CARD_ATI_RADEON_HD2350; } @@ -1604,12 +1767,10 @@ static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_in || strstr(gl_renderer, "HD 3200") || strstr(gl_renderer, "HD 3300")) { - *vidmem = 128; /* 128MB */ return CARD_ATI_RADEON_HD3200; } /* Default for when no GPU has been found */ - *vidmem = 128; /* 128MB */ return CARD_ATI_RADEON_HD3200; } @@ -1622,7 +1783,6 @@ static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_in || strstr(gl_renderer, "X1900") || strstr(gl_renderer, "X1950")) { - *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */ return CARD_ATI_RADEON_X1600; } @@ -1640,53 +1800,44 @@ static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_in || strstr(gl_renderer, "HD 2300") ) { - *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */ return CARD_ATI_RADEON_X700; } /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */ if (strstr(gl_renderer, "Radeon Xpress")) { - *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */ return CARD_ATI_RADEON_XPRESS_200M; } /* Radeon R3xx */ - *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */ return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */ } if (WINE_D3D8_CAPABLE(gl_info)) { - *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */ return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */ } if (WINE_D3D7_CAPABLE(gl_info)) { - *vidmem = 32; /* There are models with up to 64MB */ return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */ } - *vidmem = 16; /* There are 16-32MB models */ return CARD_ATI_RAGE_128PRO; - } -static enum wined3d_pci_device select_card_intel_binary(const struct wined3d_gl_info *gl_info, - const char *gl_renderer, unsigned int *vidmem) +static enum wined3d_pci_device select_card_intel(const struct wined3d_gl_info *gl_info, + const char *gl_renderer) { - if (strstr(gl_renderer, "X3100")) + if (strstr(gl_renderer, "X3100") || strstr(gl_renderer, "965GM")) { - /* MacOS calls the card GMA X3100, Google findings also suggest the name GM965 */ - *vidmem = 128; + /* MacOS calls the card GMA X3100, otherwise known as GM965/GL960 */ return CARD_INTEL_X3100; } if (strstr(gl_renderer, "GMA 950") || strstr(gl_renderer, "945GM")) { /* MacOS calls the card GMA 950, but everywhere else the PCI ID is named 945GM */ - *vidmem = 64; return CARD_INTEL_I945GM; } @@ -1700,7 +1851,7 @@ static enum wined3d_pci_device select_card_intel_binary(const struct wined3d_gl_ } static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info *gl_info, - const char *gl_renderer, unsigned int *vidmem) + const char *gl_renderer) { /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx * @@ -1713,28 +1864,24 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info || strstr(gl_renderer, "RV770") /* Radeon RV770 */ || strstr(gl_renderer, "RV790")) /* Radeon RV790 */ { - *vidmem = 512; /* note: HD4890 cards use 1024MB */ return CARD_ATI_RADEON_HD4800; } /* Radeon R740 HD4700 - midend */ if (strstr(gl_renderer, "RV740")) /* Radeon RV740 */ { - *vidmem = 512; return CARD_ATI_RADEON_HD4700; } /* Radeon R730 HD4600 - midend */ if (strstr(gl_renderer, "RV730")) /* Radeon RV730 */ { - *vidmem = 512; return CARD_ATI_RADEON_HD4600; } /* Radeon R710 HD4500/HD4350 - lowend */ if (strstr(gl_renderer, "RV710")) /* Radeon RV710 */ { - *vidmem = 256; return CARD_ATI_RADEON_HD4350; } @@ -1743,7 +1890,6 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info || strstr(gl_renderer, "RV670") || strstr(gl_renderer, "R680")) { - *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */ return CARD_ATI_RADEON_HD2900; } @@ -1751,7 +1897,6 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info if (strstr(gl_renderer, "RV630") || strstr(gl_renderer, "RV635")) { - *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */ return CARD_ATI_RADEON_HD2600; } @@ -1759,7 +1904,6 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info if (strstr(gl_renderer, "RV610") || strstr(gl_renderer, "RV620")) { - *vidmem = 256; /* HD2350/2400 use 256MB, HD34xx use 256-512MB */ return CARD_ATI_RADEON_HD2350; } @@ -1767,7 +1911,6 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info if (strstr(gl_renderer, "RS780") || strstr(gl_renderer, "RS880")) { - *vidmem = 128; /* 128MB */ return CARD_ATI_RADEON_HD3200; } @@ -1779,7 +1922,6 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info || strstr(gl_renderer, "RV570") || strstr(gl_renderer, "R580")) { - *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */ return CARD_ATI_RADEON_X1600; } @@ -1794,7 +1936,6 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info || strstr(gl_renderer, "RV515") || strstr(gl_renderer, "RV516")) { - *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */ return CARD_ATI_RADEON_X700; } @@ -1807,7 +1948,6 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info || strstr(gl_renderer, "RS690") || strstr(gl_renderer, "RS740")) { - *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */ return CARD_ATI_RADEON_XPRESS_200M; } @@ -1820,7 +1960,6 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info || strstr(gl_renderer, "R350") || strstr(gl_renderer, "R360")) { - *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */ return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */ } } @@ -1832,28 +1971,24 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info || strstr(gl_renderer, "(RV770") /* Radeon RV770 */ || strstr(gl_renderer, "(RV790")) /* Radeon RV790 */ { - *vidmem = 512; /* note: HD4890 cards use 1024MB */ return CARD_ATI_RADEON_HD4800; } /* Radeon R740 HD4700 - midend */ if (strstr(gl_renderer, "(RV740")) /* Radeon RV740 */ { - *vidmem = 512; return CARD_ATI_RADEON_HD4700; } /* Radeon R730 HD4600 - midend */ if (strstr(gl_renderer, "(RV730")) /* Radeon RV730 */ { - *vidmem = 512; return CARD_ATI_RADEON_HD4600; } /* Radeon R710 HD4500/HD4350 - lowend */ if (strstr(gl_renderer, "(RV710")) /* Radeon RV710 */ { - *vidmem = 256; return CARD_ATI_RADEON_HD4350; } @@ -1862,7 +1997,6 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info || strstr(gl_renderer, "(RV670") || strstr(gl_renderer, "(R680")) { - *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */ return CARD_ATI_RADEON_HD2900; } @@ -1870,7 +2004,6 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info if (strstr(gl_renderer, "(RV630") || strstr(gl_renderer, "(RV635")) { - *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */ return CARD_ATI_RADEON_HD2600; } @@ -1878,7 +2011,6 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info if (strstr(gl_renderer, "(RV610") || strstr(gl_renderer, "(RV620")) { - *vidmem = 256; /* HD2350/2400 use 256MB, HD34xx use 256-512MB */ return CARD_ATI_RADEON_HD2350; } @@ -1886,30 +2018,25 @@ static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info if (strstr(gl_renderer, "(RS780") || strstr(gl_renderer, "(RS880")) { - *vidmem = 128; /* 128MB */ return CARD_ATI_RADEON_HD3200; } } if (WINE_D3D8_CAPABLE(gl_info)) { - *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */ return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */ } if (WINE_D3D7_CAPABLE(gl_info)) { - *vidmem = 32; /* There are models with up to 64MB */ return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */ } - *vidmem = 16; /* There are 16-32MB models */ return CARD_ATI_RAGE_128PRO; - } static enum wined3d_pci_device select_card_nvidia_mesa(const struct wined3d_gl_info *gl_info, - const char *gl_renderer, unsigned int *vidmem) + const char *gl_renderer) { FIXME_(d3d_caps)("Card selection not handled for Mesa Nouveau driver\n"); if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600; @@ -1919,21 +2046,13 @@ static enum wined3d_pci_device select_card_nvidia_mesa(const struct wined3d_gl_i return CARD_NVIDIA_RIVA_128; } -static enum wined3d_pci_device select_card_intel_mesa(const struct wined3d_gl_info *gl_info, - const char *gl_renderer, unsigned int *vidmem) -{ - FIXME_(d3d_caps)("Card selection not handled for Mesa Intel driver\n"); - return CARD_INTEL_I915G; -} - struct vendor_card_selection { enum wined3d_gl_vendor gl_vendor; enum wined3d_pci_vendor card_vendor; const char *description; /* Description of the card selector i.e. Apple OS/X Intel */ - enum wined3d_pci_device (*select_card)(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - unsigned int *vidmem ); + enum wined3d_pci_device (*select_card)(const struct wined3d_gl_info *gl_info, const char *gl_renderer); }; static const struct vendor_card_selection vendor_card_select_table[] = @@ -1941,17 +2060,17 @@ static const struct vendor_card_selection vendor_card_select_table[] = {GL_VENDOR_NVIDIA, HW_VENDOR_NVIDIA, "Nvidia binary driver", select_card_nvidia_binary}, {GL_VENDOR_APPLE, HW_VENDOR_NVIDIA, "Apple OSX NVidia binary driver", select_card_nvidia_binary}, {GL_VENDOR_APPLE, HW_VENDOR_ATI, "Apple OSX AMD/ATI binary driver", select_card_ati_binary}, - {GL_VENDOR_APPLE, HW_VENDOR_INTEL, "Apple OSX Intel binary driver", select_card_intel_binary}, + {GL_VENDOR_APPLE, HW_VENDOR_INTEL, "Apple OSX Intel binary driver", select_card_intel}, {GL_VENDOR_FGLRX, HW_VENDOR_ATI, "AMD/ATI binary driver", select_card_ati_binary}, {GL_VENDOR_MESA, HW_VENDOR_ATI, "Mesa AMD/ATI driver", select_card_ati_mesa}, {GL_VENDOR_MESA, HW_VENDOR_NVIDIA, "Mesa Nouveau driver", select_card_nvidia_mesa}, - {GL_VENDOR_MESA, HW_VENDOR_INTEL, "Mesa Intel driver", select_card_intel_mesa}, - {GL_VENDOR_INTEL, HW_VENDOR_INTEL, "Mesa Intel driver", select_card_intel_mesa} + {GL_VENDOR_MESA, HW_VENDOR_INTEL, "Mesa Intel driver", select_card_intel}, + {GL_VENDOR_INTEL, HW_VENDOR_INTEL, "Mesa Intel driver", select_card_intel} }; static enum wined3d_pci_device wined3d_guess_card(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_gl_vendor *gl_vendor, enum wined3d_pci_vendor *card_vendor, unsigned int *vidmem) + enum wined3d_gl_vendor *gl_vendor, enum wined3d_pci_vendor *card_vendor) { /* Above is a list of Nvidia and ATI GPUs. Both vendors have dozens of * different GPUs with roughly the same features. In most cases GPUs from a @@ -2016,7 +2135,7 @@ static enum wined3d_pci_device wined3d_guess_card(const struct wined3d_gl_info * || (vendor_card_select_table[i].card_vendor != *card_vendor)) continue; TRACE_(d3d_caps)("Applying card_selector \"%s\".\n", vendor_card_select_table[i].description); - return vendor_card_select_table[i].select_card(gl_info, gl_renderer, vidmem); + return vendor_card_select_table[i].select_card(gl_info, gl_renderer); } FIXME_(d3d_caps)("No card selector available for GL vendor %d and card vendor %04x.\n", @@ -2069,6 +2188,23 @@ static const struct blit_shader *select_blit_implementation(struct wined3d_adapt else return &ffp_blit; } +static void load_gl_funcs(struct wined3d_gl_info *gl_info, DWORD gl_version) +{ + DWORD ver; + +#define USE_GL_FUNC(type, pfn, ext, replace) \ + if (gl_info->supported[ext]) gl_info->pfn = (type)pwglGetProcAddress(#pfn); \ + else if ((ver = ver_for_ext(ext)) && ver <= gl_version) gl_info->pfn = (type)pwglGetProcAddress(#replace); \ + else gl_info->pfn = NULL; + + GL_EXT_FUNCS_GEN; +#undef USE_GL_FUNC + +#define USE_GL_FUNC(type, pfn, ext, replace) gl_info->pfn = (type)pwglGetProcAddress(#pfn); + WGL_EXT_FUNCS_GEN; +#undef USE_GL_FUNC +} + /* Context activation is done by the caller. */ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter) { @@ -2085,7 +2221,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter) GLfloat gl_floatv[2]; unsigned i; HDC hdc; - unsigned int vidmem=0; DWORD gl_version; size_t len; @@ -2181,22 +2316,20 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter) while (*GL_Extensions) { const char *start; - char current_ext[256]; while (isspace(*GL_Extensions)) ++GL_Extensions; start = GL_Extensions; while (!isspace(*GL_Extensions) && *GL_Extensions) ++GL_Extensions; len = GL_Extensions - start; - if (!len || len >= sizeof(current_ext)) continue; + if (!len) continue; - memcpy(current_ext, start, len); - current_ext[len] = '\0'; - TRACE_(d3d_caps)("- %s\n", debugstr_a(current_ext)); + TRACE_(d3d_caps)("- %s\n", debugstr_an(start, len)); for (i = 0; i < (sizeof(EXTENSION_MAP) / sizeof(*EXTENSION_MAP)); ++i) { - if (!strcmp(current_ext, EXTENSION_MAP[i].extension_string)) + if (len == strlen(EXTENSION_MAP[i].extension_string) + && !memcmp(start, EXTENSION_MAP[i].extension_string, len)) { TRACE_(d3d_caps)(" FOUND: %s support.\n", EXTENSION_MAP[i].extension_string); gl_info->supported[EXTENSION_MAP[i].extension] = TRUE; @@ -2206,19 +2339,7 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter) } /* Now work out what GL support this card really has */ -#define USE_GL_FUNC(type, pfn, ext, replace) \ -{ \ - DWORD ver = ver_for_ext(ext); \ - if (gl_info->supported[ext]) gl_info->pfn = (type)pwglGetProcAddress(#pfn); \ - else if (ver && ver <= gl_version) gl_info->pfn = (type)pwglGetProcAddress(#replace); \ - else gl_info->pfn = NULL; \ -} - GL_EXT_FUNCS_GEN; -#undef USE_GL_FUNC - -#define USE_GL_FUNC(type, pfn, ext, replace) gl_info->pfn = (type)pwglGetProcAddress(#pfn); - WGL_EXT_FUNCS_GEN; -#undef USE_GL_FUNC + load_gl_funcs( gl_info, gl_version ); ENTER_GL(); @@ -2235,6 +2356,8 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter) } } + if (gl_version >= MAKEDWORD_VERSION(2, 0)) gl_info->supported[WINED3D_GL_VERSION_2_0] = TRUE; + if (gl_info->supported[APPLE_FENCE]) { /* GL_NV_fence and GL_APPLE_fence provide the same functionality basically. @@ -2286,6 +2409,11 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter) TRACE_(d3d_caps)(" IMPLIED: ARB_vertex_array_bgra support (by EXT_vertex_array_bgra).\n"); gl_info->supported[ARB_VERTEX_ARRAY_BGRA] = TRUE; } + if (!gl_info->supported[ARB_TEXTURE_COMPRESSION_RGTC] && gl_info->supported[EXT_TEXTURE_COMPRESSION_RGTC]) + { + TRACE_(d3d_caps)(" IMPLIED: ARB_texture_compression_rgtc support (by EXT_texture_compression_rgtc).\n"); + gl_info->supported[ARB_TEXTURE_COMPRESSION_RGTC] = TRUE; + } if (gl_info->supported[NV_TEXTURE_SHADER2]) { if (gl_info->supported[NV_REGISTER_COMBINERS]) @@ -2575,15 +2703,9 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter) card_vendor = wined3d_guess_card_vendor(gl_vendor_str, gl_renderer_str); TRACE_(d3d_caps)("found GL_VENDOR (%s)->(0x%04x/0x%04x)\n", debugstr_a(gl_vendor_str), gl_vendor, card_vendor); - device = wined3d_guess_card(gl_info, gl_renderer_str, &gl_vendor, &card_vendor, &vidmem); + device = wined3d_guess_card(gl_info, gl_renderer_str, &gl_vendor, &card_vendor); TRACE_(d3d_caps)("FOUND (fake) card: 0x%x (vendor id), 0x%x (device id)\n", card_vendor, device); - /* If we have an estimate use it, else default to 64MB; */ - if(vidmem) - gl_info->vidmem = vidmem*1024*1024; /* convert from MBs to bytes */ - else - gl_info->vidmem = WINE_DEFAULT_VIDMEM; - gl_info->wrap_lookup[WINED3DTADDRESS_WRAP - WINED3DTADDRESS_WRAP] = GL_REPEAT; gl_info->wrap_lookup[WINED3DTADDRESS_MIRROR - WINED3DTADDRESS_WRAP] = gl_info->supported[ARB_TEXTURE_MIRRORED_REPEAT] ? GL_MIRRORED_REPEAT_ARB : GL_REPEAT; @@ -2600,22 +2722,24 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter) if(GL_EXTCALL(wglGetExtensionsStringARB)) WGL_Extensions = GL_EXTCALL(wglGetExtensionsStringARB(hdc)); - if (NULL == WGL_Extensions) { + if (!WGL_Extensions) + { ERR(" WGL_Extensions returns NULL\n"); - } else { + } + else + { TRACE_(d3d_caps)("WGL_Extensions reported:\n"); - while (*WGL_Extensions != 0x00) { + while (*WGL_Extensions) + { const char *Start; char ThisExtn[256]; while (isspace(*WGL_Extensions)) WGL_Extensions++; Start = WGL_Extensions; - while (!isspace(*WGL_Extensions) && *WGL_Extensions != 0x00) { - WGL_Extensions++; - } + while (!isspace(*WGL_Extensions) && *WGL_Extensions) ++WGL_Extensions; len = WGL_Extensions - Start; - if (len == 0 || len >= sizeof(ThisExtn)) + if (!len || len >= sizeof(ThisExtn)) continue; memcpy(ThisExtn, Start, len); @@ -2676,18 +2800,21 @@ static HMONITOR WINAPI IWineD3DImpl_GetAdapterMonitor(IWineD3D *iface, UINT Adap of the same bpp but different resolutions */ /* Note: dx9 supplies a format. Calls from d3d8 supply WINED3DFMT_UNKNOWN */ -static UINT WINAPI IWineD3DImpl_GetAdapterModeCount(IWineD3D *iface, UINT Adapter, WINED3DFORMAT Format) { +static UINT WINAPI IWineD3DImpl_GetAdapterModeCount(IWineD3D *iface, UINT Adapter, enum wined3d_format_id format_id) +{ IWineD3DImpl *This = (IWineD3DImpl *)iface; - TRACE_(d3d_caps)("(%p}->(Adapter: %d, Format: %s)\n", This, Adapter, debug_d3dformat(Format)); + + TRACE_(d3d_caps)("iface %p, adapter %u, format_id: %s.\n", iface, Adapter, debug_d3dformat(format_id)); if (Adapter >= IWineD3D_GetAdapterCount(iface)) { return 0; } /* TODO: Store modes per adapter and read it from the adapter structure */ - if (Adapter == 0) { /* Display */ - const struct wined3d_format_desc *format_desc = getFormatDescEntry(Format, &This->adapters[Adapter].gl_info); - UINT format_bits = format_desc->byte_count * CHAR_BIT; + if (Adapter == 0) + { + const struct wined3d_format *format = wined3d_get_format(&This->adapters[Adapter].gl_info, format_id); + UINT format_bits = format->byte_count * CHAR_BIT; unsigned int i = 0; unsigned int j = 0; DEVMODEW mode; @@ -2699,7 +2826,7 @@ static UINT WINAPI IWineD3DImpl_GetAdapterModeCount(IWineD3D *iface, UINT Ad { ++j; - if (Format == WINED3DFMT_UNKNOWN) + if (format_id == WINED3DFMT_UNKNOWN) { /* This is for D3D8, do not enumerate P8 here */ if (mode.dmBitsPerPel == 32 || mode.dmBitsPerPel == 16) ++i; @@ -2719,22 +2846,26 @@ static UINT WINAPI IWineD3DImpl_GetAdapterModeCount(IWineD3D *iface, UINT Ad } /* Note: dx9 supplies a format. Calls from d3d8 supply WINED3DFMT_UNKNOWN */ -static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapter, WINED3DFORMAT Format, UINT Mode, WINED3DDISPLAYMODE* pMode) { +static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapter, + enum wined3d_format_id format_id, UINT Mode, WINED3DDISPLAYMODE *pMode) +{ IWineD3DImpl *This = (IWineD3DImpl *)iface; - TRACE_(d3d_caps)("(%p}->(Adapter:%d, mode:%d, pMode:%p, format:%s)\n", This, Adapter, Mode, pMode, debug_d3dformat(Format)); + + TRACE_(d3d_caps)("iface %p, adapter_idx %u, format %s, mode_idx %u, mode %p.\n", + iface, Adapter, debug_d3dformat(format_id), Mode, pMode); /* Validate the parameters as much as possible */ - if (NULL == pMode || - Adapter >= IWineD3DImpl_GetAdapterCount(iface) || - Mode >= IWineD3DImpl_GetAdapterModeCount(iface, Adapter, Format)) { + if (!pMode || Adapter >= IWineD3DImpl_GetAdapterCount(iface) + || Mode >= IWineD3DImpl_GetAdapterModeCount(iface, Adapter, format_id)) + { return WINED3DERR_INVALIDCALL; } /* TODO: Store modes per adapter and read it from the adapter structure */ if (Adapter == 0) { - const struct wined3d_format_desc *format_desc = getFormatDescEntry(Format, &This->adapters[Adapter].gl_info); - UINT format_bits = format_desc->byte_count * CHAR_BIT; + const struct wined3d_format *format = wined3d_get_format(&This->adapters[Adapter].gl_info, format_id); + UINT format_bits = format->byte_count * CHAR_BIT; DEVMODEW DevModeW; int ModeIdx = 0; UINT i = 0; @@ -2748,7 +2879,7 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte just count through the ones with valid bit depths */ while ((i<=Mode) && EnumDisplaySettingsExW(NULL, j++, &DevModeW, 0)) { - if (Format == WINED3DFMT_UNKNOWN) + if (format_id == WINED3DFMT_UNKNOWN) { /* This is for D3D8, do not enumerate P8 here */ if (DevModeW.dmBitsPerPel == 32 || DevModeW.dmBitsPerPel == 16) ++i; @@ -2759,8 +2890,9 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte } } - if (i == 0) { - TRACE_(d3d_caps)("No modes found for format (%x - %s)\n", Format, debug_d3dformat(Format)); + if (!i) + { + TRACE_(d3d_caps)("No modes found for format (%x - %s)\n", format_id, debug_d3dformat(format_id)); return WINED3DERR_INVALIDCALL; } ModeIdx = j - 1; @@ -2773,12 +2905,13 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte if (DevModeW.dmFields & DM_DISPLAYFREQUENCY) pMode->RefreshRate = DevModeW.dmDisplayFrequency; - if (Format == WINED3DFMT_UNKNOWN) { + if (format_id == WINED3DFMT_UNKNOWN) pMode->Format = pixelformat_for_depth(DevModeW.dmBitsPerPel); - } else { - pMode->Format = Format; - } - } else { + else + pMode->Format = format_id; + } + else + { TRACE_(d3d_caps)("Requested mode out of range %d\n", Mode); return WINED3DERR_INVALIDCALL; } @@ -2800,10 +2933,8 @@ static HRESULT WINAPI IWineD3DImpl_GetAdapterDisplayMode(IWineD3D *iface, UINT A { TRACE("iface %p, adapter_idx %u, display_mode %p.\n", iface, Adapter, pMode); - if (NULL == pMode || - Adapter >= IWineD3D_GetAdapterCount(iface)) { + if (!pMode || Adapter >= IWineD3D_GetAdapterCount(iface)) return WINED3DERR_INVALIDCALL; - } if (Adapter == 0) { /* Display */ int bpp = 0; @@ -2898,7 +3029,7 @@ static HRESULT WINAPI IWineD3DImpl_GetAdapterIdentifier(IWineD3D *iface, UINT Ad } static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(const struct wined3d_gl_info *gl_info, - const WineD3D_PixelFormat *cfg, const struct wined3d_format_desc *format_desc) + const WineD3D_PixelFormat *cfg, const struct wined3d_format *format) { short redSize, greenSize, blueSize, alphaSize, colorBits; @@ -2906,12 +3037,12 @@ static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(const struct wined return FALSE; /* Float formats need FBOs. If FBOs are used this function isn't called */ - if (format_desc->Flags & WINED3DFMT_FLAG_FLOAT) return FALSE; + if (format->Flags & WINED3DFMT_FLAG_FLOAT) return FALSE; if(cfg->iPixelType == WGL_TYPE_RGBA_ARB) { /* Integer RGBA formats */ - if (!getColorBits(format_desc, &redSize, &greenSize, &blueSize, &alphaSize, &colorBits)) + if (!getColorBits(format, &redSize, &greenSize, &blueSize, &alphaSize, &colorBits)) { - ERR("Unable to check compatibility for Format=%s\n", debug_d3dformat(format_desc->format)); + ERR("Unable to check compatibility for format %s.\n", debug_d3dformat(format->id)); return FALSE; } @@ -2935,7 +3066,7 @@ static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(const struct wined } static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const struct wined3d_gl_info *gl_info, - const WineD3D_PixelFormat *cfg, const struct wined3d_format_desc *format_desc) + const WineD3D_PixelFormat *cfg, const struct wined3d_format *format) { short depthSize, stencilSize; BOOL lockable = FALSE; @@ -2943,16 +3074,16 @@ static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const struct wined3 if(!cfg) return FALSE; - if (!getDepthStencilBits(format_desc, &depthSize, &stencilSize)) + if (!getDepthStencilBits(format, &depthSize, &stencilSize)) { - ERR("Unable to check compatibility for Format=%s\n", debug_d3dformat(format_desc->format)); + ERR("Unable to check compatibility for format %s.\n", debug_d3dformat(format->id)); return FALSE; } /* Float formats need FBOs. If FBOs are used this function isn't called */ - if (format_desc->Flags & WINED3DFMT_FLAG_FLOAT) return FALSE; + if (format->Flags & WINED3DFMT_FLAG_FLOAT) return FALSE; - if ((format_desc->format == WINED3DFMT_D16_LOCKABLE) || (format_desc->format == WINED3DFMT_D32_FLOAT)) + if ((format->id == WINED3DFMT_D16_LOCKABLE) || (format->id == WINED3DFMT_D32_FLOAT)) lockable = TRUE; /* On some modern cards like the Geforce8/9 GLX doesn't offer some dephthstencil formats which D3D9 reports. @@ -2969,16 +3100,16 @@ static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const struct wined3 return TRUE; } -static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, - WINED3DFORMAT AdapterFormat, - WINED3DFORMAT RenderTargetFormat, - WINED3DFORMAT DepthStencilFormat) { +static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface, + UINT Adapter, WINED3DDEVTYPE DeviceType, enum wined3d_format_id AdapterFormat, + enum wined3d_format_id RenderTargetFormat, enum wined3d_format_id DepthStencilFormat) +{ IWineD3DImpl *This = (IWineD3DImpl *)iface; int nCfgs; const WineD3D_PixelFormat *cfgs; const struct wined3d_adapter *adapter; - const struct wined3d_format_desc *rt_format_desc; - const struct wined3d_format_desc *ds_format_desc; + const struct wined3d_format *rt_format; + const struct wined3d_format *ds_format; int it; WARN_(d3d_caps)("(%p)-> (STUB) (Adptr:%d, DevType:(%x,%s), AdptFmt:(%x,%s), RendrTgtFmt:(%x,%s), DepthStencilFmt:(%x,%s))\n", @@ -2994,12 +3125,13 @@ static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface, UINT } adapter = &This->adapters[Adapter]; - rt_format_desc = getFormatDescEntry(RenderTargetFormat, &adapter->gl_info); - ds_format_desc = getFormatDescEntry(DepthStencilFormat, &adapter->gl_info); + rt_format = wined3d_get_format(&adapter->gl_info, RenderTargetFormat); + ds_format = wined3d_get_format(&adapter->gl_info, DepthStencilFormat); if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - if ((rt_format_desc->Flags & WINED3DFMT_FLAG_RENDERTARGET) && - (ds_format_desc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) { + if ((rt_format->Flags & WINED3DFMT_FLAG_RENDERTARGET) + && (ds_format->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) + { TRACE_(d3d_caps)("(%p) : Formats matched\n", This); return WINED3D_OK; } @@ -3008,10 +3140,11 @@ static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface, UINT { cfgs = adapter->cfgs; nCfgs = adapter->nCfgs; - for (it = 0; it < nCfgs; ++it) { - if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, &cfgs[it], rt_format_desc)) + for (it = 0; it < nCfgs; ++it) + { + if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, &cfgs[it], rt_format)) { - if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, &cfgs[it], ds_format_desc)) + if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, &cfgs[it], ds_format)) { TRACE_(d3d_caps)("(%p) : Formats matched\n", This); return WINED3D_OK; @@ -3024,12 +3157,13 @@ static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface, UINT return WINED3DERR_NOTAVAILABLE; } -static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, - WINED3DFORMAT SurfaceFormat, BOOL Windowed, WINED3DMULTISAMPLE_TYPE MultiSampleType, DWORD *pQualityLevels) +static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, UINT Adapter, + WINED3DDEVTYPE DeviceType, enum wined3d_format_id SurfaceFormat, BOOL Windowed, + WINED3DMULTISAMPLE_TYPE MultiSampleType, DWORD *pQualityLevels) { IWineD3DImpl *This = (IWineD3DImpl *)iface; - const struct wined3d_format_desc *glDesc; const struct wined3d_adapter *adapter; + const struct wined3d_format *format; TRACE_(d3d_caps)("(%p)-> (Adptr:%d, DevType:(%x,%s), SurfFmt:(%x,%s), Win?%d, MultiSamp:%x, pQual:%p)\n", This, @@ -3058,10 +3192,11 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, U return WINED3DERR_NOTAVAILABLE; adapter = &This->adapters[Adapter]; - glDesc = getFormatDescEntry(SurfaceFormat, &adapter->gl_info); - if (!glDesc) return WINED3DERR_INVALIDCALL; + format = wined3d_get_format(&adapter->gl_info, SurfaceFormat); + if (!format) return WINED3DERR_INVALIDCALL; - if(glDesc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) { + if (format->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) + { int i, nCfgs; const WineD3D_PixelFormat *cfgs; @@ -3071,7 +3206,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, U if(cfgs[i].numSamples != MultiSampleType) continue; - if (!IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, &cfgs[i], glDesc)) + if (!IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, &cfgs[i], format)) continue; TRACE("Found iPixelFormat=%d to support MultiSampleType=%d for format %s\n", cfgs[i].iPixelFormat, MultiSampleType, debug_d3dformat(SurfaceFormat)); @@ -3081,12 +3216,13 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, U return WINED3D_OK; } } - else if(glDesc->Flags & WINED3DFMT_FLAG_RENDERTARGET) { + else if (format->Flags & WINED3DFMT_FLAG_RENDERTARGET) + { short redSize, greenSize, blueSize, alphaSize, colorBits; int i, nCfgs; const WineD3D_PixelFormat *cfgs; - if (!getColorBits(glDesc, &redSize, &greenSize, &blueSize, &alphaSize, &colorBits)) + if (!getColorBits(format, &redSize, &greenSize, &blueSize, &alphaSize, &colorBits)) { ERR("Unable to color bits for format %#x, can't check multisampling capability!\n", SurfaceFormat); return WINED3DERR_NOTAVAILABLE; @@ -3106,7 +3242,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, U /* Not all drivers report alpha-less formats since they use 32-bit anyway, so accept alpha even if we didn't ask for it. */ if(alphaSize && cfgs[i].alphaSize != alphaSize) continue; - if(cfgs[i].colorSize != (glDesc->byte_count << 3)) + if (cfgs[i].colorSize != (format->byte_count << 3)) continue; TRACE("Found iPixelFormat=%d to support MultiSampleType=%d for format %s\n", cfgs[i].iPixelFormat, MultiSampleType, debug_d3dformat(SurfaceFormat)); @@ -3119,116 +3255,29 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, U return WINED3DERR_NOTAVAILABLE; } -static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, - WINED3DFORMAT DisplayFormat, WINED3DFORMAT BackBufferFormat, BOOL Windowed) -{ - HRESULT hr = WINED3DERR_NOTAVAILABLE; - UINT nmodes; - - TRACE("iface %p, adapter_idx %u, device_type %s, display_format %s, backbuffer_format %s, windowed %#x.\n", - iface, Adapter, debug_d3ddevicetype(DeviceType), debug_d3dformat(DisplayFormat), - debug_d3dformat(BackBufferFormat), Windowed); - - if (Adapter >= IWineD3D_GetAdapterCount(iface)) { - WARN_(d3d_caps)("Adapter >= IWineD3D_GetAdapterCount(iface), returning WINED3DERR_INVALIDCALL\n"); - return WINED3DERR_INVALIDCALL; - } - - /* The task of this function is to check whether a certain display / backbuffer format - * combination is available on the given adapter. In fullscreen mode microsoft specified - * that the display format shouldn't provide alpha and that ignoring alpha the backbuffer - * and display format should match exactly. - * In windowed mode format conversion can occur and this depends on the driver. When format - * conversion is done, this function should nevertheless fail and applications need to use - * CheckDeviceFormatConversion. - * At the moment we assume that fullscreen and windowed have the same capabilities */ - - /* There are only 4 display formats */ - if (!(DisplayFormat == WINED3DFMT_B5G6R5_UNORM - || DisplayFormat == WINED3DFMT_B5G5R5X1_UNORM - || DisplayFormat == WINED3DFMT_B8G8R8X8_UNORM - || DisplayFormat == WINED3DFMT_B10G10R10A2_UNORM)) - { - TRACE_(d3d_caps)("Format %s unsupported as display format\n", debug_d3dformat(DisplayFormat)); - return WINED3DERR_NOTAVAILABLE; - } - - /* If the requested DisplayFormat is not available, don't continue */ - nmodes = IWineD3DImpl_GetAdapterModeCount(iface, Adapter, DisplayFormat); - if(!nmodes) { - TRACE_(d3d_caps)("No available modes for display format %s\n", debug_d3dformat(DisplayFormat)); - return WINED3DERR_NOTAVAILABLE; - } - - /* Windowed mode allows you to specify WINED3DFMT_UNKNOWN for the backbufferformat, it means 'reuse' the display format for the backbuffer */ - if(!Windowed && BackBufferFormat == WINED3DFMT_UNKNOWN) { - TRACE_(d3d_caps)("BackBufferFormat WINED3FMT_UNKNOWN not available in Windowed mode\n"); - return WINED3DERR_NOTAVAILABLE; - } - - /* In FULLSCREEN mode R5G6B5 can only be mixed with backbuffer format R5G6B5 */ - if (DisplayFormat == WINED3DFMT_B5G6R5_UNORM && BackBufferFormat != WINED3DFMT_B5G6R5_UNORM) - { - TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat)); - return WINED3DERR_NOTAVAILABLE; - } - - /* In FULLSCREEN mode X1R5G5B5 can only be mixed with backbuffer format *1R5G5B5 */ - if (DisplayFormat == WINED3DFMT_B5G5R5X1_UNORM - && !(BackBufferFormat == WINED3DFMT_B5G5R5X1_UNORM || BackBufferFormat == WINED3DFMT_B5G5R5A1_UNORM)) - { - TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat)); - return WINED3DERR_NOTAVAILABLE; - } - - /* In FULLSCREEN mode X8R8G8B8 can only be mixed with backbuffer format *8R8G8B8 */ - if (DisplayFormat == WINED3DFMT_B8G8R8X8_UNORM - && !(BackBufferFormat == WINED3DFMT_B8G8R8X8_UNORM || BackBufferFormat == WINED3DFMT_B8G8R8A8_UNORM)) - { - TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat)); - return WINED3DERR_NOTAVAILABLE; - } - - /* A2R10G10B10 is only allowed in fullscreen mode and it can only be mixed with backbuffer format A2R10G10B10 */ - if (DisplayFormat == WINED3DFMT_B10G10R10A2_UNORM - && (BackBufferFormat != WINED3DFMT_B10G10R10A2_UNORM || Windowed)) - { - TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat)); - return WINED3DERR_NOTAVAILABLE; - } - - /* Use CheckDeviceFormat to see if the BackBufferFormat is usable with the given DisplayFormat */ - hr = IWineD3DImpl_CheckDeviceFormat(iface, Adapter, DeviceType, DisplayFormat, WINED3DUSAGE_RENDERTARGET, WINED3DRTYPE_SURFACE, BackBufferFormat, SURFACE_OPENGL); - if(FAILED(hr)) - TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat)); - - return hr; -} - - /* Check if we support bumpmapping for a format */ -static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc) +static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter, const struct wined3d_format *format) { /* Ask the fixed function pipeline implementation if it can deal * with the conversion. If we've got a GL extension giving native * support this will be an identity conversion. */ - return (format_desc->Flags & WINED3DFMT_FLAG_BUMPMAP) - && adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup); + return (format->Flags & WINED3DFMT_FLAG_BUMPMAP) + && adapter->fragment_pipe->color_fixup_supported(format->color_fixup); } /* Check if the given DisplayFormat + DepthStencilFormat combination is valid for the Adapter */ static BOOL CheckDepthStencilCapability(struct wined3d_adapter *adapter, - const struct wined3d_format_desc *display_format_desc, const struct wined3d_format_desc *ds_format_desc) + const struct wined3d_format *display_format, const struct wined3d_format *ds_format) { int it=0; /* Only allow depth/stencil formats */ - if (!(ds_format_desc->depth_size || ds_format_desc->stencil_size)) return FALSE; + if (!(ds_format->depth_size || ds_format->stencil_size)) return FALSE; if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { /* With FBOs WGL limitations do not apply, but the format needs to be FBO attachable */ - if (ds_format_desc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) return TRUE; + if (ds_format->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) return TRUE; } else { @@ -3236,9 +3285,9 @@ static BOOL CheckDepthStencilCapability(struct wined3d_adapter *adapter, for (it = 0; it < adapter->nCfgs; ++it) { WineD3D_PixelFormat *cfg = &adapter->cfgs[it]; - if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, cfg, display_format_desc)) + if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, cfg, display_format)) { - if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, cfg, ds_format_desc)) + if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, cfg, ds_format)) { return TRUE; } @@ -3249,28 +3298,29 @@ static BOOL CheckDepthStencilCapability(struct wined3d_adapter *adapter, return FALSE; } -static BOOL CheckFilterCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc) +static BOOL CheckFilterCapability(struct wined3d_adapter *adapter, const struct wined3d_format *format) { /* The flags entry of a format contains the filtering capability */ - if (format_desc->Flags & WINED3DFMT_FLAG_FILTERING) return TRUE; + if (format->Flags & WINED3DFMT_FLAG_FILTERING) return TRUE; return FALSE; } /* Check the render target capabilities of a format */ static BOOL CheckRenderTargetCapability(struct wined3d_adapter *adapter, - const struct wined3d_format_desc *adapter_format_desc, const struct wined3d_format_desc *check_format_desc) + const struct wined3d_format *adapter_format, const struct wined3d_format *check_format) { /* Filter out non-RT formats */ - if (!(check_format_desc->Flags & WINED3DFMT_FLAG_RENDERTARGET)) return FALSE; - if(wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER) { + if (!(check_format->Flags & WINED3DFMT_FLAG_RENDERTARGET)) return FALSE; + if (wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER) + { WineD3D_PixelFormat *cfgs = adapter->cfgs; int it; short AdapterRed, AdapterGreen, AdapterBlue, AdapterAlpha, AdapterTotalSize; short CheckRed, CheckGreen, CheckBlue, CheckAlpha, CheckTotalSize; - getColorBits(adapter_format_desc, &AdapterRed, &AdapterGreen, &AdapterBlue, &AdapterAlpha, &AdapterTotalSize); - getColorBits(check_format_desc, &CheckRed, &CheckGreen, &CheckBlue, &CheckAlpha, &CheckTotalSize); + getColorBits(adapter_format, &AdapterRed, &AdapterGreen, &AdapterBlue, &AdapterAlpha, &AdapterTotalSize); + getColorBits(check_format, &CheckRed, &CheckGreen, &CheckBlue, &CheckAlpha, &CheckTotalSize); /* In backbuffer mode the front and backbuffer share the same WGL pixelformat. * The format must match in RGB, alpha is allowed to be different. (Only the backbuffer can have alpha) */ @@ -3284,10 +3334,10 @@ static BOOL CheckRenderTargetCapability(struct wined3d_adapter *adapter, for (it = 0; it < adapter->nCfgs; ++it) { if (cfgs[it].windowDrawable && IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, - &cfgs[it], check_format_desc)) + &cfgs[it], check_format)) { - TRACE_(d3d_caps)("iPixelFormat=%d is compatible with CheckFormat=%s\n", - cfgs[it].iPixelFormat, debug_d3dformat(check_format_desc->format)); + TRACE_(d3d_caps)("Pixel format %d is compatible with format %s.\n", + cfgs[it].iPixelFormat, debug_d3dformat(check_format->id)); return TRUE; } } @@ -3301,18 +3351,17 @@ static BOOL CheckRenderTargetCapability(struct wined3d_adapter *adapter, return FALSE; } -static BOOL CheckSrgbReadCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc) +static BOOL CheckSrgbReadCapability(struct wined3d_adapter *adapter, const struct wined3d_format *format) { - return adapter->gl_info.supported[EXT_TEXTURE_SRGB] - && (format_desc->Flags & WINED3DFMT_FLAG_SRGB_READ); + return adapter->gl_info.supported[EXT_TEXTURE_SRGB] && (format->Flags & WINED3DFMT_FLAG_SRGB_READ); } -static BOOL CheckSrgbWriteCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc) +static BOOL CheckSrgbWriteCapability(struct wined3d_adapter *adapter, const struct wined3d_format *format) { /* Only offer SRGB writing on X8R8G8B8/A8R8G8B8 when we use ARB or GLSL shaders as we are * doing the color fixup in shaders. * Note Windows drivers (at least on the Geforce 8800) also offer this on R5G6B5. */ - if (format_desc->Flags & WINED3DFMT_FLAG_SRGB_WRITE) + if (format->Flags & WINED3DFMT_FLAG_SRGB_WRITE) { int vs_selected_mode; int ps_selected_mode; @@ -3324,21 +3373,21 @@ static BOOL CheckSrgbWriteCapability(struct wined3d_adapter *adapter, const stru } } - TRACE_(d3d_caps)("[FAILED] - no SRGB writing support on format=%s\n", debug_d3dformat(format_desc->format)); + TRACE_(d3d_caps)("[FAILED] - sRGB writes not supported by format %s.\n", debug_d3dformat(format->id)); return FALSE; } /* Check if a format support blending in combination with pixel shaders */ static BOOL CheckPostPixelShaderBlendingCapability(struct wined3d_adapter *adapter, - const struct wined3d_format_desc *format_desc) + const struct wined3d_format *format) { /* The flags entry of a format contains the post pixel shader blending capability */ - if (format_desc->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) return TRUE; + if (format->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) return TRUE; return FALSE; } -static BOOL CheckWrapAndMipCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc) +static BOOL CheckWrapAndMipCapability(struct wined3d_adapter *adapter, const struct wined3d_format *format) { /* OpenGL supports mipmapping on all formats basically. Wrapping is unsupported, * but we have to report mipmapping so we cannot reject this flag. Tests show that @@ -3353,11 +3402,11 @@ static BOOL CheckWrapAndMipCapability(struct wined3d_adapter *adapter, const str } /* Check if a texture format is supported on the given adapter */ -static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc) +static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, const struct wined3d_format *format) { const struct wined3d_gl_info *gl_info = &adapter->gl_info; - switch (format_desc->format) + switch (format->id) { /***** * supported: RGB(A) formats @@ -3433,7 +3482,7 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, const struct /* Ask the shader backend if it can deal with the conversion. If * we've got a GL extension giving native support this will be an * identity conversion. */ - if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup)) + if (adapter->shader_backend->shader_color_fixup_supported(format->color_fixup)) { TRACE_(d3d_caps)("[OK]\n"); return TRUE; @@ -3547,10 +3596,10 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, const struct /* Vendor specific formats */ case WINED3DFMT_ATI2N: if (gl_info->supported[ATI_TEXTURE_COMPRESSION_3DC] - || gl_info->supported[EXT_TEXTURE_COMPRESSION_RGTC]) + || gl_info->supported[ARB_TEXTURE_COMPRESSION_RGTC]) { - if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup) - && adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup)) + if (adapter->shader_backend->shader_color_fixup_supported(format->color_fixup) + && adapter->fragment_pipe->color_fixup_supported(format->color_fixup)) { TRACE_(d3d_caps)("[OK]\n"); return TRUE; @@ -3562,6 +3611,21 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, const struct TRACE_(d3d_caps)("[FAILED]\n"); return FALSE; + /* Depth bound test. To query if the card supports it CheckDeviceFormat with the special + * format MAKEFOURCC('N','V','D','B') is used. + * It is enabled by setting D3DRS_ADAPTIVETESS_X render state to MAKEFOURCC('N','V','D','B') and + * then controlled by setting D3DRS_ADAPTIVETESS_Z (zMin) and D3DRS_ADAPTIVETESS_W (zMax) + * to test value. + */ + case WINED3DFMT_NVDB: + if (gl_info->supported[EXT_DEPTH_BOUNDS_TEST]) + { + TRACE_(d3d_caps)("[OK]\n"); + return TRUE; + } + TRACE_(d3d_caps)("[FAILED]\n"); + return FALSE; + case WINED3DFMT_NVHU: case WINED3DFMT_NVHS: /* These formats seem to be similar to the HILO formats in GL_NV_texture_shader. NVHU @@ -3577,19 +3641,20 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, const struct return FALSE; default: - ERR("Unhandled format=%s\n", debug_d3dformat(format_desc->format)); + ERR("Unhandled format %s.\n", debug_d3dformat(format->id)); break; } return FALSE; } static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, - const struct wined3d_format_desc *adapter_format_desc, - const struct wined3d_format_desc *check_format_desc, + const struct wined3d_format *adapter_format, + const struct wined3d_format *check_format, WINED3DSURFTYPE SurfaceType) { - if(SurfaceType == SURFACE_GDI) { - switch(check_format_desc->format) + if (SurfaceType == SURFACE_GDI) + { + switch (check_format->id) { case WINED3DFMT_B8G8R8_UNORM: case WINED3DFMT_B8G8R8A8_UNORM: @@ -3618,14 +3683,14 @@ static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, } /* All format that are supported for textures are supported for surfaces as well */ - if (CheckTextureCapability(adapter, check_format_desc)) return TRUE; + if (CheckTextureCapability(adapter, check_format)) return TRUE; /* All depth stencil formats are supported on surfaces */ - if (CheckDepthStencilCapability(adapter, adapter_format_desc, check_format_desc)) return TRUE; + if (CheckDepthStencilCapability(adapter, adapter_format, check_format)) return TRUE; /* If opengl can't process the format natively, the blitter may be able to convert it */ if (adapter->blitter->blit_supported(&adapter->gl_info, BLIT_OP_BLIT, - NULL, WINED3DPOOL_DEFAULT, 0, check_format_desc, - NULL, WINED3DPOOL_DEFAULT, 0, adapter_format_desc)) + NULL, WINED3DPOOL_DEFAULT, 0, check_format, + NULL, WINED3DPOOL_DEFAULT, 0, adapter_format)) { TRACE_(d3d_caps)("[OK]\n"); return TRUE; @@ -3637,21 +3702,20 @@ static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, } static BOOL CheckVertexTextureCapability(struct wined3d_adapter *adapter, - const struct wined3d_format_desc *format_desc) + const struct wined3d_format *format) { - return adapter->gl_info.limits.vertex_samplers - && (format_desc->Flags & WINED3DFMT_FLAG_VTF); + return adapter->gl_info.limits.vertex_samplers && (format->Flags & WINED3DFMT_FLAG_VTF); } static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, - WINED3DFORMAT AdapterFormat, DWORD Usage, WINED3DRESOURCETYPE RType, WINED3DFORMAT CheckFormat, - WINED3DSURFTYPE SurfaceType) + enum wined3d_format_id AdapterFormat, DWORD Usage, WINED3DRESOURCETYPE RType, + enum wined3d_format_id CheckFormat, WINED3DSURFTYPE SurfaceType) { IWineD3DImpl *This = (IWineD3DImpl *)iface; struct wined3d_adapter *adapter = &This->adapters[Adapter]; const struct wined3d_gl_info *gl_info = &adapter->gl_info; - const struct wined3d_format_desc *format_desc = getFormatDescEntry(CheckFormat, gl_info); - const struct wined3d_format_desc *adapter_format_desc = getFormatDescEntry(AdapterFormat, gl_info); + const struct wined3d_format *format = wined3d_get_format(gl_info, CheckFormat); + const struct wined3d_format *adapter_format = wined3d_get_format(gl_info, AdapterFormat); DWORD UsageCaps = 0; TRACE_(d3d_caps)("(%p)-> (STUB) (Adptr:%d, DevType:(%u,%s), AdptFmt:(%u,%s), Use:(%u,%s,%s), ResTyp:(%x,%s), CheckFmt:(%u,%s))\n", @@ -3691,7 +3755,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt return WINED3DERR_NOTAVAILABLE; } - if (!CheckTextureCapability(adapter, format_desc)) + if (!CheckTextureCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - Cube texture format not supported\n"); return WINED3DERR_NOTAVAILABLE; @@ -3713,7 +3777,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_RENDERTARGET) { - if (!CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc)) + if (!CheckRenderTargetCapability(adapter, adapter_format, format)) { TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3727,7 +3791,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_FILTER) { - if (!CheckFilterCapability(adapter, format_desc)) + if (!CheckFilterCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query filter support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3737,7 +3801,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) { - if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc)) + if (!CheckPostPixelShaderBlendingCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3747,7 +3811,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_SRGBREAD) { - if (!CheckSrgbReadCapability(adapter, format_desc)) + if (!CheckSrgbReadCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3757,7 +3821,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE) { - if (!CheckSrgbWriteCapability(adapter, format_desc)) + if (!CheckSrgbWriteCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3767,7 +3831,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE) { - if (!CheckVertexTextureCapability(adapter, format_desc)) + if (!CheckVertexTextureCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3777,7 +3841,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP) { - if (!CheckWrapAndMipCapability(adapter, format_desc)) + if (!CheckWrapAndMipCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3792,7 +3856,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt * - WINED3DUSAGE_NONSECURE (d3d9ex) * - WINED3DUSAGE_RENDERTARGET */ - if (!CheckSurfaceCapability(adapter, adapter_format_desc, format_desc, SurfaceType)) + if (!CheckSurfaceCapability(adapter, adapter_format, format, SurfaceType)) { TRACE_(d3d_caps)("[FAILED] - Not supported for plain surfaces\n"); return WINED3DERR_NOTAVAILABLE; @@ -3800,7 +3864,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_DEPTHSTENCIL) { - if (!CheckDepthStencilCapability(adapter, adapter_format_desc, format_desc)) + if (!CheckDepthStencilCapability(adapter, adapter_format, format)) { TRACE_(d3d_caps)("[FAILED] - No depthstencil support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3810,7 +3874,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_RENDERTARGET) { - if (!CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc)) + if (!CheckRenderTargetCapability(adapter, adapter_format, format)) { TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3820,7 +3884,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) { - if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc)) + if (!CheckPostPixelShaderBlendingCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3847,7 +3911,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt return WINED3DERR_NOTAVAILABLE; } - if (!CheckTextureCapability(adapter, format_desc)) + if (!CheckTextureCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - Texture format not supported\n"); return WINED3DERR_NOTAVAILABLE; @@ -3869,7 +3933,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_RENDERTARGET) { - if (!CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc)) + if (!CheckRenderTargetCapability(adapter, adapter_format, format)) { TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3883,7 +3947,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_FILTER) { - if (!CheckFilterCapability(adapter, format_desc)) + if (!CheckFilterCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query filter support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3893,7 +3957,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_LEGACYBUMPMAP) { - if (!CheckBumpMapCapability(adapter, format_desc)) + if (!CheckBumpMapCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No legacy bumpmap support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3903,7 +3967,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) { - if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc)) + if (!CheckPostPixelShaderBlendingCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3913,7 +3977,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_SRGBREAD) { - if (!CheckSrgbReadCapability(adapter, format_desc)) + if (!CheckSrgbReadCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3923,7 +3987,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE) { - if (!CheckSrgbWriteCapability(adapter, format_desc)) + if (!CheckSrgbWriteCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3933,7 +3997,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE) { - if (!CheckVertexTextureCapability(adapter, format_desc)) + if (!CheckVertexTextureCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3943,7 +4007,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP) { - if (!CheckWrapAndMipCapability(adapter, format_desc)) + if (!CheckWrapAndMipCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n"); return WINED3DERR_NOTAVAILABLE; @@ -3953,12 +4017,12 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_DEPTHSTENCIL) { - if (!CheckDepthStencilCapability(adapter, adapter_format_desc, format_desc)) + if (!CheckDepthStencilCapability(adapter, adapter_format, format)) { TRACE_(d3d_caps)("[FAILED] - No depth stencil support\n"); return WINED3DERR_NOTAVAILABLE; } - if ((format_desc->Flags & WINED3DFMT_FLAG_SHADOW) && !gl_info->supported[ARB_SHADOW]) + if ((format->Flags & WINED3DFMT_FLAG_SHADOW) && !gl_info->supported[ARB_SHADOW]) { TRACE_(d3d_caps)("[FAILED] - No shadow sampler support.\n"); return WINED3DERR_NOTAVAILABLE; @@ -3991,7 +4055,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt return WINED3DERR_NOTAVAILABLE; } - if (!CheckTextureCapability(adapter, format_desc)) + if (!CheckTextureCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - Format not supported\n"); return WINED3DERR_NOTAVAILABLE; @@ -4061,7 +4125,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_FILTER) { - if (!CheckFilterCapability(adapter, format_desc)) + if (!CheckFilterCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query filter support\n"); return WINED3DERR_NOTAVAILABLE; @@ -4071,7 +4135,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) { - if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc)) + if (!CheckPostPixelShaderBlendingCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n"); return WINED3DERR_NOTAVAILABLE; @@ -4081,7 +4145,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_SRGBREAD) { - if (!CheckSrgbReadCapability(adapter, format_desc)) + if (!CheckSrgbReadCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n"); return WINED3DERR_NOTAVAILABLE; @@ -4091,7 +4155,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE) { - if (!CheckSrgbWriteCapability(adapter, format_desc)) + if (!CheckSrgbWriteCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n"); return WINED3DERR_NOTAVAILABLE; @@ -4101,7 +4165,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE) { - if (!CheckVertexTextureCapability(adapter, format_desc)) + if (!CheckVertexTextureCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n"); return WINED3DERR_NOTAVAILABLE; @@ -4111,7 +4175,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP) { - if (!CheckWrapAndMipCapability(adapter, format_desc)) + if (!CheckWrapAndMipCapability(adapter, format)) { TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n"); return WINED3DERR_NOTAVAILABLE; @@ -4140,7 +4204,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt } static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormatConversion(IWineD3D *iface, UINT adapter_idx, - WINED3DDEVTYPE device_type, WINED3DFORMAT src_format, WINED3DFORMAT dst_format) + WINED3DDEVTYPE device_type, enum wined3d_format_id src_format, enum wined3d_format_id dst_format) { FIXME("iface %p, adapter_idx %u, device_type %s, src_format %s, dst_format %s stub!\n", iface, adapter_idx, debug_d3ddevicetype(device_type), debug_d3dformat(src_format), @@ -4149,6 +4213,108 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormatConversion(IWineD3D *iface, return WINED3D_OK; } +static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT adapter_idx, WINED3DDEVTYPE device_type, + enum wined3d_format_id display_format, enum wined3d_format_id backbuffer_format, BOOL windowed) +{ + UINT mode_count; + HRESULT hr; + + TRACE("iface %p, adapter_idx %u, device_type %s, display_format %s, backbuffer_format %s, windowed %#x.\n", + iface, adapter_idx, debug_d3ddevicetype(device_type), debug_d3dformat(display_format), + debug_d3dformat(backbuffer_format), windowed); + + if (adapter_idx >= IWineD3D_GetAdapterCount(iface)) + { + WARN_(d3d_caps)("adapter_idx >= IWineD3D_GetAdapterCount(iface), returning WINED3DERR_INVALIDCALL\n"); + return WINED3DERR_INVALIDCALL; + } + + /* The task of this function is to check whether a certain display / backbuffer format + * combination is available on the given adapter. In fullscreen mode microsoft specified + * that the display format shouldn't provide alpha and that ignoring alpha the backbuffer + * and display format should match exactly. + * In windowed mode format conversion can occur and this depends on the driver. When format + * conversion is done, this function should nevertheless fail and applications need to use + * CheckDeviceFormatConversion. + * At the moment we assume that fullscreen and windowed have the same capabilities. */ + + /* There are only 4 display formats. */ + if (!(display_format == WINED3DFMT_B5G6R5_UNORM + || display_format == WINED3DFMT_B5G5R5X1_UNORM + || display_format == WINED3DFMT_B8G8R8X8_UNORM + || display_format == WINED3DFMT_B10G10R10A2_UNORM)) + { + TRACE_(d3d_caps)("Format %s is not supported as display format.\n", debug_d3dformat(display_format)); + return WINED3DERR_NOTAVAILABLE; + } + + /* If the requested display format is not available, don't continue. */ + mode_count = IWineD3DImpl_GetAdapterModeCount(iface, adapter_idx, display_format); + if (!mode_count) + { + TRACE_(d3d_caps)("No available modes for display format %s.\n", debug_d3dformat(display_format)); + return WINED3DERR_NOTAVAILABLE; + } + + /* Windowed mode allows you to specify WINED3DFMT_UNKNOWN for the backbuffer format, + * it means 'reuse' the display format for the backbuffer. */ + if (!windowed && backbuffer_format == WINED3DFMT_UNKNOWN) + { + TRACE_(d3d_caps)("backbuffer_format WINED3FMT_UNKNOWN only available in windowed mode.\n"); + return WINED3DERR_NOTAVAILABLE; + } + + /* In FULLSCREEN mode WINED3DFMT_B5G6R5_UNORM can only be mixed with + * backbuffer format WINED3DFMT_B5G6R5_UNORM. */ + if (display_format == WINED3DFMT_B5G6R5_UNORM && backbuffer_format != WINED3DFMT_B5G6R5_UNORM) + { + TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s / %s.\n", + debug_d3dformat(display_format), debug_d3dformat(backbuffer_format)); + return WINED3DERR_NOTAVAILABLE; + } + + /* In FULLSCREEN mode WINED3DFMT_B5G5R5X1_UNORM can only be mixed with + * backbuffer formats WINED3DFMT_B5G5R5X1_UNORM and + * WINED3DFMT_B5G5R5A1_UNORM. */ + if (display_format == WINED3DFMT_B5G5R5X1_UNORM + && !(backbuffer_format == WINED3DFMT_B5G5R5X1_UNORM || backbuffer_format == WINED3DFMT_B5G5R5A1_UNORM)) + { + TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s / %s.\n", + debug_d3dformat(display_format), debug_d3dformat(backbuffer_format)); + return WINED3DERR_NOTAVAILABLE; + } + + /* In FULLSCREEN mode WINED3DFMT_B8G8R8X8_UNORM can only be mixed with + * backbuffer formats WINED3DFMT_B8G8R8X8_UNORM and + * WINED3DFMT_B8G8R8A8_UNORM. */ + if (display_format == WINED3DFMT_B8G8R8X8_UNORM + && !(backbuffer_format == WINED3DFMT_B8G8R8X8_UNORM || backbuffer_format == WINED3DFMT_B8G8R8A8_UNORM)) + { + TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s / %s.\n", + debug_d3dformat(display_format), debug_d3dformat(backbuffer_format)); + return WINED3DERR_NOTAVAILABLE; + } + + /* WINED3DFMT_B10G10R10A2_UNORM is only allowed in fullscreen mode and it + * can only be mixed with backbuffer format WINED3DFMT_B10G10R10A2_UNORM. */ + if (display_format == WINED3DFMT_B10G10R10A2_UNORM + && (backbuffer_format != WINED3DFMT_B10G10R10A2_UNORM || windowed)) + { + TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s / %s.\n", + debug_d3dformat(display_format), debug_d3dformat(backbuffer_format)); + return WINED3DERR_NOTAVAILABLE; + } + + /* Use CheckDeviceFormat to see if the backbuffer_format is usable with the given display_format */ + hr = IWineD3DImpl_CheckDeviceFormat(iface, adapter_idx, device_type, display_format, + WINED3DUSAGE_RENDERTARGET, WINED3DRTYPE_SURFACE, backbuffer_format, SURFACE_OPENGL); + if (FAILED(hr)) + TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s / %s.\n", + debug_d3dformat(display_format), debug_d3dformat(backbuffer_format)); + + return hr; +} + /* Note: d3d8 passes in a pointer to a D3DCAPS8 structure, which is a true subset of a D3DCAPS9 structure. However, it has to come via a void * as the d3d8 interface cannot import the d3d9 header */ @@ -4161,7 +4327,7 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, int ps_selected_mode; struct shader_caps shader_caps; struct fragment_caps fragment_caps; - DWORD ckey_caps, blit_caps, fx_caps; + DWORD ckey_caps, blit_caps, fx_caps, pal_caps; TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", This, Adapter, DeviceType, pCaps); @@ -4688,6 +4854,8 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, WINEDDCAPS_COLORKEY | WINEDDCAPS_COLORKEYHWASSIST | WINEDDCAPS_ALIGNBOUNDARYSRC; + pal_caps = WINEDDPCAPS_8BIT | + WINEDDPCAPS_PRIMARYSURFACE; /* Fill the ddraw caps structure */ pCaps->DirectDrawCaps.Caps = WINEDDCAPS_GDI | @@ -4698,6 +4866,9 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, WINEDDCAPS2_PRIMARYGAMMA | WINEDDCAPS2_WIDESURFACES | WINEDDCAPS2_CANRENDERWINDOWED; + pCaps->DirectDrawCaps.CKeyCaps = ckey_caps; + pCaps->DirectDrawCaps.FXCaps = fx_caps; + pCaps->DirectDrawCaps.PalCaps = pal_caps; pCaps->DirectDrawCaps.SVBCaps = blit_caps; pCaps->DirectDrawCaps.SVBCKeyCaps = ckey_caps; pCaps->DirectDrawCaps.SVBFXCaps = fx_caps; @@ -4733,18 +4904,15 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, return WINED3D_OK; } -static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT adapter_idx, - WINED3DDEVTYPE device_type, HWND focus_window, DWORD flags, IUnknown *parent, - IWineD3DDeviceParent *device_parent, IWineD3DDevice **device) +static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT adapter_idx, WINED3DDEVTYPE device_type, + HWND focus_window, DWORD flags, IWineD3DDeviceParent *device_parent, IWineD3DDevice **device) { IWineD3DImpl *This = (IWineD3DImpl *)iface; IWineD3DDeviceImpl *object; HRESULT hr; - TRACE("iface %p, adapter_idx %u, device_type %#x, focus_window %p, flags %#x.\n" - "parent %p, device_parent %p, device %p.\n", - iface, adapter_idx, device_type, focus_window, flags, - parent, device_parent, device); + TRACE("iface %p, adapter_idx %u, device_type %#x, focus_window %p, flags %#x, device_parent %p, device %p.\n", + iface, adapter_idx, device_type, focus_window, flags, device_parent, device); /* Validate the adapter number. If no adapters are available(no GL), ignore the adapter * number and create a device without a 3D adapter for 2D only operation. */ @@ -4760,7 +4928,7 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT adapter_id return E_OUTOFMEMORY; } - hr = device_init(object, This, adapter_idx, device_type, focus_window, flags, parent, device_parent); + hr = device_init(object, This, adapter_idx, device_type, focus_window, flags, device_parent); if (FAILED(hr)) { WARN("Failed to initialize device, hr %#x.\n", hr); @@ -4776,11 +4944,11 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT adapter_id return WINED3D_OK; } -static HRESULT WINAPI IWineD3DImpl_GetParent(IWineD3D *iface, IUnknown **pParent) { - IWineD3DImpl *This = (IWineD3DImpl *)iface; - IUnknown_AddRef(This->parent); - *pParent = This->parent; - return WINED3D_OK; +static void * WINAPI IWineD3DImpl_GetParent(IWineD3D *iface) +{ + TRACE("iface %p.\n", iface); + + return ((IWineD3DImpl *)iface)->parent; } static void WINE_GLAPI invalid_func(const void *data) @@ -4969,6 +5137,7 @@ static void fillGLAttribFuncs(const struct wined3d_gl_info *gl_info) } } +/* Do not call while under the GL lock. */ static BOOL InitAdapters(IWineD3DImpl *This) { static HMODULE mod_gl; @@ -5071,11 +5240,7 @@ static BOOL InitAdapters(IWineD3DImpl *This) hdc = fake_gl_ctx.dc; - /* Use the VideoRamSize registry setting when set */ - if(wined3d_settings.emulated_textureram) - adapter->TextureRam = wined3d_settings.emulated_textureram; - else - adapter->TextureRam = adapter->gl_info.vidmem; + adapter->TextureRam = adapter->driver_info.vidmem; adapter->UsedTextureRam = 0; TRACE("Emulating %dMB of texture ram\n", adapter->TextureRam/(1024*1024)); @@ -5298,7 +5463,8 @@ const struct wined3d_parent_ops wined3d_null_parent_ops = wined3d_null_wined3d_object_destroyed, }; -HRESULT wined3d_init(IWineD3DImpl *wined3d, UINT version, IUnknown *parent) +/* Do not call while under the GL lock. */ +HRESULT wined3d_init(IWineD3DImpl *wined3d, UINT version, void *parent) { wined3d->lpVtbl = &IWineD3D_Vtbl; wined3d->dxVersion = version; diff --git a/dll/directx/wine/wined3d/drawprim.c b/dll/directx/wine/wined3d/drawprim.c index b36ef5b49ae..6b6102bc330 100644 --- a/dll/directx/wine/wined3d/drawprim.c +++ b/dll/directx/wine/wined3d/drawprim.c @@ -33,13 +33,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_draw); #include /* GL locking is done by the caller */ -static void drawStridedFast(IWineD3DDevice *iface, GLenum primitive_type, - UINT count, UINT idx_size, const void *idx_data, UINT start_idx) +static void drawStridedFast(GLenum primitive_type, UINT count, UINT idx_size, const void *idx_data, UINT start_idx) { if (idx_size) { - TRACE("(%p) : glElements(%x, %d, ...)\n", iface, primitive_type, count); - glDrawElements(primitive_type, count, idx_size == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (const char *)idx_data + (idx_size * start_idx)); @@ -47,8 +44,6 @@ static void drawStridedFast(IWineD3DDevice *iface, GLenum primitive_type, } else { - TRACE("(%p) : glDrawArrays(%#x, %d, %d)\n", iface, primitive_type, start_idx, count); - glDrawArrays(primitive_type, start_idx, count); checkGLcall("glDrawArrays"); } @@ -69,9 +64,10 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context const DWORD *pIdxBufL = NULL; UINT vx_index; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - const UINT *streamOffset = This->stateBlock->streamOffset; - LONG SkipnStrides = startIdx + This->stateBlock->loadBaseVertexIndex; - BOOL pixelShader = use_ps(This->stateBlock); + const struct wined3d_state *state = &This->stateBlock->state; + const struct wined3d_stream_state *streams = state->streams; + LONG SkipnStrides = startIdx + state->load_base_vertex_index; + BOOL pixelShader = use_ps(state); BOOL specular_fog = FALSE; const BYTE *texCoords[WINED3DDP_MAXTEXCOORD]; const BYTE *diffuse = NULL, *specular = NULL, *normal = NULL, *position = NULL; @@ -91,7 +87,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context * supported or other reason), or with user pointer drawing idxData * will be non-NULL. */ if (!idxData) - idxData = buffer_get_sysmem((struct wined3d_buffer *)This->stateBlock->pIndexData, gl_info); + idxData = buffer_get_sysmem(state->index_buffer, gl_info); if (idxSize == 2) pIdxBufS = idxData; else pIdxBufL = idxData; @@ -106,13 +102,13 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context if (si->use_map & (1 << WINED3D_FFP_POSITION)) { element = &si->elements[WINED3D_FFP_POSITION]; - position = element->data + streamOffset[element->stream_idx]; + position = element->data + streams[element->stream_idx].offset; } if (si->use_map & (1 << WINED3D_FFP_NORMAL)) { element = &si->elements[WINED3D_FFP_NORMAL]; - normal = element->data + streamOffset[element->stream_idx]; + normal = element->data + streams[element->stream_idx].offset; } else { @@ -123,10 +119,10 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context if (si->use_map & (1 << WINED3D_FFP_DIFFUSE)) { element = &si->elements[WINED3D_FFP_DIFFUSE]; - diffuse = element->data + streamOffset[element->stream_idx]; + diffuse = element->data + streams[element->stream_idx].offset; - if (num_untracked_materials && element->format_desc->format != WINED3DFMT_B8G8R8A8_UNORM) - FIXME("Implement diffuse color tracking from %s\n", debug_d3dformat(element->format_desc->format)); + if (num_untracked_materials && element->format->id != WINED3DFMT_B8G8R8A8_UNORM) + FIXME("Implement diffuse color tracking from %s\n", debug_d3dformat(element->format->id)); } else { @@ -136,18 +132,18 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context if (si->use_map & (1 << WINED3D_FFP_SPECULAR)) { element = &si->elements[WINED3D_FFP_SPECULAR]; - specular = element->data + streamOffset[element->stream_idx]; + specular = element->data + streams[element->stream_idx].offset; /* special case where the fog density is stored in the specular alpha channel */ - if (This->stateBlock->renderState[WINED3DRS_FOGENABLE] - && (This->stateBlock->renderState[WINED3DRS_FOGVERTEXMODE] == WINED3DFOG_NONE - || si->elements[WINED3D_FFP_POSITION].format_desc->format == WINED3DFMT_R32G32B32A32_FLOAT) - && This->stateBlock->renderState[WINED3DRS_FOGTABLEMODE] == WINED3DFOG_NONE) + if (state->render_states[WINED3DRS_FOGENABLE] + && (state->render_states[WINED3DRS_FOGVERTEXMODE] == WINED3DFOG_NONE + || si->elements[WINED3D_FFP_POSITION].format->id == WINED3DFMT_R32G32B32A32_FLOAT) + && state->render_states[WINED3DRS_FOGTABLEMODE] == WINED3DFOG_NONE) { if (gl_info->supported[EXT_FOG_COORD]) { - if (element->format_desc->format == WINED3DFMT_B8G8R8A8_UNORM) specular_fog = TRUE; - else FIXME("Implement fog coordinates from %s\n", debug_d3dformat(element->format_desc->format)); + if (element->format->id == WINED3DFMT_B8G8R8A8_UNORM) specular_fog = TRUE; + else FIXME("Implement fog coordinates from %s\n", debug_d3dformat(element->format->id)); } else { @@ -169,7 +165,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context for (textureNo = 0; textureNo < texture_stages; ++textureNo) { - int coordIdx = This->stateBlock->textureState[textureNo][WINED3DTSS_TEXCOORDINDEX]; + int coordIdx = state->texture_states[textureNo][WINED3DTSS_TEXCOORDINDEX]; DWORD texture_idx = This->texUnitMap[textureNo]; if (!gl_info->supported[ARB_MULTITEXTURE] && textureNo > 0) @@ -178,7 +174,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context continue; } - if (!pixelShader && !This->stateBlock->textures[textureNo]) continue; + if (!pixelShader && !state->textures[textureNo]) continue; if (texture_idx == WINED3D_UNMAPPED_STAGE) continue; @@ -196,7 +192,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context if (si->use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx))) { element = &si->elements[WINED3D_FFP_TEXCOORD0 + coordIdx]; - texCoords[coordIdx] = element->data + streamOffset[element->stream_idx]; + texCoords[coordIdx] = element->data + streams[element->stream_idx].offset; tex_mask |= (1 << textureNo); } else @@ -221,13 +217,13 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context */ /* For indexed data, we need to go a few more strides in */ - if (idxData != NULL) { - + if (idxData) + { /* Indexed so work out the number of strides to skip */ if (idxSize == 2) - SkipnStrides = pIdxBufS[startIdx + vx_index] + This->stateBlock->loadBaseVertexIndex; + SkipnStrides = pIdxBufS[startIdx + vx_index] + state->load_base_vertex_index; else - SkipnStrides = pIdxBufL[startIdx + vx_index] + This->stateBlock->loadBaseVertexIndex; + SkipnStrides = pIdxBufL[startIdx + vx_index] + state->load_base_vertex_index; } tmp_tex_mask = tex_mask; @@ -239,11 +235,11 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context if (!(tmp_tex_mask & 1)) continue; - coord_idx = This->stateBlock->textureState[texture][WINED3DTSS_TEXCOORDINDEX]; + coord_idx = state->texture_states[texture][WINED3DTSS_TEXCOORDINDEX]; ptr = texCoords[coord_idx] + (SkipnStrides * si->elements[WINED3D_FFP_TEXCOORD0 + coord_idx].stride); texture_idx = This->texUnitMap[texture]; - multi_texcoord_funcs[si->elements[WINED3D_FFP_TEXCOORD0 + coord_idx].format_desc->emit_idx]( + multi_texcoord_funcs[si->elements[WINED3D_FFP_TEXCOORD0 + coord_idx].format->emit_idx]( GL_TEXTURE0_ARB + texture_idx, ptr); } @@ -251,7 +247,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context if (diffuse) { const void *ptrToCoords = diffuse + SkipnStrides * si->elements[WINED3D_FFP_DIFFUSE].stride; - diffuse_funcs[si->elements[WINED3D_FFP_DIFFUSE].format_desc->emit_idx](ptrToCoords); + diffuse_funcs[si->elements[WINED3D_FFP_DIFFUSE].format->emit_idx](ptrToCoords); if (num_untracked_materials) { DWORD diffuseColor = ((const DWORD *)ptrToCoords)[0]; @@ -274,7 +270,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context if (specular) { const void *ptrToCoords = specular + SkipnStrides * si->elements[WINED3D_FFP_SPECULAR].stride; - specular_funcs[si->elements[WINED3D_FFP_SPECULAR].format_desc->emit_idx](ptrToCoords); + specular_funcs[si->elements[WINED3D_FFP_SPECULAR].format->emit_idx](ptrToCoords); if (specular_fog) { @@ -284,21 +280,20 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context } /* Normal -------------------------------- */ - if (normal != NULL) { + if (normal) + { const void *ptrToCoords = normal + SkipnStrides * si->elements[WINED3D_FFP_NORMAL].stride; - normal_funcs[si->elements[WINED3D_FFP_NORMAL].format_desc->emit_idx](ptrToCoords); + normal_funcs[si->elements[WINED3D_FFP_NORMAL].format->emit_idx](ptrToCoords); } /* Position -------------------------------- */ if (position) { const void *ptrToCoords = position + SkipnStrides * si->elements[WINED3D_FFP_POSITION].stride; - position_funcs[si->elements[WINED3D_FFP_POSITION].format_desc->emit_idx](ptrToCoords); + position_funcs[si->elements[WINED3D_FFP_POSITION].format->emit_idx](ptrToCoords); } /* For non indexed mode, step onto next parts */ - if (idxData == NULL) { - ++SkipnStrides; - } + if (!idxData) ++SkipnStrides; } glEnd(); @@ -306,10 +301,9 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context } /* GL locking is done by the caller */ -static inline void send_attribute(IWineD3DDeviceImpl *This, WINED3DFORMAT format, const UINT index, const void *ptr) +static inline void send_attribute(const struct wined3d_gl_info *gl_info, + enum wined3d_format_id format, const UINT index, const void *ptr) { - const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; - switch(format) { case WINED3DFMT_R32_FLOAT: @@ -417,17 +411,15 @@ static inline void send_attribute(IWineD3DDeviceImpl *This, WINED3DFORMAT format } /* GL locking is done by the caller */ -static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream_info *si, UINT numberOfVertices, - GLenum glPrimitiveType, const void *idxData, UINT idxSize, UINT startIdx) +static void drawStridedSlowVs(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state, + const struct wined3d_stream_info *si, UINT numberOfVertices, GLenum glPrimitiveType, + const void *idxData, UINT idxSize, UINT startIdx) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; - const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; - LONG SkipnStrides = startIdx + This->stateBlock->loadBaseVertexIndex; - const WORD *pIdxBufS = NULL; - const DWORD *pIdxBufL = NULL; + LONG SkipnStrides = startIdx + state->load_base_vertex_index; + const DWORD *pIdxBufL = NULL; + const WORD *pIdxBufS = NULL; UINT vx_index; int i; - IWineD3DStateBlockImpl *stateblock = This->stateBlock; const BYTE *ptr; if (idxSize) @@ -437,7 +429,7 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream * supported or other reason), or with user pointer drawing idxData * will be non-NULL. */ if (!idxData) - idxData = buffer_get_sysmem((struct wined3d_buffer *)This->stateBlock->pIndexData, gl_info); + idxData = buffer_get_sysmem(state->index_buffer, gl_info); if (idxSize == 2) pIdxBufS = idxData; else pIdxBufL = idxData; @@ -449,25 +441,25 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream /* Start drawing in GL */ glBegin(glPrimitiveType); - for (vx_index = 0; vx_index < numberOfVertices; ++vx_index) { - if (idxData != NULL) { - + for (vx_index = 0; vx_index < numberOfVertices; ++vx_index) + { + if (idxData) + { /* Indexed so work out the number of strides to skip */ if (idxSize == 2) - SkipnStrides = pIdxBufS[startIdx + vx_index] + stateblock->loadBaseVertexIndex; + SkipnStrides = pIdxBufS[startIdx + vx_index] + state->load_base_vertex_index; else - SkipnStrides = pIdxBufL[startIdx + vx_index] + stateblock->loadBaseVertexIndex; + SkipnStrides = pIdxBufL[startIdx + vx_index] + state->load_base_vertex_index; } for (i = MAX_ATTRIBS - 1; i >= 0; i--) { if (!(si->use_map & (1 << i))) continue; - ptr = si->elements[i].data + - si->elements[i].stride * SkipnStrides + - stateblock->streamOffset[si->elements[i].stream_idx]; + ptr = si->elements[i].data + si->elements[i].stride * SkipnStrides + + state->streams[si->elements[i].stream_idx].offset; - send_attribute(This, si->elements[i].format_desc->format, i, ptr); + send_attribute(gl_info, si->elements[i].format->id, i, ptr); } SkipnStrides++; } @@ -476,17 +468,16 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream } /* GL locking is done by the caller */ -static inline void drawStridedInstanced(IWineD3DDevice *iface, const struct wined3d_stream_info *si, - UINT numberOfVertices, GLenum glPrimitiveType, const void *idxData, UINT idxSize, - UINT startIdx) +static void drawStridedInstanced(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state, + const struct wined3d_stream_info *si, UINT numberOfVertices, GLenum glPrimitiveType, + const void *idxData, UINT idxSize, UINT startIdx) { UINT numInstances = 0, i; int numInstancedAttribs = 0, j; UINT instancedData[sizeof(si->elements) / sizeof(*si->elements) /* 16 */]; - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; - IWineD3DStateBlockImpl *stateblock = This->stateBlock; - if (idxSize == 0) { + if (!idxSize) + { /* This is a nasty thing. MSDN says no hardware supports that and apps have to use software vertex processing. * We don't support this for now * @@ -497,19 +488,19 @@ static inline void drawStridedInstanced(IWineD3DDevice *iface, const struct wine return; } - TRACE("(%p) : glElements(%x, %d, ...)\n", This, glPrimitiveType, numberOfVertices); - /* First, figure out how many instances we have to draw */ - for(i = 0; i < MAX_STREAMS; i++) { + for (i = 0; i < MAX_STREAMS; ++i) + { /* Look at the streams and take the first one which matches */ - if(((stateblock->streamFlags[i] & WINED3DSTREAMSOURCE_INSTANCEDATA) || (stateblock->streamFlags[i] & WINED3DSTREAMSOURCE_INDEXEDDATA)) && stateblock->streamSource[i]) { - /* D3D9 could set streamFreq 0 with (INSTANCEDATA or INDEXEDDATA) and then it is handled as 1. See d3d9/tests/visual.c-> stream_test() */ - if(stateblock->streamFreq[i] == 0){ - numInstances = 1; - } else { - numInstances = stateblock->streamFreq[i]; /* use the specified number of instances from the first matched stream. See d3d9/tests/visual.c-> stream_test() */ - } - break; /* break, because only the first suitable value is interesting */ + if (state->streams[i].buffer + && ((state->streams[i].flags & WINED3DSTREAMSOURCE_INSTANCEDATA) + || (state->streams[i].flags & WINED3DSTREAMSOURCE_INDEXEDDATA))) + { + /* Use the specified number of instances from the first matched + * stream. A streamFreq of 0 (with INSTANCEDATA or INDEXEDDATA) + * is handled as 1. See d3d9/tests/visual.c-> stream_test(). */ + numInstances = state->streams[i].frequency ? state->streams[i].frequency : 1; + break; } } @@ -517,7 +508,7 @@ static inline void drawStridedInstanced(IWineD3DDevice *iface, const struct wine { if (!(si->use_map & (1 << i))) continue; - if (stateblock->streamFlags[si->elements[i].stream_idx] & WINED3DSTREAMSOURCE_INSTANCEDATA) + if (state->streams[si->elements[i].stream_idx].flags & WINED3DSTREAMSOURCE_INSTANCEDATA) { instancedData[numInstancedAttribs] = i; numInstancedAttribs++; @@ -528,17 +519,16 @@ static inline void drawStridedInstanced(IWineD3DDevice *iface, const struct wine for(i = 0; i < numInstances; i++) { /* Specify the instanced attributes using immediate mode calls */ for(j = 0; j < numInstancedAttribs; j++) { - const BYTE *ptr = si->elements[instancedData[j]].data + - si->elements[instancedData[j]].stride * i + - stateblock->streamOffset[si->elements[instancedData[j]].stream_idx]; + const BYTE *ptr = si->elements[instancedData[j]].data + + si->elements[instancedData[j]].stride * i + + state->streams[si->elements[instancedData[j]].stream_idx].offset; if (si->elements[instancedData[j]].buffer_object) { - struct wined3d_buffer *vb = - (struct wined3d_buffer *)stateblock->streamSource[si->elements[instancedData[j]].stream_idx]; - ptr += (ULONG_PTR)buffer_get_sysmem(vb, &This->adapter->gl_info); + struct wined3d_buffer *vb = state->streams[si->elements[instancedData[j]].stream_idx].buffer; + ptr += (ULONG_PTR)buffer_get_sysmem(vb, gl_info); } - send_attribute(This, si->elements[instancedData[j]].format_desc->format, instancedData[j], ptr); + send_attribute(gl_info, si->elements[instancedData[j]].format->id, instancedData[j], ptr); } glDrawElements(glPrimitiveType, numberOfVertices, idxSize == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, @@ -547,8 +537,8 @@ static inline void drawStridedInstanced(IWineD3DDevice *iface, const struct wine } } -static inline void remove_vbos(IWineD3DDeviceImpl *This, const struct wined3d_gl_info *gl_info, - struct wined3d_stream_info *s) +static void remove_vbos(const struct wined3d_gl_info *gl_info, + const struct wined3d_state *state, struct wined3d_stream_info *s) { unsigned int i; @@ -561,7 +551,7 @@ static inline void remove_vbos(IWineD3DDeviceImpl *This, const struct wined3d_gl e = &s->elements[i]; if (e->buffer_object) { - struct wined3d_buffer *vb = (struct wined3d_buffer *)This->stateBlock->streamSource[e->stream_idx]; + struct wined3d_buffer *vb = state->streams[e->stream_idx].buffer; e->buffer_object = 0; e->data = (BYTE *)((ULONG_PTR)e->data + (ULONG_PTR)buffer_get_sysmem(vb, gl_info)); } @@ -573,21 +563,22 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + const struct wined3d_state *state = &This->stateBlock->state; struct wined3d_context *context; unsigned int i; if (!index_count) return; - if (This->stateBlock->renderState[WINED3DRS_COLORWRITEENABLE]) + if (state->render_states[WINED3DRS_COLORWRITEENABLE]) { /* Invalidate the back buffer memory so LockRect will read it the next time */ for (i = 0; i < This->adapter->gl_info.limits.buffers; ++i) { - IWineD3DSurface *target = (IWineD3DSurface *)This->render_targets[i]; + IWineD3DSurfaceImpl *target = This->render_targets[i]; if (target) { - IWineD3DSurface_LoadLocation(target, SFLAG_INDRAWABLE, NULL); - IWineD3DSurface_ModifyLocation(target, SFLAG_INDRAWABLE, TRUE); + surface_load_location(target, SFLAG_INDRAWABLE, NULL); + surface_modify_location(target, SFLAG_INDRAWABLE, TRUE); } } } @@ -613,8 +604,7 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT * depthstencil for D3DCMP_NEVER and D3DCMP_ALWAYS as well. Also note * that we never copy the stencil data.*/ DWORD location = context->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN; - if (This->stateBlock->renderState[WINED3DRS_ZWRITEENABLE] - || This->stateBlock->renderState[WINED3DRS_ZENABLE]) + if (state->render_states[WINED3DRS_ZWRITEENABLE] || state->render_states[WINED3DRS_ZENABLE]) { RECT current_rect, draw_rect, r; @@ -634,28 +624,37 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT if (!EqualRect(&r, &draw_rect)) surface_load_ds_location(This->depth_stencil, context, location); - if (This->stateBlock->renderState[WINED3DRS_ZWRITEENABLE]) + if (state->render_states[WINED3DRS_ZWRITEENABLE]) { surface_modify_ds_location(This->depth_stencil, location, This->depth_stencil->ds_current_size.cx, This->depth_stencil->ds_current_size.cy); - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->depth_stencil, SFLAG_INDRAWABLE, TRUE); + surface_modify_location(This->depth_stencil, SFLAG_INDRAWABLE, TRUE); } } } + if ((!context->gl_info->supported[WINED3D_GL_VERSION_2_0] + || (!glPointParameteri && !context->gl_info->supported[NV_POINT_SPRITE])) + && context->render_offscreen + && state->render_states[WINED3DRS_POINTSPRITEENABLE] + && state->gl_primitive_type == GL_POINTS) + { + FIXME("Point sprite coordinate origin switching not supported.\n"); + } + /* Ok, we will be updating the screen from here onwards so grab the lock */ ENTER_GL(); { - GLenum glPrimType = This->stateBlock->gl_primitive_type; + GLenum glPrimType = state->gl_primitive_type; BOOL emulation = FALSE; const struct wined3d_stream_info *stream_info = &This->strided_streams; struct wined3d_stream_info stridedlcl; - if (!use_vs(This->stateBlock)) + if (!use_vs(state)) { if (!This->strided_streams.position_transformed && context->num_untracked_materials - && This->stateBlock->renderState[WINED3DRS_LIGHTING]) + && state->render_states[WINED3DRS_LIGHTING]) { static BOOL warned; if (!warned) { @@ -666,7 +665,7 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT } emulation = TRUE; } - else if (context->fog_coord && This->stateBlock->renderState[WINED3DRS_FOGENABLE]) + else if (context->fog_coord && state->render_states[WINED3DRS_FOGENABLE]) { /* Either write a pipeline replacement shader or convert the specular alpha from unsigned byte * to a float in the vertex buffer @@ -684,13 +683,14 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT if(emulation) { stream_info = &stridedlcl; memcpy(&stridedlcl, &This->strided_streams, sizeof(stridedlcl)); - remove_vbos(This, context->gl_info, &stridedlcl); + remove_vbos(context->gl_info, state, &stridedlcl); } } - if (This->useDrawStridedSlow || emulation) { + if (This->useDrawStridedSlow || emulation) + { /* Immediate mode drawing */ - if (use_vs(This->stateBlock)) + if (use_vs(state)) { static BOOL warned; if (!warned) { @@ -699,17 +699,24 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT } else { TRACE("Using immediate mode with vertex shaders for half float emulation\n"); } - drawStridedSlowVs(iface, stream_info, index_count, glPrimType, idxData, idxSize, StartIdx); - } else { + drawStridedSlowVs(context->gl_info, state, stream_info, + index_count, glPrimType, idxData, idxSize, StartIdx); + } + else + { drawStridedSlow(iface, context, stream_info, index_count, glPrimType, idxData, idxSize, StartIdx); } - } else if(This->instancedDraw) { + } + else if (This->instancedDraw) + { /* Instancing emulation with mixing immediate mode and arrays */ - drawStridedInstanced(iface, &This->strided_streams, index_count, - glPrimType, idxData, idxSize, StartIdx); - } else { - drawStridedFast(iface, glPrimType, index_count, idxSize, idxData, StartIdx); + drawStridedInstanced(context->gl_info, state, stream_info, + index_count, glPrimType, idxData, idxSize, StartIdx); + } + else + { + drawStridedFast(glPrimType, index_count, idxSize, idxData, StartIdx); } } @@ -727,46 +734,6 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT TRACE("Done all gl drawing\n"); - /* Diagnostics */ -#ifdef SHOW_FRAME_MAKEUP - { - static LONG primCounter = 0; - /* NOTE: set primCounter to the value reported by drawprim - before you want to to write frame makeup to /tmp */ - if (primCounter >= 0) { - WINED3DLOCKED_RECT r; - char buffer[80]; - IWineD3DSurface_LockRect(This->render_targets[0], &r, NULL, WINED3DLOCK_READONLY); - sprintf(buffer, "/tmp/backbuffer_%d.tga", primCounter); - TRACE("Saving screenshot %s\n", buffer); - IWineD3DSurface_SaveSnapshot(This->render_targets[0], buffer); - IWineD3DSurface_UnlockRect(This->render_targets[0]); - -#ifdef SHOW_TEXTURE_MAKEUP - { - IWineD3DSurface *pSur; - int textureNo; - for (textureNo = 0; textureNo < MAX_COMBINED_SAMPLERS; ++textureNo) { - if (This->stateBlock->textures[textureNo] != NULL) { - sprintf(buffer, "/tmp/texture_%p_%d_%d.tga", This->stateBlock->textures[textureNo], primCounter, textureNo); - TRACE("Saving texture %s\n", buffer); - if (IWineD3DBaseTexture_GetType(This->stateBlock->textures[textureNo]) == WINED3DRTYPE_TEXTURE) { - IWineD3DTexture_GetSurfaceLevel(This->stateBlock->textures[textureNo], 0, &pSur); - IWineD3DSurface_SaveSnapshot(pSur, buffer); - IWineD3DSurface_Release(pSur); - } else { - FIXME("base Texture isn't of type texture %d\n", IWineD3DBaseTexture_GetType(This->stateBlock->textures[textureNo])); - } - } - } - } -#endif - } - TRACE("drawprim #%d\n", primCounter); - ++primCounter; - } -#endif - /* Control goes back to the device, stateblock values may change again */ This->isInDraw = FALSE; } @@ -774,7 +741,7 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT static void normalize_normal(float *n) { float length = n[0] * n[0] + n[1] * n[1] + n[2] * n[2]; if (length == 0.0f) return; - length = sqrt(length); + length = sqrtf(length); n[0] = n[0] / length; n[1] = n[1] / length; n[2] = n[2] / length; @@ -829,8 +796,7 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This, e = &stream_info.elements[WINED3D_FFP_POSITION]; if (e->buffer_object) { - struct wined3d_buffer *vb; - vb = (struct wined3d_buffer *)This->stateBlock->streamSource[e->stream_idx]; + struct wined3d_buffer *vb = This->stateBlock->state.streams[e->stream_idx].buffer; e->data = (BYTE *)((ULONG_PTR)e->data + (ULONG_PTR)buffer_get_sysmem(vb, context->gl_info)); } vtxStride = e->stride; @@ -859,9 +825,9 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This, for(j = 0; j < info->Height; j++) { for(i = 0; i < info->Width; i++) { const float *v = (const float *)(data + vtxStride * i + vtxStride * info->Stride * j); - if(fabs(v[0]) > max_x) max_x = fabs(v[0]); - if(fabs(v[1]) > max_y) max_y = fabs(v[1]); - if(fabs(v[2]) > max_z) max_z = fabs(v[2]); + if(fabs(v[0]) > max_x) max_x = fabsf(v[0]); + if(fabs(v[1]) > max_y) max_y = fabsf(v[1]); + if(fabs(v[2]) > max_z) max_z = fabsf(v[2]); if(v[2] < neg_z) neg_z = v[2]; } } diff --git a/dll/directx/wine/wined3d/glsl_shader.c b/dll/directx/wine/wined3d/glsl_shader.c index 056e9adb45a..0b5bb3671d3 100644 --- a/dll/directx/wine/wined3d/glsl_shader.c +++ b/dll/directx/wine/wined3d/glsl_shader.c @@ -203,10 +203,13 @@ static void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLhandleA "Fragment shader was successfully compiled to run on hardware.\n", /* fglrx, with \n */ "Fragment shader was successfully compiled to run on hardware.", /* fglrx, no \n */ "Fragment shader(s) linked, vertex shader(s) linked. \n ", /* fglrx, with \n */ + "Fragment shader(s) linked, vertex shader(s) linked. \n", /* fglrx, with \n */ "Fragment shader(s) linked, vertex shader(s) linked.", /* fglrx, no \n */ "Vertex shader(s) linked, no fragment shader(s) defined. \n ", /* fglrx, with \n */ + "Vertex shader(s) linked, no fragment shader(s) defined. \n", /* fglrx, with \n */ "Vertex shader(s) linked, no fragment shader(s) defined.", /* fglrx, no \n */ "Fragment shader(s) linked, no vertex shader(s) defined. \n ", /* fglrx, with \n */ + "Fragment shader(s) linked, no vertex shader(s) defined. \n", /* fglrx, with \n */ "Fragment shader(s) linked, no vertex shader(s) defined.", /* fglrx, no \n */ }; @@ -229,8 +232,10 @@ static void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLhandleA GL_EXTCALL(glGetInfoLogARB(obj, infologLength, NULL, infoLog)); is_spam = FALSE; - for(i = 0; i < sizeof(spam) / sizeof(spam[0]); i++) { - if(strcmp(infoLog, spam[i]) == 0) { + for (i = 0; i < sizeof(spam) / sizeof(*spam); ++i) + { + if (!strcmp(infoLog, spam[i])) + { is_spam = TRUE; break; } @@ -251,6 +256,17 @@ static void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLhandleA } } +/* GL locking is done by the caller. */ +static void shader_glsl_compile(const struct wined3d_gl_info *gl_info, GLhandleARB shader, const char *src) +{ + TRACE("Compiling shader object %u.\n", shader); + GL_EXTCALL(glShaderSourceARB(shader, 1, &src, NULL)); + checkGLcall("glShaderSourceARB"); + GL_EXTCALL(glCompileShaderARB(shader)); + checkGLcall("glCompileShaderARB"); + print_glsl_info_log(gl_info, shader); +} + /* GL locking is done by the caller. */ static void shader_glsl_dump_program_source(const struct wined3d_gl_info *gl_info, GLhandleARB program) { @@ -692,11 +708,12 @@ static void shader_glsl_load_np2fixup_constants( for (i = 0; fixup; fixup >>= 1, ++i) { const unsigned char idx = prog->np2Fixup_info->idx[i]; - const IWineD3DBaseTextureImpl* const tex = (const IWineD3DBaseTextureImpl*) stateBlock->textures[i]; - GLfloat* tex_dim = &np2fixup_constants[(idx >> 1) * 4]; + const IWineD3DBaseTextureImpl *tex = stateBlock->state.textures[i]; + GLfloat *tex_dim = &np2fixup_constants[(idx >> 1) * 4]; - if (!tex) { - FIXME("Nonexistent texture is flagged for NP2 texcoord fixup\n"); + if (!tex) + { + ERR("Nonexistent texture is flagged for NP2 texcoord fixup.\n"); continue; } @@ -735,19 +752,20 @@ static void shader_glsl_load_constants(const struct wined3d_context *context, programId = prog->programId; constant_version = prog->constant_version; - if (useVertexShader) { - IWineD3DBaseShaderImpl* vshader = (IWineD3DBaseShaderImpl*) stateBlock->vertexShader; + if (useVertexShader) + { + IWineD3DBaseShaderImpl *vshader = (IWineD3DBaseShaderImpl *)stateBlock->state.vertex_shader; /* Load DirectX 9 float constants/uniforms for vertex shader */ - shader_glsl_load_constantsF(vshader, gl_info, stateBlock->vertexShaderConstantF, + shader_glsl_load_constantsF(vshader, gl_info, stateBlock->state.vs_consts_f, prog->vuniformF_locations, &priv->vconst_heap, priv->stack, constant_version); /* Load DirectX 9 integer constants/uniforms for vertex shader */ - shader_glsl_load_constantsI(vshader, gl_info, prog->vuniformI_locations, stateBlock->vertexShaderConstantI, + shader_glsl_load_constantsI(vshader, gl_info, prog->vuniformI_locations, stateBlock->state.vs_consts_i, stateBlock->changed.vertexShaderConstantsI & vshader->baseShader.reg_maps.integer_constants); /* Load DirectX 9 boolean constants/uniforms for vertex shader */ - shader_glsl_load_constantsB(vshader, gl_info, programId, stateBlock->vertexShaderConstantB, + shader_glsl_load_constantsB(vshader, gl_info, programId, stateBlock->state.vs_consts_b, stateBlock->changed.vertexShaderConstantsB & vshader->baseShader.reg_maps.boolean_constants); /* Upload the position fixup params */ @@ -755,20 +773,20 @@ static void shader_glsl_load_constants(const struct wined3d_context *context, checkGLcall("glUniform4fvARB"); } - if (usePixelShader) { - - IWineD3DBaseShaderImpl* pshader = (IWineD3DBaseShaderImpl*) stateBlock->pixelShader; + if (usePixelShader) + { + IWineD3DBaseShaderImpl *pshader = (IWineD3DBaseShaderImpl *)stateBlock->state.pixel_shader; /* Load DirectX 9 float constants/uniforms for pixel shader */ - shader_glsl_load_constantsF(pshader, gl_info, stateBlock->pixelShaderConstantF, + shader_glsl_load_constantsF(pshader, gl_info, stateBlock->state.ps_consts_f, prog->puniformF_locations, &priv->pconst_heap, priv->stack, constant_version); /* Load DirectX 9 integer constants/uniforms for pixel shader */ - shader_glsl_load_constantsI(pshader, gl_info, prog->puniformI_locations, stateBlock->pixelShaderConstantI, + shader_glsl_load_constantsI(pshader, gl_info, prog->puniformI_locations, stateBlock->state.ps_consts_i, stateBlock->changed.pixelShaderConstantsI & pshader->baseShader.reg_maps.integer_constants); /* Load DirectX 9 boolean constants/uniforms for pixel shader */ - shader_glsl_load_constantsB(pshader, gl_info, programId, stateBlock->pixelShaderConstantB, + shader_glsl_load_constantsB(pshader, gl_info, programId, stateBlock->state.ps_consts_b, stateBlock->changed.pixelShaderConstantsB & pshader->baseShader.reg_maps.boolean_constants); /* Upload the environment bump map matrix if needed. The needsbumpmat member specifies the texture stage to load the matrix from. @@ -779,16 +797,17 @@ static void shader_glsl_load_constants(const struct wined3d_context *context, if(prog->bumpenvmat_location[i] == -1) continue; - data = (const float *)&stateBlock->textureState[i][WINED3DTSS_BUMPENVMAT00]; + data = (const float *)&stateBlock->state.texture_states[i][WINED3DTSS_BUMPENVMAT00]; GL_EXTCALL(glUniformMatrix2fvARB(prog->bumpenvmat_location[i], 1, 0, data)); checkGLcall("glUniformMatrix2fvARB"); - /* texbeml needs the luminance scale and offset too. If texbeml is used, needsbumpmat - * is set too, so we can check that in the needsbumpmat check - */ - if(prog->luminancescale_location[i] != -1) { - const GLfloat *scale = (const GLfloat *)&stateBlock->textureState[i][WINED3DTSS_BUMPENVLSCALE]; - const GLfloat *offset = (const GLfloat *)&stateBlock->textureState[i][WINED3DTSS_BUMPENVLOFFSET]; + /* texbeml needs the luminance scale and offset too. If texbeml + * is used, needsbumpmat is set too, so we can check that in the + * needsbumpmat check. */ + if (prog->luminancescale_location[i] != -1) + { + const GLfloat *scale = (const GLfloat *)&stateBlock->state.texture_states[i][WINED3DTSS_BUMPENVLSCALE]; + const GLfloat *offset = (const GLfloat *)&stateBlock->state.texture_states[i][WINED3DTSS_BUMPENVLOFFSET]; GL_EXTCALL(glUniform1fvARB(prog->luminancescale_location[i], 1, scale)); checkGLcall("glUniform1fvARB"); @@ -898,6 +917,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont { IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface; IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device; + const struct wined3d_state *state = &device->stateBlock->state; const struct ps_compile_args *ps_args = ctx_priv->cur_ps_args; const struct wined3d_gl_info *gl_info = context->gl_info; unsigned int i, extra_constants_needed = 0; @@ -977,25 +997,13 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont if (This->baseShader.limits.constant_bool > 0 && This->baseShader.reg_maps.boolean_constants) shader_addline(buffer, "uniform bool %cB[%u];\n", prefix, This->baseShader.limits.constant_bool); - if(!pshader) { + if (!pshader) + { shader_addline(buffer, "uniform vec4 posFixup;\n"); - /* Predeclaration; This function is added at link time based on the pixel shader. - * VS 3.0 shaders have an array OUT[] the shader writes to, earlier versions don't have - * that. We know the input to the reorder function at vertex shader compile time, so - * we can deal with that. The reorder function for a 1.x and 2.x vertex shader can just - * read gl_FrontColor. The output depends on the pixel shader. The reorder function for a - * 1.x and 2.x pshader or for fixed function will write gl_FrontColor, and for a 3.0 shader - * it will write to the varying array. Here we depend on the shader optimizer on sorting that - * out. The nvidia driver only does that if the parameter is inout instead of out, hence the - * inout. - */ - if (reg_maps->shader_version.major >= 3) - { - shader_addline(buffer, "void order_ps_input(in vec4[%u]);\n", MAX_REG_OUTPUT); - } else { - shader_addline(buffer, "void order_ps_input();\n"); - } - } else { + shader_addline(buffer, "void order_ps_input(in vec4[%u]);\n", MAX_REG_OUTPUT); + } + else + { for (i = 0, map = reg_maps->bumpmat; map; map >>= 1, ++i) { if (!(map & 1)) continue; @@ -1044,6 +1052,8 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont for (i = 0; i < This->baseShader.limits.sampler; i++) { if (reg_maps->sampler_type[i]) { + IWineD3DBaseTextureImpl *texture; + switch (reg_maps->sampler_type[i]) { case WINED3DSTT_1D: @@ -1053,20 +1063,17 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont shader_addline(buffer, "uniform sampler1D %csampler%u;\n", prefix, i); break; case WINED3DSTT_2D: + texture = state->textures[i]; if (pshader && ps_args->shadow & (1 << i)) { - if (device->stateBlock->textures[i] - && IWineD3DBaseTexture_GetTextureDimensions(device->stateBlock->textures[i]) - == GL_TEXTURE_RECTANGLE_ARB) + if (texture && texture->baseTexture.target == GL_TEXTURE_RECTANGLE_ARB) shader_addline(buffer, "uniform sampler2DRectShadow %csampler%u;\n", prefix, i); else shader_addline(buffer, "uniform sampler2DShadow %csampler%u;\n", prefix, i); } else { - if (device->stateBlock->textures[i] - && IWineD3DBaseTexture_GetTextureDimensions(device->stateBlock->textures[i]) - == GL_TEXTURE_RECTANGLE_ARB) + if (texture && texture->baseTexture.target == GL_TEXTURE_RECTANGLE_ARB) shader_addline(buffer, "uniform sampler2DRect %csampler%u;\n", prefix, i); else shader_addline(buffer, "uniform sampler2D %csampler%u;\n", prefix, i); @@ -1136,7 +1143,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont */ if (pshader && reg_maps->shader_version.major >= 3) { - if (use_vs(device->stateBlock)) + if (use_vs(state)) { shader_addline(buffer, "varying vec4 IN[%u];\n", vec4_varyings(reg_maps->shader_version.major, gl_info)); } else { @@ -1188,8 +1195,6 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont } } - shader_addline(buffer, "const float FLT_MAX = 1e38;\n"); - /* Start the main program */ shader_addline(buffer, "void main() {\n"); if(pshader && reg_maps->vpos) { @@ -1298,7 +1303,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register * char *register_name, BOOL *is_color, const struct wined3d_shader_instruction *ins) { /* oPos, oFog and oPts in D3D */ - static const char * const hwrastout_reg_names[] = { "gl_Position", "gl_FogFragCoord", "gl_PointSize" }; + static const char * const hwrastout_reg_names[] = {"OUT[10]", "OUT[11].x", "OUT[11].y"}; IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader; const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; @@ -1373,7 +1378,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register * } else { - if (reg->idx == 0) strcpy(register_name, "gl_Color"); + if (!reg->idx) strcpy(register_name, "gl_Color"); else strcpy(register_name, "gl_SecondaryColor"); break; } @@ -1441,18 +1446,17 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register * break; case WINED3DSPR_ATTROUT: - if (reg->idx == 0) sprintf(register_name, "gl_FrontColor"); - else sprintf(register_name, "gl_FrontSecondaryColor"); + if (!reg->idx) sprintf(register_name, "OUT[8]"); + else sprintf(register_name, "OUT[9]"); break; case WINED3DSPR_TEXCRDOUT: /* Vertex shaders >= 3.0: WINED3DSPR_OUTPUT */ - if (This->baseShader.reg_maps.shader_version.major >= 3) sprintf(register_name, "OUT[%u]", reg->idx); - else sprintf(register_name, "gl_TexCoord[%u]", reg->idx); + sprintf(register_name, "OUT[%u]", reg->idx); break; case WINED3DSPR_MISCTYPE: - if (reg->idx == 0) + if (!reg->idx) { /* vPos */ sprintf(register_name, "vpos"); @@ -1473,11 +1477,11 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register * case WINED3DSPR_IMMCONST: switch (reg->immconst_type) { - case WINED3D_IMMCONST_FLOAT: + case WINED3D_IMMCONST_SCALAR: sprintf(register_name, "%.8e", *(const float *)reg->immconst_data); break; - case WINED3D_IMMCONST_FLOAT4: + case WINED3D_IMMCONST_VEC4: sprintf(register_name, "vec4(%.8e, %.8e, %.8e, %.8e)", *(const float *)®->immconst_data[0], *(const float *)®->immconst_data[1], *(const float *)®->immconst_data[2], *(const float *)®->immconst_data[3]); @@ -1829,7 +1833,7 @@ static void shader_glsl_get_sample_function(const struct wined3d_shader_context case WINED3DSTT_CUBE: if (shadow) { - FIXME("Unsupported Cube shadow function.\n "); + FIXME("Unsupported Cube shadow function.\n"); sample_function->name = "unsupportedCubeShadow"; sample_function->coord_mask = 0; } @@ -1862,7 +1866,7 @@ static void shader_glsl_get_sample_function(const struct wined3d_shader_context case WINED3DSTT_VOLUME: if (shadow) { - FIXME("Unsupported 3D shadow function.\n "); + FIXME("Unsupported 3D shadow function.\n"); sample_function->name = "unsupported3DShadow"; sample_function->coord_mask = 0; } @@ -2213,10 +2217,15 @@ static void shader_glsl_pow(const struct wined3d_shader_instruction *ins) shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_0, &src0_param); shader_glsl_add_src_param(ins, &ins->src[1], WINED3DSP_WRITEMASK_0, &src1_param); - if (dst_size > 1) { - shader_addline(buffer, "vec%d(pow(abs(%s), %s)));\n", dst_size, src0_param.param_str, src1_param.param_str); - } else { - shader_addline(buffer, "pow(abs(%s), %s));\n", src0_param.param_str, src1_param.param_str); + if (dst_size > 1) + { + shader_addline(buffer, "vec%u(pow(abs(%s), %s)));\n", + dst_size, src0_param.param_str, src1_param.param_str); + } + else + { + shader_addline(buffer, "pow(abs(%s), %s));\n", + src0_param.param_str, src1_param.param_str); } } @@ -2237,13 +2246,13 @@ static void shader_glsl_log(const struct wined3d_shader_instruction *ins) if (dst_size > 1) { - shader_addline(buffer, "vec%d(%s == 0.0 ? -FLT_MAX : log2(abs(%s))));\n", - dst_size, src0_param.param_str, src0_param.param_str); + shader_addline(buffer, "vec%u(log2(abs(%s))));\n", + dst_size, src0_param.param_str); } else { - shader_addline(buffer, "%s == 0.0 ? -FLT_MAX : log2(abs(%s)));\n", - src0_param.param_str, src0_param.param_str); + shader_addline(buffer, "log2(abs(%s)));\n", + src0_param.param_str); } } @@ -2371,13 +2380,13 @@ static void shader_glsl_rcp(const struct wined3d_shader_instruction *ins) if (mask_size > 1) { - shader_addline(ins->ctx->buffer, "vec%d(%s == 0.0 ? FLT_MAX : 1.0 / %s));\n", - mask_size, src_param.param_str, src_param.param_str); + shader_addline(ins->ctx->buffer, "vec%u(1.0 / %s));\n", + mask_size, src_param.param_str); } else { - shader_addline(ins->ctx->buffer, "%s == 0.0 ? FLT_MAX : 1.0 / %s);\n", - src_param.param_str, src_param.param_str); + shader_addline(ins->ctx->buffer, "1.0 / %s);\n", + src_param.param_str); } } @@ -2395,13 +2404,13 @@ static void shader_glsl_rsq(const struct wined3d_shader_instruction *ins) if (mask_size > 1) { - shader_addline(buffer, "vec%d(%s == 0.0 ? FLT_MAX : inversesqrt(abs(%s))));\n", - mask_size, src_param.param_str, src_param.param_str); + shader_addline(buffer, "vec%u(inversesqrt(abs(%s))));\n", + mask_size, src_param.param_str); } else { - shader_addline(buffer, "%s == 0.0 ? FLT_MAX : inversesqrt(abs(%s)));\n", - src_param.param_str, src_param.param_str); + shader_addline(buffer, "inversesqrt(abs(%s)));\n", + src_param.param_str); } } @@ -3009,6 +3018,7 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins) DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major, ins->ctx->reg_maps->shader_version.minor); glsl_sample_function_t sample_function; + IWineD3DBaseTextureImpl *texture; DWORD sample_flags = 0; DWORD sampler_idx; DWORD mask = 0, swizzle; @@ -3017,16 +3027,19 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins) * 2.0+: Use provided sampler source. */ if (shader_version < WINED3D_SHADER_VERSION(2,0)) sampler_idx = ins->dst[0].reg.idx; else sampler_idx = ins->src[1].reg.idx; + texture = deviceImpl->stateBlock->state.textures[sampler_idx]; if (shader_version < WINED3D_SHADER_VERSION(1,4)) { - DWORD flags = deviceImpl->stateBlock->textureState[sampler_idx][WINED3DTSS_TEXTURETRANSFORMFLAGS]; + const struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data; + DWORD flags = (priv->cur_ps_args->tex_transform >> sampler_idx * WINED3D_PSARGS_TEXTRANSFORM_SHIFT) + & WINED3D_PSARGS_TEXTRANSFORM_MASK; WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx]; /* Projected cube textures don't make a lot of sense, the resulting coordinates stay the same. */ - if (flags & WINED3DTTFF_PROJECTED && sampler_type != WINED3DSTT_CUBE) { + if (flags & WINED3D_PSARGS_PROJECTED && sampler_type != WINED3DSTT_CUBE) { sample_flags |= WINED3D_GLSL_SAMPLE_PROJECTED; - switch (flags & ~WINED3DTTFF_PROJECTED) { + switch (flags & ~WINED3D_PSARGS_PROJECTED) { case WINED3DTTFF_COUNT1: FIXME("WINED3DTTFF_PROJECTED with WINED3DTTFF_COUNT1?\n"); break; case WINED3DTTFF_COUNT2: mask = WINED3DSP_WRITEMASK_1; break; case WINED3DTTFF_COUNT3: mask = WINED3DSP_WRITEMASK_2; break; @@ -3055,10 +3068,8 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins) } } - if(deviceImpl->stateBlock->textures[sampler_idx] && - IWineD3DBaseTexture_GetTextureDimensions(deviceImpl->stateBlock->textures[sampler_idx]) == GL_TEXTURE_RECTANGLE_ARB) { + if (texture && texture->baseTexture.target == GL_TEXTURE_RECTANGLE_ARB) sample_flags |= WINED3D_GLSL_SAMPLE_RECT; - } shader_glsl_get_sample_function(ins->ctx, sampler_idx, sample_flags, &sample_function); mask |= sample_function.coord_mask; @@ -3100,18 +3111,19 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins) DWORD sample_flags = WINED3D_GLSL_SAMPLE_GRAD; DWORD sampler_idx; DWORD swizzle = ins->src[1].swizzle; + IWineD3DBaseTextureImpl *texture; if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD] && !gl_info->supported[EXT_GPU_SHADER4]) { FIXME("texldd used, but not supported by hardware. Falling back to regular tex\n"); - return shader_glsl_tex(ins); + shader_glsl_tex(ins); + return; } sampler_idx = ins->src[1].reg.idx; - if(deviceImpl->stateBlock->textures[sampler_idx] && - IWineD3DBaseTexture_GetTextureDimensions(deviceImpl->stateBlock->textures[sampler_idx]) == GL_TEXTURE_RECTANGLE_ARB) { + texture = deviceImpl->stateBlock->state.textures[sampler_idx]; + if (texture && texture->baseTexture.target == GL_TEXTURE_RECTANGLE_ARB) sample_flags |= WINED3D_GLSL_SAMPLE_RECT; - } shader_glsl_get_sample_function(ins->ctx, sampler_idx, sample_flags, &sample_function); shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &coord_param); @@ -3132,12 +3144,13 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins) DWORD sample_flags = WINED3D_GLSL_SAMPLE_LOD; DWORD sampler_idx; DWORD swizzle = ins->src[1].swizzle; + IWineD3DBaseTextureImpl *texture; sampler_idx = ins->src[1].reg.idx; - if(deviceImpl->stateBlock->textures[sampler_idx] && - IWineD3DBaseTexture_GetTextureDimensions(deviceImpl->stateBlock->textures[sampler_idx]) == GL_TEXTURE_RECTANGLE_ARB) { + texture = deviceImpl->stateBlock->state.textures[sampler_idx]; + if (texture && texture->baseTexture.target == GL_TEXTURE_RECTANGLE_ARB) sample_flags |= WINED3D_GLSL_SAMPLE_RECT; - } + shader_glsl_get_sample_function(ins->ctx, sampler_idx, sample_flags, &sample_function); shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &coord_param); @@ -3456,8 +3469,7 @@ static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *in */ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins) { - IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; - IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device; + const struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data; glsl_sample_function_t sample_function; glsl_src_param_t coord_param; DWORD sampler_idx; @@ -3466,7 +3478,8 @@ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins) char coord_mask[6]; sampler_idx = ins->dst[0].reg.idx; - flags = deviceImpl->stateBlock->textureState[sampler_idx][WINED3DTSS_TEXTURETRANSFORMFLAGS]; + flags = (priv->cur_ps_args->tex_transform >> sampler_idx * WINED3D_PSARGS_TEXTRANSFORM_SHIFT) + & WINED3D_PSARGS_TEXTRANSFORM_MASK; /* Dependent read, not valid with conditional NP2 */ shader_glsl_get_sample_function(ins->ctx, sampler_idx, 0, &sample_function); @@ -3477,10 +3490,10 @@ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins) /* with projective textures, texbem only divides the static texture coord, not the displacement, * so we can't let the GL handle this. */ - if (flags & WINED3DTTFF_PROJECTED) { + if (flags & WINED3D_PSARGS_PROJECTED) { DWORD div_mask=0; char coord_div_mask[3]; - switch (flags & ~WINED3DTTFF_PROJECTED) { + switch (flags & ~WINED3D_PSARGS_PROJECTED) { case WINED3DTTFF_COUNT1: FIXME("WINED3DTTFF_PROJECTED with WINED3DTTFF_COUNT1?\n"); break; case WINED3DTTFF_COUNT2: div_mask = WINED3DSP_WRITEMASK_1; break; case WINED3DTTFF_COUNT3: div_mask = WINED3DSP_WRITEMASK_2; break; @@ -3649,7 +3662,7 @@ static void shader_glsl_input_pack(IWineD3DPixelShader *iface, struct wined3d_sh } else if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_COLOR)) { - if (semantic_idx == 0) + if (!semantic_idx) shader_addline(buffer, "IN[%u]%s = vec4(gl_Color)%s;\n", This->input_reg_map[i], reg_mask, reg_mask); else if (semantic_idx == 1) @@ -3725,37 +3738,28 @@ static void handle_ps3_input(struct wined3d_shader_buffer *buffer, const struct const struct wined3d_shader_signature_element *output_signature, const struct shader_reg_maps *reg_maps_out) { unsigned int i, j; - const char *semantic_name_in, *semantic_name_out; - UINT semantic_idx_in, semantic_idx_out; + const char *semantic_name_in; + UINT semantic_idx_in; DWORD *set; DWORD in_idx; unsigned int in_count = vec4_varyings(3, gl_info); - char reg_mask[6], reg_mask_out[6]; + char reg_mask[6]; char destination[50]; WORD input_map, output_map; set = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*set) * (in_count + 2)); - if (!output_signature) - { - /* Save gl_FrontColor & gl_FrontSecondaryColor before overwriting them. */ - shader_addline(buffer, "vec4 front_color = gl_FrontColor;\n"); - shader_addline(buffer, "vec4 front_secondary_color = gl_FrontSecondaryColor;\n"); - } - input_map = reg_maps_in->input_registers; for (i = 0; input_map; input_map >>= 1, ++i) { if (!(input_map & 1)) continue; in_idx = map[i]; - if (in_idx >= (in_count + 2)) { - FIXME("More input varyings declared than supported, expect issues\n"); - continue; - } - else if (map[i] == ~0U) + /* Declared, but not read register */ + if (in_idx == ~0U) continue; + if (in_idx >= (in_count + 2)) { - /* Declared, but not read register */ + FIXME("More input varyings declared than supported, expect issues.\n"); continue; } @@ -3769,113 +3773,49 @@ static void handle_ps3_input(struct wined3d_shader_buffer *buffer, const struct semantic_name_in = input_signature[i].semantic_name; semantic_idx_in = input_signature[i].semantic_idx; - set[map[i]] = input_signature[i].mask; - shader_glsl_write_mask_to_str(input_signature[i].mask, reg_mask); + set[in_idx] = ~0U; - if (!output_signature) + output_map = reg_maps_out->output_registers; + for (j = 0; output_map; output_map >>= 1, ++j) { - if (shader_match_semantic(semantic_name_in, WINED3DDECLUSAGE_COLOR)) - { - if (semantic_idx_in == 0) - shader_addline(buffer, "%s%s = front_color%s;\n", - destination, reg_mask, reg_mask); - else if (semantic_idx_in == 1) - shader_addline(buffer, "%s%s = front_secondary_color%s;\n", - destination, reg_mask, reg_mask); - else - shader_addline(buffer, "%s%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n", - destination, reg_mask, reg_mask); - } - else if (shader_match_semantic(semantic_name_in, WINED3DDECLUSAGE_TEXCOORD)) - { - if (semantic_idx_in < 8) - { - shader_addline(buffer, "%s%s = gl_TexCoord[%u]%s;\n", - destination, reg_mask, semantic_idx_in, reg_mask); - } - else - { - shader_addline(buffer, "%s%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n", - destination, reg_mask, reg_mask); - } - } - else if (shader_match_semantic(semantic_name_in, WINED3DDECLUSAGE_FOG)) - { - shader_addline(buffer, "%s%s = vec4(gl_FogFragCoord, 0.0, 0.0, 0.0)%s;\n", - destination, reg_mask, reg_mask); - } - else - { - shader_addline(buffer, "%s%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n", - destination, reg_mask, reg_mask); - } - } else { - BOOL found = FALSE; + DWORD mask; - output_map = reg_maps_out->output_registers; - for (j = 0; output_map; output_map >>= 1, ++j) - { - if (!(output_map & 1)) continue; + if (!(output_map & 1) + || semantic_idx_in != output_signature[j].semantic_idx + || strcmp(semantic_name_in, output_signature[j].semantic_name) + || !(mask = input_signature[i].mask & output_signature[j].mask)) + continue; - semantic_name_out = output_signature[j].semantic_name; - semantic_idx_out = output_signature[j].semantic_idx; - shader_glsl_write_mask_to_str(output_signature[j].mask, reg_mask_out); + set[in_idx] = mask; + shader_glsl_write_mask_to_str(mask, reg_mask); - if (semantic_idx_in == semantic_idx_out - && !strcmp(semantic_name_in, semantic_name_out)) - { - shader_addline(buffer, "%s%s = OUT[%u]%s;\n", - destination, reg_mask, j, reg_mask); - found = TRUE; - } - } - if(!found) { - shader_addline(buffer, "%s%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n", - destination, reg_mask, reg_mask); - } + shader_addline(buffer, "%s%s = clamp(OUT[%u]%s, -FLT_MAX, FLT_MAX);\n", + destination, reg_mask, j, reg_mask); } } - /* This is solely to make the compiler / linker happy and avoid warning about undefined - * varyings. It shouldn't result in any real code executed on the GPU, since all read - * input varyings are assigned above, if the optimizer works properly. - */ - for(i = 0; i < in_count + 2; i++) { - if (set[i] && set[i] != WINED3DSP_WRITEMASK_ALL) - { - unsigned int size = 0; - memset(reg_mask, 0, sizeof(reg_mask)); - if(!(set[i] & WINED3DSP_WRITEMASK_0)) { - reg_mask[size] = 'x'; - size++; - } - if(!(set[i] & WINED3DSP_WRITEMASK_1)) { - reg_mask[size] = 'y'; - size++; - } - if(!(set[i] & WINED3DSP_WRITEMASK_2)) { - reg_mask[size] = 'z'; - size++; - } - if(!(set[i] & WINED3DSP_WRITEMASK_3)) { - reg_mask[size] = 'w'; - size++; - } + for (i = 0; i < in_count + 2; ++i) + { + unsigned int size; - if (i == in_count) { - sprintf(destination, "gl_FrontColor"); - } else if (i == in_count + 1) { - sprintf(destination, "gl_FrontSecondaryColor"); - } else { - sprintf(destination, "IN[%u]", i); - } + if (!set[i] || set[i] == WINED3DSP_WRITEMASK_ALL) + continue; - if (size == 1) { - shader_addline(buffer, "%s.%s = 0.0;\n", destination, reg_mask); - } else { - shader_addline(buffer, "%s.%s = vec%u(0.0);\n", destination, reg_mask, size); - } - } + if (set[i] == ~0U) set[i] = 0; + + size = 0; + if (!(set[i] & WINED3DSP_WRITEMASK_0)) reg_mask[size++] = 'x'; + if (!(set[i] & WINED3DSP_WRITEMASK_1)) reg_mask[size++] = 'y'; + if (!(set[i] & WINED3DSP_WRITEMASK_2)) reg_mask[size++] = 'z'; + if (!(set[i] & WINED3DSP_WRITEMASK_3)) reg_mask[size++] = 'w'; + reg_mask[size] = '\0'; + + if (i == in_count) sprintf(destination, "gl_FrontColor"); + else if (i == in_count + 1) sprintf(destination, "gl_FrontSecondaryColor"); + else sprintf(destination, "IN[%u]", i); + + if (size == 1) shader_addline(buffer, "%s.%s = 0.0;\n", destination, reg_mask); + else shader_addline(buffer, "%s.%s = vec%u(0.0);\n", destination, reg_mask, size); } HeapFree(GetProcessHeap(), 0, set); @@ -3888,45 +3828,23 @@ static GLhandleARB generate_param_reorder_function(struct wined3d_shader_buffer GLhandleARB ret = 0; IWineD3DVertexShaderImpl *vs = (IWineD3DVertexShaderImpl *) vertexshader; IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) pixelshader; - IWineD3DDeviceImpl *device; - DWORD vs_major = vs->baseShader.reg_maps.shader_version.major; DWORD ps_major = ps ? ps->baseShader.reg_maps.shader_version.major : 0; unsigned int i; const char *semantic_name; UINT semantic_idx; char reg_mask[6]; - const struct wined3d_shader_signature_element *output_signature; + const struct wined3d_shader_signature_element *output_signature = vs->baseShader.output_signature; + WORD map = vs->baseShader.reg_maps.output_registers; shader_buffer_clear(buffer); shader_addline(buffer, "#version 120\n"); + shader_addline(buffer, "const float FLT_MAX = 1e38;\n"); - if(vs_major < 3 && ps_major < 3) { - /* That one is easy: The vertex shader writes to the builtin varyings, the pixel shader reads from them. - * Take care about the texcoord .w fixup though if we're using the fixed function fragment pipeline - */ - device = (IWineD3DDeviceImpl *) vs->baseShader.device; - if ((gl_info->quirks & WINED3D_QUIRK_SET_TEXCOORD_W) - && ps_major == 0 && vs_major > 0 && !device->frag_pipe->ffp_proj_control) - { - shader_addline(buffer, "void order_ps_input() {\n"); - for(i = 0; i < min(8, MAX_REG_TEXCRD); i++) { - if(vs->baseShader.reg_maps.texcoord_mask[i] != 0 && - vs->baseShader.reg_maps.texcoord_mask[i] != WINED3DSP_WRITEMASK_ALL) { - shader_addline(buffer, "gl_TexCoord[%u].w = 1.0;\n", i); - } - } - shader_addline(buffer, "}\n"); - } else { - shader_addline(buffer, "void order_ps_input() { /* do nothing */ }\n"); - } - } else if(ps_major < 3 && vs_major >= 3) { - WORD map = vs->baseShader.reg_maps.output_registers; - - /* The vertex shader writes to its own varyings, the pixel shader needs them in the builtin ones */ - output_signature = vs->baseShader.output_signature; - + if (ps_major < 3) + { shader_addline(buffer, "void order_ps_input(in vec4 OUT[%u]) {\n", MAX_REG_OUTPUT); + for (i = 0; map; map >>= 1, ++i) { DWORD write_mask; @@ -3940,14 +3858,17 @@ static GLhandleARB generate_param_reorder_function(struct wined3d_shader_buffer if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_COLOR)) { - if (semantic_idx == 0) - shader_addline(buffer, "gl_FrontColor%s = OUT[%u]%s;\n", reg_mask, i, reg_mask); + if (!semantic_idx) + shader_addline(buffer, "gl_FrontColor%s = clamp(OUT[%u]%s, -FLT_MAX, FLT_MAX);\n", + reg_mask, i, reg_mask); else if (semantic_idx == 1) - shader_addline(buffer, "gl_FrontSecondaryColor%s = OUT[%u]%s;\n", reg_mask, i, reg_mask); + shader_addline(buffer, "gl_FrontSecondaryColor%s = clamp(OUT[%u]%s, -FLT_MAX, FLT_MAX);\n", + reg_mask, i, reg_mask); } else if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_POSITION)) { - shader_addline(buffer, "gl_Position%s = OUT[%u]%s;\n", reg_mask, i, reg_mask); + shader_addline(buffer, "gl_Position%s = clamp(OUT[%u]%s, -FLT_MAX, FLT_MAX);\n", + reg_mask, i, reg_mask); } else if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_TEXCOORD)) { @@ -3956,7 +3877,7 @@ static GLhandleARB generate_param_reorder_function(struct wined3d_shader_buffer if (!(gl_info->quirks & WINED3D_QUIRK_SET_TEXCOORD_W) || ps_major > 0) write_mask |= WINED3DSP_WRITEMASK_3; - shader_addline(buffer, "gl_TexCoord[%u]%s = OUT[%u]%s;\n", + shader_addline(buffer, "gl_TexCoord[%u]%s = clamp(OUT[%u]%s, -FLT_MAX, FLT_MAX);\n", semantic_idx, reg_mask, i, reg_mask); if (!(write_mask & WINED3DSP_WRITEMASK_3)) shader_addline(buffer, "gl_TexCoord[%u].w = 1.0;\n", semantic_idx); @@ -3964,20 +3885,18 @@ static GLhandleARB generate_param_reorder_function(struct wined3d_shader_buffer } else if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_PSIZE)) { - shader_addline(buffer, "gl_PointSize = OUT[%u].x;\n", i); + shader_addline(buffer, "gl_PointSize = clamp(OUT[%u].%c, -FLT_MAX, FLT_MAX);\n", i, reg_mask[1]); } else if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_FOG)) { - shader_addline(buffer, "gl_FogFragCoord = OUT[%u].%c;\n", i, reg_mask[1]); + shader_addline(buffer, "gl_FogFragCoord = clamp(OUT[%u].%c, -FLT_MAX, FLT_MAX);\n", i, reg_mask[1]); } } shader_addline(buffer, "}\n"); - } else if(ps_major >= 3 && vs_major >= 3) { - WORD map = vs->baseShader.reg_maps.output_registers; - - output_signature = vs->baseShader.output_signature; - + } + else + { /* This one is tricky: a 3.0 pixel shader reads from a 3.0 vertex shader */ shader_addline(buffer, "varying vec4 IN[%u];\n", vec4_varyings(3, gl_info)); shader_addline(buffer, "void order_ps_input(in vec4 OUT[%u]) {\n", MAX_REG_OUTPUT); @@ -3992,11 +3911,12 @@ static GLhandleARB generate_param_reorder_function(struct wined3d_shader_buffer if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_POSITION)) { - shader_addline(buffer, "gl_Position%s = OUT[%u]%s;\n", reg_mask, i, reg_mask); + shader_addline(buffer, "gl_Position%s = clamp(OUT[%u]%s, -FLT_MAX, FLT_MAX);\n", + reg_mask, i, reg_mask); } else if (shader_match_semantic(semantic_name, WINED3DDECLUSAGE_PSIZE)) { - shader_addline(buffer, "gl_PointSize = OUT[%u].x;\n", i); + shader_addline(buffer, "gl_PointSize = clamp(OUT[%u].%c, -FLT_MAX, FLT_MAX);\n", i, reg_mask[1]); } } @@ -4005,26 +3925,11 @@ static GLhandleARB generate_param_reorder_function(struct wined3d_shader_buffer &ps->baseShader.reg_maps, output_signature, &vs->baseShader.reg_maps); shader_addline(buffer, "}\n"); - } else if(ps_major >= 3 && vs_major < 3) { - shader_addline(buffer, "varying vec4 IN[%u];\n", vec4_varyings(3, gl_info)); - shader_addline(buffer, "void order_ps_input() {\n"); - /* The vertex shader wrote to the builtin varyings. There is no need to figure out position and - * point size, but we depend on the optimizers kindness to find out that the pixel shader doesn't - * read gl_TexCoord and gl_ColorX, otherwise we'll run out of varyings - */ - handle_ps3_input(buffer, gl_info, ps->input_reg_map, ps->baseShader.input_signature, - &ps->baseShader.reg_maps, NULL, NULL); - shader_addline(buffer, "}\n"); - } else { - ERR("Unexpected vertex and pixel shader version condition: vs: %d, ps: %d\n", vs_major, ps_major); } ret = GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB)); checkGLcall("glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB)"); - GL_EXTCALL(glShaderSourceARB(ret, 1, (const char**)&buffer->buffer, NULL)); - checkGLcall("glShaderSourceARB(ret, 1, &buffer->buffer, NULL)"); - GL_EXTCALL(glCompileShaderARB(ret)); - checkGLcall("glCompileShaderARB(ret)"); + shader_glsl_compile(gl_info, ret, buffer->buffer); return ret; } @@ -4145,9 +4050,7 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context shader_addline(buffer, "}\n"); TRACE("Compiling shader object %u\n", shader_obj); - GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer->buffer, NULL)); - GL_EXTCALL(glCompileShaderARB(shader_obj)); - print_glsl_info_log(gl_info, shader_obj); + shader_glsl_compile(gl_info, shader_obj, buffer->buffer); /* Store the shader object */ return shader_obj; @@ -4182,9 +4085,8 @@ static GLuint shader_glsl_generate_vshader(const struct wined3d_context *context /* Base Shader Body */ shader_generate_main((IWineD3DBaseShader*)This, buffer, reg_maps, function, &priv_ctx); - /* Unpack 3.0 outputs */ - if (reg_maps->shader_version.major >= 3) shader_addline(buffer, "order_ps_input(OUT);\n"); - else shader_addline(buffer, "order_ps_input();\n"); + /* Unpack outputs */ + shader_addline(buffer, "order_ps_input(OUT);\n"); /* The D3DRS_FOGTABLEMODE render state defines if the shader-generated fog coord is used * or if the fragment depth is used. If the fragment depth is used(FOGTABLEMODE != NONE), @@ -4221,9 +4123,7 @@ static GLuint shader_glsl_generate_vshader(const struct wined3d_context *context shader_addline(buffer, "}\n"); TRACE("Compiling shader object %u\n", shader_obj); - GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer->buffer, NULL)); - GL_EXTCALL(glCompileShaderARB(shader_obj)); - print_glsl_info_log(gl_info, shader_obj); + shader_glsl_compile(gl_info, shader_obj, buffer->buffer); return shader_obj; } @@ -4232,6 +4132,7 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context, struct wined3d_shader_buffer *buffer, IWineD3DPixelShaderImpl *shader, const struct ps_compile_args *args, const struct ps_np2fixup_info **np2fixup_info) { + struct wined3d_state *state = &((IWineD3DDeviceImpl *)shader->baseShader.device)->stateBlock->state; UINT i; DWORD new_size; struct glsl_ps_compiled_shader *new_array; @@ -4254,9 +4155,11 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context, * so a linear search is more performant than a hashmap or a binary search * (cache coherency etc) */ - for(i = 0; i < shader_data->num_gl_shaders; i++) { - if(memcmp(&shader_data->gl_shaders[i].args, args, sizeof(*args)) == 0) { - if(args->np2_fixup) *np2fixup_info = &shader_data->gl_shaders[i].np2fixup; + for (i = 0; i < shader_data->num_gl_shaders; ++i) + { + if (!memcmp(&shader_data->gl_shaders[i].args, args, sizeof(*args))) + { + if (args->np2_fixup) *np2fixup_info = &shader_data->gl_shaders[i].np2fixup; return shader_data->gl_shaders[i].prgId; } } @@ -4286,8 +4189,7 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context, memset(&shader_data->gl_shaders[shader_data->num_gl_shaders].np2fixup, 0, sizeof(struct ps_np2fixup_info)); if (args->np2_fixup) np2fixup = &shader_data->gl_shaders[shader_data->num_gl_shaders].np2fixup; - pixelshader_update_samplers(&shader->baseShader.reg_maps, - ((IWineD3DDeviceImpl *)shader->baseShader.device)->stateBlock->textures); + pixelshader_update_samplers(&shader->baseShader.reg_maps, (IWineD3DBaseTexture **)state->textures); shader_buffer_clear(buffer); ret = shader_glsl_generate_pshader(context, buffer, shader, args, np2fixup); @@ -4379,8 +4281,9 @@ static GLhandleARB find_glsl_vshader(const struct wined3d_context *context, static void set_glsl_shader_program(const struct wined3d_context *context, IWineD3DDeviceImpl *device, BOOL use_ps, BOOL use_vs) { - IWineD3DVertexShader *vshader = use_vs ? device->stateBlock->vertexShader : NULL; - IWineD3DPixelShader *pshader = use_ps ? device->stateBlock->pixelShader : NULL; + const struct wined3d_state *state = &device->stateBlock->state; + IWineD3DVertexShader *vshader = use_vs ? (IWineD3DVertexShader *)state->vertex_shader : NULL; + IWineD3DPixelShader *pshader = use_ps ? (IWineD3DPixelShader *)state->pixel_shader : NULL; const struct wined3d_gl_info *gl_info = context->gl_info; struct shader_glsl_priv *priv = device->shader_priv; struct glsl_shader_prog_link *entry = NULL; @@ -4391,8 +4294,8 @@ static void set_glsl_shader_program(const struct wined3d_context *context, struct ps_compile_args ps_compile_args; struct vs_compile_args vs_compile_args; - if (vshader) find_vs_compile_args((IWineD3DVertexShaderImpl *)vshader, device->stateBlock, &vs_compile_args); - if (pshader) find_ps_compile_args((IWineD3DPixelShaderImpl *)pshader, device->stateBlock, &ps_compile_args); + if (vshader) find_vs_compile_args(state, (IWineD3DVertexShaderImpl *)vshader, &vs_compile_args); + if (pshader) find_ps_compile_args(state, (IWineD3DPixelShaderImpl *)pshader, &ps_compile_args); entry = get_glsl_program_entry(priv, vshader, pshader, &vs_compile_args, &ps_compile_args); if (entry) { @@ -4574,18 +4477,16 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info, GLhandleARB vshader_id, pshader_id; const char *blt_pshader; - static const char *blt_vshader[] = - { + static const char *blt_vshader = "#version 120\n" "void main(void)\n" "{\n" " gl_Position = gl_Vertex;\n" " gl_FrontColor = vec4(1.0);\n" " gl_TexCoord[0] = gl_MultiTexCoord0;\n" - "}\n" - }; + "}\n"; - static const char *blt_pshaders_full[tex_type_count] = + static const char * const blt_pshaders_full[tex_type_count] = { /* tex_1d */ NULL, @@ -4615,7 +4516,7 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info, "}\n", }; - static const char *blt_pshaders_masked[tex_type_count] = + static const char * const blt_pshaders_masked[tex_type_count] = { /* tex_1d */ NULL, @@ -4659,12 +4560,10 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info, } vshader_id = GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB)); - GL_EXTCALL(glShaderSourceARB(vshader_id, 1, blt_vshader, NULL)); - GL_EXTCALL(glCompileShaderARB(vshader_id)); + shader_glsl_compile(gl_info, vshader_id, blt_vshader); pshader_id = GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB)); - GL_EXTCALL(glShaderSourceARB(pshader_id, 1, &blt_pshader, NULL)); - GL_EXTCALL(glCompileShaderARB(pshader_id)); + shader_glsl_compile(gl_info, pshader_id, blt_pshader); program_id = GL_EXTCALL(glCreateProgramObjectARB()); GL_EXTCALL(glAttachObjectARB(program_id, vshader_id)); @@ -4785,7 +4684,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { if(pshader) { struct glsl_pshader_private *shader_data; shader_data = This->baseShader.backend_data; - if(!shader_data || shader_data->num_gl_shaders == 0) + if (!shader_data || !shader_data->num_gl_shaders) { HeapFree(GetProcessHeap(), 0, shader_data); This->baseShader.backend_data = NULL; @@ -4804,7 +4703,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { } else { struct glsl_vshader_private *shader_data; shader_data = This->baseShader.backend_data; - if(!shader_data || shader_data->num_gl_shaders == 0) + if (!shader_data || !shader_data->num_gl_shaders) { HeapFree(GetProcessHeap(), 0, shader_data); This->baseShader.backend_data = NULL; @@ -5092,6 +4991,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB { /* WINED3DSIH_ABS */ shader_glsl_map2gl, /* WINED3DSIH_ADD */ shader_glsl_arith, + /* WINED3DSIH_AND */ NULL, /* WINED3DSIH_BEM */ shader_glsl_bem, /* WINED3DSIH_BREAK */ shader_glsl_break, /* WINED3DSIH_BREAKC */ shader_glsl_breakc, @@ -5124,6 +5024,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB /* WINED3DSIH_IF */ shader_glsl_if, /* WINED3DSIH_IFC */ shader_glsl_ifc, /* WINED3DSIH_IGE */ NULL, + /* WINED3DSIH_IMUL */ NULL, /* WINED3DSIH_LABEL */ shader_glsl_label, /* WINED3DSIH_LIT */ shader_glsl_lit, /* WINED3DSIH_LOG */ shader_glsl_log, @@ -5141,6 +5042,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB /* WINED3DSIH_MIN */ shader_glsl_map2gl, /* WINED3DSIH_MOV */ shader_glsl_mov, /* WINED3DSIH_MOVA */ shader_glsl_mov, + /* WINED3DSIH_MOVC */ NULL, /* WINED3DSIH_MUL */ shader_glsl_arith, /* WINED3DSIH_NOP */ NULL, /* WINED3DSIH_NRM */ shader_glsl_nrm, diff --git a/dll/directx/wine/wined3d/nvidia_texture_shader.c b/dll/directx/wine/wined3d/nvidia_texture_shader.c index 24cba329f20..00a51f85dfa 100644 --- a/dll/directx/wine/wined3d/nvidia_texture_shader.c +++ b/dll/directx/wine/wined3d/nvidia_texture_shader.c @@ -30,20 +30,23 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); /* GL locking for state handlers is done by the caller. */ -static void nvts_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void nvts_activate_dimensions(const struct wined3d_state *state, DWORD stage, struct wined3d_context *context) { BOOL bumpmap = FALSE; - if(stage > 0 && (stateblock->textureState[stage - 1][WINED3DTSS_COLOROP] == WINED3DTOP_BUMPENVMAPLUMINANCE || - stateblock->textureState[stage - 1][WINED3DTSS_COLOROP] == WINED3DTOP_BUMPENVMAP)) { + if (stage > 0 && (state->texture_states[stage - 1][WINED3DTSS_COLOROP] == WINED3DTOP_BUMPENVMAPLUMINANCE + || state->texture_states[stage - 1][WINED3DTSS_COLOROP] == WINED3DTOP_BUMPENVMAP)) + { bumpmap = TRUE; context->texShaderBumpMap |= (1 << stage); } else { context->texShaderBumpMap &= ~(1 << stage); } - if(stateblock->textures[stage]) { - switch(IWineD3DBaseTexture_GetTextureDimensions(stateblock->textures[stage])) { + if (state->textures[stage]) + { + switch (state->textures[stage]->baseTexture.target) + { case GL_TEXTURE_2D: glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, bumpmap ? GL_OFFSET_TEXTURE_2D_NV : GL_TEXTURE_2D); checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, ...)"); @@ -128,9 +131,9 @@ static void get_src_and_opr_nvrc(DWORD stage, DWORD arg, BOOL is_alpha, GLenum* *input = d3dta_to_combiner_input(arg & WINED3DTA_SELECTMASK, stage, texture_idx); } -void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx, DWORD dst) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl*)iface; - const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; +void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state, BOOL is_alpha, + int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx, DWORD dst) +{ tex_op_args tex_op_args = {{0}, {0}, {0}}; GLenum portion = is_alpha ? GL_ALPHA : GL_RGB; GLenum target = GL_COMBINER0_NV + stage; @@ -141,7 +144,8 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX /* If a texture stage references an invalid texture unit the stage just * passes through the result from the previous stage */ - if (is_invalid_op(This, stage, op, arg1, arg2, arg3)) { + if (is_invalid_op(state, stage, op, arg1, arg2, arg3)) + { arg1 = WINED3DTA_CURRENT; op = WINED3DTOP_SELECTARG1; } @@ -452,17 +456,18 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX } -static void nvrc_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void nvrc_colorop(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); + DWORD stage = (state_id - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); BOOL tex_used = stateblock->device->fixed_function_usage_map & (1 << stage); DWORD mapped_stage = stateblock->device->texUnitMap[stage]; const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; - TRACE("Setting color op for stage %d\n", stage); + TRACE("Setting color op for stage %u.\n", stage); /* Using a pixel shader? Don't care for anything here, the shader applying does it */ - if (use_ps(stateblock)) return; + if (use_ps(state)) return; if (stage != mapped_stage) WARN("Using non 1:1 mapping: %d -> %d!\n", stage, mapped_stage); @@ -477,13 +482,17 @@ static void nvrc_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct checkGLcall("glActiveTextureARB"); } - if(stateblock->lowest_disabled_stage > 0) { + if (state->lowest_disabled_stage > 0) + { glEnable(GL_REGISTER_COMBINERS_NV); - GL_EXTCALL(glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, stateblock->lowest_disabled_stage)); - } else { + GL_EXTCALL(glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, state->lowest_disabled_stage)); + } + else + { glDisable(GL_REGISTER_COMBINERS_NV); } - if(stage >= stateblock->lowest_disabled_stage) { + if (stage >= state->lowest_disabled_stage) + { TRACE("Stage disabled\n"); if (mapped_stage != WINED3D_UNMAPPED_STAGE) { @@ -520,56 +529,58 @@ static void nvrc_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct { if (gl_info->supported[NV_TEXTURE_SHADER2]) { - nvts_activate_dimensions(stage, stateblock, context); + nvts_activate_dimensions(state, stage, context); } else { - texture_activate_dimensions(stage, stateblock, context); + texture_activate_dimensions(state->textures[stage], gl_info); } } } /* Set the texture combiners */ - set_tex_op_nvrc((IWineD3DDevice *)stateblock->device, FALSE, stage, - stateblock->textureState[stage][WINED3DTSS_COLOROP], - stateblock->textureState[stage][WINED3DTSS_COLORARG1], - stateblock->textureState[stage][WINED3DTSS_COLORARG2], - stateblock->textureState[stage][WINED3DTSS_COLORARG0], - mapped_stage, - stateblock->textureState[stage][WINED3DTSS_RESULTARG]); + set_tex_op_nvrc(gl_info, state, FALSE, stage, + state->texture_states[stage][WINED3DTSS_COLOROP], + state->texture_states[stage][WINED3DTSS_COLORARG1], + state->texture_states[stage][WINED3DTSS_COLORARG2], + state->texture_states[stage][WINED3DTSS_COLORARG0], + mapped_stage, + state->texture_states[stage][WINED3DTSS_RESULTARG]); /* In register combiners bump mapping is done in the stage AFTER the one that has the bump map operation set, * thus the texture shader may have to be updated */ if (gl_info->supported[NV_TEXTURE_SHADER2]) { - BOOL usesBump = (stateblock->textureState[stage][WINED3DTSS_COLOROP] == WINED3DTOP_BUMPENVMAPLUMINANCE || - stateblock->textureState[stage][WINED3DTSS_COLOROP] == WINED3DTOP_BUMPENVMAP) ? TRUE : FALSE; - BOOL usedBump = (context->texShaderBumpMap & 1 << (stage + 1)) ? TRUE : FALSE; - if(usesBump != usedBump) { + BOOL usesBump = (state->texture_states[stage][WINED3DTSS_COLOROP] == WINED3DTOP_BUMPENVMAPLUMINANCE + || state->texture_states[stage][WINED3DTSS_COLOROP] == WINED3DTOP_BUMPENVMAP); + BOOL usedBump = !!(context->texShaderBumpMap & 1 << (stage + 1)); + if (usesBump != usedBump) + { GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage + 1)); checkGLcall("glActiveTextureARB"); - nvts_activate_dimensions(stage + 1, stateblock, context); + nvts_activate_dimensions(state, stage + 1, context); GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage)); checkGLcall("glActiveTextureARB"); } } } -static void nvts_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void nvts_texdim(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - DWORD sampler = state - STATE_SAMPLER(0); + DWORD sampler = state_id - STATE_SAMPLER(0); DWORD mapped_stage = stateblock->device->texUnitMap[sampler]; + const struct wined3d_state *state = &stateblock->state; /* No need to enable / disable anything here for unused samplers. The tex_colorop * handler takes care. Also no action is needed with pixel shaders, or if tex_colorop * will take care of this business */ if (mapped_stage == WINED3D_UNMAPPED_STAGE || mapped_stage >= context->gl_info->limits.textures) return; - if(sampler >= stateblock->lowest_disabled_stage) return; - if(isStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3DTSS_COLOROP))) return; + if (sampler >= state->lowest_disabled_stage) return; + if (isStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3DTSS_COLOROP))) return; - nvts_activate_dimensions(sampler, stateblock, context); + nvts_activate_dimensions(state, sampler, context); } static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) @@ -590,14 +601,13 @@ static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, str GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage)); checkGLcall("GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage))"); - /* We can't just pass a pointer to the stateblock to GL due to the different matrix - * format(column major vs row major) - */ - mat[0][0] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT00]); - mat[1][0] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT01]); - mat[0][1] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT10]); - mat[1][1] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT11]); - glTexEnvfv(GL_TEXTURE_SHADER_NV, GL_OFFSET_TEXTURE_MATRIX_NV, (float *) mat); + /* We can't just pass a pointer to the stateblock to GL due to the + * different matrix format (column major vs row major). */ + mat[0][0] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT00]); + mat[1][0] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT01]); + mat[0][1] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT10]); + mat[1][1] = *((float *)&stateblock->state.texture_states[stage][WINED3DTSS_BUMPENVMAT11]); + glTexEnvfv(GL_TEXTURE_SHADER_NV, GL_OFFSET_TEXTURE_MATRIX_NV, (float *)mat); checkGLcall("glTexEnvfv(GL_TEXTURE_SHADER_NV, GL_OFFSET_TEXTURE_MATRIX_NV, mat)"); } } @@ -606,7 +616,7 @@ static void nvrc_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, stru { const struct wined3d_gl_info *gl_info = context->gl_info; float col[4]; - D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col); + D3DCOLORTOGLFLOAT4(stateblock->state.render_states[WINED3DRS_TEXTUREFACTOR], col); GL_EXTCALL(glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, &col[0])); } diff --git a/dll/directx/wine/wined3d/palette.c b/dll/directx/wine/wined3d/palette.c index 3fd8be9dd10..2b7ce2cfc20 100644 --- a/dll/directx/wine/wined3d/palette.c +++ b/dll/directx/wine/wined3d/palette.c @@ -74,7 +74,7 @@ static ULONG WINAPI IWineD3DPaletteImpl_Release(IWineD3DPalette *iface) { } /* Not called from the vtable */ -static DWORD IWineD3DPaletteImpl_Size(DWORD dwFlags) +static WORD IWineD3DPaletteImpl_Size(DWORD dwFlags) { switch (dwFlags & SIZE_BITS) { case WINEDDPCAPS_1BIT: return 2; @@ -92,7 +92,7 @@ static HRESULT WINAPI IWineD3DPaletteImpl_GetEntries(IWineD3DPalette *iface, DW TRACE("(%p)->(%08x,%d,%d,%p)\n",This,Flags,Start,Count,PalEnt); - if (Flags != 0) return WINED3DERR_INVALIDCALL; /* unchecked */ + if (Flags) return WINED3DERR_INVALIDCALL; /* unchecked */ if (Start + Count > IWineD3DPaletteImpl_Size(This->Flags)) return WINED3DERR_INVALIDCALL; @@ -149,8 +149,8 @@ static HRESULT WINAPI IWineD3DPaletteImpl_SetEntries(IWineD3DPalette *iface, #if 0 /* Now, if we are in 'depth conversion mode', update the screen palette */ /* FIXME: we need to update the image or we won't get palette fading. */ - if (This->ddraw->d->palette_convert != NULL) - This->ddraw->d->palette_convert(palent,This->screen_palents,start,count); + if (This->ddraw->d->palette_convert) + This->ddraw->d->palette_convert(palent,This->screen_palents,start,count); #endif /* If the palette is attached to the render target, update all render targets */ @@ -175,13 +175,11 @@ static HRESULT WINAPI IWineD3DPaletteImpl_GetCaps(IWineD3DPalette *iface, DWORD return WINED3D_OK; } -static HRESULT WINAPI IWineD3DPaletteImpl_GetParent(IWineD3DPalette *iface, IUnknown **Parent) { - IWineD3DPaletteImpl *This = (IWineD3DPaletteImpl *)iface; - TRACE("(%p)->(%p)\n", This, Parent); +static void * WINAPI IWineD3DPaletteImpl_GetParent(IWineD3DPalette *iface) +{ + TRACE("iface %p.\n", iface); - *Parent = This->parent; - IUnknown_AddRef(This->parent); - return WINED3D_OK; + return ((IWineD3DPaletteImpl *)iface)->parent; } static const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl = @@ -198,7 +196,7 @@ static const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl = }; HRESULT wined3d_palette_init(IWineD3DPaletteImpl *palette, IWineD3DDeviceImpl *device, - DWORD flags, const PALETTEENTRY *entries, IUnknown *parent) + DWORD flags, const PALETTEENTRY *entries, void *parent) { HRESULT hr; diff --git a/dll/directx/wine/wined3d/powf.c b/dll/directx/wine/wined3d/powf.c new file mode 100644 index 00000000000..55eb92a2e3f --- /dev/null +++ b/dll/directx/wine/wined3d/powf.c @@ -0,0 +1,11 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the w64 mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#include + +float powf(float x, float y) +{ + return (float)pow((double)x, (double)y); +} diff --git a/dll/directx/wine/wined3d/query.c b/dll/directx/wine/wined3d/query.c index b3c77eae692..254efbed825 100644 --- a/dll/directx/wine/wined3d/query.c +++ b/dll/directx/wine/wined3d/query.c @@ -46,7 +46,7 @@ enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_event_qu TRACE("(%p) : device %p\n", query, device); - if (query->context == NULL) + if (!query->context) { TRACE("Query not started\n"); return WINED3D_EVENT_QUERY_NOT_STARTED; @@ -230,27 +230,21 @@ void wined3d_event_query_issue(struct wined3d_event_query *query, IWineD3DDevice context_release(context); } -/* - * Occlusion Queries: - * http://www.gris.uni-tuebingen.de/~bartz/Publications/paper/hww98.pdf - * http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt - */ - -/* ******************************************* - IWineD3DQuery IUnknown parts follow - ******************************************* */ -static HRESULT WINAPI IWineD3DQueryImpl_QueryInterface(IWineD3DQuery *iface, REFIID riid, LPVOID *ppobj) +static HRESULT WINAPI IWineD3DQueryImpl_QueryInterface(IWineD3DQuery *iface, REFIID riid, void **object) { - IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface; - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppobj); - if (IsEqualGUID(riid, &IID_IUnknown) - || IsEqualGUID(riid, &IID_IWineD3DBase) - || IsEqualGUID(riid, &IID_IWineD3DQuery)) { + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IWineD3DQuery) + || IsEqualGUID(riid, &IID_IUnknown)) + { IUnknown_AddRef(iface); - *ppobj = This; + *object = iface; return S_OK; } - *ppobj = NULL; + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + + *object = NULL; return E_NOINTERFACE; } @@ -265,7 +259,9 @@ static ULONG WINAPI IWineD3DQueryImpl_Release(IWineD3DQuery *iface) { ULONG ref; TRACE("(%p) : Releasing from %d\n", This, This->ref); ref = InterlockedDecrement(&This->ref); - if (ref == 0) { + + if (!ref) + { /* Queries are specific to the GL context that created them. Not * deleting the query will obviously leak it, but that's still better * than potentially deleting a different query with the same id in this @@ -288,21 +284,6 @@ static ULONG WINAPI IWineD3DQueryImpl_Release(IWineD3DQuery *iface) { return ref; } -/* ******************************************* - IWineD3DQuery IWineD3DQuery parts follow - ******************************************* */ -static HRESULT WINAPI IWineD3DQueryImpl_GetParent(IWineD3DQuery *iface, IUnknown **parent) -{ - TRACE("iface %p, parent %p.\n", iface, parent); - - *parent = (IUnknown *)parent; - IUnknown_AddRef(*parent); - - TRACE("Returning %p.\n", *parent); - - return WINED3D_OK; -} - static HRESULT WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags) { IWineD3DQueryImpl *This = (IWineD3DQueryImpl *) iface; struct wined3d_occlusion_query *query = This->extendedData; @@ -554,7 +535,6 @@ static const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl = IWineD3DQueryImpl_AddRef, IWineD3DQueryImpl_Release, /*** IWineD3Dquery methods ***/ - IWineD3DQueryImpl_GetParent, IWineD3DEventQueryImpl_GetData, IWineD3DEventQueryImpl_GetDataSize, IWineD3DQueryImpl_GetType, @@ -568,15 +548,13 @@ static const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl = IWineD3DQueryImpl_AddRef, IWineD3DQueryImpl_Release, /*** IWineD3Dquery methods ***/ - IWineD3DQueryImpl_GetParent, IWineD3DOcclusionQueryImpl_GetData, IWineD3DOcclusionQueryImpl_GetDataSize, IWineD3DQueryImpl_GetType, IWineD3DOcclusionQueryImpl_Issue }; -HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device, - WINED3DQUERYTYPE type, IUnknown *parent) +HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device, WINED3DQUERYTYPE type) { const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; @@ -638,7 +616,6 @@ HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device, query->type = type; query->state = QUERY_CREATED; query->device = device; - query->parent = parent; query->ref = 1; return WINED3D_OK; diff --git a/dll/directx/wine/wined3d/resource.c b/dll/directx/wine/wined3d/resource.c index 67622a38942..c95cf1b8b55 100644 --- a/dll/directx/wine/wined3d/resource.c +++ b/dll/directx/wine/wined3d/resource.c @@ -28,20 +28,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type, - IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct wined3d_format_desc *format_desc, - WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct wined3d_format *format, + WINED3DPOOL pool, void *parent, const struct wined3d_parent_ops *parent_ops) { struct IWineD3DResourceClass *resource = &((IWineD3DResourceImpl *)iface)->resource; resource->device = device; - resource->parent = parent; resource->resourceType = resource_type; resource->ref = 1; resource->pool = pool; - resource->format_desc = format_desc; + resource->format = format; resource->usage = usage; resource->size = size; resource->priority = 0; + resource->parent = parent; resource->parent_ops = parent_ops; list_init(&resource->privateData); @@ -105,6 +105,12 @@ void resource_cleanup(IWineD3DResource *iface) if (This->resource.device) device_resource_released(This->resource.device, iface); } +void resource_unload(IWineD3DResourceImpl *resource) +{ + context_resource_unloaded(resource->resource.device, (IWineD3DResource *)resource, + resource->resource.resourceType); +} + static PrivateData* resource_find_private_data(IWineD3DResourceImpl *This, REFGUID tag) { PrivateData *data; @@ -133,7 +139,7 @@ HRESULT resource_set_private_data(IWineD3DResource *iface, REFGUID refguid, resource_free_private_data(iface, refguid); data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data)); - if (NULL == data) return E_OUTOFMEMORY; + if (!data) return E_OUTOFMEMORY; data->tag = *refguid; data->flags = Flags; @@ -151,7 +157,8 @@ HRESULT resource_set_private_data(IWineD3DResource *iface, REFGUID refguid, else { data->ptr.data = HeapAlloc(GetProcessHeap(), 0, SizeOfData); - if (NULL == data->ptr.data) { + if (!data->ptr.data) + { HeapFree(GetProcessHeap(), 0, data); return E_OUTOFMEMORY; } @@ -170,7 +177,7 @@ HRESULT resource_get_private_data(IWineD3DResource *iface, REFGUID refguid, void TRACE("(%p) : %p %p %p\n", This, refguid, pData, pSizeOfData); data = resource_find_private_data(This, refguid); - if (data == NULL) return WINED3DERR_NOTFOUND; + if (!data) return WINED3DERR_NOTFOUND; if (*pSizeOfData < data->size) { *pSizeOfData = data->size; @@ -201,13 +208,15 @@ HRESULT resource_free_private_data(IWineD3DResource *iface, REFGUID refguid) TRACE("(%p) : %s\n", This, debugstr_guid(refguid)); data = resource_find_private_data(This, refguid); - if (data == NULL) return WINED3DERR_NOTFOUND; + if (!data) return WINED3DERR_NOTFOUND; if (data->flags & WINED3DSPD_IUNKNOWN) { - if (data->ptr.object != NULL) + if (data->ptr.object) IUnknown_Release(data->ptr.object); - } else { + } + else + { HeapFree(GetProcessHeap(), 0, data->ptr.data); } list_remove(&data->entry); @@ -239,11 +248,3 @@ WINED3DRESOURCETYPE resource_get_type(IWineD3DResource *iface) TRACE("(%p) : returning %d\n", This, This->resource.resourceType); return This->resource.resourceType; } - -HRESULT resource_get_parent(IWineD3DResource *iface, IUnknown **pParent) -{ - IWineD3DResourceImpl *This = (IWineD3DResourceImpl *)iface; - IUnknown_AddRef(This->resource.parent); - *pParent = This->resource.parent; - return WINED3D_OK; -} diff --git a/dll/directx/wine/wined3d/shader.c b/dll/directx/wine/wined3d/shader.c index f26122af869..bc39b3b2aa8 100644 --- a/dll/directx/wine/wined3d/shader.c +++ b/dll/directx/wine/wined3d/shader.c @@ -33,10 +33,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); WINE_DECLARE_DEBUG_CHANNEL(d3d); -static const char *shader_opcode_names[] = +static const char * const shader_opcode_names[] = { /* WINED3DSIH_ABS */ "abs", /* WINED3DSIH_ADD */ "add", + /* WINED3DSIH_AND */ "and", /* WINED3DSIH_BEM */ "bem", /* WINED3DSIH_BREAK */ "break", /* WINED3DSIH_BREAKC */ "breakc", @@ -69,6 +70,7 @@ static const char *shader_opcode_names[] = /* WINED3DSIH_IF */ "if", /* WINED3DSIH_IFC */ "ifc", /* WINED3DSIH_IGE */ "ige", + /* WINED3DSIH_IMUL */ "imul", /* WINED3DSIH_LABEL */ "label", /* WINED3DSIH_LIT */ "lit", /* WINED3DSIH_LOG */ "log", @@ -86,6 +88,7 @@ static const char *shader_opcode_names[] = /* WINED3DSIH_MIN */ "min", /* WINED3DSIH_MOV */ "mov", /* WINED3DSIH_MOVA */ "mova", + /* WINED3DSIH_MOVC */ "movc", /* WINED3DSIH_MUL */ "mul", /* WINED3DSIH_NOP */ "nop", /* WINED3DSIH_NRM */ "nrm", @@ -125,7 +128,7 @@ static const char *shader_opcode_names[] = /* WINED3DSIH_TEXREG2RGB */ "texreg2rgb", }; -static const char *semantic_names[] = +static const char * const semantic_names[] = { /* WINED3DDECLUSAGE_POSITION */ "SV_POSITION", /* WINED3DDECLUSAGE_BLENDWEIGHT */ "BLENDWEIGHT", @@ -182,6 +185,17 @@ static void shader_signature_from_semantic(struct wined3d_shader_signature_eleme e->mask = s->reg.write_mask; } +static void shader_signature_from_usage(struct wined3d_shader_signature_element *e, + WINED3DDECLUSAGE usage, UINT usage_idx, UINT reg_idx, DWORD write_mask) +{ + e->semantic_name = shader_semantic_name_from_usage(usage); + e->semantic_idx = usage_idx; + e->sysval_semantic = 0; + e->component_type = 0; + e->register_idx = reg_idx; + e->mask = write_mask; +} + static const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token) { switch (version_token >> 16) @@ -275,7 +289,7 @@ int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ... } static void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + void *parent, const struct wined3d_parent_ops *parent_ops) { shader->ref = 1; shader->device = (IWineD3DDevice *)device; @@ -367,7 +381,7 @@ static void shader_record_register_usage(IWineD3DBaseShaderImpl *shader, struct case WINED3DSPR_MISCTYPE: if (shader_type == WINED3D_SHADER_TYPE_PIXEL) { - if (reg->idx == 0) reg_maps->vpos = 1; + if (!reg->idx) reg_maps->vpos = 1; else if (reg->idx == 1) reg_maps->usesfacing = 1; } break; @@ -628,7 +642,7 @@ static HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct * Relative addressing tokens are ignored, but that's * okay, since we'll catch any address registers when * they are initialized (required by spec). */ - if (ins.dst_count) + for (i = 0; i < ins.dst_count; ++i) { struct wined3d_shader_src_param dst_rel_addr; struct wined3d_shader_dst_param dst_param; @@ -640,17 +654,77 @@ static HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct /* WINED3DSPR_TEXCRDOUT is the same as WINED3DSPR_OUTPUT. _OUTPUT can be > MAX_REG_TEXCRD and * is used in >= 3.0 shaders. Filter 3.0 shaders to prevent overflows, and also filter pixel * shaders because TECRDOUT isn't used in them, but future register types might cause issues */ - if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX && shader_version.major < 3 - && dst_param.reg.type == WINED3DSPR_TEXCRDOUT) + if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX && shader_version.major < 3) { - reg_maps->texcoord_mask[dst_param.reg.idx] |= dst_param.write_mask; + UINT idx = dst_param.reg.idx; + + switch (dst_param.reg.type) + { + case WINED3DSPR_RASTOUT: + switch (idx) + { + case 0: /* oPos */ + reg_maps->output_registers |= 1 << 10; + shader_signature_from_usage(&output_signature[10], + WINED3DDECLUSAGE_POSITION, 0, 10, WINED3DSP_WRITEMASK_ALL); + break; + + case 1: /* oFog */ + reg_maps->output_registers |= 1 << 11; + shader_signature_from_usage(&output_signature[11], + WINED3DDECLUSAGE_FOG, 0, 11, WINED3DSP_WRITEMASK_0); + break; + + case 2: /* oPts */ + reg_maps->output_registers |= 1 << 11; + shader_signature_from_usage(&output_signature[11], + WINED3DDECLUSAGE_PSIZE, 0, 11, WINED3DSP_WRITEMASK_1); + break; + } + break; + + case WINED3DSPR_ATTROUT: + if (idx < 2) + { + idx += 8; + if (reg_maps->output_registers & (1 << idx)) + { + output_signature[idx].mask |= dst_param.write_mask; + } + else + { + reg_maps->output_registers |= 1 << idx; + shader_signature_from_usage(&output_signature[idx], + WINED3DDECLUSAGE_COLOR, idx - 8, idx, dst_param.write_mask); + } + } + break; + + case WINED3DSPR_TEXCRDOUT: + + reg_maps->texcoord_mask[idx] |= dst_param.write_mask; + if (reg_maps->output_registers & (1 << idx)) + { + output_signature[idx].mask |= dst_param.write_mask; + } + else + { + reg_maps->output_registers |= 1 << idx; + shader_signature_from_usage(&output_signature[idx], + WINED3DDECLUSAGE_TEXCOORD, idx, idx, dst_param.write_mask); + } + break; + + default: + break; + } } if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL) { IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)shader; - if (dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0) + if (dst_param.reg.type == WINED3DSPR_COLOROUT && !dst_param.reg.idx) { /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to * COLOROUT 0. If we know this in advance, the ARB shader backend can skip @@ -661,7 +735,8 @@ static HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct * COLOROUT 0 is overwritten partially later, the marker is dropped again. */ ps->color0_mov = FALSE; - if (ins.handler_idx == WINED3DSIH_MOV) + if (ins.handler_idx == WINED3DSIH_MOV + && dst_param.write_mask == WINED3DSP_WRITEMASK_ALL) { /* Used later when the source register is read. */ color0_mov = TRUE; @@ -813,7 +888,7 @@ static void shader_dump_decl_usage(const struct wined3d_shader_semantic *semanti break; case WINED3DDECLUSAGE_COLOR: - if (semantic->usage_idx == 0) TRACE("color"); + if (!semantic->usage_idx) TRACE("color"); else TRACE("specular%u", (semantic->usage_idx - 1)); break; @@ -944,6 +1019,10 @@ static void shader_dump_register(const struct wined3d_shader_register *reg, TRACE("cb"); break; + case WINED3DSPR_NULL: + TRACE("null"); + break; + default: TRACE("unhandled_rtype(%#x)", reg->type); break; @@ -954,11 +1033,11 @@ static void shader_dump_register(const struct wined3d_shader_register *reg, TRACE("("); switch (reg->immconst_type) { - case WINED3D_IMMCONST_FLOAT: + case WINED3D_IMMCONST_SCALAR: TRACE("%.8e", *(const float *)reg->immconst_data); break; - case WINED3D_IMMCONST_FLOAT4: + case WINED3D_IMMCONST_VEC4: TRACE("%.8e, %.8e, %.8e, %.8e", *(const float *)®->immconst_data[0], *(const float *)®->immconst_data[1], *(const float *)®->immconst_data[2], *(const float *)®->immconst_data[3]); @@ -970,7 +1049,9 @@ static void shader_dump_register(const struct wined3d_shader_register *reg, } TRACE(")"); } - else if (reg->type != WINED3DSPR_RASTOUT && reg->type != WINED3DSPR_MISCTYPE) + else if (reg->type != WINED3DSPR_RASTOUT + && reg->type != WINED3DSPR_MISCTYPE + && reg->type != WINED3DSPR_NULL) { if (reg->array_idx != ~0U) { @@ -1003,7 +1084,7 @@ void shader_dump_dst_param(const struct wined3d_shader_dst_param *param, shader_dump_register(¶m->reg, shader_version); - if (write_mask != WINED3DSP_WRITEMASK_ALL) + if (write_mask && write_mask != WINED3DSP_WRITEMASK_ALL) { static const char *write_mask_chars = "xyzw"; @@ -1090,11 +1171,11 @@ void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffe IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device; const struct wined3d_shader_frontend *fe = shader->baseShader.frontend; void *fe_data = shader->baseShader.frontend_data; + struct wined3d_shader_src_param dst_rel_addr[2]; struct wined3d_shader_src_param src_rel_addr[4]; + struct wined3d_shader_dst_param dst_param[2]; struct wined3d_shader_src_param src_param[4]; struct wined3d_shader_version shader_version; - struct wined3d_shader_src_param dst_rel_addr; - struct wined3d_shader_dst_param dst_param; struct wined3d_shader_instruction ins; struct wined3d_shader_context ctx; const DWORD *ptr = byte_code; @@ -1108,7 +1189,7 @@ void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffe ctx.backend_data = backend_ctx; ins.ctx = &ctx; - ins.dst = &dst_param; + ins.dst = dst_param; ins.src = src_param; shader->baseShader.parse_state.current_row = 0; @@ -1147,8 +1228,11 @@ void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffe continue; } - /* Destination token */ - if (ins.dst_count) fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr); + /* Destination tokens */ + for (i = 0; i < ins.dst_count; ++i) + { + fe->shader_read_dst_param(fe_data, &ptr, &dst_param[i], &dst_rel_addr[i]); + } /* Predication token */ if (ins.predicate) @@ -1319,13 +1403,14 @@ static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe } else { - struct wined3d_shader_src_param dst_rel_addr, src_rel_addr; - struct wined3d_shader_dst_param dst_param; + struct wined3d_shader_src_param dst_rel_addr[2]; + struct wined3d_shader_src_param src_rel_addr; + struct wined3d_shader_dst_param dst_param[2]; struct wined3d_shader_src_param src_param; - if (ins.dst_count) + for (i = 0; i < ins.dst_count; ++i) { - fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr); + fe->shader_read_dst_param(fe_data, &ptr, &dst_param[i], &dst_rel_addr[i]); } /* Print out predication source token first - it follows @@ -1364,12 +1449,12 @@ static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe TRACE("p"); } - /* We already read the destination token, print it. */ - if (ins.dst_count) + /* We already read the destination tokens, print them. */ + for (i = 0; i < ins.dst_count; ++i) { - shader_dump_ins_modifiers(&dst_param); - TRACE(" "); - shader_dump_dst_param(&dst_param, &shader_version); + shader_dump_ins_modifiers(&dst_param[i]); + TRACE(!i ? " " : ", "); + shader_dump_dst_param(&dst_param[i], &shader_version); } /* Other source tokens */ @@ -1462,13 +1547,6 @@ const shader_backend_t none_shader_backend = { shader_none_color_fixup_supported, }; -static void shader_get_parent(IWineD3DBaseShaderImpl *shader, IUnknown **parent) -{ - *parent = shader->baseShader.parent; - IUnknown_AddRef(*parent); - TRACE("shader %p, returning %p.\n", shader, *parent); -} - static HRESULT shader_get_function(IWineD3DBaseShaderImpl *shader, void *data, UINT *data_size) { if (!data) @@ -1565,6 +1643,7 @@ static ULONG STDMETHODCALLTYPE vertexshader_AddRef(IWineD3DVertexShader *iface) return refcount; } +/* Do not call while under the GL lock. */ static ULONG STDMETHODCALLTYPE vertexshader_Release(IWineD3DVertexShader *iface) { IWineD3DVertexShaderImpl *shader = (IWineD3DVertexShaderImpl *)iface; @@ -1582,13 +1661,11 @@ static ULONG STDMETHODCALLTYPE vertexshader_Release(IWineD3DVertexShader *iface) return refcount; } -static HRESULT STDMETHODCALLTYPE vertexshader_GetParent(IWineD3DVertexShader *iface, IUnknown **parent) +static void * STDMETHODCALLTYPE vertexshader_GetParent(IWineD3DVertexShader *iface) { - TRACE("iface %p, parent %p.\n", iface, parent); + TRACE("iface %p.\n", iface); - shader_get_parent((IWineD3DBaseShaderImpl *)iface, parent); - - return WINED3D_OK; + return ((IWineD3DBaseShaderImpl *)iface)->baseShader.parent; } static HRESULT STDMETHODCALLTYPE vertexshader_GetFunction(IWineD3DVertexShader *iface, void *data, UINT *data_size) @@ -1642,12 +1719,13 @@ static const IWineD3DVertexShaderVtbl IWineD3DVertexShader_Vtbl = vertexshader_SetLocalConstantsF, }; -void find_vs_compile_args(IWineD3DVertexShaderImpl *shader, - IWineD3DStateBlockImpl *stateblock, struct vs_compile_args *args) +void find_vs_compile_args(const struct wined3d_state *state, + IWineD3DVertexShaderImpl *shader, struct vs_compile_args *args) { - args->fog_src = stateblock->renderState[WINED3DRS_FOGTABLEMODE] == WINED3DFOG_NONE ? VS_FOG_COORD : VS_FOG_Z; - args->clip_enabled = stateblock->renderState[WINED3DRS_CLIPPING] - && stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]; + args->fog_src = state->render_states[WINED3DRS_FOGTABLEMODE] + == WINED3DFOG_NONE ? VS_FOG_COORD : VS_FOG_Z; + args->clip_enabled = state->render_states[WINED3DRS_CLIPPING] + && state->render_states[WINED3DRS_CLIPPLANEENABLE]; args->swizzle_map = ((IWineD3DDeviceImpl *)shader->baseShader.device)->strided_streams.swizzle_map; } @@ -1661,9 +1739,9 @@ static BOOL match_usage(BYTE usage1, BYTE usage_idx1, BYTE usage2, BYTE usage_id return FALSE; } -BOOL vshader_get_input(IWineD3DVertexShader *iface, BYTE usage_req, BYTE usage_idx_req, unsigned int *regnum) +BOOL vshader_get_input(struct IWineD3DVertexShaderImpl *shader, + BYTE usage_req, BYTE usage_idx_req, unsigned int *regnum) { - IWineD3DVertexShaderImpl *shader = (IWineD3DVertexShaderImpl *)iface; WORD map = shader->baseShader.reg_maps.input_registers; unsigned int i; @@ -1699,7 +1777,7 @@ static void vertexshader_set_limits(IWineD3DVertexShaderImpl *shader) shader->baseShader.limits.constant_bool = 0; shader->baseShader.limits.constant_int = 0; shader->baseShader.limits.address = 1; - shader->baseShader.limits.packed_output = 0; + shader->baseShader.limits.packed_output = 12; shader->baseShader.limits.sampler = 0; shader->baseShader.limits.label = 0; /* TODO: vs_1_1 has a minimum of 96 constants. What happens when @@ -1714,7 +1792,7 @@ static void vertexshader_set_limits(IWineD3DVertexShaderImpl *shader) shader->baseShader.limits.constant_bool = 16; shader->baseShader.limits.constant_int = 16; shader->baseShader.limits.address = 1; - shader->baseShader.limits.packed_output = 0; + shader->baseShader.limits.packed_output = 12; shader->baseShader.limits.sampler = 0; shader->baseShader.limits.label = 16; shader->baseShader.limits.constant_float = min(256, device->d3d_vshader_constantF); @@ -1745,7 +1823,7 @@ static void vertexshader_set_limits(IWineD3DVertexShaderImpl *shader) shader->baseShader.limits.constant_bool = 16; shader->baseShader.limits.constant_int = 16; shader->baseShader.limits.address = 1; - shader->baseShader.limits.packed_output = 0; + shader->baseShader.limits.packed_output = 12; shader->baseShader.limits.sampler = 0; shader->baseShader.limits.label = 16; shader->baseShader.limits.constant_float = min(256, device->d3d_vshader_constantF); @@ -1757,7 +1835,7 @@ static void vertexshader_set_limits(IWineD3DVertexShaderImpl *shader) HRESULT vertexshader_init(IWineD3DVertexShaderImpl *shader, IWineD3DDeviceImpl *device, const DWORD *byte_code, const struct wined3d_shader_signature *output_signature, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + void *parent, const struct wined3d_parent_ops *parent_ops) { const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; struct shader_reg_maps *reg_maps = &shader->baseShader.reg_maps; @@ -1862,6 +1940,7 @@ static ULONG STDMETHODCALLTYPE geometryshader_AddRef(IWineD3DGeometryShader *ifa return refcount; } +/* Do not call while under the GL lock. */ static ULONG STDMETHODCALLTYPE geometryshader_Release(IWineD3DGeometryShader *iface) { struct wined3d_geometryshader *shader = (struct wined3d_geometryshader *)iface; @@ -1879,13 +1958,11 @@ static ULONG STDMETHODCALLTYPE geometryshader_Release(IWineD3DGeometryShader *if return refcount; } -static HRESULT STDMETHODCALLTYPE geometryshader_GetParent(IWineD3DGeometryShader *iface, IUnknown **parent) +static void * STDMETHODCALLTYPE geometryshader_GetParent(IWineD3DGeometryShader *iface) { - TRACE("iface %p, parent %p.\n", iface, parent); + TRACE("iface %p.\n", iface); - shader_get_parent((IWineD3DBaseShaderImpl *)iface, parent); - - return WINED3D_OK; + return ((IWineD3DBaseShaderImpl *)iface)->baseShader.parent; } static HRESULT STDMETHODCALLTYPE geometryshader_GetFunction(IWineD3DGeometryShader *iface, void *data, UINT *data_size) @@ -1909,7 +1986,7 @@ static const IWineD3DGeometryShaderVtbl wined3d_geometryshader_vtbl = HRESULT geometryshader_init(struct wined3d_geometryshader *shader, IWineD3DDeviceImpl *device, const DWORD *byte_code, const struct wined3d_shader_signature *output_signature, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + void *parent, const struct wined3d_parent_ops *parent_ops) { HRESULT hr; @@ -1959,6 +2036,7 @@ static ULONG STDMETHODCALLTYPE pixelshader_AddRef(IWineD3DPixelShader *iface) return refcount; } +/* Do not call while under the GL lock. */ static ULONG STDMETHODCALLTYPE pixelshader_Release(IWineD3DPixelShader *iface) { IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)iface; @@ -1976,13 +2054,11 @@ static ULONG STDMETHODCALLTYPE pixelshader_Release(IWineD3DPixelShader *iface) return refcount; } -static HRESULT STDMETHODCALLTYPE pixelshader_GetParent(IWineD3DPixelShader *iface, IUnknown **parent) +static void * STDMETHODCALLTYPE pixelshader_GetParent(IWineD3DPixelShader *iface) { - TRACE("iface %p, parent %p.\n", iface, parent); + TRACE("iface %p.\n", iface); - shader_get_parent((IWineD3DBaseShaderImpl *)iface, parent); - - return WINED3D_OK; + return ((IWineD3DBaseShaderImpl *)iface)->baseShader.parent; } static HRESULT STDMETHODCALLTYPE pixelshader_GetFunction(IWineD3DPixelShader *iface, void *data, UINT *data_size) @@ -2004,28 +2080,45 @@ static const IWineD3DPixelShaderVtbl IWineD3DPixelShader_Vtbl = pixelshader_GetFunction }; -void find_ps_compile_args(IWineD3DPixelShaderImpl *shader, - IWineD3DStateBlockImpl *stateblock, struct ps_compile_args *args) +void find_ps_compile_args(const struct wined3d_state *state, + IWineD3DPixelShaderImpl *shader, struct ps_compile_args *args) { + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device; IWineD3DBaseTextureImpl *texture; UINT i; memset(args, 0, sizeof(*args)); /* FIXME: Make sure all bits are set. */ - args->srgb_correction = stateblock->renderState[WINED3DRS_SRGBWRITEENABLE] ? 1 : 0; - args->np2_fixup = 0; + if (state->render_states[WINED3DRS_SRGBWRITEENABLE]) + { + IWineD3DSurfaceImpl *rt = device->render_targets[0]; + if(rt->resource.format->Flags & WINED3DFMT_FLAG_SRGB_WRITE) args->srgb_correction = 1; + } + + if (shader->baseShader.reg_maps.shader_version.major == 1 + && shader->baseShader.reg_maps.shader_version.minor <= 3) + { + for (i = 0; i < 4; ++i) + { + DWORD flags = state->texture_states[i][WINED3DTSS_TEXTURETRANSFORMFLAGS]; + DWORD tex_transform = flags & ~WINED3DTTFF_PROJECTED; + if (flags & WINED3DTTFF_PROJECTED) + tex_transform |= WINED3D_PSARGS_PROJECTED; + args->tex_transform |= tex_transform << i * WINED3D_PSARGS_TEXTRANSFORM_SHIFT; + } + } for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i) { if (!shader->baseShader.reg_maps.sampler_type[i]) continue; - texture = (IWineD3DBaseTextureImpl *)stateblock->textures[i]; + texture = state->textures[i]; if (!texture) { args->color_fixup[i] = COLOR_FIXUP_IDENTITY; continue; } - args->color_fixup[i] = texture->resource.format_desc->color_fixup; + args->color_fixup[i] = texture->resource.format->color_fixup; - if (texture->resource.format_desc->Flags & WINED3DFMT_FLAG_SHADOW) + if (texture->resource.format->Flags & WINED3DFMT_FLAG_SHADOW) args->shadow |= 1 << i; /* Flag samplers that need NP2 texcoord fixup. */ @@ -2036,11 +2129,11 @@ void find_ps_compile_args(IWineD3DPixelShaderImpl *shader, } if (shader->baseShader.reg_maps.shader_version.major >= 3) { - if (((IWineD3DDeviceImpl *)shader->baseShader.device)->strided_streams.position_transformed) + if (device->strided_streams.position_transformed) { args->vp_mode = pretransformed; } - else if (use_vs(stateblock)) + else if (use_vs(state)) { args->vp_mode = vertexshader; } @@ -2053,19 +2146,18 @@ void find_ps_compile_args(IWineD3DPixelShaderImpl *shader, else { args->vp_mode = vertexshader; - if (stateblock->renderState[WINED3DRS_FOGENABLE]) + if (state->render_states[WINED3DRS_FOGENABLE]) { - switch (stateblock->renderState[WINED3DRS_FOGTABLEMODE]) + switch (state->render_states[WINED3DRS_FOGTABLEMODE]) { case WINED3DFOG_NONE: - if (((IWineD3DDeviceImpl *)shader->baseShader.device)->strided_streams.position_transformed - || use_vs(stateblock)) + if (device->strided_streams.position_transformed || use_vs(state)) { args->fog = FOG_LINEAR; break; } - switch (stateblock->renderState[WINED3DRS_FOGVERTEXMODE]) + switch (state->render_states[WINED3DRS_FOGVERTEXMODE]) { case WINED3DFOG_NONE: /* Fall through. */ case WINED3DFOG_LINEAR: args->fog = FOG_LINEAR; break; @@ -2176,7 +2268,7 @@ static void pixelshader_set_limits(IWineD3DPixelShaderImpl *shader) HRESULT pixelshader_init(IWineD3DPixelShaderImpl *shader, IWineD3DDeviceImpl *device, const DWORD *byte_code, const struct wined3d_shader_signature *output_signature, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + void *parent, const struct wined3d_parent_ops *parent_ops) { const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; unsigned int i, highest_reg_used = 0, num_regs_used = 0; @@ -2261,7 +2353,7 @@ void pixelshader_update_samplers(struct shader_reg_maps *reg_maps, IWineD3DBaseT continue; } - switch (IWineD3DBaseTexture_GetTextureDimensions(textures[i])) + switch (((IWineD3DBaseTextureImpl *)textures[i])->baseTexture.target) { case GL_TEXTURE_RECTANGLE_ARB: case GL_TEXTURE_2D: @@ -2281,7 +2373,7 @@ void pixelshader_update_samplers(struct shader_reg_maps *reg_maps, IWineD3DBaseT default: FIXME("Unrecognized texture type %#x, using 2D.\n", - IWineD3DBaseTexture_GetTextureDimensions(textures[i])); + ((IWineD3DBaseTextureImpl *)textures[i])->baseTexture.target); sampler_type[i] = WINED3DSTT_2D; } } diff --git a/dll/directx/wine/wined3d/shader_sm4.c b/dll/directx/wine/wined3d/shader_sm4.c index b4637904f10..a43861498bc 100644 --- a/dll/directx/wine/wined3d/shader_sm4.c +++ b/dll/directx/wine/wined3d/shader_sm4.c @@ -49,6 +49,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); enum wined3d_sm4_opcode { WINED3D_SM4_OP_ADD = 0x00, + WINED3D_SM4_OP_AND = 0x01, WINED3D_SM4_OP_BREAK = 0x02, WINED3D_SM4_OP_BREAKC = 0x03, WINED3D_SM4_OP_CUT = 0x09, @@ -58,14 +59,19 @@ enum wined3d_sm4_opcode WINED3D_SM4_OP_ENDIF = 0x15, WINED3D_SM4_OP_ENDLOOP = 0x16, WINED3D_SM4_OP_EXP = 0x19, + WINED3D_SM4_OP_FRC = 0x1a, WINED3D_SM4_OP_IADD = 0x1e, WINED3D_SM4_OP_IF = 0x1f, WINED3D_SM4_OP_IGE = 0x21, + WINED3D_SM4_OP_IMUL = 0x26, WINED3D_SM4_OP_LOG = 0x2f, + WINED3D_SM4_OP_LOOP = 0x30, WINED3D_SM4_OP_LT = 0x31, + WINED3D_SM4_OP_MAD = 0x32, WINED3D_SM4_OP_MIN = 0x33, WINED3D_SM4_OP_MAX = 0x34, WINED3D_SM4_OP_MOV = 0x36, + WINED3D_SM4_OP_MOVC = 0x37, WINED3D_SM4_OP_MUL = 0x38, WINED3D_SM4_OP_RET = 0x3e, WINED3D_SM4_OP_RSQ = 0x44, @@ -79,12 +85,13 @@ enum wined3d_sm4_register_type WINED3D_SM4_RT_OUTPUT = 0x2, WINED3D_SM4_RT_IMMCONST = 0x4, WINED3D_SM4_RT_CONSTBUFFER = 0x8, + WINED3D_SM4_RT_NULL = 0xd, }; enum wined3d_sm4_immconst_type { - WINED3D_SM4_IMMCONST_FLOAT = 0x1, - WINED3D_SM4_IMMCONST_FLOAT4 = 0x2, + WINED3D_SM4_IMMCONST_SCALAR = 0x1, + WINED3D_SM4_IMMCONST_VEC4 = 0x2, }; struct wined3d_sm4_data @@ -112,6 +119,7 @@ struct sysval_map static const struct wined3d_sm4_opcode_info opcode_table[] = { {WINED3D_SM4_OP_ADD, WINED3DSIH_ADD, 1, 2}, + {WINED3D_SM4_OP_AND, WINED3DSIH_AND, 1, 2}, {WINED3D_SM4_OP_BREAK, WINED3DSIH_BREAK, 0, 0}, {WINED3D_SM4_OP_BREAKC, WINED3DSIH_BREAKP, 0, 1}, {WINED3D_SM4_OP_CUT, WINED3DSIH_CUT, 0, 0}, @@ -121,18 +129,23 @@ static const struct wined3d_sm4_opcode_info opcode_table[] = {WINED3D_SM4_OP_ENDIF, WINED3DSIH_ENDIF, 0, 0}, {WINED3D_SM4_OP_ENDLOOP,WINED3DSIH_ENDLOOP, 0, 0}, {WINED3D_SM4_OP_EXP, WINED3DSIH_EXP, 1, 1}, + {WINED3D_SM4_OP_FRC, WINED3DSIH_FRC, 1, 1}, {WINED3D_SM4_OP_IADD, WINED3DSIH_IADD, 1, 2}, {WINED3D_SM4_OP_IF, WINED3DSIH_IF, 0, 1}, {WINED3D_SM4_OP_IGE, WINED3DSIH_IGE, 1, 2}, + {WINED3D_SM4_OP_IMUL, WINED3DSIH_IMUL, 2, 2}, {WINED3D_SM4_OP_LOG, WINED3DSIH_LOG, 1, 1}, + {WINED3D_SM4_OP_LOOP, WINED3DSIH_LOOP, 0, 0}, {WINED3D_SM4_OP_LT, WINED3DSIH_LT, 1, 2}, + {WINED3D_SM4_OP_MAD, WINED3DSIH_MAD, 1, 3}, {WINED3D_SM4_OP_MIN, WINED3DSIH_MIN, 1, 2}, {WINED3D_SM4_OP_MAX, WINED3DSIH_MAX, 1, 2}, {WINED3D_SM4_OP_MOV, WINED3DSIH_MOV, 1, 1}, + {WINED3D_SM4_OP_MOVC, WINED3DSIH_MOVC, 1, 3}, {WINED3D_SM4_OP_MUL, WINED3DSIH_MUL, 1, 2}, {WINED3D_SM4_OP_RET, WINED3DSIH_RET, 0, 0}, {WINED3D_SM4_OP_RSQ, WINED3DSIH_RSQ, 1, 1}, - {WINED3D_SM4_OP_SINCOS, WINED3DSIH_SINCOS, 1, 2}, + {WINED3D_SM4_OP_SINCOS, WINED3DSIH_SINCOS, 2, 1}, }; static const WINED3DSHADER_PARAM_REGISTER_TYPE register_type_table[] = @@ -146,6 +159,11 @@ static const WINED3DSHADER_PARAM_REGISTER_TYPE register_type_table[] = /* UNKNOWN */ 0, /* UNKNOWN */ 0, /* WINED3D_SM4_RT_CONSTBUFFER */ WINED3DSPR_CONSTBUFFER, + /* UNKNOWN */ 0, + /* UNKNOWN */ 0, + /* UNKNOWN */ 0, + /* UNKNOWN */ 0, + /* WINED3D_SM4_RT_NULL */ WINED3DSPR_NULL, }; static const struct sysval_map sysval_map[] = @@ -336,14 +354,14 @@ static void shader_sm4_read_src_param(void *data, const DWORD **ptr, struct wine switch(immconst_type) { - case WINED3D_SM4_IMMCONST_FLOAT: - src_param->reg.immconst_type = WINED3D_IMMCONST_FLOAT; + case WINED3D_SM4_IMMCONST_SCALAR: + src_param->reg.immconst_type = WINED3D_IMMCONST_SCALAR; memcpy(src_param->reg.immconst_data, *ptr, 1 * sizeof(DWORD)); *ptr += 1; break; - case WINED3D_SM4_IMMCONST_FLOAT4: - src_param->reg.immconst_type = WINED3D_IMMCONST_FLOAT4; + case WINED3D_SM4_IMMCONST_VEC4: + src_param->reg.immconst_type = WINED3D_IMMCONST_VEC4; memcpy(src_param->reg.immconst_data, *ptr, 4 * sizeof(DWORD)); *ptr += 4; break; diff --git a/dll/directx/wine/wined3d/sqrtf.c b/dll/directx/wine/wined3d/sqrtf.c new file mode 100644 index 00000000000..512e9aeea67 --- /dev/null +++ b/dll/directx/wine/wined3d/sqrtf.c @@ -0,0 +1,11 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the w64 mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#include + +float sqrtf(float x) +{ + return (float)sqrt((double)x); +} diff --git a/dll/directx/wine/wined3d/state.c b/dll/directx/wine/wined3d/state.c index 4c6d5bfe025..6a415eee807 100644 --- a/dll/directx/wine/wined3d/state.c +++ b/dll/directx/wine/wined3d/state.c @@ -51,7 +51,7 @@ static void state_nop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi static void state_fillmode(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - WINED3DFILLMODE Value = stateblock->renderState[WINED3DRS_FILLMODE]; + WINED3DFILLMODE Value = stateblock->state.render_states[WINED3DRS_FILLMODE]; switch(Value) { case WINED3DFILL_POINT: @@ -83,7 +83,7 @@ static void state_lighting(DWORD state, IWineD3DStateBlockImpl *stateblock, stru return; } - if (stateblock->renderState[WINED3DRS_LIGHTING] + if (stateblock->state.render_states[WINED3DRS_LIGHTING] && !stateblock->device->strided_streams.position_transformed) { glEnable(GL_LIGHTING); @@ -105,7 +105,8 @@ static void state_zenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struc return; } - switch ((WINED3DZBUFFERTYPE) stateblock->renderState[WINED3DRS_ZENABLE]) { + switch (stateblock->state.render_states[WINED3DRS_ZENABLE]) + { case WINED3DZB_FALSE: glDisable(GL_DEPTH_TEST); checkGLcall("glDisable GL_DEPTH_TEST"); @@ -120,16 +121,17 @@ static void state_zenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struc FIXME("W buffer is not well handled\n"); break; default: - FIXME("Unrecognized D3DZBUFFERTYPE value %d\n", stateblock->renderState[WINED3DRS_ZENABLE]); + FIXME("Unrecognized D3DZBUFFERTYPE value %#x.\n", + stateblock->state.render_states[WINED3DRS_ZENABLE]); } } static void state_cullmode(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - /* glFrontFace() is set in context.c at context init and on an offscreen / onscreen rendering - * switch - */ - switch ((WINED3DCULL) stateblock->renderState[WINED3DRS_CULLMODE]) { + /* glFrontFace() is set in context.c at context init and on an + * offscreen / onscreen rendering switch. */ + switch (stateblock->state.render_states[WINED3DRS_CULLMODE]) + { case WINED3DCULL_NONE: glDisable(GL_CULL_FACE); checkGLcall("glDisable GL_CULL_FACE"); @@ -147,13 +149,15 @@ static void state_cullmode(DWORD state, IWineD3DStateBlockImpl *stateblock, stru checkGLcall("glCullFace(GL_BACK)"); break; default: - FIXME("Unrecognized/Unhandled WINED3DCULL value %d\n", stateblock->renderState[WINED3DRS_CULLMODE]); + FIXME("Unrecognized/Unhandled WINED3DCULL value %#x.\n", + stateblock->state.render_states[WINED3DRS_CULLMODE]); } } static void state_shademode(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - switch ((WINED3DSHADEMODE) stateblock->renderState[WINED3DRS_SHADEMODE]) { + switch (stateblock->state.render_states[WINED3DRS_SHADEMODE]) + { case WINED3DSHADE_FLAT: glShadeModel(GL_FLAT); checkGLcall("glShadeModel(GL_FLAT)"); @@ -166,16 +170,20 @@ static void state_shademode(DWORD state, IWineD3DStateBlockImpl *stateblock, str FIXME("WINED3DSHADE_PHONG isn't supported\n"); break; default: - FIXME("Unrecognized/Unhandled WINED3DSHADEMODE value %d\n", stateblock->renderState[WINED3DRS_SHADEMODE]); + FIXME("Unrecognized/Unhandled WINED3DSHADEMODE value %#x.\n", + stateblock->state.render_states[WINED3DRS_SHADEMODE]); } } static void state_ditherenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if (stateblock->renderState[WINED3DRS_DITHERENABLE]) { + if (stateblock->state.render_states[WINED3DRS_DITHERENABLE]) + { glEnable(GL_DITHER); checkGLcall("glEnable GL_DITHER"); - } else { + } + else + { glDisable(GL_DITHER); checkGLcall("glDisable GL_DITHER"); } @@ -183,13 +191,15 @@ static void state_ditherenable(DWORD state, IWineD3DStateBlockImpl *stateblock, static void state_zwritenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - /* TODO: Test if in d3d z writing is enabled even if ZENABLE is off. If yes, - * this has to be merged with ZENABLE and ZFUNC - */ - if (stateblock->renderState[WINED3DRS_ZWRITEENABLE]) { + /* TODO: Test if in d3d z writing is enabled even if ZENABLE is off. + * If yes, this has to be merged with ZENABLE and ZFUNC. */ + if (stateblock->state.render_states[WINED3DRS_ZWRITEENABLE]) + { glDepthMask(1); checkGLcall("glDepthMask(1)"); - } else { + } + else + { glDepthMask(0); checkGLcall("glDepthMask(0)"); } @@ -197,32 +207,33 @@ static void state_zwritenable(DWORD state, IWineD3DStateBlockImpl *stateblock, s static void state_zfunc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - int glParm = CompareFunc(stateblock->renderState[WINED3DRS_ZFUNC]); + GLenum depth_func = CompareFunc(stateblock->state.render_states[WINED3DRS_ZFUNC]); - if(glParm) { - if(glParm == GL_EQUAL || glParm == GL_NOTEQUAL) { - static BOOL once = FALSE; - /* There are a few issues with this: First, our inability to - * select a proper Z depth, most of the time we're stuck with - * D24S8, even if the app selects D32 or D16. There seem to be - * some other precision problems which have to be debugged to - * make NOTEQUAL and EQUAL work properly - */ - if(!once) { - once = TRUE; - FIXME("D3DCMP_NOTEQUAL and D3DCMP_EQUAL do not work correctly yet\n"); - } + if (!depth_func) return; + + if (depth_func == GL_EQUAL || depth_func == GL_NOTEQUAL) + { + static BOOL once; + /* There are a few issues with this: First, our inability to + * select a proper Z depth, most of the time we're stuck with + * D24S8, even if the app selects D32 or D16. There seem to be + * some other precision problems which have to be debugged to + * make NOTEQUAL and EQUAL work properly. */ + if (!once) + { + once = TRUE; + FIXME("D3DCMP_NOTEQUAL and D3DCMP_EQUAL do not work correctly yet.\n"); } - - glDepthFunc(glParm); - checkGLcall("glDepthFunc"); } + + glDepthFunc(depth_func); + checkGLcall("glDepthFunc"); } static void state_ambient(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { float col[4]; - D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_AMBIENT], col); + D3DCOLORTOGLFLOAT4(stateblock->state.render_states[WINED3DRS_AMBIENT], col); TRACE("Setting ambient to (%f,%f,%f,%f)\n", col[0], col[1], col[2], col[3]); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, col); @@ -236,15 +247,17 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct int srcBlend = GL_ZERO; int dstBlend = GL_ZERO; - /* GL_LINE_SMOOTH needs GL_BLEND to work, according to the red book, and special blending params */ - if (stateblock->renderState[WINED3DRS_ALPHABLENDENABLE] || - stateblock->renderState[WINED3DRS_EDGEANTIALIAS] || - stateblock->renderState[WINED3DRS_ANTIALIASEDLINEENABLE]) { - - /* Disable blending in all cases even without pixelshaders. With blending on we could face a big performance penalty. + /* According to the red book, GL_LINE_SMOOTH needs GL_BLEND with specific + * blending parameters to work. */ + if (stateblock->state.render_states[WINED3DRS_ALPHABLENDENABLE] + || stateblock->state.render_states[WINED3DRS_EDGEANTIALIAS] + || stateblock->state.render_states[WINED3DRS_ANTIALIASEDLINEENABLE]) + { + /* Disable blending in all cases even without pixelshaders. + * With blending on we could face a big performance penalty. * The d3d9 visual test confirms the behavior. */ if (context->render_offscreen - && !(target->resource.format_desc->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING)) + && !(target->resource.format->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING)) { glDisable(GL_BLEND); checkGLcall("glDisable GL_BLEND"); @@ -260,7 +273,8 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct return; }; - switch (stateblock->renderState[WINED3DRS_DESTBLEND]) { + switch (stateblock->state.render_states[WINED3DRS_DESTBLEND]) + { case WINED3DBLEND_ZERO : dstBlend = GL_ZERO; break; case WINED3DBLEND_ONE : dstBlend = GL_ONE; break; case WINED3DBLEND_SRCCOLOR : dstBlend = GL_SRC_COLOR; break; @@ -276,10 +290,10 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct * returns 1.0, so D3DBLEND_DESTALPHA is GL_ONE, and D3DBLEND_INVDESTALPHA is GL_ZERO */ case WINED3DBLEND_DESTALPHA : - dstBlend = target->resource.format_desc->alpha_mask ? GL_DST_ALPHA : GL_ONE; + dstBlend = target->resource.format->alpha_mask ? GL_DST_ALPHA : GL_ONE; break; case WINED3DBLEND_INVDESTALPHA : - dstBlend = target->resource.format_desc->alpha_mask ? GL_ONE_MINUS_DST_ALPHA : GL_ZERO; + dstBlend = target->resource.format->alpha_mask ? GL_ONE_MINUS_DST_ALPHA : GL_ZERO; break; case WINED3DBLEND_SRCALPHASAT : @@ -303,10 +317,12 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct case WINED3DBLEND_BLENDFACTOR : dstBlend = GL_CONSTANT_COLOR; break; case WINED3DBLEND_INVBLENDFACTOR : dstBlend = GL_ONE_MINUS_CONSTANT_COLOR; break; default: - FIXME("Unrecognized dst blend value %d\n", stateblock->renderState[WINED3DRS_DESTBLEND]); + FIXME("Unrecognized dst blend value %#x.\n", + stateblock->state.render_states[WINED3DRS_DESTBLEND]); } - switch (stateblock->renderState[WINED3DRS_SRCBLEND]) { + switch (stateblock->state.render_states[WINED3DRS_SRCBLEND]) + { case WINED3DBLEND_ZERO : srcBlend = GL_ZERO; break; case WINED3DBLEND_ONE : srcBlend = GL_ONE; break; case WINED3DBLEND_SRCCOLOR : srcBlend = GL_SRC_COLOR; break; @@ -318,10 +334,10 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct case WINED3DBLEND_SRCALPHASAT : srcBlend = GL_SRC_ALPHA_SATURATE; break; case WINED3DBLEND_DESTALPHA : - srcBlend = target->resource.format_desc->alpha_mask ? GL_DST_ALPHA : GL_ONE; + srcBlend = target->resource.format->alpha_mask ? GL_DST_ALPHA : GL_ONE; break; case WINED3DBLEND_INVDESTALPHA : - srcBlend = target->resource.format_desc->alpha_mask ? GL_ONE_MINUS_DST_ALPHA : GL_ZERO; + srcBlend = target->resource.format->alpha_mask ? GL_ONE_MINUS_DST_ALPHA : GL_ZERO; break; case WINED3DBLEND_BOTHSRCALPHA : srcBlend = GL_SRC_ALPHA; @@ -335,11 +351,13 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct case WINED3DBLEND_BLENDFACTOR : srcBlend = GL_CONSTANT_COLOR; break; case WINED3DBLEND_INVBLENDFACTOR : srcBlend = GL_ONE_MINUS_CONSTANT_COLOR; break; default: - FIXME("Unrecognized src blend value %d\n", stateblock->renderState[WINED3DRS_SRCBLEND]); + FIXME("Unrecognized src blend value %#x.\n", + stateblock->state.render_states[WINED3DRS_SRCBLEND]); } - if(stateblock->renderState[WINED3DRS_EDGEANTIALIAS] || - stateblock->renderState[WINED3DRS_ANTIALIASEDLINEENABLE]) { + if (stateblock->state.render_states[WINED3DRS_EDGEANTIALIAS] + || stateblock->state.render_states[WINED3DRS_ANTIALIASEDLINEENABLE]) + { glEnable(GL_LINE_SMOOTH); checkGLcall("glEnable(GL_LINE_SMOOTH)"); if(srcBlend != GL_SRC_ALPHA) { @@ -358,7 +376,8 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct state_blendop(STATE_RENDER(WINED3DRS_BLENDOPALPHA), stateblock, context); } - if(stateblock->renderState[WINED3DRS_SEPARATEALPHABLENDENABLE]) { + if (stateblock->state.render_states[WINED3DRS_SEPARATEALPHABLENDENABLE]) + { int srcBlendAlpha = GL_ZERO; int dstBlendAlpha = GL_ZERO; @@ -369,7 +388,8 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct return; } - switch (stateblock->renderState[WINED3DRS_DESTBLENDALPHA]) { + switch (stateblock->state.render_states[WINED3DRS_DESTBLENDALPHA]) + { case WINED3DBLEND_ZERO : dstBlendAlpha = GL_ZERO; break; case WINED3DBLEND_ONE : dstBlendAlpha = GL_ONE; break; case WINED3DBLEND_SRCCOLOR : dstBlendAlpha = GL_SRC_COLOR; break; @@ -400,10 +420,12 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct case WINED3DBLEND_BLENDFACTOR : dstBlendAlpha = GL_CONSTANT_COLOR; break; case WINED3DBLEND_INVBLENDFACTOR : dstBlendAlpha = GL_ONE_MINUS_CONSTANT_COLOR; break; default: - FIXME("Unrecognized dst blend alpha value %d\n", stateblock->renderState[WINED3DRS_DESTBLENDALPHA]); + FIXME("Unrecognized dst blend alpha value %#x.\n", + stateblock->state.render_states[WINED3DRS_DESTBLENDALPHA]); } - switch (stateblock->renderState[WINED3DRS_SRCBLENDALPHA]) { + switch (stateblock->state.render_states[WINED3DRS_SRCBLENDALPHA]) + { case WINED3DBLEND_ZERO : srcBlendAlpha = GL_ZERO; break; case WINED3DBLEND_ONE : srcBlendAlpha = GL_ONE; break; case WINED3DBLEND_SRCCOLOR : srcBlendAlpha = GL_SRC_COLOR; break; @@ -426,7 +448,8 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct case WINED3DBLEND_BLENDFACTOR : srcBlendAlpha = GL_CONSTANT_COLOR; break; case WINED3DBLEND_INVBLENDFACTOR : srcBlendAlpha = GL_ONE_MINUS_CONSTANT_COLOR; break; default: - FIXME("Unrecognized src blend alpha value %d\n", stateblock->renderState[WINED3DRS_SRCBLENDALPHA]); + FIXME("Unrecognized src blend alpha value %#x.\n", + stateblock->state.render_states[WINED3DRS_SRCBLENDALPHA]); } GL_EXTCALL(glBlendFuncSeparateEXT(srcBlend, dstBlend, srcBlendAlpha, dstBlendAlpha)); @@ -439,7 +462,7 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct /* colorkey fixup for stage 0 alphaop depends on WINED3DRS_ALPHABLENDENABLE state, so it may need updating */ - if (stateblock->renderState[WINED3DRS_COLORKEYENABLE]) + if (stateblock->state.render_states[WINED3DRS_COLORKEYENABLE]) stateblock_apply_state(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context); } @@ -453,8 +476,8 @@ static void state_blendfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, s const struct wined3d_gl_info *gl_info = context->gl_info; float col[4]; - TRACE("Setting BlendFactor to %d\n", stateblock->renderState[WINED3DRS_BLENDFACTOR]); - D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_BLENDFACTOR], col); + TRACE("Setting blend factor to %#x.\n", stateblock->state.render_states[WINED3DRS_BLENDFACTOR]); + D3DCOLORTOGLFLOAT4(stateblock->state.render_states[WINED3DRS_BLENDFACTOR], col); GL_EXTCALL(glBlendColorEXT (col[0],col[1],col[2],col[3])); checkGLcall("glBlendColor"); } @@ -473,13 +496,13 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct * used WINED3DRS_COLORKEYENABLE state(which is d3d <= 3 only). The texture function will call alpha * in case it finds some texture+colorkeyenable combination which needs extra care. */ - if (stateblock->textures[0]) + if (stateblock->state.textures[0]) { - UINT texture_dimensions = IWineD3DBaseTexture_GetTextureDimensions(stateblock->textures[0]); + IWineD3DBaseTextureImpl *texture = stateblock->state.textures[0]; + GLenum texture_dimensions = texture->baseTexture.target; if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB) { - IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)stateblock->textures[0]; IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[0]; if (surf->CKeyFlags & WINEDDSD_CKSRCBLT) @@ -487,7 +510,7 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct /* The surface conversion does not do color keying conversion for surfaces that have an alpha * channel on their own. Likewise, the alpha test shouldn't be set up for color keying if the * surface has alpha bits */ - if (!surf->resource.format_desc->alpha_mask) enable_ckey = TRUE; + if (!surf->resource.format->alpha_mask) enable_ckey = TRUE; } } } @@ -496,8 +519,9 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct stateblock_apply_state(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context); context->last_was_ckey = enable_ckey; - if (stateblock->renderState[WINED3DRS_ALPHATESTENABLE] || - (stateblock->renderState[WINED3DRS_COLORKEYENABLE] && enable_ckey)) { + if (stateblock->state.render_states[WINED3DRS_ALPHATESTENABLE] + || (stateblock->state.render_states[WINED3DRS_COLORKEYENABLE] && enable_ckey)) + { glEnable(GL_ALPHA_TEST); checkGLcall("glEnable GL_ALPHA_TEST"); } else { @@ -509,12 +533,13 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct return; } - if(stateblock->renderState[WINED3DRS_COLORKEYENABLE] && enable_ckey) { + if (stateblock->state.render_states[WINED3DRS_COLORKEYENABLE] && enable_ckey) + { glParm = GL_NOTEQUAL; ref = 0.0f; } else { - ref = ((float) stateblock->renderState[WINED3DRS_ALPHAREF]) / 255.0f; - glParm = CompareFunc(stateblock->renderState[WINED3DRS_ALPHAFUNC]); + ref = ((float)stateblock->state.render_states[WINED3DRS_ALPHAREF]) / 255.0f; + glParm = CompareFunc(stateblock->state.render_states[WINED3DRS_ALPHAFUNC]); } if(glParm) { glAlphaFunc(glParm, ref); @@ -522,20 +547,22 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct } } -static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void state_clipping(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; DWORD enable = 0xFFFFFFFF; DWORD disable = 0x00000000; - if (!stateblock->device->vs_clipping && use_vs(stateblock)) + if (!stateblock->device->vs_clipping && use_vs(state)) { /* The spec says that opengl clipping planes are disabled when using shaders. Direct3D planes aren't, * so that is an issue. The MacOS ATI driver keeps clipping planes activated with shaders in some * conditions I got sick of tracking down. The shader state handler disables all clip planes because * of that - don't do anything here and keep them disabled */ - if(stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]) { + if (state->render_states[WINED3DRS_CLIPPLANEENABLE]) + { static BOOL warned = FALSE; if(!warned) { FIXME("Clipping not supported with vertex shaders\n"); @@ -552,9 +579,10 @@ static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock, stru /* If enabling / disabling all * TODO: Is this correct? Doesn't D3DRS_CLIPPING disable clipping on the viewport frustrum? */ - if (stateblock->renderState[WINED3DRS_CLIPPING]) { - enable = stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]; - disable = ~stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]; + if (state->render_states[WINED3DRS_CLIPPING]) + { + enable = state->render_states[WINED3DRS_CLIPPLANEENABLE]; + disable = ~state->render_states[WINED3DRS_CLIPPLANEENABLE]; if (gl_info->supported[ARB_DEPTH_CLAMP]) { glDisable(GL_DEPTH_CLAMP); @@ -589,12 +617,15 @@ static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock, stru if (disable & WINED3DCLIPPLANE5) { glDisable(GL_CLIP_PLANE5); checkGLcall("glDisable(clip plane 5)"); } /** update clipping status */ - if (enable) { - stateblock->clip_status.ClipUnion = 0; - stateblock->clip_status.ClipIntersection = 0xFFFFFFFF; - } else { - stateblock->clip_status.ClipUnion = 0; - stateblock->clip_status.ClipIntersection = 0; + if (enable) + { + stateblock->state.clip_status.ClipUnion = 0; + stateblock->state.clip_status.ClipIntersection = 0xFFFFFFFF; + } + else + { + stateblock->state.clip_status.ClipUnion = 0; + stateblock->state.clip_status.ClipIntersection = 0; } } @@ -610,34 +641,39 @@ static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock, struc int blendEquationAlpha = GL_FUNC_ADD; /* BLENDOPALPHA requires GL_EXT_blend_equation_separate, so make sure it is around */ - if (stateblock->renderState[WINED3DRS_BLENDOPALPHA] + if (stateblock->state.render_states[WINED3DRS_BLENDOPALPHA] && !gl_info->supported[EXT_BLEND_EQUATION_SEPARATE]) { WARN("Unsupported in local OpenGL implementation: glBlendEquationSeparateEXT\n"); return; } - switch ((WINED3DBLENDOP) stateblock->renderState[WINED3DRS_BLENDOP]) { + switch (stateblock->state.render_states[WINED3DRS_BLENDOP]) + { case WINED3DBLENDOP_ADD : blendEquation = GL_FUNC_ADD; break; case WINED3DBLENDOP_SUBTRACT : blendEquation = GL_FUNC_SUBTRACT; break; case WINED3DBLENDOP_REVSUBTRACT : blendEquation = GL_FUNC_REVERSE_SUBTRACT; break; case WINED3DBLENDOP_MIN : blendEquation = GL_MIN; break; case WINED3DBLENDOP_MAX : blendEquation = GL_MAX; break; default: - FIXME("Unrecognized/Unhandled D3DBLENDOP value %d\n", stateblock->renderState[WINED3DRS_BLENDOP]); + FIXME("Unrecognized/Unhandled D3DBLENDOP value %#x.\n", + stateblock->state.render_states[WINED3DRS_BLENDOP]); } - switch ((WINED3DBLENDOP) stateblock->renderState[WINED3DRS_BLENDOPALPHA]) { + switch (stateblock->state.render_states[WINED3DRS_BLENDOPALPHA]) + { case WINED3DBLENDOP_ADD : blendEquationAlpha = GL_FUNC_ADD; break; case WINED3DBLENDOP_SUBTRACT : blendEquationAlpha = GL_FUNC_SUBTRACT; break; case WINED3DBLENDOP_REVSUBTRACT : blendEquationAlpha = GL_FUNC_REVERSE_SUBTRACT; break; case WINED3DBLENDOP_MIN : blendEquationAlpha = GL_MIN; break; case WINED3DBLENDOP_MAX : blendEquationAlpha = GL_MAX; break; default: - FIXME("Unrecognized/Unhandled D3DBLENDOP value %d\n", stateblock->renderState[WINED3DRS_BLENDOPALPHA]); + FIXME("Unrecognized/Unhandled D3DBLENDOP value %#x\n", + stateblock->state.render_states[WINED3DRS_BLENDOPALPHA]); } - if(stateblock->renderState[WINED3DRS_SEPARATEALPHABLENDENABLE]) { + if (stateblock->state.render_states[WINED3DRS_SEPARATEALPHABLENDENABLE]) + { TRACE("glBlendEquationSeparateEXT(%x, %x)\n", blendEquation, blendEquationAlpha); GL_EXTCALL(glBlendEquationSeparateEXT(blendEquation, blendEquationAlpha)); checkGLcall("glBlendEquationSeparateEXT"); @@ -682,11 +718,12 @@ static void state_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock */ TRACE("Setting specular enable state and materials\n"); - if (stateblock->renderState[WINED3DRS_SPECULARENABLE]) { - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float*) &stateblock->material.Specular); + if (stateblock->state.render_states[WINED3DRS_SPECULARENABLE]) + { + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float *)&stateblock->state.material.Specular); checkGLcall("glMaterialfv"); - if (stateblock->material.Power > gl_info->limits.shininess) + if (stateblock->state.material.Power > gl_info->limits.shininess) { /* glMaterialf man page says that the material says that GL_SHININESS must be between 0.0 * and 128.0, although in d3d neither -1 nor 129 produce an error. GL_NV_max_light_exponent @@ -694,10 +731,12 @@ static void state_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock * value reported by the extension, otherwise 128. For values > gl_info->limits.shininess clamp * them, it should be safe to do so without major visual distortions. */ - WARN("Material power = %f, limit %f\n", stateblock->material.Power, gl_info->limits.shininess); + WARN("Material power = %f, limit %f\n", stateblock->state.material.Power, gl_info->limits.shininess); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, gl_info->limits.shininess); - } else { - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, stateblock->material.Power); + } + else + { + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, stateblock->state.material.Power); } checkGLcall("glMaterialf(GL_SHININESS)"); @@ -742,23 +781,23 @@ static void state_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock } TRACE("(%p) : Diffuse {%.8e, %.8e, %.8e, %.8e}\n", stateblock->device, - stateblock->material.Diffuse.r, stateblock->material.Diffuse.g, - stateblock->material.Diffuse.b, stateblock->material.Diffuse.a); + stateblock->state.material.Diffuse.r, stateblock->state.material.Diffuse.g, + stateblock->state.material.Diffuse.b, stateblock->state.material.Diffuse.a); TRACE("(%p) : Ambient {%.8e, %.8e, %.8e, %.8e}\n", stateblock->device, - stateblock->material.Ambient.r, stateblock->material.Ambient.g, - stateblock->material.Ambient.b, stateblock->material.Ambient.a); + stateblock->state.material.Ambient.r, stateblock->state.material.Ambient.g, + stateblock->state.material.Ambient.b, stateblock->state.material.Ambient.a); TRACE("(%p) : Specular {%.8e, %.8e, %.8e, %.8e}\n", stateblock->device, - stateblock->material.Specular.r, stateblock->material.Specular.g, - stateblock->material.Specular.b, stateblock->material.Specular.a); + stateblock->state.material.Specular.r, stateblock->state.material.Specular.g, + stateblock->state.material.Specular.b, stateblock->state.material.Specular.a); TRACE("(%p) : Emissive {%.8e, %.8e, %.8e, %.8e}\n", stateblock->device, - stateblock->material.Emissive.r, stateblock->material.Emissive.g, - stateblock->material.Emissive.b, stateblock->material.Emissive.a); + stateblock->state.material.Emissive.r, stateblock->state.material.Emissive.g, + stateblock->state.material.Emissive.b, stateblock->state.material.Emissive.a); - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float*) &stateblock->material.Ambient); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float *)&stateblock->state.material.Ambient); checkGLcall("glMaterialfv(GL_AMBIENT)"); - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float*) &stateblock->material.Diffuse); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float *)&stateblock->state.material.Diffuse); checkGLcall("glMaterialfv(GL_DIFFUSE)"); - glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float*) &stateblock->material.Emissive); + glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float *)&stateblock->state.material.Emissive); checkGLcall("glMaterialfv(GL_EMISSION)"); } @@ -771,7 +810,7 @@ static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, str * GL_TEXTURE_ENV_COLOR applies to active only */ float col[4]; - D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col); + D3DCOLORTOGLFLOAT4(stateblock->state.render_states[WINED3DRS_TEXTUREFACTOR], col); /* And now the default texture color as well */ for (i = 0; i < gl_info->limits.texture_stages; ++i) @@ -826,20 +865,20 @@ static void state_stencil(DWORD state, IWineD3DStateBlockImpl *stateblock, struc return; } - onesided_enable = stateblock->renderState[WINED3DRS_STENCILENABLE]; - twosided_enable = stateblock->renderState[WINED3DRS_TWOSIDEDSTENCILMODE]; - if( !( func = CompareFunc(stateblock->renderState[WINED3DRS_STENCILFUNC]) ) ) + onesided_enable = stateblock->state.render_states[WINED3DRS_STENCILENABLE]; + twosided_enable = stateblock->state.render_states[WINED3DRS_TWOSIDEDSTENCILMODE]; + if (!(func = CompareFunc(stateblock->state.render_states[WINED3DRS_STENCILFUNC]))) func = GL_ALWAYS; - if( !( func_ccw = CompareFunc(stateblock->renderState[WINED3DRS_CCW_STENCILFUNC]) ) ) + if (!(func_ccw = CompareFunc(stateblock->state.render_states[WINED3DRS_CCW_STENCILFUNC]))) func_ccw = GL_ALWAYS; - ref = stateblock->renderState[WINED3DRS_STENCILREF]; - mask = stateblock->renderState[WINED3DRS_STENCILMASK]; - stencilFail = StencilOp(stateblock->renderState[WINED3DRS_STENCILFAIL]); - depthFail = StencilOp(stateblock->renderState[WINED3DRS_STENCILZFAIL]); - stencilPass = StencilOp(stateblock->renderState[WINED3DRS_STENCILPASS]); - stencilFail_ccw = StencilOp(stateblock->renderState[WINED3DRS_CCW_STENCILFAIL]); - depthFail_ccw = StencilOp(stateblock->renderState[WINED3DRS_CCW_STENCILZFAIL]); - stencilPass_ccw = StencilOp(stateblock->renderState[WINED3DRS_CCW_STENCILPASS]); + ref = stateblock->state.render_states[WINED3DRS_STENCILREF]; + mask = stateblock->state.render_states[WINED3DRS_STENCILMASK]; + stencilFail = StencilOp(stateblock->state.render_states[WINED3DRS_STENCILFAIL]); + depthFail = StencilOp(stateblock->state.render_states[WINED3DRS_STENCILZFAIL]); + stencilPass = StencilOp(stateblock->state.render_states[WINED3DRS_STENCILPASS]); + stencilFail_ccw = StencilOp(stateblock->state.render_states[WINED3DRS_CCW_STENCILFAIL]); + depthFail_ccw = StencilOp(stateblock->state.render_states[WINED3DRS_CCW_STENCILZFAIL]); + stencilPass_ccw = StencilOp(stateblock->state.render_states[WINED3DRS_CCW_STENCILPASS]); TRACE("(onesided %d, twosided %d, ref %x, mask %x, " "GL_FRONT: func: %x, fail %x, zfail %x, zpass %x " @@ -902,7 +941,7 @@ static void state_stencil(DWORD state, IWineD3DStateBlockImpl *stateblock, struc static void state_stencilwrite2s(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - DWORD mask = stateblock->device->depth_stencil ? stateblock->renderState[WINED3DRS_STENCILWRITEMASK] : 0; + DWORD mask = stateblock->device->depth_stencil ? stateblock->state.render_states[WINED3DRS_STENCILWRITEMASK] : 0; const struct wined3d_gl_info *gl_info = context->gl_info; GL_EXTCALL(glActiveStencilFaceEXT(GL_BACK)); @@ -916,7 +955,7 @@ static void state_stencilwrite2s(DWORD state, IWineD3DStateBlockImpl *stateblock static void state_stencilwrite(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - DWORD mask = stateblock->device->depth_stencil ? stateblock->renderState[WINED3DRS_STENCILWRITEMASK] : 0; + DWORD mask = stateblock->device->depth_stencil ? stateblock->state.render_states[WINED3DRS_STENCILWRITEMASK] : 0; glStencilMask(mask); checkGLcall("glStencilMask"); @@ -927,10 +966,11 @@ static void state_fog_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock TRACE("state %#x, stateblock %p, context %p\n", state, stateblock, context); - if (!stateblock->renderState[WINED3DRS_FOGENABLE]) return; + if (!stateblock->state.render_states[WINED3DRS_FOGENABLE]) return; /* Table fog on: Never use fog coords, and use per-fragment fog */ - if(stateblock->renderState[WINED3DRS_FOGTABLEMODE] != WINED3DFOG_NONE) { + if (stateblock->state.render_states[WINED3DRS_FOGTABLEMODE] != WINED3DFOG_NONE) + { glHint(GL_FOG_HINT, GL_NICEST); if(context->fog_coord) { glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); @@ -943,7 +983,8 @@ static void state_fog_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock /* Otherwise use per-vertex fog in any case */ glHint(GL_FOG_HINT, GL_FASTEST); - if(stateblock->renderState[WINED3DRS_FOGVERTEXMODE] == WINED3DFOG_NONE || context->last_was_rhw) { + if (stateblock->state.render_states[WINED3DRS_FOGVERTEXMODE] == WINED3DFOG_NONE || context->last_was_rhw) + { /* No fog at all, or transformed vertices: Use fog coord */ if(!context->fog_coord) { glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT); @@ -980,9 +1021,9 @@ void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct w break; case FOGSOURCE_FFP: - tmpvalue.d = stateblock->renderState[WINED3DRS_FOGSTART]; + tmpvalue.d = stateblock->state.render_states[WINED3DRS_FOGSTART]; fogstart = tmpvalue.f; - tmpvalue.d = stateblock->renderState[WINED3DRS_FOGEND]; + tmpvalue.d = stateblock->state.render_states[WINED3DRS_FOGEND]; fogend = tmpvalue.f; /* In GL, fogstart == fogend disables fog, in D3D everything's fogged.*/ if(fogstart == fogend) { @@ -1009,13 +1050,15 @@ void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct w TRACE("Fog End == %f\n", fogend); } -void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +void state_fog_fragpart(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { + const struct wined3d_state *state = &stateblock->state; enum fogsource new_source; - TRACE("state %#x, stateblock %p, context %p\n", state, stateblock, context); + TRACE("state_id %#x, stateblock %p, context %p\n", state_id, stateblock, context); - if (!stateblock->renderState[WINED3DRS_FOGENABLE]) { + if (!state->render_states[WINED3DRS_FOGENABLE]) + { /* No fog? Disable it, and we're done :-) */ glDisableWINE(GL_FOG); checkGLcall("glDisable GL_FOG"); @@ -1068,13 +1111,18 @@ void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct /* DX 7 sdk: "If both render states(vertex and table fog) are set to valid modes, * the system will apply only pixel(=table) fog effects." */ - if(stateblock->renderState[WINED3DRS_FOGTABLEMODE] == WINED3DFOG_NONE) { - if(use_vs(stateblock)) { + if (state->render_states[WINED3DRS_FOGTABLEMODE] == WINED3DFOG_NONE) + { + if (use_vs(state)) + { glFogi(GL_FOG_MODE, GL_LINEAR); checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR)"); new_source = FOGSOURCE_VS; - } else { - switch (stateblock->renderState[WINED3DRS_FOGVERTEXMODE]) { + } + else + { + switch (state->render_states[WINED3DRS_FOGVERTEXMODE]) + { /* If processed vertices are used, fall through to the NONE case */ case WINED3DFOG_EXP: if(!context->last_was_rhw) { @@ -1114,14 +1162,16 @@ void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct break; default: - FIXME("Unexpected WINED3DRS_FOGVERTEXMODE %d\n", stateblock->renderState[WINED3DRS_FOGVERTEXMODE]); + FIXME("Unexpected WINED3DRS_FOGVERTEXMODE %#x.\n", + state->render_states[WINED3DRS_FOGVERTEXMODE]); new_source = FOGSOURCE_FFP; /* Make the compiler happy */ } } } else { new_source = FOGSOURCE_FFP; - switch (stateblock->renderState[WINED3DRS_FOGTABLEMODE]) { + switch (state->render_states[WINED3DRS_FOGTABLEMODE]) + { case WINED3DFOG_EXP: glFogi(GL_FOG_MODE, GL_EXP); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP)"); @@ -1139,7 +1189,8 @@ void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct case WINED3DFOG_NONE: /* Won't happen */ default: - FIXME("Unexpected WINED3DRS_FOGTABLEMODE %d\n", stateblock->renderState[WINED3DRS_FOGTABLEMODE]); + FIXME("Unexpected WINED3DRS_FOGTABLEMODE %#x.\n", + state->render_states[WINED3DRS_FOGTABLEMODE]); } } @@ -1153,14 +1204,14 @@ void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct static void state_rangefog_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_RANGEFOGENABLE]) { + if (stateblock->state.render_states[WINED3DRS_RANGEFOGENABLE]) WARN("Range fog enabled, but not supported by this opengl implementation\n"); - } } static void state_rangefog(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_RANGEFOGENABLE]) { + if (stateblock->state.render_states[WINED3DRS_RANGEFOGENABLE]) + { glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_RADIAL_NV); checkGLcall("glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_RADIAL_NV)"); } else { @@ -1172,7 +1223,7 @@ static void state_rangefog(DWORD state, IWineD3DStateBlockImpl *stateblock, stru void state_fogcolor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { float col[4]; - D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_FOGCOLOR], col); + D3DCOLORTOGLFLOAT4(stateblock->state.render_states[WINED3DRS_FOGCOLOR], col); glFogfv(GL_FOG_COLOR, &col[0]); checkGLcall("glFog GL_FOG_COLOR"); } @@ -1183,13 +1234,14 @@ void state_fogdensity(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi DWORD d; float f; } tmpvalue; - tmpvalue.d = stateblock->renderState[WINED3DRS_FOGDENSITY]; + tmpvalue.d = stateblock->state.render_states[WINED3DRS_FOGDENSITY]; glFogfv(GL_FOG_DENSITY, &tmpvalue.f); checkGLcall("glFogf(GL_FOG_DENSITY, (float) Value)"); } -static void state_colormat(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void state_colormat(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { + const struct wined3d_state *state = &stateblock->state; IWineD3DDeviceImpl *device = stateblock->device; GLenum Parm = 0; @@ -1203,45 +1255,56 @@ static void state_colormat(DWORD state, IWineD3DStateBlockImpl *stateblock, stru context->num_untracked_materials = 0; if ((device->strided_streams.use_map & (1 << WINED3D_FFP_DIFFUSE)) - && stateblock->renderState[WINED3DRS_COLORVERTEX]) + && state->render_states[WINED3DRS_COLORVERTEX]) { TRACE("diff %d, amb %d, emis %d, spec %d\n", - stateblock->renderState[WINED3DRS_DIFFUSEMATERIALSOURCE], - stateblock->renderState[WINED3DRS_AMBIENTMATERIALSOURCE], - stateblock->renderState[WINED3DRS_EMISSIVEMATERIALSOURCE], - stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE]); + state->render_states[WINED3DRS_DIFFUSEMATERIALSOURCE], + state->render_states[WINED3DRS_AMBIENTMATERIALSOURCE], + state->render_states[WINED3DRS_EMISSIVEMATERIALSOURCE], + state->render_states[WINED3DRS_SPECULARMATERIALSOURCE]); - if (stateblock->renderState[WINED3DRS_DIFFUSEMATERIALSOURCE] == WINED3DMCS_COLOR1) { - if (stateblock->renderState[WINED3DRS_AMBIENTMATERIALSOURCE] == WINED3DMCS_COLOR1) { + if (state->render_states[WINED3DRS_DIFFUSEMATERIALSOURCE] == WINED3DMCS_COLOR1) + { + if (state->render_states[WINED3DRS_AMBIENTMATERIALSOURCE] == WINED3DMCS_COLOR1) Parm = GL_AMBIENT_AND_DIFFUSE; - } else { + else Parm = GL_DIFFUSE; - } - if(stateblock->renderState[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) { + if (state->render_states[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) + { context->untracked_materials[context->num_untracked_materials] = GL_EMISSION; context->num_untracked_materials++; } - if(stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) { + if (state->render_states[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) + { context->untracked_materials[context->num_untracked_materials] = GL_SPECULAR; context->num_untracked_materials++; } - } else if (stateblock->renderState[WINED3DRS_AMBIENTMATERIALSOURCE] == WINED3DMCS_COLOR1) { + } + else if (state->render_states[WINED3DRS_AMBIENTMATERIALSOURCE] == WINED3DMCS_COLOR1) + { Parm = GL_AMBIENT; - if(stateblock->renderState[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) { + if (state->render_states[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) + { context->untracked_materials[context->num_untracked_materials] = GL_EMISSION; context->num_untracked_materials++; } - if(stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) { + if (state->render_states[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) + { context->untracked_materials[context->num_untracked_materials] = GL_SPECULAR; context->num_untracked_materials++; } - } else if (stateblock->renderState[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) { + } + else if (state->render_states[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) + { Parm = GL_EMISSION; - if(stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) { + if (state->render_states[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) + { context->untracked_materials[context->num_untracked_materials] = GL_SPECULAR; context->num_untracked_materials++; } - } else if (stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) { + } + else if (state->render_states[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) + { Parm = GL_SPECULAR; } } @@ -1263,30 +1326,31 @@ static void state_colormat(DWORD state, IWineD3DStateBlockImpl *stateblock, stru * tracking with glColorMaterial, so apply those here. */ switch (context->tracking_parm) { case GL_AMBIENT_AND_DIFFUSE: - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float*)&device->updateStateBlock->material.Ambient); - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float*)&device->updateStateBlock->material.Diffuse); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float *)&state->material.Ambient); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float *)&state->material.Diffuse); checkGLcall("glMaterialfv"); break; case GL_DIFFUSE: - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float*)&device->updateStateBlock->material.Diffuse); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float *)&state->material.Diffuse); checkGLcall("glMaterialfv"); break; case GL_AMBIENT: - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float*)&device->updateStateBlock->material.Ambient); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float *)&state->material.Ambient); checkGLcall("glMaterialfv"); break; case GL_EMISSION: - glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float*)&device->updateStateBlock->material.Emissive); + glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float *)&state->material.Emissive); checkGLcall("glMaterialfv"); break; case GL_SPECULAR: /* Only change material color if specular is enabled, otherwise it is set to black */ - if (device->stateBlock->renderState[WINED3DRS_SPECULARENABLE]) { - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float*)&device->updateStateBlock->material.Specular); + if (state->render_states[WINED3DRS_SPECULARENABLE]) + { + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float *)&state->material.Specular); checkGLcall("glMaterialfv"); } else { static const GLfloat black[] = {0.0f, 0.0f, 0.0f, 0.0f}; @@ -1305,7 +1369,7 @@ static void state_linepattern(DWORD state, IWineD3DStateBlockImpl *stateblock, s DWORD d; WINED3DLINEPATTERN lp; } tmppattern; - tmppattern.d = stateblock->renderState[WINED3DRS_LINEPATTERN]; + tmppattern.d = stateblock->state.render_states[WINED3DRS_LINEPATTERN]; TRACE("Line pattern: repeat %d bits %x\n", tmppattern.lp.wRepeatFactor, tmppattern.lp.wLinePattern); @@ -1327,8 +1391,9 @@ static void state_zbias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct float f; } tmpvalue; - if (stateblock->renderState[WINED3DRS_ZBIAS]) { - tmpvalue.d = stateblock->renderState[WINED3DRS_ZBIAS]; + if (stateblock->state.render_states[WINED3DRS_ZBIAS]) + { + tmpvalue.d = stateblock->state.render_states[WINED3DRS_ZBIAS]; TRACE("ZBias value %f\n", tmpvalue.f); glPolygonOffset(0, -tmpvalue.f); checkGLcall("glPolygonOffset(0, -Value)"); @@ -1358,7 +1423,7 @@ static void state_normalize(DWORD state, IWineD3DStateBlockImpl *stateblock, str * from the opengl lighting equation, as d3d does. Normalization of 0/0/0 can lead to a division * by zero and is not properly defined in opengl, so avoid it */ - if (stateblock->renderState[WINED3DRS_NORMALIZENORMALS] + if (stateblock->state.render_states[WINED3DRS_NORMALIZENORMALS] && (stateblock->device->strided_streams.use_map & (1 << WINED3D_FFP_NORMAL))) { glEnable(GL_NORMALIZE); @@ -1376,12 +1441,12 @@ static void state_psizemin_w(DWORD state, IWineD3DStateBlockImpl *stateblock, st float f; } tmpvalue; - tmpvalue.d = stateblock->renderState[WINED3DRS_POINTSIZE_MIN]; + tmpvalue.d = stateblock->state.render_states[WINED3DRS_POINTSIZE_MIN]; if (tmpvalue.f != 1.0f) { FIXME("WINED3DRS_POINTSIZE_MIN not supported on this opengl, value is %f\n", tmpvalue.f); } - tmpvalue.d = stateblock->renderState[WINED3DRS_POINTSIZE_MAX]; + tmpvalue.d = stateblock->state.render_states[WINED3DRS_POINTSIZE_MAX]; if (tmpvalue.f != 64.0f) { FIXME("WINED3DRS_POINTSIZE_MAX not supported on this opengl, value is %f\n", tmpvalue.f); @@ -1398,8 +1463,8 @@ static void state_psizemin_ext(DWORD state, IWineD3DStateBlockImpl *stateblock, float f; } min, max; - min.d = stateblock->renderState[WINED3DRS_POINTSIZE_MIN]; - max.d = stateblock->renderState[WINED3DRS_POINTSIZE_MAX]; + min.d = stateblock->state.render_states[WINED3DRS_POINTSIZE_MIN]; + max.d = stateblock->state.render_states[WINED3DRS_POINTSIZE_MAX]; /* Max point size trumps min point size */ if(min.f > max.f) { @@ -1421,8 +1486,8 @@ static void state_psizemin_arb(DWORD state, IWineD3DStateBlockImpl *stateblock, float f; } min, max; - min.d = stateblock->renderState[WINED3DRS_POINTSIZE_MIN]; - max.d = stateblock->renderState[WINED3DRS_POINTSIZE_MAX]; + min.d = stateblock->state.render_states[WINED3DRS_POINTSIZE_MIN]; + max.d = stateblock->state.render_states[WINED3DRS_POINTSIZE_MAX]; /* Max point size trumps min point size */ if(min.f > max.f) { @@ -1452,14 +1517,15 @@ static void state_pscale(DWORD state, IWineD3DStateBlockImpl *stateblock, struct float f; } pointSize, A, B, C; - pointSize.d = stateblock->renderState[WINED3DRS_POINTSIZE]; - A.d = stateblock->renderState[WINED3DRS_POINTSCALE_A]; - B.d = stateblock->renderState[WINED3DRS_POINTSCALE_B]; - C.d = stateblock->renderState[WINED3DRS_POINTSCALE_C]; + pointSize.d = stateblock->state.render_states[WINED3DRS_POINTSIZE]; + A.d = stateblock->state.render_states[WINED3DRS_POINTSCALE_A]; + B.d = stateblock->state.render_states[WINED3DRS_POINTSCALE_B]; + C.d = stateblock->state.render_states[WINED3DRS_POINTSCALE_C]; - if(stateblock->renderState[WINED3DRS_POINTSCALEENABLE]) { + if (stateblock->state.render_states[WINED3DRS_POINTSCALEENABLE]) + { GLfloat scaleFactor; - float h = stateblock->viewport.Height; + DWORD h = stateblock->state.viewport.Height; if (pointSize.f < gl_info->limits.pointsize_min) { @@ -1487,7 +1553,7 @@ static void state_pscale(DWORD state, IWineD3DStateBlockImpl *stateblock, struct } else { scaleFactor = 1.0f; } - scaleFactor = pow(h * scaleFactor, 2); + scaleFactor = powf(h * scaleFactor, 2); att[0] = A.f / scaleFactor; att[1] = B.f / scaleFactor; @@ -1503,7 +1569,9 @@ static void state_pscale(DWORD state, IWineD3DStateBlockImpl *stateblock, struct { GL_EXTCALL(glPointParameterfvEXT)(GL_DISTANCE_ATTENUATION_EXT, att); checkGLcall("glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, ...)"); - } else if(stateblock->renderState[WINED3DRS_POINTSCALEENABLE]) { + } + else if(stateblock->state.render_states[WINED3DRS_POINTSCALEENABLE]) + { WARN("POINT_PARAMETERS not supported in this version of opengl\n"); } @@ -1513,15 +1581,15 @@ static void state_pscale(DWORD state, IWineD3DStateBlockImpl *stateblock, struct static void state_debug_monitor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - WARN("token: %#x\n", stateblock->renderState[WINED3DRS_DEBUGMONITORTOKEN]); + WARN("token: %#x\n", stateblock->state.render_states[WINED3DRS_DEBUGMONITORTOKEN]); } static void state_colorwrite(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - DWORD mask0 = stateblock->renderState[WINED3DRS_COLORWRITEENABLE]; - DWORD mask1 = stateblock->renderState[WINED3DRS_COLORWRITEENABLE1]; - DWORD mask2 = stateblock->renderState[WINED3DRS_COLORWRITEENABLE2]; - DWORD mask3 = stateblock->renderState[WINED3DRS_COLORWRITEENABLE3]; + DWORD mask0 = stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE]; + DWORD mask1 = stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE1]; + DWORD mask2 = stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE2]; + DWORD mask3 = stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE3]; TRACE("Color mask: r(%d) g(%d) b(%d) a(%d)\n", mask0 & WINED3DCOLORWRITEENABLE_RED ? 1 : 0, @@ -1554,27 +1622,28 @@ static void set_color_mask(const struct wined3d_gl_info *gl_info, UINT index, DW static void state_colorwrite0(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - set_color_mask(context->gl_info, 0, stateblock->renderState[WINED3DRS_COLORWRITEENABLE]); + set_color_mask(context->gl_info, 0, stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE]); } static void state_colorwrite1(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - set_color_mask(context->gl_info, 1, stateblock->renderState[WINED3DRS_COLORWRITEENABLE1]); + set_color_mask(context->gl_info, 1, stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE1]); } static void state_colorwrite2(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - set_color_mask(context->gl_info, 2, stateblock->renderState[WINED3DRS_COLORWRITEENABLE2]); + set_color_mask(context->gl_info, 2, stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE2]); } static void state_colorwrite3(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - set_color_mask(context->gl_info, 3, stateblock->renderState[WINED3DRS_COLORWRITEENABLE3]); + set_color_mask(context->gl_info, 3, stateblock->state.render_states[WINED3DRS_COLORWRITEENABLE3]); } static void state_localviewer(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_LOCALVIEWER]) { + if (stateblock->state.render_states[WINED3DRS_LOCALVIEWER]) + { glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1); checkGLcall("glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1)"); } else { @@ -1585,7 +1654,8 @@ static void state_localviewer(DWORD state, IWineD3DStateBlockImpl *stateblock, s static void state_lastpixel(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_LASTPIXEL]) { + if (stateblock->state.render_states[WINED3DRS_LASTPIXEL]) + { TRACE("Last Pixel Drawing Enabled\n"); } else { static BOOL warned; @@ -1603,24 +1673,26 @@ static void state_pointsprite_w(DWORD state, IWineD3DStateBlockImpl *stateblock, static BOOL warned; /* TODO: NV_POINT_SPRITE */ - if (!warned && stateblock->renderState[WINED3DRS_POINTSPRITEENABLE]) { + if (!warned && stateblock->state.render_states[WINED3DRS_POINTSPRITEENABLE]) + { /* A FIXME, not a WARN because point sprites should be software emulated if not supported by HW */ FIXME("Point sprites not supported\n"); warned = TRUE; } } -static void state_pointsprite(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void state_pointsprite(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; - if (stateblock->renderState[WINED3DRS_POINTSPRITEENABLE]) + if (state->render_states[WINED3DRS_POINTSPRITEENABLE]) { static BOOL warned; if (gl_info->limits.point_sprite_units < gl_info->limits.textures && !warned) { - if (use_ps(stateblock) || stateblock->lowest_disabled_stage > gl_info->limits.point_sprite_units) + if (use_ps(state) || state->lowest_disabled_stage > gl_info->limits.point_sprite_units) { FIXME("The app uses point sprite texture coordinates on more units than supported by the driver\n"); warned = TRUE; @@ -1645,37 +1717,37 @@ static void state_wrap(DWORD state, IWineD3DStateBlockImpl *stateblock, struct w so far as I can tell, wrapping and texture-coordinate generate go hand in hand, */ - TRACE("Stub\n"); - if(stateblock->renderState[WINED3DRS_WRAP0] || - stateblock->renderState[WINED3DRS_WRAP1] || - stateblock->renderState[WINED3DRS_WRAP2] || - stateblock->renderState[WINED3DRS_WRAP3] || - stateblock->renderState[WINED3DRS_WRAP4] || - stateblock->renderState[WINED3DRS_WRAP5] || - stateblock->renderState[WINED3DRS_WRAP6] || - stateblock->renderState[WINED3DRS_WRAP7] || - stateblock->renderState[WINED3DRS_WRAP8] || - stateblock->renderState[WINED3DRS_WRAP9] || - stateblock->renderState[WINED3DRS_WRAP10] || - stateblock->renderState[WINED3DRS_WRAP11] || - stateblock->renderState[WINED3DRS_WRAP12] || - stateblock->renderState[WINED3DRS_WRAP13] || - stateblock->renderState[WINED3DRS_WRAP14] || - stateblock->renderState[WINED3DRS_WRAP15] ) { - FIXME("(WINED3DRS_WRAP0) Texture wrapping not yet supported\n"); + if (stateblock->state.render_states[WINED3DRS_WRAP0] + || stateblock->state.render_states[WINED3DRS_WRAP1] + || stateblock->state.render_states[WINED3DRS_WRAP2] + || stateblock->state.render_states[WINED3DRS_WRAP3] + || stateblock->state.render_states[WINED3DRS_WRAP4] + || stateblock->state.render_states[WINED3DRS_WRAP5] + || stateblock->state.render_states[WINED3DRS_WRAP6] + || stateblock->state.render_states[WINED3DRS_WRAP7] + || stateblock->state.render_states[WINED3DRS_WRAP8] + || stateblock->state.render_states[WINED3DRS_WRAP9] + || stateblock->state.render_states[WINED3DRS_WRAP10] + || stateblock->state.render_states[WINED3DRS_WRAP11] + || stateblock->state.render_states[WINED3DRS_WRAP12] + || stateblock->state.render_states[WINED3DRS_WRAP13] + || stateblock->state.render_states[WINED3DRS_WRAP14] + || stateblock->state.render_states[WINED3DRS_WRAP15]) + { + FIXME("(WINED3DRS_WRAP0) Texture wrapping not yet supported.\n"); } } static void state_msaa_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_MULTISAMPLEANTIALIAS]) { + if (stateblock->state.render_states[WINED3DRS_MULTISAMPLEANTIALIAS]) WARN("Multisample antialiasing not supported by gl\n"); - } } static void state_msaa(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_MULTISAMPLEANTIALIAS]) { + if (stateblock->state.render_states[WINED3DRS_MULTISAMPLEANTIALIAS]) + { glEnable(GL_MULTISAMPLE_ARB); checkGLcall("glEnable(GL_MULTISAMPLE_ARB)"); } else { @@ -1686,7 +1758,8 @@ static void state_msaa(DWORD state, IWineD3DStateBlockImpl *stateblock, struct w static void state_scissor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_SCISSORTESTENABLE]) { + if (stateblock->state.render_states[WINED3DRS_SCISSORTESTENABLE]) + { glEnable(GL_SCISSOR_TEST); checkGLcall("glEnable(GL_SCISSOR_TEST)"); } else { @@ -1706,8 +1779,8 @@ static void state_scissor(DWORD state, IWineD3DStateBlockImpl *stateblock, struc * need to be scaled. */ static void state_depthbias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if (stateblock->renderState[WINED3DRS_SLOPESCALEDEPTHBIAS] - || stateblock->renderState[WINED3DRS_DEPTHBIAS]) + if (stateblock->state.render_states[WINED3DRS_SLOPESCALEDEPTHBIAS] + || stateblock->state.render_states[WINED3DRS_DEPTHBIAS]) { union { @@ -1715,8 +1788,8 @@ static void state_depthbias(DWORD state, IWineD3DStateBlockImpl *stateblock, str float f; } scale_bias, const_bias; - scale_bias.d = stateblock->renderState[WINED3DRS_SLOPESCALEDEPTHBIAS]; - const_bias.d = stateblock->renderState[WINED3DRS_DEPTHBIAS]; + scale_bias.d = stateblock->state.render_states[WINED3DRS_SLOPESCALEDEPTHBIAS]; + const_bias.d = stateblock->state.render_states[WINED3DRS_DEPTHBIAS]; glEnable(GL_POLYGON_OFFSET_FILL); checkGLcall("glEnable(GL_POLYGON_OFFSET_FILL)"); @@ -1731,13 +1804,14 @@ static void state_depthbias(DWORD state, IWineD3DStateBlockImpl *stateblock, str static void state_zvisible(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if (stateblock->renderState[WINED3DRS_ZVISIBLE]) + if (stateblock->state.render_states[WINED3DRS_ZVISIBLE]) FIXME("WINED3DRS_ZVISIBLE not implemented.\n"); } static void state_perspective(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if (stateblock->renderState[WINED3DRS_TEXTUREPERSPECTIVE]) { + if (stateblock->state.render_states[WINED3DRS_TEXTUREPERSPECTIVE]) + { glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); checkGLcall("glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)"); } else { @@ -1748,30 +1822,28 @@ static void state_perspective(DWORD state, IWineD3DStateBlockImpl *stateblock, s static void state_stippledalpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - TRACE("Stub\n"); - if (stateblock->renderState[WINED3DRS_STIPPLEDALPHA]) + if (stateblock->state.render_states[WINED3DRS_STIPPLEDALPHA]) FIXME(" Stippled Alpha not supported yet.\n"); } static void state_antialias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - TRACE("Stub\n"); - if (stateblock->renderState[WINED3DRS_ANTIALIAS]) - FIXME(" Antialias not supported yet.\n"); + if (stateblock->state.render_states[WINED3DRS_ANTIALIAS]) + FIXME("Antialias not supported yet.\n"); } static void state_multisampmask(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - TRACE("Stub\n"); - if (stateblock->renderState[WINED3DRS_MULTISAMPLEMASK] != 0xFFFFFFFF) - FIXME("(WINED3DRS_MULTISAMPLEMASK,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_MULTISAMPLEMASK]); + if (stateblock->state.render_states[WINED3DRS_MULTISAMPLEMASK] != 0xffffffff) + FIXME("WINED3DRS_MULTISAMPLEMASK %#x not yet implemented.\n", + stateblock->state.render_states[WINED3DRS_MULTISAMPLEMASK]); } static void state_patchedgestyle(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - TRACE("Stub\n"); - if (stateblock->renderState[WINED3DRS_PATCHEDGESTYLE] != WINED3DPATCHEDGE_DISCRETE) - FIXME("(WINED3DRS_PATCHEDGESTYLE,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_PATCHEDGESTYLE]); + if (stateblock->state.render_states[WINED3DRS_PATCHEDGESTYLE] != WINED3DPATCHEDGE_DISCRETE) + FIXME("WINED3DRS_PATCHEDGESTYLE %#x not yet implemented.\n", + stateblock->state.render_states[WINED3DRS_PATCHEDGESTYLE]); } static void state_patchsegments(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) @@ -1782,12 +1854,11 @@ static void state_patchsegments(DWORD state, IWineD3DStateBlockImpl *stateblock, } tmpvalue; tmpvalue.f = 1.0f; - TRACE("Stub\n"); - if (stateblock->renderState[WINED3DRS_PATCHSEGMENTS] != tmpvalue.d) + if (stateblock->state.render_states[WINED3DRS_PATCHSEGMENTS] != tmpvalue.d) { static BOOL displayed = FALSE; - tmpvalue.d = stateblock->renderState[WINED3DRS_PATCHSEGMENTS]; + tmpvalue.d = stateblock->state.render_states[WINED3DRS_PATCHSEGMENTS]; if(!displayed) FIXME("(WINED3DRS_PATCHSEGMENTS,%f) not yet implemented\n", tmpvalue.f); @@ -1797,129 +1868,149 @@ static void state_patchsegments(DWORD state, IWineD3DStateBlockImpl *stateblock, static void state_positiondegree(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - TRACE("Stub\n"); - if (stateblock->renderState[WINED3DRS_POSITIONDEGREE] != WINED3DDEGREE_CUBIC) - FIXME("(WINED3DRS_POSITIONDEGREE,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_POSITIONDEGREE]); + if (stateblock->state.render_states[WINED3DRS_POSITIONDEGREE] != WINED3DDEGREE_CUBIC) + FIXME("WINED3DRS_POSITIONDEGREE %#x not yet implemented.\n", + stateblock->state.render_states[WINED3DRS_POSITIONDEGREE]); } static void state_normaldegree(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - TRACE("Stub\n"); - if (stateblock->renderState[WINED3DRS_NORMALDEGREE] != WINED3DDEGREE_LINEAR) - FIXME("(WINED3DRS_NORMALDEGREE,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_NORMALDEGREE]); + if (stateblock->state.render_states[WINED3DRS_NORMALDEGREE] != WINED3DDEGREE_LINEAR) + FIXME("WINED3DRS_NORMALDEGREE %#x not yet implemented.\n", + stateblock->state.render_states[WINED3DRS_NORMALDEGREE]); } static void state_tessellation(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - TRACE("Stub\n"); - if(stateblock->renderState[WINED3DRS_ENABLEADAPTIVETESSELLATION]) - FIXME("(WINED3DRS_ENABLEADAPTIVETESSELLATION,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_ENABLEADAPTIVETESSELLATION]); + if (stateblock->state.render_states[WINED3DRS_ENABLEADAPTIVETESSELLATION]) + FIXME("WINED3DRS_ENABLEADAPTIVETESSELLATION %#x not yet implemented.\n", + stateblock->state.render_states[WINED3DRS_ENABLEADAPTIVETESSELLATION]); +} + +static void state_nvdb(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +{ + union { + DWORD d; + float f; + } zmin, zmax; + + const struct wined3d_gl_info *gl_info = context->gl_info; + + if (stateblock->state.render_states[WINED3DRS_ADAPTIVETESS_X] == WINED3DFMT_NVDB) + { + zmin.d = stateblock->state.render_states[WINED3DRS_ADAPTIVETESS_Z]; + zmax.d = stateblock->state.render_states[WINED3DRS_ADAPTIVETESS_W]; + + /* If zmin is larger than zmax INVALID_VALUE error is generated. + * In d3d9 test is not performed in this case*/ + if (zmin.f <= zmax.f) + { + glEnable(GL_DEPTH_BOUNDS_TEST_EXT); + checkGLcall("glEnable(GL_DEPTH_BOUNDS_TEST_EXT)"); + GL_EXTCALL(glDepthBoundsEXT(zmin.f, zmax.f)); + checkGLcall("glDepthBoundsEXT(...)"); + } + else { + glDisable(GL_DEPTH_BOUNDS_TEST_EXT); + checkGLcall("glDisable(GL_DEPTH_BOUNDS_TEST_EXT)"); + } + } + else { + glDisable(GL_DEPTH_BOUNDS_TEST_EXT); + checkGLcall("glDisable(GL_DEPTH_BOUNDS_TEST_EXT)"); + } + + state_tessellation(state, stateblock, context); } static void state_wrapu(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_WRAPU]) { - FIXME("Render state WINED3DRS_WRAPU not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_WRAPU]) + FIXME("Render state WINED3DRS_WRAPU not implemented yet.\n"); } static void state_wrapv(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_WRAPV]) { - FIXME("Render state WINED3DRS_WRAPV not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_WRAPV]) + FIXME("Render state WINED3DRS_WRAPV not implemented yet.\n"); } static void state_monoenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_MONOENABLE]) { - FIXME("Render state WINED3DRS_MONOENABLE not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_MONOENABLE]) + FIXME("Render state WINED3DRS_MONOENABLE not implemented yet.\n"); } static void state_rop2(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_ROP2]) { - FIXME("Render state WINED3DRS_ROP2 not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_ROP2]) + FIXME("Render state WINED3DRS_ROP2 not implemented yet.\n"); } static void state_planemask(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_PLANEMASK]) { - FIXME("Render state WINED3DRS_PLANEMASK not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_PLANEMASK]) + FIXME("Render state WINED3DRS_PLANEMASK not implemented yet.\n"); } static void state_subpixel(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_SUBPIXEL]) { - FIXME("Render state WINED3DRS_SUBPIXEL not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_SUBPIXEL]) + FIXME("Render state WINED3DRS_SUBPIXEL not implemented yet.\n"); } static void state_subpixelx(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_SUBPIXELX]) { - FIXME("Render state WINED3DRS_SUBPIXELX not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_SUBPIXELX]) + FIXME("Render state WINED3DRS_SUBPIXELX not implemented yet.\n"); } static void state_stippleenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_STIPPLEENABLE]) { - FIXME("Render state WINED3DRS_STIPPLEENABLE not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_STIPPLEENABLE]) + FIXME("Render state WINED3DRS_STIPPLEENABLE not implemented yet.\n"); } static void state_mipmaplodbias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_MIPMAPLODBIAS]) { - FIXME("Render state WINED3DRS_MIPMAPLODBIAS not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_MIPMAPLODBIAS]) + FIXME("Render state WINED3DRS_MIPMAPLODBIAS not implemented yet.\n"); } static void state_anisotropy(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_ANISOTROPY]) { - FIXME("Render state WINED3DRS_ANISOTROPY not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_ANISOTROPY]) + FIXME("Render state WINED3DRS_ANISOTROPY not implemented yet.\n"); } static void state_flushbatch(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_FLUSHBATCH]) { - FIXME("Render state WINED3DRS_FLUSHBATCH not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_FLUSHBATCH]) + FIXME("Render state WINED3DRS_FLUSHBATCH not implemented yet.\n"); } static void state_translucentsi(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_TRANSLUCENTSORTINDEPENDENT]) { - FIXME("Render state WINED3DRS_TRANSLUCENTSORTINDEPENDENT not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_TRANSLUCENTSORTINDEPENDENT]) + FIXME("Render state WINED3DRS_TRANSLUCENTSORTINDEPENDENT not implemented yet.\n"); } static void state_extents(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_EXTENTS]) { - FIXME("Render state WINED3DRS_EXTENTS not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_EXTENTS]) + FIXME("Render state WINED3DRS_EXTENTS not implemented yet.\n"); } static void state_ckeyblend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if(stateblock->renderState[WINED3DRS_COLORKEYBLENDENABLE]) { - FIXME("Render state WINED3DRS_COLORKEYBLENDENABLE not implemented yet\n"); - } + if (stateblock->state.render_states[WINED3DRS_COLORKEYBLENDENABLE]) + FIXME("Render state WINED3DRS_COLORKEYBLENDENABLE not implemented yet.\n"); } static void state_swvp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - if (stateblock->renderState[WINED3DRS_SOFTWAREVERTEXPROCESSING]) - { + if (stateblock->state.render_states[WINED3DRS_SOFTWAREVERTEXPROCESSING]) FIXME("Software vertex processing not implemented.\n"); - } } /* Set texture operations up - The following avoids lots of ifdefs in this routine!*/ @@ -1970,10 +2061,9 @@ static void get_src_and_opr(DWORD arg, BOOL is_alpha, GLenum* source, GLenum* op } /* Setup the texture operations texture stage states */ -static void set_tex_op(const struct wined3d_context *context, IWineD3DDevice *iface, +static void set_tex_op(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state, BOOL isAlpha, int Stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3) { - const struct wined3d_gl_info *gl_info = context->gl_info; GLenum src1, src2, src3; GLenum opr1, opr2, opr3; GLenum comb_target; @@ -1982,7 +2072,6 @@ static void set_tex_op(const struct wined3d_context *context, IWineD3DDevice *if GLenum scal_target; GLenum opr=0, invopr, src3_target, opr3_target; BOOL Handled = FALSE; - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; TRACE("Alpha?(%d), Stage:%d Op(%s), a1(%d), a2(%d), a3(%d)\n", isAlpha, Stage, debug_d3dtop(op), arg1, arg2, arg3); @@ -2022,12 +2111,14 @@ static void set_tex_op(const struct wined3d_context *context, IWineD3DDevice *if /* If a texture stage references an invalid texture unit the stage just * passes through the result from the previous stage */ - if (is_invalid_op(This, Stage, op, arg1, arg2, arg3)) { + if (is_invalid_op(state, Stage, op, arg1, arg2, arg3)) + { arg1 = WINED3DTA_CURRENT; op = WINED3DTOP_SELECTARG1; } - if (isAlpha && This->stateBlock->textures[Stage] == NULL && arg1 == WINED3DTA_TEXTURE) { + if (isAlpha && !state->textures[Stage] && arg1 == WINED3DTA_TEXTURE) + { get_src_and_opr(WINED3DTA_DIFFUSE, isAlpha, &src1, &opr1); } else { get_src_and_opr(arg1, isAlpha, &src1, &opr1); @@ -2968,11 +3059,10 @@ static void set_tex_op(const struct wined3d_context *context, IWineD3DDevice *if { DWORD op2; - if (isAlpha) { - op2 = This->stateBlock->textureState[Stage][WINED3DTSS_COLOROP]; - } else { - op2 = This->stateBlock->textureState[Stage][WINED3DTSS_ALPHAOP]; - } + if (isAlpha) + op2 = state->texture_states[Stage][WINED3DTSS_COLOROP]; + else + op2 = state->texture_states[Stage][WINED3DTSS_ALPHAOP]; /* Note: If COMBINE4 in effect can't go back to combine! */ switch (op2) { @@ -3010,17 +3100,18 @@ static void set_tex_op(const struct wined3d_context *context, IWineD3DDevice *if } -static void tex_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void tex_colorop(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); + DWORD stage = (state_id - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); BOOL tex_used = stateblock->device->fixed_function_usage_map & (1 << stage); DWORD mapped_stage = stateblock->device->texUnitMap[stage]; const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; TRACE("Setting color op for stage %d\n", stage); /* Using a pixel shader? Don't care for anything here, the shader applying does it */ - if (use_ps(stateblock)) return; + if (use_ps(state)) return; if (stage != mapped_stage) WARN("Using non 1:1 mapping: %d -> %d!\n", stage, mapped_stage); @@ -3035,7 +3126,8 @@ static void tex_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct checkGLcall("glActiveTextureARB"); } - if(stage >= stateblock->lowest_disabled_stage) { + if (stage >= state->lowest_disabled_stage) + { TRACE("Stage disabled\n"); if (mapped_stage != WINED3D_UNMAPPED_STAGE) { @@ -3059,18 +3151,16 @@ static void tex_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct return; } - /* The sampler will also activate the correct texture dimensions, so no need to do it here - * if the sampler for this stage is dirty - */ - if(!isStateDirty(context, STATE_SAMPLER(stage))) { - if (tex_used) texture_activate_dimensions(stage, stateblock, context); - } + /* The sampler will also activate the correct texture dimensions, so no + * need to do it here if the sampler for this stage is dirty. */ + if (!isStateDirty(context, STATE_SAMPLER(stage)) && tex_used) + texture_activate_dimensions(state->textures[stage], gl_info); - set_tex_op(context, (IWineD3DDevice *)stateblock->device, FALSE, stage, - stateblock->textureState[stage][WINED3DTSS_COLOROP], - stateblock->textureState[stage][WINED3DTSS_COLORARG1], - stateblock->textureState[stage][WINED3DTSS_COLORARG2], - stateblock->textureState[stage][WINED3DTSS_COLORARG0]); + set_tex_op(gl_info, state, FALSE, stage, + state->texture_states[stage][WINED3DTSS_COLOROP], + state->texture_states[stage][WINED3DTSS_COLORARG1], + state->texture_states[stage][WINED3DTSS_COLORARG2], + state->texture_states[stage][WINED3DTSS_COLORARG0]); } void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) @@ -3094,21 +3184,21 @@ void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d checkGLcall("glActiveTextureARB"); } - op = stateblock->textureState[stage][WINED3DTSS_ALPHAOP]; - arg1 = stateblock->textureState[stage][WINED3DTSS_ALPHAARG1]; - arg2 = stateblock->textureState[stage][WINED3DTSS_ALPHAARG2]; - arg0 = stateblock->textureState[stage][WINED3DTSS_ALPHAARG0]; + op = stateblock->state.texture_states[stage][WINED3DTSS_ALPHAOP]; + arg1 = stateblock->state.texture_states[stage][WINED3DTSS_ALPHAARG1]; + arg2 = stateblock->state.texture_states[stage][WINED3DTSS_ALPHAARG2]; + arg0 = stateblock->state.texture_states[stage][WINED3DTSS_ALPHAARG0]; - if (stateblock->renderState[WINED3DRS_COLORKEYENABLE] && stage == 0 && stateblock->textures[0]) + if (stateblock->state.render_states[WINED3DRS_COLORKEYENABLE] && !stage && stateblock->state.textures[0]) { - UINT texture_dimensions = IWineD3DBaseTexture_GetTextureDimensions(stateblock->textures[0]); + IWineD3DBaseTextureImpl *texture = stateblock->state.textures[0]; + GLenum texture_dimensions = texture->baseTexture.target; if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB) { - IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)stateblock->textures[0]; IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[0]; - if (surf->CKeyFlags & WINEDDSD_CKSRCBLT && !surf->resource.format_desc->alpha_mask) + if (surf->CKeyFlags & WINEDDSD_CKSRCBLT && !surf->resource.format->alpha_mask) { /* Color keying needs to pass alpha values from the texture through to have the alpha test work * properly. On the other hand applications can still use texture combiners apparently. This code @@ -3139,7 +3229,7 @@ void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d } else if(op == WINED3DTOP_SELECTARG1 && arg1 != WINED3DTA_TEXTURE) { - if (stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) + if (stateblock->state.render_states[WINED3DRS_ALPHABLENDENABLE]) { arg2 = WINED3DTA_TEXTURE; op = WINED3DTOP_MODULATE; @@ -3148,7 +3238,7 @@ void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d } else if(op == WINED3DTOP_SELECTARG2 && arg2 != WINED3DTA_TEXTURE) { - if (stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) + if (stateblock->state.render_states[WINED3DRS_ALPHABLENDENABLE]) { arg1 = WINED3DTA_TEXTURE; op = WINED3DTOP_MODULATE; @@ -3165,25 +3255,26 @@ void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d TRACE("Setting alpha op for stage %d\n", stage); if (gl_info->supported[NV_REGISTER_COMBINERS]) { - set_tex_op_nvrc((IWineD3DDevice *)stateblock->device, TRUE, stage, op, arg1, arg2, arg0, - mapped_stage, stateblock->textureState[stage][WINED3DTSS_RESULTARG]); + set_tex_op_nvrc(gl_info, &stateblock->state, TRUE, stage, op, arg1, arg2, arg0, + mapped_stage, stateblock->state.texture_states[stage][WINED3DTSS_RESULTARG]); } else { - set_tex_op(context, (IWineD3DDevice *)stateblock->device, TRUE, stage, op, arg1, arg2, arg0); + set_tex_op(gl_info, &stateblock->state, TRUE, stage, op, arg1, arg2, arg0); } } -static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void transform_texture(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - DWORD texUnit = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); + DWORD texUnit = (state_id - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); DWORD mapped_stage = stateblock->device->texUnitMap[texUnit]; const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; BOOL generated; int coordIdx; /* Ignore this when a vertex shader is used, or if the streams aren't sorted out yet */ - if (use_vs(stateblock) || isStateDirty(context, STATE_VDECL)) + if (use_vs(state) || isStateDirty(context, STATE_VDECL)) { TRACE("Using a vertex shader, or stream sources not sorted out yet, skipping\n"); return; @@ -3194,27 +3285,29 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, s GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage)); checkGLcall("glActiveTextureARB"); - generated = (stateblock->textureState[texUnit][WINED3DTSS_TEXCOORDINDEX] & 0xFFFF0000) != WINED3DTSS_TCI_PASSTHRU; - coordIdx = min(stateblock->textureState[texUnit][WINED3DTSS_TEXCOORDINDEX & 0x0000FFFF], MAX_TEXTURES - 1); + generated = (state->texture_states[texUnit][WINED3DTSS_TEXCOORDINDEX] & 0xffff0000) != WINED3DTSS_TCI_PASSTHRU; + coordIdx = min(state->texture_states[texUnit][WINED3DTSS_TEXCOORDINDEX & 0x0000ffff], MAX_TEXTURES - 1); - set_texture_matrix(&stateblock->transforms[WINED3DTS_TEXTURE0 + texUnit].u.m[0][0], - stateblock->textureState[texUnit][WINED3DTSS_TEXTURETRANSFORMFLAGS], generated, context->last_was_rhw, + set_texture_matrix(&state->transforms[WINED3DTS_TEXTURE0 + texUnit].u.m[0][0], + state->texture_states[texUnit][WINED3DTSS_TEXTURETRANSFORMFLAGS], + generated, context->last_was_rhw, stateblock->device->strided_streams.use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx)) - ? stateblock->device->strided_streams.elements[WINED3D_FFP_TEXCOORD0 + coordIdx].format_desc->format + ? stateblock->device->strided_streams.elements[WINED3D_FFP_TEXCOORD0 + coordIdx].format->id : WINED3DFMT_UNKNOWN, stateblock->device->frag_pipe->ffp_proj_control); /* The sampler applying function calls us if this changes */ - if ((context->lastWasPow2Texture & (1 << texUnit)) && stateblock->textures[texUnit]) + if ((context->lastWasPow2Texture & (1 << texUnit)) && state->textures[texUnit]) { if(generated) { FIXME("Non-power2 texture being used with generated texture coords\n"); } /* NP2 texcoord fixup is implemented for pixelshaders so only enable the fixed-function-pipeline fixup via pow2Matrix when no PS is used. */ - if (!use_ps(stateblock)) { + if (!use_ps(state)) + { TRACE("Non power two matrix multiply fixup\n"); - glMultMatrixf(((IWineD3DTextureImpl *) stateblock->textures[texUnit])->baseTexture.pow2Matrix); + glMultMatrixf(state->textures[texUnit]->baseTexture.pow2Matrix); } } } @@ -3233,13 +3326,12 @@ static void unloadTexCoords(const struct wined3d_gl_info *gl_info) static void loadTexCoords(const struct wined3d_gl_info *gl_info, IWineD3DStateBlockImpl *stateblock, const struct wined3d_stream_info *si, GLuint *curVBO) { - const UINT *offset = stateblock->streamOffset; unsigned int mapped_stage = 0; unsigned int textureNo = 0; for (textureNo = 0; textureNo < gl_info->limits.texture_stages; ++textureNo) { - int coordIdx = stateblock->textureState[textureNo][WINED3DTSS_TEXCOORDINDEX]; + int coordIdx = stateblock->state.texture_states[textureNo][WINED3DTSS_TEXCOORDINDEX]; mapped_stage = stateblock->device->texUnitMap[textureNo]; if (mapped_stage == WINED3D_UNMAPPED_STAGE) continue; @@ -3247,6 +3339,7 @@ static void loadTexCoords(const struct wined3d_gl_info *gl_info, IWineD3DStateBl if (coordIdx < MAX_TEXTURES && (si->use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx)))) { const struct wined3d_stream_info_element *e = &si->elements[WINED3D_FFP_TEXCOORD0 + coordIdx]; + const struct wined3d_stream_state *stream = &stateblock->state.streams[e->stream_idx]; TRACE("Setting up texture %u, idx %d, cordindx %u, data %p\n", textureNo, mapped_stage, coordIdx, e->data); @@ -3262,8 +3355,8 @@ static void loadTexCoords(const struct wined3d_gl_info *gl_info, IWineD3DStateBl checkGLcall("glClientActiveTextureARB"); /* The coords to supply depend completely on the fvf / vertex shader */ - glTexCoordPointer(e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]); + glTexCoordPointer(e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } else { GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + mapped_stage, 0, 0, 0, 1)); @@ -3314,7 +3407,7 @@ static void tex_coordindex(DWORD state, IWineD3DStateBlockImpl *stateblock, stru * state. We do not (yet) support the WINED3DRENDERSTATE_WRAPx values, nor tie them up * to the TEXCOORDINDEX value */ - switch (stateblock->textureState[stage][WINED3DTSS_TEXCOORDINDEX] & 0xffff0000) + switch (stateblock->state.texture_states[stage][WINED3DTSS_TEXCOORDINDEX] & 0xffff0000) { case WINED3DTSS_TCI_PASSTHRU: /* Use the specified texture coordinates contained within the @@ -3428,8 +3521,8 @@ static void tex_coordindex(DWORD state, IWineD3DStateBlockImpl *stateblock, stru break; default: - FIXME("Unhandled WINED3DTSS_TEXCOORDINDEX %#x\n", - stateblock->textureState[stage][WINED3DTSS_TEXCOORDINDEX]); + FIXME("Unhandled WINED3DTSS_TEXCOORDINDEX %#x.\n", + stateblock->state.texture_states[stage][WINED3DTSS_TEXCOORDINDEX]); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_R); @@ -3457,8 +3550,9 @@ static void tex_coordindex(DWORD state, IWineD3DStateBlockImpl *stateblock, stru } } -static void shaderconstant(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void shaderconstant(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { + const struct wined3d_state *state = &stateblock->state; IWineD3DDeviceImpl *device = stateblock->device; /* Vertex and pixel shader states will call a shader upload, don't do anything as long one of them @@ -3469,15 +3563,15 @@ static void shaderconstant(DWORD state, IWineD3DStateBlockImpl *stateblock, stru return; } - device->shader_backend->shader_load_constants(context, use_ps(stateblock), use_vs(stateblock)); + device->shader_backend->shader_load_constants(context, use_ps(state), use_vs(state)); } static void tex_bumpenvlscale(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); + IWineD3DPixelShaderImpl *ps = stateblock->state.pixel_shader; - if (stateblock->pixelShader && stage != 0 - && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.luminanceparams & (1 << stage))) + if (ps && stage && (ps->baseShader.reg_maps.luminanceparams & (1 << stage))) { /* The pixel shader has to know the luminance scale. Do a constants update if it * isn't scheduled anyway @@ -3492,7 +3586,7 @@ static void tex_bumpenvlscale(DWORD state, IWineD3DStateBlockImpl *stateblock, s static void sampler_texmatrix(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { const DWORD sampler = state - STATE_SAMPLER(0); - IWineD3DBaseTexture *texture = stateblock->textures[sampler]; + IWineD3DBaseTextureImpl *texture = stateblock->state.textures[sampler]; TRACE("state %#x, stateblock %p, context %p\n", state, stateblock, context); @@ -3505,7 +3599,7 @@ static void sampler_texmatrix(DWORD state, IWineD3DStateBlockImpl *stateblock, s * misc pipeline */ if(sampler < MAX_TEXTURES) { - const BOOL texIsPow2 = !((IWineD3DBaseTextureImpl *)texture)->baseTexture.pow2Matrix_identity; + const BOOL texIsPow2 = !texture->baseTexture.pow2Matrix_identity; if (texIsPow2 || (context->lastWasPow2Texture & (1 << sampler))) { @@ -3517,11 +3611,12 @@ static void sampler_texmatrix(DWORD state, IWineD3DStateBlockImpl *stateblock, s } } -static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void sampler(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - DWORD sampler = state - STATE_SAMPLER(0); + DWORD sampler = state_id - STATE_SAMPLER(0); DWORD mapped_stage = stateblock->device->texUnitMap[sampler]; const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; union { float f; DWORD d; @@ -3545,25 +3640,29 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wine GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage)); checkGLcall("glActiveTextureARB"); - if(stateblock->textures[sampler]) { - BOOL srgb = stateblock->samplerState[sampler][WINED3DSAMP_SRGBTEXTURE]; - IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *) stateblock->textures[sampler]; - IWineD3DBaseTexture_BindTexture(stateblock->textures[sampler], srgb); - basetexture_apply_state_changes(stateblock->textures[sampler], - stateblock->textureState[sampler], stateblock->samplerState[sampler], gl_info); + if (state->textures[sampler]) + { + IWineD3DBaseTexture *texture = (IWineD3DBaseTexture *)state->textures[sampler]; + BOOL srgb = state->sampler_states[sampler][WINED3DSAMP_SRGBTEXTURE]; + + IWineD3DBaseTexture_BindTexture(texture, srgb); + basetexture_apply_state_changes(texture, + state->texture_states[sampler], + state->sampler_states[sampler], gl_info); if (gl_info->supported[EXT_TEXTURE_LOD_BIAS]) { - tmpvalue.d = stateblock->samplerState[sampler][WINED3DSAMP_MIPMAPLODBIAS]; + tmpvalue.d = state->sampler_states[sampler][WINED3DSAMP_MIPMAPLODBIAS]; glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, tmpvalue.f); checkGLcall("glTexEnvi(GL_TEXTURE_LOD_BIAS_EXT, ...)"); } - if (!use_ps(stateblock) && sampler < stateblock->lowest_disabled_stage) + if (!use_ps(state) && sampler < state->lowest_disabled_stage) { - if(stateblock->renderState[WINED3DRS_COLORKEYENABLE] && sampler == 0) { + if (state->render_states[WINED3DRS_COLORKEYENABLE] && !sampler) + { /* If color keying is enabled update the alpha test, it depends on the existence * of a color key in stage 0 */ @@ -3572,18 +3671,20 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wine } /* Trigger shader constant reloading (for NP2 texcoord fixup) */ - if (!tex_impl->baseTexture.pow2Matrix_identity) + if (!state->textures[sampler]->baseTexture.pow2Matrix_identity) { IWineD3DDeviceImpl *d3ddevice = stateblock->device; d3ddevice->shader_backend->shader_load_np2fixup_constants( - (IWineD3DDevice*)d3ddevice, use_ps(stateblock), use_vs(stateblock)); + (IWineD3DDevice*)d3ddevice, use_ps(state), use_vs(state)); } } else if (mapped_stage < gl_info->limits.textures) { - if(sampler < stateblock->lowest_disabled_stage) { + if (sampler < state->lowest_disabled_stage) + { /* TODO: What should I do with pixel shaders here ??? */ - if(stateblock->renderState[WINED3DRS_COLORKEYENABLE] && sampler == 0) { + if (state->render_states[WINED3DRS_COLORKEYENABLE] && !sampler) + { /* If color keying is enabled update the alpha test, it depends on the existence * of a color key in stage 0 */ @@ -3595,12 +3696,13 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wine } } -void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +void apply_pixelshader(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { + const struct wined3d_state *state = &stateblock->state; IWineD3DDeviceImpl *device = stateblock->device; - BOOL use_pshader = use_ps(stateblock); - BOOL use_vshader = use_vs(stateblock); - int i; + BOOL use_vshader = use_vs(state); + BOOL use_pshader = use_ps(state); + unsigned int i; if (use_pshader) { if(!context->last_was_pshader) { @@ -3642,8 +3744,9 @@ void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct w static void shader_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); - if (stateblock->pixelShader && stage != 0 - && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.bumpmat & (1 << stage))) + IWineD3DPixelShaderImpl *ps = stateblock->state.pixel_shader; + + if (ps && stage && (ps->baseShader.reg_maps.bumpmat & (1 << stage))) { /* The pixel shader has to know the bump env matrix. Do a constants update if it isn't scheduled * anyway @@ -3674,22 +3777,23 @@ static void transform_world(DWORD state, IWineD3DStateBlockImpl *stateblock, str /* In the general case, the view matrix is the identity matrix */ if (stateblock->device->view_ident) { - glLoadMatrixf(&stateblock->transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]); + glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]); checkGLcall("glLoadMatrixf"); } else { - glLoadMatrixf(&stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]); + glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_VIEW].u.m[0][0]); checkGLcall("glLoadMatrixf"); - glMultMatrixf(&stateblock->transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]); + glMultMatrixf(&stateblock->state.transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]); checkGLcall("glMultMatrixf"); } } } -static void clipplane(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void clipplane(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - UINT index = state - STATE_CLIPPLANE(0); + const struct wined3d_state *state = &stateblock->state; + UINT index = state_id - STATE_CLIPPLANE(0); if (isStateDirty(context, STATE_TRANSFORM(WINED3DTS_VIEW)) || index >= context->gl_info->limits.clipplanes) { @@ -3697,11 +3801,14 @@ static void clipplane(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi } /* Clip Plane settings are affected by the model view in OpenGL, the View transform in direct3d */ - if(!use_vs(stateblock)) { + if (!use_vs(state)) + { glMatrixMode(GL_MODELVIEW); glPushMatrix(); - glLoadMatrixf(&stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]); - } else { + glLoadMatrixf(&state->transforms[WINED3DTS_VIEW].u.m[0][0]); + } + else + { /* with vertex shaders, clip planes are not transformed in direct3d, * in OpenGL they are still transformed by the model view. * Use this to swap the y coordinate if necessary @@ -3712,12 +3819,12 @@ static void clipplane(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi if (context->render_offscreen) glScalef(1.0f, -1.0f, 1.0f); } - TRACE("Clipplane [%f,%f,%f,%f]\n", - stateblock->clipplane[index][0], - stateblock->clipplane[index][1], - stateblock->clipplane[index][2], - stateblock->clipplane[index][3]); - glClipPlane(GL_CLIP_PLANE0 + index, stateblock->clipplane[index]); + TRACE("Clipplane [%.8e, %.8e, %.8e, %.8e]\n", + state->clip_planes[index][0], + state->clip_planes[index][1], + state->clip_planes[index][2], + state->clip_planes[index][3]); + glClipPlane(GL_CLIP_PLANE0 + index, state->clip_planes[index]); checkGLcall("glClipPlane"); glPopMatrix(); @@ -3755,21 +3862,21 @@ static void transform_worldex(DWORD state, IWineD3DStateBlockImpl *stateblock, s */ if (stateblock->device->view_ident) { - glLoadMatrixf(&stateblock->transforms[WINED3DTS_WORLDMATRIX(matrix)].u.m[0][0]); + glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_WORLDMATRIX(matrix)].u.m[0][0]); checkGLcall("glLoadMatrixf"); } else { - glLoadMatrixf(&stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]); + glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_VIEW].u.m[0][0]); checkGLcall("glLoadMatrixf"); - glMultMatrixf(&stateblock->transforms[WINED3DTS_WORLDMATRIX(matrix)].u.m[0][0]); + glMultMatrixf(&stateblock->state.transforms[WINED3DTS_WORLDMATRIX(matrix)].u.m[0][0]); checkGLcall("glMultMatrixf"); } } static void state_vertexblend_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - WINED3DVERTEXBLENDFLAGS f = stateblock->renderState[WINED3DRS_VERTEXBLEND]; + WINED3DVERTEXBLENDFLAGS f = stateblock->state.render_states[WINED3DRS_VERTEXBLEND]; static unsigned int once; if (f == WINED3DVBF_DISABLE) return; @@ -3780,7 +3887,7 @@ static void state_vertexblend_w(DWORD state, IWineD3DStateBlockImpl *stateblock, static void state_vertexblend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - WINED3DVERTEXBLENDFLAGS val = stateblock->renderState[WINED3DRS_VERTEXBLEND]; + WINED3DVERTEXBLENDFLAGS val = stateblock->state.render_states[WINED3DRS_VERTEXBLEND]; const struct wined3d_gl_info *gl_info = context->gl_info; static unsigned int once; @@ -3794,7 +3901,7 @@ static void state_vertexblend(DWORD state, IWineD3DStateBlockImpl *stateblock, s /* D3D adds one more matrix which has weight (1 - sum(weights)). This is enabled at context * creation with enabling GL_WEIGHT_SUM_UNITY_ARB. */ - GL_EXTCALL(glVertexBlendARB(stateblock->renderState[WINED3DRS_VERTEXBLEND] + 1)); + GL_EXTCALL(glVertexBlendARB(stateblock->state.render_states[WINED3DRS_VERTEXBLEND] + 1)); if (!stateblock->device->vertexBlendUsed) { @@ -3836,13 +3943,13 @@ static void transform_view(DWORD state, IWineD3DStateBlockImpl *stateblock, stru glMatrixMode(GL_MODELVIEW); checkGLcall("glMatrixMode(GL_MODELVIEW)"); - glLoadMatrixf(&stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]); + glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_VIEW].u.m[0][0]); checkGLcall("glLoadMatrixf(...)"); /* Reset lights. TODO: Call light apply func */ for (k = 0; k < stateblock->device->maxConcurrentLights; ++k) { - light = stateblock->activeLights[k]; + light = stateblock->state.lights[k]; if(!light) continue; glLightfv(GL_LIGHT0 + light->glIndex, GL_POSITION, light->lightPosn); checkGLcall("glLightfv posn"); @@ -3893,10 +4000,10 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock if (context->last_was_rhw) { - double x = stateblock->viewport.X; - double y = stateblock->viewport.Y; - double w = stateblock->viewport.Width; - double h = stateblock->viewport.Height; + double x = stateblock->state.viewport.X; + double y = stateblock->state.viewport.Y; + double w = stateblock->state.viewport.Width; + double h = stateblock->state.viewport.Height; TRACE("Calling glOrtho with x %.8e, y %.8e, w %.8e, h %.8e.\n", x, y, w, h); if (context->render_offscreen) @@ -3905,10 +4012,6 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock glOrtho(x, x + w, y + h, y, 0.0, -1.0); checkGLcall("glOrtho"); - /* Window Coord 0 is the middle of the first pixel, so translate by 1/2 pixels */ - glTranslatef(63.0f / 128.0f, 63.0f / 128.0f, 0.0f); - checkGLcall("glTranslatef(63.0f / 128.0f, 63.0f / 128.0f, 0.0f)"); - /* D3D texture coordinates are flipped compared to OpenGL ones, so * render everything upside down when rendering offscreen. */ if (context->render_offscreen) @@ -3916,7 +4019,13 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock glScalef(1.0f, -1.0f, 1.0f); checkGLcall("glScalef"); } - } else { + + /* Window Coord 0 is the middle of the first pixel, so translate by 1/2 pixels */ + glTranslatef(63.0f / 128.0f, 63.0f / 128.0f, 0.0f); + checkGLcall("glTranslatef(63.0f / 128.0f, 63.0f / 128.0f, 0.0f)"); + } + else + { /* The rule is that the window coordinate 0 does not correspond to the beginning of the first pixel, but the center of the first pixel. As a consequence if you want to correctly draw one line exactly from @@ -3958,8 +4067,8 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock * filling convention. We want the difference to be large enough that * it doesn't get lost due to rounding inside the driver, but small * enough to prevent it from interfering with any anti-aliasing. */ - GLfloat xoffset = (63.0f / 64.0f) / stateblock->viewport.Width; - GLfloat yoffset = -(63.0f / 64.0f) / stateblock->viewport.Height; + GLfloat xoffset = (63.0f / 64.0f) / stateblock->state.viewport.Width; + GLfloat yoffset = -(63.0f / 64.0f) / stateblock->state.viewport.Height; if (context->render_offscreen) { @@ -3975,7 +4084,7 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock } checkGLcall("glScalef"); - glMultMatrixf(&stateblock->transforms[WINED3DTS_PROJECTION].u.m[0][0]); + glMultMatrixf(&stateblock->state.transforms[WINED3DTS_PROJECTION].u.m[0][0]); checkGLcall("glLoadMatrixf"); } } @@ -4034,22 +4143,26 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock, const struct wined3d_gl_info *gl_info = context->gl_info; GLuint curVBO = gl_info->supported[ARB_VERTEX_BUFFER_OBJECT] ? ~0U : 0; int i; - const UINT *offset = stateblock->streamOffset; struct wined3d_buffer *vb; DWORD_PTR shift_index; /* Default to no instancing */ stateblock->device->instancedDraw = FALSE; - for (i = 0; i < MAX_ATTRIBS; i++) { + for (i = 0; i < MAX_ATTRIBS; i++) + { + const struct wined3d_stream_state *stream; + if (!(stream_info->use_map & (1 << i))) { if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i); continue; } + stream = &stateblock->state.streams[stream_info->elements[i].stream_idx]; + /* Do not load instance data. It will be specified using glTexCoord by drawprim */ - if (stateblock->streamFlags[stream_info->elements[i].stream_idx] & WINED3DSTREAMSOURCE_INSTANCEDATA) + if (stream->flags & WINED3DSTREAMSOURCE_INSTANCEDATA) { if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i); stateblock->device->instancedDraw = TRUE; @@ -4066,11 +4179,11 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock, checkGLcall("glBindBufferARB"); curVBO = stream_info->elements[i].buffer_object; } - vb = (struct wined3d_buffer *)stateblock->streamSource[stream_info->elements[i].stream_idx]; - /* Use the VBO to find out if a vertex buffer exists, not the vb pointer. vb can point to a - * user pointer data blob. In that case curVBO will be 0. If there is a vertex buffer but no - * vbo we won't be load converted attributes anyway - */ + /* Use the VBO to find out if a vertex buffer exists, not the vb + * pointer. vb can point to a user pointer data blob. In that case + * curVBO will be 0. If there is a vertex buffer but no vbo we + * won't be load converted attributes anyway. */ + vb = stream->buffer; if (curVBO && vb->conversion_shift) { TRACE("Loading attribute from shifted buffer\n"); @@ -4078,23 +4191,23 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock, i, stream_info->elements[i].stride, vb->conversion_stride); TRACE("Original offset %p, additional offset 0x%08x\n", stream_info->elements[i].data, vb->conversion_shift[(DWORD_PTR)stream_info->elements[i].data]); - TRACE("Opengl type %#x\n", stream_info->elements[i].format_desc->gl_vtx_type); - shift_index = ((DWORD_PTR)stream_info->elements[i].data + offset[stream_info->elements[i].stream_idx]); + TRACE("Opengl type %#x\n", stream_info->elements[i].format->gl_vtx_type); + shift_index = ((DWORD_PTR)stream_info->elements[i].data + stream->offset); shift_index = shift_index % stream_info->elements[i].stride; - GL_EXTCALL(glVertexAttribPointerARB(i, stream_info->elements[i].format_desc->gl_vtx_format, - stream_info->elements[i].format_desc->gl_vtx_type, - stream_info->elements[i].format_desc->gl_normalized, + GL_EXTCALL(glVertexAttribPointerARB(i, stream_info->elements[i].format->gl_vtx_format, + stream_info->elements[i].format->gl_vtx_type, + stream_info->elements[i].format->gl_normalized, vb->conversion_stride, stream_info->elements[i].data + vb->conversion_shift[shift_index] - + stateblock->loadBaseVertexIndex * stream_info->elements[i].stride - + offset[stream_info->elements[i].stream_idx])); + + stateblock->state.load_base_vertex_index * stream_info->elements[i].stride + + stream->offset)); } else { - GL_EXTCALL(glVertexAttribPointerARB(i, stream_info->elements[i].format_desc->gl_vtx_format, - stream_info->elements[i].format_desc->gl_vtx_type, - stream_info->elements[i].format_desc->gl_normalized, + GL_EXTCALL(glVertexAttribPointerARB(i, stream_info->elements[i].format->gl_vtx_format, + stream_info->elements[i].format->gl_vtx_type, + stream_info->elements[i].format->gl_normalized, stream_info->elements[i].stride, stream_info->elements[i].data - + stateblock->loadBaseVertexIndex * stream_info->elements[i].stride - + offset[stream_info->elements[i].stream_idx])); + + stateblock->state.load_base_vertex_index * stream_info->elements[i].stride + + stream->offset)); } if (!(context->numbered_array_mask & (1 << i))) @@ -4102,20 +4215,23 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock, GL_EXTCALL(glEnableVertexAttribArrayARB(i)); context->numbered_array_mask |= (1 << i); } - } else { - /* Stride = 0 means always the same values. glVertexAttribPointerARB doesn't do that. Instead disable the pointer and - * set up the attribute statically. But we have to figure out the system memory address. - */ - const BYTE *ptr = stream_info->elements[i].data + offset[stream_info->elements[i].stream_idx]; + } + else + { + /* Stride = 0 means always the same values. + * glVertexAttribPointerARB doesn't do that. Instead disable the + * pointer and set up the attribute statically. But we have to + * figure out the system memory address. */ + const BYTE *ptr = stream_info->elements[i].data + stream->offset; if (stream_info->elements[i].buffer_object) { - vb = (struct wined3d_buffer *)stateblock->streamSource[stream_info->elements[i].stream_idx]; + vb = stream->buffer; ptr += (ULONG_PTR)buffer_get_sysmem(vb, gl_info); } if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i); - switch (stream_info->elements[i].format_desc->format) + switch (stream_info->elements[i].format->id) { case WINED3DFMT_R32_FLOAT: GL_EXTCALL(glVertexAttrib1fvARB(i, (const GLfloat *)ptr)); @@ -4208,9 +4324,9 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB const struct wined3d_stream_info *si) { const struct wined3d_gl_info *gl_info = context->gl_info; - const UINT *offset = stateblock->streamOffset; GLuint curVBO = gl_info->supported[ARB_VERTEX_BUFFER_OBJECT] ? ~0U : 0; const struct wined3d_stream_info_element *e; + const struct wined3d_stream_state *stream; TRACE("Using fast vertex array code\n"); @@ -4222,16 +4338,17 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB || si->use_map & (1 << WINED3D_FFP_BLENDINDICES)) { e = &si->elements[WINED3D_FFP_BLENDWEIGHT]; + stream = &stateblock->state.streams[e->stream_idx]; if (gl_info->supported[ARB_VERTEX_BLEND]) { - TRACE("Blend %d %p %d\n", e->format_desc->component_count, - e->data + stateblock->loadBaseVertexIndex * e->stride, e->stride + offset[e->stream_idx]); + TRACE("Blend %u %p %u\n", e->format->component_count, + e->data + stateblock->state.load_base_vertex_index * e->stride, e->stride + stream->offset); glEnableClientState(GL_WEIGHT_ARRAY_ARB); checkGLcall("glEnableClientState(GL_WEIGHT_ARRAY_ARB)"); - GL_EXTCALL(glVertexBlendARB(e->format_desc->component_count + 1)); + GL_EXTCALL(glVertexBlendARB(e->format->component_count + 1)); if (curVBO != e->buffer_object) { @@ -4241,12 +4358,12 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB } TRACE("glWeightPointerARB(%#x, %#x, %#x, %p);\n", - e->format_desc->gl_vtx_format, - e->format_desc->gl_vtx_type, + e->format->gl_vtx_format, + e->format->gl_vtx_type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]); - GL_EXTCALL(glWeightPointerARB(e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx])); + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + GL_EXTCALL(glWeightPointerARB(e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset)); checkGLcall("glWeightPointerARB"); @@ -4288,6 +4405,8 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB if (si->use_map & (1 << WINED3D_FFP_POSITION)) { e = &si->elements[WINED3D_FFP_POSITION]; + stream = &stateblock->state.streams[e->stream_idx]; + if (curVBO != e->buffer_object) { GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object)); @@ -4305,18 +4424,18 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB */ if (!e->buffer_object) { - TRACE("glVertexPointer(3, %#x, %#x, %p);\n", e->format_desc->gl_vtx_type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]); - glVertexPointer(3 /* min(e->format_desc->gl_vtx_format, 3) */, e->format_desc->gl_vtx_type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]); + TRACE("glVertexPointer(3, %#x, %#x, %p);\n", e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + glVertexPointer(3 /* min(e->format->gl_vtx_format, 3) */, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); } else { TRACE("glVertexPointer(%#x, %#x, %#x, %p);\n", - e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]); - glVertexPointer(e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]); + e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + glVertexPointer(e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); } checkGLcall("glVertexPointer(...)"); glEnableClientState(GL_VERTEX_ARRAY); @@ -4327,6 +4446,8 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB if (si->use_map & (1 << WINED3D_FFP_NORMAL)) { e = &si->elements[WINED3D_FFP_NORMAL]; + stream = &stateblock->state.streams[e->stream_idx]; + if (curVBO != e->buffer_object) { GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object)); @@ -4334,10 +4455,10 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB curVBO = e->buffer_object; } - TRACE("glNormalPointer(%#x, %#x, %p);\n", e->format_desc->gl_vtx_type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]); - glNormalPointer(e->format_desc->gl_vtx_type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]); + TRACE("glNormalPointer(%#x, %#x, %p);\n", e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + glNormalPointer(e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); checkGLcall("glNormalPointer(...)"); glEnableClientState(GL_NORMAL_ARRAY); checkGLcall("glEnableClientState(GL_NORMAL_ARRAY)"); @@ -4359,6 +4480,8 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB if (si->use_map & (1 << WINED3D_FFP_DIFFUSE)) { e = &si->elements[WINED3D_FFP_DIFFUSE]; + stream = &stateblock->state.streams[e->stream_idx]; + if (curVBO != e->buffer_object) { GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object)); @@ -4367,10 +4490,10 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB } TRACE("glColorPointer(%#x, %#x %#x, %p);\n", - e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]); - glColorPointer(e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]); + e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); + glColorPointer(e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride, + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); checkGLcall("glColorPointer(4, GL_UNSIGNED_BYTE, ...)"); glEnableClientState(GL_COLOR_ARRAY); checkGLcall("glEnableClientState(GL_COLOR_ARRAY)"); @@ -4386,10 +4509,12 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB TRACE("setting specular colour\n"); e = &si->elements[WINED3D_FFP_SPECULAR]; + stream = &stateblock->state.streams[e->stream_idx]; + if (gl_info->supported[EXT_SECONDARY_COLOR]) { - GLenum type = e->format_desc->gl_vtx_type; - GLint format = e->format_desc->gl_vtx_format; + GLenum type = e->format->gl_vtx_type; + GLint format = e->format->gl_vtx_format; if (curVBO != e->buffer_object) { @@ -4406,9 +4531,9 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB * 4 component secondary colors use it */ TRACE("glSecondaryColorPointer(%#x, %#x, %#x, %p);\n", format, type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]); + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); GL_EXTCALL(glSecondaryColorPointerEXT(format, type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx])); + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset)); checkGLcall("glSecondaryColorPointerEXT(format, type, ...)"); } else @@ -4417,9 +4542,9 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB { case GL_UNSIGNED_BYTE: TRACE("glSecondaryColorPointer(3, GL_UNSIGNED_BYTE, %#x, %p);\n", e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]); + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); GL_EXTCALL(glSecondaryColorPointerEXT(3, GL_UNSIGNED_BYTE, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx])); + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset)); checkGLcall("glSecondaryColorPointerEXT(3, GL_UNSIGNED_BYTE, ...)"); break; @@ -4427,9 +4552,9 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB FIXME("Add 4 component specular color pointers for type %x\n", type); /* Make sure that the right color component is dropped */ TRACE("glSecondaryColorPointer(3, %#x, %#x, %p);\n", type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]); + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset); GL_EXTCALL(glSecondaryColorPointerEXT(3, type, e->stride, - e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx])); + e->data + stateblock->state.load_base_vertex_index * e->stride + stream->offset)); checkGLcall("glSecondaryColorPointerEXT(3, type, ...)"); } } @@ -4461,8 +4586,8 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { IWineD3DDeviceImpl *device = stateblock->device; - BOOL load_numbered = use_vs(stateblock) && !device->useDrawStridedSlow; - BOOL load_named = !use_vs(stateblock) && !device->useDrawStridedSlow; + BOOL load_numbered = use_vs(&stateblock->state) && !device->useDrawStridedSlow; + BOOL load_named = !use_vs(&stateblock->state) && !device->useDrawStridedSlow; if (context->numberedArraysLoaded && !load_numbered) { @@ -4490,12 +4615,13 @@ static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi } } -static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +static void vertexdeclaration(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_state *state = &stateblock->state; + BOOL useVertexShaderFunction = use_vs(state); + BOOL usePixelShaderFunction = use_ps(state); BOOL updateFog = FALSE; - BOOL useVertexShaderFunction = use_vs(stateblock); - BOOL usePixelShaderFunction = use_ps(stateblock); IWineD3DDeviceImpl *device = stateblock->device; BOOL transformed; BOOL wasrhw = context->last_was_rhw; @@ -4529,7 +4655,7 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, s */ if (useVertexShaderFunction) { - GLfloat yoffset = -(63.0f / 64.0f) / stateblock->viewport.Height; + GLfloat yoffset = -(63.0f / 64.0f) / stateblock->state.viewport.Height; device->posFixup[1] = context->render_offscreen ? -1.0f : 1.0f; device->posFixup[3] = device->posFixup[1] * yoffset; } @@ -4594,7 +4720,8 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, s checkGLcall("glDisable(GL_CLIP_PLANE0 + i)"); } - if(!warned && stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]) { + if (!warned && stateblock->state.render_states[WINED3DRS_CLIPPLANEENABLE]) + { FIXME("Clipping not supported with vertex shaders\n"); warned = TRUE; } @@ -4654,7 +4781,7 @@ static void viewport_miscpart(DWORD state, IWineD3DStateBlockImpl *stateblock, s { IWineD3DSurfaceImpl *target = stateblock->device->render_targets[0]; UINT width, height; - WINED3DVIEWPORT vp = stateblock->viewport; + WINED3DVIEWPORT vp = stateblock->state.viewport; if(vp.Width > target->currentDesc.Width) vp.Width = target->currentDesc.Width; if(vp.Height > target->currentDesc.Height) vp.Height = target->currentDesc.Height; @@ -4679,9 +4806,9 @@ static void viewport_miscpart(DWORD state, IWineD3DStateBlockImpl *stateblock, s static void viewport_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - GLfloat yoffset = -(63.0f / 64.0f) / stateblock->viewport.Height; + GLfloat yoffset = -(63.0f / 64.0f) / stateblock->state.viewport.Height; - stateblock->device->posFixup[2] = (63.0f / 64.0f) / stateblock->viewport.Width; + stateblock->device->posFixup[2] = (63.0f / 64.0f) / stateblock->state.viewport.Width; stateblock->device->posFixup[3] = stateblock->device->posFixup[1] * yoffset; if(!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION))) { @@ -4697,7 +4824,7 @@ static void viewport_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock, static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { UINT Index = state - STATE_ACTIVELIGHT(0); - const struct wined3d_light_info *lightInfo = stateblock->activeLights[Index]; + const struct wined3d_light_info *lightInfo = stateblock->state.lights[Index]; if(!lightInfo) { glDisable(GL_LIGHT0 + Index); @@ -4709,7 +4836,7 @@ static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3 /* Light settings are affected by the model view in OpenGL, the View transform in direct3d*/ glMatrixMode(GL_MODELVIEW); glPushMatrix(); - glLoadMatrixf(&stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]); + glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_VIEW].u.m[0][0]); /* Diffuse: */ colRGBA[0] = lightInfo->OriginalParms.Diffuse.r; @@ -4811,7 +4938,7 @@ static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3 static void scissorrect(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { IWineD3DSurfaceImpl *target = stateblock->device->render_targets[0]; - RECT *pRect = &stateblock->scissorRect; + RECT *pRect = &stateblock->state.scissor_rect; UINT height; UINT width; @@ -4835,10 +4962,13 @@ static void indexbuffer(DWORD state, IWineD3DStateBlockImpl *stateblock, struct { const struct wined3d_gl_info *gl_info = context->gl_info; - if(stateblock->streamIsUP || stateblock->pIndexData == NULL ) { + if (stateblock->state.user_stream || !stateblock->state.index_buffer) + { GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0)); - } else { - struct wined3d_buffer *ib = (struct wined3d_buffer *) stateblock->pIndexData; + } + else + { + struct wined3d_buffer *ib = stateblock->state.index_buffer; GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, ib->buffer_object)); } } @@ -4999,6 +5129,7 @@ const struct StateEntryTemplate misc_state_template[] = { { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Y), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Z), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3DRS_ADAPTIVETESS_W), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_nvdb }, EXT_DEPTH_BOUNDS_TEST }, { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), { STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), state_msaa }, ARB_MULTISAMPLE }, { STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), { STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), state_msaa_w }, WINED3D_GL_EXT_NONE }, @@ -5416,28 +5547,28 @@ const struct StateEntryTemplate ffp_vertexstate_template[] = { * otherwise, register sampler_texmatrix, which takes care of updating the texture matrix */ { STATE_SAMPLER(0), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, - { STATE_SAMPLER(0), { 0, NULL }, WINE_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(0), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, { STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, { STATE_SAMPLER(1), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, - { STATE_SAMPLER(1), { 0, NULL }, WINE_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(1), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, { STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, { STATE_SAMPLER(2), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, - { STATE_SAMPLER(2), { 0, NULL }, WINE_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(2), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, { STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, { STATE_SAMPLER(3), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, - { STATE_SAMPLER(3), { 0, NULL }, WINE_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(3), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, { STATE_SAMPLER(3), { STATE_SAMPLER(3), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, { STATE_SAMPLER(4), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, - { STATE_SAMPLER(4), { 0, NULL }, WINE_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(4), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, { STATE_SAMPLER(4), { STATE_SAMPLER(4), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, { STATE_SAMPLER(5), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, - { STATE_SAMPLER(5), { 0, NULL }, WINE_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(5), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, { STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, { STATE_SAMPLER(6), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, - { STATE_SAMPLER(6), { 0, NULL }, WINE_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(6), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, { STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, { STATE_SAMPLER(7), { 0, NULL }, ARB_TEXTURE_NON_POWER_OF_TWO }, - { STATE_SAMPLER(7), { 0, NULL }, WINE_NORMALIZED_TEXRECT }, + { STATE_SAMPLER(7), { 0, NULL }, WINED3D_GL_NORMALIZED_TEXRECT }, { STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texmatrix }, WINED3D_GL_EXT_NONE }, {0 /* Terminate */, { 0, 0 }, WINED3D_GL_EXT_NONE }, }; diff --git a/dll/directx/wine/wined3d/stateblock.c b/dll/directx/wine/wined3d/stateblock.c index 1696646849e..de8ee8eff21 100644 --- a/dll/directx/wine/wined3d/stateblock.c +++ b/dll/directx/wine/wined3d/stateblock.c @@ -196,17 +196,17 @@ static HRESULT stateblock_allocate_shader_constants(IWineD3DStateBlockImpl *obje IWineD3DDeviceImpl *device = object->device; /* Allocate space for floating point constants */ - object->pixelShaderConstantF = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + object->state.ps_consts_f = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(float) * device->d3d_pshader_constantF * 4); - if (!object->pixelShaderConstantF) goto fail; + if (!object->state.ps_consts_f) goto fail; object->changed.pixelShaderConstantsF = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BOOL) * device->d3d_pshader_constantF); if (!object->changed.pixelShaderConstantsF) goto fail; - object->vertexShaderConstantF = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + object->state.vs_consts_f = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(float) * device->d3d_vshader_constantF * 4); - if (!object->vertexShaderConstantF) goto fail; + if (!object->state.vs_consts_f) goto fail; object->changed.vertexShaderConstantsF = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BOOL) * device->d3d_vshader_constantF); @@ -224,9 +224,9 @@ static HRESULT stateblock_allocate_shader_constants(IWineD3DStateBlockImpl *obje fail: ERR("Failed to allocate memory\n"); - HeapFree(GetProcessHeap(), 0, object->pixelShaderConstantF); + HeapFree(GetProcessHeap(), 0, object->state.ps_consts_f); HeapFree(GetProcessHeap(), 0, object->changed.pixelShaderConstantsF); - HeapFree(GetProcessHeap(), 0, object->vertexShaderConstantF); + HeapFree(GetProcessHeap(), 0, object->state.vs_consts_f); HeapFree(GetProcessHeap(), 0, object->changed.vertexShaderConstantsF); HeapFree(GetProcessHeap(), 0, object->contained_vs_consts_f); HeapFree(GetProcessHeap(), 0, object->contained_ps_consts_f); @@ -262,7 +262,7 @@ static void stateblock_savedstates_set_all(SAVEDSTATES *states, DWORD vs_consts, stateblock_set_bits(states->transform, HIGHEST_TRANSFORMSTATE + 1); stateblock_set_bits(states->renderState, WINEHIGHEST_RENDER_STATE + 1); for (i = 0; i < MAX_TEXTURES; ++i) states->textureState[i] = 0x3ffff; - for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i) states->samplerState[i] = 0x3fff; + for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i) states->samplerState[i] = 0x3ffe; states->clipplane = 0xffffffff; states->pixelShaderConstantsB = 0xffff; states->pixelShaderConstantsI = 0xffff; @@ -452,7 +452,7 @@ static void stateblock_init_lights(IWineD3DStateBlockImpl *stateblock, struct li struct wined3d_light_info *dst_light = HeapAlloc(GetProcessHeap(), 0, sizeof(*dst_light)); *dst_light = *src_light; - list_add_tail(&stateblock->lightMap[i], &dst_light->entry); + list_add_tail(&stateblock->state.light_map[i], &dst_light->entry); } } } @@ -492,28 +492,33 @@ static ULONG WINAPI IWineD3DStateBlockImpl_Release(IWineD3DStateBlock *iface) { if (!refCount) { int counter; - if (This->vertexDecl) IWineD3DVertexDeclaration_Release(This->vertexDecl); + if (This->state.vertex_declaration) + IWineD3DVertexDeclaration_Release((IWineD3DVertexDeclaration *)This->state.vertex_declaration); for (counter = 0; counter < MAX_COMBINED_SAMPLERS; counter++) { - if (This->textures[counter]) IWineD3DBaseTexture_Release(This->textures[counter]); + if (This->state.textures[counter]) + IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)This->state.textures[counter]); } - for (counter = 0; counter < MAX_STREAMS; counter++) { - if(This->streamSource[counter]) { - if (IWineD3DBuffer_Release(This->streamSource[counter])) + for (counter = 0; counter < MAX_STREAMS; ++counter) + { + struct wined3d_buffer *buffer = This->state.streams[counter].buffer; + if (buffer) + { + if (IWineD3DBuffer_Release((IWineD3DBuffer *)buffer)) { - TRACE("Vertex buffer still referenced by stateblock, applications has leaked Stream %u, buffer %p\n", counter, This->streamSource[counter]); + WARN("Buffer %p still referenced by stateblock, stream %u.\n", buffer, counter); } } } - if(This->pIndexData) IWineD3DBuffer_Release(This->pIndexData); - if(This->vertexShader) IWineD3DVertexShader_Release(This->vertexShader); - if(This->pixelShader) IWineD3DPixelShader_Release(This->pixelShader); + if (This->state.index_buffer) IWineD3DBuffer_Release((IWineD3DBuffer *)This->state.index_buffer); + if (This->state.vertex_shader) IWineD3DVertexShader_Release((IWineD3DVertexShader *)This->state.vertex_shader); + if (This->state.pixel_shader) IWineD3DPixelShader_Release((IWineD3DPixelShader *)This->state.pixel_shader); for(counter = 0; counter < LIGHTMAP_SIZE; counter++) { struct list *e1, *e2; - LIST_FOR_EACH_SAFE(e1, e2, &This->lightMap[counter]) + LIST_FOR_EACH_SAFE(e1, e2, &This->state.light_map[counter]) { struct wined3d_light_info *light = LIST_ENTRY(e1, struct wined3d_light_info, entry); list_remove(&light->entry); @@ -521,9 +526,9 @@ static ULONG WINAPI IWineD3DStateBlockImpl_Release(IWineD3DStateBlock *iface) { } } - HeapFree(GetProcessHeap(), 0, This->vertexShaderConstantF); + HeapFree(GetProcessHeap(), 0, This->state.vs_consts_f); HeapFree(GetProcessHeap(), 0, This->changed.vertexShaderConstantsF); - HeapFree(GetProcessHeap(), 0, This->pixelShaderConstantF); + HeapFree(GetProcessHeap(), 0, This->state.ps_consts_f); HeapFree(GetProcessHeap(), 0, This->changed.pixelShaderConstantsF); HeapFree(GetProcessHeap(), 0, This->contained_vs_consts_f); HeapFree(GetProcessHeap(), 0, This->contained_ps_consts_f); @@ -532,24 +537,24 @@ static ULONG WINAPI IWineD3DStateBlockImpl_Release(IWineD3DStateBlock *iface) { return refCount; } -/********************************************************** - * IWineD3DStateBlockImpl parts follows - **********************************************************/ -static void record_lights(IWineD3DStateBlockImpl *This, const IWineD3DStateBlockImpl *targetStateBlock) +static void wined3d_state_record_lights(struct wined3d_state *dst_state, const struct wined3d_state *src_state) { UINT i; - /* Lights... For a recorded state block, we just had a chain of actions to perform, - * so we need to walk that chain and update any actions which differ - */ - for(i = 0; i < LIGHTMAP_SIZE; i++) { + /* Lights... For a recorded state block, we just had a chain of actions + * to perform, so we need to walk that chain and update any actions which + * differ. */ + for (i = 0; i < LIGHTMAP_SIZE; ++i) + { struct list *e, *f; - LIST_FOR_EACH(e, &This->lightMap[i]) { + LIST_FOR_EACH(e, &dst_state->light_map[i]) + { BOOL updated = FALSE; struct wined3d_light_info *src = LIST_ENTRY(e, struct wined3d_light_info, entry), *realLight; /* Look up the light in the destination */ - LIST_FOR_EACH(f, &targetStateBlock->lightMap[i]) { + LIST_FOR_EACH(f, &src_state->light_map[i]) + { realLight = LIST_ENTRY(f, struct wined3d_light_info, entry); if (realLight->OriginalIndex == src->OriginalIndex) { @@ -558,12 +563,12 @@ static void record_lights(IWineD3DStateBlockImpl *This, const IWineD3DStateBlock if (realLight->glIndex == -1 && src->glIndex != -1) { /* Light disabled */ - This->activeLights[src->glIndex] = NULL; + dst_state->lights[src->glIndex] = NULL; } else if (realLight->glIndex != -1 && src->glIndex == -1) { /* Light enabled */ - This->activeLights[realLight->glIndex] = src; + dst_state->lights[realLight->glIndex] = src; } src->glIndex = realLight->glIndex; updated = TRUE; @@ -575,13 +580,13 @@ static void record_lights(IWineD3DStateBlockImpl *This, const IWineD3DStateBlock { /* This can happen if the light was originally created as a * default light for SetLightEnable() while recording. */ - WARN("Light %u in stateblock %p does not exist in device stateblock %p.\n", - src->OriginalIndex, This, targetStateBlock); + WARN("Light %u in dst_state %p does not exist in src_state %p.\n", + src->OriginalIndex, dst_state, src_state); src->OriginalParms = WINED3D_default_light; if (src->glIndex != -1) { - This->activeLights[src->glIndex] = NULL; + dst_state->lights[src->glIndex] = NULL; src->glIndex = -1; } } @@ -592,19 +597,24 @@ static void record_lights(IWineD3DStateBlockImpl *This, const IWineD3DStateBlock static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) { IWineD3DStateBlockImpl *This = (IWineD3DStateBlockImpl *)iface; - IWineD3DStateBlockImpl *targetStateBlock = This->device->stateBlock; + const struct wined3d_state *src_state = &This->device->stateBlock->state; unsigned int i; DWORD map; - TRACE("(%p) : Updating state block %p ------------------v\n", targetStateBlock, This); + TRACE("iface %p.\n", iface); - if (This->changed.vertexShader && This->vertexShader != targetStateBlock->vertexShader) + TRACE("Capturing state %p.\n", src_state); + + if (This->changed.vertexShader && This->state.vertex_shader != src_state->vertex_shader) { - TRACE("Updating vertex shader from %p to %p\n", This->vertexShader, targetStateBlock->vertexShader); + TRACE("Updating vertex shader from %p to %p\n", + This->state.vertex_shader, src_state->vertex_shader); - if (targetStateBlock->vertexShader) IWineD3DVertexShader_AddRef(targetStateBlock->vertexShader); - if (This->vertexShader) IWineD3DVertexShader_Release(This->vertexShader); - This->vertexShader = targetStateBlock->vertexShader; + if (src_state->vertex_shader) + IWineD3DVertexShader_AddRef((IWineD3DVertexShader *)src_state->vertex_shader); + if (This->state.vertex_shader) + IWineD3DVertexShader_Release((IWineD3DVertexShader *)This->state.vertex_shader); + This->state.vertex_shader = src_state->vertex_shader; } /* Vertex Shader Float Constants */ @@ -612,17 +622,16 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) { unsigned int idx = This->contained_vs_consts_f[i]; - TRACE("Setting %p from %p %u to {%.8e, %.8e, %.8e, %.8e}.\n", - This, targetStateBlock, idx, - targetStateBlock->vertexShaderConstantF[idx * 4 + 0], - targetStateBlock->vertexShaderConstantF[idx * 4 + 1], - targetStateBlock->vertexShaderConstantF[idx * 4 + 2], - targetStateBlock->vertexShaderConstantF[idx * 4 + 3]); + TRACE("Setting vs_consts_f[%u] to {%.8e, %.8e, %.8e, %.8e}.\n", idx, + src_state->vs_consts_f[idx * 4 + 0], + src_state->vs_consts_f[idx * 4 + 1], + src_state->vs_consts_f[idx * 4 + 2], + src_state->vs_consts_f[idx * 4 + 3]); - This->vertexShaderConstantF[idx * 4 + 0] = targetStateBlock->vertexShaderConstantF[idx * 4 + 0]; - This->vertexShaderConstantF[idx * 4 + 1] = targetStateBlock->vertexShaderConstantF[idx * 4 + 1]; - This->vertexShaderConstantF[idx * 4 + 2] = targetStateBlock->vertexShaderConstantF[idx * 4 + 2]; - This->vertexShaderConstantF[idx * 4 + 3] = targetStateBlock->vertexShaderConstantF[idx * 4 + 3]; + This->state.vs_consts_f[idx * 4 + 0] = src_state->vs_consts_f[idx * 4 + 0]; + This->state.vs_consts_f[idx * 4 + 1] = src_state->vs_consts_f[idx * 4 + 1]; + This->state.vs_consts_f[idx * 4 + 2] = src_state->vs_consts_f[idx * 4 + 2]; + This->state.vs_consts_f[idx * 4 + 3] = src_state->vs_consts_f[idx * 4 + 3]; } /* Vertex Shader Integer Constants */ @@ -630,17 +639,16 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) { unsigned int idx = This->contained_vs_consts_i[i]; - TRACE("Setting %p from %p %u to {%d, %d, %d, %d}.\n", - This, targetStateBlock, idx, - targetStateBlock->vertexShaderConstantI[idx * 4 + 0], - targetStateBlock->vertexShaderConstantI[idx * 4 + 1], - targetStateBlock->vertexShaderConstantI[idx * 4 + 2], - targetStateBlock->vertexShaderConstantI[idx * 4 + 3]); + TRACE("Setting vs_consts[%u] to {%d, %d, %d, %d}.\n", idx, + src_state->vs_consts_i[idx * 4 + 0], + src_state->vs_consts_i[idx * 4 + 1], + src_state->vs_consts_i[idx * 4 + 2], + src_state->vs_consts_i[idx * 4 + 3]); - This->vertexShaderConstantI[idx * 4 + 0] = targetStateBlock->vertexShaderConstantI[idx * 4 + 0]; - This->vertexShaderConstantI[idx * 4 + 1] = targetStateBlock->vertexShaderConstantI[idx * 4 + 1]; - This->vertexShaderConstantI[idx * 4 + 2] = targetStateBlock->vertexShaderConstantI[idx * 4 + 2]; - This->vertexShaderConstantI[idx * 4 + 3] = targetStateBlock->vertexShaderConstantI[idx * 4 + 3]; + This->state.vs_consts_i[idx * 4 + 0] = src_state->vs_consts_i[idx * 4 + 0]; + This->state.vs_consts_i[idx * 4 + 1] = src_state->vs_consts_i[idx * 4 + 1]; + This->state.vs_consts_i[idx * 4 + 2] = src_state->vs_consts_i[idx * 4 + 2]; + This->state.vs_consts_i[idx * 4 + 3] = src_state->vs_consts_i[idx * 4 + 3]; } /* Vertex Shader Boolean Constants */ @@ -648,11 +656,10 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) { unsigned int idx = This->contained_vs_consts_b[i]; - TRACE("Setting %p from %p %u to %s.\n", - This, targetStateBlock, idx, - targetStateBlock->vertexShaderConstantB[idx] ? "TRUE" : "FALSE"); + TRACE("Setting vs_consts_b[%u] to %s.\n", + idx, src_state->vs_consts_b[idx] ? "TRUE" : "FALSE"); - This->vertexShaderConstantB[idx] = targetStateBlock->vertexShaderConstantB[idx]; + This->state.vs_consts_b[idx] = src_state->vs_consts_b[idx]; } /* Pixel Shader Float Constants */ @@ -660,44 +667,42 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) { unsigned int idx = This->contained_ps_consts_f[i]; - TRACE("Setting %p from %p %u to {%.8e, %.8e, %.8e, %.8e}.\n", - This, targetStateBlock, idx, - targetStateBlock->pixelShaderConstantF[idx * 4 + 0], - targetStateBlock->pixelShaderConstantF[idx * 4 + 1], - targetStateBlock->pixelShaderConstantF[idx * 4 + 2], - targetStateBlock->pixelShaderConstantF[idx * 4 + 3]); + TRACE("Setting ps_consts_f[%u] to {%.8e, %.8e, %.8e, %.8e}.\n", idx, + src_state->ps_consts_f[idx * 4 + 0], + src_state->ps_consts_f[idx * 4 + 1], + src_state->ps_consts_f[idx * 4 + 2], + src_state->ps_consts_f[idx * 4 + 3]); - This->pixelShaderConstantF[idx * 4 + 0] = targetStateBlock->pixelShaderConstantF[idx * 4 + 0]; - This->pixelShaderConstantF[idx * 4 + 1] = targetStateBlock->pixelShaderConstantF[idx * 4 + 1]; - This->pixelShaderConstantF[idx * 4 + 2] = targetStateBlock->pixelShaderConstantF[idx * 4 + 2]; - This->pixelShaderConstantF[idx * 4 + 3] = targetStateBlock->pixelShaderConstantF[idx * 4 + 3]; + This->state.ps_consts_f[idx * 4 + 0] = src_state->ps_consts_f[idx * 4 + 0]; + This->state.ps_consts_f[idx * 4 + 1] = src_state->ps_consts_f[idx * 4 + 1]; + This->state.ps_consts_f[idx * 4 + 2] = src_state->ps_consts_f[idx * 4 + 2]; + This->state.ps_consts_f[idx * 4 + 3] = src_state->ps_consts_f[idx * 4 + 3]; } /* Pixel Shader Integer Constants */ for (i = 0; i < This->num_contained_ps_consts_i; ++i) { unsigned int idx = This->contained_ps_consts_i[i]; - TRACE("Setting %p from %p %u to {%d, %d, %d, %d}.\n", - This, targetStateBlock, idx, - targetStateBlock->pixelShaderConstantI[idx * 4 + 0], - targetStateBlock->pixelShaderConstantI[idx * 4 + 1], - targetStateBlock->pixelShaderConstantI[idx * 4 + 2], - targetStateBlock->pixelShaderConstantI[idx * 4 + 3]); + TRACE("Setting ps_consts_i[%u] to {%d, %d, %d, %d}.\n", idx, + src_state->ps_consts_i[idx * 4 + 0], + src_state->ps_consts_i[idx * 4 + 1], + src_state->ps_consts_i[idx * 4 + 2], + src_state->ps_consts_i[idx * 4 + 3]); - This->pixelShaderConstantI[idx * 4 + 0] = targetStateBlock->pixelShaderConstantI[idx * 4 + 0]; - This->pixelShaderConstantI[idx * 4 + 1] = targetStateBlock->pixelShaderConstantI[idx * 4 + 1]; - This->pixelShaderConstantI[idx * 4 + 2] = targetStateBlock->pixelShaderConstantI[idx * 4 + 2]; - This->pixelShaderConstantI[idx * 4 + 3] = targetStateBlock->pixelShaderConstantI[idx * 4 + 3]; + This->state.ps_consts_i[idx * 4 + 0] = src_state->ps_consts_i[idx * 4 + 0]; + This->state.ps_consts_i[idx * 4 + 1] = src_state->ps_consts_i[idx * 4 + 1]; + This->state.ps_consts_i[idx * 4 + 2] = src_state->ps_consts_i[idx * 4 + 2]; + This->state.ps_consts_i[idx * 4 + 3] = src_state->ps_consts_i[idx * 4 + 3]; } /* Pixel Shader Boolean Constants */ for (i = 0; i < This->num_contained_ps_consts_b; ++i) { unsigned int idx = This->contained_ps_consts_b[i]; - TRACE("Setting %p from %p %u to %s.\n", This, targetStateBlock, idx, - targetStateBlock->pixelShaderConstantB[idx] ? "TRUE" : "FALSE"); + TRACE("Setting ps_consts_b[%u] to %s.\n", + idx, src_state->ps_consts_b[idx] ? "TRUE" : "FALSE"); - This->pixelShaderConstantB[idx] = targetStateBlock->pixelShaderConstantB[idx]; + This->state.ps_consts_b[idx] = src_state->ps_consts_b[idx]; } /* Others + Render & Texture */ @@ -707,57 +712,61 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) TRACE("Updating transform %#x.\n", transform); - This->transforms[transform] = targetStateBlock->transforms[transform]; + This->state.transforms[transform] = src_state->transforms[transform]; } - if (This->changed.primitive_type) This->gl_primitive_type = targetStateBlock->gl_primitive_type; + if (This->changed.primitive_type) + This->state.gl_primitive_type = src_state->gl_primitive_type; if (This->changed.indices - && ((This->pIndexData != targetStateBlock->pIndexData) - || (This->baseVertexIndex != targetStateBlock->baseVertexIndex) - || (This->IndexFmt != targetStateBlock->IndexFmt))) + && ((This->state.index_buffer != src_state->index_buffer) + || (This->state.base_vertex_index != src_state->base_vertex_index) + || (This->state.index_format != src_state->index_format))) { - TRACE("Updating pIndexData to %p, baseVertexIndex to %d.\n", - targetStateBlock->pIndexData, targetStateBlock->baseVertexIndex); + TRACE("Updating index buffer to %p, base vertex index to %d.\n", + src_state->index_buffer, src_state->base_vertex_index); - if (targetStateBlock->pIndexData) IWineD3DBuffer_AddRef(targetStateBlock->pIndexData); - if (This->pIndexData) IWineD3DBuffer_Release(This->pIndexData); - This->pIndexData = targetStateBlock->pIndexData; - This->baseVertexIndex = targetStateBlock->baseVertexIndex; - This->IndexFmt = targetStateBlock->IndexFmt; + if (src_state->index_buffer) + IWineD3DBuffer_AddRef((IWineD3DBuffer *)src_state->index_buffer); + if (This->state.index_buffer) + IWineD3DBuffer_Release((IWineD3DBuffer *)This->state.index_buffer); + This->state.index_buffer = src_state->index_buffer; + This->state.base_vertex_index = src_state->base_vertex_index; + This->state.index_format = src_state->index_format; } - if (This->changed.vertexDecl && This->vertexDecl != targetStateBlock->vertexDecl) + if (This->changed.vertexDecl && This->state.vertex_declaration != src_state->vertex_declaration) { - TRACE("Updating vertex declaration from %p to %p.\n", This->vertexDecl, targetStateBlock->vertexDecl); + TRACE("Updating vertex declaration from %p to %p.\n", + This->state.vertex_declaration, src_state->vertex_declaration); - if (targetStateBlock->vertexDecl) IWineD3DVertexDeclaration_AddRef(targetStateBlock->vertexDecl); - if (This->vertexDecl) IWineD3DVertexDeclaration_Release(This->vertexDecl); - This->vertexDecl = targetStateBlock->vertexDecl; + if (src_state->vertex_declaration) + IWineD3DVertexDeclaration_AddRef((IWineD3DVertexDeclaration *)src_state->vertex_declaration); + if (This->state.vertex_declaration) + IWineD3DVertexDeclaration_Release((IWineD3DVertexDeclaration *)This->state.vertex_declaration); + This->state.vertex_declaration = src_state->vertex_declaration; } - if (This->changed.material - && memcmp(&targetStateBlock->material, &This->material, sizeof(This->material))) + if (This->changed.material && memcmp(&src_state->material, &This->state.material, sizeof(This->state.material))) { TRACE("Updating material.\n"); - This->material = targetStateBlock->material; + This->state.material = src_state->material; } - if (This->changed.viewport - && memcmp(&targetStateBlock->viewport, &This->viewport, sizeof(This->viewport))) + if (This->changed.viewport && memcmp(&src_state->viewport, &This->state.viewport, sizeof(This->state.viewport))) { TRACE("Updating viewport.\n"); - This->viewport = targetStateBlock->viewport; + This->state.viewport = src_state->viewport; } - if(This->changed.scissorRect - && memcmp(&targetStateBlock->scissorRect, &This->scissorRect, sizeof(This->scissorRect))) + if (This->changed.scissorRect && memcmp(&src_state->scissor_rect, + &This->state.scissor_rect, sizeof(This->state.scissor_rect))) { TRACE("Updating scissor rect.\n"); - This->scissorRect = targetStateBlock->scissorRect; + This->state.scissor_rect = src_state->scissor_rect; } map = This->changed.streamSource; @@ -765,16 +774,19 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) { if (!(map & 1)) continue; - if (This->streamStride[i] != targetStateBlock->streamStride[i] - || This->streamSource[i] != targetStateBlock->streamSource[i]) + if (This->state.streams[i].stride != src_state->streams[i].stride + || This->state.streams[i].buffer != src_state->streams[i].buffer) { TRACE("Updating stream source %u to %p, stride to %u.\n", - i, targetStateBlock->streamSource[i], targetStateBlock->streamStride[i]); + i, src_state->streams[i].buffer, + src_state->streams[i].stride); - This->streamStride[i] = targetStateBlock->streamStride[i]; - if (targetStateBlock->streamSource[i]) IWineD3DBuffer_AddRef(targetStateBlock->streamSource[i]); - if (This->streamSource[i]) IWineD3DBuffer_Release(This->streamSource[i]); - This->streamSource[i] = targetStateBlock->streamSource[i]; + This->state.streams[i].stride = src_state->streams[i].stride; + if (src_state->streams[i].buffer) + IWineD3DBuffer_AddRef((IWineD3DBuffer *)src_state->streams[i].buffer); + if (This->state.streams[i].buffer) + IWineD3DBuffer_Release((IWineD3DBuffer *)This->state.streams[i].buffer); + This->state.streams[i].buffer = src_state->streams[i].buffer; } } @@ -783,14 +795,14 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) { if (!(map & 1)) continue; - if (This->streamFreq[i] != targetStateBlock->streamFreq[i] - || This->streamFlags[i] != targetStateBlock->streamFlags[i]) + if (This->state.streams[i].frequency != src_state->streams[i].frequency + || This->state.streams[i].flags != src_state->streams[i].flags) { TRACE("Updating stream frequency %u to %u flags to %#x.\n", - i, targetStateBlock->streamFreq[i], targetStateBlock->streamFlags[i]); + i, src_state->streams[i].frequency, src_state->streams[i].flags); - This->streamFreq[i] = targetStateBlock->streamFreq[i]; - This->streamFlags[i] = targetStateBlock->streamFlags[i]; + This->state.streams[i].frequency = src_state->streams[i].frequency; + This->state.streams[i].flags = src_state->streams[i].flags; } } @@ -799,10 +811,10 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) { if (!(map & 1)) continue; - if (memcmp(targetStateBlock->clipplane[i], This->clipplane[i], sizeof(*This->clipplane))) + if (memcmp(src_state->clip_planes[i], This->state.clip_planes[i], sizeof(*This->state.clip_planes))) { TRACE("Updating clipplane %u.\n", i); - memcpy(This->clipplane[i], targetStateBlock->clipplane[i], sizeof(*This->clipplane)); + memcpy(This->state.clip_planes[i], src_state->clip_planes[i], sizeof(*This->state.clip_planes)); } } @@ -811,9 +823,9 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) { WINED3DRENDERSTATETYPE rs = This->contained_render_states[i]; - TRACE("Updating renderState %#x to %u.\n", rs, targetStateBlock->renderState[rs]); + TRACE("Updating render state %#x to %u.\n", rs, src_state->render_states[rs]); - This->renderState[rs] = targetStateBlock->renderState[rs]; + This->state.render_states[rs] = src_state->render_states[rs]; } /* Texture states */ @@ -822,10 +834,10 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) DWORD stage = This->contained_tss_states[i].stage; DWORD state = This->contained_tss_states[i].state; - TRACE("Updating texturestage state %u, %u to %u (was %u).\n", stage, state, - targetStateBlock->textureState[stage][state], This->textureState[stage][state]); + TRACE("Updating texturestage state %u, %u to %#x (was %#x).\n", stage, state, + src_state->texture_states[stage][state], This->state.texture_states[stage][state]); - This->textureState[stage][state] = targetStateBlock->textureState[stage][state]; + This->state.texture_states[stage][state] = src_state->texture_states[stage][state]; } /* Samplers */ @@ -834,11 +846,14 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) { if (!(map & 1)) continue; - TRACE("Updating texture %u to %p (was %p).\n", i, targetStateBlock->textures[i], This->textures[i]); + TRACE("Updating texture %u to %p (was %p).\n", + i, src_state->textures[i], This->state.textures[i]); - if (targetStateBlock->textures[i]) IWineD3DBaseTexture_AddRef(targetStateBlock->textures[i]); - if (This->textures[i]) IWineD3DBaseTexture_Release(This->textures[i]); - This->textures[i] = targetStateBlock->textures[i]; + if (src_state->textures[i]) + IWineD3DBaseTexture_AddRef((IWineD3DBaseTexture *)src_state->textures[i]); + if (This->state.textures[i]) + IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)This->state.textures[i]); + This->state.textures[i] = src_state->textures[i]; } for (i = 0; i < This->num_contained_sampler_states; ++i) @@ -846,33 +861,37 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface) DWORD stage = This->contained_sampler_states[i].stage; DWORD state = This->contained_sampler_states[i].state; - TRACE("Updating sampler state %u, %u to %u (was %u).\n", stage, state, - targetStateBlock->samplerState[stage][state], This->samplerState[stage][state]); + TRACE("Updating sampler state %u, %u to %#x (was %#x).\n", stage, state, + src_state->sampler_states[stage][state], This->state.sampler_states[stage][state]); - This->samplerState[stage][state] = targetStateBlock->samplerState[stage][state]; + This->state.sampler_states[stage][state] = src_state->sampler_states[stage][state]; } - if (This->changed.pixelShader && This->pixelShader != targetStateBlock->pixelShader) + if (This->changed.pixelShader && This->state.pixel_shader != src_state->pixel_shader) { - if (targetStateBlock->pixelShader) IWineD3DPixelShader_AddRef(targetStateBlock->pixelShader); - if (This->pixelShader) IWineD3DPixelShader_Release(This->pixelShader); - This->pixelShader = targetStateBlock->pixelShader; + if (src_state->pixel_shader) + IWineD3DPixelShader_AddRef((IWineD3DPixelShader *)src_state->pixel_shader); + if (This->state.pixel_shader) + IWineD3DPixelShader_Release((IWineD3DPixelShader *)This->state.pixel_shader); + This->state.pixel_shader = src_state->pixel_shader; } - record_lights(This, targetStateBlock); + wined3d_state_record_lights(&This->state, src_state); - TRACE("(%p) : Updated state block %p ------------------^\n", targetStateBlock, This); + TRACE("Captue done.\n"); return WINED3D_OK; } -static void apply_lights(IWineD3DDevice *device, const IWineD3DStateBlockImpl *This) +static void apply_lights(IWineD3DDevice *device, const struct wined3d_state *state) { UINT i; - for(i = 0; i < LIGHTMAP_SIZE; i++) { + + for (i = 0; i < LIGHTMAP_SIZE; ++i) + { struct list *e; - LIST_FOR_EACH(e, &This->lightMap[i]) + LIST_FOR_EACH(e, &state->light_map[i]) { const struct wined3d_light_info *light = LIST_ENTRY(e, struct wined3d_light_info, entry); @@ -893,51 +912,53 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface) TRACE("Blocktype: %d\n", This->blockType); - if (This->changed.vertexShader) IWineD3DDevice_SetVertexShader(device, This->vertexShader); + if (This->changed.vertexShader) + IWineD3DDevice_SetVertexShader(device, (IWineD3DVertexShader *)This->state.vertex_shader); /* Vertex Shader Constants */ for (i = 0; i < This->num_contained_vs_consts_f; ++i) { IWineD3DDevice_SetVertexShaderConstantF(device, This->contained_vs_consts_f[i], - This->vertexShaderConstantF + This->contained_vs_consts_f[i] * 4, 1); + This->state.vs_consts_f + This->contained_vs_consts_f[i] * 4, 1); } for (i = 0; i < This->num_contained_vs_consts_i; ++i) { IWineD3DDevice_SetVertexShaderConstantI(device, This->contained_vs_consts_i[i], - This->vertexShaderConstantI + This->contained_vs_consts_i[i] * 4, 1); + This->state.vs_consts_i + This->contained_vs_consts_i[i] * 4, 1); } for (i = 0; i < This->num_contained_vs_consts_b; ++i) { IWineD3DDevice_SetVertexShaderConstantB(device, This->contained_vs_consts_b[i], - This->vertexShaderConstantB + This->contained_vs_consts_b[i], 1); + This->state.vs_consts_b + This->contained_vs_consts_b[i], 1); } - apply_lights(device, This); + apply_lights(device, &This->state); - if (This->changed.pixelShader) IWineD3DDevice_SetPixelShader(device, This->pixelShader); + if (This->changed.pixelShader) + IWineD3DDevice_SetPixelShader(device, (IWineD3DPixelShader *)This->state.pixel_shader); /* Pixel Shader Constants */ for (i = 0; i < This->num_contained_ps_consts_f; ++i) { IWineD3DDevice_SetPixelShaderConstantF(device, This->contained_ps_consts_f[i], - This->pixelShaderConstantF + This->contained_ps_consts_f[i] * 4, 1); + This->state.ps_consts_f + This->contained_ps_consts_f[i] * 4, 1); } for (i = 0; i < This->num_contained_ps_consts_i; ++i) { IWineD3DDevice_SetPixelShaderConstantI(device, This->contained_ps_consts_i[i], - This->pixelShaderConstantI + This->contained_ps_consts_i[i] * 4, 1); + This->state.ps_consts_i + This->contained_ps_consts_i[i] * 4, 1); } for (i = 0; i < This->num_contained_ps_consts_b; ++i) { IWineD3DDevice_SetPixelShaderConstantB(device, This->contained_ps_consts_b[i], - This->pixelShaderConstantB + This->contained_ps_consts_b[i], 1); + This->state.ps_consts_b + This->contained_ps_consts_b[i], 1); } /* Render */ for (i = 0; i < This->num_contained_render_states; ++i) { IWineD3DDevice_SetRenderState(device, This->contained_render_states[i], - This->renderState[This->contained_render_states[i]]); + This->state.render_states[This->contained_render_states[i]]); } /* Texture states */ @@ -946,7 +967,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface) DWORD stage = This->contained_tss_states[i].stage; DWORD state = This->contained_tss_states[i].state; - IWineD3DDevice_SetTextureStageState(device, stage, state, This->textureState[stage][state]); + IWineD3DDevice_SetTextureStageState(device, stage, state, This->state.texture_states[stage][state]); } /* Sampler states */ @@ -954,7 +975,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface) { DWORD stage = This->contained_sampler_states[i].stage; DWORD state = This->contained_sampler_states[i].state; - DWORD value = This->samplerState[stage][state]; + DWORD value = This->state.sampler_states[stage][state]; if (stage >= MAX_FRAGMENT_SAMPLERS) stage += WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS; IWineD3DDevice_SetSamplerState(device, stage, state, value); @@ -963,51 +984,56 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface) for (i = 0; i < This->num_contained_transform_states; ++i) { IWineD3DDevice_SetTransform(device, This->contained_transform_states[i], - &This->transforms[This->contained_transform_states[i]]); + &This->state.transforms[This->contained_transform_states[i]]); } if (This->changed.primitive_type) { This->device->updateStateBlock->changed.primitive_type = TRUE; - This->device->updateStateBlock->gl_primitive_type = This->gl_primitive_type; + This->device->updateStateBlock->state.gl_primitive_type = This->state.gl_primitive_type; } if (This->changed.indices) { - IWineD3DDevice_SetIndexBuffer(device, This->pIndexData, This->IndexFmt); - IWineD3DDevice_SetBaseVertexIndex(device, This->baseVertexIndex); + IWineD3DDevice_SetIndexBuffer(device, (IWineD3DBuffer *)This->state.index_buffer, This->state.index_format); + IWineD3DDevice_SetBaseVertexIndex(device, This->state.base_vertex_index); } - if (This->changed.vertexDecl && This->vertexDecl) + if (This->changed.vertexDecl && This->state.vertex_declaration) { - IWineD3DDevice_SetVertexDeclaration(device, This->vertexDecl); + IWineD3DDevice_SetVertexDeclaration(device, (IWineD3DVertexDeclaration *)This->state.vertex_declaration); } if (This->changed.material) { - IWineD3DDevice_SetMaterial(device, &This->material); + IWineD3DDevice_SetMaterial(device, &This->state.material); } if (This->changed.viewport) { - IWineD3DDevice_SetViewport(device, &This->viewport); + IWineD3DDevice_SetViewport(device, &This->state.viewport); } if (This->changed.scissorRect) { - IWineD3DDevice_SetScissorRect(device, &This->scissorRect); + IWineD3DDevice_SetScissorRect(device, &This->state.scissor_rect); } map = This->changed.streamSource; for (i = 0; map; map >>= 1, ++i) { - if (map & 1) IWineD3DDevice_SetStreamSource(device, i, This->streamSource[i], 0, This->streamStride[i]); + if (map & 1) + IWineD3DDevice_SetStreamSource(device, i, + (IWineD3DBuffer *)This->state.streams[i].buffer, + 0, This->state.streams[i].stride); } map = This->changed.streamFreq; for (i = 0; map; map >>= 1, ++i) { - if (map & 1) IWineD3DDevice_SetStreamSourceFreq(device, i, This->streamFreq[i] | This->streamFlags[i]); + if (map & 1) + IWineD3DDevice_SetStreamSourceFreq(device, i, + This->state.streams[i].frequency | This->state.streams[i].flags); } map = This->changed.textures; @@ -1018,7 +1044,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface) if (!(map & 1)) continue; stage = i < MAX_FRAGMENT_SAMPLERS ? i : WINED3DVERTEXTEXTURESAMPLER0 + i - MAX_FRAGMENT_SAMPLERS; - IWineD3DDevice_SetTexture(device, stage, This->textures[i]); + IWineD3DDevice_SetTexture(device, stage, (IWineD3DBaseTexture *)This->state.textures[i]); } map = This->changed.clipplane; @@ -1028,19 +1054,19 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface) if (!(map & 1)) continue; - clip[0] = This->clipplane[i][0]; - clip[1] = This->clipplane[i][1]; - clip[2] = This->clipplane[i][2]; - clip[3] = This->clipplane[i][3]; + clip[0] = This->state.clip_planes[i][0]; + clip[1] = This->state.clip_planes[i][1]; + clip[2] = This->state.clip_planes[i][2]; + clip[3] = This->state.clip_planes[i][3]; IWineD3DDevice_SetClipPlane(device, i, clip); } - This->device->stateBlock->lowest_disabled_stage = MAX_TEXTURES - 1; + This->device->stateBlock->state.lowest_disabled_stage = MAX_TEXTURES - 1; for (i = 0; i < MAX_TEXTURES - 1; ++i) { - if (This->device->stateBlock->textureState[i][WINED3DTSS_COLOROP] == WINED3DTOP_DISABLE) + if (This->device->stateBlock->state.texture_states[i][WINED3DTSS_COLOROP] == WINED3DTOP_DISABLE) { - This->device->stateBlock->lowest_disabled_stage = i; + This->device->stateBlock->state.lowest_disabled_stage = i; break; } } @@ -1049,11 +1075,11 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface) return WINED3D_OK; } -static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStateBlock* iface) { - IWineD3DStateBlockImpl *This = (IWineD3DStateBlockImpl *)iface; - IWineD3DDevice *device = (IWineD3DDevice *)This->device; - IWineD3DDeviceImpl *device_impl = (IWineD3DDeviceImpl *)device; - const struct wined3d_gl_info *gl_info = &device_impl->adapter->gl_info; +void stateblock_init_default_state(IWineD3DStateBlockImpl *stateblock) +{ + IWineD3DDeviceImpl *device = stateblock->device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + struct wined3d_state *state = &stateblock->state; union { WINED3DLINEPATTERN lp; DWORD d; @@ -1067,243 +1093,237 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat IWineD3DSurface *backbuffer; HRESULT hr; - /* Note this may have a large overhead but it should only be executed - once, in order to initialize the complete state of the device and - all opengl equivalents */ - TRACE("(%p) -----------------------> Setting up device defaults... %p\n", This, device); - /* TODO: make a special stateblock type for the primary stateblock (it never gets applied so it doesn't need a real type) */ - This->blockType = WINED3DSBT_INIT; + TRACE("stateblock %p.\n", stateblock); + + stateblock->blockType = WINED3DSBT_INIT; /* Set some of the defaults for lights, transforms etc */ - memcpy(&This->transforms[WINED3DTS_PROJECTION], identity, sizeof(identity)); - memcpy(&This->transforms[WINED3DTS_VIEW], identity, sizeof(identity)); - for (i = 0; i < 256; ++i) { - memcpy(&This->transforms[WINED3DTS_WORLDMATRIX(i)], identity, sizeof(identity)); + memcpy(&state->transforms[WINED3DTS_PROJECTION], identity, sizeof(identity)); + memcpy(&state->transforms[WINED3DTS_VIEW], identity, sizeof(identity)); + for (i = 0; i < 256; ++i) + { + memcpy(&state->transforms[WINED3DTS_WORLDMATRIX(i)], identity, sizeof(identity)); } TRACE("Render states\n"); /* Render states: */ - if (device_impl->auto_depth_stencil) - IWineD3DDevice_SetRenderState(device, WINED3DRS_ZENABLE, WINED3DZB_TRUE); + if (device->auto_depth_stencil) + state->render_states[WINED3DRS_ZENABLE] = WINED3DZB_TRUE; else - IWineD3DDevice_SetRenderState(device, WINED3DRS_ZENABLE, WINED3DZB_FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_FILLMODE, WINED3DFILL_SOLID); - IWineD3DDevice_SetRenderState(device, WINED3DRS_SHADEMODE, WINED3DSHADE_GOURAUD); + state->render_states[WINED3DRS_ZENABLE] = WINED3DZB_FALSE; + state->render_states[WINED3DRS_FILLMODE] = WINED3DFILL_SOLID; + state->render_states[WINED3DRS_SHADEMODE] = WINED3DSHADE_GOURAUD; lp.lp.wRepeatFactor = 0; - lp.lp.wLinePattern = 0; - IWineD3DDevice_SetRenderState(device, WINED3DRS_LINEPATTERN, lp.d); - IWineD3DDevice_SetRenderState(device, WINED3DRS_ZWRITEENABLE, TRUE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_ALPHATESTENABLE, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_LASTPIXEL, TRUE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_SRCBLEND, WINED3DBLEND_ONE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_DESTBLEND, WINED3DBLEND_ZERO); - IWineD3DDevice_SetRenderState(device, WINED3DRS_CULLMODE, WINED3DCULL_CCW); - IWineD3DDevice_SetRenderState(device, WINED3DRS_ZFUNC, WINED3DCMP_LESSEQUAL); - IWineD3DDevice_SetRenderState(device, WINED3DRS_ALPHAFUNC, WINED3DCMP_ALWAYS); - IWineD3DDevice_SetRenderState(device, WINED3DRS_ALPHAREF, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_DITHERENABLE, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_ALPHABLENDENABLE, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_FOGENABLE, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_SPECULARENABLE, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_ZVISIBLE, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_FOGCOLOR, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_FOGTABLEMODE, WINED3DFOG_NONE); + lp.lp.wLinePattern = 0; + state->render_states[WINED3DRS_LINEPATTERN] = lp.d; + state->render_states[WINED3DRS_ZWRITEENABLE] = TRUE; + state->render_states[WINED3DRS_ALPHATESTENABLE] = FALSE; + state->render_states[WINED3DRS_LASTPIXEL] = TRUE; + state->render_states[WINED3DRS_SRCBLEND] = WINED3DBLEND_ONE; + state->render_states[WINED3DRS_DESTBLEND] = WINED3DBLEND_ZERO; + state->render_states[WINED3DRS_CULLMODE] = WINED3DCULL_CCW; + state->render_states[WINED3DRS_ZFUNC] = WINED3DCMP_LESSEQUAL; + state->render_states[WINED3DRS_ALPHAFUNC] = WINED3DCMP_ALWAYS; + state->render_states[WINED3DRS_ALPHAREF] = 0; + state->render_states[WINED3DRS_DITHERENABLE] = FALSE; + state->render_states[WINED3DRS_ALPHABLENDENABLE] = FALSE; + state->render_states[WINED3DRS_FOGENABLE] = FALSE; + state->render_states[WINED3DRS_SPECULARENABLE] = FALSE; + state->render_states[WINED3DRS_ZVISIBLE] = 0; + state->render_states[WINED3DRS_FOGCOLOR] = 0; + state->render_states[WINED3DRS_FOGTABLEMODE] = WINED3DFOG_NONE; tmpfloat.f = 0.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_FOGSTART, tmpfloat.d); + state->render_states[WINED3DRS_FOGSTART] = tmpfloat.d; tmpfloat.f = 1.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_FOGEND, tmpfloat.d); + state->render_states[WINED3DRS_FOGEND] = tmpfloat.d; tmpfloat.f = 1.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_FOGDENSITY, tmpfloat.d); - IWineD3DDevice_SetRenderState(device, WINED3DRS_EDGEANTIALIAS, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_ZBIAS, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_RANGEFOGENABLE, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_STENCILENABLE, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_STENCILFAIL, WINED3DSTENCILOP_KEEP); - IWineD3DDevice_SetRenderState(device, WINED3DRS_STENCILZFAIL, WINED3DSTENCILOP_KEEP); - IWineD3DDevice_SetRenderState(device, WINED3DRS_STENCILPASS, WINED3DSTENCILOP_KEEP); - IWineD3DDevice_SetRenderState(device, WINED3DRS_STENCILREF, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_STENCILMASK, 0xFFFFFFFF); - IWineD3DDevice_SetRenderState(device, WINED3DRS_STENCILFUNC, WINED3DCMP_ALWAYS); - IWineD3DDevice_SetRenderState(device, WINED3DRS_STENCILWRITEMASK, 0xFFFFFFFF); - IWineD3DDevice_SetRenderState(device, WINED3DRS_TEXTUREFACTOR, 0xFFFFFFFF); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP0, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP1, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP2, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP3, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP4, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP5, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP6, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP7, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_CLIPPING, TRUE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_LIGHTING, TRUE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_AMBIENT, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_FOGVERTEXMODE, WINED3DFOG_NONE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_COLORVERTEX, TRUE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_LOCALVIEWER, TRUE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_NORMALIZENORMALS, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_DIFFUSEMATERIALSOURCE, WINED3DMCS_COLOR1); - IWineD3DDevice_SetRenderState(device, WINED3DRS_SPECULARMATERIALSOURCE, WINED3DMCS_COLOR2); - IWineD3DDevice_SetRenderState(device, WINED3DRS_AMBIENTMATERIALSOURCE, WINED3DMCS_MATERIAL); - IWineD3DDevice_SetRenderState(device, WINED3DRS_EMISSIVEMATERIALSOURCE, WINED3DMCS_MATERIAL); - IWineD3DDevice_SetRenderState(device, WINED3DRS_VERTEXBLEND, WINED3DVBF_DISABLE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_CLIPPLANEENABLE, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_SOFTWAREVERTEXPROCESSING, FALSE); + state->render_states[WINED3DRS_FOGDENSITY] = tmpfloat.d; + state->render_states[WINED3DRS_EDGEANTIALIAS] = FALSE; + state->render_states[WINED3DRS_ZBIAS] = 0; + state->render_states[WINED3DRS_RANGEFOGENABLE] = FALSE; + state->render_states[WINED3DRS_STENCILENABLE] = FALSE; + state->render_states[WINED3DRS_STENCILFAIL] = WINED3DSTENCILOP_KEEP; + state->render_states[WINED3DRS_STENCILZFAIL] = WINED3DSTENCILOP_KEEP; + state->render_states[WINED3DRS_STENCILPASS] = WINED3DSTENCILOP_KEEP; + state->render_states[WINED3DRS_STENCILREF] = 0; + state->render_states[WINED3DRS_STENCILMASK] = 0xffffffff; + state->render_states[WINED3DRS_STENCILFUNC] = WINED3DCMP_ALWAYS; + state->render_states[WINED3DRS_STENCILWRITEMASK] = 0xffffffff; + state->render_states[WINED3DRS_TEXTUREFACTOR] = 0xffffffff; + state->render_states[WINED3DRS_WRAP0] = 0; + state->render_states[WINED3DRS_WRAP1] = 0; + state->render_states[WINED3DRS_WRAP2] = 0; + state->render_states[WINED3DRS_WRAP3] = 0; + state->render_states[WINED3DRS_WRAP4] = 0; + state->render_states[WINED3DRS_WRAP5] = 0; + state->render_states[WINED3DRS_WRAP6] = 0; + state->render_states[WINED3DRS_WRAP7] = 0; + state->render_states[WINED3DRS_CLIPPING] = TRUE; + state->render_states[WINED3DRS_LIGHTING] = TRUE; + state->render_states[WINED3DRS_AMBIENT] = 0; + state->render_states[WINED3DRS_FOGVERTEXMODE] = WINED3DFOG_NONE; + state->render_states[WINED3DRS_COLORVERTEX] = TRUE; + state->render_states[WINED3DRS_LOCALVIEWER] = TRUE; + state->render_states[WINED3DRS_NORMALIZENORMALS] = FALSE; + state->render_states[WINED3DRS_DIFFUSEMATERIALSOURCE] = WINED3DMCS_COLOR1; + state->render_states[WINED3DRS_SPECULARMATERIALSOURCE] = WINED3DMCS_COLOR2; + state->render_states[WINED3DRS_AMBIENTMATERIALSOURCE] = WINED3DMCS_MATERIAL; + state->render_states[WINED3DRS_EMISSIVEMATERIALSOURCE] = WINED3DMCS_MATERIAL; + state->render_states[WINED3DRS_VERTEXBLEND] = WINED3DVBF_DISABLE; + state->render_states[WINED3DRS_CLIPPLANEENABLE] = 0; + state->render_states[WINED3DRS_SOFTWAREVERTEXPROCESSING] = FALSE; tmpfloat.f = 1.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_POINTSIZE, tmpfloat.d); + state->render_states[WINED3DRS_POINTSIZE] = tmpfloat.d; tmpfloat.f = 1.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_POINTSIZE_MIN, tmpfloat.d); - IWineD3DDevice_SetRenderState(device, WINED3DRS_POINTSPRITEENABLE, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_POINTSCALEENABLE, FALSE); + state->render_states[WINED3DRS_POINTSIZE_MIN] = tmpfloat.d; + state->render_states[WINED3DRS_POINTSPRITEENABLE] = FALSE; + state->render_states[WINED3DRS_POINTSCALEENABLE] = FALSE; tmpfloat.f = 1.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_POINTSCALE_A, tmpfloat.d); + state->render_states[WINED3DRS_POINTSCALE_A] = tmpfloat.d; tmpfloat.f = 0.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_POINTSCALE_B, tmpfloat.d); + state->render_states[WINED3DRS_POINTSCALE_B] = tmpfloat.d; tmpfloat.f = 0.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_POINTSCALE_C, tmpfloat.d); - IWineD3DDevice_SetRenderState(device, WINED3DRS_MULTISAMPLEANTIALIAS, TRUE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_MULTISAMPLEMASK, 0xFFFFFFFF); - IWineD3DDevice_SetRenderState(device, WINED3DRS_PATCHEDGESTYLE, WINED3DPATCHEDGE_DISCRETE); + state->render_states[WINED3DRS_POINTSCALE_C] = tmpfloat.d; + state->render_states[WINED3DRS_MULTISAMPLEANTIALIAS] = TRUE; + state->render_states[WINED3DRS_MULTISAMPLEMASK] = 0xffffffff; + state->render_states[WINED3DRS_PATCHEDGESTYLE] = WINED3DPATCHEDGE_DISCRETE; tmpfloat.f = 1.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_PATCHSEGMENTS, tmpfloat.d); - IWineD3DDevice_SetRenderState(device, WINED3DRS_DEBUGMONITORTOKEN, 0xbaadcafe); + state->render_states[WINED3DRS_PATCHSEGMENTS] = tmpfloat.d; + state->render_states[WINED3DRS_DEBUGMONITORTOKEN] = 0xbaadcafe; tmpfloat.f = gl_info->limits.pointsize_max; - IWineD3DDevice_SetRenderState(device, WINED3DRS_POINTSIZE_MAX, tmpfloat.d); - IWineD3DDevice_SetRenderState(device, WINED3DRS_INDEXEDVERTEXBLENDENABLE, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_COLORWRITEENABLE, 0x0000000F); + state->render_states[WINED3DRS_POINTSIZE_MAX] = tmpfloat.d; + state->render_states[WINED3DRS_INDEXEDVERTEXBLENDENABLE] = FALSE; + state->render_states[WINED3DRS_COLORWRITEENABLE] = 0x0000000f; tmpfloat.f = 0.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_TWEENFACTOR, tmpfloat.d); - IWineD3DDevice_SetRenderState(device, WINED3DRS_BLENDOP, WINED3DBLENDOP_ADD); - IWineD3DDevice_SetRenderState(device, WINED3DRS_POSITIONDEGREE, WINED3DDEGREE_CUBIC); - IWineD3DDevice_SetRenderState(device, WINED3DRS_NORMALDEGREE, WINED3DDEGREE_LINEAR); + state->render_states[WINED3DRS_TWEENFACTOR] = tmpfloat.d; + state->render_states[WINED3DRS_BLENDOP] = WINED3DBLENDOP_ADD; + state->render_states[WINED3DRS_POSITIONDEGREE] = WINED3DDEGREE_CUBIC; + state->render_states[WINED3DRS_NORMALDEGREE] = WINED3DDEGREE_LINEAR; /* states new in d3d9 */ - IWineD3DDevice_SetRenderState(device, WINED3DRS_SCISSORTESTENABLE, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_SLOPESCALEDEPTHBIAS, 0); + state->render_states[WINED3DRS_SCISSORTESTENABLE] = FALSE; + state->render_states[WINED3DRS_SLOPESCALEDEPTHBIAS] = 0; tmpfloat.f = 1.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_MINTESSELLATIONLEVEL, tmpfloat.d); - IWineD3DDevice_SetRenderState(device, WINED3DRS_MAXTESSELLATIONLEVEL, tmpfloat.d); - IWineD3DDevice_SetRenderState(device, WINED3DRS_ANTIALIASEDLINEENABLE, FALSE); + state->render_states[WINED3DRS_MINTESSELLATIONLEVEL] = tmpfloat.d; + state->render_states[WINED3DRS_MAXTESSELLATIONLEVEL] = tmpfloat.d; + state->render_states[WINED3DRS_ANTIALIASEDLINEENABLE] = FALSE; tmpfloat.f = 0.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_ADAPTIVETESS_X, tmpfloat.d); - IWineD3DDevice_SetRenderState(device, WINED3DRS_ADAPTIVETESS_Y, tmpfloat.d); + state->render_states[WINED3DRS_ADAPTIVETESS_X] = tmpfloat.d; + state->render_states[WINED3DRS_ADAPTIVETESS_Y] = tmpfloat.d; tmpfloat.f = 1.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_ADAPTIVETESS_Z, tmpfloat.d); + state->render_states[WINED3DRS_ADAPTIVETESS_Z] = tmpfloat.d; tmpfloat.f = 0.0f; - IWineD3DDevice_SetRenderState(device, WINED3DRS_ADAPTIVETESS_W, tmpfloat.d); - IWineD3DDevice_SetRenderState(device, WINED3DRS_ENABLEADAPTIVETESSELLATION, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_TWOSIDEDSTENCILMODE, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_CCW_STENCILFAIL, WINED3DSTENCILOP_KEEP); - IWineD3DDevice_SetRenderState(device, WINED3DRS_CCW_STENCILZFAIL, WINED3DSTENCILOP_KEEP); - IWineD3DDevice_SetRenderState(device, WINED3DRS_CCW_STENCILPASS, WINED3DSTENCILOP_KEEP); - IWineD3DDevice_SetRenderState(device, WINED3DRS_CCW_STENCILFUNC, WINED3DCMP_ALWAYS); - IWineD3DDevice_SetRenderState(device, WINED3DRS_COLORWRITEENABLE1, 0x0000000F); - IWineD3DDevice_SetRenderState(device, WINED3DRS_COLORWRITEENABLE2, 0x0000000F); - IWineD3DDevice_SetRenderState(device, WINED3DRS_COLORWRITEENABLE3, 0x0000000F); - IWineD3DDevice_SetRenderState(device, WINED3DRS_BLENDFACTOR, 0xFFFFFFFF); - IWineD3DDevice_SetRenderState(device, WINED3DRS_SRGBWRITEENABLE, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_DEPTHBIAS, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP8, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP9, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP10, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP11, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP12, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP13, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP14, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_WRAP15, 0); - IWineD3DDevice_SetRenderState(device, WINED3DRS_SEPARATEALPHABLENDENABLE, FALSE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_SRCBLENDALPHA, WINED3DBLEND_ONE); - IWineD3DDevice_SetRenderState(device, WINED3DRS_DESTBLENDALPHA, WINED3DBLEND_ZERO); - IWineD3DDevice_SetRenderState(device, WINED3DRS_BLENDOPALPHA, WINED3DBLENDOP_ADD); + state->render_states[WINED3DRS_ADAPTIVETESS_W] = tmpfloat.d; + state->render_states[WINED3DRS_ENABLEADAPTIVETESSELLATION] = FALSE; + state->render_states[WINED3DRS_TWOSIDEDSTENCILMODE] = FALSE; + state->render_states[WINED3DRS_CCW_STENCILFAIL] = WINED3DSTENCILOP_KEEP; + state->render_states[WINED3DRS_CCW_STENCILZFAIL] = WINED3DSTENCILOP_KEEP; + state->render_states[WINED3DRS_CCW_STENCILPASS] = WINED3DSTENCILOP_KEEP; + state->render_states[WINED3DRS_CCW_STENCILFUNC] = WINED3DCMP_ALWAYS; + state->render_states[WINED3DRS_COLORWRITEENABLE1] = 0x0000000f; + state->render_states[WINED3DRS_COLORWRITEENABLE2] = 0x0000000f; + state->render_states[WINED3DRS_COLORWRITEENABLE3] = 0x0000000f; + state->render_states[WINED3DRS_BLENDFACTOR] = 0xFFFFFFFF; + state->render_states[WINED3DRS_SRGBWRITEENABLE] = 0; + state->render_states[WINED3DRS_DEPTHBIAS] = 0; + state->render_states[WINED3DRS_WRAP8] = 0; + state->render_states[WINED3DRS_WRAP9] = 0; + state->render_states[WINED3DRS_WRAP10] = 0; + state->render_states[WINED3DRS_WRAP11] = 0; + state->render_states[WINED3DRS_WRAP12] = 0; + state->render_states[WINED3DRS_WRAP13] = 0; + state->render_states[WINED3DRS_WRAP14] = 0; + state->render_states[WINED3DRS_WRAP15] = 0; + state->render_states[WINED3DRS_SEPARATEALPHABLENDENABLE] = FALSE; + state->render_states[WINED3DRS_SRCBLENDALPHA] = WINED3DBLEND_ONE; + state->render_states[WINED3DRS_DESTBLENDALPHA] = WINED3DBLEND_ZERO; + state->render_states[WINED3DRS_BLENDOPALPHA] = WINED3DBLENDOP_ADD; /* clipping status */ - This->clip_status.ClipUnion = 0; - This->clip_status.ClipIntersection = 0xFFFFFFFF; + state->clip_status.ClipUnion = 0; + state->clip_status.ClipIntersection = 0xFFFFFFFF; /* Texture Stage States - Put directly into state block, we will call function below */ - for (i = 0; i < MAX_TEXTURES; i++) { - TRACE("Setting up default texture states for texture Stage %d\n", i); - memcpy(&This->transforms[WINED3DTS_TEXTURE0 + i], identity, sizeof(identity)); - This->textureState[i][WINED3DTSS_COLOROP ] = (i==0)? WINED3DTOP_MODULATE : WINED3DTOP_DISABLE; - This->textureState[i][WINED3DTSS_COLORARG1 ] = WINED3DTA_TEXTURE; - This->textureState[i][WINED3DTSS_COLORARG2 ] = WINED3DTA_CURRENT; - This->textureState[i][WINED3DTSS_ALPHAOP ] = (i==0)? WINED3DTOP_SELECTARG1 : WINED3DTOP_DISABLE; - This->textureState[i][WINED3DTSS_ALPHAARG1 ] = WINED3DTA_TEXTURE; - This->textureState[i][WINED3DTSS_ALPHAARG2 ] = WINED3DTA_CURRENT; - This->textureState[i][WINED3DTSS_BUMPENVMAT00 ] = 0; - This->textureState[i][WINED3DTSS_BUMPENVMAT01 ] = 0; - This->textureState[i][WINED3DTSS_BUMPENVMAT10 ] = 0; - This->textureState[i][WINED3DTSS_BUMPENVMAT11 ] = 0; - This->textureState[i][WINED3DTSS_TEXCOORDINDEX ] = i; - This->textureState[i][WINED3DTSS_BUMPENVLSCALE ] = 0; - This->textureState[i][WINED3DTSS_BUMPENVLOFFSET ] = 0; - This->textureState[i][WINED3DTSS_TEXTURETRANSFORMFLAGS ] = WINED3DTTFF_DISABLE; - This->textureState[i][WINED3DTSS_COLORARG0 ] = WINED3DTA_CURRENT; - This->textureState[i][WINED3DTSS_ALPHAARG0 ] = WINED3DTA_CURRENT; - This->textureState[i][WINED3DTSS_RESULTARG ] = WINED3DTA_CURRENT; + for (i = 0; i < MAX_TEXTURES; ++i) + { + TRACE("Setting up default texture states for texture Stage %u.\n", i); + memcpy(&state->transforms[WINED3DTS_TEXTURE0 + i], identity, sizeof(identity)); + state->texture_states[i][WINED3DTSS_COLOROP] = i ? WINED3DTOP_DISABLE : WINED3DTOP_MODULATE; + state->texture_states[i][WINED3DTSS_COLORARG1] = WINED3DTA_TEXTURE; + state->texture_states[i][WINED3DTSS_COLORARG2] = WINED3DTA_CURRENT; + state->texture_states[i][WINED3DTSS_ALPHAOP] = i ? WINED3DTOP_DISABLE : WINED3DTOP_SELECTARG1; + state->texture_states[i][WINED3DTSS_ALPHAARG1] = WINED3DTA_TEXTURE; + state->texture_states[i][WINED3DTSS_ALPHAARG2] = WINED3DTA_CURRENT; + state->texture_states[i][WINED3DTSS_BUMPENVMAT00] = 0; + state->texture_states[i][WINED3DTSS_BUMPENVMAT01] = 0; + state->texture_states[i][WINED3DTSS_BUMPENVMAT10] = 0; + state->texture_states[i][WINED3DTSS_BUMPENVMAT11] = 0; + state->texture_states[i][WINED3DTSS_TEXCOORDINDEX] = i; + state->texture_states[i][WINED3DTSS_BUMPENVLSCALE] = 0; + state->texture_states[i][WINED3DTSS_BUMPENVLOFFSET] = 0; + state->texture_states[i][WINED3DTSS_TEXTURETRANSFORMFLAGS] = WINED3DTTFF_DISABLE; + state->texture_states[i][WINED3DTSS_COLORARG0] = WINED3DTA_CURRENT; + state->texture_states[i][WINED3DTSS_ALPHAARG0] = WINED3DTA_CURRENT; + state->texture_states[i][WINED3DTSS_RESULTARG] = WINED3DTA_CURRENT; } - This->lowest_disabled_stage = 1; + state->lowest_disabled_stage = 1; /* Sampler states*/ - for (i = 0 ; i < MAX_COMBINED_SAMPLERS; i++) { - TRACE("Setting up default samplers states for sampler %d\n", i); - This->samplerState[i][WINED3DSAMP_ADDRESSU ] = WINED3DTADDRESS_WRAP; - This->samplerState[i][WINED3DSAMP_ADDRESSV ] = WINED3DTADDRESS_WRAP; - This->samplerState[i][WINED3DSAMP_ADDRESSW ] = WINED3DTADDRESS_WRAP; - This->samplerState[i][WINED3DSAMP_BORDERCOLOR ] = 0x00; - This->samplerState[i][WINED3DSAMP_MAGFILTER ] = WINED3DTEXF_POINT; - This->samplerState[i][WINED3DSAMP_MINFILTER ] = WINED3DTEXF_POINT; - This->samplerState[i][WINED3DSAMP_MIPFILTER ] = WINED3DTEXF_NONE; - This->samplerState[i][WINED3DSAMP_MIPMAPLODBIAS ] = 0; - This->samplerState[i][WINED3DSAMP_MAXMIPLEVEL ] = 0; - This->samplerState[i][WINED3DSAMP_MAXANISOTROPY ] = 1; - This->samplerState[i][WINED3DSAMP_SRGBTEXTURE ] = 0; - This->samplerState[i][WINED3DSAMP_ELEMENTINDEX ] = 0; /* TODO: Indicates which element of a multielement texture to use */ - This->samplerState[i][WINED3DSAMP_DMAPOFFSET ] = 0; /* TODO: Vertex offset in the presampled displacement map */ + for (i = 0 ; i < MAX_COMBINED_SAMPLERS; ++i) + { + TRACE("Setting up default samplers states for sampler %u.\n", i); + state->sampler_states[i][WINED3DSAMP_ADDRESSU] = WINED3DTADDRESS_WRAP; + state->sampler_states[i][WINED3DSAMP_ADDRESSV] = WINED3DTADDRESS_WRAP; + state->sampler_states[i][WINED3DSAMP_ADDRESSW] = WINED3DTADDRESS_WRAP; + state->sampler_states[i][WINED3DSAMP_BORDERCOLOR] = 0; + state->sampler_states[i][WINED3DSAMP_MAGFILTER] = WINED3DTEXF_POINT; + state->sampler_states[i][WINED3DSAMP_MINFILTER] = WINED3DTEXF_POINT; + state->sampler_states[i][WINED3DSAMP_MIPFILTER] = WINED3DTEXF_NONE; + state->sampler_states[i][WINED3DSAMP_MIPMAPLODBIAS] = 0; + state->sampler_states[i][WINED3DSAMP_MAXMIPLEVEL] = 0; + state->sampler_states[i][WINED3DSAMP_MAXANISOTROPY] = 1; + state->sampler_states[i][WINED3DSAMP_SRGBTEXTURE] = 0; + /* TODO: Indicates which element of a multielement texture to use. */ + state->sampler_states[i][WINED3DSAMP_ELEMENTINDEX] = 0; + /* TODO: Vertex offset in the presampled displacement map. */ + state->sampler_states[i][WINED3DSAMP_DMAPOFFSET] = 0; } for (i = 0; i < gl_info->limits.textures; ++i) { - /* Note: This avoids calling SetTexture, so pretend it has been called */ - This->changed.textures |= 1 << i; - This->textures[i] = NULL; + state->textures[i] = NULL; } /* check the return values, because the GetBackBuffer call isn't valid for ddraw */ - hr = IWineD3DDevice_GetSwapChain(device, 0, &swapchain); - if( hr == WINED3D_OK && swapchain != NULL) { - WINED3DVIEWPORT vp; - + hr = IWineD3DDevice_GetSwapChain((IWineD3DDevice *)device, 0, &swapchain); + if (SUCCEEDED(hr) && swapchain) + { hr = IWineD3DSwapChain_GetBackBuffer(swapchain, 0, WINED3DBACKBUFFER_TYPE_MONO, &backbuffer); if (SUCCEEDED(hr) && backbuffer) { WINED3DSURFACE_DESC desc; - RECT scissorrect; IWineD3DSurface_GetDesc(backbuffer, &desc); IWineD3DSurface_Release(backbuffer); /* Set the default scissor rect values */ - scissorrect.left = 0; - scissorrect.right = desc.width; - scissorrect.top = 0; - scissorrect.bottom = desc.height; - hr = IWineD3DDevice_SetScissorRect(device, &scissorrect); - if (FAILED(hr)) ERR("This should never happen, expect rendering issues!\n"); + state->scissor_rect.left = 0; + state->scissor_rect.right = desc.width; + state->scissor_rect.top = 0; + state->scissor_rect.bottom = desc.height; } /* Set the default viewport */ - vp.X = 0; - vp.Y = 0; - vp.Width = ((IWineD3DSwapChainImpl *)swapchain)->presentParms.BackBufferWidth; - vp.Height = ((IWineD3DSwapChainImpl *)swapchain)->presentParms.BackBufferHeight; - vp.MinZ = 0.0f; - vp.MaxZ = 1.0f; - IWineD3DDevice_SetViewport(device, &vp); + state->viewport.X = 0; + state->viewport.Y = 0; + state->viewport.Width = ((IWineD3DSwapChainImpl *)swapchain)->presentParms.BackBufferWidth; + state->viewport.Height = ((IWineD3DSwapChainImpl *)swapchain)->presentParms.BackBufferHeight; + state->viewport.MinZ = 0.0f; + state->viewport.MaxZ = 1.0f; IWineD3DSwapChain_Release(swapchain); } - TRACE("-----------------------> Device defaults now set up...\n"); - return WINED3D_OK; + TRACE("Done.\n"); } /********************************************************** @@ -1319,7 +1339,6 @@ static const IWineD3DStateBlockVtbl IWineD3DStateBlock_Vtbl = /* IWineD3DStateBlock */ IWineD3DStateBlockImpl_Capture, IWineD3DStateBlockImpl_Apply, - IWineD3DStateBlockImpl_InitStartupStateBlock }; HRESULT stateblock_init(IWineD3DStateBlockImpl *stateblock, IWineD3DDeviceImpl *device, WINED3DSTATEBLOCKTYPE type) @@ -1334,7 +1353,7 @@ HRESULT stateblock_init(IWineD3DStateBlockImpl *stateblock, IWineD3DDeviceImpl * for (i = 0; i < LIGHTMAP_SIZE; i++) { - list_init(&stateblock->lightMap[i]); + list_init(&stateblock->state.light_map[i]); } hr = stateblock_allocate_shader_constants(stateblock); @@ -1350,7 +1369,7 @@ HRESULT stateblock_init(IWineD3DStateBlockImpl *stateblock, IWineD3DDeviceImpl * switch (type) { case WINED3DSBT_ALL: - stateblock_init_lights(stateblock, device->stateBlock->lightMap); + stateblock_init_lights(stateblock, device->stateBlock->state.light_map); stateblock_savedstates_set_all(&stateblock->changed, device->d3d_vshader_constantF, device->d3d_pshader_constantF); break; @@ -1360,7 +1379,7 @@ HRESULT stateblock_init(IWineD3DStateBlockImpl *stateblock, IWineD3DDeviceImpl * break; case WINED3DSBT_VERTEXSTATE: - stateblock_init_lights(stateblock, device->stateBlock->lightMap); + stateblock_init_lights(stateblock, device->stateBlock->state.light_map); stateblock_savedstates_set_vertex(&stateblock->changed, device->d3d_vshader_constantF); break; diff --git a/dll/directx/wine/wined3d/surface.c b/dll/directx/wine/wined3d/surface.c index 0903f6eecaf..442ce757920 100644 --- a/dll/directx/wine/wined3d/surface.c +++ b/dll/directx/wine/wined3d/surface.c @@ -36,45 +36,43 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d); static void surface_cleanup(IWineD3DSurfaceImpl *This) { - IWineD3DDeviceImpl *device = This->resource.device; - const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - struct wined3d_context *context = NULL; - renderbuffer_entry_t *entry, *entry2; - TRACE("(%p) : Cleaning up.\n", This); - /* Need a context to destroy the texture. Use the currently active render - * target, but only if the primary render target exists. Otherwise - * lastActiveRenderTarget is garbage. When destroying the primary render - * target, Uninit3D() will activate a context before doing anything. */ - if (device->render_targets && device->render_targets[0]) + if (This->texture_name || (This->Flags & SFLAG_PBO) || !list_empty(&This->renderbuffers)) { - context = context_acquire(device, NULL); + const struct wined3d_gl_info *gl_info; + renderbuffer_entry_t *entry, *entry2; + struct wined3d_context *context; + + context = context_acquire(This->resource.device, NULL); + gl_info = context->gl_info; + + ENTER_GL(); + + if (This->texture_name) + { + TRACE("Deleting texture %u.\n", This->texture_name); + glDeleteTextures(1, &This->texture_name); + } + + if (This->Flags & SFLAG_PBO) + { + TRACE("Deleting PBO %u.\n", This->pbo); + GL_EXTCALL(glDeleteBuffersARB(1, &This->pbo)); + } + + LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &This->renderbuffers, renderbuffer_entry_t, entry) + { + TRACE("Deleting renderbuffer %u.\n", entry->id); + gl_info->fbo_ops.glDeleteRenderbuffers(1, &entry->id); + HeapFree(GetProcessHeap(), 0, entry); + } + + LEAVE_GL(); + + context_release(context); } - ENTER_GL(); - - if (This->texture_name) - { - /* Release the OpenGL texture. */ - TRACE("Deleting texture %u.\n", This->texture_name); - glDeleteTextures(1, &This->texture_name); - } - - if (This->Flags & SFLAG_PBO) - { - /* Delete the PBO. */ - GL_EXTCALL(glDeleteBuffersARB(1, &This->pbo)); - } - - LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &This->renderbuffers, renderbuffer_entry_t, entry) - { - gl_info->fbo_ops.glDeleteRenderbuffers(1, &entry->id); - HeapFree(GetProcessHeap(), 0, entry); - } - - LEAVE_GL(); - if (This->Flags & SFLAG_DIBSECTION) { /* Release the DC. */ @@ -92,33 +90,39 @@ static void surface_cleanup(IWineD3DSurfaceImpl *This) HeapFree(GetProcessHeap(), 0, This->palette9); resource_cleanup((IWineD3DResource *)This); - - if (context) context_release(context); } -UINT surface_calculate_size(const struct wined3d_format_desc *format_desc, UINT alignment, UINT width, UINT height) +void surface_set_container(IWineD3DSurfaceImpl *surface, enum wined3d_container_type type, IWineD3DBase *container) { - UINT size; + TRACE("surface %p, container %p.\n", surface, container); - if (format_desc->format == WINED3DFMT_UNKNOWN) + if (!container && type != WINED3D_CONTAINER_NONE) + ERR("Setting NULL container of type %#x.\n", type); + + if (type == WINED3D_CONTAINER_SWAPCHAIN) { - size = 0; - } - else if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) - { - UINT row_block_count = (width + format_desc->block_width - 1) / format_desc->block_width; - UINT row_count = (height + format_desc->block_height - 1) / format_desc->block_height; - size = row_count * row_block_count * format_desc->block_byte_count; + surface->get_drawable_size = get_drawable_size_swapchain; } else { - /* The pitch is a multiple of 4 bytes. */ - size = height * (((width * format_desc->byte_count) + alignment - 1) & ~(alignment - 1)); + switch (wined3d_settings.offscreen_rendering_mode) + { + case ORM_FBO: + surface->get_drawable_size = get_drawable_size_fbo; + break; + + case ORM_BACKBUFFER: + surface->get_drawable_size = get_drawable_size_backbuffer; + break; + + default: + ERR("Unhandled offscreen rendering mode %#x.\n", wined3d_settings.offscreen_rendering_mode); + return; + } } - if (format_desc->heightscale != 0.0f) size *= format_desc->heightscale; - - return size; + surface->container.type = type; + surface->container.u.base = container; } struct blt_info @@ -287,7 +291,6 @@ static inline void surface_get_rect(IWineD3DSurfaceImpl *This, const RECT *rect_ /* GL locking and context activation is done by the caller */ void draw_textured_quad(IWineD3DSurfaceImpl *src_surface, const RECT *src_rect, const RECT *dst_rect, WINED3DTEXTUREFILTERTYPE Filter) { - IWineD3DBaseTextureImpl *texture; struct blt_info info; surface_get_blt_info(src_surface->texture_target, src_rect, src_surface->pow2Width, src_surface->pow2Height, &info); @@ -332,22 +335,22 @@ void draw_textured_quad(IWineD3DSurfaceImpl *src_surface, const RECT *src_rect, /* We changed the filtering settings on the texture. Inform the * container about this to get the filters reset properly next draw. */ - if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)src_surface, &IID_IWineD3DBaseTexture, (void **)&texture))) + if (src_surface->container.type == WINED3D_CONTAINER_TEXTURE) { + IWineD3DBaseTextureImpl *texture = src_surface->container.u.texture; texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT; texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE; - IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture); } } HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, UINT alignment, UINT width, UINT height, UINT level, BOOL lockable, BOOL discard, WINED3DMULTISAMPLE_TYPE multisample_type, - UINT multisample_quality, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, - WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + UINT multisample_quality, IWineD3DDeviceImpl *device, DWORD usage, enum wined3d_format_id format_id, + WINED3DPOOL pool, void *parent, const struct wined3d_parent_ops *parent_ops) { const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info); + const struct wined3d_format *format = wined3d_get_format(gl_info, format_id); void (*cleanup)(IWineD3DSurfaceImpl *This); unsigned int resource_size; HRESULT hr; @@ -360,7 +363,7 @@ HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, /* FIXME: Check that the format is supported by the device. */ - resource_size = surface_calculate_size(format_desc, alignment, width, height); + resource_size = wined3d_format_calculate_size(format, alignment, width, height); /* Look at the implementation and set the correct Vtable. */ switch (surface_type) @@ -381,7 +384,7 @@ HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, } hr = resource_init((IWineD3DResource *)surface, WINED3DRTYPE_SURFACE, - device, resource_size, usage, format_desc, pool, parent, parent_ops); + device, resource_size, usage, format, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize resource, returning %#x.\n", hr); @@ -389,7 +392,7 @@ HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, } /* "Standalone" surface. */ - IWineD3DSurface_SetContainer((IWineD3DSurface *)surface, NULL); + surface_set_container(surface, WINED3D_CONTAINER_NONE, NULL); surface->currentDesc.Width = width; surface->currentDesc.Height = height; @@ -401,7 +404,7 @@ HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, /* Flags */ surface->Flags = SFLAG_NORMCOORD; /* Default to normalized coords. */ if (discard) surface->Flags |= SFLAG_DISCARD; - if (lockable || format == WINED3DFMT_D16_LOCKABLE) surface->Flags |= SFLAG_LOCKABLE; + if (lockable || format_id == WINED3DFMT_D16_LOCKABLE) surface->Flags |= SFLAG_LOCKABLE; /* Quick lockable sanity check. * TODO: remove this after surfaces, usage and lockability have been debugged properly @@ -489,8 +492,8 @@ void surface_set_texture_name(IWineD3DSurfaceImpl *surface, GLuint new_name, BOO /* FIXME: We shouldn't need to remove SFLAG_INTEXTURE if the * surface has no texture name yet. See if we can get rid of this. */ if (surface->Flags & flag) - ERR("Surface has SFLAG_INTEXTURE set, but no texture name\n"); - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, flag, FALSE); + ERR("Surface has %s set, but no texture name.\n", debug_surflocation(flag)); + surface_modify_location(surface, flag, FALSE); } *name = new_name; @@ -551,7 +554,7 @@ static BOOL primary_render_target_is_p8(IWineD3DDeviceImpl *device) { IWineD3DSurfaceImpl *render_target = device->render_targets[0]; if ((render_target->resource.usage & WINED3DUSAGE_RENDERTARGET) - && (render_target->resource.format_desc->format == WINED3DFMT_P8_UINT)) + && (render_target->resource.format->id == WINED3DFMT_P8_UINT)) return TRUE; } return FALSE; @@ -562,21 +565,21 @@ static BOOL primary_render_target_is_p8(IWineD3DDeviceImpl *device) /* Context activation is done by the caller. */ static void surface_download_data(IWineD3DSurfaceImpl *This, const struct wined3d_gl_info *gl_info) { - const struct wined3d_format_desc *format_desc = This->resource.format_desc; + const struct wined3d_format *format = This->resource.format; /* Only support read back of converted P8 surfaces */ - if (This->Flags & SFLAG_CONVERTED && format_desc->format != WINED3DFMT_P8_UINT) + if (This->Flags & SFLAG_CONVERTED && format->id != WINED3DFMT_P8_UINT) { - FIXME("Read back converted textures unsupported, format=%s\n", debug_d3dformat(format_desc->format)); + FIXME("Readback conversion not supported for format %s.\n", debug_d3dformat(format->id)); return; } ENTER_GL(); - if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + if (format->Flags & WINED3DFMT_FLAG_COMPRESSED) { TRACE("(%p) : Calling glGetCompressedTexImageARB level %d, format %#x, type %#x, data %p.\n", - This, This->texture_level, format_desc->glFormat, format_desc->glType, + This, This->texture_level, format->glFormat, format->glType, This->resource.allocatedMemory); if (This->Flags & SFLAG_PBO) @@ -598,21 +601,21 @@ static void surface_download_data(IWineD3DSurfaceImpl *This, const struct wined3 LEAVE_GL(); } else { void *mem; - GLenum format = format_desc->glFormat; - GLenum type = format_desc->glType; + GLenum gl_format = format->glFormat; + GLenum gl_type = format->glType; int src_pitch = 0; int dst_pitch = 0; /* In case of P8 the index is stored in the alpha component if the primary render target uses P8 */ - if (format_desc->format == WINED3DFMT_P8_UINT && primary_render_target_is_p8(This->resource.device)) + if (format->id == WINED3DFMT_P8_UINT && primary_render_target_is_p8(This->resource.device)) { - format = GL_ALPHA; - type = GL_UNSIGNED_BYTE; + gl_format = GL_ALPHA; + gl_type = GL_UNSIGNED_BYTE; } if (This->Flags & SFLAG_NONPOW2) { unsigned char alignment = This->resource.device->surface_alignment; - src_pitch = format_desc->byte_count * This->pow2Width; + src_pitch = format->byte_count * This->pow2Width; dst_pitch = IWineD3DSurface_GetPitch((IWineD3DSurface *) This); src_pitch = (src_pitch + alignment - 1) & ~(alignment - 1); mem = HeapAlloc(GetProcessHeap(), 0, src_pitch * This->pow2Height); @@ -621,19 +624,19 @@ static void surface_download_data(IWineD3DSurfaceImpl *This, const struct wined3 } TRACE("(%p) : Calling glGetTexImage level %d, format %#x, type %#x, data %p\n", - This, This->texture_level, format, type, mem); + This, This->texture_level, gl_format, gl_type, mem); if(This->Flags & SFLAG_PBO) { GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, This->pbo)); checkGLcall("glBindBufferARB"); - glGetTexImage(This->texture_target, This->texture_level, format, type, NULL); + glGetTexImage(This->texture_target, This->texture_level, gl_format, gl_type, NULL); checkGLcall("glGetTexImage"); GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0)); checkGLcall("glBindBufferARB"); } else { - glGetTexImage(This->texture_target, This->texture_level, format, type, mem); + glGetTexImage(This->texture_target, This->texture_level, gl_format, gl_type, mem); checkGLcall("glGetTexImage"); } LEAVE_GL(); @@ -714,7 +717,7 @@ static void surface_download_data(IWineD3DSurfaceImpl *This, const struct wined3 * correct texture. */ /* Context activation is done by the caller. */ static void surface_upload_data(IWineD3DSurfaceImpl *This, const struct wined3d_gl_info *gl_info, - const struct wined3d_format_desc *format_desc, BOOL srgb, const GLvoid *data) + const struct wined3d_format *format, BOOL srgb, const GLvoid *data) { GLsizei width = This->currentDesc.Width; GLsizei height = This->currentDesc.Height; @@ -722,23 +725,23 @@ static void surface_upload_data(IWineD3DSurfaceImpl *This, const struct wined3d_ if (srgb) { - internal = format_desc->glGammaInternal; + internal = format->glGammaInternal; } else if (This->resource.usage & WINED3DUSAGE_RENDERTARGET && surface_is_offscreen(This)) { - internal = format_desc->rtInternal; + internal = format->rtInternal; } else { - internal = format_desc->glInternal; + internal = format->glInternal; } TRACE("This %p, internal %#x, width %d, height %d, format %#x, type %#x, data %p.\n", - This, internal, width, height, format_desc->glFormat, format_desc->glType, data); + This, internal, width, height, format->glFormat, format->glType, data); TRACE("target %#x, level %u, resource size %u.\n", This->texture_target, This->texture_level, This->resource.size); - if (format_desc->heightscale != 1.0f && format_desc->heightscale != 0.0f) height *= format_desc->heightscale; + if (format->heightscale != 1.0f && format->heightscale != 0.0f) height *= format->heightscale; ENTER_GL(); @@ -751,7 +754,7 @@ static void surface_upload_data(IWineD3DSurfaceImpl *This, const struct wined3d_ data = NULL; } - if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + if (format->Flags & WINED3DFMT_FLAG_COMPRESSED) { TRACE("Calling glCompressedTexSubImage2DARB.\n"); @@ -764,7 +767,7 @@ static void surface_upload_data(IWineD3DSurfaceImpl *This, const struct wined3d_ TRACE("Calling glTexSubImage2D.\n"); glTexSubImage2D(This->texture_target, This->texture_level, - 0, 0, width, height, format_desc->glFormat, format_desc->glType, data); + 0, 0, width, height, format->glFormat, format->glType, data); checkGLcall("glTexSubImage2D"); } @@ -792,7 +795,7 @@ static void surface_upload_data(IWineD3DSurfaceImpl *This, const struct wined3d_ * the correct texture. */ /* Context activation is done by the caller. */ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, const struct wined3d_gl_info *gl_info, - const struct wined3d_format_desc *format_desc, BOOL srgb) + const struct wined3d_format *format, BOOL srgb) { BOOL enable_client_storage = FALSE; GLsizei width = This->pow2Width; @@ -802,28 +805,30 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, const struct win if (srgb) { - internal = format_desc->glGammaInternal; + internal = format->glGammaInternal; } else if (This->resource.usage & WINED3DUSAGE_RENDERTARGET && surface_is_offscreen(This)) { - internal = format_desc->rtInternal; + internal = format->rtInternal; } else { - internal = format_desc->glInternal; + internal = format->glInternal; } - if (format_desc->heightscale != 1.0f && format_desc->heightscale != 0.0f) height *= format_desc->heightscale; + if (format->heightscale != 1.0f && format->heightscale != 0.0f) height *= format->heightscale; TRACE("(%p) : Creating surface (target %#x) level %d, d3d format %s, internal format %#x, width %d, height %d, gl format %#x, gl type=%#x\n", - This, This->texture_target, This->texture_level, debug_d3dformat(format_desc->format), - internal, width, height, format_desc->glFormat, format_desc->glType); + This, This->texture_target, This->texture_level, debug_d3dformat(format->id), + internal, width, height, format->glFormat, format->glType); ENTER_GL(); if (gl_info->supported[APPLE_CLIENT_STORAGE]) { - if(This->Flags & (SFLAG_NONPOW2 | SFLAG_DIBSECTION | SFLAG_CONVERTED) || This->resource.allocatedMemory == NULL) { + if (This->Flags & (SFLAG_NONPOW2 | SFLAG_DIBSECTION | SFLAG_CONVERTED) + || !This->resource.allocatedMemory) + { /* In some cases we want to disable client storage. * SFLAG_NONPOW2 has a bigger opengl texture than the client memory, and different pitches * SFLAG_DIBSECTION: Dibsections may have read / write protections on the memory. Avoid issues... @@ -844,15 +849,16 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, const struct win } } - if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED && mem) + if (format->Flags & WINED3DFMT_FLAG_COMPRESSED && mem) { GL_EXTCALL(glCompressedTexImage2DARB(This->texture_target, This->texture_level, internal, width, height, 0, This->resource.size, mem)); + checkGLcall("glCompressedTexImage2DARB"); } else { glTexImage2D(This->texture_target, This->texture_level, - internal, width, height, 0, format_desc->glFormat, format_desc->glType, mem); + internal, width, height, 0, format->glFormat, format->glType, mem); checkGLcall("glTexImage2D"); } @@ -904,7 +910,7 @@ void surface_set_compatible_renderbuffer(IWineD3DSurfaceImpl *surface, unsigned gl_info->fbo_ops.glGenRenderbuffers(1, &renderbuffer); gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer); gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, - surface->resource.format_desc->glInternal, width, height); + surface->resource.format->glInternal, width, height); entry = HeapAlloc(GetProcessHeap(), 0, sizeof(renderbuffer_entry_t)); entry->width = width; @@ -920,11 +926,11 @@ void surface_set_compatible_renderbuffer(IWineD3DSurfaceImpl *surface, unsigned GLenum surface_get_gl_buffer(IWineD3DSurfaceImpl *surface) { - IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)surface->container; + IWineD3DSwapChainImpl *swapchain = surface->container.u.swapchain; TRACE("surface %p.\n", surface); - if (!(surface->Flags & SFLAG_SWAPCHAIN)) + if (surface->container.type != WINED3D_CONTAINER_SWAPCHAIN) { ERR("Surface %p is not on a swapchain.\n", surface); return GL_NONE; @@ -953,15 +959,13 @@ GLenum surface_get_gl_buffer(IWineD3DSurfaceImpl *surface) /* Slightly inefficient way to handle multiple dirty rects but it works :) */ void surface_add_dirty_rect(IWineD3DSurfaceImpl *surface, const RECT *dirty_rect) { - IWineD3DBaseTexture *baseTexture = NULL; - TRACE("surface %p, dirty_rect %s.\n", surface, wine_dbgstr_rect(dirty_rect)); if (!(surface->Flags & SFLAG_INSYSMEM) && (surface->Flags & SFLAG_INTEXTURE)) /* No partial locking for textures yet. */ - IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, NULL); + surface_load_location(surface, SFLAG_INSYSMEM, NULL); - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, TRUE); + surface_modify_location(surface, SFLAG_INSYSMEM, TRUE); if (dirty_rect) { surface->dirtyRect.left = min(surface->dirtyRect.left, dirty_rect->left); @@ -978,70 +982,67 @@ void surface_add_dirty_rect(IWineD3DSurfaceImpl *surface, const RECT *dirty_rect } /* if the container is a basetexture then mark it dirty. */ - if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface, - &IID_IWineD3DBaseTexture, (void **)&baseTexture))) + if (surface->container.type == WINED3D_CONTAINER_TEXTURE) { - TRACE("Passing to container\n"); - IWineD3DBaseTexture_SetDirty(baseTexture, TRUE); - IWineD3DBaseTexture_Release(baseTexture); + TRACE("Passing to container.\n"); + IWineD3DBaseTexture_SetDirty((IWineD3DBaseTexture *)surface->container.u.texture, TRUE); } } -static BOOL surface_convert_color_to_argb(IWineD3DSurfaceImpl *This, DWORD color, DWORD *argb_color) +static BOOL surface_convert_color_to_float(IWineD3DSurfaceImpl *surface, DWORD color, WINED3DCOLORVALUE *float_color) { - IWineD3DDeviceImpl *device = This->resource.device; + const struct wined3d_format *format = surface->resource.format; + IWineD3DDeviceImpl *device = surface->resource.device; - switch(This->resource.format_desc->format) + switch (format->id) { case WINED3DFMT_P8_UINT: + if (surface->palette) { - DWORD alpha; - - if (primary_render_target_is_p8(device)) - alpha = color << 24; - else - alpha = 0xFF000000; - - if (This->palette) { - *argb_color = (alpha | - (This->palette->palents[color].peRed << 16) | - (This->palette->palents[color].peGreen << 8) | - (This->palette->palents[color].peBlue)); - } else { - *argb_color = alpha; - } + float_color->r = surface->palette->palents[color].peRed / 255.0f; + float_color->g = surface->palette->palents[color].peGreen / 255.0f; + float_color->b = surface->palette->palents[color].peBlue / 255.0f; } + else + { + float_color->r = 0.0f; + float_color->g = 0.0f; + float_color->b = 0.0f; + } + float_color->a = primary_render_target_is_p8(device) ? color / 255.0f : 1.0f; break; case WINED3DFMT_B5G6R5_UNORM: - { - if (color == 0xFFFF) { - *argb_color = 0xFFFFFFFF; - } else { - *argb_color = ((0xFF000000) | - ((color & 0xF800) << 8) | - ((color & 0x07E0) << 5) | - ((color & 0x001F) << 3)); - } - } + float_color->r = ((color >> 11) & 0x1f) / 31.0f; + float_color->g = ((color >> 5) & 0x3f) / 63.0f; + float_color->b = (color & 0x1f) / 31.0f; + float_color->a = 1.0f; break; case WINED3DFMT_B8G8R8_UNORM: case WINED3DFMT_B8G8R8X8_UNORM: - *argb_color = 0xFF000000 | color; + float_color->r = D3DCOLOR_R(color); + float_color->g = D3DCOLOR_G(color); + float_color->b = D3DCOLOR_B(color); + float_color->a = 1.0f; break; case WINED3DFMT_B8G8R8A8_UNORM: - *argb_color = color; + float_color->r = D3DCOLOR_R(color); + float_color->g = D3DCOLOR_G(color); + float_color->b = D3DCOLOR_B(color); + float_color->a = D3DCOLOR_A(color); break; default: - ERR("Unhandled conversion from %s to ARGB!\n", debug_d3dformat(This->resource.format_desc->format)); + ERR("Unhandled conversion from %s to floating point.\n", debug_d3dformat(format->id)); return FALSE; } + return TRUE; } +/* Do not call while under the GL lock. */ static ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface) { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; @@ -1064,37 +1065,38 @@ static ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface) IWineD3DSurface IWineD3DResource parts follow **************************************************** */ +/* Do not call while under the GL lock. */ void surface_internal_preload(IWineD3DSurfaceImpl *surface, enum WINED3DSRGB srgb) { - /* TODO: check for locks */ IWineD3DDeviceImpl *device = surface->resource.device; - IWineD3DBaseTexture *baseTexture = NULL; - TRACE("(%p)Checking to see if the container is a base texture\n", surface); - if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface, - &IID_IWineD3DBaseTexture, (void **)&baseTexture))) + TRACE("iface %p, srgb %#x.\n", surface, srgb); + + if (surface->container.type == WINED3D_CONTAINER_TEXTURE) + { + IWineD3DBaseTextureImpl *texture = surface->container.u.texture; + + TRACE("Passing to container.\n"); + texture->baseTexture.internal_preload((IWineD3DBaseTexture *)texture, srgb); + } + else { - IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *)baseTexture; - TRACE("Passing to container\n"); - tex_impl->baseTexture.internal_preload(baseTexture, srgb); - IWineD3DBaseTexture_Release(baseTexture); - } else { struct wined3d_context *context = NULL; TRACE("(%p) : About to load surface\n", surface); if (!device->isInDraw) context = context_acquire(device, NULL); - if (surface->resource.format_desc->format == WINED3DFMT_P8_UINT - || surface->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM) + if (surface->resource.format->id == WINED3DFMT_P8_UINT + || surface->resource.format->id == WINED3DFMT_P8_UINT_A8_UNORM) { if (palette9_changed(surface)) { TRACE("Reloading surface because the d3d8/9 palette was changed\n"); /* TODO: This is not necessarily needed with hw palettized texture support */ - IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, NULL); + surface_load_location(surface, SFLAG_INSYSMEM, NULL); /* Make sure the texture is reloaded because of the palette change, this kills performance though :( */ - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INTEXTURE, FALSE); + surface_modify_location(surface, SFLAG_INTEXTURE, FALSE); } } @@ -1158,12 +1160,14 @@ BOOL surface_init_sysmem(IWineD3DSurfaceImpl *surface) memset(surface->resource.allocatedMemory, 0, surface->resource.size); } - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, TRUE); + surface_modify_location(surface, SFLAG_INSYSMEM, TRUE); + return TRUE; } -static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) { - IWineD3DBaseTexture *texture = NULL; +/* Do not call while under the GL lock. */ +static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) +{ IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; IWineD3DDeviceImpl *device = This->resource.device; const struct wined3d_gl_info *gl_info; @@ -1188,11 +1192,11 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) { else { /* Load the surface into system memory */ - IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL); - IWineD3DSurface_ModifyLocation(iface, SFLAG_INDRAWABLE, FALSE); + surface_load_location(This, SFLAG_INSYSMEM, NULL); + surface_modify_location(This, SFLAG_INDRAWABLE, FALSE); } - IWineD3DSurface_ModifyLocation(iface, SFLAG_INTEXTURE, FALSE); - IWineD3DSurface_ModifyLocation(iface, SFLAG_INSRGBTEX, FALSE); + surface_modify_location(This, SFLAG_INTEXTURE, FALSE); + surface_modify_location(This, SFLAG_INSRGBTEX, FALSE); This->Flags &= ~(SFLAG_ALLOCATED | SFLAG_SRGBALLOCATED); context = context_acquire(device, NULL); @@ -1216,22 +1220,21 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) { list_init(&This->renderbuffers); This->current_renderbuffer = NULL; - /* If we're in a texture, the texture name belongs to the texture. Otherwise, - * destroy it - */ - IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **) &texture); - if(!texture) { + /* If we're in a texture, the texture name belongs to the texture. + * Otherwise, destroy it. */ + if (This->container.type != WINED3D_CONTAINER_TEXTURE) + { ENTER_GL(); glDeleteTextures(1, &This->texture_name); This->texture_name = 0; glDeleteTextures(1, &This->texture_name_srgb); This->texture_name_srgb = 0; LEAVE_GL(); - } else { - IWineD3DBaseTexture_Release(texture); } context_release(context); + + resource_unload((IWineD3DResourceImpl *)This); } /* ****************************************************** @@ -1310,7 +1313,7 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v } /* TODO: Get rid of the extra GetPitch call, LockRect does that too. Cache the pitch */ - switch(This->resource.format_desc->format) + switch (This->resource.format->id) { case WINED3DFMT_P8_UINT: { @@ -1320,7 +1323,7 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v fmt = GL_ALPHA; type = GL_UNSIGNED_BYTE; mem = dest; - bpp = This->resource.format_desc->byte_count; + bpp = This->resource.format->byte_count; } else { /* GL can't return palettized data, so read ARGB pixels into a * separate block of memory and convert them into palettized format @@ -1340,22 +1343,23 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v LEAVE_GL(); return; } - bpp = This->resource.format_desc->byte_count * 3; + bpp = This->resource.format->byte_count * 3; } } break; default: mem = dest; - fmt = This->resource.format_desc->glFormat; - type = This->resource.format_desc->glType; - bpp = This->resource.format_desc->byte_count; + fmt = This->resource.format->glFormat; + type = This->resource.format->glType; + bpp = This->resource.format->byte_count; } if(This->Flags & SFLAG_PBO) { GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, This->pbo)); checkGLcall("glBindBufferARB"); - if(mem != NULL) { + if (mem) + { ERR("mem not null for pbo -- unexpected\n"); mem = NULL; } @@ -1419,7 +1423,7 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v row = HeapAlloc(GetProcessHeap(), 0, len); if(!row) { ERR("Out of memory\n"); - if (This->resource.format_desc->format == WINED3DFMT_P8_UINT) HeapFree(GetProcessHeap(), 0, mem); + if (This->resource.format->id == WINED3DFMT_P8_UINT) HeapFree(GetProcessHeap(), 0, mem); LEAVE_GL(); return; } @@ -1450,7 +1454,7 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v * the same color but we have no choice. * In case of P8 render targets, the index is stored in the alpha component so no conversion is needed. */ - if (This->resource.format_desc->format == WINED3DFMT_P8_UINT && !primary_render_target_is_p8(device)) + if (This->resource.format->id == WINED3DFMT_P8_UINT && !primary_render_target_is_p8(device)) { const PALETTEENTRY *pal = NULL; DWORD width = pitch / 3; @@ -1492,7 +1496,15 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb) IWineD3DDeviceImpl *device = This->resource.device; const struct wined3d_gl_info *gl_info; struct wined3d_context *context; - GLint prevRead; + + if (!surface_is_offscreen(This)) + { + /* We would need to flip onscreen surfaces, but there's no efficient + * way to do that here. It makes more sense for the caller to + * explicitly go through sysmem. */ + ERR("Not supported for onscreen targets.\n"); + return; + } /* Activate the surface to read from. In some situations it isn't the currently active target(e.g. backbuffer * locking during offscreen rendering). RESOURCELOAD is ok because glCopyTexSubImage2D isn't affected by any @@ -1504,55 +1516,20 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb) surface_prepare_texture(This, gl_info, srgb); surface_bind_and_dirtify(This, srgb); - ENTER_GL(); - glGetIntegerv(GL_READ_BUFFER, &prevRead); - LEAVE_GL(); - - /* Select the correct read buffer, and give some debug output. - * There is no need to keep track of the current read buffer or reset it, every part of the code - * that reads sets the read buffer as desired. - */ - if (!surface_is_offscreen(This)) - { - GLenum buffer = surface_get_gl_buffer(This); - TRACE("Locking %#x buffer\n", buffer); - - ENTER_GL(); - glReadBuffer(buffer); - checkGLcall("glReadBuffer"); - LEAVE_GL(); - } - else - { - /* Locking the primary render target which is not on a swapchain(=offscreen render target). - * Read from the back buffer - */ - TRACE("Locking offscreen render target\n"); - ENTER_GL(); - glReadBuffer(device->offscreenBuffer); - checkGLcall("glReadBuffer"); - LEAVE_GL(); - } + TRACE("Reading back offscreen render target %p.\n", This); ENTER_GL(); - /* If !SrcIsUpsideDown we should flip the surface. - * This can be done using glCopyTexSubImage2D but this - * is VERY slow, so don't do that. We should prevent - * this code from getting called in such cases or perhaps - * we can use FBOs */ + + glReadBuffer(device->offscreenBuffer); + checkGLcall("glReadBuffer"); glCopyTexSubImage2D(This->texture_target, This->texture_level, 0, 0, 0, 0, This->currentDesc.Width, This->currentDesc.Height); checkGLcall("glCopyTexSubImage2D"); - glReadBuffer(prevRead); - checkGLcall("glReadBuffer"); - LEAVE_GL(); context_release(context); - - TRACE("Updated target %d\n", This->texture_target); } /* Context activation is done by the caller. */ @@ -1561,27 +1538,25 @@ static void surface_prepare_texture_internal(IWineD3DSurfaceImpl *surface, { DWORD alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED; CONVERT_TYPES convert; - struct wined3d_format_desc desc; + struct wined3d_format format; if (surface->Flags & alloc_flag) return; - d3dfmt_get_conv(surface, TRUE, TRUE, &desc, &convert); - if(convert != NO_CONVERSION || desc.convert) surface->Flags |= SFLAG_CONVERTED; + d3dfmt_get_conv(surface, TRUE, TRUE, &format, &convert); + if (convert != NO_CONVERSION || format.convert) surface->Flags |= SFLAG_CONVERTED; else surface->Flags &= ~SFLAG_CONVERTED; surface_bind_and_dirtify(surface, srgb); - surface_allocate_surface(surface, gl_info, &desc, srgb); + surface_allocate_surface(surface, gl_info, &format, srgb); surface->Flags |= alloc_flag; } /* Context activation is done by the caller. */ void surface_prepare_texture(IWineD3DSurfaceImpl *surface, const struct wined3d_gl_info *gl_info, BOOL srgb) { - IWineD3DBaseTextureImpl *texture; - - if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface, - &IID_IWineD3DBaseTexture, (void **)&texture))) + if (surface->container.type == WINED3D_CONTAINER_TEXTURE) { + IWineD3DBaseTextureImpl *texture = surface->container.u.texture; UINT sub_count = texture->baseTexture.level_count * texture->baseTexture.layer_count; UINT i; @@ -1593,7 +1568,7 @@ void surface_prepare_texture(IWineD3DSurfaceImpl *surface, const struct wined3d_ surface_prepare_texture_internal(s, gl_info, srgb); } - IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture); + return; } surface_prepare_texture_internal(surface, gl_info, srgb); @@ -1632,9 +1607,8 @@ static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This) GL_EXTCALL(glGenBuffersARB(1, &This->pbo)); error = glGetError(); - if(This->pbo == 0 || error != GL_NO_ERROR) { + if (!This->pbo || error != GL_NO_ERROR) ERR("Failed to bind the PBO with error %s (%#x)\n", debug_glerror(error), error); - } TRACE("Attaching pbo=%#x to (%p)\n", This->pbo, This); @@ -1710,9 +1684,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED goto lock_end; } - /* IWineD3DSurface_LoadLocation() does not check if the rectangle specifies + /* surface_load_location() does not check if the rectangle specifies * the full surface. Most callers don't need that, so do it here. */ - if (pRect && pRect->top == 0 && pRect->left == 0 + if (pRect && !pRect->top && !pRect->left && pRect->right == This->currentDesc.Width && pRect->bottom == This->currentDesc.Height) { @@ -1720,9 +1694,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED } if (!(wined3d_settings.rendertargetlock_mode == RTL_DISABLE - && ((This->Flags & SFLAG_SWAPCHAIN) || This == device->render_targets[0]))) + && ((This->container.type == WINED3D_CONTAINER_SWAPCHAIN) || This == device->render_targets[0]))) { - IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, pass_rect); + surface_load_location(This, SFLAG_INSYSMEM, pass_rect); } lock_end: @@ -1756,20 +1730,18 @@ lock_end: if (Flags & (WINED3DLOCK_NO_DIRTY_UPDATE | WINED3DLOCK_READONLY)) { /* Don't dirtify */ - } else { - IWineD3DBaseTexture *pBaseTexture; - /** - * Dirtify on lock - * as seen in msdn docs - */ + } + else + { surface_add_dirty_rect(This, pRect); - /** Dirtify Container if needed */ - if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&pBaseTexture))) { - TRACE("Making container dirty\n"); - IWineD3DBaseTexture_SetDirty(pBaseTexture, TRUE); - IWineD3DBaseTexture_Release(pBaseTexture); - } else { + if (This->container.type == WINED3D_CONTAINER_TEXTURE) + { + TRACE("Making container dirty.\n"); + IWineD3DBaseTexture_SetDirty((IWineD3DBaseTexture *)This->container.u.texture, TRUE); + } + else + { TRACE("Surface is standalone, no need to dirty the container\n"); } } @@ -1912,7 +1884,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) { goto unlock_end; } - if ((This->Flags & SFLAG_SWAPCHAIN) || (device->render_targets && This == device->render_targets[0])) + if (This->container.type == WINED3D_CONTAINER_SWAPCHAIN + || (device->render_targets && This == device->render_targets[0])) { if(wined3d_settings.rendertargetlock_mode == RTL_DISABLE) { static BOOL warned = FALSE; @@ -1923,10 +1896,10 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) { goto unlock_end; } - if(This->dirtyRect.left == 0 && - This->dirtyRect.top == 0 && - This->dirtyRect.right == This->currentDesc.Width && - This->dirtyRect.bottom == This->currentDesc.Height) { + if (!This->dirtyRect.left && !This->dirtyRect.top + && This->dirtyRect.right == This->currentDesc.Width + && This->dirtyRect.bottom == This->currentDesc.Height) + { fullsurface = TRUE; } else { /* TODO: Proper partial rectangle tracking */ @@ -1936,11 +1909,11 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) { switch(wined3d_settings.rendertargetlock_mode) { case RTL_READTEX: - IWineD3DSurface_LoadLocation(iface, SFLAG_INTEXTURE, NULL /* partial texture loading not supported yet */); + surface_load_location(This, SFLAG_INTEXTURE, NULL /* partial texture loading not supported yet */); /* drop through */ case RTL_READDRAW: - IWineD3DSurface_LoadLocation(iface, SFLAG_INDRAWABLE, fullsurface ? NULL : &This->dirtyRect); + surface_load_location(This, SFLAG_INDRAWABLE, fullsurface ? NULL : &This->dirtyRect); break; } @@ -1965,15 +1938,15 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) { FIXME("Depth Stencil buffer locking is not implemented\n"); } else { /* The rest should be a normal texture */ - IWineD3DBaseTextureImpl *impl; /* Check if the texture is bound, if yes dirtify the sampler to force a re-upload of the texture * Can't load the texture here because PreLoad may destroy and recreate the gl texture, so sampler * states need resetting */ - if(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&impl) == WINED3D_OK) { - if (impl->baseTexture.bindCount) - IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(impl->baseTexture.sampler)); - IWineD3DBaseTexture_Release((IWineD3DBaseTexture *) impl); + if (This->container.type == WINED3D_CONTAINER_TEXTURE) + { + IWineD3DBaseTextureImpl *texture = This->container.u.texture; + if (texture->baseTexture.bindCount) + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(texture->baseTexture.sampler)); } } @@ -2013,8 +1986,8 @@ static void surface_release_client_storage(IWineD3DSurfaceImpl *surface) LEAVE_GL(); context_release(context); - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INSRGBTEX, FALSE); - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INTEXTURE, FALSE); + surface_modify_location(surface, SFLAG_INSRGBTEX, FALSE); + surface_modify_location(surface, SFLAG_INTEXTURE, FALSE); surface_force_reload(surface); } @@ -2043,9 +2016,11 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHD memset(&lock, 0, sizeof(lock)); /* To be sure */ /* Create a DIB section if there isn't a hdc yet */ - if(!This->hDC) { - if(This->Flags & SFLAG_CLIENT) { - IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL); + if (!This->hDC) + { + if (This->Flags & SFLAG_CLIENT) + { + surface_load_location(This, SFLAG_INSYSMEM, NULL); surface_release_client_storage(This); } hr = IWineD3DBaseSurfaceImpl_CreateDIBSection(iface); @@ -2073,8 +2048,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHD return hr; } - if (This->resource.format_desc->format == WINED3DFMT_P8_UINT - || This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM) + if (This->resource.format->id == WINED3DFMT_P8_UINT + || This->resource.format->id == WINED3DFMT_P8_UINT_A8_UNORM) { /* GetDC on palettized formats is unsupported in D3D9, and the method is missing in D3D8, so this should only be used for DX <=7 surfaces (with non-device palettes) */ @@ -2141,30 +2116,37 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_ReleaseDC(IWineD3DSurface *iface, HDC IWineD3DSurface Internal (No mapping to directx api) parts follow ****************************************************** */ -HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing, struct wined3d_format_desc *desc, CONVERT_TYPES *convert) +HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, + BOOL use_texturing, struct wined3d_format *format, CONVERT_TYPES *convert) { BOOL colorkey_active = need_alpha_ck && (This->CKeyFlags & WINEDDSD_CKSRCBLT); IWineD3DDeviceImpl *device = This->resource.device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; BOOL blit_supported = FALSE; - RECT rect = {0, 0, This->pow2Width, This->pow2Height}; /* Copy the default values from the surface. Below we might perform fixups */ /* TODO: get rid of color keying desc fixups by using e.g. a table. */ - *desc = *This->resource.format_desc; + *format = *This->resource.format; *convert = NO_CONVERSION; /* Ok, now look if we have to do any conversion */ - switch(This->resource.format_desc->format) + switch (This->resource.format->id) { case WINED3DFMT_P8_UINT: - /* **************** - Paletted Texture - **************** */ - + /* Below the call to blit_supported is disabled for Wine 1.2 + * because the function isn't operating correctly yet. At the + * moment 8-bit blits are handled in software and if certain GL + * extensions are around, surface conversion is performed at + * upload time. The blit_supported call recognizes it as a + * destination fixup. This type of upload 'fixup' and 8-bit to + * 8-bit blits need to be handled by the blit_shader. + * TODO: get rid of this #if 0. */ +#if 0 blit_supported = device->blitter->blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT, - &rect, This->resource.usage, This->resource.pool, - This->resource.format_desc, &rect, This->resource.usage, - This->resource.pool, This->resource.format_desc); + &rect, This->resource.usage, This->resource.pool, This->resource.format, + &rect, This->resource.usage, This->resource.pool, This->resource.format); +#endif + blit_supported = gl_info->supported[EXT_PALETTED_TEXTURE] || gl_info->supported[ARB_FRAGMENT_PROGRAM]; /* Use conversion when the blit_shader backend supports it. It only supports this in case of * texturing. Further also use conversion in case of color keying. @@ -2175,15 +2157,14 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ if (!((blit_supported && device->render_targets && This == device->render_targets[0])) || colorkey_active || !use_texturing) { - desc->glFormat = GL_RGBA; - desc->glInternal = GL_RGBA; - desc->glType = GL_UNSIGNED_BYTE; - desc->conv_byte_count = 4; - if(colorkey_active) { + format->glFormat = GL_RGBA; + format->glInternal = GL_RGBA; + format->glType = GL_UNSIGNED_BYTE; + format->conv_byte_count = 4; + if (colorkey_active) *convert = CONVERT_PALETTED_CK; - } else { + else *convert = CONVERT_PALETTED; - } } break; @@ -2199,42 +2180,46 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ break; case WINED3DFMT_B5G6R5_UNORM: - if (colorkey_active) { + if (colorkey_active) + { *convert = CONVERT_CK_565; - desc->glFormat = GL_RGBA; - desc->glInternal = GL_RGB5_A1; - desc->glType = GL_UNSIGNED_SHORT_5_5_5_1; - desc->conv_byte_count = 2; + format->glFormat = GL_RGBA; + format->glInternal = GL_RGB5_A1; + format->glType = GL_UNSIGNED_SHORT_5_5_5_1; + format->conv_byte_count = 2; } break; case WINED3DFMT_B5G5R5X1_UNORM: - if (colorkey_active) { + if (colorkey_active) + { *convert = CONVERT_CK_5551; - desc->glFormat = GL_BGRA; - desc->glInternal = GL_RGB5_A1; - desc->glType = GL_UNSIGNED_SHORT_1_5_5_5_REV; - desc->conv_byte_count = 2; + format->glFormat = GL_BGRA; + format->glInternal = GL_RGB5_A1; + format->glType = GL_UNSIGNED_SHORT_1_5_5_5_REV; + format->conv_byte_count = 2; } break; case WINED3DFMT_B8G8R8_UNORM: - if (colorkey_active) { + if (colorkey_active) + { *convert = CONVERT_CK_RGB24; - desc->glFormat = GL_RGBA; - desc->glInternal = GL_RGBA8; - desc->glType = GL_UNSIGNED_INT_8_8_8_8; - desc->conv_byte_count = 4; + format->glFormat = GL_RGBA; + format->glInternal = GL_RGBA8; + format->glType = GL_UNSIGNED_INT_8_8_8_8; + format->conv_byte_count = 4; } break; case WINED3DFMT_B8G8R8X8_UNORM: - if (colorkey_active) { + if (colorkey_active) + { *convert = CONVERT_RGB32_888; - desc->glFormat = GL_RGBA; - desc->glInternal = GL_RGBA8; - desc->glType = GL_UNSIGNED_INT_8_8_8_8; - desc->conv_byte_count = 4; + format->glFormat = GL_RGBA; + format->glInternal = GL_RGBA8; + format->glType = GL_UNSIGNED_INT_8_8_8_8; + format->conv_byte_count = 4; } break; @@ -2341,14 +2326,9 @@ static HRESULT d3dfmt_convert_surface(const BYTE *src, BYTE *dst, UINT pitch, UI case CONVERT_PALETTED: case CONVERT_PALETTED_CK: { - IWineD3DPaletteImpl* pal = This->palette; BYTE table[256][4]; unsigned int x, y; - if( pal == NULL) { - /* TODO: If we are a sublevel, try to get the palette from level 0 */ - } - d3dfmt_p8_init_palette(This, table, (convert == CONVERT_PALETTED_CK)); for (y = 0; y < height; y++) @@ -2483,8 +2463,8 @@ BOOL palette9_changed(IWineD3DSurfaceImpl *This) { IWineD3DDeviceImpl *device = This->resource.device; - if (This->palette || (This->resource.format_desc->format != WINED3DFMT_P8_UINT - && This->resource.format_desc->format != WINED3DFMT_P8_UINT_A8_UNORM)) + if (This->palette || (This->resource.format->id != WINED3DFMT_P8_UINT + && This->resource.format->id != WINED3DFMT_P8_UINT_A8_UNORM)) { /* If a ddraw-style palette is attached assume no d3d9 palette change. * Also the palette isn't interesting if the surface format isn't P8 or A8P8 @@ -2509,6 +2489,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface, BO IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; DWORD flag = srgb_mode ? SFLAG_INSRGBTEX : SFLAG_INTEXTURE; + TRACE("iface %p, srgb %#x.\n", iface, srgb_mode); + if (!(This->Flags & flag)) { TRACE("Reloading because surface is dirty\n"); } else if(/* Reload: gl texture has ck, now no ckey is set OR */ @@ -2524,10 +2506,10 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface, BO * the surface. Make sure we have it */ - IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL); + surface_load_location(This, SFLAG_INSYSMEM, NULL); /* Make sure the texture is reloaded because of the color key change, this kills performance though :( */ /* TODO: This is not necessarily needed with hw palettized texture support */ - IWineD3DSurface_ModifyLocation(iface, SFLAG_INSYSMEM, TRUE); + surface_modify_location(This, SFLAG_INSYSMEM, TRUE); } else { TRACE("surface is already in texture\n"); return WINED3D_OK; @@ -2544,49 +2526,29 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface, BO return WINED3DERR_INVALIDCALL; } - IWineD3DSurface_LoadLocation(iface, flag, NULL /* no partial locking for textures yet */); - -#if 0 - { - static unsigned int gen = 0; - char buffer[4096]; - ++gen; - if ((gen % 10) == 0) { - snprintf(buffer, sizeof(buffer), "/tmp/surface%p_type%u_level%u_%u.ppm", - This, This->texture_target, This->texture_level, gen); - IWineD3DSurfaceImpl_SaveSnapshot(iface, buffer); - } - /* - * debugging crash code - if (gen == 250) { - void** test = NULL; - *test = 0; - } - */ - } -#endif + surface_load_location(This, flag, NULL /* no partial locking for textures yet */); if (!(This->Flags & SFLAG_DONOTFREE)) { HeapFree(GetProcessHeap(), 0, This->resource.heapMemory); This->resource.allocatedMemory = NULL; This->resource.heapMemory = NULL; - IWineD3DSurface_ModifyLocation(iface, SFLAG_INSYSMEM, FALSE); + surface_modify_location(This, SFLAG_INSYSMEM, FALSE); } return WINED3D_OK; } /* Context activation is done by the caller. */ -static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb) { - /* TODO: check for locks */ +static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb) +{ IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - IWineD3DBaseTexture *baseTexture = NULL; - TRACE("(%p)Checking to see if the container is a base texture\n", This); - if (IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&baseTexture) == WINED3D_OK) { - TRACE("Passing to container\n"); - IWineD3DBaseTexture_BindTexture(baseTexture, srgb); - IWineD3DBaseTexture_Release(baseTexture); + TRACE("iface %p, srgb %#x.\n", iface, srgb); + + if (This->container.type == WINED3D_CONTAINER_TEXTURE) + { + TRACE("Passing to container.\n"); + IWineD3DBaseTexture_BindTexture((IWineD3DBaseTexture *)This->container.u.texture, srgb); } else { @@ -2631,148 +2593,8 @@ static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL } } -#include -#include -static HRESULT WINAPI IWineD3DSurfaceImpl_SaveSnapshot(IWineD3DSurface *iface, const char* filename) +static HRESULT WINAPI IWineD3DSurfaceImpl_SetFormat(IWineD3DSurface *iface, enum wined3d_format_id format) { - FILE* f = NULL; - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - char *allocatedMemory; - const char *textureRow; - IWineD3DSwapChain *swapChain = NULL; - int width, height, i, y; - GLuint tmpTexture = 0; - DWORD color; - /*FIXME: - Textures may not be stored in ->allocatedgMemory and a GlTexture - so we should lock the surface before saving a snapshot, or at least check that - */ - /* TODO: Compressed texture images can be obtained from the GL in uncompressed form - by calling GetTexImage and in compressed form by calling - GetCompressedTexImageARB. Queried compressed images can be saved and - later reused by calling CompressedTexImage[123]DARB. Pre-compressed - texture images do not need to be processed by the GL and should - significantly improve texture loading performance relative to uncompressed - images. */ - -/* Setup the width and height to be the internal texture width and height. */ - width = This->pow2Width; - height = This->pow2Height; -/* check to see if we're a 'virtual' texture, e.g. we're not a pbuffer of texture, we're a back buffer*/ - IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **)&swapChain); - - if (This->Flags & SFLAG_INDRAWABLE && !(This->Flags & SFLAG_INTEXTURE)) { - /* if were not a real texture then read the back buffer into a real texture */ - /* we don't want to interfere with the back buffer so read the data into a temporary - * texture and then save the data out of the temporary texture - */ - GLint prevRead; - ENTER_GL(); - TRACE("(%p) Reading render target into texture\n", This); - - glGenTextures(1, &tmpTexture); - glBindTexture(GL_TEXTURE_2D, tmpTexture); - - glTexImage2D(GL_TEXTURE_2D, - 0, - GL_RGBA, - width, - height, - 0/*border*/, - GL_RGBA, - GL_UNSIGNED_INT_8_8_8_8_REV, - NULL); - - glGetIntegerv(GL_READ_BUFFER, &prevRead); - checkGLcall("glGetIntegerv"); - glReadBuffer(swapChain ? GL_BACK : This->resource.device->offscreenBuffer); - checkGLcall("glReadBuffer"); - glCopyTexImage2D(GL_TEXTURE_2D, - 0, - GL_RGBA, - 0, - 0, - width, - height, - 0); - - checkGLcall("glCopyTexImage2D"); - glReadBuffer(prevRead); - LEAVE_GL(); - - } else { /* bind the real texture, and make sure it up to date */ - surface_internal_preload(This, SRGB_RGB); - surface_bind_and_dirtify(This, FALSE); - } - allocatedMemory = HeapAlloc(GetProcessHeap(), 0, width * height * 4); - ENTER_GL(); - FIXME("Saving texture level %d width %d height %d\n", This->texture_level, width, height); - glGetTexImage(GL_TEXTURE_2D, This->texture_level, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, allocatedMemory); - checkGLcall("glGetTexImage"); - if (tmpTexture) { - glBindTexture(GL_TEXTURE_2D, 0); - glDeleteTextures(1, &tmpTexture); - } - LEAVE_GL(); - - f = fopen(filename, "w+"); - if (NULL == f) { - ERR("opening of %s failed with: %s\n", filename, strerror(errno)); - return WINED3DERR_INVALIDCALL; - } -/* Save the data out to a TGA file because 1: it's an easy raw format, 2: it supports an alpha channel */ - TRACE("(%p) opened %s with format %s\n", This, filename, debug_d3dformat(This->resource.format_desc->format)); -/* TGA header */ - fputc(0,f); - fputc(0,f); - fputc(2,f); - fputc(0,f); - fputc(0,f); - fputc(0,f); - fputc(0,f); - fputc(0,f); - fputc(0,f); - fputc(0,f); - fputc(0,f); - fputc(0,f); -/* short width*/ - fwrite(&width,2,1,f); -/* short height */ - fwrite(&height,2,1,f); -/* format rgba */ - fputc(0x20,f); - fputc(0x28,f); -/* raw data */ - /* if the data is upside down if we've fetched it from a back buffer, so it needs flipping again to make it the correct way up */ - if(swapChain) - textureRow = allocatedMemory + (width * (height - 1) *4); - else - textureRow = allocatedMemory; - for (y = 0 ; y < height; y++) { - for (i = 0; i < width; i++) { - color = *((const DWORD*)textureRow); - fputc((color >> 16) & 0xFF, f); /* B */ - fputc((color >> 8) & 0xFF, f); /* G */ - fputc((color >> 0) & 0xFF, f); /* R */ - fputc((color >> 24) & 0xFF, f); /* A */ - textureRow += 4; - } - /* take two rows of the pointer to the texture memory */ - if(swapChain) - (textureRow-= width << 3); - - } - TRACE("Closing file\n"); - fclose(f); - - if(swapChain) { - IWineD3DSwapChain_Release(swapChain); - } - HeapFree(GetProcessHeap(), 0, allocatedMemory); - return WINED3D_OK; -} - -static HRESULT WINAPI IWineD3DSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORMAT format) { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; HRESULT hr; @@ -2780,8 +2602,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINE hr = IWineD3DBaseSurfaceImpl_SetFormat(iface, format); if(SUCCEEDED(hr)) { This->Flags &= ~(SFLAG_ALLOCATED | SFLAG_SRGBALLOCATED); - TRACE("(%p) : glFormat %d, glFormatInternal %d, glType %d\n", This, This->resource.format_desc->glFormat, - This->resource.format_desc->glInternal, This->resource.format_desc->glType); + TRACE("(%p) : glFormat %d, glFormatInternal %d, glType %d\n", This, This->resource.format->glFormat, + This->resource.format->glInternal, This->resource.format->glType); } return hr; } @@ -2819,7 +2641,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_SetMem(IWineD3DSurface *iface, void *M This->Flags |= SFLAG_USERPTR | SFLAG_INSYSMEM; /* Now the surface memory is most up do date. Invalidate drawable and texture */ - IWineD3DSurface_ModifyLocation(iface, SFLAG_INSYSMEM, TRUE); + surface_modify_location(This, SFLAG_INSYSMEM, TRUE); /* For client textures opengl has to be notified */ if (This->Flags & SFLAG_CLIENT) @@ -2831,7 +2653,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_SetMem(IWineD3DSurface *iface, void *M /* LockRect and GetDC will re-create the dib section and allocated memory */ This->resource.allocatedMemory = NULL; /* HeapMemory should be NULL already */ - if(This->resource.heapMemory != NULL) ERR("User pointer surface has heap memory allocated\n"); + if (This->resource.heapMemory) + ERR("User pointer surface has heap memory allocated.\n"); This->Flags &= ~SFLAG_USERPTR; if (This->Flags & SFLAG_CLIENT) @@ -2920,7 +2743,7 @@ void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) { static HRESULT WINAPI IWineD3DSurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DSurface *override, DWORD Flags) { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; IWineD3DSwapChainImpl *swapchain = NULL; - HRESULT hr; + TRACE("(%p)->(%p,%x)\n", This, override, Flags); /* Flipping is only supported on RenderTargets and overlays*/ @@ -2948,16 +2771,18 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DS */ } - IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **) &swapchain); - if(!swapchain) { + if (This->container.type != WINED3D_CONTAINER_SWAPCHAIN) + { ERR("Flipped surface is not on a swapchain\n"); return WINEDDERR_NOTFLIPPABLE; } + swapchain = This->container.u.swapchain; /* Just overwrite the swapchain presentation interval. This is ok because only ddraw apps can call Flip, * and only d3d8 and d3d9 apps specify the presentation interval */ - if((Flags & (WINEDDFLIP_NOVSYNC | WINEDDFLIP_INTERVAL2 | WINEDDFLIP_INTERVAL3 | WINEDDFLIP_INTERVAL4)) == 0) { + if (!(Flags & (WINEDDFLIP_NOVSYNC | WINEDDFLIP_INTERVAL2 | WINEDDFLIP_INTERVAL3 | WINEDDFLIP_INTERVAL4))) + { /* Most common case first to avoid wasting time on all the other cases */ swapchain->presentParms.PresentationInterval = WINED3DPRESENT_INTERVAL_ONE; } else if(Flags & WINEDDFLIP_NOVSYNC) { @@ -2971,10 +2796,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DS } /* Flipping a OpenGL surface -> Use WineD3DDevice::Present */ - hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *)swapchain, + return IWineD3DSwapChain_Present((IWineD3DSwapChain *)swapchain, NULL, NULL, swapchain->win_handle, NULL, 0); - IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); - return hr; } /* Does a direct frame buffer -> texture copy. Stretching is done @@ -3086,7 +2909,7 @@ static void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *dst_surface, IWineD3D /* The texture is now most up to date - If the surface is a render target and has a drawable, this * path is never entered */ - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INTEXTURE, TRUE); + surface_modify_location(dst_surface, SFLAG_INTEXTURE, TRUE); } /* Uses the hardware to stretch and flip the image */ @@ -3194,8 +3017,8 @@ static void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *dst_surface, IWine wined3d_gl_min_mip_filter(minMipLookup, Filter, WINED3DTEXF_NONE)); checkGLcall("glTexParameteri"); - IWineD3DSurface_GetContainer((IWineD3DSurface *)src_surface, &IID_IWineD3DSwapChain, (void **)&src_swapchain); - if (src_swapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *)src_swapchain); + if (src_surface->container.type == WINED3D_CONTAINER_SWAPCHAIN) + src_swapchain = src_surface->container.u.swapchain; if (!src_swapchain || src_surface == src_swapchain->back_buffers[0]) { src = backup ? backup : src_surface->texture_name; @@ -3368,15 +3191,13 @@ static void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *dst_surface, IWine /* The texture is now most up to date - If the surface is a render target and has a drawable, this * path is never entered */ - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INTEXTURE, TRUE); + surface_modify_location(dst_surface, SFLAG_INTEXTURE, TRUE); } /* Until the blit_shader is ready, define some prototypes here. */ static BOOL fbo_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op, - const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, - const struct wined3d_format_desc *src_format_desc, - const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, - const struct wined3d_format_desc *dst_format_desc); + const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, const struct wined3d_format *src_format, + const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, const struct wined3d_format *dst_format); /* Front buffer coordinates are always full screen coordinates, but our GL * drawable is limited to the window's client area. The sysmem and texture @@ -3393,12 +3214,172 @@ void surface_translate_frontbuffer_coords(IWineD3DSurfaceImpl *surface, HWND win OffsetRect(rect, offset.x, offset.y); } +static BOOL surface_is_full_rect(IWineD3DSurfaceImpl *surface, const RECT *r) +{ + if ((r->left && r->right) || abs(r->right - r->left) != surface->currentDesc.Width) + return FALSE; + if ((r->top && r->bottom) || abs(r->bottom - r->top) != surface->currentDesc.Height) + return FALSE; + return TRUE; +} + +/* blit between surface locations. onscreen on different swapchains is not supported. + * depth / stencil is not supported. */ +static void surface_blt_fbo(IWineD3DDeviceImpl *device, const WINED3DTEXTUREFILTERTYPE filter, + IWineD3DSurfaceImpl *src_surface, DWORD src_location, const RECT *src_rect_in, + IWineD3DSurfaceImpl *dst_surface, DWORD dst_location, const RECT *dst_rect_in) +{ + const struct wined3d_gl_info *gl_info; + struct wined3d_context *context; + RECT src_rect, dst_rect; + GLenum gl_filter; + + TRACE("device %p, filter %s,\n", device, debug_d3dtexturefiltertype(filter)); + TRACE("src_surface %p, src_location %s, src_rect %s,\n", + src_surface, debug_surflocation(src_location), wine_dbgstr_rect(src_rect_in)); + TRACE("dst_surface %p, dst_location %s, dst_rect %s.\n", + dst_surface, debug_surflocation(dst_location), wine_dbgstr_rect(dst_rect_in)); + + src_rect = *src_rect_in; + dst_rect = *dst_rect_in; + + switch (filter) + { + case WINED3DTEXF_LINEAR: + gl_filter = GL_LINEAR; + break; + + default: + FIXME("Unsupported filter mode %s (%#x).\n", debug_d3dtexturefiltertype(filter), filter); + case WINED3DTEXF_NONE: + case WINED3DTEXF_POINT: + gl_filter = GL_NEAREST; + break; + } + + if (src_location == SFLAG_INDRAWABLE && surface_is_offscreen(src_surface)) + src_location = SFLAG_INTEXTURE; + if (dst_location == SFLAG_INDRAWABLE && surface_is_offscreen(dst_surface)) + dst_location = SFLAG_INTEXTURE; + + /* Make sure the locations are up-to-date. Loading the destination + * surface isn't required if the entire surface is overwritten. (And is + * in fact harmful if we're being called by surface_load_location() with + * the purpose of loading the destination surface.) */ + surface_load_location(src_surface, src_location, NULL); + if (!surface_is_full_rect(dst_surface, &dst_rect)) + surface_load_location(dst_surface, dst_location, NULL); + + if (src_location == SFLAG_INDRAWABLE) context = context_acquire(device, src_surface); + else if (dst_location == SFLAG_INDRAWABLE) context = context_acquire(device, dst_surface); + else context = context_acquire(device, NULL); + + if (!context->valid) + { + context_release(context); + WARN("Invalid context, skipping blit.\n"); + return; + } + + gl_info = context->gl_info; + + if (src_location == SFLAG_INDRAWABLE) + { + GLenum buffer = surface_get_gl_buffer(src_surface); + + TRACE("Source surface %p is onscreen.\n", src_surface); + + if (buffer == GL_FRONT) + surface_translate_frontbuffer_coords(src_surface, context->win_handle, &src_rect); + + src_rect.top = src_surface->currentDesc.Height - src_rect.top; + src_rect.bottom = src_surface->currentDesc.Height - src_rect.bottom; + + ENTER_GL(); + context_bind_fbo(context, GL_READ_FRAMEBUFFER, NULL); + glReadBuffer(buffer); + checkGLcall("glReadBuffer()"); + } + else + { + TRACE("Source surface %p is offscreen.\n", src_surface); + ENTER_GL(); + context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, src_surface, NULL, src_location); + glReadBuffer(GL_COLOR_ATTACHMENT0); + checkGLcall("glReadBuffer()"); + } + LEAVE_GL(); + + if (dst_location == SFLAG_INDRAWABLE) + { + GLenum buffer = surface_get_gl_buffer(dst_surface); + + TRACE("Destination surface %p is onscreen.\n", dst_surface); + + if (buffer == GL_FRONT) + surface_translate_frontbuffer_coords(dst_surface, context->win_handle, &dst_rect); + + dst_rect.top = dst_surface->currentDesc.Height - dst_rect.top; + dst_rect.bottom = dst_surface->currentDesc.Height - dst_rect.bottom; + + ENTER_GL(); + context_bind_fbo(context, GL_DRAW_FRAMEBUFFER, NULL); + context_set_draw_buffer(context, buffer); + } + else + { + TRACE("Destination surface %p is offscreen.\n", dst_surface); + + ENTER_GL(); + context_apply_fbo_state_blit(context, GL_DRAW_FRAMEBUFFER, dst_surface, NULL, dst_location); + context_set_draw_buffer(context, GL_COLOR_ATTACHMENT0); + } + + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE)); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1)); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2)); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3)); + + glDisable(GL_SCISSOR_TEST); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE)); + + gl_info->fbo_ops.glBlitFramebuffer(src_rect.left, src_rect.top, src_rect.right, src_rect.bottom, + dst_rect.left, dst_rect.top, dst_rect.right, dst_rect.bottom, GL_COLOR_BUFFER_BIT, gl_filter); + checkGLcall("glBlitFramebuffer()"); + + LEAVE_GL(); + + if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */ + + context_release(context); +} + +/* Do not call while under the GL lock. */ +HRESULT surface_color_fill(IWineD3DSurfaceImpl *s, const RECT *rect, const WINED3DCOLORVALUE *color) +{ + IWineD3DDeviceImpl *device = s->resource.device; + const struct blit_shader *blitter; + + blitter = wined3d_select_blitter(&device->adapter->gl_info, BLIT_OP_COLOR_FILL, + NULL, 0, 0, NULL, rect, s->resource.usage, s->resource.pool, s->resource.format); + if (!blitter) + { + FIXME("No blitter is capable of performing the requested color fill operation.\n"); + return WINED3DERR_INVALIDCALL; + } + + return blitter->color_fill(device, s, rect, color); +} + /* Not called from the VTable */ +/* Do not call while under the GL lock. */ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, const RECT *DestRect, IWineD3DSurfaceImpl *src_surface, const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter) { IWineD3DDeviceImpl *device = dst_surface->resource.device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; IWineD3DSwapChainImpl *srcSwapchain = NULL, *dstSwapchain = NULL; RECT dst_rect, src_rect; @@ -3412,8 +3393,10 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, WARN("Destination is in sysmem, rejecting gl blt\n"); return WINED3DERR_INVALIDCALL; } - IWineD3DSurface_GetContainer((IWineD3DSurface *)dst_surface, &IID_IWineD3DSwapChain, (void **)&dstSwapchain); - if (dstSwapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *)dstSwapchain); + + if (dst_surface->container.type == WINED3D_CONTAINER_SWAPCHAIN) + dstSwapchain = dst_surface->container.u.swapchain; + if (src_surface) { if (src_surface->resource.pool == WINED3DPOOL_SYSTEMMEM) @@ -3421,8 +3404,9 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, WARN("Src is in sysmem, rejecting gl blt\n"); return WINED3DERR_INVALIDCALL; } - IWineD3DSurface_GetContainer((IWineD3DSurface *)src_surface, &IID_IWineD3DSwapChain, (void **)&srcSwapchain); - if (srcSwapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *)srcSwapchain); + + if (src_surface->container.type == WINED3D_CONTAINER_SWAPCHAIN) + srcSwapchain = src_surface->container.u.swapchain; } /* Early sort out of cases where no render target is used */ @@ -3449,7 +3433,7 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, && dst_surface == dstSwapchain->front_buffer && src_surface == dstSwapchain->back_buffers[0]) { - /* Half-life does a Blt from the back buffer to the front buffer, + /* Half-Life does a Blt from the back buffer to the front buffer, * Full surface size, no flags... Use present instead * * This path will only be entered for d3d7 and ddraw apps, because d3d8/9 offer no way to blit TO the front buffer @@ -3507,7 +3491,8 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, TRACE("Yes\n"); /* These flags are unimportant for the flag check, remove them */ - if((Flags & ~(WINEDDBLT_DONOTWAIT | WINEDDBLT_WAIT)) == 0) { + if (!(Flags & ~(WINEDDBLT_DONOTWAIT | WINEDDBLT_WAIT))) + { WINED3DSWAPEFFECT orig_swap = dstSwapchain->presentParms.SwapEffect; /* The idea behind this is that a glReadPixels and a glDrawPixels call @@ -3566,8 +3551,8 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, BOOL stretchx; /* P8 read back is not implemented */ - if (src_surface->resource.format_desc->format == WINED3DFMT_P8_UINT - || dst_surface->resource.format_desc->format == WINED3DFMT_P8_UINT) + if (src_surface->resource.format->id == WINED3DFMT_P8_UINT + || dst_surface->resource.format->id == WINED3DFMT_P8_UINT) { TRACE("P8 read back not supported by frame buffer to texture blit\n"); return WINED3DERR_INVALIDCALL; @@ -3600,11 +3585,14 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, * FBO support, so it doesn't really make sense to try and make it work with different offscreen rendering * backends. */ - if (fbo_blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT, - &src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format_desc, - &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format_desc)) + if (fbo_blit_supported(gl_info, BLIT_OP_BLIT, + &src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format, + &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format)) { - stretch_rect_fbo(device, src_surface, &src_rect, dst_surface, &dst_rect, Filter); + surface_blt_fbo(device, Filter, + src_surface, SFLAG_INDRAWABLE, &src_rect, + dst_surface, SFLAG_INDRAWABLE, &dst_rect); + surface_modify_location(dst_surface, SFLAG_INDRAWABLE, TRUE); } else if (!stretchx || dst_rect.right - dst_rect.left > src_surface->currentDesc.Width || dst_rect.bottom - dst_rect.top > src_surface->currentDesc.Height) @@ -3639,25 +3627,28 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, TRACE("Blt from surface %p to rendertarget %p\n", src_surface, dst_surface); if (!(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE)) - && fbo_blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT, + && fbo_blit_supported(gl_info, BLIT_OP_BLIT, &src_rect, src_surface->resource.usage, src_surface->resource.pool, - src_surface->resource.format_desc, + src_surface->resource.format, &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, - dst_surface->resource.format_desc)) + dst_surface->resource.format)) { - TRACE("Using stretch_rect_fbo\n"); + TRACE("Using surface_blt_fbo.\n"); /* The source is always a texture, but never the currently active render target, and the texture * contents are never upside down. */ - stretch_rect_fbo(device, src_surface, &src_rect, dst_surface, &dst_rect, Filter); + surface_blt_fbo(device, Filter, + src_surface, SFLAG_INDRAWABLE, &src_rect, + dst_surface, SFLAG_INDRAWABLE, &dst_rect); + surface_modify_location(dst_surface, SFLAG_INDRAWABLE, TRUE); return WINED3D_OK; } if (!(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE)) - && arbfp_blit.blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT, + && arbfp_blit.blit_supported(gl_info, BLIT_OP_BLIT, &src_rect, src_surface->resource.usage, src_surface->resource.pool, - src_surface->resource.format_desc, + src_surface->resource.format, &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, - dst_surface->resource.format_desc)) + dst_surface->resource.format)) { return arbfp_blit_surface(device, src_surface, &src_rect, dst_surface, &dst_rect, BLIT_OP_BLIT, Filter); } @@ -3690,9 +3681,9 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, if (dstSwapchain && dst_surface == dstSwapchain->front_buffer) surface_translate_frontbuffer_coords(dst_surface, context->win_handle, &dst_rect); - if (!device->blitter->blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT, - &src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format_desc, - &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format_desc)) + if (!device->blitter->blit_supported(gl_info, BLIT_OP_BLIT, + &src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format, + &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format)) { FIXME("Unsupported blit operation falling back to software\n"); return WINED3DERR_INVALIDCALL; @@ -3749,40 +3740,24 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, /* The surface is now in the drawable. On onscreen surfaces or without fbos the texture * is outdated now */ - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INDRAWABLE, TRUE); + surface_modify_location(dst_surface, SFLAG_INDRAWABLE, TRUE); return WINED3D_OK; - } else { + } + else + { /* Source-Less Blit to render target */ - if (Flags & WINEDDBLT_COLORFILL) { - DWORD color; + if (Flags & WINEDDBLT_COLORFILL) + { + WINED3DCOLORVALUE color; TRACE("Colorfill\n"); - /* The color as given in the Blt function is in the format of the frame-buffer... - * 'clear' expect it in ARGB format => we need to do some conversion :-) - */ - if (!surface_convert_color_to_argb(dst_surface, DDBltFx->u5.dwFillColor, &color)) - { - /* The color conversion function already prints an error, so need to do it here */ + /* The color as given in the Blt function is in the surface format. */ + if (!surface_convert_color_to_float(dst_surface, DDBltFx->u5.dwFillColor, &color)) return WINED3DERR_INVALIDCALL; - } - if (ffp_blit.blit_supported(&device->adapter->gl_info, BLIT_OP_COLOR_FILL, - NULL, 0, 0, NULL, - &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, - dst_surface->resource.format_desc)) - { - return ffp_blit.color_fill(device, dst_surface, &dst_rect, color); - } - else if (cpu_blit.blit_supported(&device->adapter->gl_info, BLIT_OP_COLOR_FILL, - NULL, 0, 0, NULL, - &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, - dst_surface->resource.format_desc)) - { - return cpu_blit.color_fill(device, dst_surface, &dst_rect, color); - } - return WINED3DERR_INVALIDCALL; + return surface_color_fill(dst_surface, &dst_rect, &color); } } @@ -3792,19 +3767,20 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, } static HRESULT IWineD3DSurfaceImpl_BltZ(IWineD3DSurfaceImpl *This, const RECT *DestRect, - IWineD3DSurface *SrcSurface, const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx) + IWineD3DSurface *src_surface, const RECT *src_rect, DWORD Flags, const WINEDDBLTFX *DDBltFx) { IWineD3DDeviceImpl *device = This->resource.device; float depth; - if (Flags & WINEDDBLT_DEPTHFILL) { - switch(This->resource.format_desc->format) + if (Flags & WINEDDBLT_DEPTHFILL) + { + switch (This->resource.format->id) { case WINED3DFMT_D16_UNORM: depth = (float) DDBltFx->u5.dwFillDepth / (float) 0x0000ffff; break; case WINED3DFMT_S1_UINT_D15_UNORM: - depth = (float) DDBltFx->u5.dwFillDepth / (float) 0x0000fffe; + depth = (float) DDBltFx->u5.dwFillDepth / (float) 0x00007fff; break; case WINED3DFMT_D24_UNORM_S8_UINT: case WINED3DFMT_X8D24_UNORM: @@ -3815,10 +3791,10 @@ static HRESULT IWineD3DSurfaceImpl_BltZ(IWineD3DSurfaceImpl *This, const RECT *D break; default: depth = 0.0f; - ERR("Unexpected format for depth fill: %s\n", debug_d3dformat(This->resource.format_desc->format)); + ERR("Unexpected format for depth fill: %s.\n", debug_d3dformat(This->resource.format->id)); } - return IWineD3DDevice_Clear((IWineD3DDevice *)device, DestRect ? 1 : 0, (const WINED3DRECT *)DestRect, + return IWineD3DDevice_Clear((IWineD3DDevice *)device, DestRect ? 1 : 0, DestRect, WINED3DCLEAR_ZBUFFER, 0x00000000, depth, 0x00000000); } @@ -3826,16 +3802,20 @@ static HRESULT IWineD3DSurfaceImpl_BltZ(IWineD3DSurfaceImpl *This, const RECT *D return WINED3DERR_INVALIDCALL; } -static HRESULT WINAPI IWineD3DSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *DestRect, IWineD3DSurface *SrcSurface, - const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter) { +static HRESULT WINAPI IWineD3DSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *DestRect, + IWineD3DSurface *src_surface, const RECT *SrcRect, DWORD Flags, + const WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter) +{ IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) SrcSurface; + IWineD3DSurfaceImpl *src = (IWineD3DSurfaceImpl *)src_surface; IWineD3DDeviceImpl *device = This->resource.device; - TRACE("(%p)->(%p,%p,%p,%x,%p)\n", This, DestRect, SrcSurface, SrcRect, Flags, DDBltFx); - TRACE("(%p): Usage is %s\n", This, debug_d3dusage(This->resource.usage)); + TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p, filter %s.\n", + iface, wine_dbgstr_rect(DestRect), src_surface, wine_dbgstr_rect(SrcRect), + Flags, DDBltFx, debug_d3dtexturefiltertype(Filter)); + TRACE("Usage is %s.\n", debug_d3dusage(This->resource.usage)); - if ( (This->Flags & SFLAG_LOCKED) || ((Src != NULL) && (Src->Flags & SFLAG_LOCKED))) + if ((This->Flags & SFLAG_LOCKED) || (src && (src->Flags & SFLAG_LOCKED))) { WARN(" Surface is busy, returning DDERR_SURFACEBUSY\n"); return WINEDDERR_SURFACEBUSY; @@ -3844,13 +3824,15 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT /* Accessing the depth stencil is supposed to fail between a BeginScene and EndScene pair, * except depth blits, which seem to work */ - if (This == device->depth_stencil || (Src && Src == device->depth_stencil)) + if (This == device->depth_stencil || (src && src == device->depth_stencil)) { if (device->inScene && !(Flags & WINEDDBLT_DEPTHFILL)) { TRACE("Attempt to access the depth stencil surface in a BeginScene / EndScene pair, returning WINED3DERR_INVALIDCALL\n"); return WINED3DERR_INVALIDCALL; - } else if(IWineD3DSurfaceImpl_BltZ(This, DestRect, SrcSurface, SrcRect, Flags, DDBltFx) == WINED3D_OK) { + } + else if (SUCCEEDED(IWineD3DSurfaceImpl_BltZ(This, DestRect, src_surface, SrcRect, Flags, DDBltFx))) + { TRACE("Z Blit override handled the blit\n"); return WINED3D_OK; } @@ -3858,48 +3840,49 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT /* Special cases for RenderTargets */ if ((This->resource.usage & WINED3DUSAGE_RENDERTARGET) - || (Src && (Src->resource.usage & WINED3DUSAGE_RENDERTARGET))) + || (src && (src->resource.usage & WINED3DUSAGE_RENDERTARGET))) { - if (SUCCEEDED(IWineD3DSurfaceImpl_BltOverride(This, DestRect, Src, SrcRect, Flags, DDBltFx, Filter))) + if (SUCCEEDED(IWineD3DSurfaceImpl_BltOverride(This, DestRect, src, SrcRect, Flags, DDBltFx, Filter))) return WINED3D_OK; } /* For the rest call the X11 surface implementation. * For RenderTargets this should be implemented OpenGL accelerated in BltOverride, - * other Blts are rather rare - */ - return IWineD3DBaseSurfaceImpl_Blt(iface, DestRect, SrcSurface, SrcRect, Flags, DDBltFx, Filter); + * other Blts are rather rare. */ + return IWineD3DBaseSurfaceImpl_Blt(iface, DestRect, src_surface, SrcRect, Flags, DDBltFx, Filter); } static HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dstx, DWORD dsty, - IWineD3DSurface *Source, const RECT *rsrc, DWORD trans) + IWineD3DSurface *src_surface, const RECT *rsrc, DWORD trans) { - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; - IWineD3DSurfaceImpl *srcImpl = (IWineD3DSurfaceImpl *) Source; + IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; + IWineD3DSurfaceImpl *src = (IWineD3DSurfaceImpl *)src_surface; IWineD3DDeviceImpl *device = This->resource.device; - TRACE("(%p)->(%d, %d, %p, %p, %08x\n", iface, dstx, dsty, Source, rsrc, trans); + TRACE("iface %p, dst_x %u, dst_y %u, src_surface %p, src_rect %s, flags %#x.\n", + iface, dstx, dsty, src_surface, wine_dbgstr_rect(rsrc), trans); - if ( (This->Flags & SFLAG_LOCKED) || (srcImpl->Flags & SFLAG_LOCKED)) + if ((This->Flags & SFLAG_LOCKED) || (src->Flags & SFLAG_LOCKED)) { WARN(" Surface is busy, returning DDERR_SURFACEBUSY\n"); return WINEDDERR_SURFACEBUSY; } - if (device->inScene && (This == device->depth_stencil || srcImpl == device->depth_stencil)) + if (device->inScene && (This == device->depth_stencil || src == device->depth_stencil)) { TRACE("Attempt to access the depth stencil surface in a BeginScene / EndScene pair, returning WINED3DERR_INVALIDCALL\n"); return WINED3DERR_INVALIDCALL; } /* Special cases for RenderTargets */ - if( (This->resource.usage & WINED3DUSAGE_RENDERTARGET) || - (srcImpl->resource.usage & WINED3DUSAGE_RENDERTARGET) ) { + if ((This->resource.usage & WINED3DUSAGE_RENDERTARGET) + || (src->resource.usage & WINED3DUSAGE_RENDERTARGET)) + { RECT SrcRect, DstRect; DWORD Flags=0; - surface_get_rect(srcImpl, rsrc, &SrcRect); + surface_get_rect(src, rsrc, &SrcRect); DstRect.left = dstx; DstRect.top=dsty; @@ -3917,12 +3900,11 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD Flags |= WINEDDBLT_DONOTWAIT; if (SUCCEEDED(IWineD3DSurfaceImpl_BltOverride(This, - &DstRect, srcImpl, &SrcRect, Flags, NULL, WINED3DTEXF_POINT))) + &DstRect, src, &SrcRect, Flags, NULL, WINED3DTEXF_POINT))) return WINED3D_OK; } - - return IWineD3DBaseSurfaceImpl_BltFast(iface, dstx, dsty, Source, rsrc, trans); + return IWineD3DBaseSurfaceImpl_BltFast(iface, dstx, dsty, src_surface, rsrc, trans); } static HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface) @@ -3935,23 +3917,27 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface) if (!pal) return WINED3D_OK; - if (This->resource.format_desc->format == WINED3DFMT_P8_UINT - || This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM) + if (This->resource.format->id == WINED3DFMT_P8_UINT + || This->resource.format->id == WINED3DFMT_P8_UINT_A8_UNORM) { - if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) + if (This->resource.usage & WINED3DUSAGE_RENDERTARGET) { - /* Make sure the texture is up to date. This call doesn't do anything if the texture is already up to date. */ - IWineD3DSurface_LoadLocation(iface, SFLAG_INTEXTURE, NULL); + /* Make sure the texture is up to date. This call doesn't do + * anything if the texture is already up to date. */ + surface_load_location(This, SFLAG_INTEXTURE, NULL); /* We want to force a palette refresh, so mark the drawable as not being up to date */ - IWineD3DSurface_ModifyLocation(iface, SFLAG_INDRAWABLE, FALSE); - } else { - if(!(This->Flags & SFLAG_INSYSMEM)) { - TRACE("Palette changed with surface that does not have an up to date system memory copy\n"); - IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL); + surface_modify_location(This, SFLAG_INDRAWABLE, FALSE); + } + else + { + if (!(This->Flags & SFLAG_INSYSMEM)) + { + TRACE("Palette changed with surface that does not have an up to date system memory copy.\n"); + surface_load_location(This, SFLAG_INSYSMEM, NULL); } TRACE("Dirtifying surface\n"); - IWineD3DSurface_ModifyLocation(iface, SFLAG_INSYSMEM, TRUE); + surface_modify_location(This, SFLAG_INSYSMEM, TRUE); } } @@ -3967,8 +3953,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface) } /* Propagate the changes to the drawable when we have a palette. */ - if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) - IWineD3DSurface_LoadLocation(iface, SFLAG_INDRAWABLE, NULL); + if (This->resource.usage & WINED3DUSAGE_RENDERTARGET) + surface_load_location(This, SFLAG_INDRAWABLE, NULL); return WINED3D_OK; } @@ -3983,7 +3969,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) { This->texture_target = GL_TEXTURE_2D; /* Non-power2 support */ - if (gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO] || gl_info->supported[WINE_NORMALIZED_TEXRECT]) + if (gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO] || gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT]) { pow2Width = This->currentDesc.Width; pow2Height = This->currentDesc.Height; @@ -3998,9 +3984,10 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) { This->pow2Width = pow2Width; This->pow2Height = pow2Height; - if (pow2Width > This->currentDesc.Width || pow2Height > This->currentDesc.Height) { - /** TODO: add support for non power two compressed textures **/ - if (This->resource.format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + if (pow2Width > This->currentDesc.Width || pow2Height > This->currentDesc.Height) + { + /* TODO: Add support for non power two compressed textures. */ + if (This->resource.format->Flags & WINED3DFMT_FLAG_COMPRESSED) { FIXME("(%p) Compressed non-power-two textures are not supported w(%d) h(%d)\n", This, This->currentDesc.Width, This->currentDesc.Height); @@ -4039,7 +4026,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) { doesn't work in combination with ARB_TEXTURE_RECTANGLE. */ if (This->Flags & SFLAG_NONPOW2 && gl_info->supported[ARB_TEXTURE_RECTANGLE] - && !(This->resource.format_desc->format == WINED3DFMT_P8_UINT + && !(This->resource.format->id == WINED3DFMT_P8_UINT && gl_info->supported[EXT_PALETTED_TEXTURE] && wined3d_settings.rendertargetlock_mode == RTL_READTEX)) { @@ -4050,11 +4037,19 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) { } } - if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) { - switch(wined3d_settings.offscreen_rendering_mode) { - case ORM_FBO: This->get_drawable_size = get_drawable_size_fbo; break; - case ORM_BACKBUFFER: This->get_drawable_size = get_drawable_size_backbuffer; break; - } + switch (wined3d_settings.offscreen_rendering_mode) + { + case ORM_FBO: + This->get_drawable_size = get_drawable_size_fbo; + break; + + case ORM_BACKBUFFER: + This->get_drawable_size = get_drawable_size_backbuffer; + break; + + default: + ERR("Unhandled offscreen rendering mode %#x.\n", wined3d_settings.offscreen_rendering_mode); + return WINED3DERR_INVALIDCALL; } This->Flags |= SFLAG_INSYSMEM; @@ -4171,6 +4166,14 @@ void surface_load_ds_location(IWineD3DSurfaceImpl *surface, struct wined3d_conte { GLint old_binding = 0; GLenum bind_target; + GLsizei w, h; + + /* The render target is allowed to be smaller than the depth/stencil + * buffer, so the onscreen depth/stencil buffer is potentially smaller + * than the offscreen surface. Don't overwrite the offscreen surface + * with undefined data. */ + w = min(surface->currentDesc.Width, context->swapchain->presentParms.BackBufferWidth); + h = min(surface->currentDesc.Height, context->swapchain->presentParms.BackBufferHeight); TRACE("Copying onscreen depth buffer to depth texture.\n"); @@ -4195,8 +4198,7 @@ void surface_load_ds_location(IWineD3DSurfaceImpl *surface, struct wined3d_conte bind_target = GL_TEXTURE_2D; } glBindTexture(bind_target, device->depth_blt_texture); - glCopyTexImage2D(bind_target, surface->texture_level, surface->resource.format_desc->glInternal, - 0, 0, surface->currentDesc.Width, surface->currentDesc.Height, 0); + glCopyTexImage2D(bind_target, surface->texture_level, surface->resource.format->glInternal, 0, 0, w, h, 0); glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(bind_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); @@ -4211,16 +4213,14 @@ void surface_load_ds_location(IWineD3DSurfaceImpl *surface, struct wined3d_conte gl_info->fbo_ops.glGenRenderbuffers(1, &device->depth_blt_rb); checkGLcall("glGenRenderbuffersEXT"); } - if (device->depth_blt_rb_w != surface->currentDesc.Width - || device->depth_blt_rb_h != surface->currentDesc.Height) + if (device->depth_blt_rb_w != w || device->depth_blt_rb_h != h) { gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, device->depth_blt_rb); checkGLcall("glBindRenderbufferEXT"); - gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, - surface->currentDesc.Width, surface->currentDesc.Height); + gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, w, h); checkGLcall("glRenderbufferStorageEXT"); - device->depth_blt_rb_w = surface->currentDesc.Width; - device->depth_blt_rb_h = surface->currentDesc.Height; + device->depth_blt_rb_w = w; + device->depth_blt_rb_h = h; } context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo); @@ -4230,8 +4230,7 @@ void surface_load_ds_location(IWineD3DSurfaceImpl *surface, struct wined3d_conte context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, surface, FALSE); /* Do the actual blit */ - surface_depth_blt(surface, gl_info, device->depth_blt_texture, - surface->currentDesc.Width, surface->currentDesc.Height, bind_target); + surface_depth_blt(surface, gl_info, device->depth_blt_texture, w, h, bind_target); checkGLcall("depth_blt"); if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id); @@ -4268,58 +4267,65 @@ void surface_load_ds_location(IWineD3DSurfaceImpl *surface, struct wined3d_conte surface->ds_current_size.cy = surface->currentDesc.Height; } -static void WINAPI IWineD3DSurfaceImpl_ModifyLocation(IWineD3DSurface *iface, DWORD flag, BOOL persistent) { - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; - IWineD3DBaseTexture *texture; +void surface_modify_location(IWineD3DSurfaceImpl *surface, DWORD flag, BOOL persistent) +{ IWineD3DSurfaceImpl *overlay; - TRACE("(%p)->(%s, %s)\n", iface, debug_surflocation(flag), - persistent ? "TRUE" : "FALSE"); + TRACE("surface %p, location %s, persistent %#x.\n", + surface, debug_surflocation(flag), persistent); if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - if (surface_is_offscreen(This)) + if (surface_is_offscreen(surface)) { /* With ORM_FBO, SFLAG_INTEXTURE and SFLAG_INDRAWABLE are the same for offscreen targets. */ if (flag & (SFLAG_INTEXTURE | SFLAG_INDRAWABLE)) flag |= (SFLAG_INTEXTURE | SFLAG_INDRAWABLE); } else { - TRACE("Surface %p is an onscreen surface\n", iface); + TRACE("Surface %p is an onscreen surface.\n", surface); } } - if(persistent) { - if(((This->Flags & SFLAG_INTEXTURE) && !(flag & SFLAG_INTEXTURE)) || - ((This->Flags & SFLAG_INSRGBTEX) && !(flag & SFLAG_INSRGBTEX))) { - if (IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&texture) == WINED3D_OK) { - TRACE("Passing to container\n"); - IWineD3DBaseTexture_SetDirty(texture, TRUE); - IWineD3DBaseTexture_Release(texture); + if (persistent) + { + if (((surface->Flags & SFLAG_INTEXTURE) && !(flag & SFLAG_INTEXTURE)) + || ((surface->Flags & SFLAG_INSRGBTEX) && !(flag & SFLAG_INSRGBTEX))) + { + if (surface->container.type == WINED3D_CONTAINER_TEXTURE) + { + TRACE("Passing to container.\n"); + IWineD3DBaseTexture_SetDirty((IWineD3DBaseTexture *)surface->container.u.texture, TRUE); } } - This->Flags &= ~SFLAG_LOCATIONS; - This->Flags |= flag; + surface->Flags &= ~SFLAG_LOCATIONS; + surface->Flags |= flag; /* Redraw emulated overlays, if any */ - if(flag & SFLAG_INDRAWABLE && !list_empty(&This->overlays)) { - LIST_FOR_EACH_ENTRY(overlay, &This->overlays, IWineD3DSurfaceImpl, overlay_entry) { - IWineD3DSurface_DrawOverlay((IWineD3DSurface *) overlay); + if (flag & SFLAG_INDRAWABLE && !list_empty(&surface->overlays)) + { + LIST_FOR_EACH_ENTRY(overlay, &surface->overlays, IWineD3DSurfaceImpl, overlay_entry) + { + IWineD3DSurface_DrawOverlay((IWineD3DSurface *)overlay); } } - } else { - if((This->Flags & (SFLAG_INTEXTURE | SFLAG_INSRGBTEX)) && (flag & (SFLAG_INTEXTURE | SFLAG_INSRGBTEX))) { - if (IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&texture) == WINED3D_OK) { + } + else + { + if ((surface->Flags & (SFLAG_INTEXTURE | SFLAG_INSRGBTEX)) && (flag & (SFLAG_INTEXTURE | SFLAG_INSRGBTEX))) + { + if (surface->container.type == WINED3D_CONTAINER_TEXTURE) + { TRACE("Passing to container\n"); - IWineD3DBaseTexture_SetDirty(texture, TRUE); - IWineD3DBaseTexture_Release(texture); + IWineD3DBaseTexture_SetDirty((IWineD3DBaseTexture *)surface->container.u.texture, TRUE); } } - This->Flags &= ~flag; + surface->Flags &= ~flag; } - if(!(This->Flags & SFLAG_LOCATIONS)) { - ERR("%p: Surface does not have any up to date location\n", This); + if (!(surface->Flags & SFLAG_LOCATIONS)) + { + ERR("Surface %p does not have any up to date location.\n", surface); } } @@ -4346,7 +4352,8 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT dst_rect = src_rect; } - if ((This->Flags & SFLAG_SWAPCHAIN) && This == ((IWineD3DSwapChainImpl *)This->container)->front_buffer) + swapchain = This->container.type == WINED3D_CONTAINER_SWAPCHAIN ? This->container.u.swapchain : NULL; + if (swapchain && This == swapchain->front_buffer) surface_translate_frontbuffer_coords(This, context->win_handle, &dst_rect); device->blitter->set_shader((IWineD3DDevice *) device, This); @@ -4355,9 +4362,8 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT draw_textured_quad(This, &src_rect, &dst_rect, WINED3DTEXF_POINT); LEAVE_GL(); - device->blitter->set_shader((IWineD3DDevice *) device, This); + device->blitter->unset_shader((IWineD3DDevice *) device); - swapchain = (This->Flags & SFLAG_SWAPCHAIN) ? (IWineD3DSwapChainImpl *)This->container : NULL; if (wined3d_settings.strict_draw_ordering || (swapchain && (This == swapchain->front_buffer || swapchain->num_contexts > 1))) wglFlush(); /* Flush to ensure ordering across contexts. */ @@ -4365,57 +4371,38 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT context_release(context); } -/***************************************************************************** - * IWineD3DSurface::LoadLocation - * - * Copies the current surface data from wherever it is to the requested - * location. The location is one of the surface flags, SFLAG_INSYSMEM, - * SFLAG_INTEXTURE and SFLAG_INDRAWABLE. When the surface is current in - * multiple locations, the gl texture is preferred over the drawable, which is - * preferred over system memory. The PBO counts as system memory. If rect is - * not NULL, only the specified rectangle is copied (only supported for - * sysmem<->drawable copies at the moment). If rect is NULL, the destination - * location is marked up to date after the copy. - * - * Parameters: - * flag: Surface location flag to be updated - * rect: rectangle to be copied - * - * Returns: - * WINED3D_OK on success - * WINED3DERR_DEVICELOST on an internal error - * - *****************************************************************************/ -static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, DWORD flag, const RECT *rect) { - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; - IWineD3DDeviceImpl *device = This->resource.device; +HRESULT surface_load_location(IWineD3DSurfaceImpl *surface, DWORD flag, const RECT *rect) +{ + IWineD3DDeviceImpl *device = surface->resource.device; const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - struct wined3d_format_desc desc; + BOOL drawable_read_ok = surface_is_offscreen(surface); + struct wined3d_format format; CONVERT_TYPES convert; int width, pitch, outpitch; BYTE *mem; - BOOL drawable_read_ok = TRUE; BOOL in_fbo = FALSE; - if (This->resource.usage & WINED3DUSAGE_DEPTHSTENCIL) + TRACE("surface %p, location %s, rect %s.\n", surface, debug_surflocation(flag), wine_dbgstr_rect(rect)); + + if (surface->resource.usage & WINED3DUSAGE_DEPTHSTENCIL) { if (flag == SFLAG_INTEXTURE) { struct wined3d_context *context = context_acquire(device, NULL); - surface_load_ds_location(This, context, SFLAG_DS_OFFSCREEN); + surface_load_ds_location(surface, context, SFLAG_DS_OFFSCREEN); context_release(context); return WINED3D_OK; } else { - FIXME("Unimplemented location %#x for depth/stencil buffers.\n", flag); + FIXME("Unimplemented location %s for depth/stencil buffers.\n", debug_surflocation(flag)); return WINED3DERR_INVALIDCALL; } } if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - if (surface_is_offscreen(This)) + if (surface_is_offscreen(surface)) { /* With ORM_FBO, SFLAG_INTEXTURE and SFLAG_INDRAWABLE are the same for offscreen targets. * Prefer SFLAG_INTEXTURE. */ @@ -4425,83 +4412,88 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D } else { - TRACE("Surface %p is an onscreen surface\n", iface); + TRACE("Surface %p is an onscreen surface.\n", surface); } } - TRACE("(%p)->(%s, %p)\n", iface, debug_surflocation(flag), rect); - if(rect) { - TRACE("Rectangle: (%d,%d)-(%d,%d)\n", rect->left, rect->top, rect->right, rect->bottom); - } - - if(This->Flags & flag) { + if (surface->Flags & flag) + { TRACE("Location already up to date\n"); return WINED3D_OK; } - if(!(This->Flags & SFLAG_LOCATIONS)) { - ERR("%p: Surface does not have any up to date location\n", This); - This->Flags |= SFLAG_LOST; + if (!(surface->Flags & SFLAG_LOCATIONS)) + { + ERR("Surface %p does not have any up to date location.\n", surface); + surface->Flags |= SFLAG_LOST; return WINED3DERR_DEVICELOST; } - if(flag == SFLAG_INSYSMEM) { - surface_prepare_system_memory(This); + if (flag == SFLAG_INSYSMEM) + { + surface_prepare_system_memory(surface); /* Download the surface to system memory */ - if (This->Flags & (SFLAG_INTEXTURE | SFLAG_INSRGBTEX)) + if (surface->Flags & (SFLAG_INTEXTURE | SFLAG_INSRGBTEX)) { struct wined3d_context *context = NULL; if (!device->isInDraw) context = context_acquire(device, NULL); - surface_bind_and_dirtify(This, !(This->Flags & SFLAG_INTEXTURE)); - surface_download_data(This, gl_info); + surface_bind_and_dirtify(surface, !(surface->Flags & SFLAG_INTEXTURE)); + surface_download_data(surface, gl_info); if (context) context_release(context); } else { /* Note: It might be faster to download into a texture first. */ - read_from_framebuffer(This, rect, - This->resource.allocatedMemory, - IWineD3DSurface_GetPitch(iface)); + read_from_framebuffer(surface, rect, surface->resource.allocatedMemory, + IWineD3DSurface_GetPitch((IWineD3DSurface *)surface)); } - } else if(flag == SFLAG_INDRAWABLE) { - if(This->Flags & SFLAG_INTEXTURE) { - surface_blt_to_drawable(This, rect); - } else { + } + else if (flag == SFLAG_INDRAWABLE) + { + if (surface->Flags & SFLAG_INTEXTURE) + { + surface_blt_to_drawable(surface, rect); + } + else + { int byte_count; - if((This->Flags & SFLAG_LOCATIONS) == SFLAG_INSRGBTEX) { + if ((surface->Flags & SFLAG_LOCATIONS) == SFLAG_INSRGBTEX) + { /* This needs a shader to convert the srgb data sampled from the GL texture into RGB * values, otherwise we get incorrect values in the target. For now go the slow way * via a system memory copy */ - IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INSYSMEM, rect); + surface_load_location(surface, SFLAG_INSYSMEM, rect); } - d3dfmt_get_conv(This, FALSE /* We need color keying */, FALSE /* We won't use textures */, &desc, &convert); + d3dfmt_get_conv(surface, FALSE /* We need color keying */, + FALSE /* We won't use textures */, &format, &convert); /* The width is in 'length' not in bytes */ - width = This->currentDesc.Width; - pitch = IWineD3DSurface_GetPitch(iface); + width = surface->currentDesc.Width; + pitch = IWineD3DSurface_GetPitch((IWineD3DSurface *)surface); /* Don't use PBOs for converted surfaces. During PBO conversion we look at SFLAG_CONVERTED * but it isn't set (yet) in all cases it is getting called. */ - if ((convert != NO_CONVERSION) && (This->Flags & SFLAG_PBO)) + if ((convert != NO_CONVERSION) && (surface->Flags & SFLAG_PBO)) { struct wined3d_context *context = NULL; - TRACE("Removing the pbo attached to surface %p\n", This); + TRACE("Removing the pbo attached to surface %p.\n", surface); if (!device->isInDraw) context = context_acquire(device, NULL); - surface_remove_pbo(This, gl_info); + surface_remove_pbo(surface, gl_info); if (context) context_release(context); } - if((convert != NO_CONVERSION) && This->resource.allocatedMemory) { - int height = This->currentDesc.Height; - byte_count = desc.conv_byte_count; + if ((convert != NO_CONVERSION) && surface->resource.allocatedMemory) + { + int height = surface->currentDesc.Height; + byte_count = format.conv_byte_count; /* Stick to the alignment for the converted surface too, makes it easier to load the surface */ outpitch = width * byte_count; @@ -4512,24 +4504,44 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D ERR("Out of memory %d, %d!\n", outpitch, height); return WINED3DERR_OUTOFVIDEOMEMORY; } - d3dfmt_convert_surface(This->resource.allocatedMemory, mem, pitch, width, height, outpitch, convert, This); + d3dfmt_convert_surface(surface->resource.allocatedMemory, mem, pitch, + width, height, outpitch, convert, surface); - This->Flags |= SFLAG_CONVERTED; - } else { - This->Flags &= ~SFLAG_CONVERTED; - mem = This->resource.allocatedMemory; - byte_count = desc.byte_count; + surface->Flags |= SFLAG_CONVERTED; + } + else + { + surface->Flags &= ~SFLAG_CONVERTED; + mem = surface->resource.allocatedMemory; + byte_count = format.byte_count; } - flush_to_framebuffer_drawpixels(This, desc.glFormat, desc.glType, byte_count, mem); + flush_to_framebuffer_drawpixels(surface, format.glFormat, format.glType, byte_count, mem); /* Don't delete PBO memory */ - if((mem != This->resource.allocatedMemory) && !(This->Flags & SFLAG_PBO)) + if ((mem != surface->resource.allocatedMemory) && !(surface->Flags & SFLAG_PBO)) HeapFree(GetProcessHeap(), 0, mem); } - } else /* if(flag & (SFLAG_INTEXTURE | SFLAG_INSRGBTEX)) */ { - if (drawable_read_ok && (This->Flags & SFLAG_INDRAWABLE)) { - read_from_framebuffer_texture(This, flag == SFLAG_INSRGBTEX); + } + else /* if(flag & (SFLAG_INTEXTURE | SFLAG_INSRGBTEX)) */ + { + const DWORD attach_flags = WINED3DFMT_FLAG_FBO_ATTACHABLE | WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB; + + if (drawable_read_ok && (surface->Flags & SFLAG_INDRAWABLE)) + { + read_from_framebuffer_texture(surface, flag == SFLAG_INSRGBTEX); + } + else if (surface->Flags & (SFLAG_INSRGBTEX | SFLAG_INTEXTURE) + && (surface->resource.format->Flags & attach_flags) == attach_flags + && fbo_blit_supported(gl_info, BLIT_OP_BLIT, + NULL, surface->resource.usage, surface->resource.pool, surface->resource.format, + NULL, surface->resource.usage, surface->resource.pool, surface->resource.format)) + { + DWORD src_location = flag == SFLAG_INSRGBTEX ? SFLAG_INTEXTURE : SFLAG_INSRGBTEX; + RECT rect = {0, 0, surface->currentDesc.Width, surface->currentDesc.Height}; + + surface_blt_fbo(surface->resource.device, WINED3DTEXF_POINT, + surface, src_location, &rect, surface, flag, &rect); } else { @@ -4537,57 +4549,65 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D BOOL srgb = flag == SFLAG_INSRGBTEX; struct wined3d_context *context = NULL; - d3dfmt_get_conv(This, TRUE /* We need color keying */, TRUE /* We will use textures */, - &desc, &convert); + d3dfmt_get_conv(surface, TRUE /* We need color keying */, + TRUE /* We will use textures */, &format, &convert); - if(srgb) { - if((This->Flags & (SFLAG_INTEXTURE | SFLAG_INSYSMEM)) == SFLAG_INTEXTURE) { - /* Performance warning ... */ - FIXME("%p: Downloading rgb texture to reload it as srgb\n", This); - IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INSYSMEM, rect); - } - } else { - if((This->Flags & (SFLAG_INSRGBTEX | SFLAG_INSYSMEM)) == SFLAG_INSRGBTEX) { - /* Performance warning ... */ - FIXME("%p: Downloading srgb texture to reload it as rgb\n", This); - IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INSYSMEM, rect); + if (srgb) + { + if ((surface->Flags & (SFLAG_INTEXTURE | SFLAG_INSYSMEM)) == SFLAG_INTEXTURE) + { + /* Performance warning... */ + FIXME("Downloading RGB surface %p to reload it as sRGB.\n", surface); + surface_load_location(surface, SFLAG_INSYSMEM, rect); } } - if(!(This->Flags & SFLAG_INSYSMEM)) { - /* Should not happen */ - ERR("Trying to load a texture from sysmem, but SFLAG_INSYSMEM is not set\n"); + else + { + if ((surface->Flags & (SFLAG_INSRGBTEX | SFLAG_INSYSMEM)) == SFLAG_INSRGBTEX) + { + /* Performance warning... */ + FIXME("Downloading sRGB surface %p to reload it as RGB.\n", surface); + surface_load_location(surface, SFLAG_INSYSMEM, rect); + } + } + if (!(surface->Flags & SFLAG_INSYSMEM)) + { + WARN("Trying to load a texture from sysmem, but SFLAG_INSYSMEM is not set.\n"); /* Lets hope we get it from somewhere... */ - IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INSYSMEM, rect); + surface_load_location(surface, SFLAG_INSYSMEM, rect); } if (!device->isInDraw) context = context_acquire(device, NULL); - surface_prepare_texture(This, gl_info, srgb); - surface_bind_and_dirtify(This, srgb); + surface_prepare_texture(surface, gl_info, srgb); + surface_bind_and_dirtify(surface, srgb); - if(This->CKeyFlags & WINEDDSD_CKSRCBLT) { - This->Flags |= SFLAG_GLCKEY; - This->glCKey = This->SrcBltCKey; + if (surface->CKeyFlags & WINEDDSD_CKSRCBLT) + { + surface->Flags |= SFLAG_GLCKEY; + surface->glCKey = surface->SrcBltCKey; } - else This->Flags &= ~SFLAG_GLCKEY; + else surface->Flags &= ~SFLAG_GLCKEY; /* The width is in 'length' not in bytes */ - width = This->currentDesc.Width; - pitch = IWineD3DSurface_GetPitch(iface); + width = surface->currentDesc.Width; + pitch = IWineD3DSurface_GetPitch((IWineD3DSurface *)surface); /* Don't use PBOs for converted surfaces. During PBO conversion we look at SFLAG_CONVERTED * but it isn't set (yet) in all cases it is getting called. */ - if(((convert != NO_CONVERSION) || desc.convert) && (This->Flags & SFLAG_PBO)) { - TRACE("Removing the pbo attached to surface %p\n", This); - surface_remove_pbo(This, gl_info); + if ((convert != NO_CONVERSION || format.convert) && (surface->Flags & SFLAG_PBO)) + { + TRACE("Removing the pbo attached to surface %p.\n", surface); + surface_remove_pbo(surface, gl_info); } - if(desc.convert) { + if (format.convert) + { /* This code is entered for texture formats which need a fixup. */ - int height = This->currentDesc.Height; + int height = surface->currentDesc.Height; /* Stick to the alignment for the converted surface too, makes it easier to load the surface */ - outpitch = width * desc.conv_byte_count; + outpitch = width * format.conv_byte_count; outpitch = (outpitch + device->surface_alignment - 1) & ~(device->surface_alignment - 1); mem = HeapAlloc(GetProcessHeap(), 0, outpitch * height); @@ -4596,13 +4616,15 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D if (context) context_release(context); return WINED3DERR_OUTOFVIDEOMEMORY; } - desc.convert(This->resource.allocatedMemory, mem, pitch, width, height); - } else if((convert != NO_CONVERSION) && This->resource.allocatedMemory) { + format.convert(surface->resource.allocatedMemory, mem, pitch, width, height); + } + else if (convert != NO_CONVERSION && surface->resource.allocatedMemory) + { /* This code is only entered for color keying fixups */ - int height = This->currentDesc.Height; + int height = surface->currentDesc.Height; /* Stick to the alignment for the converted surface too, makes it easier to load the surface */ - outpitch = width * desc.conv_byte_count; + outpitch = width * format.conv_byte_count; outpitch = (outpitch + device->surface_alignment - 1) & ~(device->surface_alignment - 1); mem = HeapAlloc(GetProcessHeap(), 0, outpitch * height); @@ -4611,9 +4633,12 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D if (context) context_release(context); return WINED3DERR_OUTOFVIDEOMEMORY; } - d3dfmt_convert_surface(This->resource.allocatedMemory, mem, pitch, width, height, outpitch, convert, This); - } else { - mem = This->resource.allocatedMemory; + d3dfmt_convert_surface(surface->resource.allocatedMemory, mem, pitch, + width, height, outpitch, convert, surface); + } + else + { + mem = surface->resource.allocatedMemory; } /* Make sure the correct pitch is used */ @@ -4621,8 +4646,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D glPixelStorei(GL_UNPACK_ROW_LENGTH, width); LEAVE_GL(); - if (mem || (This->Flags & SFLAG_PBO)) - surface_upload_data(This, gl_info, &desc, srgb, mem); + if (mem || (surface->Flags & SFLAG_PBO)) + surface_upload_data(surface, gl_info, &format, srgb, mem); /* Restore the default pitch */ ENTER_GL(); @@ -4632,45 +4657,22 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D if (context) context_release(context); /* Don't delete PBO memory */ - if((mem != This->resource.allocatedMemory) && !(This->Flags & SFLAG_PBO)) + if ((mem != surface->resource.allocatedMemory) && !(surface->Flags & SFLAG_PBO)) HeapFree(GetProcessHeap(), 0, mem); } } - if(rect == NULL) { - This->Flags |= flag; - } + if (!rect) surface->Flags |= flag; - if (in_fbo && (This->Flags & (SFLAG_INTEXTURE | SFLAG_INDRAWABLE))) { + if (in_fbo && (surface->Flags & (SFLAG_INTEXTURE | SFLAG_INDRAWABLE))) + { /* With ORM_FBO, SFLAG_INTEXTURE and SFLAG_INDRAWABLE are the same for offscreen targets. */ - This->Flags |= (SFLAG_INTEXTURE | SFLAG_INDRAWABLE); + surface->Flags |= (SFLAG_INTEXTURE | SFLAG_INDRAWABLE); } return WINED3D_OK; } -static HRESULT WINAPI IWineD3DSurfaceImpl_SetContainer(IWineD3DSurface *iface, IWineD3DBase *container) -{ - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; - IWineD3DSwapChain *swapchain = NULL; - - /* Update the drawable size method */ - if(container) { - IWineD3DBase_QueryInterface(container, &IID_IWineD3DSwapChain, (void **) &swapchain); - } - if(swapchain) { - This->get_drawable_size = get_drawable_size_swapchain; - IWineD3DSwapChain_Release(swapchain); - } else if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) { - switch(wined3d_settings.offscreen_rendering_mode) { - case ORM_FBO: This->get_drawable_size = get_drawable_size_fbo; break; - case ORM_BACKBUFFER: This->get_drawable_size = get_drawable_size_backbuffer; break; - } - } - - return IWineD3DBaseSurfaceImpl_SetContainer(iface, container); -} - static WINED3DSURFTYPE WINAPI IWineD3DSurfaceImpl_GetImplType(IWineD3DSurface *iface) { return SURFACE_OPENGL; } @@ -4699,10 +4701,10 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_DrawOverlay(IWineD3DSurface *iface) { BOOL surface_is_offscreen(IWineD3DSurfaceImpl *surface) { - IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)surface->container; + IWineD3DSwapChainImpl *swapchain = surface->container.u.swapchain; /* Not on a swapchain - must be offscreen */ - if (!(surface->Flags & SFLAG_SWAPCHAIN)) return TRUE; + if (surface->container.type != WINED3D_CONTAINER_SWAPCHAIN) return TRUE; /* The front buffer is always onscreen */ if (surface == swapchain->front_buffer) return FALSE; @@ -4729,7 +4731,6 @@ const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl = IWineD3DSurfaceImpl_UnLoad, IWineD3DBaseSurfaceImpl_GetType, /* IWineD3DSurface */ - IWineD3DBaseSurfaceImpl_GetContainer, IWineD3DBaseSurfaceImpl_GetDesc, IWineD3DSurfaceImpl_LockRect, IWineD3DSurfaceImpl_UnlockRect, @@ -4757,13 +4758,9 @@ const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl = /* Internal use: */ IWineD3DSurfaceImpl_LoadTexture, IWineD3DSurfaceImpl_BindTexture, - IWineD3DSurfaceImpl_SaveSnapshot, - IWineD3DSurfaceImpl_SetContainer, IWineD3DBaseSurfaceImpl_GetData, IWineD3DSurfaceImpl_SetFormat, IWineD3DSurfaceImpl_PrivateSetup, - IWineD3DSurfaceImpl_ModifyLocation, - IWineD3DSurfaceImpl_LoadLocation, IWineD3DSurfaceImpl_GetImplType, IWineD3DSurfaceImpl_DrawOverlay }; @@ -4792,7 +4789,7 @@ static HRESULT ffp_blit_set(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface) { IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface; const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - enum complex_fixup fixup = get_complex_fixup(surface->resource.format_desc->color_fixup); + enum complex_fixup fixup = get_complex_fixup(surface->resource.format->color_fixup); /* When EXT_PALETTED_TEXTURE is around, palette conversion is done by the GPU * else the surface is converted in software at upload time in LoadLocation. @@ -4830,10 +4827,8 @@ static void ffp_blit_unset(IWineD3DDevice *iface) } static BOOL ffp_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op, - const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, - const struct wined3d_format_desc *src_format_desc, - const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, - const struct wined3d_format_desc *dst_format_desc) + const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, const struct wined3d_format *src_format, + const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, const struct wined3d_format *dst_format) { enum complex_fixup src_fixup; @@ -4848,11 +4843,11 @@ static BOOL ffp_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_ return TRUE; } - src_fixup = get_complex_fixup(src_format_desc->color_fixup); + src_fixup = get_complex_fixup(src_format->color_fixup); if (TRACE_ON(d3d_surface) && TRACE_ON(d3d)) { TRACE("Checking support for fixup:\n"); - dump_color_fixup_desc(src_format_desc->color_fixup); + dump_color_fixup_desc(src_format->color_fixup); } if (blit_op != BLIT_OP_BLIT) @@ -4861,7 +4856,7 @@ static BOOL ffp_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_ return FALSE; } - if (!is_identity_fixup(dst_format_desc->color_fixup)) + if (!is_identity_fixup(dst_format->color_fixup)) { TRACE("Destination fixups are not supported\n"); return FALSE; @@ -4874,7 +4869,7 @@ static BOOL ffp_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_ } /* We only support identity conversions. */ - if (is_identity_fixup(src_format_desc->color_fixup)) + if (is_identity_fixup(src_format->color_fixup)) { TRACE("[OK]\n"); return TRUE; @@ -4884,10 +4879,14 @@ static BOOL ffp_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_ return FALSE; } -static HRESULT ffp_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color) +/* Do not call while under the GL lock. */ +static HRESULT ffp_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, + const RECT *dst_rect, const WINED3DCOLORVALUE *color) { - return IWineD3DDeviceImpl_ClearSurface(device, dst_surface, 1 /* Number of rectangles */, - (const WINED3DRECT*)dst_rect, WINED3DCLEAR_TARGET, fill_color, 0.0f /* Z */, 0 /* Stencil */); + const RECT draw_rect = {0, 0, dst_surface->currentDesc.Width, dst_surface->currentDesc.Height}; + + return device_clear_render_targets(device, 1 /* rt_count */, &dst_surface, 1 /* rect_count */, + dst_rect, &draw_rect, WINED3DCLEAR_TARGET, color, 0.0f /* depth */, 0 /* stencil */); } const struct blit_shader ffp_blit = { @@ -4921,10 +4920,8 @@ static void cpu_blit_unset(IWineD3DDevice *iface) } static BOOL cpu_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op, - const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, - const struct wined3d_format_desc *src_format_desc, - const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, - const struct wined3d_format_desc *dst_format_desc) + const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, const struct wined3d_format *src_format, + const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, const struct wined3d_format *dst_format) { if (blit_op == BLIT_OP_COLOR_FILL) { @@ -4934,13 +4931,17 @@ static BOOL cpu_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_ return FALSE; } -static HRESULT cpu_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color) +/* Do not call while under the GL lock. */ +static HRESULT cpu_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, + const RECT *dst_rect, const WINED3DCOLORVALUE *color) { WINEDDBLTFX BltFx; + memset(&BltFx, 0, sizeof(BltFx)); BltFx.dwSize = sizeof(BltFx); - BltFx.u5.dwFillColor = color_convert_argb_to_fmt(fill_color, dst_surface->resource.format_desc->format); - return IWineD3DBaseSurfaceImpl_Blt((IWineD3DSurface*)dst_surface, dst_rect, NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT); + BltFx.u5.dwFillColor = wined3d_format_convert_from_float(dst_surface->resource.format, color); + return IWineD3DBaseSurfaceImpl_Blt((IWineD3DSurface*)dst_surface, dst_rect, + NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT); } const struct blit_shader cpu_blit = { @@ -4953,10 +4954,8 @@ const struct blit_shader cpu_blit = { }; static BOOL fbo_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op, - const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, - const struct wined3d_format_desc *src_format_desc, - const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, - const struct wined3d_format_desc *dst_format_desc) + const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, const struct wined3d_format *src_format, + const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, const struct wined3d_format *dst_format) { if ((wined3d_settings.offscreen_rendering_mode != ORM_FBO) || !gl_info->fbo_ops.glBlitFramebuffer) return FALSE; @@ -4971,17 +4970,17 @@ static BOOL fbo_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_ if (src_pool == WINED3DPOOL_SYSTEMMEM || dst_pool == WINED3DPOOL_SYSTEMMEM) return FALSE; - if(!((src_format_desc->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE) || (src_usage & WINED3DUSAGE_RENDERTARGET)) - && ((dst_format_desc->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE) || (dst_usage & WINED3DUSAGE_RENDERTARGET))) + if (!((src_format->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE) || (src_usage & WINED3DUSAGE_RENDERTARGET)) + && ((dst_format->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE) || (dst_usage & WINED3DUSAGE_RENDERTARGET))) return FALSE; - if (!is_identity_fixup(src_format_desc->color_fixup) || - !is_identity_fixup(dst_format_desc->color_fixup)) + if (!is_identity_fixup(src_format->color_fixup) + || !is_identity_fixup(dst_format->color_fixup)) return FALSE; - if (!(src_format_desc->format == dst_format_desc->format - || (is_identity_fixup(src_format_desc->color_fixup) - && is_identity_fixup(dst_format_desc->color_fixup)))) + if (!(src_format->id == dst_format->id + || (is_identity_fixup(src_format->color_fixup) + && is_identity_fixup(dst_format->color_fixup)))) return FALSE; return TRUE; diff --git a/dll/directx/wine/wined3d/surface_base.c b/dll/directx/wine/wined3d/surface_base.c index 2b6cdb41f22..e4dd853b0b3 100644 --- a/dll/directx/wine/wined3d/surface_base.c +++ b/dll/directx/wine/wined3d/surface_base.c @@ -46,18 +46,18 @@ static inline unsigned short float_32_to_16(const float *in) if(isnan(*in)) return 0x7C01; if (isinf(*in)) return (*in < 0.0f ? 0xFC00 : 0x7c00); - if(tmp < pow(2, 10)) { + if(tmp < powf(2, 10)) { do { tmp = tmp * 2.0f; exp--; - }while(tmp < pow(2, 10)); - } else if(tmp >= pow(2, 11)) { + }while(tmp < powf(2, 10)); + } else if(tmp >= powf(2, 11)) { do { tmp /= 2.0f; exp++; - }while(tmp >= pow(2, 11)); + }while(tmp >= powf(2, 11)); } mantissa = (unsigned int) tmp; @@ -139,49 +139,28 @@ WINED3DRESOURCETYPE WINAPI IWineD3DBaseSurfaceImpl_GetType(IWineD3DSurface *ifac return resource_get_type((IWineD3DResource *)iface); } -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetParent(IWineD3DSurface *iface, IUnknown **pParent) { - TRACE("(%p) : calling resourceimpl_GetParent\n", iface); - return resource_get_parent((IWineD3DResource *)iface, pParent); +void * WINAPI IWineD3DBaseSurfaceImpl_GetParent(IWineD3DSurface *iface) +{ + TRACE("iface %p.\n", iface); + + return ((IWineD3DSurfaceImpl *)iface)->resource.parent; } -/* ****************************************************** - IWineD3DSurface IWineD3DSurface parts follow - ****************************************************** */ +void WINAPI IWineD3DBaseSurfaceImpl_GetDesc(IWineD3DSurface *iface, WINED3DSURFACE_DESC *desc) +{ + IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)iface; -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetContainer(IWineD3DSurface* iface, REFIID riid, void** ppContainer) { - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - IWineD3DBase *container = 0; + TRACE("iface %p, desc %p.\n", iface, desc); - TRACE("(This %p, riid %s, ppContainer %p)\n", This, debugstr_guid(riid), ppContainer); - - if (!ppContainer) { - ERR("Called without a valid ppContainer.\n"); - } - - /* Standalone surfaces return the device as container. */ - if (This->container) container = This->container; - else container = (IWineD3DBase *)This->resource.device; - - TRACE("Relaying to QueryInterface\n"); - return IUnknown_QueryInterface(container, riid, ppContainer); -} - -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetDesc(IWineD3DSurface *iface, WINED3DSURFACE_DESC *pDesc) { - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - - TRACE("(%p) : copying into %p\n", This, pDesc); - - pDesc->format = This->resource.format_desc->format; - pDesc->resource_type = This->resource.resourceType; - pDesc->usage = This->resource.usage; - pDesc->pool = This->resource.pool; - pDesc->size = This->resource.size; /* dx8 only */ - pDesc->multisample_type = This->currentDesc.MultiSampleType; - pDesc->multisample_quality = This->currentDesc.MultiSampleQuality; - pDesc->width = This->currentDesc.Width; - pDesc->height = This->currentDesc.Height; - - return WINED3D_OK; + desc->format = surface->resource.format->id; + desc->resource_type = surface->resource.resourceType; + desc->usage = surface->resource.usage; + desc->pool = surface->resource.pool; + desc->size = surface->resource.size; /* dx8 only */ + desc->multisample_type = surface->currentDesc.MultiSampleType; + desc->multisample_quality = surface->currentDesc.MultiSampleQuality; + desc->width = surface->currentDesc.Width; + desc->height = surface->currentDesc.Height; } HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetBltStatus(IWineD3DSurface *iface, DWORD Flags) @@ -240,16 +219,16 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetPalette(IWineD3DSurface *iface, IWineD return WINED3D_OK; } - if(This->palette != NULL) - if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) + if (This->palette) + if (This->resource.usage & WINED3DUSAGE_RENDERTARGET) This->palette->Flags &= ~WINEDDPCAPS_PRIMARYSURFACE; This->palette = PalImpl; - if(PalImpl != NULL) { - if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) { - (PalImpl)->Flags |= WINEDDPCAPS_PRIMARYSURFACE; - } + if (PalImpl) + { + if (This->resource.usage & WINED3DUSAGE_RENDERTARGET) + PalImpl->Flags |= WINEDDPCAPS_PRIMARYSURFACE; return IWineD3DSurface_RealizePalette(iface); } @@ -261,7 +240,8 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetColorKey(IWineD3DSurface *iface, DWORD IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; TRACE("(%p)->(%08x,%p)\n", This, Flags, CKey); - if ((Flags & WINEDDCKEY_COLORSPACE) != 0) { + if (Flags & WINEDDCKEY_COLORSPACE) + { FIXME(" colorkey value not supported (%08x) !\n", Flags); return WINED3DERR_INVALIDCALL; } @@ -321,23 +301,24 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetPalette(IWineD3DSurface *iface, IWineD return WINED3D_OK; } -DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPitch(IWineD3DSurface *iface) { +DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPitch(IWineD3DSurface *iface) +{ IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; - const struct wined3d_format_desc *format_desc = This->resource.format_desc; + const struct wined3d_format *format = This->resource.format; DWORD ret; TRACE("(%p)\n", This); - if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + if ((format->Flags & (WINED3DFMT_FLAG_COMPRESSED | WINED3DFMT_FLAG_BROKEN_PITCH)) == WINED3DFMT_FLAG_COMPRESSED) { /* Since compressed formats are block based, pitch means the amount of * bytes to the next row of block rather than the next row of pixels. */ - UINT row_block_count = (This->currentDesc.Width + format_desc->block_width - 1) / format_desc->block_width; - ret = row_block_count * format_desc->block_byte_count; + UINT row_block_count = (This->currentDesc.Width + format->block_width - 1) / format->block_width; + ret = row_block_count * format->block_byte_count; } else { unsigned char alignment = This->resource.device->surface_alignment; - ret = This->resource.format_desc->byte_count * This->currentDesc.Width; /* Bytes / row */ + ret = This->resource.format->byte_count * This->currentDesc.Width; /* Bytes / row */ ret = (ret + alignment - 1) & ~(alignment - 1); } TRACE("(%p) Returning %d\n", This, ret); @@ -379,7 +360,9 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetOverlayPosition(IWineD3DSurface *iface TRACE("(%p): Not an overlay surface\n", This); return WINEDDERR_NOTAOVERLAYSURFACE; } - if(This->overlay_dest == NULL) { + + if (!This->overlay_dest) + { *X = 0; *Y = 0; hr = WINEDDERR_OVERLAYNOTVISIBLE; } else { @@ -484,47 +467,35 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetClipper(IWineD3DSurface *iface, IWineD return WINED3D_OK; } -HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetContainer(IWineD3DSurface *iface, IWineD3DBase *container) { +HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, enum wined3d_format_id format_id) +{ IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; + const struct wined3d_format *format = wined3d_get_format(&This->resource.device->adapter->gl_info, format_id); - TRACE("This %p, container %p\n", This, container); - - /* We can't keep a reference to the container, since the container already keeps a reference to us. */ - - TRACE("Setting container to %p from %p\n", container, This->container); - This->container = container; - - return WINED3D_OK; -} - -HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORMAT format) { - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, - &This->resource.device->adapter->gl_info); - - if (This->resource.format_desc->format != WINED3DFMT_UNKNOWN) + if (This->resource.format->id != WINED3DFMT_UNKNOWN) { FIXME("(%p) : The format of the surface must be WINED3DFORMAT_UNKNOWN\n", This); return WINED3DERR_INVALIDCALL; } - TRACE("(%p) : Setting texture format to (%d,%s)\n", This, format, debug_d3dformat(format)); + TRACE("(%p) : Setting texture format to %s (%#x).\n", This, debug_d3dformat(format_id), format_id); - This->resource.size = surface_calculate_size(format_desc, This->resource.device->surface_alignment, + This->resource.size = wined3d_format_calculate_size(format, This->resource.device->surface_alignment, This->pow2Width, This->pow2Height); - This->Flags |= (WINED3DFMT_D16_LOCKABLE == format) ? SFLAG_LOCKABLE : 0; + This->Flags |= (WINED3DFMT_D16_LOCKABLE == format_id) ? SFLAG_LOCKABLE : 0; - This->resource.format_desc = format_desc; + This->resource.format = format; - TRACE("(%p) : Size %d, bytesPerPixel %d\n", This, This->resource.size, format_desc->byte_count); + TRACE("(%p) : Size %d, bytesPerPixel %d\n", This, This->resource.size, format->byte_count); return WINED3D_OK; } -HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) { +HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) +{ IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - const struct wined3d_format_desc *format_desc = This->resource.format_desc; + const struct wined3d_format *format = This->resource.format; int extraline = 0; SYSTEM_INFO sysInfo; BITMAPINFO* b_info; @@ -532,13 +503,13 @@ HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) { DWORD *masks; UINT usage; - if(!(format_desc->Flags & WINED3DFMT_FLAG_GETDC)) + if (!(format->Flags & WINED3DFMT_FLAG_GETDC)) { - WARN("Cannot use GetDC on a %s surface\n", debug_d3dformat(format_desc->format)); + WARN("Cannot use GetDC on a %s surface\n", debug_d3dformat(format->id)); return WINED3DERR_INVALIDCALL; } - switch (format_desc->byte_count) + switch (format->byte_count) { case 2: case 4: @@ -553,7 +524,7 @@ HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) { default: /* Allocate extra space for a palette. */ b_info = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1 << (format_desc->byte_count * 8))); + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1 << (format->byte_count * 8))); break; } @@ -573,11 +544,11 @@ HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) { b_info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); /* TODO: Is there a nicer way to force a specific alignment? (8 byte for ddraw) */ - b_info->bmiHeader.biWidth = IWineD3DSurface_GetPitch(iface) / format_desc->byte_count; + b_info->bmiHeader.biWidth = IWineD3DSurface_GetPitch(iface) / format->byte_count; b_info->bmiHeader.biHeight = -This->currentDesc.Height -extraline; b_info->bmiHeader.biSizeImage = ( This->currentDesc.Height + extraline) * IWineD3DSurface_GetPitch(iface); b_info->bmiHeader.biPlanes = 1; - b_info->bmiHeader.biBitCount = format_desc->byte_count * 8; + b_info->bmiHeader.biBitCount = format->byte_count * 8; b_info->bmiHeader.biXPelsPerMeter = 0; b_info->bmiHeader.biYPelsPerMeter = 0; @@ -586,7 +557,7 @@ HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) { /* Get the bit masks */ masks = (DWORD *)b_info->bmiColors; - switch (This->resource.format_desc->format) + switch (This->resource.format->id) { case WINED3DFMT_B8G8R8_UNORM: usage = DIB_RGB_COLORS; @@ -607,9 +578,9 @@ HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) { case WINED3DFMT_R16G16B16A16_UNORM: usage = 0; b_info->bmiHeader.biCompression = BI_BITFIELDS; - masks[0] = format_desc->red_mask; - masks[1] = format_desc->green_mask; - masks[2] = format_desc->blue_mask; + masks[0] = format->red_mask; + masks[1] = format->green_mask; + masks[2] = format->blue_mask; break; default: @@ -619,8 +590,8 @@ HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) { break; } - ddc = GetDC(0); - if (ddc == 0) { + if (!(ddc = GetDC(0))) + { HeapFree(GetProcessHeap(), 0, b_info); return HRESULT_FROM_WIN32(GetLastError()); } @@ -788,8 +759,9 @@ static void convert_yuy2_x8r8g8b8(const BYTE *src, BYTE *dst, } } -struct d3dfmt_convertor_desc { - WINED3DFORMAT from, to; +struct d3dfmt_convertor_desc +{ + enum wined3d_format_id from, to; void (*convert)(const BYTE *src, BYTE *dst, DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h); }; @@ -801,7 +773,7 @@ static const struct d3dfmt_convertor_desc convertors[] = {WINED3DFMT_YUY2, WINED3DFMT_B8G8R8X8_UNORM, convert_yuy2_x8r8g8b8}, }; -static inline const struct d3dfmt_convertor_desc *find_convertor(WINED3DFORMAT from, WINED3DFORMAT to) +static inline const struct d3dfmt_convertor_desc *find_convertor(enum wined3d_format_id from, enum wined3d_format_id to) { unsigned int i; for(i = 0; i < (sizeof(convertors) / sizeof(convertors[0])); i++) { @@ -823,24 +795,26 @@ static inline const struct d3dfmt_convertor_desc *find_convertor(WINED3DFORMAT f * fmt: Requested destination format * *****************************************************************************/ -static IWineD3DSurfaceImpl *surface_convert_format(IWineD3DSurfaceImpl *source, WINED3DFORMAT to_fmt) { +static IWineD3DSurfaceImpl *surface_convert_format(IWineD3DSurfaceImpl *source, enum wined3d_format_id to_fmt) +{ IWineD3DSurface *ret = NULL; const struct d3dfmt_convertor_desc *conv; WINED3DLOCKED_RECT lock_src, lock_dst; HRESULT hr; - conv = find_convertor(source->resource.format_desc->format, to_fmt); - if(!conv) { - FIXME("Cannot find a conversion function from format %s to %s\n", - debug_d3dformat(source->resource.format_desc->format), debug_d3dformat(to_fmt)); + conv = find_convertor(source->resource.format->id, to_fmt); + if (!conv) + { + FIXME("Cannot find a conversion function from format %s to %s.\n", + debug_d3dformat(source->resource.format->id), debug_d3dformat(to_fmt)); return NULL; } IWineD3DDevice_CreateSurface((IWineD3DDevice *)source->resource.device, source->currentDesc.Width, - source->currentDesc.Height, to_fmt, TRUE /* lockable */, TRUE /* discard */, 0 /* level */, &ret, + source->currentDesc.Height, to_fmt, TRUE /* lockable */, TRUE /* discard */, 0 /* level */, 0 /* usage */, WINED3DPOOL_SCRATCH, WINED3DMULTISAMPLE_NONE /* TODO: Multisampled conversion */, 0 /* MultiSampleQuality */, IWineD3DSurface_GetImplType((IWineD3DSurface *) source), - NULL /* parent */, &wined3d_null_parent_ops); + NULL /* parent */, &wined3d_null_parent_ops, &ret); if(!ret) { ERR("Failed to create a destination surface for conversion\n"); return NULL; @@ -944,42 +918,28 @@ static HRESULT * * Params: * DestRect: Destination rectangle to write to - * SrcSurface: Source surface, can be NULL + * src_surface: Source surface, can be NULL * SrcRect: Source rectangle *****************************************************************************/ -HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *DestRect, IWineD3DSurface *SrcSurface, +HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *DestRect, IWineD3DSurface *src_surface, const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter) { - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; - IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) SrcSurface; + IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; + IWineD3DSurfaceImpl *src = (IWineD3DSurfaceImpl *)src_surface; RECT xdst,xsrc; HRESULT ret = WINED3D_OK; WINED3DLOCKED_RECT dlock, slock; int bpp, srcheight, srcwidth, dstheight, dstwidth, width; - const struct wined3d_format_desc *sEntry, *dEntry; + const struct wined3d_format *sEntry, *dEntry; int x, y; const BYTE *sbuf; BYTE *dbuf; - TRACE("(%p)->(%p,%p,%p,%x,%p)\n", This, DestRect, Src, SrcRect, Flags, DDBltFx); - if (TRACE_ON(d3d_surface)) - { - if (DestRect) TRACE("\tdestrect :%dx%d-%dx%d\n", - DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); - if (SrcRect) TRACE("\tsrcrect :%dx%d-%dx%d\n", - SrcRect->left, SrcRect->top, SrcRect->right, SrcRect->bottom); -#if 0 - TRACE("\tflags: "); - DDRAW_dump_DDBLT(Flags); - if (Flags & WINEDDBLT_DDFX) - { - TRACE("\tblitfx: "); - DDRAW_dump_DDBLTFX(DDBltFx->dwDDFX); - } -#endif - } + TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p, filter %s.\n", + iface, wine_dbgstr_rect(DestRect), src_surface, wine_dbgstr_rect(SrcRect), + Flags, DDBltFx, debug_d3dtexturefiltertype(Filter)); - if ( (This->Flags & SFLAG_LOCKED) || ((Src != NULL) && (Src->Flags & SFLAG_LOCKED))) + if ((This->Flags & SFLAG_LOCKED) || (src && (src->Flags & SFLAG_LOCKED))) { WARN(" Surface is busy, returning DDERR_SURFACEBUSY\n"); return WINEDDERR_SURFACEBUSY; @@ -995,21 +955,21 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D if (SrcRect) { - if (Src) + if (src) { if (SrcRect->right < SrcRect->left || SrcRect->bottom < SrcRect->top - || SrcRect->left > Src->currentDesc.Width || SrcRect->left < 0 - || SrcRect->top > Src->currentDesc.Height || SrcRect->top < 0 - || SrcRect->right > Src->currentDesc.Width || SrcRect->right < 0 - || SrcRect->bottom > Src->currentDesc.Height || SrcRect->bottom < 0) + || SrcRect->left > src->currentDesc.Width || SrcRect->left < 0 + || SrcRect->top > src->currentDesc.Height || SrcRect->top < 0 + || SrcRect->right > src->currentDesc.Width || SrcRect->right < 0 + || SrcRect->bottom > src->currentDesc.Height || SrcRect->bottom < 0) { WARN("Application gave us bad source rectangle for Blt.\n"); return WINEDDERR_INVALIDRECT; } if (!SrcRect->right || !SrcRect->bottom - || SrcRect->left == (int)Src->currentDesc.Width - || SrcRect->top == (int)Src->currentDesc.Height) + || SrcRect->left == (int)src->currentDesc.Width + || SrcRect->top == (int)src->currentDesc.Height) { TRACE("Nothing to be done.\n"); return WINED3D_OK; @@ -1018,12 +978,12 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D xsrc = *SrcRect; } - else if (Src) + else if (src) { xsrc.left = 0; xsrc.top = 0; - xsrc.right = Src->currentDesc.Width; - xsrc.bottom = Src->currentDesc.Height; + xsrc.right = src->currentDesc.Width; + xsrc.bottom = src->currentDesc.Height; } else { @@ -1052,7 +1012,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D return WINED3D_OK; } - if (!Src) + if (!src) { RECT full_rect; @@ -1114,8 +1074,8 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D || (xdst.left >= (int)This->currentDesc.Width) || (xdst.top >= (int)This->currentDesc.Height) || (xsrc.right <= 0) || (xsrc.bottom <= 0) - || (xsrc.left >= (int) Src->currentDesc.Width) - || (xsrc.top >= (int)Src->currentDesc.Height)) + || (xsrc.left >= (int)src->currentDesc.Width) + || (xsrc.top >= (int)src->currentDesc.Height)) { TRACE("Nothing to be done after clipping.\n"); return WINED3D_OK; @@ -1131,29 +1091,30 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D xdst.bottom = This->currentDesc.Height; } - if (Src == This) + if (src == This) { IWineD3DSurface_LockRect(iface, &dlock, NULL, 0); slock = dlock; - sEntry = This->resource.format_desc; + sEntry = This->resource.format; dEntry = sEntry; } else { - dEntry = This->resource.format_desc; - if (Src) + dEntry = This->resource.format; + if (src) { - if (This->resource.format_desc->format != Src->resource.format_desc->format) + if (This->resource.format->id != src->resource.format->id) { - Src = surface_convert_format(Src, dEntry->format); - if(!Src) { + src = surface_convert_format(src, dEntry->id); + if (!src) + { /* The conv function writes a FIXME */ WARN("Cannot convert source surface format to dest format\n"); goto release; } } - IWineD3DSurface_LockRect((IWineD3DSurface *) Src, &slock, NULL, WINED3DLOCK_READONLY); - sEntry = Src->resource.format_desc; + IWineD3DSurface_LockRect((IWineD3DSurface *)src, &slock, NULL, WINED3DLOCK_READONLY); + sEntry = src->resource.format; } else { @@ -1169,21 +1130,21 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D if (sEntry->Flags & dEntry->Flags & WINED3DFMT_FLAG_FOURCC) { - if (!DestRect || Src == This) + if (!DestRect || src == This) { memcpy(dlock.pBits, slock.pBits, This->resource.size); goto release; } } - bpp = This->resource.format_desc->byte_count; + bpp = This->resource.format->byte_count; srcheight = xsrc.bottom - xsrc.top; srcwidth = xsrc.right - xsrc.left; dstheight = xdst.bottom - xdst.top; dstwidth = xdst.right - xdst.left; width = (xdst.right - xdst.left) * bpp; - if (DestRect && Src != This) + if (DestRect && src != This) dbuf = dlock.pBits; else dbuf = (BYTE*)dlock.pBits+(xdst.top*dlock.Pitch)+(xdst.left*bpp); @@ -1248,7 +1209,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D FIXME("\tDdraw Raster Ops: %08x Pattern: %p\n", DDBltFx->dwDDROP, DDBltFx->u5.lpDDSPattern); } /* Now the 'with source' blits */ - if (Src) + if (src) { const BYTE *sbase; int sx, xinc, sy, yinc; @@ -1271,7 +1232,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D sbuf = sbase; /* check for overlapping surfaces */ - if (Src != This || xdst.top < xsrc.top || + if (src != This || xdst.top < xsrc.top || xdst.right <= xsrc.left || xsrc.right <= xdst.left) { /* no overlap, or dst above src, so copy from top downwards */ @@ -1379,8 +1340,8 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D /* The color keying flags are checked for correctness in ddraw */ if (Flags & WINEDDBLT_KEYSRC) { - keylow = Src->SrcBltCKey.dwColorSpaceLowValue; - keyhigh = Src->SrcBltCKey.dwColorSpaceHighValue; + keylow = src->SrcBltCKey.dwColorSpaceLowValue; + keyhigh = src->SrcBltCKey.dwColorSpaceHighValue; } else if (Flags & WINEDDBLT_KEYSRCOVERRIDE) { @@ -1391,8 +1352,8 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D if (Flags & WINEDDBLT_KEYDEST) { /* Destination color keys are taken from the source surface ! */ - destkeylow = Src->DestBltCKey.dwColorSpaceLowValue; - destkeyhigh = Src->DestBltCKey.dwColorSpaceHighValue; + destkeylow = src->DestBltCKey.dwColorSpaceLowValue; + destkeyhigh = src->DestBltCKey.dwColorSpaceHighValue; } else if (Flags & WINEDDBLT_KEYDESTOVERRIDE) { @@ -1563,9 +1524,9 @@ error: release: IWineD3DSurface_UnlockRect(iface); - if (Src && Src != This) IWineD3DSurface_UnlockRect((IWineD3DSurface *) Src); + if (src && src != This) IWineD3DSurface_UnlockRect((IWineD3DSurface *)src); /* Release the converted surface if any */ - if (Src && SrcSurface != (IWineD3DSurface *) Src) IWineD3DSurface_Release((IWineD3DSurface *) Src); + if (src && src_surface != (IWineD3DSurface *)src) IWineD3DSurface_Release((IWineD3DSurface *)src); return ret; } @@ -1579,7 +1540,7 @@ release: * Params: * dstx: * dsty: - * Source: Source surface to copy from + * src_surface: Source surface to copy from * rsrc: Source rectangle * trans: Some Flags * @@ -1588,10 +1549,10 @@ release: * *****************************************************************************/ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dstx, DWORD dsty, - IWineD3DSurface *Source, const RECT *rsrc, DWORD trans) + IWineD3DSurface *src_surface, const RECT *rsrc, DWORD trans) { - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; - IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) Source; + IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; + IWineD3DSurfaceImpl *src = (IWineD3DSurfaceImpl *)src_surface; int bpp, w, h, x, y; WINED3DLOCKED_RECT dlock,slock; @@ -1600,25 +1561,12 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst RECT lock_src, lock_dst, lock_union; const BYTE *sbuf; BYTE *dbuf; - const struct wined3d_format_desc *sEntry, *dEntry; + const struct wined3d_format *sEntry, *dEntry; - if (TRACE_ON(d3d_surface)) - { - TRACE("(%p)->(%d,%d,%p,%p,%08x)\n", This,dstx,dsty,Src,rsrc,trans); + TRACE("iface %p, dst_x %u, dst_y %u, src_surface %p, src_rect %s, flags %#x.\n", + iface, dstx, dsty, src_surface, wine_dbgstr_rect(rsrc), trans); - if (rsrc) - { - TRACE("\tsrcrect: %dx%d-%dx%d\n",rsrc->left,rsrc->top, - rsrc->right,rsrc->bottom); - } - else - { - TRACE(" srcrect: NULL\n"); - } - } - - if ((This->Flags & SFLAG_LOCKED) || - (Src->Flags & SFLAG_LOCKED)) + if ((This->Flags & SFLAG_LOCKED) || (src->Flags & SFLAG_LOCKED)) { WARN(" Surface is busy, returning DDERR_SURFACEBUSY\n"); return WINEDDERR_SURFACEBUSY; @@ -1629,17 +1577,17 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst WARN("rsrc is NULL!\n"); rsrc2.left = 0; rsrc2.top = 0; - rsrc2.right = Src->currentDesc.Width; - rsrc2.bottom = Src->currentDesc.Height; + rsrc2.right = src->currentDesc.Width; + rsrc2.bottom = src->currentDesc.Height; rsrc = &rsrc2; } /* Check source rect for validity. Copied from normal Blt. Fixes Baldur's Gate.*/ - if ((rsrc->bottom > Src->currentDesc.Height) || (rsrc->bottom < 0) || - (rsrc->top > Src->currentDesc.Height) || (rsrc->top < 0) || - (rsrc->left > Src->currentDesc.Width) || (rsrc->left < 0) || - (rsrc->right > Src->currentDesc.Width) || (rsrc->right < 0) || - (rsrc->right < rsrc->left) || (rsrc->bottom < rsrc->top)) + if ((rsrc->bottom > src->currentDesc.Height) || (rsrc->bottom < 0) + || (rsrc->top > src->currentDesc.Height) || (rsrc->top < 0) + || (rsrc->left > src->currentDesc.Width) || (rsrc->left < 0) + || (rsrc->right > src->currentDesc.Width) || (rsrc->right < 0) + || (rsrc->right < rsrc->left) || (rsrc->bottom < rsrc->top)) { WARN("Application gave us bad source rectangle for BltFast.\n"); return WINEDDERR_INVALIDRECT; @@ -1647,12 +1595,12 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst h = rsrc->bottom - rsrc->top; if (h > This->currentDesc.Height-dsty) h = This->currentDesc.Height-dsty; - if (h > Src->currentDesc.Height-rsrc->top) h=Src->currentDesc.Height-rsrc->top; + if (h > src->currentDesc.Height-rsrc->top) h = src->currentDesc.Height-rsrc->top; if (h <= 0) return WINEDDERR_INVALIDRECT; w = rsrc->right - rsrc->left; if (w > This->currentDesc.Width-dstx) w = This->currentDesc.Width-dstx; - if (w > Src->currentDesc.Width-rsrc->left) w = Src->currentDesc.Width-rsrc->left; + if (w > src->currentDesc.Width-rsrc->left) w = src->currentDesc.Width-rsrc->left; if (w <= 0) return WINEDDERR_INVALIDRECT; /* Now compute the locking rectangle... */ @@ -1666,10 +1614,10 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst lock_dst.right = dstx + w; lock_dst.bottom = dsty + h; - bpp = This->resource.format_desc->byte_count; + bpp = This->resource.format->byte_count; /* We need to lock the surfaces, or we won't get refreshes when done. */ - if (Src == This) + if (src == This) { int pitch; @@ -1685,12 +1633,12 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst /* Since slock was originally copied from this surface's description, we can just reuse it */ sbuf = This->resource.allocatedMemory + lock_src.top * pitch + lock_src.left * bpp; dbuf = This->resource.allocatedMemory + lock_dst.top * pitch + lock_dst.left * bpp; - sEntry = Src->resource.format_desc; + sEntry = src->resource.format; dEntry = sEntry; } else { - ret = IWineD3DSurface_LockRect(Source, &slock, &lock_src, WINED3DLOCK_READONLY); + ret = IWineD3DSurface_LockRect(src_surface, &slock, &lock_src, WINED3DLOCK_READONLY); if(ret != WINED3D_OK) goto error; ret = IWineD3DSurface_LockRect(iface, &dlock, &lock_dst, 0); if(ret != WINED3D_OK) goto error; @@ -1699,8 +1647,8 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst dbuf = dlock.pBits; TRACE("Dst is at %p, Src is at %p\n", dbuf, sbuf); - sEntry = Src->resource.format_desc; - dEntry = This->resource.format_desc; + sEntry = src->resource.format; + dEntry = This->resource.format; } /* Handle compressed surfaces first... */ @@ -1713,7 +1661,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst FIXME("trans arg not supported when a compressed surface is involved\n"); if (dstx || dsty) FIXME("offset for destination surface is not supported\n"); - if (Src->resource.format_desc->format != This->resource.format_desc->format) + if (src->resource.format->id != This->resource.format->id) { FIXME("compressed -> compressed copy only supported for the same type of surface\n"); ret = WINED3DERR_WRONGTEXTUREFORMAT; @@ -1742,9 +1690,9 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst if (trans & (WINEDDBLTFAST_SRCCOLORKEY | WINEDDBLTFAST_DESTCOLORKEY)) { DWORD keylow, keyhigh; - DWORD mask = Src->resource.format_desc->red_mask | - Src->resource.format_desc->green_mask | - Src->resource.format_desc->blue_mask; + DWORD mask = src->resource.format->red_mask + | src->resource.format->green_mask + | src->resource.format->blue_mask; /* For some 8-bit formats like L8 and P8 color masks don't make sense */ if(!mask && bpp==1) @@ -1753,8 +1701,8 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst TRACE("Color keyed copy\n"); if (trans & WINEDDBLTFAST_SRCCOLORKEY) { - keylow = Src->SrcBltCKey.dwColorSpaceLowValue; - keyhigh = Src->SrcBltCKey.dwColorSpaceHighValue; + keylow = src->SrcBltCKey.dwColorSpaceLowValue; + keyhigh = src->SrcBltCKey.dwColorSpaceHighValue; } else { @@ -1845,14 +1793,14 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst } error: - if (Src == This) + if (src == This) { IWineD3DSurface_UnlockRect(iface); } else { IWineD3DSurface_UnlockRect(iface); - IWineD3DSurface_UnlockRect(Source); + IWineD3DSurface_UnlockRect(src_surface); } return ret; @@ -1867,7 +1815,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DL pLockedRect->Pitch = IWineD3DSurface_GetPitch(iface); - if (NULL == pRect) + if (!pRect) { pLockedRect->pBits = This->resource.allocatedMemory; This->lockedRect.left = 0; @@ -1881,24 +1829,24 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DL } else { - const struct wined3d_format_desc *format_desc = This->resource.format_desc; + const struct wined3d_format *format = This->resource.format; TRACE("Lock Rect (%p) = l %d, t %d, r %d, b %d\n", pRect, pRect->left, pRect->top, pRect->right, pRect->bottom); - if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + if ((format->Flags & (WINED3DFMT_FLAG_COMPRESSED | WINED3DFMT_FLAG_BROKEN_PITCH)) == WINED3DFMT_FLAG_COMPRESSED) { /* Compressed textures are block based, so calculate the offset of * the block that contains the top-left pixel of the locked rectangle. */ pLockedRect->pBits = This->resource.allocatedMemory - + ((pRect->top / format_desc->block_height) * pLockedRect->Pitch) - + ((pRect->left / format_desc->block_width) * format_desc->block_byte_count); + + ((pRect->top / format->block_height) * pLockedRect->Pitch) + + ((pRect->left / format->block_width) * format->block_byte_count); } else { pLockedRect->pBits = This->resource.allocatedMemory + (pLockedRect->Pitch * pRect->top) + - (pRect->left * format_desc->byte_count); + (pRect->left * format->byte_count); } This->lockedRect.left = pRect->left; This->lockedRect.top = pRect->top; @@ -1912,10 +1860,6 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DL return WINED3D_OK; } -void WINAPI IWineD3DBaseSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb) { - ERR("Should not be called on base texture\n"); -} - /* TODO: think about moving this down to resource? */ const void *WINAPI IWineD3DBaseSurfaceImpl_GetData(IWineD3DSurface *iface) { diff --git a/dll/directx/wine/wined3d/surface_gdi.c b/dll/directx/wine/wined3d/surface_gdi.c index 580c88a9080..a640b794ee5 100644 --- a/dll/directx/wine/wined3d/surface_gdi.c +++ b/dll/directx/wine/wined3d/surface_gdi.c @@ -167,7 +167,6 @@ static HRESULT WINAPI IWineGDISurfaceImpl_UnlockRect(IWineD3DSurface *iface) { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - IWineD3DSwapChainImpl *swapchain = NULL; TRACE("(%p)\n", This); if (!(This->Flags & SFLAG_LOCKED)) @@ -176,35 +175,14 @@ IWineGDISurfaceImpl_UnlockRect(IWineD3DSurface *iface) return WINEDDERR_NOTLOCKED; } - /* Can be useful for debugging */ -#if 0 - { - static unsigned int gen = 0; - char buffer[4096]; - ++gen; - if ((gen % 10) == 0) { - snprintf(buffer, sizeof(buffer), "/tmp/surface%p_type%u_level%u_%u.ppm", - This, This->texture_target, This->texture_level, gen); - IWineD3DSurfaceImpl_SaveSnapshot(iface, buffer); - } - /* - * debugging crash code - if (gen == 250) { - void** test = NULL; - *test = 0; - } - */ - } -#endif - /* Tell the swapchain to update the screen */ - if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **)&swapchain))) + if (This->container.type == WINED3D_CONTAINER_SWAPCHAIN) { + IWineD3DSwapChainImpl *swapchain = This->container.u.swapchain; if (This == swapchain->front_buffer) { x11_copy_to_screen(swapchain, &This->lockedRect); } - IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); } This->Flags &= ~SFLAG_LOCKED; @@ -231,18 +209,20 @@ IWineGDISurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DSurface *override, DWORD Flags) { - IWineD3DSwapChainImpl *swapchain = NULL; + IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)iface; + IWineD3DSwapChainImpl *swapchain; HRESULT hr; - if(FAILED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **)&swapchain))) + if (surface->container.type != WINED3D_CONTAINER_SWAPCHAIN) { ERR("Flipped surface is not on a swapchain\n"); return WINEDDERR_NOTFLIPPABLE; } + swapchain = surface->container.u.swapchain; hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *)swapchain, NULL, NULL, swapchain->win_handle, NULL, 0); - IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); + return hr; } @@ -262,118 +242,9 @@ IWineGDISurfaceImpl_LoadTexture(IWineD3DSurface *iface, BOOL srgb_mode) return WINED3DERR_INVALIDCALL; } -/***************************************************************************** - * IWineD3DSurface::SaveSnapshot, GDI version - * - * This method writes the surface's contents to the in tga format to the - * file specified in filename. - * - * Params: - * filename: File to write to - * - * Returns: - * WINED3DERR_INVALIDCALL if the file couldn't be opened - * WINED3D_OK on success - * - *****************************************************************************/ -static int get_shift(DWORD color_mask) { - int shift = 0; - while (color_mask > 0xFF) { - color_mask >>= 1; - shift += 1; - } - while ((color_mask & 0x80) == 0) { - color_mask <<= 1; - shift -= 1; - } - return shift; -} - - -static HRESULT WINAPI -IWineGDISurfaceImpl_SaveSnapshot(IWineD3DSurface *iface, -const char* filename) +static void WINAPI IWineGDISurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb) { - FILE* f = NULL; - UINT y = 0, x = 0; - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - const struct wined3d_format_desc *format_desc = This->resource.format_desc; - static char *output = NULL; - static UINT size = 0; - - if (This->pow2Width > size) { - output = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->pow2Width * 3); - size = This->pow2Width; - } - - - f = fopen(filename, "w+"); - if (NULL == f) { - ERR("opening of %s failed with\n", filename); - return WINED3DERR_INVALIDCALL; - } - fprintf(f, "P6\n%d %d\n255\n", This->pow2Width, This->pow2Height); - - if (This->resource.format_desc->format == WINED3DFMT_P8_UINT) - { - unsigned char table[256][3]; - int i; - - if (This->palette == NULL) { - fclose(f); - return WINED3DERR_INVALIDCALL; - } - for (i = 0; i < 256; i++) { - table[i][0] = This->palette->palents[i].peRed; - table[i][1] = This->palette->palents[i].peGreen; - table[i][2] = This->palette->palents[i].peBlue; - } - for (y = 0; y < This->pow2Height; y++) { - unsigned char *src = This->resource.allocatedMemory + (y * 1 * IWineD3DSurface_GetPitch(iface)); - for (x = 0; x < This->pow2Width; x++) { - unsigned char color = *src; - src += 1; - - output[3 * x + 0] = table[color][0]; - output[3 * x + 1] = table[color][1]; - output[3 * x + 2] = table[color][2]; - } - fwrite(output, 3 * This->pow2Width, 1, f); - } - } else { - int red_shift, green_shift, blue_shift, pix_width; - - pix_width = format_desc->byte_count; - - red_shift = get_shift(format_desc->red_mask); - green_shift = get_shift(format_desc->green_mask); - blue_shift = get_shift(format_desc->blue_mask); - - for (y = 0; y < This->pow2Height; y++) { - const unsigned char *src = This->resource.allocatedMemory + (y * 1 * IWineD3DSurface_GetPitch(iface)); - for (x = 0; x < This->pow2Width; x++) { - unsigned int color; - unsigned int comp; - int i; - - color = 0; - for (i = 0; i < pix_width; i++) { - color |= src[i] << (8 * i); - } - src += 1 * pix_width; - - comp = color & format_desc->red_mask; - output[3 * x + 0] = red_shift > 0 ? comp >> red_shift : comp << -red_shift; - comp = color & format_desc->green_mask; - output[3 * x + 1] = green_shift > 0 ? comp >> green_shift : comp << -green_shift; - comp = color & format_desc->blue_mask; - output[3 * x + 2] = blue_shift > 0 ? comp >> blue_shift : comp << -blue_shift; - } - fwrite(output, 3 * This->pow2Width, 1, f); - } - } - fclose(f); - return WINED3D_OK; + ERR("Not supported.\n"); } static HRESULT WINAPI IWineGDISurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHDC) { @@ -418,8 +289,8 @@ static HRESULT WINAPI IWineGDISurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHD return hr; } - if (This->resource.format_desc->format == WINED3DFMT_P8_UINT - || This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM) + if (This->resource.format->id == WINED3DFMT_P8_UINT + || This->resource.format->id == WINED3DFMT_P8_UINT_A8_UNORM) { unsigned int n; const PALETTEENTRY *pal = NULL; @@ -479,7 +350,6 @@ static HRESULT WINAPI IWineGDISurfaceImpl_RealizePalette(IWineD3DSurface *iface) RGBQUAD col[256]; IWineD3DPaletteImpl *pal = This->palette; unsigned int n; - IWineD3DSwapChainImpl *swapchain; TRACE("(%p)\n", This); if (!pal) return WINED3D_OK; @@ -498,13 +368,13 @@ static HRESULT WINAPI IWineGDISurfaceImpl_RealizePalette(IWineD3DSurface *iface) /* Update the image because of the palette change. Some games like e.g Red Alert call SetEntries a lot to implement fading. */ /* Tell the swapchain to update the screen */ - if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **)&swapchain))) + if (This->container.type == WINED3D_CONTAINER_SWAPCHAIN) { + IWineD3DSwapChainImpl *swapchain = This->container.u.swapchain; if (This == swapchain->front_buffer) { x11_copy_to_screen(swapchain, NULL); } - IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); } return WINED3D_OK; @@ -604,28 +474,6 @@ static HRESULT WINAPI IWineGDISurfaceImpl_SetMem(IWineD3DSurface *iface, void *M return WINED3D_OK; } -/*************************** - * - ***************************/ -static void WINAPI IWineGDISurfaceImpl_ModifyLocation(IWineD3DSurface *iface, DWORD flag, BOOL persistent) { - TRACE("(%p)->(%s, %s)\n", iface, - flag == SFLAG_INSYSMEM ? "SFLAG_INSYSMEM" : flag == SFLAG_INDRAWABLE ? "SFLAG_INDRAWABLE" : "SFLAG_INTEXTURE", - persistent ? "TRUE" : "FALSE"); - /* GDI surfaces can be in system memory only */ - if(flag != SFLAG_INSYSMEM) { - ERR("GDI Surface requested in gl %s memory\n", flag == SFLAG_INDRAWABLE ? "drawable" : "texture"); - } -} - -static HRESULT WINAPI IWineGDISurfaceImpl_LoadLocation(IWineD3DSurface *iface, DWORD flag, const RECT *rect) { - if(flag != SFLAG_INSYSMEM) { - ERR("GDI Surface requested to be copied to gl %s\n", flag == SFLAG_INTEXTURE ? "texture" : "drawable"); - } else { - TRACE("Surface requested in surface memory\n"); - } - return WINED3D_OK; -} - static WINED3DSURFTYPE WINAPI IWineGDISurfaceImpl_GetImplType(IWineD3DSurface *iface) { return SURFACE_GDI; } @@ -655,7 +503,6 @@ const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl = IWineGDISurfaceImpl_UnLoad, IWineD3DBaseSurfaceImpl_GetType, /* IWineD3DSurface */ - IWineD3DBaseSurfaceImpl_GetContainer, IWineD3DBaseSurfaceImpl_GetDesc, IWineGDISurfaceImpl_LockRect, IWineGDISurfaceImpl_UnlockRect, @@ -682,14 +529,10 @@ const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl = IWineD3DBaseSurfaceImpl_GetClipper, /* Internal use: */ IWineGDISurfaceImpl_LoadTexture, - IWineD3DBaseSurfaceImpl_BindTexture, - IWineGDISurfaceImpl_SaveSnapshot, - IWineD3DBaseSurfaceImpl_SetContainer, + IWineGDISurfaceImpl_BindTexture, IWineD3DBaseSurfaceImpl_GetData, IWineD3DBaseSurfaceImpl_SetFormat, IWineGDISurfaceImpl_PrivateSetup, - IWineGDISurfaceImpl_ModifyLocation, - IWineGDISurfaceImpl_LoadLocation, IWineGDISurfaceImpl_GetImplType, IWineGDISurfaceImpl_DrawOverlay }; diff --git a/dll/directx/wine/wined3d/swapchain.c b/dll/directx/wine/wined3d/swapchain.c index b0d591a7587..35558adadaa 100644 --- a/dll/directx/wine/wined3d/swapchain.c +++ b/dll/directx/wine/wined3d/swapchain.c @@ -33,7 +33,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); WINE_DECLARE_DEBUG_CHANNEL(fps); -/*IWineD3DSwapChain parts follow: */ +/* Do not call while under the GL lock. */ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface) { IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface; @@ -48,7 +48,7 @@ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface) * the last buffer to be destroyed, FindContext() depends on that. */ if (This->front_buffer) { - IWineD3DSurface_SetContainer((IWineD3DSurface *)This->front_buffer, NULL); + surface_set_container(This->front_buffer, WINED3D_CONTAINER_NONE, NULL); if (IWineD3DSurface_Release((IWineD3DSurface *)This->front_buffer)) { WARN("(%p) Something's still holding the front buffer (%p).\n", @@ -63,7 +63,7 @@ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface) while (i--) { - IWineD3DSurface_SetContainer((IWineD3DSurface *)This->back_buffers[i], NULL); + surface_set_container(This->back_buffers[i], WINED3D_CONTAINER_NONE, NULL); if (IWineD3DSurface_Release((IWineD3DSurface *)This->back_buffers[i])) WARN("(%p) Something's still holding back buffer %u (%p).\n", This, i, This->back_buffers[i]); @@ -81,7 +81,8 @@ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface) * this will be the original desktop resolution. In case of d3d7 this will be a NOP because ddraw sets the resolution * before starting up Direct3D, thus orig_width and orig_height will be equal to the modes in the presentation params */ - if(This->presentParms.Windowed == FALSE && This->presentParms.AutoRestoreDisplayMode) { + if (!This->presentParms.Windowed && This->presentParms.AutoRestoreDisplayMode) + { mode.Width = This->orig_width; mode.Height = This->orig_height; mode.RefreshRate = 0; @@ -117,15 +118,21 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context * GetClientRect(This->win_handle, &win_rect); win_h = win_rect.bottom - win_rect.top; - if (gl_info->fbo_ops.glBlitFramebuffer && is_identity_fixup(backbuffer->resource.format_desc->color_fixup)) + if (gl_info->fbo_ops.glBlitFramebuffer && is_identity_fixup(backbuffer->resource.format->color_fixup)) { ENTER_GL(); - context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, backbuffer, NULL); + context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, backbuffer, NULL, SFLAG_INTEXTURE); glReadBuffer(GL_COLOR_ATTACHMENT0); context_bind_fbo(context, GL_DRAW_FRAMEBUFFER, NULL); context_set_draw_buffer(context, GL_BACK); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE)); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1)); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2)); + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3)); + glDisable(GL_SCISSOR_TEST); IWineD3DDeviceImpl_MarkStateDirty(This->device, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE)); @@ -155,11 +162,11 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context * tex_bottom /= src_h; } - if (is_complex_fixup(backbuffer->resource.format_desc->color_fixup)) + if (is_complex_fixup(backbuffer->resource.format->color_fixup)) gl_filter = GL_NEAREST; ENTER_GL(); - context_bind_fbo(context2, GL_DRAW_FRAMEBUFFER, NULL); + context_bind_fbo(context2, GL_FRAMEBUFFER, NULL); /* Set up the texture. The surface is not in a IWineD3D*Texture container, * so there are no d3d texture settings to dirtify @@ -255,7 +262,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO cursor.resource.ref = 1; cursor.resource.device = This->device; cursor.resource.pool = WINED3DPOOL_SCRATCH; - cursor.resource.format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info); + cursor.resource.format = wined3d_get_format(gl_info, WINED3DFMT_B8G8R8A8_UNORM); cursor.resource.resourceType = WINED3DRTYPE_SURFACE; cursor.texture_name = This->device->cursorTexture; cursor.texture_target = GL_TEXTURE_2D; @@ -325,12 +332,9 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO */ if (!This->render_to_fbo && render_to_fbo && wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - IWineD3DSurface_LoadLocation((IWineD3DSurface *)This->back_buffers[0], SFLAG_INTEXTURE, NULL); - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->back_buffers[0], SFLAG_INDRAWABLE, FALSE); + surface_load_location(This->back_buffers[0], SFLAG_INTEXTURE, NULL); + surface_modify_location(This->back_buffers[0], SFLAG_INDRAWABLE, FALSE); This->render_to_fbo = TRUE; - - /* Force the context manager to update the render target configuration next draw. */ - context->current_rt = NULL; } if(This->render_to_fbo) @@ -367,46 +371,6 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO } } -#if defined(FRAME_DEBUGGING) -{ - if (GetFileAttributesA("C:\\D3DTRACE") != INVALID_FILE_ATTRIBUTES) { - if (!isOn) { - isOn = TRUE; - FIXME("Enabling D3D Trace\n"); - __WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_d3d, 1); -#if defined(SHOW_FRAME_MAKEUP) - FIXME("Singe Frame snapshots Starting\n"); - isDumpingFrames = TRUE; - ENTER_GL(); - glClear(GL_COLOR_BUFFER_BIT); - LEAVE_GL(); -#endif - -#if defined(SINGLE_FRAME_DEBUGGING) - } else { -#if defined(SHOW_FRAME_MAKEUP) - FIXME("Singe Frame snapshots Finishing\n"); - isDumpingFrames = FALSE; -#endif - FIXME("Singe Frame trace complete\n"); - DeleteFileA("C:\\D3DTRACE"); - __WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_d3d, 0); -#endif - } - } else { - if (isOn) { - isOn = FALSE; -#if defined(SHOW_FRAME_MAKEUP) - FIXME("Single Frame snapshots Finishing\n"); - isDumpingFrames = FALSE; -#endif - FIXME("Disabling D3D Trace\n"); - __WINE_SET_DEBUGGING(__WINE_DBCL_TRACE, __wine_dbch_d3d, 0); - } - } -} -#endif - /* This is disabled, but the code left in for debug purposes. * * Since we're allowed to modify the new back buffer on a D3DSWAPEFFECT_DISCARD flip, @@ -448,16 +412,18 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO * This serves to update the emulated overlay, if any */ fbflags = front->Flags; - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)front, SFLAG_INDRAWABLE, TRUE); + surface_modify_location(front, SFLAG_INDRAWABLE, TRUE); front->Flags = fbflags; - } else { - IWineD3DSurface_ModifyLocation((IWineD3DSurface *) front, SFLAG_INDRAWABLE, TRUE); - IWineD3DSurface_ModifyLocation((IWineD3DSurface *) back, SFLAG_INDRAWABLE, TRUE); + } + else + { + surface_modify_location(front, SFLAG_INDRAWABLE, TRUE); + surface_modify_location(back, SFLAG_INDRAWABLE, TRUE); } } else { - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->front_buffer, SFLAG_INDRAWABLE, TRUE); + surface_modify_location(This->front_buffer, SFLAG_INDRAWABLE, TRUE); /* If the swapeffect is DISCARD, the back buffer is undefined. That means the SYSMEM * and INTEXTURE copies can keep their old content if they have any defined content. * If the swapeffect is COPY, the content remains the same. If it is FLIP however, @@ -465,7 +431,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO */ if (This->presentParms.SwapEffect == WINED3DSWAPEFFECT_FLIP) { - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->back_buffers[0], SFLAG_INDRAWABLE, TRUE); + surface_modify_location(This->back_buffers[0], SFLAG_INDRAWABLE, TRUE); } } @@ -488,10 +454,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO if (This->presentParms.PresentationInterval != WINED3DPRESENT_INTERVAL_IMMEDIATE && gl_info->supported[SGI_VIDEO_SYNC]) { - retval = GL_EXTCALL(glXGetVideoSyncSGI(&sync)); - if(retval != 0) { + if ((retval = GL_EXTCALL(glXGetVideoSyncSGI(&sync)))) ERR("glXGetVideoSyncSGI failed(retval = %d\n", retval); - } switch(This->presentParms.PresentationInterval) { case WINED3DPRESENT_INTERVAL_DEFAULT: @@ -656,11 +620,12 @@ void swapchain_restore_fullscreen_window(IWineD3DSwapChainImpl *swapchain) } +/* Do not call while under the GL lock. */ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface_type, - IWineD3DDeviceImpl *device, WINED3DPRESENT_PARAMETERS *present_parameters, IUnknown *parent) + IWineD3DDeviceImpl *device, WINED3DPRESENT_PARAMETERS *present_parameters, void *parent) { const struct wined3d_adapter *adapter = device->adapter; - const struct wined3d_format_desc *format_desc; + const struct wined3d_format *format; BOOL displaymode_set = FALSE; WINED3DDISPLAYMODE mode; RECT client_rect; @@ -714,7 +679,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface swapchain->orig_width = mode.Width; swapchain->orig_height = mode.Height; swapchain->orig_fmt = mode.Format; - format_desc = getFormatDescEntry(mode.Format, &adapter->gl_info); + format = wined3d_get_format(&adapter->gl_info, mode.Format); GetClientRect(window, &client_rect); if (present_parameters->Windowed @@ -766,11 +731,10 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface goto err; } - IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->front_buffer, (IWineD3DBase *)swapchain); - swapchain->front_buffer->Flags |= SFLAG_SWAPCHAIN; + surface_set_container(swapchain->front_buffer, WINED3D_CONTAINER_SWAPCHAIN, (IWineD3DBase *)swapchain); if (surface_type == SURFACE_OPENGL) { - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)swapchain->front_buffer, SFLAG_INDRAWABLE, TRUE); + surface_modify_location(swapchain->front_buffer, SFLAG_INDRAWABLE, TRUE); } /* MSDN says we're only allowed a single fullscreen swapchain per device, @@ -807,7 +771,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface if (surface_type == SURFACE_OPENGL) { - WINED3DFORMAT formats[] = + static const enum wined3d_format_id formats[] = { WINED3DFMT_D24_UNORM_S8_UINT, WINED3DFMT_D32_UNORM, @@ -831,7 +795,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface * issue needs to be fixed. */ for (i = 0; i < (sizeof(formats) / sizeof(*formats)); i++) { - swapchain->ds_format = getFormatDescEntry(formats[i], gl_info); + swapchain->ds_format = wined3d_get_format(gl_info, formats[i]); swapchain->context[0] = context_create(swapchain, swapchain->front_buffer, swapchain->ds_format); if (swapchain->context[0]) break; TRACE("Depth stencil format %s is not supported, trying next format\n", @@ -846,7 +810,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface } if (!present_parameters->EnableAutoDepthStencil - || swapchain->presentParms.AutoDepthStencilFormat != swapchain->ds_format->format) + || swapchain->presentParms.AutoDepthStencilFormat != swapchain->ds_format->id) { FIXME("Add OpenGL context recreation support to context_validate_onscreen_formats\n"); } @@ -882,8 +846,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface goto err; } - IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->back_buffers[i], (IWineD3DBase *)swapchain); - swapchain->back_buffers[i]->Flags |= SFLAG_SWAPCHAIN; + surface_set_container(swapchain->back_buffers[i], WINED3D_CONTAINER_SWAPCHAIN, (IWineD3DBase *)swapchain); } } @@ -893,7 +856,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface TRACE("Creating depth/stencil buffer.\n"); if (!device->auto_depth_stencil) { - hr = IWineD3DDeviceParent_CreateDepthStencilSurface(device->device_parent, parent, + hr = IWineD3DDeviceParent_CreateDepthStencilSurface(device->device_parent, swapchain->presentParms.BackBufferWidth, swapchain->presentParms.BackBufferHeight, swapchain->presentParms.AutoDepthStencilFormat, swapchain->presentParms.MultiSampleType, swapchain->presentParms.MultiSampleQuality, FALSE /* FIXME: Discard */, @@ -904,7 +867,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface goto err; } - IWineD3DSurface_SetContainer((IWineD3DSurface *)device->auto_depth_stencil, NULL); + surface_set_container(device->auto_depth_stencil, WINED3D_CONTAINER_NONE, NULL); } } @@ -923,7 +886,7 @@ err: memset(&devmode, 0, sizeof(devmode)); devmode.dmSize = sizeof(devmode); devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; - devmode.dmBitsPerPel = format_desc->byte_count * 8; + devmode.dmBitsPerPel = format->byte_count * CHAR_BIT; devmode.dmPelsWidth = swapchain->orig_width; devmode.dmPelsHeight = swapchain->orig_height; ChangeDisplaySettingsExW(adapter->DeviceName, &devmode, NULL, CDS_FULLSCREEN, NULL); @@ -954,6 +917,7 @@ err: return hr; } +/* Do not call while under the GL lock. */ struct wined3d_context *swapchain_create_context_for_thread(IWineD3DSwapChain *iface) { IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *) iface; @@ -969,7 +933,7 @@ struct wined3d_context *swapchain_create_context_for_thread(IWineD3DSwapChain *i } context_release(ctx); - newArray = HeapAlloc(GetProcessHeap(), 0, sizeof(*newArray) * This->num_contexts + 1); + newArray = HeapAlloc(GetProcessHeap(), 0, sizeof(*newArray) * (This->num_contexts + 1)); if(!newArray) { ERR("Out of memory when trying to allocate a new context array\n"); context_destroy(This->device, ctx); diff --git a/dll/directx/wine/wined3d/swapchain_base.c b/dll/directx/wine/wined3d/swapchain_base.c index 1817de2079a..083585fbb56 100644 --- a/dll/directx/wine/wined3d/swapchain_base.c +++ b/dll/directx/wine/wined3d/swapchain_base.c @@ -53,30 +53,32 @@ ULONG WINAPI IWineD3DBaseSwapChainImpl_AddRef(IWineD3DSwapChain *iface) { return refCount; } -ULONG WINAPI IWineD3DBaseSwapChainImpl_Release(IWineD3DSwapChain *iface) { +/* Do not call while under the GL lock. */ +ULONG WINAPI IWineD3DBaseSwapChainImpl_Release(IWineD3DSwapChain *iface) +{ IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface; DWORD refCount; refCount = InterlockedDecrement(&This->ref); TRACE("(%p) : ReleaseRef to %d\n", This, refCount); - if (refCount == 0) { - IWineD3DSwapChain_Destroy(iface); - } + + if (!refCount) IWineD3DSwapChain_Destroy(iface); + return refCount; } -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetParent(IWineD3DSwapChain *iface, IUnknown ** ppParent){ - IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface; - *ppParent = This->parent; - IUnknown_AddRef(*ppParent); - TRACE("(%p) returning %p\n", This , *ppParent); - return WINED3D_OK; +void * WINAPI IWineD3DBaseSwapChainImpl_GetParent(IWineD3DSwapChain *iface) +{ + TRACE("iface %p.\n", iface); + + return ((IWineD3DSwapChainImpl *)iface)->parent; } -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetFrontBufferData(IWineD3DSwapChain *iface, IWineD3DSurface *pDestSurface) { +HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetFrontBufferData(IWineD3DSwapChain *iface, IWineD3DSurface *dst_surface) +{ IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface; POINT start; - TRACE("(%p) : iface(%p) pDestSurface(%p)\n", This, iface, pDestSurface); + TRACE("iface %p, dst_surface %p.\n", iface, dst_surface); start.x = 0; start.y = 0; @@ -85,53 +87,54 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetFrontBufferData(IWineD3DSwapChain *i MapWindowPoints(This->win_handle, NULL, &start, 1); } - IWineD3DSurface_BltFast(pDestSurface, start.x, start.y, (IWineD3DSurface *)This->front_buffer, NULL, 0); + IWineD3DSurface_BltFast(dst_surface, start.x, start.y, (IWineD3DSurface *)This->front_buffer, NULL, 0); return WINED3D_OK; } -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetBackBuffer(IWineD3DSwapChain *iface, UINT iBackBuffer, WINED3DBACKBUFFER_TYPE Type, IWineD3DSurface **ppBackBuffer) { +HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetBackBuffer(IWineD3DSwapChain *iface, + UINT back_buffer_idx, WINED3DBACKBUFFER_TYPE type, IWineD3DSurface **back_buffer) +{ + IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)iface; - IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface; + TRACE("iface %p, back_buffer_idx %u, type %#x, back_buffer %p.\n", + iface, back_buffer_idx, type, back_buffer); - if (iBackBuffer > This->presentParms.BackBufferCount - 1) { - TRACE("Back buffer count out of range\n"); - /* Native d3d9 doesn't set NULL here, just as wine's d3d9. But set it - * here in wined3d to avoid problems in other libs - */ - *ppBackBuffer = NULL; - return WINED3DERR_INVALIDCALL; - } - - /* Return invalid if there is no backbuffer array, otherwise it will crash when ddraw is - * used (there This->backBuffer is always NULL). We need this because this function has - * to be called from IWineD3DStateBlockImpl_InitStartupStateBlock to get the default + /* Return invalid if there is no backbuffer array, otherwise it will + * crash when ddraw is used (there swapchain->back_buffers is always NULL). + * We need this because this function is called from + * IWineD3DStateBlockImpl_InitStartupStateBlock() to get the default * scissorrect dimensions. */ - if (!This->back_buffers) + if (!swapchain->back_buffers || back_buffer_idx >= swapchain->presentParms.BackBufferCount) { - *ppBackBuffer = NULL; + WARN("Invalid back buffer index.\n"); + /* Native d3d9 doesn't set NULL here, just as wine's d3d9. But set it + * here in wined3d to avoid problems in other libs. */ + *back_buffer = NULL; return WINED3DERR_INVALIDCALL; } - *ppBackBuffer = (IWineD3DSurface *)This->back_buffers[iBackBuffer]; - TRACE("(%p) : BackBuf %d Type %d returning %p\n", This, iBackBuffer, Type, *ppBackBuffer); + *back_buffer = (IWineD3DSurface *)swapchain->back_buffers[back_buffer_idx]; + if (*back_buffer) IWineD3DSurface_AddRef(*back_buffer); + + TRACE("Returning back buffer %p.\n", *back_buffer); - /* Note inc ref on returned surface */ - if(*ppBackBuffer) IWineD3DSurface_AddRef(*ppBackBuffer); return WINED3D_OK; - } HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetRasterStatus(IWineD3DSwapChain *iface, WINED3DRASTER_STATUS *pRasterStatus) { static BOOL warned; - pRasterStatus->InVBlank = TRUE; - pRasterStatus->ScanLine = 0; - /* No openGL equivalent */ + /* No OpenGL equivalent */ if (!warned) { FIXME("iface %p, raster_status %p stub!\n", iface, pRasterStatus); warned = TRUE; } - return WINED3D_OK; + /* Obtaining the raster status is a widely implemented but optional feature. + * When this method returns OK then the application Starcraft 2 expects that + * the pRasterStatus->InVBlank value differs over time. To prevent Starcraft 2 + * from running in an infinite loop at startup this method returns INVALIDCALL. + */ + return WINED3DERR_INVALIDCALL; } HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDisplayMode(IWineD3DSwapChain *iface, WINED3DDISPLAYMODE*pMode) { diff --git a/dll/directx/wine/wined3d/swapchain_gdi.c b/dll/directx/wine/wined3d/swapchain_gdi.c index b80352c1dce..8920caec85c 100644 --- a/dll/directx/wine/wined3d/swapchain_gdi.c +++ b/dll/directx/wine/wined3d/swapchain_gdi.c @@ -39,7 +39,7 @@ static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface) /* release the ref to the front and back buffer parents */ if (This->front_buffer) { - IWineD3DSurface_SetContainer((IWineD3DSurface *)This->front_buffer, NULL); + surface_set_container(This->front_buffer, WINED3D_CONTAINER_NONE, NULL); if (IWineD3DSurface_Release((IWineD3DSurface *)This->front_buffer) > 0) { WARN("(%p) Something's still holding the front buffer\n",This); @@ -51,7 +51,7 @@ static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface) UINT i; for (i = 0; i < This->presentParms.BackBufferCount; ++i) { - IWineD3DSurface_SetContainer((IWineD3DSurface *)This->back_buffers[i], NULL); + surface_set_container(This->back_buffers[i], WINED3D_CONTAINER_NONE, NULL); if (IWineD3DSurface_Release((IWineD3DSurface *)This->back_buffers[i])) { WARN("(%p) Something's still holding the back buffer\n",This); @@ -65,7 +65,8 @@ static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface) * this will be the original desktop resolution. In case of d3d7 this will be a NOP because ddraw sets the resolution * before starting up Direct3D, thus orig_width and orig_height will be equal to the modes in the presentation params */ - if(This->presentParms.Windowed == FALSE && This->presentParms.AutoRestoreDisplayMode) { + if (!This->presentParms.Windowed && This->presentParms.AutoRestoreDisplayMode) + { mode.Width = This->orig_width; mode.Height = This->orig_height; mode.RefreshRate = 0; diff --git a/dll/directx/wine/wined3d/texture.c b/dll/directx/wine/wined3d/texture.c index 98e7909370e..ce95567f547 100644 --- a/dll/directx/wine/wined3d/texture.c +++ b/dll/directx/wine/wined3d/texture.c @@ -27,6 +27,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture); +/* Do not call while under the GL lock. */ static void texture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb) { /* Override the IWineD3DResource PreLoad method. */ @@ -66,8 +67,8 @@ static void texture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRG context = context_acquire(device, NULL); } - if (This->resource.format_desc->format == WINED3DFMT_P8_UINT - || This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM) + if (This->resource.format->id == WINED3DFMT_P8_UINT + || This->resource.format->id == WINED3DFMT_P8_UINT_A8_UNORM) { for (i = 0; i < This->baseTexture.level_count; ++i) { @@ -76,9 +77,9 @@ static void texture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRG { TRACE("Reloading surface because the d3d8/9 palette was changed.\n"); /* TODO: This is not necessarily needed with hw palettized texture support. */ - IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, NULL); + surface_load_location(surface, SFLAG_INSYSMEM, NULL); /* Make sure the texture is reloaded because of the palette change, this kills performance though :( */ - IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INTEXTURE, FALSE); + surface_modify_location(surface, SFLAG_INTEXTURE, FALSE); } } } @@ -119,7 +120,7 @@ static void texture_cleanup(IWineD3DTextureImpl *This) surface_set_texture_name(surface, 0, TRUE); surface_set_texture_name(surface, 0, FALSE); surface_set_texture_target(surface, 0); - IWineD3DSurface_SetContainer((IWineD3DSurface *)surface, NULL); + surface_set_container(surface, WINED3D_CONTAINER_NONE, NULL); IWineD3DSurface_Release((IWineD3DSurface *)surface); } } @@ -155,6 +156,7 @@ static ULONG WINAPI IWineD3DTextureImpl_AddRef(IWineD3DTexture *iface) { return InterlockedIncrement(&This->resource.ref); } +/* Do not call while under the GL lock. */ static ULONG WINAPI IWineD3DTextureImpl_Release(IWineD3DTexture *iface) { IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface; ULONG ref; @@ -193,10 +195,12 @@ static DWORD WINAPI IWineD3DTextureImpl_GetPriority(IWineD3DTexture *iface) { return resource_get_priority((IWineD3DResource *)iface); } +/* Do not call while under the GL lock. */ static void WINAPI IWineD3DTextureImpl_PreLoad(IWineD3DTexture *iface) { texture_internal_preload((IWineD3DBaseTexture *) iface, SRGB_ANY); } +/* Do not call while under the GL lock. */ static void WINAPI IWineD3DTextureImpl_UnLoad(IWineD3DTexture *iface) { unsigned int i; IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface; @@ -221,8 +225,11 @@ static WINED3DRESOURCETYPE WINAPI IWineD3DTextureImpl_GetType(IWineD3DTexture *i return resource_get_type((IWineD3DResource *)iface); } -static HRESULT WINAPI IWineD3DTextureImpl_GetParent(IWineD3DTexture *iface, IUnknown **pParent) { - return resource_get_parent((IWineD3DResource *)iface, pParent); +static void * WINAPI IWineD3DTextureImpl_GetParent(IWineD3DTexture *iface) +{ + TRACE("iface %p.\n", iface); + + return ((IWineD3DTextureImpl *)iface)->resource.parent; } /* ****************************************************** @@ -294,16 +301,19 @@ static HRESULT WINAPI IWineD3DTextureImpl_BindTexture(IWineD3DTexture *iface, BO * state. The same applies to filtering. Even if the texture has only * one mip level, the default LINEAR_MIPMAP_LINEAR filter causes a SW * fallback on macos. */ - if(IWineD3DBaseTexture_IsCondNP2(iface)) { + if (IWineD3DBaseTexture_IsCondNP2(iface)) + { + GLenum target = This->baseTexture.target; + ENTER_GL(); - glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - checkGLcall("glTexParameteri(dimension, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)"); - glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - checkGLcall("glTexParameteri(dimension, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)"); - glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_MIN_FILTER, GL_NEAREST); - checkGLcall("glTexParameteri(dimension, GL_TEXTURE_MIN_FILTER, GL_NEAREST)"); - glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_MAG_FILTER, GL_NEAREST); - checkGLcall("glTexParameteri(dimension, GL_TEXTURE_MAG_FILTER, GL_NEAREST)"); + glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + checkGLcall("glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)"); + glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + checkGLcall("glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)"); + glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + checkGLcall("glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)"); + glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + checkGLcall("glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)"); LEAVE_GL(); gl_tex->states[WINED3DTEXSTA_ADDRESSU] = WINED3DTADDRESS_CLAMP; gl_tex->states[WINED3DTEXSTA_ADDRESSV] = WINED3DTADDRESS_CLAMP; @@ -316,13 +326,6 @@ static HRESULT WINAPI IWineD3DTextureImpl_BindTexture(IWineD3DTexture *iface, BO return hr; } -static UINT WINAPI IWineD3DTextureImpl_GetTextureDimensions(IWineD3DTexture *iface) { - IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface; - TRACE("(%p)\n", This); - - return This->target; -} - static BOOL WINAPI IWineD3DTextureImpl_IsCondNP2(IWineD3DTexture *iface) { IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface; TRACE("(%p)\n", This); @@ -346,7 +349,9 @@ static HRESULT WINAPI IWineD3DTextureImpl_GetLevelDesc(IWineD3DTexture *iface, U return WINED3DERR_INVALIDCALL; } - return IWineD3DSurface_GetDesc(surface, desc); + IWineD3DSurface_GetDesc(surface, desc); + + return WINED3D_OK; } static HRESULT WINAPI IWineD3DTextureImpl_GetSurfaceLevel(IWineD3DTexture *iface, @@ -451,7 +456,6 @@ static const IWineD3DTextureVtbl IWineD3DTexture_Vtbl = IWineD3DTextureImpl_SetDirty, IWineD3DTextureImpl_GetDirty, IWineD3DTextureImpl_BindTexture, - IWineD3DTextureImpl_GetTextureDimensions, IWineD3DTextureImpl_IsCondNP2, /* IWineD3DTexture */ IWineD3DTextureImpl_GetLevelDesc, @@ -462,11 +466,11 @@ static const IWineD3DTextureVtbl IWineD3DTexture_Vtbl = }; HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT levels, - IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + IWineD3DDeviceImpl *device, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool, + void *parent, const struct wined3d_parent_ops *parent_ops) { const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info); + const struct wined3d_format *format = wined3d_get_format(gl_info, format_id); UINT pow2_width, pow2_height; UINT tmp_w, tmp_h; unsigned int i; @@ -474,7 +478,7 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT /* TODO: It should only be possible to create textures for formats * that are reported as supported. */ - if (WINED3DFMT_UNKNOWN >= format) + if (WINED3DFMT_UNKNOWN >= format_id) { WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); return WINED3DERR_INVALIDCALL; @@ -530,7 +534,7 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT texture->lpVtbl = &IWineD3DTexture_Vtbl; hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, 1, levels, - WINED3DRTYPE_TEXTURE, device, 0, usage, format_desc, pool, parent, parent_ops); + WINED3DRTYPE_TEXTURE, device, 0, usage, format, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize basetexture, returning %#x.\n", hr); @@ -541,18 +545,18 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT * Second also don't use ARB_TEXTURE_RECTANGLE in case the surface format is P8 and EXT_PALETTED_TEXTURE * is used in combination with texture uploads (RTL_READTEX). The reason is that EXT_PALETTED_TEXTURE * doesn't work in combination with ARB_TEXTURE_RECTANGLE. */ - if (gl_info->supported[WINE_NORMALIZED_TEXRECT] && (width != pow2_width || height != pow2_height)) + if (gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT] && (width != pow2_width || height != pow2_height)) { texture->baseTexture.pow2Matrix[0] = 1.0f; texture->baseTexture.pow2Matrix[5] = 1.0f; texture->baseTexture.pow2Matrix[10] = 1.0f; texture->baseTexture.pow2Matrix[15] = 1.0f; - texture->target = GL_TEXTURE_2D; + texture->baseTexture.target = GL_TEXTURE_2D; texture->cond_np2 = TRUE; texture->baseTexture.minMipLookup = minMipLookup_noFilter; } else if (gl_info->supported[ARB_TEXTURE_RECTANGLE] && (width != pow2_width || height != pow2_height) - && !(format_desc->format == WINED3DFMT_P8_UINT && gl_info->supported[EXT_PALETTED_TEXTURE] + && !(format->id == WINED3DFMT_P8_UINT && gl_info->supported[EXT_PALETTED_TEXTURE] && wined3d_settings.rendertargetlock_mode == RTL_READTEX)) { if ((width != 1) || (height != 1)) texture->baseTexture.pow2Matrix_identity = FALSE; @@ -561,10 +565,10 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT texture->baseTexture.pow2Matrix[5] = (float)height; texture->baseTexture.pow2Matrix[10] = 1.0f; texture->baseTexture.pow2Matrix[15] = 1.0f; - texture->target = GL_TEXTURE_RECTANGLE_ARB; + texture->baseTexture.target = GL_TEXTURE_RECTANGLE_ARB; texture->cond_np2 = TRUE; - if(texture->resource.format_desc->Flags & WINED3DFMT_FLAG_FILTERING) + if(texture->resource.format->Flags & WINED3DFMT_FLAG_FILTERING) { texture->baseTexture.minMipLookup = minMipLookup_noMip; } @@ -589,7 +593,7 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT texture->baseTexture.pow2Matrix[10] = 1.0f; texture->baseTexture.pow2Matrix[15] = 1.0f; - texture->target = GL_TEXTURE_2D; + texture->baseTexture.target = GL_TEXTURE_2D; texture->cond_np2 = FALSE; } TRACE("xf(%f) yf(%f)\n", texture->baseTexture.pow2Matrix[0], texture->baseTexture.pow2Matrix[5]); @@ -602,8 +606,8 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT IWineD3DSurface *surface; /* Use the callback to create the texture surface. */ - hr = IWineD3DDeviceParent_CreateSurface(device->device_parent, parent, tmp_w, tmp_h, format_desc->format, - usage, pool, i, 0, &surface); + hr = IWineD3DDeviceParent_CreateSurface(device->device_parent, parent, tmp_w, tmp_h, + format->id, usage, pool, i, 0, &surface); if (FAILED(hr)) { FIXME("Failed to create surface %p, hr %#x\n", texture, hr); @@ -611,8 +615,8 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT return hr; } - IWineD3DSurface_SetContainer(surface, (IWineD3DBase *)texture); - surface_set_texture_target((IWineD3DSurfaceImpl *)surface, texture->target); + surface_set_container((IWineD3DSurfaceImpl *)surface, WINED3D_CONTAINER_TEXTURE, (IWineD3DBase *)texture); + surface_set_texture_target((IWineD3DSurfaceImpl *)surface, texture->baseTexture.target); texture->baseTexture.sub_resources[i] = (IWineD3DResourceImpl *)surface; TRACE("Created surface level %u @ %p.\n", i, surface); /* Calculate the next mipmap level. */ diff --git a/dll/directx/wine/wined3d/utils.c b/dll/directx/wine/wined3d/utils.c index b63a5f8cee8..2957c5a3e4e 100644 --- a/dll/directx/wine/wined3d/utils.c +++ b/dll/directx/wine/wined3d/utils.c @@ -31,7 +31,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); struct StaticPixelFormatDesc { - WINED3DFORMAT format; + enum wined3d_format_id id; DWORD alphaMask, redMask, greenMask, blueMask; UINT bpp; short depthSize, stencilSize; @@ -49,7 +49,7 @@ struct StaticPixelFormatDesc */ static const struct StaticPixelFormatDesc formats[] = { - /* WINED3DFORMAT alphamask redmask greenmask bluemask bpp depth stencil */ + /* format id alphamask redmask greenmask bluemask bpp depth stencil */ {WINED3DFMT_UNKNOWN, 0x0, 0x0, 0x0, 0x0, 0, 0, 0}, /* FourCC formats */ {WINED3DFMT_UYVY, 0x0, 0x0, 0x0, 0x0, 2, 0, 0}, @@ -129,16 +129,20 @@ static const struct StaticPixelFormatDesc formats[] = {WINED3DFMT_R16G16B16A16_SNORM, 0x0, 0x0, 0x0, 0x0, 8, 0, 0}, /* Vendor-specific formats */ {WINED3DFMT_ATI2N, 0x0, 0x0, 0x0, 0x0, 1, 0, 0}, + {WINED3DFMT_NVDB, 0x0, 0x0, 0x0, 0x0, 0, 0, 0}, {WINED3DFMT_NVHU, 0x0, 0x0, 0x0, 0x0, 2, 0, 0}, {WINED3DFMT_NVHS, 0x0, 0x0, 0x0, 0x0, 2, 0, 0}, }; struct wined3d_format_base_flags { - WINED3DFORMAT format; + enum wined3d_format_id id; DWORD flags; }; +/* The ATI2N format behaves like an uncompressed format in LockRect(), but + * still needs to use the correct block based calculation for e.g. the + * resource size. */ static const struct wined3d_format_base_flags format_base_flags[] = { {WINED3DFMT_UYVY, WINED3DFMT_FLAG_FOURCC}, @@ -163,7 +167,8 @@ static const struct wined3d_format_base_flags format_base_flags[] = {WINED3DFMT_B4G4R4X4_UNORM, WINED3DFMT_FLAG_GETDC}, {WINED3DFMT_R8G8B8A8_UNORM, WINED3DFMT_FLAG_GETDC}, {WINED3DFMT_R8G8B8X8_UNORM, WINED3DFMT_FLAG_GETDC}, - {WINED3DFMT_ATI2N, WINED3DFMT_FLAG_FOURCC}, + {WINED3DFMT_ATI2N, WINED3DFMT_FLAG_FOURCC | WINED3DFMT_FLAG_BROKEN_PITCH}, + {WINED3DFMT_NVDB, WINED3DFMT_FLAG_FOURCC}, {WINED3DFMT_NVHU, WINED3DFMT_FLAG_FOURCC}, {WINED3DFMT_NVHS, WINED3DFMT_FLAG_FOURCC}, {WINED3DFMT_R32_FLOAT, WINED3DFMT_FLAG_FLOAT}, @@ -179,7 +184,7 @@ static const struct wined3d_format_base_flags format_base_flags[] = struct wined3d_format_compression_info { - WINED3DFORMAT format; + enum wined3d_format_id id; UINT block_width; UINT block_height; UINT block_byte_count; @@ -192,12 +197,12 @@ static const struct wined3d_format_compression_info format_compression_info[] = {WINED3DFMT_DXT3, 4, 4, 16}, {WINED3DFMT_DXT4, 4, 4, 16}, {WINED3DFMT_DXT5, 4, 4, 16}, - {WINED3DFMT_ATI2N, 1, 1, 1}, + {WINED3DFMT_ATI2N, 4, 4, 16}, }; struct wined3d_format_vertex_info { - WINED3DFORMAT format; + enum wined3d_format_id id; enum wined3d_ffp_emit_idx emit_idx; GLint component_count; GLenum gl_vtx_type; @@ -229,7 +234,7 @@ static const struct wined3d_format_vertex_info format_vertex_info[] = struct wined3d_format_texture_info { - WINED3DFORMAT format; + enum wined3d_format_id id; GLint gl_internal; GLint gl_srgb_internal; GLint gl_rt_internal; @@ -549,7 +554,7 @@ static void convert_s8_uint_d24_float(const BYTE *src, BYTE *dst, UINT pitch, UI static const struct wined3d_format_texture_info format_texture_info[] = { - /* WINED3DFORMAT internal srgbInternal rtInternal + /* format id internal srgbInternal rtInternal format type flags extension */ @@ -845,26 +850,30 @@ static const struct wined3d_format_texture_info format_texture_info[] = /* Vendor-specific formats */ {WINED3DFMT_ATI2N, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - 0, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, ATI_TEXTURE_COMPRESSION_3DC, NULL}, - {WINED3DFMT_ATI2N, GL_COMPRESSED_RED_GREEN_RGTC2_EXT, GL_COMPRESSED_RED_GREEN_RGTC2_EXT, 0, + {WINED3DFMT_ATI2N, GL_COMPRESSED_RED_GREEN_RGTC2, GL_COMPRESSED_RED_GREEN_RGTC2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - 0, - EXT_TEXTURE_COMPRESSION_RGTC, NULL}, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, + ARB_TEXTURE_COMPRESSION_RGTC, NULL}, }; -static inline int getFmtIdx(WINED3DFORMAT fmt) { +static inline int getFmtIdx(enum wined3d_format_id format_id) +{ /* First check if the format is at the position of its value. - * This will catch the argb formats before the loop is entered - */ - if(fmt < (sizeof(formats) / sizeof(formats[0])) && formats[fmt].format == fmt) { - return fmt; - } else { + * This will catch the argb formats before the loop is entered. */ + if (format_id < (sizeof(formats) / sizeof(*formats)) + && formats[format_id].id == format_id) + { + return format_id; + } + else + { unsigned int i; - for(i = 0; i < (sizeof(formats) / sizeof(formats[0])); i++) { - if(formats[i].format == fmt) { - return i; - } + + for (i = 0; i < (sizeof(formats) / sizeof(*formats)); ++i) + { + if (formats[i].id == format_id) return i; } } return -1; @@ -875,8 +884,8 @@ static BOOL init_format_base_info(struct wined3d_gl_info *gl_info) UINT format_count = sizeof(formats) / sizeof(*formats); UINT i; - gl_info->gl_formats = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, format_count * sizeof(*gl_info->gl_formats)); - if (!gl_info->gl_formats) + gl_info->formats = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, format_count * sizeof(*gl_info->formats)); + if (!gl_info->formats) { ERR("Failed to allocate memory.\n"); return FALSE; @@ -884,30 +893,30 @@ static BOOL init_format_base_info(struct wined3d_gl_info *gl_info) for (i = 0; i < format_count; ++i) { - struct wined3d_format_desc *desc = &gl_info->gl_formats[i]; - desc->format = formats[i].format; - desc->red_mask = formats[i].redMask; - desc->green_mask = formats[i].greenMask; - desc->blue_mask = formats[i].blueMask; - desc->alpha_mask = formats[i].alphaMask; - desc->byte_count = formats[i].bpp; - desc->depth_size = formats[i].depthSize; - desc->stencil_size = formats[i].stencilSize; + struct wined3d_format *format = &gl_info->formats[i]; + format->id = formats[i].id; + format->red_mask = formats[i].redMask; + format->green_mask = formats[i].greenMask; + format->blue_mask = formats[i].blueMask; + format->alpha_mask = formats[i].alphaMask; + format->byte_count = formats[i].bpp; + format->depth_size = formats[i].depthSize; + format->stencil_size = formats[i].stencilSize; } for (i = 0; i < (sizeof(format_base_flags) / sizeof(*format_base_flags)); ++i) { - int fmt_idx = getFmtIdx(format_base_flags[i].format); + int fmt_idx = getFmtIdx(format_base_flags[i].id); if (fmt_idx == -1) { ERR("Format %s (%#x) not found.\n", - debug_d3dformat(format_base_flags[i].format), format_base_flags[i].format); - HeapFree(GetProcessHeap(), 0, gl_info->gl_formats); + debug_d3dformat(format_base_flags[i].id), format_base_flags[i].id); + HeapFree(GetProcessHeap(), 0, gl_info->formats); return FALSE; } - gl_info->gl_formats[fmt_idx].Flags |= format_base_flags[i].flags; + gl_info->formats[fmt_idx].Flags |= format_base_flags[i].flags; } return TRUE; @@ -919,28 +928,28 @@ static BOOL init_format_compression_info(struct wined3d_gl_info *gl_info) for (i = 0; i < (sizeof(format_compression_info) / sizeof(*format_compression_info)); ++i) { - struct wined3d_format_desc *format_desc; - int fmt_idx = getFmtIdx(format_compression_info[i].format); + struct wined3d_format *format; + int fmt_idx = getFmtIdx(format_compression_info[i].id); if (fmt_idx == -1) { ERR("Format %s (%#x) not found.\n", - debug_d3dformat(format_compression_info[i].format), format_compression_info[i].format); + debug_d3dformat(format_compression_info[i].id), format_compression_info[i].id); return FALSE; } - format_desc = &gl_info->gl_formats[fmt_idx]; - format_desc->block_width = format_compression_info[i].block_width; - format_desc->block_height = format_compression_info[i].block_height; - format_desc->block_byte_count = format_compression_info[i].block_byte_count; - format_desc->Flags |= WINED3DFMT_FLAG_COMPRESSED; + format = &gl_info->formats[fmt_idx]; + format->block_width = format_compression_info[i].block_width; + format->block_height = format_compression_info[i].block_height; + format->block_byte_count = format_compression_info[i].block_byte_count; + format->Flags |= WINED3DFMT_FLAG_COMPRESSED; } return TRUE; } /* Context activation is done by the caller. */ -static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined3d_format_desc *format_desc) +static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined3d_format *format) { /* Check if the default internal format is supported as a frame buffer * target, otherwise fall back to the render target internal. @@ -957,8 +966,7 @@ static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); - glTexImage2D(GL_TEXTURE_2D, 0, format_desc->glInternal, 16, 16, 0, - format_desc->glFormat, format_desc->glType, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, format->glInternal, 16, 16, 0, format->glFormat, format->glType, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -969,37 +977,36 @@ static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined if (status == GL_FRAMEBUFFER_COMPLETE) { - TRACE("Format %s is supported as FBO color attachment\n", debug_d3dformat(format_desc->format)); - format_desc->Flags |= WINED3DFMT_FLAG_FBO_ATTACHABLE; - format_desc->rtInternal = format_desc->glInternal; + TRACE("Format %s is supported as FBO color attachment.\n", debug_d3dformat(format->id)); + format->Flags |= WINED3DFMT_FLAG_FBO_ATTACHABLE; + format->rtInternal = format->glInternal; } else { - if (!format_desc->rtInternal) + if (!format->rtInternal) { - if (format_desc->Flags & WINED3DFMT_FLAG_RENDERTARGET) + if (format->Flags & WINED3DFMT_FLAG_RENDERTARGET) { FIXME("Format %s with rendertarget flag is not supported as FBO color attachment," - " and no fallback specified.\n", debug_d3dformat(format_desc->format)); - format_desc->Flags &= ~WINED3DFMT_FLAG_RENDERTARGET; + " and no fallback specified.\n", debug_d3dformat(format->id)); + format->Flags &= ~WINED3DFMT_FLAG_RENDERTARGET; } else { - TRACE("Format %s is not supported as FBO color attachment.\n", debug_d3dformat(format_desc->format)); + TRACE("Format %s is not supported as FBO color attachment.\n", debug_d3dformat(format->id)); } - format_desc->rtInternal = format_desc->glInternal; + format->rtInternal = format->glInternal; } else { TRACE("Format %s is not supported as FBO color attachment, trying rtInternal format as fallback.\n", - debug_d3dformat(format_desc->format)); + debug_d3dformat(format->id)); while(glGetError()); gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); - glTexImage2D(GL_TEXTURE_2D, 0, format_desc->rtInternal, 16, 16, 0, - format_desc->glFormat, format_desc->glType, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, format->rtInternal, 16, 16, 0, format->glFormat, format->glType, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -1010,19 +1017,19 @@ static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined if (status == GL_FRAMEBUFFER_COMPLETE) { - TRACE("Format %s rtInternal format is supported as FBO color attachment\n", - debug_d3dformat(format_desc->format)); + TRACE("Format %s rtInternal format is supported as FBO color attachment.\n", + debug_d3dformat(format->id)); } else { FIXME("Format %s rtInternal format is not supported as FBO color attachment.\n", - debug_d3dformat(format_desc->format)); - format_desc->Flags &= ~WINED3DFMT_FLAG_RENDERTARGET; + debug_d3dformat(format->id)); + format->Flags &= ~WINED3DFMT_FLAG_RENDERTARGET; } } } - if (status == GL_FRAMEBUFFER_COMPLETE && format_desc->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) + if (status == GL_FRAMEBUFFER_COMPLETE && format->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) { GLuint rb; @@ -1043,7 +1050,7 @@ static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined { while(glGetError()); TRACE("Format doesn't support post-pixelshader blending.\n"); - format_desc->Flags &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING; + format->Flags &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING; } if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT] @@ -1056,6 +1063,25 @@ static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined } } + if (format->glInternal != format->glGammaInternal) + { + glTexImage2D(GL_TEXTURE_2D, 0, format->glGammaInternal, 16, 16, 0, format->glFormat, format->glType, NULL); + gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); + + status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER); + checkGLcall("Framebuffer format check"); + + if (status == GL_FRAMEBUFFER_COMPLETE) + { + TRACE("Format %s's sRGB format is FBO attachable.\n", debug_d3dformat(format->id)); + format->Flags |= WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB; + } + else + { + WARN("Format %s's sRGB format is not FBO attachable.\n", debug_d3dformat(format->id)); + } + } + glDeleteTextures(1, &tex); LEAVE_GL(); @@ -1079,32 +1105,32 @@ static void init_format_fbo_compat_info(struct wined3d_gl_info *gl_info) for (i = 0; i < sizeof(formats) / sizeof(*formats); ++i) { - struct wined3d_format_desc *desc = &gl_info->gl_formats[i]; + struct wined3d_format *format = &gl_info->formats[i]; - if (!desc->glInternal) continue; + if (!format->glInternal) continue; - if (desc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) + if (format->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) { TRACE("Skipping format %s because it's a depth/stencil format.\n", - debug_d3dformat(desc->format)); + debug_d3dformat(format->id)); continue; } - if (desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + if (format->Flags & WINED3DFMT_FLAG_COMPRESSED) { TRACE("Skipping format %s because it's a compressed format.\n", - debug_d3dformat(desc->format)); + debug_d3dformat(format->id)); continue; } if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - TRACE("Checking if format %s is supported as FBO color attachment...\n", debug_d3dformat(desc->format)); - check_fbo_compat(gl_info, desc); + TRACE("Checking if format %s is supported as FBO color attachment...\n", debug_d3dformat(format->id)); + check_fbo_compat(gl_info, format); } else { - desc->rtInternal = desc->glInternal; + format->rtInternal = format->glInternal; } } @@ -1124,31 +1150,31 @@ static BOOL init_format_texture_info(struct wined3d_gl_info *gl_info) for (i = 0; i < sizeof(format_texture_info) / sizeof(*format_texture_info); ++i) { - int fmt_idx = getFmtIdx(format_texture_info[i].format); - struct wined3d_format_desc *desc; + int fmt_idx = getFmtIdx(format_texture_info[i].id); + struct wined3d_format *format; if (fmt_idx == -1) { ERR("Format %s (%#x) not found.\n", - debug_d3dformat(format_texture_info[i].format), format_texture_info[i].format); + debug_d3dformat(format_texture_info[i].id), format_texture_info[i].id); return FALSE; } if (!gl_info->supported[format_texture_info[i].extension]) continue; - desc = &gl_info->gl_formats[fmt_idx]; - desc->glInternal = format_texture_info[i].gl_internal; - desc->glGammaInternal = format_texture_info[i].gl_srgb_internal; - desc->rtInternal = format_texture_info[i].gl_rt_internal; - desc->glFormat = format_texture_info[i].gl_format; - desc->glType = format_texture_info[i].gl_type; - desc->color_fixup = COLOR_FIXUP_IDENTITY; - desc->Flags |= format_texture_info[i].flags; - desc->heightscale = 1.0f; + format = &gl_info->formats[fmt_idx]; + format->glInternal = format_texture_info[i].gl_internal; + format->glGammaInternal = format_texture_info[i].gl_srgb_internal; + format->rtInternal = format_texture_info[i].gl_rt_internal; + format->glFormat = format_texture_info[i].gl_format; + format->glType = format_texture_info[i].gl_type; + format->color_fixup = COLOR_FIXUP_IDENTITY; + format->Flags |= format_texture_info[i].flags; + format->heightscale = 1.0f; /* Texture conversion stuff */ - desc->convert = format_texture_info[i].convert; - desc->conv_byte_count = format_texture_info[i].conv_byte_count; + format->convert = format_texture_info[i].convert; + format->conv_byte_count = format_texture_info[i].conv_byte_count; } return TRUE; @@ -1169,8 +1195,8 @@ static BOOL color_match(DWORD c1, DWORD c2, BYTE max_diff) /* A context is provided by the caller */ static BOOL check_filter(const struct wined3d_gl_info *gl_info, GLenum internal) { + static const DWORD data[] = {0x00000000, 0xffffffff}; GLuint tex, fbo, buffer; - const DWORD data[] = {0x00000000, 0xffffffff}; DWORD readback[16 * 1]; BOOL ret = FALSE; @@ -1266,9 +1292,10 @@ static BOOL check_filter(const struct wined3d_gl_info *gl_info, GLenum internal) static void init_format_filter_info(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor vendor) { - struct wined3d_format_desc *desc; + struct wined3d_format *format; unsigned int fmt_idx, i; - WINED3DFORMAT fmts16[] = { + static const enum wined3d_format_id fmts16[] = + { WINED3DFMT_R16_FLOAT, WINED3DFMT_R16G16_FLOAT, WINED3DFMT_R16G16B16A16_FLOAT, @@ -1299,7 +1326,7 @@ static void init_format_filter_info(struct wined3d_gl_info *gl_info, enum wined3 for(i = 0; i < (sizeof(fmts16) / sizeof(*fmts16)); i++) { fmt_idx = getFmtIdx(fmts16[i]); - gl_info->gl_formats[fmt_idx].Flags |= WINED3DFMT_FLAG_FILTERING; + gl_info->formats[fmt_idx].Flags |= WINED3DFMT_FLAG_FILTERING; } } return; @@ -1308,14 +1335,14 @@ static void init_format_filter_info(struct wined3d_gl_info *gl_info, enum wined3 for(i = 0; i < (sizeof(fmts16) / sizeof(*fmts16)); i++) { fmt_idx = getFmtIdx(fmts16[i]); - desc = &gl_info->gl_formats[fmt_idx]; - if(!desc->glInternal) continue; /* Not supported by GL */ + format = &gl_info->formats[fmt_idx]; + if (!format->glInternal) continue; /* Not supported by GL */ - filtered = check_filter(gl_info, gl_info->gl_formats[fmt_idx].glInternal); + filtered = check_filter(gl_info, gl_info->formats[fmt_idx].glInternal); if(filtered) { TRACE("Format %s supports filtering\n", debug_d3dformat(fmts16[i])); - desc->Flags |= WINED3DFMT_FLAG_FILTERING; + format->Flags |= WINED3DFMT_FLAG_FILTERING; } else { @@ -1329,23 +1356,23 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info) int idx; idx = getFmtIdx(WINED3DFMT_R16_FLOAT); - gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( + gl_info->formats[idx].color_fixup = create_color_fixup_desc( 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W); idx = getFmtIdx(WINED3DFMT_R32_FLOAT); - gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( + gl_info->formats[idx].color_fixup = create_color_fixup_desc( 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W); idx = getFmtIdx(WINED3DFMT_R16G16_UNORM); - gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( + gl_info->formats[idx].color_fixup = create_color_fixup_desc( 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W); idx = getFmtIdx(WINED3DFMT_R16G16_FLOAT); - gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( + gl_info->formats[idx].color_fixup = create_color_fixup_desc( 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W); idx = getFmtIdx(WINED3DFMT_R32G32_FLOAT); - gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( + gl_info->formats[idx].color_fixup = create_color_fixup_desc( 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_W); /* V8U8 is supported natively by GL_ATI_envmap_bumpmap and GL_NV_texture_shader. @@ -1360,20 +1387,20 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info) if (!gl_info->supported[NV_TEXTURE_SHADER]) { idx = getFmtIdx(WINED3DFMT_R8G8_SNORM); - gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( + gl_info->formats[idx].color_fixup = create_color_fixup_desc( 1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE); idx = getFmtIdx(WINED3DFMT_R16G16_SNORM); - gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( + gl_info->formats[idx].color_fixup = create_color_fixup_desc( 1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE); } else { idx = getFmtIdx(WINED3DFMT_R8G8_SNORM); - gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( + gl_info->formats[idx].color_fixup = create_color_fixup_desc( 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE); idx = getFmtIdx(WINED3DFMT_R16G16_SNORM); - gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( + gl_info->formats[idx].color_fixup = create_color_fixup_desc( 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE); } @@ -1383,13 +1410,13 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info) * with each other */ idx = getFmtIdx(WINED3DFMT_R5G5_SNORM_L6_UNORM); - gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( + gl_info->formats[idx].color_fixup = create_color_fixup_desc( 1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Z, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE); idx = getFmtIdx(WINED3DFMT_R8G8_SNORM_L8X8_UNORM); - gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( + gl_info->formats[idx].color_fixup = create_color_fixup_desc( 1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_Z, 0, CHANNEL_SOURCE_W); idx = getFmtIdx(WINED3DFMT_R8G8B8A8_SNORM); - gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( + gl_info->formats[idx].color_fixup = create_color_fixup_desc( 1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Y, 1, CHANNEL_SOURCE_Z, 1, CHANNEL_SOURCE_W); } else @@ -1404,39 +1431,39 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info) if (gl_info->supported[EXT_TEXTURE_COMPRESSION_RGTC]) { idx = getFmtIdx(WINED3DFMT_ATI2N); - gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( + gl_info->formats[idx].color_fixup = create_color_fixup_desc( 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE); } else if (gl_info->supported[ATI_TEXTURE_COMPRESSION_3DC]) { idx = getFmtIdx(WINED3DFMT_ATI2N); - gl_info->gl_formats[idx].color_fixup= create_color_fixup_desc( + gl_info->formats[idx].color_fixup= create_color_fixup_desc( 0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_W, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE); } if (!gl_info->supported[APPLE_YCBCR_422]) { idx = getFmtIdx(WINED3DFMT_YUY2); - gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YUY2); + gl_info->formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YUY2); idx = getFmtIdx(WINED3DFMT_UYVY); - gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_UYVY); + gl_info->formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_UYVY); } idx = getFmtIdx(WINED3DFMT_YV12); - gl_info->gl_formats[idx].heightscale = 1.5f; - gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YV12); + gl_info->formats[idx].heightscale = 1.5f; + gl_info->formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YV12); if (gl_info->supported[EXT_PALETTED_TEXTURE] || gl_info->supported[ARB_FRAGMENT_PROGRAM]) { idx = getFmtIdx(WINED3DFMT_P8_UINT); - gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_P8); + gl_info->formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_P8); } if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA]) { idx = getFmtIdx(WINED3DFMT_B8G8R8A8_UNORM); - gl_info->gl_formats[idx].gl_vtx_format = GL_BGRA; + gl_info->formats[idx].gl_vtx_format = GL_BGRA; } if (gl_info->supported[ARB_HALF_FLOAT_VERTEX]) @@ -1444,10 +1471,10 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info) /* Do not change the size of the type, it is CPU side. We have to change the GPU-side information though. * It is the job of the vertex buffer code to make sure that the vbos have the right format */ idx = getFmtIdx(WINED3DFMT_R16G16_FLOAT); - gl_info->gl_formats[idx].gl_vtx_type = GL_HALF_FLOAT; /* == GL_HALF_FLOAT_NV */ + gl_info->formats[idx].gl_vtx_type = GL_HALF_FLOAT; /* == GL_HALF_FLOAT_NV */ idx = getFmtIdx(WINED3DFMT_R16G16B16A16_FLOAT); - gl_info->gl_formats[idx].gl_vtx_type = GL_HALF_FLOAT; + gl_info->formats[idx].gl_vtx_type = GL_HALF_FLOAT; } } @@ -1457,23 +1484,23 @@ static BOOL init_format_vertex_info(struct wined3d_gl_info *gl_info) for (i = 0; i < (sizeof(format_vertex_info) / sizeof(*format_vertex_info)); ++i) { - struct wined3d_format_desc *format_desc; - int fmt_idx = getFmtIdx(format_vertex_info[i].format); + struct wined3d_format *format; + int fmt_idx = getFmtIdx(format_vertex_info[i].id); if (fmt_idx == -1) { ERR("Format %s (%#x) not found.\n", - debug_d3dformat(format_vertex_info[i].format), format_vertex_info[i].format); + debug_d3dformat(format_vertex_info[i].id), format_vertex_info[i].id); return FALSE; } - format_desc = &gl_info->gl_formats[fmt_idx]; - format_desc->emit_idx = format_vertex_info[i].emit_idx; - format_desc->component_count = format_vertex_info[i].component_count; - format_desc->gl_vtx_type = format_vertex_info[i].gl_vtx_type; - format_desc->gl_vtx_format = format_vertex_info[i].gl_vtx_format; - format_desc->gl_normalized = format_vertex_info[i].gl_normalized; - format_desc->component_size = format_vertex_info[i].component_size; + format = &gl_info->formats[fmt_idx]; + format->emit_idx = format_vertex_info[i].emit_idx; + format->component_count = format_vertex_info[i].component_count; + format->gl_vtx_type = format_vertex_info[i].gl_vtx_type; + format->gl_vtx_format = format_vertex_info[i].gl_vtx_format; + format->gl_normalized = format_vertex_info[i].gl_normalized; + format->component_size = format_vertex_info[i].component_size; } return TRUE; @@ -1485,8 +1512,8 @@ BOOL initPixelFormatsNoGL(struct wined3d_gl_info *gl_info) if (!init_format_compression_info(gl_info)) { - HeapFree(GetProcessHeap(), 0, gl_info->gl_formats); - gl_info->gl_formats = NULL; + HeapFree(GetProcessHeap(), 0, gl_info->formats); + gl_info->formats = NULL; return FALSE; } @@ -1509,194 +1536,226 @@ BOOL initPixelFormats(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor v return TRUE; fail: - HeapFree(GetProcessHeap(), 0, gl_info->gl_formats); - gl_info->gl_formats = NULL; + HeapFree(GetProcessHeap(), 0, gl_info->formats); + gl_info->formats = NULL; return FALSE; } -const struct wined3d_format_desc *getFormatDescEntry(WINED3DFORMAT fmt, const struct wined3d_gl_info *gl_info) +const struct wined3d_format *wined3d_get_format(const struct wined3d_gl_info *gl_info, + enum wined3d_format_id format_id) { - int idx = getFmtIdx(fmt); + int idx = getFmtIdx(format_id); - if(idx == -1) { - FIXME("Can't find format %s(%d) in the format lookup table\n", debug_d3dformat(fmt), fmt); + if (idx == -1) + { + FIXME("Can't find format %s (%#x) in the format lookup table\n", + debug_d3dformat(format_id), format_id); /* Get the caller a valid pointer */ idx = getFmtIdx(WINED3DFMT_UNKNOWN); } - return &gl_info->gl_formats[idx]; + return &gl_info->formats[idx]; +} + +UINT wined3d_format_calculate_size(const struct wined3d_format *format, UINT alignment, UINT width, UINT height) +{ + UINT size; + + if (format->id == WINED3DFMT_UNKNOWN) + { + size = 0; + } + else if (format->Flags & WINED3DFMT_FLAG_COMPRESSED) + { + UINT row_block_count = (width + format->block_width - 1) / format->block_width; + UINT row_count = (height + format->block_height - 1) / format->block_height; + size = row_count * (((row_block_count * format->block_byte_count) + alignment - 1) & ~(alignment - 1)); + } + else + { + size = height * (((width * format->byte_count) + alignment - 1) & ~(alignment - 1)); + } + + if (format->heightscale != 0.0f) size *= format->heightscale; + + return size; } /***************************************************************************** * Trace formatting of useful values */ -const char* debug_d3dformat(WINED3DFORMAT fmt) { - switch (fmt) { -#define FMT_TO_STR(fmt) case fmt: return #fmt - FMT_TO_STR(WINED3DFMT_UNKNOWN); - FMT_TO_STR(WINED3DFMT_B8G8R8_UNORM); - FMT_TO_STR(WINED3DFMT_B5G5R5X1_UNORM); - FMT_TO_STR(WINED3DFMT_B4G4R4A4_UNORM); - FMT_TO_STR(WINED3DFMT_B2G3R3_UNORM); - FMT_TO_STR(WINED3DFMT_B2G3R3A8_UNORM); - FMT_TO_STR(WINED3DFMT_B4G4R4X4_UNORM); - FMT_TO_STR(WINED3DFMT_R8G8B8X8_UNORM); - FMT_TO_STR(WINED3DFMT_B10G10R10A2_UNORM); - FMT_TO_STR(WINED3DFMT_P8_UINT_A8_UNORM); - FMT_TO_STR(WINED3DFMT_P8_UINT); - FMT_TO_STR(WINED3DFMT_L8_UNORM); - FMT_TO_STR(WINED3DFMT_L8A8_UNORM); - FMT_TO_STR(WINED3DFMT_L4A4_UNORM); - FMT_TO_STR(WINED3DFMT_R5G5_SNORM_L6_UNORM); - FMT_TO_STR(WINED3DFMT_R8G8_SNORM_L8X8_UNORM); - FMT_TO_STR(WINED3DFMT_R10G11B11_SNORM); - FMT_TO_STR(WINED3DFMT_R10G10B10_SNORM_A2_UNORM); - FMT_TO_STR(WINED3DFMT_UYVY); - FMT_TO_STR(WINED3DFMT_YUY2); - FMT_TO_STR(WINED3DFMT_YV12); - FMT_TO_STR(WINED3DFMT_DXT1); - FMT_TO_STR(WINED3DFMT_DXT2); - FMT_TO_STR(WINED3DFMT_DXT3); - FMT_TO_STR(WINED3DFMT_DXT4); - FMT_TO_STR(WINED3DFMT_DXT5); - FMT_TO_STR(WINED3DFMT_MULTI2_ARGB8); - FMT_TO_STR(WINED3DFMT_G8R8_G8B8); - FMT_TO_STR(WINED3DFMT_R8G8_B8G8); - FMT_TO_STR(WINED3DFMT_D16_LOCKABLE); - FMT_TO_STR(WINED3DFMT_D32_UNORM); - FMT_TO_STR(WINED3DFMT_S1_UINT_D15_UNORM); - FMT_TO_STR(WINED3DFMT_X8D24_UNORM); - FMT_TO_STR(WINED3DFMT_S4X4_UINT_D24_UNORM); - FMT_TO_STR(WINED3DFMT_L16_UNORM); - FMT_TO_STR(WINED3DFMT_S8_UINT_D24_FLOAT); - FMT_TO_STR(WINED3DFMT_VERTEXDATA); - FMT_TO_STR(WINED3DFMT_R8G8_SNORM_Cx); - FMT_TO_STR(WINED3DFMT_ATI2N); - FMT_TO_STR(WINED3DFMT_NVHU); - FMT_TO_STR(WINED3DFMT_NVHS); - FMT_TO_STR(WINED3DFMT_R32G32B32A32_TYPELESS); - FMT_TO_STR(WINED3DFMT_R32G32B32A32_FLOAT); - FMT_TO_STR(WINED3DFMT_R32G32B32A32_UINT); - FMT_TO_STR(WINED3DFMT_R32G32B32A32_SINT); - FMT_TO_STR(WINED3DFMT_R32G32B32_TYPELESS); - FMT_TO_STR(WINED3DFMT_R32G32B32_FLOAT); - FMT_TO_STR(WINED3DFMT_R32G32B32_UINT); - FMT_TO_STR(WINED3DFMT_R32G32B32_SINT); - FMT_TO_STR(WINED3DFMT_R16G16B16A16_TYPELESS); - FMT_TO_STR(WINED3DFMT_R16G16B16A16_FLOAT); - FMT_TO_STR(WINED3DFMT_R16G16B16A16_UNORM); - FMT_TO_STR(WINED3DFMT_R16G16B16A16_UINT); - FMT_TO_STR(WINED3DFMT_R16G16B16A16_SNORM); - FMT_TO_STR(WINED3DFMT_R16G16B16A16_SINT); - FMT_TO_STR(WINED3DFMT_R32G32_TYPELESS); - FMT_TO_STR(WINED3DFMT_R32G32_FLOAT); - FMT_TO_STR(WINED3DFMT_R32G32_UINT); - FMT_TO_STR(WINED3DFMT_R32G32_SINT); - FMT_TO_STR(WINED3DFMT_R32G8X24_TYPELESS); - FMT_TO_STR(WINED3DFMT_D32_FLOAT_S8X24_UINT); - FMT_TO_STR(WINED3DFMT_R32_FLOAT_X8X24_TYPELESS); - FMT_TO_STR(WINED3DFMT_X32_TYPELESS_G8X24_UINT); - FMT_TO_STR(WINED3DFMT_R10G10B10A2_TYPELESS); - FMT_TO_STR(WINED3DFMT_R10G10B10A2_UNORM); - FMT_TO_STR(WINED3DFMT_R10G10B10A2_UINT); - FMT_TO_STR(WINED3DFMT_R10G10B10A2_SNORM); - FMT_TO_STR(WINED3DFMT_R11G11B10_FLOAT); - FMT_TO_STR(WINED3DFMT_R8G8B8A8_TYPELESS); - FMT_TO_STR(WINED3DFMT_R8G8B8A8_UNORM); - FMT_TO_STR(WINED3DFMT_R8G8B8A8_UNORM_SRGB); - FMT_TO_STR(WINED3DFMT_R8G8B8A8_UINT); - FMT_TO_STR(WINED3DFMT_R8G8B8A8_SNORM); - FMT_TO_STR(WINED3DFMT_R8G8B8A8_SINT); - FMT_TO_STR(WINED3DFMT_R16G16_TYPELESS); - FMT_TO_STR(WINED3DFMT_R16G16_FLOAT); - FMT_TO_STR(WINED3DFMT_R16G16_UNORM); - FMT_TO_STR(WINED3DFMT_R16G16_UINT); - FMT_TO_STR(WINED3DFMT_R16G16_SNORM); - FMT_TO_STR(WINED3DFMT_R16G16_SINT); - FMT_TO_STR(WINED3DFMT_R32_TYPELESS); - FMT_TO_STR(WINED3DFMT_D32_FLOAT); - FMT_TO_STR(WINED3DFMT_R32_FLOAT); - FMT_TO_STR(WINED3DFMT_R32_UINT); - FMT_TO_STR(WINED3DFMT_R32_SINT); - FMT_TO_STR(WINED3DFMT_R24G8_TYPELESS); - FMT_TO_STR(WINED3DFMT_D24_UNORM_S8_UINT); - FMT_TO_STR(WINED3DFMT_R24_UNORM_X8_TYPELESS); - FMT_TO_STR(WINED3DFMT_X24_TYPELESS_G8_UINT); - FMT_TO_STR(WINED3DFMT_R8G8_TYPELESS); - FMT_TO_STR(WINED3DFMT_R8G8_UNORM); - FMT_TO_STR(WINED3DFMT_R8G8_UINT); - FMT_TO_STR(WINED3DFMT_R8G8_SNORM); - FMT_TO_STR(WINED3DFMT_R8G8_SINT); - FMT_TO_STR(WINED3DFMT_R16_TYPELESS); - FMT_TO_STR(WINED3DFMT_R16_FLOAT); - FMT_TO_STR(WINED3DFMT_D16_UNORM); - FMT_TO_STR(WINED3DFMT_R16_UNORM); - FMT_TO_STR(WINED3DFMT_R16_UINT); - FMT_TO_STR(WINED3DFMT_R16_SNORM); - FMT_TO_STR(WINED3DFMT_R16_SINT); - FMT_TO_STR(WINED3DFMT_R8_TYPELESS); - FMT_TO_STR(WINED3DFMT_R8_UNORM); - FMT_TO_STR(WINED3DFMT_R8_UINT); - FMT_TO_STR(WINED3DFMT_R8_SNORM); - FMT_TO_STR(WINED3DFMT_R8_SINT); - FMT_TO_STR(WINED3DFMT_A8_UNORM); - FMT_TO_STR(WINED3DFMT_R1_UNORM); - FMT_TO_STR(WINED3DFMT_R9G9B9E5_SHAREDEXP); - FMT_TO_STR(WINED3DFMT_R8G8_B8G8_UNORM); - FMT_TO_STR(WINED3DFMT_G8R8_G8B8_UNORM); - FMT_TO_STR(WINED3DFMT_BC1_TYPELESS); - FMT_TO_STR(WINED3DFMT_BC1_UNORM); - FMT_TO_STR(WINED3DFMT_BC1_UNORM_SRGB); - FMT_TO_STR(WINED3DFMT_BC2_TYPELESS); - FMT_TO_STR(WINED3DFMT_BC2_UNORM); - FMT_TO_STR(WINED3DFMT_BC2_UNORM_SRGB); - FMT_TO_STR(WINED3DFMT_BC3_TYPELESS); - FMT_TO_STR(WINED3DFMT_BC3_UNORM); - FMT_TO_STR(WINED3DFMT_BC3_UNORM_SRGB); - FMT_TO_STR(WINED3DFMT_BC4_TYPELESS); - FMT_TO_STR(WINED3DFMT_BC4_UNORM); - FMT_TO_STR(WINED3DFMT_BC4_SNORM); - FMT_TO_STR(WINED3DFMT_BC5_TYPELESS); - FMT_TO_STR(WINED3DFMT_BC5_UNORM); - FMT_TO_STR(WINED3DFMT_BC5_SNORM); - FMT_TO_STR(WINED3DFMT_B5G6R5_UNORM); - FMT_TO_STR(WINED3DFMT_B5G5R5A1_UNORM); - FMT_TO_STR(WINED3DFMT_B8G8R8A8_UNORM); - FMT_TO_STR(WINED3DFMT_B8G8R8X8_UNORM); -#undef FMT_TO_STR - default: +const char *debug_d3dformat(enum wined3d_format_id format_id) +{ + switch (format_id) { - char fourcc[5]; - fourcc[0] = (char)(fmt); - fourcc[1] = (char)(fmt >> 8); - fourcc[2] = (char)(fmt >> 16); - fourcc[3] = (char)(fmt >> 24); - fourcc[4] = 0; - if( isprint(fourcc[0]) && isprint(fourcc[1]) && isprint(fourcc[2]) && isprint(fourcc[3]) ) - FIXME("Unrecognized %u (as fourcc: %s) WINED3DFORMAT!\n", fmt, fourcc); - else - FIXME("Unrecognized %u WINED3DFORMAT!\n", fmt); +#define FMT_TO_STR(format_id) case format_id: return #format_id + FMT_TO_STR(WINED3DFMT_UNKNOWN); + FMT_TO_STR(WINED3DFMT_B8G8R8_UNORM); + FMT_TO_STR(WINED3DFMT_B5G5R5X1_UNORM); + FMT_TO_STR(WINED3DFMT_B4G4R4A4_UNORM); + FMT_TO_STR(WINED3DFMT_B2G3R3_UNORM); + FMT_TO_STR(WINED3DFMT_B2G3R3A8_UNORM); + FMT_TO_STR(WINED3DFMT_B4G4R4X4_UNORM); + FMT_TO_STR(WINED3DFMT_R8G8B8X8_UNORM); + FMT_TO_STR(WINED3DFMT_B10G10R10A2_UNORM); + FMT_TO_STR(WINED3DFMT_P8_UINT_A8_UNORM); + FMT_TO_STR(WINED3DFMT_P8_UINT); + FMT_TO_STR(WINED3DFMT_L8_UNORM); + FMT_TO_STR(WINED3DFMT_L8A8_UNORM); + FMT_TO_STR(WINED3DFMT_L4A4_UNORM); + FMT_TO_STR(WINED3DFMT_R5G5_SNORM_L6_UNORM); + FMT_TO_STR(WINED3DFMT_R8G8_SNORM_L8X8_UNORM); + FMT_TO_STR(WINED3DFMT_R10G11B11_SNORM); + FMT_TO_STR(WINED3DFMT_R10G10B10_SNORM_A2_UNORM); + FMT_TO_STR(WINED3DFMT_UYVY); + FMT_TO_STR(WINED3DFMT_YUY2); + FMT_TO_STR(WINED3DFMT_YV12); + FMT_TO_STR(WINED3DFMT_DXT1); + FMT_TO_STR(WINED3DFMT_DXT2); + FMT_TO_STR(WINED3DFMT_DXT3); + FMT_TO_STR(WINED3DFMT_DXT4); + FMT_TO_STR(WINED3DFMT_DXT5); + FMT_TO_STR(WINED3DFMT_MULTI2_ARGB8); + FMT_TO_STR(WINED3DFMT_G8R8_G8B8); + FMT_TO_STR(WINED3DFMT_R8G8_B8G8); + FMT_TO_STR(WINED3DFMT_D16_LOCKABLE); + FMT_TO_STR(WINED3DFMT_D32_UNORM); + FMT_TO_STR(WINED3DFMT_S1_UINT_D15_UNORM); + FMT_TO_STR(WINED3DFMT_X8D24_UNORM); + FMT_TO_STR(WINED3DFMT_S4X4_UINT_D24_UNORM); + FMT_TO_STR(WINED3DFMT_L16_UNORM); + FMT_TO_STR(WINED3DFMT_S8_UINT_D24_FLOAT); + FMT_TO_STR(WINED3DFMT_VERTEXDATA); + FMT_TO_STR(WINED3DFMT_R8G8_SNORM_Cx); + FMT_TO_STR(WINED3DFMT_ATI2N); + FMT_TO_STR(WINED3DFMT_NVDB); + FMT_TO_STR(WINED3DFMT_NVHU); + FMT_TO_STR(WINED3DFMT_NVHS); + FMT_TO_STR(WINED3DFMT_R32G32B32A32_TYPELESS); + FMT_TO_STR(WINED3DFMT_R32G32B32A32_FLOAT); + FMT_TO_STR(WINED3DFMT_R32G32B32A32_UINT); + FMT_TO_STR(WINED3DFMT_R32G32B32A32_SINT); + FMT_TO_STR(WINED3DFMT_R32G32B32_TYPELESS); + FMT_TO_STR(WINED3DFMT_R32G32B32_FLOAT); + FMT_TO_STR(WINED3DFMT_R32G32B32_UINT); + FMT_TO_STR(WINED3DFMT_R32G32B32_SINT); + FMT_TO_STR(WINED3DFMT_R16G16B16A16_TYPELESS); + FMT_TO_STR(WINED3DFMT_R16G16B16A16_FLOAT); + FMT_TO_STR(WINED3DFMT_R16G16B16A16_UNORM); + FMT_TO_STR(WINED3DFMT_R16G16B16A16_UINT); + FMT_TO_STR(WINED3DFMT_R16G16B16A16_SNORM); + FMT_TO_STR(WINED3DFMT_R16G16B16A16_SINT); + FMT_TO_STR(WINED3DFMT_R32G32_TYPELESS); + FMT_TO_STR(WINED3DFMT_R32G32_FLOAT); + FMT_TO_STR(WINED3DFMT_R32G32_UINT); + FMT_TO_STR(WINED3DFMT_R32G32_SINT); + FMT_TO_STR(WINED3DFMT_R32G8X24_TYPELESS); + FMT_TO_STR(WINED3DFMT_D32_FLOAT_S8X24_UINT); + FMT_TO_STR(WINED3DFMT_R32_FLOAT_X8X24_TYPELESS); + FMT_TO_STR(WINED3DFMT_X32_TYPELESS_G8X24_UINT); + FMT_TO_STR(WINED3DFMT_R10G10B10A2_TYPELESS); + FMT_TO_STR(WINED3DFMT_R10G10B10A2_UNORM); + FMT_TO_STR(WINED3DFMT_R10G10B10A2_UINT); + FMT_TO_STR(WINED3DFMT_R10G10B10A2_SNORM); + FMT_TO_STR(WINED3DFMT_R11G11B10_FLOAT); + FMT_TO_STR(WINED3DFMT_R8G8B8A8_TYPELESS); + FMT_TO_STR(WINED3DFMT_R8G8B8A8_UNORM); + FMT_TO_STR(WINED3DFMT_R8G8B8A8_UNORM_SRGB); + FMT_TO_STR(WINED3DFMT_R8G8B8A8_UINT); + FMT_TO_STR(WINED3DFMT_R8G8B8A8_SNORM); + FMT_TO_STR(WINED3DFMT_R8G8B8A8_SINT); + FMT_TO_STR(WINED3DFMT_R16G16_TYPELESS); + FMT_TO_STR(WINED3DFMT_R16G16_FLOAT); + FMT_TO_STR(WINED3DFMT_R16G16_UNORM); + FMT_TO_STR(WINED3DFMT_R16G16_UINT); + FMT_TO_STR(WINED3DFMT_R16G16_SNORM); + FMT_TO_STR(WINED3DFMT_R16G16_SINT); + FMT_TO_STR(WINED3DFMT_R32_TYPELESS); + FMT_TO_STR(WINED3DFMT_D32_FLOAT); + FMT_TO_STR(WINED3DFMT_R32_FLOAT); + FMT_TO_STR(WINED3DFMT_R32_UINT); + FMT_TO_STR(WINED3DFMT_R32_SINT); + FMT_TO_STR(WINED3DFMT_R24G8_TYPELESS); + FMT_TO_STR(WINED3DFMT_D24_UNORM_S8_UINT); + FMT_TO_STR(WINED3DFMT_R24_UNORM_X8_TYPELESS); + FMT_TO_STR(WINED3DFMT_X24_TYPELESS_G8_UINT); + FMT_TO_STR(WINED3DFMT_R8G8_TYPELESS); + FMT_TO_STR(WINED3DFMT_R8G8_UNORM); + FMT_TO_STR(WINED3DFMT_R8G8_UINT); + FMT_TO_STR(WINED3DFMT_R8G8_SNORM); + FMT_TO_STR(WINED3DFMT_R8G8_SINT); + FMT_TO_STR(WINED3DFMT_R16_TYPELESS); + FMT_TO_STR(WINED3DFMT_R16_FLOAT); + FMT_TO_STR(WINED3DFMT_D16_UNORM); + FMT_TO_STR(WINED3DFMT_R16_UNORM); + FMT_TO_STR(WINED3DFMT_R16_UINT); + FMT_TO_STR(WINED3DFMT_R16_SNORM); + FMT_TO_STR(WINED3DFMT_R16_SINT); + FMT_TO_STR(WINED3DFMT_R8_TYPELESS); + FMT_TO_STR(WINED3DFMT_R8_UNORM); + FMT_TO_STR(WINED3DFMT_R8_UINT); + FMT_TO_STR(WINED3DFMT_R8_SNORM); + FMT_TO_STR(WINED3DFMT_R8_SINT); + FMT_TO_STR(WINED3DFMT_A8_UNORM); + FMT_TO_STR(WINED3DFMT_R1_UNORM); + FMT_TO_STR(WINED3DFMT_R9G9B9E5_SHAREDEXP); + FMT_TO_STR(WINED3DFMT_R8G8_B8G8_UNORM); + FMT_TO_STR(WINED3DFMT_G8R8_G8B8_UNORM); + FMT_TO_STR(WINED3DFMT_BC1_TYPELESS); + FMT_TO_STR(WINED3DFMT_BC1_UNORM); + FMT_TO_STR(WINED3DFMT_BC1_UNORM_SRGB); + FMT_TO_STR(WINED3DFMT_BC2_TYPELESS); + FMT_TO_STR(WINED3DFMT_BC2_UNORM); + FMT_TO_STR(WINED3DFMT_BC2_UNORM_SRGB); + FMT_TO_STR(WINED3DFMT_BC3_TYPELESS); + FMT_TO_STR(WINED3DFMT_BC3_UNORM); + FMT_TO_STR(WINED3DFMT_BC3_UNORM_SRGB); + FMT_TO_STR(WINED3DFMT_BC4_TYPELESS); + FMT_TO_STR(WINED3DFMT_BC4_UNORM); + FMT_TO_STR(WINED3DFMT_BC4_SNORM); + FMT_TO_STR(WINED3DFMT_BC5_TYPELESS); + FMT_TO_STR(WINED3DFMT_BC5_UNORM); + FMT_TO_STR(WINED3DFMT_BC5_SNORM); + FMT_TO_STR(WINED3DFMT_B5G6R5_UNORM); + FMT_TO_STR(WINED3DFMT_B5G5R5A1_UNORM); + FMT_TO_STR(WINED3DFMT_B8G8R8A8_UNORM); + FMT_TO_STR(WINED3DFMT_B8G8R8X8_UNORM); +#undef FMT_TO_STR + default: + { + char fourcc[5]; + fourcc[0] = (char)(format_id); + fourcc[1] = (char)(format_id >> 8); + fourcc[2] = (char)(format_id >> 16); + fourcc[3] = (char)(format_id >> 24); + fourcc[4] = 0; + if (isprint(fourcc[0]) && isprint(fourcc[1]) && isprint(fourcc[2]) && isprint(fourcc[3])) + FIXME("Unrecognized %#x (as fourcc: %s) WINED3DFORMAT!\n", format_id, fourcc); + else + FIXME("Unrecognized %#x WINED3DFORMAT!\n", format_id); + } + return "unrecognized"; } - return "unrecognized"; - } } -const char* debug_d3ddevicetype(WINED3DDEVTYPE devtype) { - switch (devtype) { +const char *debug_d3ddevicetype(WINED3DDEVTYPE devtype) +{ + switch (devtype) + { #define DEVTYPE_TO_STR(dev) case dev: return #dev - DEVTYPE_TO_STR(WINED3DDEVTYPE_HAL); - DEVTYPE_TO_STR(WINED3DDEVTYPE_REF); - DEVTYPE_TO_STR(WINED3DDEVTYPE_SW); + DEVTYPE_TO_STR(WINED3DDEVTYPE_HAL); + DEVTYPE_TO_STR(WINED3DDEVTYPE_REF); + DEVTYPE_TO_STR(WINED3DDEVTYPE_SW); #undef DEVTYPE_TO_STR - default: - FIXME("Unrecognized %u WINED3DDEVTYPE!\n", devtype); - return "unrecognized"; - } + default: + FIXME("Unrecognized %u WINED3DDEVTYPE!\n", devtype); + return "unrecognized"; + } } const char *debug_d3dusage(DWORD usage) { - char buf[284]; + char buf[333]; buf[0] = '\0'; #define WINED3DUSAGE_TO_STR(u) if (usage & u) { strcat(buf, " | "#u); usage &= ~u; } @@ -1711,6 +1770,8 @@ const char *debug_d3dusage(DWORD usage) WINED3DUSAGE_TO_STR(WINED3DUSAGE_DYNAMIC); WINED3DUSAGE_TO_STR(WINED3DUSAGE_AUTOGENMIPMAP); WINED3DUSAGE_TO_STR(WINED3DUSAGE_DMAP); + WINED3DUSAGE_TO_STR(WINED3DUSAGE_STATICDECL); + WINED3DUSAGE_TO_STR(WINED3DUSAGE_OVERLAY); #undef WINED3DUSAGE_TO_STR if (usage) FIXME("Unrecognized usage flag(s) %#x\n", usage); @@ -1777,201 +1838,209 @@ const char* debug_d3ddeclusage(BYTE usage) { } } -const char* debug_d3dresourcetype(WINED3DRESOURCETYPE res) { - switch (res) { +const char *debug_d3dresourcetype(WINED3DRESOURCETYPE res) +{ + switch (res) + { #define RES_TO_STR(res) case res: return #res - RES_TO_STR(WINED3DRTYPE_SURFACE); - RES_TO_STR(WINED3DRTYPE_VOLUME); - RES_TO_STR(WINED3DRTYPE_TEXTURE); - RES_TO_STR(WINED3DRTYPE_VOLUMETEXTURE); - RES_TO_STR(WINED3DRTYPE_CUBETEXTURE); - RES_TO_STR(WINED3DRTYPE_BUFFER); + RES_TO_STR(WINED3DRTYPE_SURFACE); + RES_TO_STR(WINED3DRTYPE_VOLUME); + RES_TO_STR(WINED3DRTYPE_TEXTURE); + RES_TO_STR(WINED3DRTYPE_VOLUMETEXTURE); + RES_TO_STR(WINED3DRTYPE_CUBETEXTURE); + RES_TO_STR(WINED3DRTYPE_BUFFER); #undef RES_TO_STR - default: - FIXME("Unrecognized %u WINED3DRESOURCETYPE!\n", res); - return "unrecognized"; - } + default: + FIXME("Unrecognized %u WINED3DRESOURCETYPE!\n", res); + return "unrecognized"; + } } -const char* debug_d3dprimitivetype(WINED3DPRIMITIVETYPE PrimitiveType) { - switch (PrimitiveType) { +const char *debug_d3dprimitivetype(WINED3DPRIMITIVETYPE PrimitiveType) +{ + switch (PrimitiveType) + { #define PRIM_TO_STR(prim) case prim: return #prim - PRIM_TO_STR(WINED3DPT_UNDEFINED); - PRIM_TO_STR(WINED3DPT_POINTLIST); - PRIM_TO_STR(WINED3DPT_LINELIST); - PRIM_TO_STR(WINED3DPT_LINESTRIP); - PRIM_TO_STR(WINED3DPT_TRIANGLELIST); - PRIM_TO_STR(WINED3DPT_TRIANGLESTRIP); - PRIM_TO_STR(WINED3DPT_TRIANGLEFAN); - PRIM_TO_STR(WINED3DPT_LINELIST_ADJ); - PRIM_TO_STR(WINED3DPT_LINESTRIP_ADJ); - PRIM_TO_STR(WINED3DPT_TRIANGLELIST_ADJ); - PRIM_TO_STR(WINED3DPT_TRIANGLESTRIP_ADJ); + PRIM_TO_STR(WINED3DPT_UNDEFINED); + PRIM_TO_STR(WINED3DPT_POINTLIST); + PRIM_TO_STR(WINED3DPT_LINELIST); + PRIM_TO_STR(WINED3DPT_LINESTRIP); + PRIM_TO_STR(WINED3DPT_TRIANGLELIST); + PRIM_TO_STR(WINED3DPT_TRIANGLESTRIP); + PRIM_TO_STR(WINED3DPT_TRIANGLEFAN); + PRIM_TO_STR(WINED3DPT_LINELIST_ADJ); + PRIM_TO_STR(WINED3DPT_LINESTRIP_ADJ); + PRIM_TO_STR(WINED3DPT_TRIANGLELIST_ADJ); + PRIM_TO_STR(WINED3DPT_TRIANGLESTRIP_ADJ); #undef PRIM_TO_STR - default: - FIXME("Unrecognized %u WINED3DPRIMITIVETYPE!\n", PrimitiveType); - return "unrecognized"; - } + default: + FIXME("Unrecognized %u WINED3DPRIMITIVETYPE!\n", PrimitiveType); + return "unrecognized"; + } } -const char* debug_d3drenderstate(DWORD state) { - switch (state) { +const char *debug_d3drenderstate(WINED3DRENDERSTATETYPE state) +{ + switch (state) + { #define D3DSTATE_TO_STR(u) case u: return #u - D3DSTATE_TO_STR(WINED3DRS_ANTIALIAS ); - D3DSTATE_TO_STR(WINED3DRS_TEXTUREPERSPECTIVE ); - D3DSTATE_TO_STR(WINED3DRS_WRAPU ); - D3DSTATE_TO_STR(WINED3DRS_WRAPV ); - D3DSTATE_TO_STR(WINED3DRS_ZENABLE ); - D3DSTATE_TO_STR(WINED3DRS_FILLMODE ); - D3DSTATE_TO_STR(WINED3DRS_SHADEMODE ); - D3DSTATE_TO_STR(WINED3DRS_LINEPATTERN ); - D3DSTATE_TO_STR(WINED3DRS_MONOENABLE ); - D3DSTATE_TO_STR(WINED3DRS_ROP2 ); - D3DSTATE_TO_STR(WINED3DRS_PLANEMASK ); - D3DSTATE_TO_STR(WINED3DRS_ZWRITEENABLE ); - D3DSTATE_TO_STR(WINED3DRS_ALPHATESTENABLE ); - D3DSTATE_TO_STR(WINED3DRS_LASTPIXEL ); - D3DSTATE_TO_STR(WINED3DRS_SRCBLEND ); - D3DSTATE_TO_STR(WINED3DRS_DESTBLEND ); - D3DSTATE_TO_STR(WINED3DRS_CULLMODE ); - D3DSTATE_TO_STR(WINED3DRS_ZFUNC ); - D3DSTATE_TO_STR(WINED3DRS_ALPHAREF ); - D3DSTATE_TO_STR(WINED3DRS_ALPHAFUNC ); - D3DSTATE_TO_STR(WINED3DRS_DITHERENABLE ); - D3DSTATE_TO_STR(WINED3DRS_ALPHABLENDENABLE ); - D3DSTATE_TO_STR(WINED3DRS_FOGENABLE ); - D3DSTATE_TO_STR(WINED3DRS_SPECULARENABLE ); - D3DSTATE_TO_STR(WINED3DRS_ZVISIBLE ); - D3DSTATE_TO_STR(WINED3DRS_SUBPIXEL ); - D3DSTATE_TO_STR(WINED3DRS_SUBPIXELX ); - D3DSTATE_TO_STR(WINED3DRS_STIPPLEDALPHA ); - D3DSTATE_TO_STR(WINED3DRS_FOGCOLOR ); - D3DSTATE_TO_STR(WINED3DRS_FOGTABLEMODE ); - D3DSTATE_TO_STR(WINED3DRS_FOGSTART ); - D3DSTATE_TO_STR(WINED3DRS_FOGEND ); - D3DSTATE_TO_STR(WINED3DRS_FOGDENSITY ); - D3DSTATE_TO_STR(WINED3DRS_STIPPLEENABLE ); - D3DSTATE_TO_STR(WINED3DRS_EDGEANTIALIAS ); - D3DSTATE_TO_STR(WINED3DRS_COLORKEYENABLE ); - D3DSTATE_TO_STR(WINED3DRS_MIPMAPLODBIAS ); - D3DSTATE_TO_STR(WINED3DRS_ZBIAS ); - D3DSTATE_TO_STR(WINED3DRS_RANGEFOGENABLE ); - D3DSTATE_TO_STR(WINED3DRS_ANISOTROPY ); - D3DSTATE_TO_STR(WINED3DRS_FLUSHBATCH ); - D3DSTATE_TO_STR(WINED3DRS_TRANSLUCENTSORTINDEPENDENT); - D3DSTATE_TO_STR(WINED3DRS_STENCILENABLE ); - D3DSTATE_TO_STR(WINED3DRS_STENCILFAIL ); - D3DSTATE_TO_STR(WINED3DRS_STENCILZFAIL ); - D3DSTATE_TO_STR(WINED3DRS_STENCILPASS ); - D3DSTATE_TO_STR(WINED3DRS_STENCILFUNC ); - D3DSTATE_TO_STR(WINED3DRS_STENCILREF ); - D3DSTATE_TO_STR(WINED3DRS_STENCILMASK ); - D3DSTATE_TO_STR(WINED3DRS_STENCILWRITEMASK ); - D3DSTATE_TO_STR(WINED3DRS_TEXTUREFACTOR ); - D3DSTATE_TO_STR(WINED3DRS_WRAP0 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP1 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP2 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP3 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP4 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP5 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP6 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP7 ); - D3DSTATE_TO_STR(WINED3DRS_CLIPPING ); - D3DSTATE_TO_STR(WINED3DRS_LIGHTING ); - D3DSTATE_TO_STR(WINED3DRS_EXTENTS ); - D3DSTATE_TO_STR(WINED3DRS_AMBIENT ); - D3DSTATE_TO_STR(WINED3DRS_FOGVERTEXMODE ); - D3DSTATE_TO_STR(WINED3DRS_COLORVERTEX ); - D3DSTATE_TO_STR(WINED3DRS_LOCALVIEWER ); - D3DSTATE_TO_STR(WINED3DRS_NORMALIZENORMALS ); - D3DSTATE_TO_STR(WINED3DRS_COLORKEYBLENDENABLE ); - D3DSTATE_TO_STR(WINED3DRS_DIFFUSEMATERIALSOURCE ); - D3DSTATE_TO_STR(WINED3DRS_SPECULARMATERIALSOURCE ); - D3DSTATE_TO_STR(WINED3DRS_AMBIENTMATERIALSOURCE ); - D3DSTATE_TO_STR(WINED3DRS_EMISSIVEMATERIALSOURCE ); - D3DSTATE_TO_STR(WINED3DRS_VERTEXBLEND ); - D3DSTATE_TO_STR(WINED3DRS_CLIPPLANEENABLE ); - D3DSTATE_TO_STR(WINED3DRS_SOFTWAREVERTEXPROCESSING ); - D3DSTATE_TO_STR(WINED3DRS_POINTSIZE ); - D3DSTATE_TO_STR(WINED3DRS_POINTSIZE_MIN ); - D3DSTATE_TO_STR(WINED3DRS_POINTSPRITEENABLE ); - D3DSTATE_TO_STR(WINED3DRS_POINTSCALEENABLE ); - D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_A ); - D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_B ); - D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_C ); - D3DSTATE_TO_STR(WINED3DRS_MULTISAMPLEANTIALIAS ); - D3DSTATE_TO_STR(WINED3DRS_MULTISAMPLEMASK ); - D3DSTATE_TO_STR(WINED3DRS_PATCHEDGESTYLE ); - D3DSTATE_TO_STR(WINED3DRS_PATCHSEGMENTS ); - D3DSTATE_TO_STR(WINED3DRS_DEBUGMONITORTOKEN ); - D3DSTATE_TO_STR(WINED3DRS_POINTSIZE_MAX ); - D3DSTATE_TO_STR(WINED3DRS_INDEXEDVERTEXBLENDENABLE ); - D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE ); - D3DSTATE_TO_STR(WINED3DRS_TWEENFACTOR ); - D3DSTATE_TO_STR(WINED3DRS_BLENDOP ); - D3DSTATE_TO_STR(WINED3DRS_POSITIONDEGREE ); - D3DSTATE_TO_STR(WINED3DRS_NORMALDEGREE ); - D3DSTATE_TO_STR(WINED3DRS_SCISSORTESTENABLE ); - D3DSTATE_TO_STR(WINED3DRS_SLOPESCALEDEPTHBIAS ); - D3DSTATE_TO_STR(WINED3DRS_ANTIALIASEDLINEENABLE ); - D3DSTATE_TO_STR(WINED3DRS_MINTESSELLATIONLEVEL ); - D3DSTATE_TO_STR(WINED3DRS_MAXTESSELLATIONLEVEL ); - D3DSTATE_TO_STR(WINED3DRS_ADAPTIVETESS_X ); - D3DSTATE_TO_STR(WINED3DRS_ADAPTIVETESS_Y ); - D3DSTATE_TO_STR(WINED3DRS_ADAPTIVETESS_Z ); - D3DSTATE_TO_STR(WINED3DRS_ADAPTIVETESS_W ); - D3DSTATE_TO_STR(WINED3DRS_ENABLEADAPTIVETESSELLATION); - D3DSTATE_TO_STR(WINED3DRS_TWOSIDEDSTENCILMODE ); - D3DSTATE_TO_STR(WINED3DRS_CCW_STENCILFAIL ); - D3DSTATE_TO_STR(WINED3DRS_CCW_STENCILZFAIL ); - D3DSTATE_TO_STR(WINED3DRS_CCW_STENCILPASS ); - D3DSTATE_TO_STR(WINED3DRS_CCW_STENCILFUNC ); - D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE1 ); - D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE2 ); - D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE3 ); - D3DSTATE_TO_STR(WINED3DRS_BLENDFACTOR ); - D3DSTATE_TO_STR(WINED3DRS_SRGBWRITEENABLE ); - D3DSTATE_TO_STR(WINED3DRS_DEPTHBIAS ); - D3DSTATE_TO_STR(WINED3DRS_WRAP8 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP9 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP10 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP11 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP12 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP13 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP14 ); - D3DSTATE_TO_STR(WINED3DRS_WRAP15 ); - D3DSTATE_TO_STR(WINED3DRS_SEPARATEALPHABLENDENABLE ); - D3DSTATE_TO_STR(WINED3DRS_SRCBLENDALPHA ); - D3DSTATE_TO_STR(WINED3DRS_DESTBLENDALPHA ); - D3DSTATE_TO_STR(WINED3DRS_BLENDOPALPHA ); + D3DSTATE_TO_STR(WINED3DRS_ANTIALIAS); + D3DSTATE_TO_STR(WINED3DRS_TEXTUREPERSPECTIVE); + D3DSTATE_TO_STR(WINED3DRS_WRAPU); + D3DSTATE_TO_STR(WINED3DRS_WRAPV); + D3DSTATE_TO_STR(WINED3DRS_ZENABLE); + D3DSTATE_TO_STR(WINED3DRS_FILLMODE); + D3DSTATE_TO_STR(WINED3DRS_SHADEMODE); + D3DSTATE_TO_STR(WINED3DRS_LINEPATTERN); + D3DSTATE_TO_STR(WINED3DRS_MONOENABLE); + D3DSTATE_TO_STR(WINED3DRS_ROP2); + D3DSTATE_TO_STR(WINED3DRS_PLANEMASK); + D3DSTATE_TO_STR(WINED3DRS_ZWRITEENABLE); + D3DSTATE_TO_STR(WINED3DRS_ALPHATESTENABLE); + D3DSTATE_TO_STR(WINED3DRS_LASTPIXEL); + D3DSTATE_TO_STR(WINED3DRS_SRCBLEND); + D3DSTATE_TO_STR(WINED3DRS_DESTBLEND); + D3DSTATE_TO_STR(WINED3DRS_CULLMODE); + D3DSTATE_TO_STR(WINED3DRS_ZFUNC); + D3DSTATE_TO_STR(WINED3DRS_ALPHAREF); + D3DSTATE_TO_STR(WINED3DRS_ALPHAFUNC); + D3DSTATE_TO_STR(WINED3DRS_DITHERENABLE); + D3DSTATE_TO_STR(WINED3DRS_ALPHABLENDENABLE); + D3DSTATE_TO_STR(WINED3DRS_FOGENABLE); + D3DSTATE_TO_STR(WINED3DRS_SPECULARENABLE); + D3DSTATE_TO_STR(WINED3DRS_ZVISIBLE); + D3DSTATE_TO_STR(WINED3DRS_SUBPIXEL); + D3DSTATE_TO_STR(WINED3DRS_SUBPIXELX); + D3DSTATE_TO_STR(WINED3DRS_STIPPLEDALPHA); + D3DSTATE_TO_STR(WINED3DRS_FOGCOLOR); + D3DSTATE_TO_STR(WINED3DRS_FOGTABLEMODE); + D3DSTATE_TO_STR(WINED3DRS_FOGSTART); + D3DSTATE_TO_STR(WINED3DRS_FOGEND); + D3DSTATE_TO_STR(WINED3DRS_FOGDENSITY); + D3DSTATE_TO_STR(WINED3DRS_STIPPLEENABLE); + D3DSTATE_TO_STR(WINED3DRS_EDGEANTIALIAS); + D3DSTATE_TO_STR(WINED3DRS_COLORKEYENABLE); + D3DSTATE_TO_STR(WINED3DRS_MIPMAPLODBIAS); + D3DSTATE_TO_STR(WINED3DRS_ZBIAS); + D3DSTATE_TO_STR(WINED3DRS_RANGEFOGENABLE); + D3DSTATE_TO_STR(WINED3DRS_ANISOTROPY); + D3DSTATE_TO_STR(WINED3DRS_FLUSHBATCH); + D3DSTATE_TO_STR(WINED3DRS_TRANSLUCENTSORTINDEPENDENT); + D3DSTATE_TO_STR(WINED3DRS_STENCILENABLE); + D3DSTATE_TO_STR(WINED3DRS_STENCILFAIL); + D3DSTATE_TO_STR(WINED3DRS_STENCILZFAIL); + D3DSTATE_TO_STR(WINED3DRS_STENCILPASS); + D3DSTATE_TO_STR(WINED3DRS_STENCILFUNC); + D3DSTATE_TO_STR(WINED3DRS_STENCILREF); + D3DSTATE_TO_STR(WINED3DRS_STENCILMASK); + D3DSTATE_TO_STR(WINED3DRS_STENCILWRITEMASK); + D3DSTATE_TO_STR(WINED3DRS_TEXTUREFACTOR); + D3DSTATE_TO_STR(WINED3DRS_WRAP0); + D3DSTATE_TO_STR(WINED3DRS_WRAP1); + D3DSTATE_TO_STR(WINED3DRS_WRAP2); + D3DSTATE_TO_STR(WINED3DRS_WRAP3); + D3DSTATE_TO_STR(WINED3DRS_WRAP4); + D3DSTATE_TO_STR(WINED3DRS_WRAP5); + D3DSTATE_TO_STR(WINED3DRS_WRAP6); + D3DSTATE_TO_STR(WINED3DRS_WRAP7); + D3DSTATE_TO_STR(WINED3DRS_CLIPPING); + D3DSTATE_TO_STR(WINED3DRS_LIGHTING); + D3DSTATE_TO_STR(WINED3DRS_EXTENTS); + D3DSTATE_TO_STR(WINED3DRS_AMBIENT); + D3DSTATE_TO_STR(WINED3DRS_FOGVERTEXMODE); + D3DSTATE_TO_STR(WINED3DRS_COLORVERTEX); + D3DSTATE_TO_STR(WINED3DRS_LOCALVIEWER); + D3DSTATE_TO_STR(WINED3DRS_NORMALIZENORMALS); + D3DSTATE_TO_STR(WINED3DRS_COLORKEYBLENDENABLE); + D3DSTATE_TO_STR(WINED3DRS_DIFFUSEMATERIALSOURCE); + D3DSTATE_TO_STR(WINED3DRS_SPECULARMATERIALSOURCE); + D3DSTATE_TO_STR(WINED3DRS_AMBIENTMATERIALSOURCE); + D3DSTATE_TO_STR(WINED3DRS_EMISSIVEMATERIALSOURCE); + D3DSTATE_TO_STR(WINED3DRS_VERTEXBLEND); + D3DSTATE_TO_STR(WINED3DRS_CLIPPLANEENABLE); + D3DSTATE_TO_STR(WINED3DRS_SOFTWAREVERTEXPROCESSING); + D3DSTATE_TO_STR(WINED3DRS_POINTSIZE); + D3DSTATE_TO_STR(WINED3DRS_POINTSIZE_MIN); + D3DSTATE_TO_STR(WINED3DRS_POINTSPRITEENABLE); + D3DSTATE_TO_STR(WINED3DRS_POINTSCALEENABLE); + D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_A); + D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_B); + D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_C); + D3DSTATE_TO_STR(WINED3DRS_MULTISAMPLEANTIALIAS); + D3DSTATE_TO_STR(WINED3DRS_MULTISAMPLEMASK); + D3DSTATE_TO_STR(WINED3DRS_PATCHEDGESTYLE); + D3DSTATE_TO_STR(WINED3DRS_PATCHSEGMENTS); + D3DSTATE_TO_STR(WINED3DRS_DEBUGMONITORTOKEN); + D3DSTATE_TO_STR(WINED3DRS_POINTSIZE_MAX); + D3DSTATE_TO_STR(WINED3DRS_INDEXEDVERTEXBLENDENABLE); + D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE); + D3DSTATE_TO_STR(WINED3DRS_TWEENFACTOR); + D3DSTATE_TO_STR(WINED3DRS_BLENDOP); + D3DSTATE_TO_STR(WINED3DRS_POSITIONDEGREE); + D3DSTATE_TO_STR(WINED3DRS_NORMALDEGREE); + D3DSTATE_TO_STR(WINED3DRS_SCISSORTESTENABLE); + D3DSTATE_TO_STR(WINED3DRS_SLOPESCALEDEPTHBIAS); + D3DSTATE_TO_STR(WINED3DRS_ANTIALIASEDLINEENABLE); + D3DSTATE_TO_STR(WINED3DRS_MINTESSELLATIONLEVEL); + D3DSTATE_TO_STR(WINED3DRS_MAXTESSELLATIONLEVEL); + D3DSTATE_TO_STR(WINED3DRS_ADAPTIVETESS_X); + D3DSTATE_TO_STR(WINED3DRS_ADAPTIVETESS_Y); + D3DSTATE_TO_STR(WINED3DRS_ADAPTIVETESS_Z); + D3DSTATE_TO_STR(WINED3DRS_ADAPTIVETESS_W); + D3DSTATE_TO_STR(WINED3DRS_ENABLEADAPTIVETESSELLATION); + D3DSTATE_TO_STR(WINED3DRS_TWOSIDEDSTENCILMODE); + D3DSTATE_TO_STR(WINED3DRS_CCW_STENCILFAIL); + D3DSTATE_TO_STR(WINED3DRS_CCW_STENCILZFAIL); + D3DSTATE_TO_STR(WINED3DRS_CCW_STENCILPASS); + D3DSTATE_TO_STR(WINED3DRS_CCW_STENCILFUNC); + D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE1); + D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE2); + D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE3); + D3DSTATE_TO_STR(WINED3DRS_BLENDFACTOR); + D3DSTATE_TO_STR(WINED3DRS_SRGBWRITEENABLE); + D3DSTATE_TO_STR(WINED3DRS_DEPTHBIAS); + D3DSTATE_TO_STR(WINED3DRS_WRAP8); + D3DSTATE_TO_STR(WINED3DRS_WRAP9); + D3DSTATE_TO_STR(WINED3DRS_WRAP10); + D3DSTATE_TO_STR(WINED3DRS_WRAP11); + D3DSTATE_TO_STR(WINED3DRS_WRAP12); + D3DSTATE_TO_STR(WINED3DRS_WRAP13); + D3DSTATE_TO_STR(WINED3DRS_WRAP14); + D3DSTATE_TO_STR(WINED3DRS_WRAP15); + D3DSTATE_TO_STR(WINED3DRS_SEPARATEALPHABLENDENABLE); + D3DSTATE_TO_STR(WINED3DRS_SRCBLENDALPHA); + D3DSTATE_TO_STR(WINED3DRS_DESTBLENDALPHA); + D3DSTATE_TO_STR(WINED3DRS_BLENDOPALPHA); #undef D3DSTATE_TO_STR - default: - FIXME("Unrecognized %u render state!\n", state); - return "unrecognized"; - } + default: + FIXME("Unrecognized %u render state!\n", state); + return "unrecognized"; + } } -const char* debug_d3dsamplerstate(DWORD state) { - switch (state) { +const char *debug_d3dsamplerstate(DWORD state) +{ + switch (state) + { #define D3DSTATE_TO_STR(u) case u: return #u - D3DSTATE_TO_STR(WINED3DSAMP_BORDERCOLOR ); - D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSU ); - D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSV ); - D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSW ); - D3DSTATE_TO_STR(WINED3DSAMP_MAGFILTER ); - D3DSTATE_TO_STR(WINED3DSAMP_MINFILTER ); - D3DSTATE_TO_STR(WINED3DSAMP_MIPFILTER ); - D3DSTATE_TO_STR(WINED3DSAMP_MIPMAPLODBIAS); - D3DSTATE_TO_STR(WINED3DSAMP_MAXMIPLEVEL ); - D3DSTATE_TO_STR(WINED3DSAMP_MAXANISOTROPY); - D3DSTATE_TO_STR(WINED3DSAMP_SRGBTEXTURE ); - D3DSTATE_TO_STR(WINED3DSAMP_ELEMENTINDEX ); - D3DSTATE_TO_STR(WINED3DSAMP_DMAPOFFSET ); + D3DSTATE_TO_STR(WINED3DSAMP_BORDERCOLOR); + D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSU); + D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSV); + D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSW); + D3DSTATE_TO_STR(WINED3DSAMP_MAGFILTER); + D3DSTATE_TO_STR(WINED3DSAMP_MINFILTER); + D3DSTATE_TO_STR(WINED3DSAMP_MIPFILTER); + D3DSTATE_TO_STR(WINED3DSAMP_MIPMAPLODBIAS); + D3DSTATE_TO_STR(WINED3DSAMP_MAXMIPLEVEL); + D3DSTATE_TO_STR(WINED3DSAMP_MAXANISOTROPY); + D3DSTATE_TO_STR(WINED3DSAMP_SRGBTEXTURE); + D3DSTATE_TO_STR(WINED3DSAMP_ELEMENTINDEX); + D3DSTATE_TO_STR(WINED3DSAMP_DMAPOFFSET); #undef D3DSTATE_TO_STR - default: - FIXME("Unrecognized %u sampler state!\n", state); - return "unrecognized"; - } + default: + FIXME("Unrecognized %u sampler state!\n", state); + return "unrecognized"; + } } const char *debug_d3dtexturefiltertype(WINED3DTEXTUREFILTERTYPE filter_type) { @@ -1992,32 +2061,34 @@ const char *debug_d3dtexturefiltertype(WINED3DTEXTUREFILTERTYPE filter_type) { } } -const char* debug_d3dtexturestate(DWORD state) { - switch (state) { +const char *debug_d3dtexturestate(DWORD state) +{ + switch (state) + { #define D3DSTATE_TO_STR(u) case u: return #u - D3DSTATE_TO_STR(WINED3DTSS_COLOROP ); - D3DSTATE_TO_STR(WINED3DTSS_COLORARG1 ); - D3DSTATE_TO_STR(WINED3DTSS_COLORARG2 ); - D3DSTATE_TO_STR(WINED3DTSS_ALPHAOP ); - D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG1 ); - D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG2 ); - D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT00 ); - D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT01 ); - D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT10 ); - D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT11 ); - D3DSTATE_TO_STR(WINED3DTSS_TEXCOORDINDEX ); - D3DSTATE_TO_STR(WINED3DTSS_BUMPENVLSCALE ); - D3DSTATE_TO_STR(WINED3DTSS_BUMPENVLOFFSET ); - D3DSTATE_TO_STR(WINED3DTSS_TEXTURETRANSFORMFLAGS ); - D3DSTATE_TO_STR(WINED3DTSS_COLORARG0 ); - D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG0 ); - D3DSTATE_TO_STR(WINED3DTSS_RESULTARG ); - D3DSTATE_TO_STR(WINED3DTSS_CONSTANT ); + D3DSTATE_TO_STR(WINED3DTSS_COLOROP); + D3DSTATE_TO_STR(WINED3DTSS_COLORARG1); + D3DSTATE_TO_STR(WINED3DTSS_COLORARG2); + D3DSTATE_TO_STR(WINED3DTSS_ALPHAOP); + D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG1); + D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG2); + D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT00); + D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT01); + D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT10); + D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT11); + D3DSTATE_TO_STR(WINED3DTSS_TEXCOORDINDEX); + D3DSTATE_TO_STR(WINED3DTSS_BUMPENVLSCALE); + D3DSTATE_TO_STR(WINED3DTSS_BUMPENVLOFFSET); + D3DSTATE_TO_STR(WINED3DTSS_TEXTURETRANSFORMFLAGS); + D3DSTATE_TO_STR(WINED3DTSS_COLORARG0); + D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG0); + D3DSTATE_TO_STR(WINED3DTSS_RESULTARG); + D3DSTATE_TO_STR(WINED3DTSS_CONSTANT); #undef D3DSTATE_TO_STR - default: - FIXME("Unrecognized %u texture state!\n", state); - return "unrecognized"; - } + default: + FIXME("Unrecognized %u texture state!\n", state); + return "unrecognized"; + } } const char* debug_d3dtop(WINED3DTEXTUREOP d3dtop) { @@ -2126,18 +2197,20 @@ const char *debug_d3dstate(DWORD state) return wine_dbg_sprintf("UNKNOWN_STATE(%#x)", state); } -const char* debug_d3dpool(WINED3DPOOL Pool) { - switch (Pool) { +const char *debug_d3dpool(WINED3DPOOL pool) +{ + switch (pool) + { #define POOL_TO_STR(p) case p: return #p - POOL_TO_STR(WINED3DPOOL_DEFAULT); - POOL_TO_STR(WINED3DPOOL_MANAGED); - POOL_TO_STR(WINED3DPOOL_SYSTEMMEM); - POOL_TO_STR(WINED3DPOOL_SCRATCH); + POOL_TO_STR(WINED3DPOOL_DEFAULT); + POOL_TO_STR(WINED3DPOOL_MANAGED); + POOL_TO_STR(WINED3DPOOL_SYSTEMMEM); + POOL_TO_STR(WINED3DPOOL_SCRATCH); #undef POOL_TO_STR - default: - FIXME("Unrecognized %u WINED3DPOOL!\n", Pool); - return "unrecognized"; - } + default: + FIXME("Unrecognized %u WINED3DPOOL!\n", pool); + return "unrecognized"; + } } const char *debug_fbostatus(GLenum status) { @@ -2293,9 +2366,11 @@ GLenum CompareFunc(DWORD func) { } } -BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3) { +BOOL is_invalid_op(const struct wined3d_state *state, int stage, + WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3) +{ if (op == WINED3DTOP_DISABLE) return FALSE; - if (This->stateBlock->textures[stage]) return FALSE; + if (state->textures[stage]) return FALSE; if ((arg1 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE && op != WINED3DTOP_SELECTARG2) return TRUE; @@ -2310,7 +2385,7 @@ BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, WINED3DTEXTUREOP op, DWO /* Setup this textures matrix according to the texture flags*/ /* GL locking is done by the caller (state handler) */ void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, BOOL transformed, - WINED3DFORMAT vtx_fmt, BOOL ffp_proj_control) + enum wined3d_format_id vtx_fmt, BOOL ffp_proj_control) { float mat[16]; @@ -2417,11 +2492,12 @@ unsigned int count_bits(unsigned int mask) /* Helper function for retrieving color info for ChoosePixelFormat and wglChoosePixelFormatARB. * The later function requires individual color components. */ -BOOL getColorBits(const struct wined3d_format_desc *format_desc, +BOOL getColorBits(const struct wined3d_format *format, short *redSize, short *greenSize, short *blueSize, short *alphaSize, short *totalSize) { - TRACE("fmt: %s\n", debug_d3dformat(format_desc->format)); - switch(format_desc->format) + TRACE("format %s.\n", debug_d3dformat(format->id)); + + switch (format->id) { case WINED3DFMT_B8G8R8X8_UNORM: case WINED3DFMT_B8G8R8_UNORM: @@ -2438,26 +2514,27 @@ BOOL getColorBits(const struct wined3d_format_desc *format_desc, case WINED3DFMT_P8_UINT: break; default: - ERR("Unsupported format: %s\n", debug_d3dformat(format_desc->format)); + FIXME("Unsupported format %s.\n", debug_d3dformat(format->id)); return FALSE; } - *redSize = count_bits(format_desc->red_mask); - *greenSize = count_bits(format_desc->green_mask); - *blueSize = count_bits(format_desc->blue_mask); - *alphaSize = count_bits(format_desc->alpha_mask); + *redSize = count_bits(format->red_mask); + *greenSize = count_bits(format->green_mask); + *blueSize = count_bits(format->blue_mask); + *alphaSize = count_bits(format->alpha_mask); *totalSize = *redSize + *greenSize + *blueSize + *alphaSize; - TRACE("Returning red: %d, green: %d, blue: %d, alpha: %d, total: %d for fmt=%s\n", - *redSize, *greenSize, *blueSize, *alphaSize, *totalSize, debug_d3dformat(format_desc->format)); + TRACE("Returning red: %d, green: %d, blue: %d, alpha: %d, total: %d for format %s.\n", + *redSize, *greenSize, *blueSize, *alphaSize, *totalSize, debug_d3dformat(format->id)); return TRUE; } /* Helper function for retrieving depth/stencil info for ChoosePixelFormat and wglChoosePixelFormatARB */ -BOOL getDepthStencilBits(const struct wined3d_format_desc *format_desc, short *depthSize, short *stencilSize) +BOOL getDepthStencilBits(const struct wined3d_format *format, short *depthSize, short *stencilSize) { - TRACE("fmt: %s\n", debug_d3dformat(format_desc->format)); - switch(format_desc->format) + TRACE("format %s.\n", debug_d3dformat(format->id)); + + switch (format->id) { case WINED3DFMT_D16_LOCKABLE: case WINED3DFMT_D16_UNORM: @@ -2470,130 +2547,83 @@ BOOL getDepthStencilBits(const struct wined3d_format_desc *format_desc, short *d case WINED3DFMT_D32_FLOAT: break; default: - FIXME("Unsupported stencil format: %s\n", debug_d3dformat(format_desc->format)); + FIXME("Unsupported depth/stencil format %s.\n", debug_d3dformat(format->id)); return FALSE; } - *depthSize = format_desc->depth_size; - *stencilSize = format_desc->stencil_size; + *depthSize = format->depth_size; + *stencilSize = format->stencil_size; - TRACE("Returning depthSize: %d and stencilSize: %d for fmt=%s\n", - *depthSize, *stencilSize, debug_d3dformat(format_desc->format)); + TRACE("Returning depthSize: %d and stencilSize: %d for format %s.\n", + *depthSize, *stencilSize, debug_d3dformat(format->id)); return TRUE; } -DWORD color_convert_argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) +/* Note: It's the caller's responsibility to ensure values can be expressed + * in the requested format. UNORM formats for example can only express values + * in the range 0.0f -> 1.0f. */ +DWORD wined3d_format_convert_from_float(const struct wined3d_format *format, const WINED3DCOLORVALUE *color) { - unsigned int r, g, b, a; - DWORD ret; - - if (destfmt == WINED3DFMT_B8G8R8A8_UNORM - || destfmt == WINED3DFMT_B8G8R8X8_UNORM - || destfmt == WINED3DFMT_B8G8R8_UNORM) - return color; - - TRACE("Converting color %08x to format %s\n", color, debug_d3dformat(destfmt)); - - a = (color & 0xff000000) >> 24; - r = (color & 0x00ff0000) >> 16; - g = (color & 0x0000ff00) >> 8; - b = (color & 0x000000ff) >> 0; - - switch(destfmt) + static const struct { - case WINED3DFMT_B5G6R5_UNORM: - if(r == 0xff && g == 0xff && b == 0xff) return 0xffff; - r = (r * 32) / 256; - g = (g * 64) / 256; - b = (b * 32) / 256; - ret = r << 11; - ret |= g << 5; - ret |= b; - TRACE("Returning %08x\n", ret); - return ret; - - case WINED3DFMT_B5G5R5X1_UNORM: - case WINED3DFMT_B5G5R5A1_UNORM: - a = (a * 2) / 256; - r = (r * 32) / 256; - g = (g * 32) / 256; - b = (b * 32) / 256; - ret = a << 15; - ret |= r << 10; - ret |= g << 5; - ret |= b << 0; - TRACE("Returning %08x\n", ret); - return ret; - - case WINED3DFMT_A8_UNORM: - TRACE("Returning %08x\n", a); - return a; - - case WINED3DFMT_B4G4R4X4_UNORM: - case WINED3DFMT_B4G4R4A4_UNORM: - a = (a * 16) / 256; - r = (r * 16) / 256; - g = (g * 16) / 256; - b = (b * 16) / 256; - ret = a << 12; - ret |= r << 8; - ret |= g << 4; - ret |= b << 0; - TRACE("Returning %08x\n", ret); - return ret; - - case WINED3DFMT_B2G3R3_UNORM: - r = (r * 8) / 256; - g = (g * 8) / 256; - b = (b * 4) / 256; - ret = r << 5; - ret |= g << 2; - ret |= b << 0; - TRACE("Returning %08x\n", ret); - return ret; - - case WINED3DFMT_R8G8B8X8_UNORM: - case WINED3DFMT_R8G8B8A8_UNORM: - ret = a << 24; - ret |= b << 16; - ret |= g << 8; - ret |= r << 0; - TRACE("Returning %08x\n", ret); - return ret; - - case WINED3DFMT_B10G10R10A2_UNORM: - a = (a * 4) / 256; - r = (r * 1024) / 256; - g = (g * 1024) / 256; - b = (b * 1024) / 256; - ret = a << 30; - ret |= r << 20; - ret |= g << 10; - ret |= b << 0; - TRACE("Returning %08x\n", ret); - return ret; - - case WINED3DFMT_R10G10B10A2_UNORM: - a = (a * 4) / 256; - r = (r * 1024) / 256; - g = (g * 1024) / 256; - b = (b * 1024) / 256; - ret = a << 30; - ret |= b << 20; - ret |= g << 10; - ret |= r << 0; - TRACE("Returning %08x\n", ret); - return ret; - - default: - FIXME("Add a COLORFILL conversion for format %s\n", debug_d3dformat(destfmt)); - return 0; + enum wined3d_format_id format_id; + float r_mul; + float g_mul; + float b_mul; + float a_mul; + BYTE r_shift; + BYTE g_shift; + BYTE b_shift; + BYTE a_shift; } + conv[] = + { + {WINED3DFMT_B8G8R8A8_UNORM, 255.0f, 255.0f, 255.0f, 255.0f, 16, 8, 0, 24}, + {WINED3DFMT_B8G8R8X8_UNORM, 255.0f, 255.0f, 255.0f, 255.0f, 16, 8, 0, 24}, + {WINED3DFMT_B8G8R8_UNORM, 255.0f, 255.0f, 255.0f, 255.0f, 16, 8, 0, 24}, + {WINED3DFMT_B5G6R5_UNORM, 31.0f, 63.0f, 31.0f, 0.0f, 11, 5, 0, 0}, + {WINED3DFMT_B5G5R5A1_UNORM, 31.0f, 31.0f, 31.0f, 1.0f, 10, 5, 0, 15}, + {WINED3DFMT_B5G5R5X1_UNORM, 31.0f, 31.0f, 31.0f, 1.0f, 10, 5, 0, 15}, + {WINED3DFMT_A8_UNORM, 0.0f, 0.0f, 0.0f, 255.0f, 0, 0, 0, 0}, + {WINED3DFMT_B4G4R4A4_UNORM, 15.0f, 15.0f, 15.0f, 15.0f, 8, 4, 0, 12}, + {WINED3DFMT_B4G4R4X4_UNORM, 15.0f, 15.0f, 15.0f, 15.0f, 8, 4, 0, 12}, + {WINED3DFMT_B2G3R3_UNORM, 7.0f, 7.0f, 3.0f, 0.0f, 5, 2, 0, 0}, + {WINED3DFMT_R8G8B8A8_UNORM, 255.0f, 255.0f, 255.0f, 255.0f, 0, 8, 16, 24}, + {WINED3DFMT_R8G8B8X8_UNORM, 255.0f, 255.0f, 255.0f, 255.0f, 0, 8, 16, 24}, + {WINED3DFMT_B10G10R10A2_UNORM, 1023.0f, 1023.0f, 1023.0f, 3.0f, 20, 10, 0, 30}, + {WINED3DFMT_R10G10B10A2_UNORM, 1023.0f, 1023.0f, 1023.0f, 3.0f, 0, 10, 20, 30}, + }; + unsigned int i; + + TRACE("Converting color {%.8e %.8e %.8e %.8e} to format %s.\n", + color->r, color->g, color->b, color->a, debug_d3dformat(format->id)); + + for (i = 0; i < sizeof(conv) / sizeof(*conv); ++i) + { + DWORD ret; + + if (format->id != conv[i].format_id) continue; + + ret = ((DWORD)((color->r * conv[i].r_mul) + 0.5f)) << conv[i].r_shift; + ret |= ((DWORD)((color->g * conv[i].g_mul) + 0.5f)) << conv[i].g_shift; + ret |= ((DWORD)((color->b * conv[i].b_mul) + 0.5f)) << conv[i].b_shift; + ret |= ((DWORD)((color->a * conv[i].a_mul) + 0.5f)) << conv[i].a_shift; + + TRACE("Returning 0x%08x.\n", ret); + + return ret; + } + + FIXME("Conversion for format %s not implemented.\n", debug_d3dformat(format->id)); + + return 0; } /* DirectDraw stuff */ -WINED3DFORMAT pixelformat_for_depth(DWORD depth) { - switch(depth) { +enum wined3d_format_id pixelformat_for_depth(DWORD depth) +{ + switch (depth) + { case 8: return WINED3DFMT_P8_UINT; case 15: return WINED3DFMT_B5G5R5X1_UNORM; case 16: return WINED3DFMT_B5G6R5_UNORM; @@ -2696,13 +2726,15 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting DWORD ttff; DWORD cop, aop, carg0, carg1, carg2, aarg0, aarg1, aarg2; IWineD3DDeviceImpl *device = stateblock->device; + IWineD3DSurfaceImpl *rt = device->render_targets[0]; const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; for (i = 0; i < gl_info->limits.texture_stages; ++i) { IWineD3DBaseTextureImpl *texture; settings->op[i].padding = 0; - if(stateblock->textureState[i][WINED3DTSS_COLOROP] == WINED3DTOP_DISABLE) { + if (stateblock->state.texture_states[i][WINED3DTSS_COLOROP] == WINED3DTOP_DISABLE) + { settings->op[i].cop = WINED3DTOP_DISABLE; settings->op[i].aop = WINED3DTOP_DISABLE; settings->op[i].carg0 = settings->op[i].carg1 = settings->op[i].carg2 = ARG_UNUSED; @@ -2715,13 +2747,17 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting break; } - texture = (IWineD3DBaseTextureImpl *) stateblock->textures[i]; - if(texture) { - settings->op[i].color_fixup = texture->resource.format_desc->color_fixup; - if(ignore_textype) { + if ((texture = stateblock->state.textures[i])) + { + settings->op[i].color_fixup = texture->resource.format->color_fixup; + if (ignore_textype) + { settings->op[i].tex_type = tex_1d; - } else { - switch (IWineD3DBaseTexture_GetTextureDimensions((IWineD3DBaseTexture *)texture)) { + } + else + { + switch (texture->baseTexture.target) + { case GL_TEXTURE_1D: settings->op[i].tex_type = tex_1d; break; @@ -2744,14 +2780,15 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting settings->op[i].tex_type = tex_1d; } - cop = stateblock->textureState[i][WINED3DTSS_COLOROP]; - aop = stateblock->textureState[i][WINED3DTSS_ALPHAOP]; + cop = stateblock->state.texture_states[i][WINED3DTSS_COLOROP]; + aop = stateblock->state.texture_states[i][WINED3DTSS_ALPHAOP]; - carg1 = (args[cop] & ARG1) ? stateblock->textureState[i][WINED3DTSS_COLORARG1] : ARG_UNUSED; - carg2 = (args[cop] & ARG2) ? stateblock->textureState[i][WINED3DTSS_COLORARG2] : ARG_UNUSED; - carg0 = (args[cop] & ARG0) ? stateblock->textureState[i][WINED3DTSS_COLORARG0] : ARG_UNUSED; + carg1 = (args[cop] & ARG1) ? stateblock->state.texture_states[i][WINED3DTSS_COLORARG1] : ARG_UNUSED; + carg2 = (args[cop] & ARG2) ? stateblock->state.texture_states[i][WINED3DTSS_COLORARG2] : ARG_UNUSED; + carg0 = (args[cop] & ARG0) ? stateblock->state.texture_states[i][WINED3DTSS_COLORARG0] : ARG_UNUSED; - if(is_invalid_op(device, i, cop, carg1, carg2, carg0)) { + if (is_invalid_op(&stateblock->state, i, cop, carg1, carg2, carg0)) + { carg0 = ARG_UNUSED; carg2 = ARG_UNUSED; carg1 = WINED3DTA_CURRENT; @@ -2766,22 +2803,24 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting aarg1 = carg1; aarg2 = carg2; aarg0 = carg0; - } else { - aarg1 = (args[aop] & ARG1) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG1] : ARG_UNUSED; - aarg2 = (args[aop] & ARG2) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG2] : ARG_UNUSED; - aarg0 = (args[aop] & ARG0) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG0] : ARG_UNUSED; + } + else + { + aarg1 = (args[aop] & ARG1) ? stateblock->state.texture_states[i][WINED3DTSS_ALPHAARG1] : ARG_UNUSED; + aarg2 = (args[aop] & ARG2) ? stateblock->state.texture_states[i][WINED3DTSS_ALPHAARG2] : ARG_UNUSED; + aarg0 = (args[aop] & ARG0) ? stateblock->state.texture_states[i][WINED3DTSS_ALPHAARG0] : ARG_UNUSED; } - if (i == 0 && stateblock->textures[0] && stateblock->renderState[WINED3DRS_COLORKEYENABLE]) + if (!i && stateblock->state.textures[0] && stateblock->state.render_states[WINED3DRS_COLORKEYENABLE]) { - UINT texture_dimensions = IWineD3DBaseTexture_GetTextureDimensions(stateblock->textures[0]); + IWineD3DBaseTextureImpl *texture = stateblock->state.textures[0]; + GLenum texture_dimensions = texture->baseTexture.target; if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB) { - IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)stateblock->textures[0]; IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[0]; - if (surf->CKeyFlags & WINEDDSD_CKSRCBLT && !surf->resource.format_desc->alpha_mask) + if (surf->CKeyFlags & WINEDDSD_CKSRCBLT && !surf->resource.format->alpha_mask) { if (aop == WINED3DTOP_DISABLE) { @@ -2790,7 +2829,7 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting } else if (aop == WINED3DTOP_SELECTARG1 && aarg1 != WINED3DTA_TEXTURE) { - if (stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) + if (stateblock->state.render_states[WINED3DRS_ALPHABLENDENABLE]) { aarg2 = WINED3DTA_TEXTURE; aop = WINED3DTOP_MODULATE; @@ -2799,7 +2838,7 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting } else if (aop == WINED3DTOP_SELECTARG2 && aarg2 != WINED3DTA_TEXTURE) { - if (stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) + if (stateblock->state.render_states[WINED3DRS_ALPHABLENDENABLE]) { aarg1 = WINED3DTA_TEXTURE; aop = WINED3DTOP_MODULATE; @@ -2810,17 +2849,20 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting } } - if(is_invalid_op(device, i, aop, aarg1, aarg2, aarg0)) { + if (is_invalid_op(&stateblock->state, i, aop, aarg1, aarg2, aarg0)) + { aarg0 = ARG_UNUSED; aarg2 = ARG_UNUSED; aarg1 = WINED3DTA_CURRENT; aop = WINED3DTOP_SELECTARG1; } - if(carg1 == WINED3DTA_TEXTURE || carg2 == WINED3DTA_TEXTURE || carg0 == WINED3DTA_TEXTURE || - aarg1 == WINED3DTA_TEXTURE || aarg2 == WINED3DTA_TEXTURE || aarg0 == WINED3DTA_TEXTURE) { - ttff = stateblock->textureState[i][WINED3DTSS_TEXTURETRANSFORMFLAGS]; - if(ttff == (WINED3DTTFF_PROJECTED | WINED3DTTFF_COUNT3)) { + if (carg1 == WINED3DTA_TEXTURE || carg2 == WINED3DTA_TEXTURE || carg0 == WINED3DTA_TEXTURE + || aarg1 == WINED3DTA_TEXTURE || aarg2 == WINED3DTA_TEXTURE || aarg0 == WINED3DTA_TEXTURE) + { + ttff = stateblock->state.texture_states[i][WINED3DTSS_TEXTURETRANSFORMFLAGS]; + if (ttff == (WINED3DTTFF_PROJECTED | WINED3DTTFF_COUNT3)) + { settings->op[i].projected = proj_count3; } else if(ttff == (WINED3DTTFF_PROJECTED | WINED3DTTFF_COUNT4)) { settings->op[i].projected = proj_count4; @@ -2840,7 +2882,8 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting settings->op[i].aarg1 = aarg1; settings->op[i].aarg2 = aarg2; - if(stateblock->textureState[i][WINED3DTSS_RESULTARG] == WINED3DTA_TEMP) { + if (stateblock->state.texture_states[i][WINED3DTSS_RESULTARG] == WINED3DTA_TEMP) + { settings->op[i].dst = tempreg; } else { settings->op[i].dst = resultreg; @@ -2852,13 +2895,20 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting memset(&settings->op[i], 0xff, sizeof(settings->op[i])); } - if(stateblock->renderState[WINED3DRS_FOGENABLE] == FALSE) { + if (!stateblock->state.render_states[WINED3DRS_FOGENABLE]) + { settings->fog = FOG_OFF; - } else if(stateblock->renderState[WINED3DRS_FOGTABLEMODE] == WINED3DFOG_NONE) { - if(use_vs(stateblock) || ((IWineD3DVertexDeclarationImpl *) stateblock->vertexDecl)->position_transformed) { + } + else if (stateblock->state.render_states[WINED3DRS_FOGTABLEMODE] == WINED3DFOG_NONE) + { + if (use_vs(&stateblock->state) || stateblock->state.vertex_declaration->position_transformed) + { settings->fog = FOG_LINEAR; - } else { - switch(stateblock->renderState[WINED3DRS_FOGVERTEXMODE]) { + } + else + { + switch (stateblock->state.render_states[WINED3DRS_FOGVERTEXMODE]) + { case WINED3DFOG_NONE: case WINED3DFOG_LINEAR: settings->fog = FOG_LINEAR; @@ -2871,8 +2921,11 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting break; } } - } else { - switch(stateblock->renderState[WINED3DRS_FOGTABLEMODE]) { + } + else + { + switch (stateblock->state.render_states[WINED3DRS_FOGTABLEMODE]) + { case WINED3DFOG_LINEAR: settings->fog = FOG_LINEAR; break; @@ -2884,13 +2937,16 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting break; } } - if(stateblock->renderState[WINED3DRS_SRGBWRITEENABLE]) { + if (stateblock->state.render_states[WINED3DRS_SRGBWRITEENABLE] + && rt->resource.format->Flags & WINED3DFMT_FLAG_SRGB_WRITE) + { settings->sRGB_write = 1; } else { settings->sRGB_write = 0; } - if(device->vs_clipping || !use_vs(stateblock) || !stateblock->renderState[WINED3DRS_CLIPPING] || - !stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]) { + if (device->vs_clipping || !use_vs(&stateblock->state) || !stateblock->state.render_states[WINED3DRS_CLIPPING] + || !stateblock->state.render_states[WINED3DRS_CLIPPLANEENABLE]) + { /* No need to emulate clipplanes if GL supports native vertex shader clipping or if * the fixed function vertex pipeline is used(which always supports clipplanes), or * if no clipplane is enabled @@ -2923,13 +2979,12 @@ void add_ffp_frag_shader(struct wine_rb_tree *shaders, struct ffp_frag_desc *des * Requires the caller to activate the correct unit before */ /* GL locking is done by the caller (state handler) */ -void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +void texture_activate_dimensions(IWineD3DBaseTextureImpl *texture, const struct wined3d_gl_info *gl_info) { - const struct wined3d_gl_info *gl_info = context->gl_info; - - if (stateblock->textures[stage]) + if (texture) { - switch (IWineD3DBaseTexture_GetTextureDimensions(stateblock->textures[stage])) { + switch (texture->baseTexture.target) + { case GL_TEXTURE_2D: glDisable(GL_TEXTURE_3D); checkGLcall("glDisable(GL_TEXTURE_3D)"); @@ -3019,10 +3074,10 @@ void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wine * will take care of this business */ if (mapped_stage == WINED3D_UNMAPPED_STAGE || mapped_stage >= context->gl_info->limits.textures) return; - if(sampler >= stateblock->lowest_disabled_stage) return; - if(isStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3DTSS_COLOROP))) return; + if (sampler >= stateblock->state.lowest_disabled_stage) return; + if (isStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3DTSS_COLOROP))) return; - texture_activate_dimensions(sampler, stateblock, context); + texture_activate_dimensions(stateblock->state.textures[sampler], context->gl_info); } void *wined3d_rb_alloc(size_t size) @@ -3106,3 +3161,26 @@ void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected, else if (gl_info->supported[ATI_FRAGMENT_SHADER]) *ps_selected = SHADER_ATI; else *ps_selected = SHADER_NONE; } + +const struct blit_shader *wined3d_select_blitter(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op, + const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, const struct wined3d_format *src_format, + const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, const struct wined3d_format *dst_format) +{ + static const struct blit_shader * const blitters[] = + { + &arbfp_blit, + &ffp_blit, + &cpu_blit, + }; + unsigned int i; + + for (i = 0; i < sizeof(blitters) / sizeof(*blitters); ++i) + { + if (blitters[i]->blit_supported(gl_info, blit_op, + src_rect, src_usage, src_pool, src_format, + dst_rect, dst_usage, dst_pool, dst_format)) + return blitters[i]; + } + + return NULL; +} diff --git a/dll/directx/wine/wined3d/vertexdeclaration.c b/dll/directx/wine/wined3d/vertexdeclaration.c index 0bc141acd8c..59219f034c2 100644 --- a/dll/directx/wine/wined3d/vertexdeclaration.c +++ b/dll/directx/wine/wined3d/vertexdeclaration.c @@ -79,13 +79,11 @@ static ULONG WINAPI IWineD3DVertexDeclarationImpl_Release(IWineD3DVertexDeclarat IWineD3DVertexDeclaration parts follow ******************************************* */ -static HRESULT WINAPI IWineD3DVertexDeclarationImpl_GetParent(IWineD3DVertexDeclaration *iface, IUnknown** parent){ - IWineD3DVertexDeclarationImpl *This = (IWineD3DVertexDeclarationImpl *)iface; +static void * WINAPI IWineD3DVertexDeclarationImpl_GetParent(IWineD3DVertexDeclaration *iface) +{ + TRACE("iface %p.\n", iface); - *parent= This->parent; - IUnknown_AddRef(*parent); - TRACE("(%p) : returning %p\n", This, *parent); - return WINED3D_OK; + return ((IWineD3DVertexDeclarationImpl *)iface)->parent; } static BOOL declaration_element_valid_ffp(const WINED3DVERTEXELEMENT *element) @@ -188,7 +186,7 @@ static const IWineD3DVertexDeclarationVtbl IWineD3DVertexDeclaration_Vtbl = HRESULT vertexdeclaration_init(IWineD3DVertexDeclarationImpl *declaration, IWineD3DDeviceImpl *device, const WINED3DVERTEXELEMENT *elements, UINT element_count, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + void *parent, const struct wined3d_parent_ops *parent_ops) { const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; WORD preloaded = 0; /* MAX_STREAMS, 16 */ @@ -221,7 +219,7 @@ HRESULT vertexdeclaration_init(IWineD3DVertexDeclarationImpl *declaration, IWine { struct wined3d_vertex_declaration_element *e = &declaration->elements[i]; - e->format_desc = getFormatDescEntry(elements[i].format, gl_info); + e->format = wined3d_get_format(gl_info, elements[i].format); e->ffp_valid = declaration_element_valid_ffp(&elements[i]); e->input_slot = elements[i].input_slot; e->offset = elements[i].offset; @@ -236,7 +234,7 @@ HRESULT vertexdeclaration_init(IWineD3DVertexDeclarationImpl *declaration, IWine * to be loaded when drawing, but filter tesselation pseudo streams. */ if (e->input_slot >= MAX_STREAMS) continue; - if (!e->format_desc->gl_vtx_format) + if (!e->format->gl_vtx_format) { FIXME("The application tries to use an unsupported format (%s), returning E_FAIL.\n", debug_d3dformat(elements[i].format)); diff --git a/dll/directx/wine/wined3d/view.c b/dll/directx/wine/wined3d/view.c index 0c9919dd14c..e4e40fc38bb 100644 --- a/dll/directx/wine/wined3d/view.c +++ b/dll/directx/wine/wined3d/view.c @@ -74,14 +74,11 @@ static ULONG STDMETHODCALLTYPE rendertarget_view_Release(IWineD3DRendertargetVie /* IWineD3DBase methods */ -static HRESULT STDMETHODCALLTYPE rendertarget_view_GetParent(IWineD3DRendertargetView *iface, IUnknown **parent) +static void * STDMETHODCALLTYPE rendertarget_view_GetParent(IWineD3DRendertargetView *iface) { - struct wined3d_rendertarget_view *This = (struct wined3d_rendertarget_view *)iface; + TRACE("iface %p.\n", iface); - IUnknown_AddRef(This->parent); - *parent = This->parent; - - return WINED3D_OK; + return ((struct wined3d_rendertarget_view *)iface)->parent; } /* IWineD3DRendertargetView methods */ @@ -110,7 +107,7 @@ static const struct IWineD3DRendertargetViewVtbl wined3d_rendertarget_view_vtbl }; void wined3d_rendertarget_view_init(struct wined3d_rendertarget_view *view, - IWineD3DResource *resource, IUnknown *parent) + IWineD3DResource *resource, void *parent) { view->vtbl = &wined3d_rendertarget_view_vtbl; view->refcount = 1; diff --git a/dll/directx/wine/wined3d/volume.c b/dll/directx/wine/wined3d/volume.c index 42e61e68d22..8d42d547329 100644 --- a/dll/directx/wine/wined3d/volume.c +++ b/dll/directx/wine/wined3d/volume.c @@ -30,7 +30,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface); static void volume_bind_and_dirtify(IWineD3DVolume *iface) { IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface; const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info; - IWineD3DVolumeTexture *texture; DWORD active_sampler; /* We don't need a specific texture unit, but after binding the texture the current unit is dirty. @@ -60,12 +59,7 @@ static void volume_bind_and_dirtify(IWineD3DVolume *iface) { IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_SAMPLER(active_sampler)); } - if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DVolumeTexture, (void **)&texture))) { - IWineD3DVolumeTexture_BindTexture(texture, FALSE); - IWineD3DVolumeTexture_Release(texture); - } else { - ERR("Volume should be part of a volume texture\n"); - } + IWineD3DVolumeTexture_BindTexture((IWineD3DVolumeTexture *)This->container, FALSE); } void volume_add_dirty_box(IWineD3DVolume *iface, const WINED3DBOX *dirty_box) @@ -93,6 +87,13 @@ void volume_add_dirty_box(IWineD3DVolume *iface, const WINED3DBOX *dirty_box) } } +void volume_set_container(IWineD3DVolumeImpl *volume, struct IWineD3DVolumeTextureImpl *container) +{ + TRACE("volume %p, container %p.\n", volume, container); + + volume->container = container; +} + /* ******************************************* IWineD3DVolume IUnknown parts follow ******************************************* */ @@ -122,12 +123,15 @@ static ULONG WINAPI IWineD3DVolumeImpl_AddRef(IWineD3DVolume *iface) { return InterlockedIncrement(&This->resource.ref); } +/* Do not call while under the GL lock. */ static ULONG WINAPI IWineD3DVolumeImpl_Release(IWineD3DVolume *iface) { IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface; ULONG ref; TRACE("(%p) : Releasing from %d\n", This, This->resource.ref); ref = InterlockedDecrement(&This->resource.ref); - if (ref == 0) { + + if (!ref) + { resource_cleanup((IWineD3DResource *)iface); This->resource.parent_ops->wined3d_object_destroyed(This->resource.parent); HeapFree(GetProcessHeap(), 0, This); @@ -138,8 +142,11 @@ static ULONG WINAPI IWineD3DVolumeImpl_Release(IWineD3DVolume *iface) { /* **************************************************** IWineD3DVolume IWineD3DResource parts follow **************************************************** */ -static HRESULT WINAPI IWineD3DVolumeImpl_GetParent(IWineD3DVolume *iface, IUnknown **pParent) { - return resource_get_parent((IWineD3DResource *)iface, pParent); +static void * WINAPI IWineD3DVolumeImpl_GetParent(IWineD3DVolume *iface) +{ + TRACE("iface %p.\n", iface); + + return ((IWineD3DVolumeImpl *)iface)->resource.parent; } static HRESULT WINAPI IWineD3DVolumeImpl_SetPrivateData(IWineD3DVolume *iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) { @@ -162,58 +169,40 @@ static DWORD WINAPI IWineD3DVolumeImpl_GetPriority(IWineD3DVolume *iface) { return resource_get_priority((IWineD3DResource *)iface); } +/* Do not call while under the GL lock. */ static void WINAPI IWineD3DVolumeImpl_PreLoad(IWineD3DVolume *iface) { FIXME("iface %p stub!\n", iface); } -static void WINAPI IWineD3DVolumeImpl_UnLoad(IWineD3DVolume *iface) { - /* The whole content is shadowed on This->resource.allocatedMemory, and the - * texture name is managed by the VolumeTexture container - */ - TRACE("(%p): Nothing to do\n", iface); +/* Do not call while under the GL lock. */ +static void WINAPI IWineD3DVolumeImpl_UnLoad(IWineD3DVolume *iface) +{ + TRACE("iface %p.\n", iface); + + /* The whole content is shadowed on This->resource.allocatedMemory, and + * the texture name is managed by the VolumeTexture container. */ + + resource_unload((IWineD3DResourceImpl *)iface); } static WINED3DRESOURCETYPE WINAPI IWineD3DVolumeImpl_GetType(IWineD3DVolume *iface) { return resource_get_type((IWineD3DResource *)iface); } -/* ******************************************* - IWineD3DVolume parts follow - ******************************************* */ -static HRESULT WINAPI IWineD3DVolumeImpl_GetContainer(IWineD3DVolume *iface, REFIID riid, void** ppContainer) { - IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface; +static void WINAPI IWineD3DVolumeImpl_GetDesc(IWineD3DVolume *iface, WINED3DVOLUME_DESC *desc) +{ + IWineD3DVolumeImpl *volume = (IWineD3DVolumeImpl *)iface; - TRACE("(This %p, riid %s, ppContainer %p)\n", This, debugstr_guid(riid), ppContainer); + TRACE("iface %p, desc %p.\n", iface, desc); - if (!ppContainer) { - ERR("Called without a valid ppContainer.\n"); - return E_FAIL; - } - - /* Although surfaces can be standalone, volumes can't */ - if (!This->container) { - ERR("Volume without an container. Should not happen.\n"); - return E_FAIL; - } - - TRACE("Relaying to QueryInterface\n"); - return IUnknown_QueryInterface(This->container, riid, ppContainer); -} - -static HRESULT WINAPI IWineD3DVolumeImpl_GetDesc(IWineD3DVolume *iface, WINED3DVOLUME_DESC* pDesc) { - IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface; - TRACE("(%p) : copying into %p\n", This, pDesc); - - pDesc->Format = This->resource.format_desc->format; - pDesc->Type = This->resource.resourceType; - pDesc->Usage = This->resource.usage; - pDesc->Pool = This->resource.pool; - pDesc->Size = This->resource.size; /* dx8 only */ - pDesc->Width = This->currentDesc.Width; - pDesc->Height = This->currentDesc.Height; - pDesc->Depth = This->currentDesc.Depth; - - return WINED3D_OK; + desc->Format = volume->resource.format->id; + desc->Type = volume->resource.resourceType; + desc->Usage = volume->resource.usage; + desc->Pool = volume->resource.pool; + desc->Size = volume->resource.size; /* dx8 only */ + desc->Width = volume->currentDesc.Width; + desc->Height = volume->currentDesc.Height; + desc->Depth = volume->currentDesc.Depth; } static HRESULT WINAPI IWineD3DVolumeImpl_LockBox(IWineD3DVolume *iface, WINED3DLOCKED_BOX* pLockedVolume, CONST WINED3DBOX* pBox, DWORD Flags) { @@ -227,8 +216,8 @@ static HRESULT WINAPI IWineD3DVolumeImpl_LockBox(IWineD3DVolume *iface, WINED3DL /* fixme: should we really lock as such? */ TRACE("(%p) : box=%p, output pbox=%p, allMem=%p\n", This, pBox, pLockedVolume, This->resource.allocatedMemory); - pLockedVolume->RowPitch = This->resource.format_desc->byte_count * This->currentDesc.Width; /* Bytes / row */ - pLockedVolume->SlicePitch = This->resource.format_desc->byte_count + pLockedVolume->RowPitch = This->resource.format->byte_count * This->currentDesc.Width; /* Bytes / row */ + pLockedVolume->SlicePitch = This->resource.format->byte_count * This->currentDesc.Width * This->currentDesc.Height; /* Bytes / slice */ if (!pBox) { TRACE("No box supplied - all is ok\n"); @@ -244,7 +233,7 @@ static HRESULT WINAPI IWineD3DVolumeImpl_LockBox(IWineD3DVolume *iface, WINED3DL pLockedVolume->pBits = This->resource.allocatedMemory + (pLockedVolume->SlicePitch * pBox->Front) /* FIXME: is front < back or vica versa? */ + (pLockedVolume->RowPitch * pBox->Top) - + (pBox->Left * This->resource.format_desc->byte_count); + + (pBox->Left * This->resource.format->byte_count); This->lockedBox.Left = pBox->Left; This->lockedBox.Top = pBox->Top; This->lockedBox.Front = pBox->Front; @@ -255,27 +244,12 @@ static HRESULT WINAPI IWineD3DVolumeImpl_LockBox(IWineD3DVolume *iface, WINED3DL if (Flags & (WINED3DLOCK_NO_DIRTY_UPDATE | WINED3DLOCK_READONLY)) { /* Don't dirtify */ - } else { - /** - * Dirtify on lock - * as seen in msdn docs - */ - volume_add_dirty_box(iface, &This->lockedBox); - - /** Dirtify Container if needed */ - if (NULL != This->container) { - - IWineD3DVolumeTexture *cont = (IWineD3DVolumeTexture*) This->container; - WINED3DRESOURCETYPE containerType = IWineD3DBaseTexture_GetType((IWineD3DBaseTexture *) cont); - - if (containerType == WINED3DRTYPE_VOLUMETEXTURE) { - IWineD3DBaseTextureImpl* pTexture = (IWineD3DBaseTextureImpl*) cont; - pTexture->baseTexture.texture_rgb.dirty = TRUE; - pTexture->baseTexture.texture_srgb.dirty = TRUE; - } else { - FIXME("Set dirty on container type %d\n", containerType); - } - } + } + else + { + volume_add_dirty_box(iface, &This->lockedBox); + This->container->baseTexture.texture_rgb.dirty = TRUE; + This->container->baseTexture.texture_srgb.dirty = TRUE; } This->locked = TRUE; @@ -298,53 +272,26 @@ static HRESULT WINAPI IWineD3DVolumeImpl_UnlockBox(IWineD3DVolume *iface) { /* Internal use functions follow : */ -static HRESULT WINAPI IWineD3DVolumeImpl_SetContainer(IWineD3DVolume *iface, IWineD3DBase* container) { - IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface; - - TRACE("This %p, container %p\n", This, container); - - /* We can't keep a reference to the container, since the container already keeps a reference to us. */ - - TRACE("Setting container to %p from %p\n", container, This->container); - This->container = container; - - return WINED3D_OK; -} - /* Context activation is done by the caller. */ static HRESULT WINAPI IWineD3DVolumeImpl_LoadTexture(IWineD3DVolume *iface, int gl_level, BOOL srgb_mode) { IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface; const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info; - const struct wined3d_format_desc *glDesc = This->resource.format_desc; + const struct wined3d_format *format = This->resource.format; - TRACE("(%p) : level %u, format %s (0x%08x)\n", This, gl_level, debug_d3dformat(glDesc->format), glDesc->format); + TRACE("iface %p, level %u, srgb %#x, format %s (%#x).\n", + iface, gl_level, srgb_mode, debug_d3dformat(format->id), format->id); volume_bind_and_dirtify(iface); TRACE("Calling glTexImage3D %x level=%d, intfmt=%x, w=%d, h=%d,d=%d, 0=%d, glFmt=%x, glType=%x, Mem=%p\n", - GL_TEXTURE_3D, - gl_level, - glDesc->glInternal, - This->currentDesc.Width, - This->currentDesc.Height, - This->currentDesc.Depth, - 0, - glDesc->glFormat, - glDesc->glType, - This->resource.allocatedMemory); + GL_TEXTURE_3D, gl_level, format->glInternal, This->currentDesc.Width, This->currentDesc.Height, + This->currentDesc.Depth, 0, format->glFormat, format->glType, This->resource.allocatedMemory); ENTER_GL(); - GL_EXTCALL(glTexImage3DEXT(GL_TEXTURE_3D, - gl_level, - glDesc->glInternal, - This->currentDesc.Width, - This->currentDesc.Height, - This->currentDesc.Depth, - 0, - glDesc->glFormat, - glDesc->glType, - This->resource.allocatedMemory)); + GL_EXTCALL(glTexImage3DEXT(GL_TEXTURE_3D, gl_level, format->glInternal, + This->currentDesc.Width, This->currentDesc.Height, This->currentDesc.Depth, + 0, format->glFormat, format->glType, This->resource.allocatedMemory)); checkGLcall("glTexImage3D"); LEAVE_GL(); @@ -373,21 +320,19 @@ static const IWineD3DVolumeVtbl IWineD3DVolume_Vtbl = IWineD3DVolumeImpl_UnLoad, IWineD3DVolumeImpl_GetType, /* IWineD3DVolume */ - IWineD3DVolumeImpl_GetContainer, IWineD3DVolumeImpl_GetDesc, IWineD3DVolumeImpl_LockBox, IWineD3DVolumeImpl_UnlockBox, /* Internal interface */ IWineD3DVolumeImpl_LoadTexture, - IWineD3DVolumeImpl_SetContainer }; HRESULT volume_init(IWineD3DVolumeImpl *volume, IWineD3DDeviceImpl *device, UINT width, - UINT height, UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + UINT height, UINT depth, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool, + void *parent, const struct wined3d_parent_ops *parent_ops) { const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info); + const struct wined3d_format *format = wined3d_get_format(gl_info, format_id); HRESULT hr; if (!gl_info->supported[EXT_TEXTURE3D]) @@ -399,7 +344,7 @@ HRESULT volume_init(IWineD3DVolumeImpl *volume, IWineD3DDeviceImpl *device, UINT volume->lpVtbl = &IWineD3DVolume_Vtbl; hr = resource_init((IWineD3DResource *)volume, WINED3DRTYPE_VOLUME, device, - width * height * depth * format_desc->byte_count, usage, format_desc, pool, parent, parent_ops); + width * height * depth * format->byte_count, usage, format, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize resource, returning %#x.\n", hr); diff --git a/dll/directx/wine/wined3d/volumetexture.c b/dll/directx/wine/wined3d/volumetexture.c index 9fccb2b8936..a2c0c6d796a 100644 --- a/dll/directx/wine/wined3d/volumetexture.c +++ b/dll/directx/wine/wined3d/volumetexture.c @@ -26,6 +26,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture); +/* Do not call while under the GL lock. */ static void volumetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb) { /* Override the IWineD3DResource Preload method. */ @@ -42,7 +43,7 @@ static void volumetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINE if (!device->isInDraw) context = context_acquire(device, NULL); else if (gl_info->supported[EXT_TEXTURE_SRGB] && This->baseTexture.bindCount > 0) { - srgb_mode = device->stateBlock->samplerState[This->baseTexture.sampler][WINED3DSAMP_SRGBTEXTURE]; + srgb_mode = device->stateBlock->state.sampler_states[This->baseTexture.sampler][WINED3DSAMP_SRGBTEXTURE]; srgb_was_toggled = This->baseTexture.is_srgb != srgb_mode; This->baseTexture.is_srgb = srgb_mode; } @@ -85,13 +86,13 @@ static void volumetexture_cleanup(IWineD3DVolumeTextureImpl *This) for (i = 0; i < This->baseTexture.level_count; ++i) { - IWineD3DVolume *volume = (IWineD3DVolume *)This->baseTexture.sub_resources[i]; + IWineD3DVolumeImpl *volume = (IWineD3DVolumeImpl *)This->baseTexture.sub_resources[i]; if (volume) { /* Cleanup the container. */ - IWineD3DVolume_SetContainer(volume, NULL); - IWineD3DVolume_Release(volume); + volume_set_container(volume, NULL); + IWineD3DVolume_Release((IWineD3DVolume *)volume); } } basetexture_cleanup((IWineD3DBaseTexture *)This); @@ -124,6 +125,7 @@ static ULONG WINAPI IWineD3DVolumeTextureImpl_AddRef(IWineD3DVolumeTexture *ifac return InterlockedIncrement(&This->resource.ref); } +/* Do not call while under the GL lock. */ static ULONG WINAPI IWineD3DVolumeTextureImpl_Release(IWineD3DVolumeTexture *iface) { IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface; ULONG ref; @@ -165,6 +167,7 @@ static void WINAPI IWineD3DVolumeTextureImpl_PreLoad(IWineD3DVolumeTexture *ifac volumetexture_internal_preload((IWineD3DBaseTexture *) iface, SRGB_ANY); } +/* Do not call while under the GL lock. */ static void WINAPI IWineD3DVolumeTextureImpl_UnLoad(IWineD3DVolumeTexture *iface) { unsigned int i; IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface; @@ -186,8 +189,11 @@ static WINED3DRESOURCETYPE WINAPI IWineD3DVolumeTextureImpl_GetType(IWineD3DVolu return resource_get_type((IWineD3DResource *)iface); } -static HRESULT WINAPI IWineD3DVolumeTextureImpl_GetParent(IWineD3DVolumeTexture *iface, IUnknown **pParent) { - return resource_get_parent((IWineD3DResource *)iface, pParent); +static void * WINAPI IWineD3DVolumeTextureImpl_GetParent(IWineD3DVolumeTexture *iface) +{ + TRACE("iface %p\n", iface); + + return ((IWineD3DVolumeTextureImpl *)iface)->resource.parent; } /* ****************************************************** @@ -236,13 +242,6 @@ static HRESULT WINAPI IWineD3DVolumeTextureImpl_BindTexture(IWineD3DVolumeTextur return basetexture_bind((IWineD3DBaseTexture *)iface, srgb, &dummy); } -static UINT WINAPI IWineD3DVolumeTextureImpl_GetTextureDimensions(IWineD3DVolumeTexture *iface) -{ - TRACE("iface %p.\n", iface); - - return GL_TEXTURE_3D; -} - static BOOL WINAPI IWineD3DVolumeTextureImpl_IsCondNP2(IWineD3DVolumeTexture *iface) { TRACE("iface %p.\n", iface); @@ -267,7 +266,9 @@ static HRESULT WINAPI IWineD3DVolumeTextureImpl_GetLevelDesc(IWineD3DVolumeTextu return WINED3DERR_INVALIDCALL; } - return IWineD3DVolume_GetDesc(volume, desc); + IWineD3DVolume_GetDesc(volume, desc); + + return WINED3D_OK; } static HRESULT WINAPI IWineD3DVolumeTextureImpl_GetVolumeLevel(IWineD3DVolumeTexture *iface, @@ -373,7 +374,6 @@ static const IWineD3DVolumeTextureVtbl IWineD3DVolumeTexture_Vtbl = IWineD3DVolumeTextureImpl_GetDirty, /* not in d3d */ IWineD3DVolumeTextureImpl_BindTexture, - IWineD3DVolumeTextureImpl_GetTextureDimensions, IWineD3DVolumeTextureImpl_IsCondNP2, /* volume texture */ IWineD3DVolumeTextureImpl_GetLevelDesc, @@ -384,18 +384,18 @@ static const IWineD3DVolumeTextureVtbl IWineD3DVolumeTexture_Vtbl = }; HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT height, - UINT depth, UINT levels, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, - WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) + UINT depth, UINT levels, IWineD3DDeviceImpl *device, DWORD usage, enum wined3d_format_id format_id, + WINED3DPOOL pool, void *parent, const struct wined3d_parent_ops *parent_ops) { const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info); + const struct wined3d_format *format = wined3d_get_format(gl_info, format_id); UINT tmp_w, tmp_h, tmp_d; unsigned int i; HRESULT hr; /* TODO: It should only be possible to create textures for formats * that are reported as supported. */ - if (WINED3DFMT_UNKNOWN >= format) + if (WINED3DFMT_UNKNOWN >= format_id) { WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); return WINED3DERR_INVALIDCALL; @@ -433,7 +433,7 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT texture->lpVtbl = &IWineD3DVolumeTexture_Vtbl; hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, 1, levels, - WINED3DRTYPE_VOLUMETEXTURE, device, 0, usage, format_desc, pool, parent, parent_ops); + WINED3DRTYPE_VOLUMETEXTURE, device, 0, usage, format, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize basetexture, returning %#x.\n", hr); @@ -445,6 +445,7 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT texture->baseTexture.pow2Matrix[5] = 1.0f; texture->baseTexture.pow2Matrix[10] = 1.0f; texture->baseTexture.pow2Matrix[15] = 1.0f; + texture->baseTexture.target = GL_TEXTURE_3D; /* Generate all the surfaces. */ tmp_w = width; @@ -457,7 +458,7 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT /* Create the volume. */ hr = IWineD3DDeviceParent_CreateVolume(device->device_parent, parent, - tmp_w, tmp_h, tmp_d, format, pool, usage, &volume); + tmp_w, tmp_h, tmp_d, format_id, pool, usage, &volume); if (FAILED(hr)) { ERR("Creating a volume for the volume texture failed, hr %#x.\n", hr); @@ -466,7 +467,7 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT } /* Set its container to this texture. */ - IWineD3DVolume_SetContainer(volume, (IWineD3DBase *)texture); + volume_set_container((IWineD3DVolumeImpl *)volume, texture); texture->baseTexture.sub_resources[i] = (IWineD3DResourceImpl *)volume; /* Calculate the next mipmap level. */ diff --git a/dll/directx/wine/wined3d/wined3d.spec b/dll/directx/wine/wined3d/wined3d.spec index f65ee314dfa..c375b385d49 100644 --- a/dll/directx/wine/wined3d/wined3d.spec +++ b/dll/directx/wine/wined3d/wined3d.spec @@ -1,4 +1,4 @@ @ stdcall WineDirect3DCreate(long ptr) -@ stdcall WineDirect3DCreateClipper(ptr) +@ stdcall WineDirect3DCreateClipper() @ stdcall wined3d_mutex_lock() @ stdcall wined3d_mutex_unlock() diff --git a/dll/directx/wine/wined3d/wined3d_gl.h b/dll/directx/wine/wined3d/wined3d_gl.h index 4ece7e7df9a..9c2c0c1594c 100644 --- a/dll/directx/wine/wined3d/wined3d_gl.h +++ b/dll/directx/wine/wined3d/wined3d_gl.h @@ -1353,6 +1353,7 @@ void (WINE_GLAPI *glVertex4sv)(const GLshort *v) DECLSPEC_HIDDEN; void (WINE_GLAPI *glVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) DECLSPEC_HIDDEN; void (WINE_GLAPI *glViewport)(GLint x, GLint y, GLsizei width, GLsizei height) DECLSPEC_HIDDEN; void (WINE_GLAPI *glPointParameterfv)(GLenum pname, const GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPointParameteri)(GLenum name, GLint value) DECLSPEC_HIDDEN; /* glFinish and glFlush are always loaded from opengl32.dll, thus they always have * __stdcall calling convention. @@ -1708,6 +1709,7 @@ BOOL (WINAPI *pwglShareLists)(HGLRC, HGLRC) DECLSPEC_HIDDEN; USE_GL_FUNC(glVertexPointer) \ USE_GL_FUNC(glViewport) \ USE_GL_FUNC(glPointParameterfv) \ + USE_GL_FUNC(glPointParameteri) \ #define WGL_FUNCS_GEN \ USE_WGL_FUNC(wglCreateContext) \ @@ -1758,6 +1760,7 @@ typedef enum wined3d_gl_extension ARB_SYNC, ARB_TEXTURE_BORDER_CLAMP, ARB_TEXTURE_COMPRESSION, + ARB_TEXTURE_COMPRESSION_RGTC, ARB_TEXTURE_CUBE_MAP, ARB_TEXTURE_ENV_ADD, ARB_TEXTURE_ENV_COMBINE, @@ -1784,6 +1787,7 @@ typedef enum wined3d_gl_extension EXT_BLEND_FUNC_SEPARATE, EXT_BLEND_MINMAX, EXT_DRAW_BUFFERS2, + EXT_DEPTH_BOUNDS_TEST, EXT_FOG_COORD, EXT_FRAMEBUFFER_BLIT, EXT_FRAMEBUFFER_MULTISAMPLE, @@ -1816,6 +1820,7 @@ typedef enum wined3d_gl_extension NV_FRAGMENT_PROGRAM_OPTION, NV_HALF_FLOAT, NV_LIGHT_MAX_EXPONENT, + NV_POINT_SPRITE, NV_REGISTER_COMBINERS, NV_REGISTER_COMBINERS2, NV_TEXGEN_REFLECTION, @@ -1834,7 +1839,8 @@ typedef enum wined3d_gl_extension WGL_ARB_PIXEL_FORMAT, WGL_WINE_PIXEL_FORMAT_PASSTHROUGH, /* Internally used */ - WINE_NORMALIZED_TEXRECT, + WINED3D_GL_NORMALIZED_TEXRECT, + WINED3D_GL_VERSION_2_0, WINED3D_GL_EXT_COUNT, } GL_SupportedExt; @@ -2447,6 +2453,15 @@ typedef GLvoid (WINE_GLAPI *PGLFNGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsiz #define GL_CLAMP_TO_BORDER_ARB 0x812d #endif +/* GL_ARB_texture_compression_rgtc */ +#ifndef GL_ARB_texture_compression_rgtc +#define GL_ARB_texture_compression_rgtc 1 +#define GL_COMPRESSED_RED_RGTC1 0x8dbb +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8dbc +#define GL_COMPRESSED_RED_GREEN_RGTC2 0x8dbd +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2 0x8dbe +#endif + /* GL_ARB_texture_cube_map */ #ifndef GL_ARB_texture_cube_map #define GL_ARB_texture_cube_map 1 @@ -2968,6 +2983,14 @@ typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLe typedef void (WINE_GLAPI *PGLFNBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +/* GL_EXT_depth_bounds_test */ +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +#endif +typedef void (WINE_GLAPI *PGLFNDEPTHBOUNDSEXTPROC)(GLclampd zmin, GLclampd zmax); + /* GL_EXT_draw_buffers2 */ typedef GLvoid (WINE_GLAPI *PGLFNCOLORMASKINDEXEDEXTPROC)(GLuint buffer_idx, GLboolean r, GLboolean g, GLboolean b, GLboolean a); @@ -3479,6 +3502,16 @@ typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS4HVNVPROC)(GLuint index, GLsizei n, #define GL_MAX_SPOT_EXPONENT_NV 0x8505 #endif +/* GL_NV_point_sprite */ +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#define GL_NV_POINT_SPRITE_NV 0x8861 +#define GL_NV_COORD_REPLACE_NV 0x8862 +#define GL_NV_POINT_SPRITE_R_MODE_NV 0x8863 +#endif +typedef void (WINE_GLAPI *PGLFNPOINTPARAMETERIVNVPROC)(GLenum pname, const GLint *params); +typedef void (WINE_GLAPI *PGLFNPOINTPARAMETERINVPROC)(GLenum pname, GLint param); + /* GL_NV_register_combiners */ #ifndef GL_NV_register_combiners #define GL_NV_register_combiners 1 @@ -4197,6 +4230,9 @@ typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelForma /* GL_EXT_blend_func_separate */ \ USE_GL_FUNC(PGLFNBLENDEQUATIONSEPARATEEXTPROC, \ glBlendEquationSeparateEXT, EXT_BLEND_EQUATION_SEPARATE, NULL) \ + /* GL_EXT_depth_bounds_test */ \ + USE_GL_FUNC(PGLFNDEPTHBOUNDSEXTPROC, \ + glDepthBoundsEXT, EXT_DEPTH_BOUNDS_TEST, NULL) \ /* GL_EXT_draw_buffers2 */ \ USE_GL_FUNC(PGLFNCOLORMASKINDEXEDEXTPROC, \ glColorMaskIndexedEXT, EXT_DRAW_BUFFERS2, NULL) \ @@ -4474,6 +4510,11 @@ typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelForma glVertexAttribs3hvNV, NV_HALF_FLOAT, NULL) \ USE_GL_FUNC(PGLFNVERTEXATTRIBS4HVNVPROC, \ glVertexAttribs4hvNV, NV_HALF_FLOAT, NULL) \ + /* GL_NV_point_sprite */ \ + USE_GL_FUNC(PGLFNPOINTPARAMETERIVNVPROC, \ + glPointParameterivNV, NV_POINT_SPRITE, NULL) \ + USE_GL_FUNC(PGLFNPOINTPARAMETERINVPROC, \ + glPointParameteriNV, NV_POINT_SPRITE, NULL) \ /* GL_NV_register_combiners */ \ USE_GL_FUNC(PGLFNCOMBINERINPUTNVPROC, \ glCombinerInputNV, NV_REGISTER_COMBINERS, NULL) \ diff --git a/dll/directx/wine/wined3d/wined3d_main.c b/dll/directx/wine/wined3d/wined3d_main.c index 6330eba44d4..26945efb860 100644 --- a/dll/directx/wine/wined3d/wined3d_main.c +++ b/dll/directx/wine/wined3d/wined3d_main.c @@ -46,8 +46,8 @@ struct wined3d_wndproc_table static struct wined3d_wndproc_table wndproc_table; int num_lock = 0; -void (*CDECL wine_tsx11_lock_ptr)(void) = NULL; -void (*CDECL wine_tsx11_unlock_ptr)(void) = NULL; +void (CDECL *wine_tsx11_lock_ptr)(void) = NULL; +void (CDECL *wine_tsx11_unlock_ptr)(void) = NULL; static CRITICAL_SECTION wined3d_cs; static CRITICAL_SECTION_DEBUG wined3d_cs_debug = @@ -70,13 +70,14 @@ wined3d_settings_t wined3d_settings = RTL_READTEX, /* Default render target locking method */ PCI_VENDOR_NONE,/* PCI Vendor ID */ PCI_DEVICE_NONE,/* PCI Device ID */ - 0, /* The default of memory is set in FillGLCaps */ + 0, /* The default of memory is set in init_driver_info */ NULL, /* No wine logo by default */ FALSE, /* Disable multisampling for now due to Nvidia driver bugs which happens for some users */ FALSE, /* No strict draw ordering. */ }; -IWineD3D * WINAPI WineDirect3DCreate(UINT version, IUnknown *parent) +/* Do not call while under the GL lock. */ +IWineD3D * WINAPI WineDirect3DCreate(UINT version, void *parent) { IWineD3DImpl *object; HRESULT hr; @@ -101,19 +102,19 @@ IWineD3D * WINAPI WineDirect3DCreate(UINT version, IUnknown *parent) return (IWineD3D *)object; } -static inline DWORD get_config_key(HKEY defkey, HKEY appkey, const char* name, char* buffer, DWORD size) +static DWORD get_config_key(HKEY defkey, HKEY appkey, const char *name, char *buffer, DWORD size) { - if (0 != appkey && !RegQueryValueExA( appkey, name, 0, NULL, (LPBYTE) buffer, &size )) return 0; - if (0 != defkey && !RegQueryValueExA( defkey, name, 0, NULL, (LPBYTE) buffer, &size )) return 0; + if (appkey && !RegQueryValueExA(appkey, name, 0, NULL, (BYTE *)buffer, &size)) return 0; + if (defkey && !RegQueryValueExA(defkey, name, 0, NULL, (BYTE *)buffer, &size)) return 0; return ERROR_FILE_NOT_FOUND; } -static inline DWORD get_config_key_dword(HKEY defkey, HKEY appkey, const char* name, DWORD *data) +static DWORD get_config_key_dword(HKEY defkey, HKEY appkey, const char *name, DWORD *data) { DWORD type; DWORD size = sizeof(DWORD); - if (0 != appkey && !RegQueryValueExA( appkey, name, 0, &type, (LPBYTE) data, &size ) && (type == REG_DWORD)) return 0; - if (0 != defkey && !RegQueryValueExA( defkey, name, 0, &type, (LPBYTE) data, &size ) && (type == REG_DWORD)) return 0; + if (appkey && !RegQueryValueExA(appkey, name, 0, &type, (BYTE *)data, &size) && (type == REG_DWORD)) return 0; + if (defkey && !RegQueryValueExA(defkey, name, 0, &type, (BYTE *)data, &size) && (type == REG_DWORD)) return 0; return ERROR_FILE_NOT_FOUND; } @@ -199,7 +200,7 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL) } } - if ( 0 != hkey || 0 != appkey ) + if (hkey || appkey) { if ( !get_config_key( hkey, appkey, "VertexShaderMode", buffer, size) ) { diff --git a/dll/directx/wine/wined3d/wined3d_private.h b/dll/directx/wine/wined3d/wined3d_private.h index 9a5c7c445b3..0b6f57efe52 100644 --- a/dll/directx/wine/wined3d/wined3d_private.h +++ b/dll/directx/wine/wined3d/wined3d_private.h @@ -157,11 +157,11 @@ struct min_lookup GLenum mip[WINED3DTEXF_LINEAR + 1]; }; -const struct min_lookup minMipLookup[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; -const struct min_lookup minMipLookup_noFilter[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; -const struct min_lookup minMipLookup_noMip[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; -const GLenum magLookup[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; -const GLenum magLookup_noFilter[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; +extern const struct min_lookup minMipLookup[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; +extern const struct min_lookup minMipLookup_noFilter[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; +extern const struct min_lookup minMipLookup_noMip[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; +extern const GLenum magLookup[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; +extern const GLenum magLookup_noFilter[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; static inline GLenum wined3d_gl_mag_filter(const GLenum mag_lookup[], WINED3DTEXTUREFILTERTYPE mag_filter) { @@ -192,9 +192,9 @@ static inline float float_16_to_32(const unsigned short *in) { if(e == 0) { if(m == 0) return sgn * 0.0f; /* +0.0 or -0.0 */ - else return sgn * pow(2, -14.0f) * ((float)m / 1024.0f); + else return sgn * powf(2, -14.0f) * ((float)m / 1024.0f); } else if(e < 31) { - return sgn * pow(2, (float)e - 15.0f) * (1.0f + ((float)m / 1024.0f)); + return sgn * powf(2, (float)e - 15.0f) * (1.0f + ((float)m / 1024.0f)); } else { if(m == 0) return sgn / 0.0f; /* +INF / -INF */ else return 0.0f / 0.0f; /* NAN */ @@ -205,16 +205,16 @@ static inline float float_24_to_32(DWORD in) { const float sgn = in & 0x800000 ? -1.0f : 1.0f; const unsigned short e = (in & 0x780000) >> 19; - const unsigned short m = in & 0x7ffff; + const unsigned int m = in & 0x7ffff; if (e == 0) { if (m == 0) return sgn * 0.0f; /* +0.0 or -0.0 */ - else return sgn * pow(2, -6.0f) * ((float)m / 524288.0f); + else return sgn * powf(2, -6.0f) * ((float)m / 524288.0f); } else if (e < 15) { - return sgn * pow(2, (float)e - 7.0f) * (1.0f + ((float)m / 524288.0f)); + return sgn * powf(2, (float)e - 7.0f) * (1.0f + ((float)m / 524288.0f)); } else { @@ -308,12 +308,13 @@ typedef enum _WINED3DSHADER_PARAM_REGISTER_TYPE WINED3DSPR_PREDICATE = 19, WINED3DSPR_IMMCONST, WINED3DSPR_CONSTBUFFER, + WINED3DSPR_NULL, } WINED3DSHADER_PARAM_REGISTER_TYPE; enum wined3d_immconst_type { - WINED3D_IMMCONST_FLOAT, - WINED3D_IMMCONST_FLOAT4, + WINED3D_IMMCONST_SCALAR, + WINED3D_IMMCONST_VEC4, }; #define WINED3DSP_NOSWIZZLE (0 | (1 << 2) | (2 << 4) | (3 << 6)) @@ -404,6 +405,7 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER { WINED3DSIH_ABS, WINED3DSIH_ADD, + WINED3DSIH_AND, WINED3DSIH_BEM, WINED3DSIH_BREAK, WINED3DSIH_BREAKC, @@ -436,6 +438,7 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER WINED3DSIH_IF, WINED3DSIH_IFC, WINED3DSIH_IGE, + WINED3DSIH_IMUL, WINED3DSIH_LABEL, WINED3DSIH_LIT, WINED3DSIH_LOG, @@ -453,6 +456,7 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER WINED3DSIH_MIN, WINED3DSIH_MOV, WINED3DSIH_MOVA, + WINED3DSIH_MOVC, WINED3DSIH_MUL, WINED3DSIH_NOP, WINED3DSIH_NRM, @@ -677,13 +681,18 @@ enum fogmode { /* Stateblock dependent parameters which have to be hardcoded * into the shader code */ + +#define WINED3D_PSARGS_PROJECTED (1 << 3) +#define WINED3D_PSARGS_TEXTRANSFORM_SHIFT 4 +#define WINED3D_PSARGS_TEXTRANSFORM_MASK 0xf + struct ps_compile_args { struct color_fixup_desc color_fixup[MAX_FRAGMENT_SAMPLERS]; enum vertexprocessing_mode vp_mode; enum fogmode fog; - /* Projected textures(ps 1.0-1.3) */ + WORD tex_transform; /* ps 1.0-1.3, 4 textures */ /* Texture types(2D, Cube, 3D) in ps 1.x */ - BOOL srgb_correction; + WORD srgb_correction; WORD np2_fixup; /* Bitmap for NP2 texcoord fixups (16 samplers max currently). D3D9 has a limit of 16 samplers and the fixup is superfluous @@ -728,8 +737,8 @@ extern const shader_backend_t none_shader_backend DECLSPEC_HIDDEN; /* X11 locking */ -extern void (* CDECL wine_tsx11_lock_ptr)(void) DECLSPEC_HIDDEN; -extern void (* CDECL wine_tsx11_unlock_ptr)(void) DECLSPEC_HIDDEN; +extern void (CDECL *wine_tsx11_lock_ptr)(void) DECLSPEC_HIDDEN; +extern void (CDECL *wine_tsx11_unlock_ptr)(void) DECLSPEC_HIDDEN; /* As GLX relies on X, this is needed */ extern int num_lock DECLSPEC_HIDDEN; @@ -806,7 +815,7 @@ do { /* Trace vector and strided data information */ #define TRACE_STRIDED(si, name) do { if (si->use_map & (1 << name)) \ TRACE( #name "=(data:%p, stride:%d, format:%#x, vbo %d, stream %u)\n", \ - si->elements[name].data, si->elements[name].stride, si->elements[name].format_desc->format, \ + si->elements[name].data, si->elements[name].stride, si->elements[name].format->id, \ si->elements[name].buffer_object, si->elements[name].stream_idx); } while(0) /* Advance declaration of structures to satisfy compiler */ @@ -819,40 +828,6 @@ typedef struct IWineD3DSwapChainImpl IWineD3DSwapChainImpl; /* Global variables */ extern const float identity[16] DECLSPEC_HIDDEN; -/***************************************************************************** - * Compilable extra diagnostics - */ - -/* TODO: Confirm each of these works when wined3d move completed */ -#if 0 /* NOTE: Must be 0 in cvs */ - /* To avoid having to get gigabytes of trace, the following can be compiled in, and at the start - of each frame, a check is made for the existence of C:\D3DTRACE, and if it exists d3d trace - is enabled, and if it doesn't exist it is disabled. */ -# define FRAME_DEBUGGING - /* Adding in the SINGLE_FRAME_DEBUGGING gives a trace of just what makes up a single frame, before - the file is deleted */ -# if 1 /* NOTE: Must be 1 in cvs, as this is mostly more useful than a trace from program start */ -# define SINGLE_FRAME_DEBUGGING -# endif - /* The following, when enabled, lets you see the makeup of the frame, by drawprimitive calls. - It can only be enabled when FRAME_DEBUGGING is also enabled - The contents of the back buffer are written into /tmp/backbuffer_* after each primitive - array is drawn. */ -# if 0 /* NOTE: Must be 0 in cvs, as this give a lot of ppm files when compiled in */ -# define SHOW_FRAME_MAKEUP 1 -# endif - /* The following, when enabled, lets you see the makeup of the all the textures used during each - of the drawprimitive calls. It can only be enabled when SHOW_FRAME_MAKEUP is also enabled. - The contents of the textures assigned to each stage are written into - /tmp/texture_*_.ppm after each primitive array is drawn. */ -# if 0 /* NOTE: Must be 0 in cvs, as this give a lot of ppm files when compiled in */ -# define SHOW_TEXTURE_MAKEUP 0 -# endif -extern BOOL isOn; -extern BOOL isDumpingFrames; -extern LONG primCounter; -#endif - enum wined3d_ffp_idx { WINED3D_FFP_POSITION = 0, @@ -896,7 +871,7 @@ enum wined3d_ffp_emit_idx struct wined3d_stream_info_element { - const struct wined3d_format_desc *format_desc; + const struct wined3d_format *format; GLsizei stride; const BYTE *data; UINT stream_idx; @@ -1094,6 +1069,7 @@ struct wined3d_context GLuint fbo_draw_binding; BOOL rebind_fbo; IWineD3DSurfaceImpl **blit_targets; + GLenum *draw_buffers; /* Queries */ GLuint *free_occlusion_queries; @@ -1166,7 +1142,8 @@ enum blit_operation BLIT_OP_COLOR_FILL }; -/* Shaders for color conversions in blits */ +/* Shaders for color conversions in blits. Do not do blit operations while + * already under the GL lock. */ struct blit_shader { HRESULT (*alloc_private)(IWineD3DDevice *iface); @@ -1174,15 +1151,21 @@ struct blit_shader HRESULT (*set_shader)(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface); void (*unset_shader)(IWineD3DDevice *iface); BOOL (*blit_supported)(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op, - const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, const struct wined3d_format_desc *src_format_desc, - const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, const struct wined3d_format_desc *dst_format_desc); - HRESULT (*color_fill)(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color); + const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, const struct wined3d_format *src_format, + const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, const struct wined3d_format *dst_format); + HRESULT (*color_fill)(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, + const RECT *dst_rect, const WINED3DCOLORVALUE *color); }; extern const struct blit_shader ffp_blit DECLSPEC_HIDDEN; extern const struct blit_shader arbfp_blit DECLSPEC_HIDDEN; extern const struct blit_shader cpu_blit DECLSPEC_HIDDEN; +const struct blit_shader *wined3d_select_blitter(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op, + const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, const struct wined3d_format *src_format, + const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, const struct wined3d_format *dst_format) + DECLSPEC_HIDDEN; + /* Temporary blit_shader helper functions */ HRESULT arbfp_blit_surface(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_surface, const RECT *src_rect, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect_in, enum blit_operation blit_op, @@ -1195,22 +1178,24 @@ void context_alloc_occlusion_query(struct wined3d_context *context, struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN; void context_apply_blit_state(struct wined3d_context *context, IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN; void context_apply_clear_state(struct wined3d_context *context, IWineD3DDeviceImpl *device, - IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil) DECLSPEC_HIDDEN; + UINT rt_count, IWineD3DSurfaceImpl **rts, IWineD3DSurfaceImpl *depth_stencil) DECLSPEC_HIDDEN; void context_apply_draw_state(struct wined3d_context *context, IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN; void context_apply_fbo_state_blit(struct wined3d_context *context, GLenum target, - IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil) DECLSPEC_HIDDEN; + IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil, DWORD location) DECLSPEC_HIDDEN; void context_attach_depth_stencil_fbo(struct wined3d_context *context, GLenum fbo_target, IWineD3DSurfaceImpl *depth_stencil, BOOL use_render_buffer) DECLSPEC_HIDDEN; void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fbo) DECLSPEC_HIDDEN; struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3DSurfaceImpl *target, - const struct wined3d_format_desc *ds_format_desc) DECLSPEC_HIDDEN; + const struct wined3d_format *ds_format) DECLSPEC_HIDDEN; void context_destroy(IWineD3DDeviceImpl *This, struct wined3d_context *context) DECLSPEC_HIDDEN; void context_free_event_query(struct wined3d_event_query *query) DECLSPEC_HIDDEN; void context_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN; struct wined3d_context *context_get_current(void) DECLSPEC_HIDDEN; DWORD context_get_tls_idx(void) DECLSPEC_HIDDEN; void context_release(struct wined3d_context *context) DECLSPEC_HIDDEN; -void context_resource_released(IWineD3DDevice *iface, +void context_resource_released(IWineD3DDeviceImpl *device, + IWineD3DResource *resource, WINED3DRESOURCETYPE type) DECLSPEC_HIDDEN; +void context_resource_unloaded(IWineD3DDeviceImpl *device, IWineD3DResource *resource, WINED3DRESOURCETYPE type) DECLSPEC_HIDDEN; BOOL context_set_current(struct wined3d_context *ctx) DECLSPEC_HIDDEN; void context_set_draw_buffer(struct wined3d_context *context, GLenum buffer) DECLSPEC_HIDDEN; @@ -1258,6 +1243,34 @@ typedef struct WineD3D_PixelFormat int numSamples; } WineD3D_PixelFormat; +/* The driver names reflect the lowest GPU supported + * by a certain driver, so DRIVER_ATI_R300 supports + * R3xx, R4xx and R5xx GPUs. */ +enum wined3d_display_driver +{ + DRIVER_ATI_RAGE_128PRO, + DRIVER_ATI_R100, + DRIVER_ATI_R300, + DRIVER_ATI_R600, + DRIVER_INTEL_GMA800, + DRIVER_INTEL_GMA900, + DRIVER_INTEL_GMA950, + DRIVER_INTEL_GMA3000, + DRIVER_NVIDIA_TNT, + DRIVER_NVIDIA_GEFORCE2MX, + DRIVER_NVIDIA_GEFORCEFX, + DRIVER_NVIDIA_GEFORCE6, + DRIVER_UNKNOWN +}; + +enum wined3d_driver_model +{ + DRIVER_MODEL_WIN9X, + DRIVER_MODEL_NT40, + DRIVER_MODEL_NT5X, + DRIVER_MODEL_NT6X +}; + enum wined3d_gl_vendor { GL_VENDOR_UNKNOWN, @@ -1338,15 +1351,24 @@ enum wined3d_pci_device CARD_NVIDIA_GEFORCE_8600GT = 0x0402, CARD_NVIDIA_GEFORCE_8600MGT = 0x0407, CARD_NVIDIA_GEFORCE_8800GTS = 0x0193, + CARD_NVIDIA_GEFORCE_8800GTX = 0x0191, CARD_NVIDIA_GEFORCE_9200 = 0x086d, CARD_NVIDIA_GEFORCE_9400GT = 0x042c, CARD_NVIDIA_GEFORCE_9500GT = 0x0640, CARD_NVIDIA_GEFORCE_9600GT = 0x0622, CARD_NVIDIA_GEFORCE_9800GT = 0x0614, + CARD_NVIDIA_GEFORCE_210 = 0x0a23, + CARD_NVIDIA_GEFORCE_GT220 = 0x0a20, + CARD_NVIDIA_GEFORCE_GT240 = 0x0ca3, CARD_NVIDIA_GEFORCE_GTX260 = 0x05e2, CARD_NVIDIA_GEFORCE_GTX275 = 0x05e6, CARD_NVIDIA_GEFORCE_GTX280 = 0x05e1, - CARD_NVIDIA_GEFORCE_GT240 = 0x0ca3, + CARD_NVIDIA_GEFORCE_GT325M = 0x0a35, + CARD_NVIDIA_GEFORCE_GTS350M = 0x0cb0, + CARD_NVIDIA_GEFORCE_GTX460 = 0x0e22, + CARD_NVIDIA_GEFORCE_GTX465 = 0x06c4, + CARD_NVIDIA_GEFORCE_GTX470 = 0x06cd, + CARD_NVIDIA_GEFORCE_GTX480 = 0x06c0, CARD_INTEL_845G = 0x2562, CARD_INTEL_I830G = 0x3577, @@ -1355,7 +1377,7 @@ enum wined3d_pci_device CARD_INTEL_I915G = 0x2582, CARD_INTEL_I915GM = 0x2592, CARD_INTEL_I945GM = 0x27a2, /* Same as GMA 950? */ - CARD_INTEL_X3100 = 0x2a02, /* Found in Macs. Same as GMA 965? */ + CARD_INTEL_X3100 = 0x2a02, /* Found in Macs. Same as GM965/GL960 */ }; struct wined3d_fbo_ops @@ -1420,7 +1442,6 @@ struct wined3d_gl_limits struct wined3d_gl_info { DWORD glsl_version; - UINT vidmem; struct wined3d_gl_limits limits; DWORD reserved_glsl_constants; DWORD quirks; @@ -1435,7 +1456,7 @@ struct wined3d_gl_info WGL_EXT_FUNCS_GEN #undef USE_GL_FUNC - struct wined3d_format_desc *gl_formats; + struct wined3d_format *formats; }; struct wined3d_driver_info @@ -1444,6 +1465,7 @@ struct wined3d_driver_info enum wined3d_pci_device device; const char *name; const char *description; + unsigned int vidmem; DWORD version_high; DWORD version_low; }; @@ -1559,14 +1581,14 @@ typedef struct IWineD3DImpl LONG ref; /* Note: Ref counting not required */ /* WineD3D Information */ - IUnknown *parent; + void *parent; UINT dxVersion; UINT adapter_count; struct wined3d_adapter adapters[1]; } IWineD3DImpl; -HRESULT wined3d_init(IWineD3DImpl *wined3d, UINT version, IUnknown *parent) DECLSPEC_HIDDEN; +HRESULT wined3d_init(IWineD3DImpl *wined3d, UINT version, void *parent) DECLSPEC_HIDDEN; BOOL wined3d_register_window(HWND window, struct IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN; void wined3d_unregister_window(HWND window) DECLSPEC_HIDDEN; @@ -1585,7 +1607,6 @@ struct IWineD3DDeviceImpl LONG ref; /* Note: Ref counting not required */ /* WineD3D Information */ - IUnknown *parent; IWineD3DDeviceParent *device_parent; IWineD3D *wined3d; struct wined3d_adapter *adapter; @@ -1664,7 +1685,6 @@ struct IWineD3DDeviceImpl UINT currentPalette; /* For rendering to a texture using glCopyTexImage */ - GLenum *draw_buffers; GLuint depth_blt_texture; GLuint depth_blt_rb; UINT depth_blt_rb_w; @@ -1687,7 +1707,7 @@ struct IWineD3DDeviceImpl /* DirectDraw stuff */ DWORD ddraw_width, ddraw_height; - WINED3DFORMAT ddraw_format; + enum wined3d_format_id ddraw_format; /* Final position fixup constant */ float posFixup[4]; @@ -1713,12 +1733,15 @@ struct IWineD3DDeviceImpl struct WineD3DRectPatch *currentPatch; }; +HRESULT device_clear_render_targets(IWineD3DDeviceImpl *device, UINT rt_count, IWineD3DSurfaceImpl **rts, + UINT rect_count, const RECT *rects, const RECT *draw_rect, DWORD flags, + const WINED3DCOLORVALUE *color, float depth, DWORD stencil) DECLSPEC_HIDDEN; BOOL device_context_add(IWineD3DDeviceImpl *device, struct wined3d_context *context) DECLSPEC_HIDDEN; void device_context_remove(IWineD3DDeviceImpl *device, struct wined3d_context *context) DECLSPEC_HIDDEN; void device_get_draw_rect(IWineD3DDeviceImpl *device, RECT *rect) DECLSPEC_HIDDEN; HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d, UINT adapter_idx, WINED3DDEVTYPE device_type, HWND focus_window, DWORD flags, - IUnknown *parent, IWineD3DDeviceParent *device_parent) DECLSPEC_HIDDEN; + IWineD3DDeviceParent *device_parent) DECLSPEC_HIDDEN; void device_preload_textures(IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN; LRESULT device_process_message(IWineD3DDeviceImpl *device, HWND window, UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) DECLSPEC_HIDDEN; @@ -1729,8 +1752,6 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, void device_switch_onscreen_ds(IWineD3DDeviceImpl *device, struct wined3d_context *context, IWineD3DSurfaceImpl *depth_stencil) DECLSPEC_HIDDEN; void device_update_stream_info(IWineD3DDeviceImpl *device, const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; -HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count, - const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil) DECLSPEC_HIDDEN; void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) DECLSPEC_HIDDEN; void IWineD3DDeviceImpl_MarkStateDirty(IWineD3DDeviceImpl *This, DWORD state) DECLSPEC_HIDDEN; @@ -1767,18 +1788,19 @@ typedef struct IWineD3DResourceClass LONG ref; /* Note: Ref counting not required */ /* WineD3DResource Information */ - IUnknown *parent; WINED3DRESOURCETYPE resourceType; IWineD3DDeviceImpl *device; WINED3DPOOL pool; UINT size; DWORD usage; - const struct wined3d_format_desc *format_desc; + const struct wined3d_format *format; DWORD priority; BYTE *allocatedMemory; /* Pointer to the real data location */ BYTE *heapMemory; /* Pointer to the HeapAlloced block of memory */ struct list privateData; struct list resource_list_entry; + + void *parent; const struct wined3d_parent_ops *parent_ops; } IWineD3DResourceClass; @@ -1791,17 +1813,17 @@ typedef struct IWineD3DResourceImpl void resource_cleanup(IWineD3DResource *iface) DECLSPEC_HIDDEN; HRESULT resource_free_private_data(IWineD3DResource *iface, REFGUID guid) DECLSPEC_HIDDEN; -HRESULT resource_get_parent(IWineD3DResource *iface, IUnknown **parent) DECLSPEC_HIDDEN; DWORD resource_get_priority(IWineD3DResource *iface) DECLSPEC_HIDDEN; HRESULT resource_get_private_data(IWineD3DResource *iface, REFGUID guid, void *data, DWORD *data_size) DECLSPEC_HIDDEN; HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type, - IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct wined3d_format_desc *format_desc, - WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; + IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct wined3d_format *format, + WINED3DPOOL pool, void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; WINED3DRESOURCETYPE resource_get_type(IWineD3DResource *iface) DECLSPEC_HIDDEN; DWORD resource_set_priority(IWineD3DResource *iface, DWORD new_priority) DECLSPEC_HIDDEN; HRESULT resource_set_private_data(IWineD3DResource *iface, REFGUID guid, const void *data, DWORD data_size, DWORD flags) DECLSPEC_HIDDEN; +void resource_unload(IWineD3DResourceImpl *resource) DECLSPEC_HIDDEN; /* Tests show that the start address of resources is 32 byte aligned */ #define RESOURCE_ALIGNMENT 16 @@ -1858,15 +1880,10 @@ typedef struct IWineD3DBaseTextureClass BOOL pow2Matrix_identity; const struct min_lookup *minMipLookup; const GLenum *magLookup; + GLenum target; void (*internal_preload)(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb); } IWineD3DBaseTextureClass; -void surface_internal_preload(IWineD3DSurfaceImpl *surface, enum WINED3DSRGB srgb) DECLSPEC_HIDDEN; -BOOL surface_init_sysmem(IWineD3DSurfaceImpl *surface) DECLSPEC_HIDDEN; -BOOL surface_is_offscreen(IWineD3DSurfaceImpl *iface) DECLSPEC_HIDDEN; -void surface_prepare_texture(IWineD3DSurfaceImpl *surface, - const struct wined3d_gl_info *gl_info, BOOL srgb) DECLSPEC_HIDDEN; - typedef struct IWineD3DBaseTextureImpl { /* IUnknown & WineD3DResource Information */ @@ -1891,7 +1908,7 @@ IWineD3DResourceImpl *basetexture_get_sub_resource(IWineD3DBaseTextureImpl *text UINT layer, UINT level) DECLSPEC_HIDDEN; HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT layer_count, UINT level_count, WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage, - const struct wined3d_format_desc *format_desc, WINED3DPOOL pool, IUnknown *parent, + const struct wined3d_format *format, WINED3DPOOL pool, void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface, WINED3DTEXTUREFILTERTYPE filter_type) DECLSPEC_HIDDEN; @@ -1910,14 +1927,13 @@ typedef struct IWineD3DTextureImpl IWineD3DBaseTextureClass baseTexture; /* IWineD3DTexture */ - UINT target; BOOL cond_np2; } IWineD3DTextureImpl; HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT levels, - IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; + IWineD3DDeviceImpl *device, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool, + void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; /***************************************************************************** * IWineD3DCubeTexture implementation structure (extends IWineD3DBaseTextureImpl) @@ -1931,8 +1947,8 @@ typedef struct IWineD3DCubeTextureImpl } IWineD3DCubeTextureImpl; HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UINT levels, - IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; + IWineD3DDeviceImpl *device, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool, + void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; typedef struct _WINED3DVOLUMET_DESC { @@ -1952,7 +1968,7 @@ typedef struct IWineD3DVolumeImpl /* WineD3DVolume Information */ WINED3DVOLUMET_DESC currentDesc; - IWineD3DBase *container; + struct IWineD3DVolumeTextureImpl *container; BOOL lockable; BOOL locked; WINED3DBOX lockedBox; @@ -1962,8 +1978,9 @@ typedef struct IWineD3DVolumeImpl void volume_add_dirty_box(IWineD3DVolume *iface, const WINED3DBOX *dirty_box) DECLSPEC_HIDDEN; HRESULT volume_init(IWineD3DVolumeImpl *volume, IWineD3DDeviceImpl *device, UINT width, - UINT height, UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; + UINT height, UINT depth, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool, + void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; +void volume_set_container(IWineD3DVolumeImpl *volume, struct IWineD3DVolumeTextureImpl *container) DECLSPEC_HIDDEN; /***************************************************************************** * IWineD3DVolumeTexture implementation structure (extends IWineD3DBaseTextureImpl) @@ -1977,8 +1994,8 @@ typedef struct IWineD3DVolumeTextureImpl } IWineD3DVolumeTextureImpl; HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT height, - UINT depth, UINT levels, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, - WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; + UINT depth, UINT levels, IWineD3DDeviceImpl *device, DWORD usage, enum wined3d_format_id format_id, + WINED3DPOOL pool, void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; typedef struct _WINED3DSURFACET_DESC { @@ -2011,6 +2028,7 @@ struct fbo_entry struct list entry; IWineD3DSurfaceImpl **render_targets; IWineD3DSurfaceImpl *depth_stencil; + DWORD location; BOOL attached; GLuint id; }; @@ -2023,10 +2041,26 @@ typedef struct IWineD3DClipperImpl const IWineD3DClipperVtbl *lpVtbl; LONG ref; - IUnknown *Parent; HWND hWnd; } IWineD3DClipperImpl; +enum wined3d_container_type +{ + WINED3D_CONTAINER_NONE = 0, + WINED3D_CONTAINER_SWAPCHAIN, + WINED3D_CONTAINER_TEXTURE, +}; + +struct wined3d_subresource_container +{ + enum wined3d_container_type type; + union + { + struct IWineD3DBase *base; + struct IWineD3DSwapChainImpl *swapchain; + struct IWineD3DBaseTextureImpl *texture; + } u; +}; /***************************************************************************** * IWineD3DSurface implementation structure @@ -2038,7 +2072,7 @@ struct IWineD3DSurfaceImpl IWineD3DResourceClass resource; /* IWineD3DSurface fields */ - IWineD3DBase *container; + struct wined3d_subresource_container container; WINED3DSURFACET_DESC currentDesc; IWineD3DPaletteImpl *palette; /* D3D7 style palette handling */ PALETTEENTRY *palette9; /* D3D8/9 style palette handling */ @@ -2095,20 +2129,37 @@ struct IWineD3DSurfaceImpl extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl DECLSPEC_HIDDEN; extern const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl DECLSPEC_HIDDEN; -UINT surface_calculate_size(const struct wined3d_format_desc *format_desc, - UINT alignment, UINT width, UINT height) DECLSPEC_HIDDEN; +void surface_add_dirty_rect(IWineD3DSurfaceImpl *surface, const RECT *dirty_rect) DECLSPEC_HIDDEN; +HRESULT surface_color_fill(IWineD3DSurfaceImpl *s, const RECT *rect, const WINED3DCOLORVALUE *color) DECLSPEC_HIDDEN; void surface_gdi_cleanup(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN; +GLenum surface_get_gl_buffer(IWineD3DSurfaceImpl *surface) DECLSPEC_HIDDEN; HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, UINT alignment, UINT width, UINT height, UINT level, BOOL lockable, BOOL discard, WINED3DMULTISAMPLE_TYPE multisample_type, - UINT multisample_quality, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, - WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; + UINT multisample_quality, IWineD3DDeviceImpl *device, DWORD usage, enum wined3d_format_id format_id, + WINED3DPOOL pool, void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; +BOOL surface_init_sysmem(IWineD3DSurfaceImpl *surface) DECLSPEC_HIDDEN; +void surface_internal_preload(IWineD3DSurfaceImpl *surface, enum WINED3DSRGB srgb) DECLSPEC_HIDDEN; +BOOL surface_is_offscreen(IWineD3DSurfaceImpl *iface) DECLSPEC_HIDDEN; +void surface_load_ds_location(IWineD3DSurfaceImpl *surface, + struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; +HRESULT surface_load_location(IWineD3DSurfaceImpl *surface, DWORD flag, const RECT *rect) DECLSPEC_HIDDEN; +void surface_modify_ds_location(IWineD3DSurfaceImpl *surface, DWORD location, UINT w, UINT h) DECLSPEC_HIDDEN; +void surface_modify_location(IWineD3DSurfaceImpl *surface, DWORD flag, BOOL persistent) DECLSPEC_HIDDEN; +void surface_prepare_texture(IWineD3DSurfaceImpl *surface, + const struct wined3d_gl_info *gl_info, BOOL srgb) DECLSPEC_HIDDEN; +void surface_set_compatible_renderbuffer(IWineD3DSurfaceImpl *surface, + unsigned int width, unsigned int height) DECLSPEC_HIDDEN; +void surface_set_container(IWineD3DSurfaceImpl *surface, + enum wined3d_container_type type, IWineD3DBase *container) DECLSPEC_HIDDEN; +void surface_set_texture_name(IWineD3DSurfaceImpl *surface, GLuint name, BOOL srgb_name) DECLSPEC_HIDDEN; +void surface_set_texture_target(IWineD3DSurfaceImpl *surface, GLenum target) DECLSPEC_HIDDEN; void surface_translate_frontbuffer_coords(IWineD3DSurfaceImpl *surface, HWND window, RECT *rect) DECLSPEC_HIDDEN; /* Predeclare the shared Surface functions */ HRESULT WINAPI IWineD3DBaseSurfaceImpl_QueryInterface(IWineD3DSurface *iface, REFIID riid, LPVOID *ppobj) DECLSPEC_HIDDEN; ULONG WINAPI IWineD3DBaseSurfaceImpl_AddRef(IWineD3DSurface *iface) DECLSPEC_HIDDEN; -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetParent(IWineD3DSurface *iface, IUnknown **pParent) DECLSPEC_HIDDEN; +void * WINAPI IWineD3DBaseSurfaceImpl_GetParent(IWineD3DSurface *iface) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetPrivateData(IWineD3DSurface *iface, REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetPrivateData(IWineD3DSurface *iface, @@ -2117,9 +2168,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_FreePrivateData(IWineD3DSurface *iface, R DWORD WINAPI IWineD3DBaseSurfaceImpl_SetPriority(IWineD3DSurface *iface, DWORD PriorityNew) DECLSPEC_HIDDEN; DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPriority(IWineD3DSurface *iface) DECLSPEC_HIDDEN; WINED3DRESOURCETYPE WINAPI IWineD3DBaseSurfaceImpl_GetType(IWineD3DSurface *iface) DECLSPEC_HIDDEN; -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetContainer(IWineD3DSurface* iface, - REFIID riid, void **ppContainer) DECLSPEC_HIDDEN; -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetDesc(IWineD3DSurface *iface, WINED3DSURFACE_DESC *pDesc) DECLSPEC_HIDDEN; +void WINAPI IWineD3DBaseSurfaceImpl_GetDesc(IWineD3DSurface *iface, WINED3DSURFACE_DESC *desc) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetBltStatus(IWineD3DSurface *iface, DWORD Flags) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetFlipStatus(IWineD3DSurface *iface, DWORD Flags) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_IsLost(IWineD3DSurface *iface) DECLSPEC_HIDDEN; @@ -2128,9 +2177,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetPalette(IWineD3DSurface *iface, IWineD HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetPalette(IWineD3DSurface *iface, IWineD3DPalette *Pal) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetColorKey(IWineD3DSurface *iface, DWORD Flags, const WINEDDCOLORKEY *CKey) DECLSPEC_HIDDEN; -HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetContainer(IWineD3DSurface *iface, IWineD3DBase *container) DECLSPEC_HIDDEN; DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPitch(IWineD3DSurface *iface) DECLSPEC_HIDDEN; -HRESULT WINAPI IWineD3DBaseSurfaceImpl_RealizePalette(IWineD3DSurface *iface) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetOverlayPosition(IWineD3DSurface *iface, LONG X, LONG Y) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetOverlayPosition(IWineD3DSurface *iface, LONG *X, LONG *Y) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_UpdateOverlayZOrder(IWineD3DSurface *iface, @@ -2139,15 +2186,15 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_UpdateOverlay(IWineD3DSurface *iface, con IWineD3DSurface *DstSurface, const RECT *DstRect, DWORD Flags, const WINEDDOVERLAYFX *FX) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetClipper(IWineD3DSurface *iface, IWineD3DClipper *clipper) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetClipper(IWineD3DSurface *iface, IWineD3DClipper **clipper) DECLSPEC_HIDDEN; -HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORMAT format) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, + enum wined3d_format_id format_id) DECLSPEC_HIDDEN; HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) DECLSPEC_HIDDEN; -HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *DestRect, IWineD3DSurface *SrcSurface, - const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *dst_rect, IWineD3DSurface *src_surface, + const RECT *src_rect, DWORD flags, const WINEDDBLTFX *fx, WINED3DTEXTUREFILTERTYPE filter) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dstx, DWORD dsty, IWineD3DSurface *Source, const RECT *rsrc, DWORD trans) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DLOCKED_RECT *pLockedRect, const RECT *pRect, DWORD Flags) DECLSPEC_HIDDEN; -void WINAPI IWineD3DBaseSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb) DECLSPEC_HIDDEN; const void *WINAPI IWineD3DBaseSurfaceImpl_GetData(IWineD3DSurface *iface) DECLSPEC_HIDDEN; void get_drawable_size_swapchain(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN; @@ -2182,7 +2229,6 @@ void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) DECLSPE #define SFLAG_DS_ONSCREEN 0x00200000 /* Is a depth stencil, last modified onscreen */ #define SFLAG_DS_OFFSCREEN 0x00400000 /* Is a depth stencil, last modified offscreen */ #define SFLAG_INOVERLAYDRAW 0x00800000 /* Overlay drawing is in progress. Recursion prevention */ -#define SFLAG_SWAPCHAIN 0x01000000 /* The surface is part of a swapchain */ /* In some conditions the surface memory must not be freed: * SFLAG_CONVERTED: Converting the data back would take too long @@ -2219,9 +2265,9 @@ typedef enum { CONVERT_RGB32_888 } CONVERT_TYPES; -HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing, - struct wined3d_format_desc *desc, CONVERT_TYPES *convert) DECLSPEC_HIDDEN; -void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4], BOOL colorkey) DECLSPEC_HIDDEN; +HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *surface, BOOL need_alpha_ck, BOOL use_texturing, + struct wined3d_format *format, CONVERT_TYPES *convert) DECLSPEC_HIDDEN; +void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *surface, BYTE table[256][4], BOOL colorkey) DECLSPEC_HIDDEN; BOOL palette9_changed(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN; @@ -2231,7 +2277,7 @@ BOOL palette9_changed(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN; struct wined3d_vertex_declaration_element { - const struct wined3d_format_desc *format_desc; + const struct wined3d_format *format; BOOL ffp_valid; WORD input_slot; WORD offset; @@ -2246,7 +2292,7 @@ typedef struct IWineD3DVertexDeclarationImpl { const IWineD3DVertexDeclarationVtbl *lpVtbl; LONG ref; - IUnknown *parent; + void *parent; const struct wined3d_parent_ops *parent_ops; IWineD3DDeviceImpl *device; @@ -2261,7 +2307,7 @@ typedef struct IWineD3DVertexDeclarationImpl { HRESULT vertexdeclaration_init(IWineD3DVertexDeclarationImpl *declaration, IWineD3DDeviceImpl *device, const WINED3DVERTEXELEMENT *elements, UINT element_count, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; + void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; /***************************************************************************** * IWineD3DStateBlock implementation structure @@ -2301,6 +2347,57 @@ struct StageState { DWORD state; }; +struct wined3d_stream_state +{ + struct wined3d_buffer *buffer; + UINT offset; + UINT stride; + UINT frequency; + UINT flags; +}; + +struct wined3d_state +{ + IWineD3DVertexDeclarationImpl *vertex_declaration; + struct wined3d_stream_state streams[MAX_STREAMS + 1 /* tesselated pseudo-stream */]; + BOOL user_stream; + struct wined3d_buffer *index_buffer; + enum wined3d_format_id index_format; + INT base_vertex_index; + INT load_base_vertex_index; /* Non-indexed drawing needs 0 here, indexed needs base_vertex_index. */ + GLenum gl_primitive_type; + + struct IWineD3DVertexShaderImpl *vertex_shader; + BOOL vs_consts_b[MAX_CONST_B]; + INT vs_consts_i[MAX_CONST_I * 4]; + float *vs_consts_f; + + struct IWineD3DPixelShaderImpl *pixel_shader; + BOOL ps_consts_b[MAX_CONST_B]; + INT ps_consts_i[MAX_CONST_I * 4]; + float *ps_consts_f; + + IWineD3DBaseTextureImpl *textures[MAX_COMBINED_SAMPLERS]; + DWORD sampler_states[MAX_COMBINED_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1]; + DWORD texture_states[MAX_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1]; + DWORD lowest_disabled_stage; + + WINED3DMATRIX transforms[HIGHEST_TRANSFORMSTATE + 1]; + double clip_planes[MAX_CLIPPLANES][4]; + WINED3DCLIPSTATUS clip_status; + WINED3DMATERIAL material; + WINED3DVIEWPORT viewport; + RECT scissor_rect; + + /* Light hashmap . Collisions are handled using standard wine double linked lists */ +#define LIGHTMAP_SIZE 43 /* Use of a prime number recommended. Set to 1 for a linked list! */ +#define LIGHTMAP_HASHFUNC(x) ((x) % LIGHTMAP_SIZE) /* Primitive and simple function */ + struct list light_map[LIGHTMAP_SIZE]; /* Hash map containing the lights */ + const struct wined3d_light_info *lights[MAX_ACTIVE_LIGHTS]; /* Map of opengl lights to d3d lights */ + + DWORD render_states[WINEHIGHEST_RENDER_STATE + 1]; +}; + struct IWineD3DStateBlockImpl { /* IUnknown fields */ @@ -2313,75 +2410,7 @@ struct IWineD3DStateBlockImpl /* Array indicating whether things have been set or changed */ SAVEDSTATES changed; - - /* Vertex Shader Declaration */ - IWineD3DVertexDeclaration *vertexDecl; - - IWineD3DVertexShader *vertexShader; - - /* Vertex Shader Constants */ - BOOL vertexShaderConstantB[MAX_CONST_B]; - INT vertexShaderConstantI[MAX_CONST_I * 4]; - float *vertexShaderConstantF; - - /* primitive type */ - GLenum gl_primitive_type; - - /* Stream Source */ - BOOL streamIsUP; - UINT streamStride[MAX_STREAMS]; - UINT streamOffset[MAX_STREAMS + 1 /* tesselated pseudo-stream */ ]; - IWineD3DBuffer *streamSource[MAX_STREAMS]; - UINT streamFreq[MAX_STREAMS + 1]; - UINT streamFlags[MAX_STREAMS + 1]; /*0 | WINED3DSTREAMSOURCE_INSTANCEDATA | WINED3DSTREAMSOURCE_INDEXEDDATA */ - - /* Indices */ - IWineD3DBuffer* pIndexData; - WINED3DFORMAT IndexFmt; - INT baseVertexIndex; - INT loadBaseVertexIndex; /* non-indexed drawing needs 0 here, indexed baseVertexIndex */ - - /* Transform */ - WINED3DMATRIX transforms[HIGHEST_TRANSFORMSTATE + 1]; - - /* Light hashmap . Collisions are handled using standard wine double linked lists */ -#define LIGHTMAP_SIZE 43 /* Use of a prime number recommended. Set to 1 for a linked list! */ -#define LIGHTMAP_HASHFUNC(x) ((x) % LIGHTMAP_SIZE) /* Primitive and simple function */ - struct list lightMap[LIGHTMAP_SIZE]; /* Hash map containing the lights */ - const struct wined3d_light_info *activeLights[MAX_ACTIVE_LIGHTS]; /* Map of opengl lights to d3d lights */ - - /* Clipping */ - double clipplane[MAX_CLIPPLANES][4]; - WINED3DCLIPSTATUS clip_status; - - /* ViewPort */ - WINED3DVIEWPORT viewport; - - /* Material */ - WINED3DMATERIAL material; - - /* Pixel Shader */ - IWineD3DPixelShader *pixelShader; - - /* Pixel Shader Constants */ - BOOL pixelShaderConstantB[MAX_CONST_B]; - INT pixelShaderConstantI[MAX_CONST_I * 4]; - float *pixelShaderConstantF; - - /* RenderState */ - DWORD renderState[WINEHIGHEST_RENDER_STATE + 1]; - - /* Texture */ - IWineD3DBaseTexture *textures[MAX_COMBINED_SAMPLERS]; - - /* Texture State Stage */ - DWORD textureState[MAX_TEXTURES][WINED3D_HIGHEST_TEXTURE_STATE + 1]; - DWORD lowest_disabled_stage; - /* Sampler States */ - DWORD samplerState[MAX_COMBINED_SAMPLERS][WINED3D_HIGHEST_SAMPLER_STATE + 1]; - - /* Scissor test rectangle */ - RECT scissorRect; + struct wined3d_state state; /* Contained state management */ DWORD contained_render_states[WINEHIGHEST_RENDER_STATE + 1]; @@ -2409,6 +2438,7 @@ struct IWineD3DStateBlockImpl HRESULT stateblock_init(IWineD3DStateBlockImpl *stateblock, IWineD3DDeviceImpl *device, WINED3DSTATEBLOCKTYPE type) DECLSPEC_HIDDEN; void stateblock_init_contained_states(IWineD3DStateBlockImpl *object) DECLSPEC_HIDDEN; +void stateblock_init_default_state(IWineD3DStateBlockImpl *stateblock) DECLSPEC_HIDDEN; static inline void stateblock_apply_state(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) @@ -2435,7 +2465,6 @@ typedef struct IWineD3DQueryImpl const IWineD3DQueryVtbl *lpVtbl; LONG ref; /* Note: Ref counting not required */ - IUnknown *parent; IWineD3DDeviceImpl *device; /* IWineD3DQuery fields */ @@ -2445,8 +2474,7 @@ typedef struct IWineD3DQueryImpl void *extendedData; } IWineD3DQueryImpl; -HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device, - WINED3DQUERYTYPE type, IUnknown *parent) DECLSPEC_HIDDEN; +HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device, WINED3DQUERYTYPE type) DECLSPEC_HIDDEN; /* IWineD3DBuffer */ @@ -2508,8 +2536,8 @@ const BYTE *buffer_get_memory(IWineD3DBuffer *iface, const struct wined3d_gl_inf GLuint *buffer_object) DECLSPEC_HIDDEN; BYTE *buffer_get_sysmem(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device, - UINT size, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, GLenum bind_hint, - const char *data, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; + UINT size, DWORD usage, enum wined3d_format_id format_id, WINED3DPOOL pool, GLenum bind_hint, + const char *data, void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; /* IWineD3DRendertargetView */ struct wined3d_rendertarget_view @@ -2518,11 +2546,11 @@ struct wined3d_rendertarget_view LONG refcount; IWineD3DResource *resource; - IUnknown *parent; + void *parent; }; void wined3d_rendertarget_view_init(struct wined3d_rendertarget_view *view, - IWineD3DResource *resource, IUnknown *parent) DECLSPEC_HIDDEN; + IWineD3DResource *resource, void *parent) DECLSPEC_HIDDEN; /***************************************************************************** * IWineD3DSwapChainImpl implementation structure (extends IUnknown) @@ -2534,7 +2562,7 @@ struct IWineD3DSwapChainImpl const IWineD3DSwapChainVtbl *lpVtbl; LONG ref; /* Note: Ref counting not required */ - IUnknown *parent; + void *parent; IWineD3DDeviceImpl *device; /* IWineD3DSwapChain fields */ @@ -2542,10 +2570,10 @@ struct IWineD3DSwapChainImpl IWineD3DSurfaceImpl *front_buffer; WINED3DPRESENT_PARAMETERS presentParms; DWORD orig_width, orig_height; - WINED3DFORMAT orig_fmt; + enum wined3d_format_id orig_fmt; WINED3DGAMMARAMP orig_gamma; BOOL render_to_fbo; - const struct wined3d_format_desc *ds_format; + const struct wined3d_format *ds_format; LONG prev_time, frames; /* Performance tracking */ unsigned int vSyncCounter; @@ -2557,16 +2585,16 @@ struct IWineD3DSwapChainImpl HWND device_window; }; -const IWineD3DSwapChainVtbl IWineGDISwapChain_Vtbl DECLSPEC_HIDDEN; +extern const IWineD3DSwapChainVtbl IWineGDISwapChain_Vtbl DECLSPEC_HIDDEN; void x11_copy_to_screen(IWineD3DSwapChainImpl *This, const RECT *rc) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSwapChainImpl_QueryInterface(IWineD3DSwapChain *iface, REFIID riid, LPVOID *ppobj) DECLSPEC_HIDDEN; ULONG WINAPI IWineD3DBaseSwapChainImpl_AddRef(IWineD3DSwapChain *iface) DECLSPEC_HIDDEN; ULONG WINAPI IWineD3DBaseSwapChainImpl_Release(IWineD3DSwapChain *iface) DECLSPEC_HIDDEN; -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetParent(IWineD3DSwapChain *iface, IUnknown **ppParent) DECLSPEC_HIDDEN; +void * WINAPI IWineD3DBaseSwapChainImpl_GetParent(IWineD3DSwapChain *iface) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetFrontBufferData(IWineD3DSwapChain *iface, - IWineD3DSurface *pDestSurface) DECLSPEC_HIDDEN; + IWineD3DSurface *dst_surface) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetBackBuffer(IWineD3DSwapChain *iface, UINT iBackBuffer, WINED3DBACKBUFFER_TYPE Type, IWineD3DSurface **ppBackBuffer) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetRasterStatus(IWineD3DSwapChain *iface, @@ -2584,7 +2612,7 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetGammaRamp(IWineD3DSwapChain *iface, struct wined3d_context *swapchain_create_context_for_thread(IWineD3DSwapChain *iface) DECLSPEC_HIDDEN; HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface_type, - IWineD3DDeviceImpl *device, WINED3DPRESENT_PARAMETERS *present_parameters, IUnknown *parent) DECLSPEC_HIDDEN; + IWineD3DDeviceImpl *device, WINED3DPRESENT_PARAMETERS *present_parameters, void *parent) DECLSPEC_HIDDEN; void swapchain_restore_fullscreen_window(IWineD3DSwapChainImpl *swapchain) DECLSPEC_HIDDEN; void swapchain_setup_fullscreen_window(IWineD3DSwapChainImpl *swapchain, UINT w, UINT h) DECLSPEC_HIDDEN; @@ -2595,7 +2623,7 @@ void swapchain_setup_fullscreen_window(IWineD3DSwapChainImpl *swapchain, UINT w, */ /* Trace routines */ -const char *debug_d3dformat(WINED3DFORMAT fmt) DECLSPEC_HIDDEN; +const char *debug_d3dformat(enum wined3d_format_id format_id) DECLSPEC_HIDDEN; const char *debug_d3ddevicetype(WINED3DDEVTYPE devtype) DECLSPEC_HIDDEN; const char *debug_d3dresourcetype(WINED3DRESOURCETYPE res) DECLSPEC_HIDDEN; const char *debug_d3dusage(DWORD usage) DECLSPEC_HIDDEN; @@ -2603,7 +2631,7 @@ const char *debug_d3dusagequery(DWORD usagequery) DECLSPEC_HIDDEN; const char *debug_d3ddeclmethod(WINED3DDECLMETHOD method) DECLSPEC_HIDDEN; const char *debug_d3ddeclusage(BYTE usage) DECLSPEC_HIDDEN; const char *debug_d3dprimitivetype(WINED3DPRIMITIVETYPE PrimitiveType) DECLSPEC_HIDDEN; -const char *debug_d3drenderstate(DWORD state) DECLSPEC_HIDDEN; +const char *debug_d3drenderstate(WINED3DRENDERSTATETYPE state) DECLSPEC_HIDDEN; const char *debug_d3dsamplerstate(DWORD state) DECLSPEC_HIDDEN; const char *debug_d3dstate(DWORD state) DECLSPEC_HIDDEN; const char *debug_d3dtexturefiltertype(WINED3DTEXTUREFILTERTYPE filter_type) DECLSPEC_HIDDEN; @@ -2618,20 +2646,18 @@ const char *debug_d3dtop(WINED3DTEXTUREOP d3dtop) DECLSPEC_HIDDEN; void dump_color_fixup_desc(struct color_fixup_desc fixup) DECLSPEC_HIDDEN; const char *debug_surflocation(DWORD flag) DECLSPEC_HIDDEN; -/* Color conversion routines */ -DWORD color_convert_argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) DECLSPEC_HIDDEN; - /* Routines for GL <-> D3D values */ GLenum StencilOp(DWORD op) DECLSPEC_HIDDEN; GLenum CompareFunc(DWORD func) DECLSPEC_HIDDEN; -BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, WINED3DTEXTUREOP op, - DWORD arg1, DWORD arg2, DWORD arg3) DECLSPEC_HIDDEN; -void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEXTUREOP op, - DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx, DWORD dst) DECLSPEC_HIDDEN; +BOOL is_invalid_op(const struct wined3d_state *state, int stage, + WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3) DECLSPEC_HIDDEN; +void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state, + BOOL is_alpha, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, + INT texture_idx, DWORD dst) DECLSPEC_HIDDEN; void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, - BOOL transformed, WINED3DFORMAT coordtype, BOOL ffp_can_disable_proj) DECLSPEC_HIDDEN; -void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, - struct wined3d_context *context) DECLSPEC_HIDDEN; + BOOL transformed, enum wined3d_format_id coordtype, BOOL ffp_can_disable_proj) DECLSPEC_HIDDEN; +void texture_activate_dimensions(IWineD3DBaseTextureImpl *texture, + const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) DECLSPEC_HIDDEN; void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, @@ -2647,19 +2673,9 @@ void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) DECLSPEC_HIDDEN; -void surface_add_dirty_rect(IWineD3DSurfaceImpl *surface, const RECT *dirty_rect) DECLSPEC_HIDDEN; -GLenum surface_get_gl_buffer(IWineD3DSurfaceImpl *surface) DECLSPEC_HIDDEN; -void surface_load_ds_location(IWineD3DSurfaceImpl *surface, - struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; -void surface_modify_ds_location(IWineD3DSurfaceImpl *surface, DWORD location, UINT w, UINT h) DECLSPEC_HIDDEN; -void surface_set_compatible_renderbuffer(IWineD3DSurfaceImpl *surface, - unsigned int width, unsigned int height) DECLSPEC_HIDDEN; -void surface_set_texture_name(IWineD3DSurfaceImpl *surface, GLuint name, BOOL srgb_name) DECLSPEC_HIDDEN; -void surface_set_texture_target(IWineD3DSurfaceImpl *surface, GLenum target) DECLSPEC_HIDDEN; - -BOOL getColorBits(const struct wined3d_format_desc *format_desc, +BOOL getColorBits(const struct wined3d_format *format, short *redSize, short *greenSize, short *blueSize, short *alphaSize, short *totalSize) DECLSPEC_HIDDEN; -BOOL getDepthStencilBits(const struct wined3d_format_desc *format_desc, +BOOL getDepthStencilBits(const struct wined3d_format *format, short *depthSize, short *stencilSize) DECLSPEC_HIDDEN; /* Math utils */ @@ -2707,7 +2723,7 @@ int shader_addline(struct wined3d_shader_buffer *buffer, const char *fmt, ...) P int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *fmt, va_list args) DECLSPEC_HIDDEN; /* Vertex shader utility functions */ -extern BOOL vshader_get_input(IWineD3DVertexShader *iface, +extern BOOL vshader_get_input(struct IWineD3DVertexShaderImpl *shader, BYTE usage_req, BYTE usage_idx_req, unsigned int *regnum) DECLSPEC_HIDDEN; /***************************************************************************** @@ -2726,7 +2742,7 @@ typedef struct IWineD3DBaseShaderClass void *frontend_data; void *backend_data; - IUnknown *parent; + void *parent; const struct wined3d_parent_ops *parent_ops; /* Programs this shader is linked with */ @@ -2783,7 +2799,7 @@ static inline BOOL shader_is_scalar(const struct wined3d_shader_register *reg) { case WINED3DSPR_RASTOUT: /* oFog & oPts */ - if (reg->idx != 0) return TRUE; + if (reg->idx) return TRUE; /* oPos */ return FALSE; @@ -2805,13 +2821,7 @@ static inline BOOL shader_is_scalar(const struct wined3d_shader_register *reg) } case WINED3DSPR_IMMCONST: - switch(reg->immconst_type) - { - case WINED3D_IMMCONST_FLOAT: - return TRUE; - default: - return FALSE; - } + return reg->immconst_type == WINED3D_IMMCONST_SCALAR; default: return FALSE; @@ -2846,11 +2856,11 @@ typedef struct IWineD3DVertexShaderImpl { UINT rel_offset; } IWineD3DVertexShaderImpl; -void find_vs_compile_args(IWineD3DVertexShaderImpl *shader, IWineD3DStateBlockImpl *stateblock, - struct vs_compile_args *args) DECLSPEC_HIDDEN; +void find_vs_compile_args(const struct wined3d_state *state, + IWineD3DVertexShaderImpl *shader, struct vs_compile_args *args) DECLSPEC_HIDDEN; HRESULT vertexshader_init(IWineD3DVertexShaderImpl *shader, IWineD3DDeviceImpl *device, const DWORD *byte_code, const struct wined3d_shader_signature *output_signature, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; + void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; struct wined3d_geometryshader { @@ -2860,7 +2870,7 @@ struct wined3d_geometryshader HRESULT geometryshader_init(struct wined3d_geometryshader *shader, IWineD3DDeviceImpl *device, const DWORD *byte_code, const struct wined3d_shader_signature *output_signature, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; + void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DPixelShader implementation structure @@ -2905,11 +2915,11 @@ typedef struct IWineD3DPixelShaderImpl { HRESULT pixelshader_init(IWineD3DPixelShaderImpl *shader, IWineD3DDeviceImpl *device, const DWORD *byte_code, const struct wined3d_shader_signature *output_signature, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; + void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; void pixelshader_update_samplers(struct shader_reg_maps *reg_maps, IWineD3DBaseTexture * const *textures) DECLSPEC_HIDDEN; -void find_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWineD3DStateBlockImpl *stateblock, - struct ps_compile_args *args) DECLSPEC_HIDDEN; +void find_ps_compile_args(const struct wined3d_state *state, + IWineD3DPixelShaderImpl *shader, struct ps_compile_args *args) DECLSPEC_HIDDEN; /* sRGB correction constants */ static const float srgb_cmp = 0.0031308f; @@ -2926,7 +2936,7 @@ struct IWineD3DPaletteImpl { const IWineD3DPaletteVtbl *lpVtbl; LONG ref; - IUnknown *parent; + void *parent; IWineD3DDeviceImpl *device; /* IWineD3DPalette */ @@ -2940,10 +2950,10 @@ struct IWineD3DPaletteImpl { }; HRESULT wined3d_palette_init(IWineD3DPaletteImpl *palette, IWineD3DDeviceImpl *device, - DWORD flags, const PALETTEENTRY *entries, IUnknown *parent) DECLSPEC_HIDDEN; + DWORD flags, const PALETTEENTRY *entries, void *parent) DECLSPEC_HIDDEN; /* DirectDraw utility functions */ -extern WINED3DFORMAT pixelformat_for_depth(DWORD depth) DECLSPEC_HIDDEN; +extern enum wined3d_format_id pixelformat_for_depth(DWORD depth) DECLSPEC_HIDDEN; /***************************************************************************** * Pixel format management @@ -2957,7 +2967,7 @@ extern WINED3DFORMAT pixelformat_for_depth(DWORD depth) DECLSPEC_HIDDEN; #define WINED3DFMT_FLAG_RENDERTARGET 0x00000010 #define WINED3DFMT_FLAG_FOURCC 0x00000020 #define WINED3DFMT_FLAG_FBO_ATTACHABLE 0x00000040 -#define WINED3DFMT_FLAG_COMPRESSED 0x00000080 +#define WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB 0x00000080 #define WINED3DFMT_FLAG_GETDC 0x00000100 #define WINED3DFMT_FLAG_FLOAT 0x00000200 #define WINED3DFMT_FLAG_BUMPMAP 0x00000400 @@ -2965,10 +2975,13 @@ extern WINED3DFORMAT pixelformat_for_depth(DWORD depth) DECLSPEC_HIDDEN; #define WINED3DFMT_FLAG_SRGB_WRITE 0x00001000 #define WINED3DFMT_FLAG_VTF 0x00002000 #define WINED3DFMT_FLAG_SHADOW 0x00004000 +#define WINED3DFMT_FLAG_COMPRESSED 0x00008000 +#define WINED3DFMT_FLAG_BROKEN_PITCH 0x00010000 -struct wined3d_format_desc +struct wined3d_format { - WINED3DFORMAT format; + enum wined3d_format_id id; + DWORD red_mask; DWORD green_mask; DWORD blue_mask; @@ -3000,29 +3013,27 @@ struct wined3d_format_desc void (*convert)(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height); }; -const struct wined3d_format_desc *getFormatDescEntry(WINED3DFORMAT fmt, - const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; +const struct wined3d_format *wined3d_get_format(const struct wined3d_gl_info *gl_info, + enum wined3d_format_id format_id) DECLSPEC_HIDDEN; +UINT wined3d_format_calculate_size(const struct wined3d_format *format, + UINT alignment, UINT width, UINT height) DECLSPEC_HIDDEN; +DWORD wined3d_format_convert_from_float(const struct wined3d_format *format, + const WINED3DCOLORVALUE *color) DECLSPEC_HIDDEN; -static inline BOOL use_vs(IWineD3DStateBlockImpl *stateblock) +static inline BOOL use_vs(const struct wined3d_state *state) { /* Check stateblock->vertexDecl to allow this to be used from * IWineD3DDeviceImpl_FindTexUnitMap(). This is safe because * stateblock->vertexShader implies a vertex declaration instead of ddraw * style strided data. */ - return (stateblock->vertexShader - && !((IWineD3DVertexDeclarationImpl *)stateblock->vertexDecl)->position_transformed - && stateblock->device->vs_selected_mode != SHADER_NONE); + return state->vertex_shader && !state->vertex_declaration->position_transformed; } -static inline BOOL use_ps(IWineD3DStateBlockImpl *stateblock) +static inline BOOL use_ps(const struct wined3d_state *state) { - return (stateblock->pixelShader && stateblock->device->ps_selected_mode != SHADER_NONE); + return !!state->pixel_shader; } -void stretch_rect_fbo(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_surface, - const RECT *src_rect, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, - const WINED3DTEXTUREFILTERTYPE filter) DECLSPEC_HIDDEN; - /* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */ #define WINED3D_OPENGL_WINDOW_CLASS_NAME "WineD3D_OpenGL" diff --git a/dll/ntdll/def/ntdll.def b/dll/ntdll/def/ntdll.def index 5bc4f6d0460..f3169354d4e 100644 --- a/dll/ntdll/def/ntdll.def +++ b/dll/ntdll/def/ntdll.def @@ -1,1221 +1,1226 @@ +; File generated automatically from obj-i386\dll\ntdll\def\ntdll_ntdll.spec; do not edit! + LIBRARY ntdll.dll EXPORTS -CsrAllocateCaptureBuffer -CsrAllocateMessagePointer -CsrCaptureMessageBuffer -CsrCaptureMessageMultiUnicodeStringsInPlace -CsrCaptureMessageString -CsrCaptureTimeout -CsrClientCallServer -CsrClientConnectToServer -CsrFreeCaptureBuffer -CsrGetProcessId -CsrIdentifyAlertableThread -CsrNewThread -CsrProbeForRead -CsrProbeForWrite -CsrSetPriorityClass -DbgBreakPoint -DbgPrint -DbgPrintEx -DbgPrintReturnControlC -DbgPrompt -DbgQueryDebugFilterState -DbgSetDebugFilterState -DbgUiConnectToDbg -DbgUiContinue -DbgUiConvertStateChangeStructure -DbgUiDebugActiveProcess -DbgUiGetThreadDebugObject -DbgUiIssueRemoteBreakin -DbgUiRemoteBreakin -DbgUiSetThreadDebugObject -DbgUiStopDebugging -DbgUiWaitStateChange -DbgUserBreakPoint -KiFastSystemCall -KiFastSystemCallRet -KiIntSystemCall -KiRaiseUserExceptionDispatcher -KiUserApcDispatcher -KiUserCallbackDispatcher -KiUserExceptionDispatcher -LdrAccessResource -LdrAddRefDll -LdrDisableThreadCalloutsForDll -LdrEnumResources -LdrFindEntryForAddress -LdrFindResourceDirectory_U -LdrFindResource_U -LdrGetDllHandle -LdrGetProcedureAddress -LdrInitializeThunk -LdrLoadDll -LdrLockLoaderLock -LdrProcessRelocationBlock -LdrQueryImageFileExecutionOptions -LdrQueryProcessModuleInformation -LdrShutdownProcess -LdrShutdownThread -LdrUnloadAlternateResourceModule -LdrUnloadDll -LdrUnlockLoaderLock -LdrVerifyImageMatchesChecksum -NlsAnsiCodePage -NlsMbCodePageTag -NlsMbOemCodePageTag -NtAcceptConnectPort -NtAccessCheck -NtAccessCheckAndAuditAlarm -NtAccessCheckByType -NtAccessCheckByTypeAndAuditAlarm -NtAccessCheckByTypeResultList -NtAccessCheckByTypeResultListAndAuditAlarm -NtAccessCheckByTypeResultListAndAuditAlarmByHandle -NtAddAtom -NtAddBootEntry -NtAddDriverEntry -NtAdjustGroupsToken -NtAdjustPrivilegesToken -NtAlertResumeThread -NtAlertThread -NtAllocateLocallyUniqueId -NtAllocateUserPhysicalPages -NtAllocateUuids -NtAllocateVirtualMemory -NtApphelpCacheControl -NtAreMappedFilesTheSame -NtAssignProcessToJobObject -NtCallbackReturn -NtCancelDeviceWakeupRequest -NtCancelIoFile -NtCancelTimer -NtClearEvent -NtClose -NtCloseObjectAuditAlarm -NtCompactKeys -NtCompareTokens -NtCompleteConnectPort -NtCompressKey -NtConnectPort -NtContinue -NtCreateDebugObject -NtCreateDirectoryObject -NtCreateEvent -NtCreateEventPair -NtCreateFile -NtCreateIoCompletion -NtCreateJobObject -NtCreateJobSet -NtCreateKey -NtCreateKeyedEvent -NtCreateMailslotFile -NtCreateMutant -NtCreateNamedPipeFile -NtCreatePagingFile -NtCreatePort -NtCreateProcess -NtCreateProcessEx -NtCreateProfile -NtCreateSection -NtCreateSemaphore -NtCreateSymbolicLinkObject -NtCreateThread -NtCreateTimer -NtCreateToken -NtCreateWaitablePort -NtCurrentTeb=_NtCurrentTeb -NtDebugActiveProcess -NtDebugContinue -NtDelayExecution -NtDeleteAtom -NtDeleteBootEntry -NtDeleteFile -NtDeleteKey -NtDeleteObjectAuditAlarm -NtDeleteValueKey -NtDeviceIoControlFile -NtDisplayString -NtDuplicateObject -NtDuplicateToken -NtEnumerateBootEntries -NtEnumerateKey -NtEnumerateSystemEnvironmentValuesEx -NtEnumerateValueKey -NtExtendSection -NtFilterToken -NtFindAtom -NtFlushBuffersFile -NtFlushInstructionCache -NtFlushKey -NtFlushVirtualMemory -NtFlushWriteBuffer -NtFreeUserPhysicalPages -NtFreeVirtualMemory -NtFsControlFile -NtGetContextThread -NtGetCurrentProcessorNumber -NtGetDevicePowerState -NtGetPlugPlayEvent -NtGetWriteWatch -NtImpersonateAnonymousToken -NtImpersonateClientOfPort -NtImpersonateThread -NtInitializeRegistry -NtInitiatePowerAction -NtIsProcessInJob -NtIsSystemResumeAutomatic -NtListenPort -NtLoadDriver -NtLoadKey2 -NtLoadKey -NtLockFile -NtLockProductActivationKeys -NtLockRegistryKey -NtLockVirtualMemory -NtMakePermanentObject -NtMakeTemporaryObject -NtMapUserPhysicalPages -NtMapUserPhysicalPagesScatter -NtMapViewOfSection -NtModifyBootEntry -NtNotifyChangeDirectoryFile -NtNotifyChangeKey -NtNotifyChangeMultipleKeys -NtOpenDirectoryObject -NtOpenEvent -NtOpenEventPair -NtOpenFile -NtOpenIoCompletion -NtOpenJobObject -NtOpenKey -NtOpenKeyedEvent -NtOpenMutant -NtOpenObjectAuditAlarm -NtOpenProcess -NtOpenProcessToken -NtOpenProcessTokenEx -NtOpenSection -NtOpenSemaphore -NtOpenSymbolicLinkObject -NtOpenThread -NtOpenThreadToken -NtOpenThreadTokenEx -NtOpenTimer -NtPlugPlayControl -NtPowerInformation -NtPrivilegeCheck -NtPrivilegeObjectAuditAlarm -NtPrivilegedServiceAuditAlarm -NtProtectVirtualMemory -NtPulseEvent -NtQueryAttributesFile -NtQueryBootEntryOrder -NtQueryBootOptions -NtQueryDebugFilterState -NtQueryDefaultLocale -NtQueryDefaultUILanguage -NtQueryDirectoryFile -NtQueryDirectoryObject -NtQueryEaFile -NtQueryEvent -NtQueryFullAttributesFile -NtQueryInformationAtom -NtQueryInformationFile -NtQueryInformationJobObject -NtQueryInformationPort -NtQueryInformationProcess -NtQueryInformationThread -NtQueryInformationToken -NtQueryInstallUILanguage -NtQueryIntervalProfile -NtQueryIoCompletion -NtQueryKey -NtQueryMultipleValueKey -NtQueryMutant -NtQueryObject -NtQueryOpenSubKeys -NtQueryPerformanceCounter -NtQueryPortInformationProcess -NtQueryQuotaInformationFile -NtQuerySection -NtQuerySecurityObject -NtQuerySemaphore -NtQuerySymbolicLinkObject -NtQuerySystemEnvironmentValue -NtQuerySystemEnvironmentValueEx -NtQuerySystemInformation -NtQuerySystemTime -NtQueryTimer -NtQueryTimerResolution -NtQueryValueKey -NtQueryVirtualMemory -NtQueryVolumeInformationFile -NtQueueApcThread -NtRaiseException -NtRaiseHardError -NtReadFile -NtReadFileScatter -NtReadRequestData -NtReadVirtualMemory -NtRegisterThreadTerminatePort -NtReleaseKeyedEvent -NtReleaseMutant -NtReleaseSemaphore -NtRemoveIoCompletion -NtRemoveProcessDebug -NtRenameKey -NtReplaceKey -NtReplyPort -NtReplyWaitReceivePort -NtReplyWaitReceivePortEx -NtReplyWaitReplyPort -NtRequestDeviceWakeup -NtRequestPort -NtRequestWaitReplyPort -NtRequestWakeupLatency -NtResetEvent -NtResetWriteWatch -NtRestoreKey -NtResumeProcess -NtResumeThread -NtSaveKey -NtSaveKeyEx -NtSaveMergedKeys -NtSecureConnectPort -NtSetBootEntryOrder -NtSetBootOptions -NtSetContextThread -NtSetDebugFilterState -NtSetDefaultHardErrorPort -NtSetDefaultLocale -NtSetDefaultUILanguage -NtSetEaFile -NtSetEvent -NtSetEventBoostPriority -NtSetHighEventPair -NtSetHighWaitLowEventPair -NtSetInformationDebugObject -NtSetInformationFile -NtSetInformationJobObject -NtSetInformationKey -NtSetInformationObject -NtSetInformationProcess -NtSetInformationThread -NtSetInformationToken -NtSetIntervalProfile -NtSetIoCompletion -NtSetLdtEntries -NtSetLowEventPair -NtSetLowWaitHighEventPair -NtSetQuotaInformationFile -NtSetSecurityObject -NtSetSystemEnvironmentValue -NtSetSystemEnvironmentValueEx -NtSetSystemInformation -NtSetSystemPowerState -NtSetSystemTime -NtSetThreadExecutionState -NtSetTimer -NtSetTimerResolution -NtSetUuidSeed -NtSetValueKey -NtSetVolumeInformationFile -NtShutdownSystem -NtSignalAndWaitForSingleObject -NtStartProfile -NtStopProfile -NtSuspendProcess -NtSuspendThread -NtSystemDebugControl -NtTerminateJobObject -NtTerminateProcess -NtTerminateThread -NtTestAlert -NtTraceEvent -NtTranslateFilePath -NtUnloadDriver -NtUnloadKey -NtUnloadKeyEx -NtUnlockFile -NtUnlockVirtualMemory -NtUnmapViewOfSection -NtVdmControl -NtWaitForDebugEvent -NtWaitForKeyedEvent -NtWaitForMultipleObjects -NtWaitForSingleObject -NtWaitHighEventPair -NtWaitLowEventPair -NtWriteFile -NtWriteFileGather -NtWriteRequestData -NtWriteVirtualMemory -NtYieldExecution -RtlAbsoluteToSelfRelativeSD -RtlAcquirePebLock -RtlAcquireResourceExclusive -RtlAcquireResourceShared -RtlAcquireSRWLockExclusive -RtlAcquireSRWLockShared -RtlActivateActivationContext -RtlActivateActivationContextUnsafeFast -RtlAddAccessAllowedAce -RtlAddAccessAllowedAceEx -RtlAddAccessAllowedObjectAce -RtlAddAccessDeniedAce -RtlAddAccessDeniedAceEx -RtlAddAccessDeniedObjectAce -RtlAddAce -RtlAddAtomToAtomTable -RtlAddAuditAccessAce -RtlAddAuditAccessAceEx -RtlAddAuditAccessObjectAce -RtlAddMandatoryAce -RtlAddRefActivationContext -RtlAddVectoredExceptionHandler -RtlAdjustPrivilege -RtlAllocateActivationContextStack -RtlAllocateAndInitializeSid -RtlAllocateHandle -RtlAllocateHeap -RtlAnsiCharToUnicodeChar -RtlAnsiStringToUnicodeSize=RtlxAnsiStringToUnicodeSize -RtlAnsiStringToUnicodeString -RtlAppendAsciizToString -RtlAppendStringToString -RtlAppendUnicodeStringToString -RtlAppendUnicodeToString -RtlAreAllAccessesGranted -RtlAreAnyAccessesGranted -RtlAreBitsClear -RtlAreBitsSet -RtlAssert -RtlCaptureContext -RtlCaptureStackBackTrace -RtlCharToInteger -RtlCheckRegistryKey -RtlClearAllBits -RtlClearBits -RtlCompactHeap -RtlCompareMemory -RtlCompareMemoryUlong -RtlCompareString -RtlCompareUnicodeString -RtlCompressBuffer -RtlComputeCrc32 -RtlConvertExclusiveToShared -RtlConvertLongToLargeInteger -RtlConvertSharedToExclusive -RtlConvertSidToUnicodeString -RtlConvertUlongToLargeInteger -RtlCopyLuid -RtlCopyLuidAndAttributesArray -RtlCopySecurityDescriptor -RtlCopySid -RtlCopySidAndAttributesArray -RtlCopyString -RtlCopyUnicodeString -RtlCreateAcl -RtlCreateActivationContext -RtlCreateAtomTable -RtlCreateBootStatusDataFile -RtlCreateEnvironment -RtlCreateHeap -RtlCreateProcessParameters -RtlCreateQueryDebugBuffer -RtlCreateRegistryKey -RtlCreateSecurityDescriptor -RtlCreateSystemVolumeInformationFolder -RtlCreateTagHeap -RtlCreateTimer -RtlCreateTimerQueue -RtlCreateUnicodeString -RtlCreateUnicodeStringFromAsciiz -RtlCreateUserProcess -RtlCreateUserThread -RtlCustomCPToUnicodeN -RtlCutoverTimeToSystemTime -RtlDeNormalizeProcessParams -RtlDeactivateActivationContext -RtlDeactivateActivationContextUnsafeFast -RtlDecodePointer -RtlDecodeSystemPointer=RtlEncodeSystemPointer -RtlDecompressBuffer -RtlDecompressFragment -RtlDelete -RtlDeleteAce -RtlDeleteAtomFromAtomTable -RtlDeleteCriticalSection -RtlDeleteElementGenericTable -RtlDeleteElementGenericTableAvl -RtlDeleteNoSplay -RtlDeleteOwnersRanges -RtlDeleteRange -RtlDeleteRegistryValue -RtlDeleteResource -RtlDeleteSecurityObject -RtlDeleteTimer -RtlDeleteTimerQueue -RtlDeleteTimerQueueEx -RtlDeregisterWait -RtlDeregisterWaitEx -RtlDestroyAtomTable -RtlDestroyEnvironment -RtlDestroyHandleTable -RtlDestroyHeap -RtlDestroyProcessParameters -RtlDestroyQueryDebugBuffer -RtlDetermineDosPathNameType_U -RtlDllShutdownInProgress -RtlDnsHostNameToComputerName -RtlDoesFileExists_U -RtlDosPathNameToNtPathName_U -RtlDosPathNameToRelativeNtPathName_U -RtlDosSearchPath_U -RtlDowncaseUnicodeChar -RtlDowncaseUnicodeString -RtlDumpResource -RtlDuplicateUnicodeString -RtlEmptyAtomTable -RtlEncodePointer -RtlEncodeSystemPointer -RtlEnlargedIntegerMultiply -RtlEnlargedUnsignedDivide -RtlEnlargedUnsignedMultiply -RtlEnterCriticalSection -RtlEnumProcessHeaps -RtlEnumerateGenericTable -RtlEnumerateGenericTableAvl -RtlEnumerateGenericTableLikeADirectory -RtlEnumerateGenericTableWithoutSplaying -RtlEnumerateGenericTableWithoutSplayingAvl -RtlEqualComputerName -RtlEqualDomainName -RtlEqualLuid -RtlEqualPrefixSid -RtlEqualSid -RtlEqualString -RtlEqualUnicodeString -RtlEraseUnicodeString -RtlExitUserThread -RtlExpandEnvironmentStrings_U -RtlExtendHeap -RtlExtendedIntegerMultiply -RtlExtendedLargeIntegerDivide -RtlExtendedMagicDivide -RtlFillMemory -RtlFillMemoryUlong -RtlFindActivationContextSectionString -RtlFindCharInUnicodeString -RtlFindClearBits -RtlFindClearBitsAndSet -RtlFindClearRuns -RtlFindLastBackwardRunClear -RtlFindLeastSignificantBit -RtlFindLongestRunClear -RtlFindLongestRunSet -RtlFindMessage -RtlFindMostSignificantBit -RtlFindNextForwardRunClear -RtlFindRange -RtlFindSetBits -RtlFindSetBitsAndClear -RtlFirstEntrySList -RtlFirstFreeAce -RtlFlushSecureMemoryCache -RtlFormatCurrentUserKeyPath -RtlFormatMessage -RtlFreeAnsiString -RtlFreeHandle -RtlFreeHeap -RtlFreeOemString -RtlFreeRangeList -RtlFreeSid -RtlFreeThreadActivationContextStack -RtlFreeUnicodeString -RtlFreeUserThreadStack -RtlGUIDFromString -RtlGenerate8dot3Name -RtlGetAce -RtlGetActiveActivationContext -RtlGetCallersAddress -RtlGetCompressionWorkSpaceSize -RtlGetControlSecurityDescriptor -RtlGetCurrentDirectory_U -RtlGetCurrentPeb -RtlGetCurrentProcessorNumber -RtlGetDaclSecurityDescriptor -RtlGetElementGenericTable -RtlGetElementGenericTableAvl -RtlGetFirstRange -RtlGetFullPathName_U -RtlGetGroupSecurityDescriptor -RtlGetLastNtStatus -RtlGetLastWin32Error -RtlGetLongestNtPathLength -RtlGetNextRange -RtlGetNtGlobalFlags -RtlGetNtProductType -RtlGetNtVersionNumbers -RtlGetOwnerSecurityDescriptor -RtlGetProcessHeaps -RtlGetSaclSecurityDescriptor -RtlGetSecurityDescriptorRMControl -RtlGetSetBootStatusData -RtlGetUserInfoHeap -RtlGetVersion -RtlHashUnicodeString -RtlIdentifierAuthoritySid -RtlImageDirectoryEntryToData -RtlImageNtHeader -RtlImageRvaToSection -RtlImageRvaToVa -RtlImpersonateSelf -RtlInitAnsiString -RtlInitAnsiStringEx -RtlInitCodePageTable -RtlInitNlsTables -RtlInitString -RtlInitUnicodeString -RtlInitUnicodeStringEx -RtlInitializeBitMap -RtlInitializeContext -RtlInitializeCriticalSection -RtlInitializeCriticalSectionAndSpinCount -RtlInitializeGenericTable -RtlInitializeGenericTableAvl -RtlInitializeHandleTable -RtlInitializeRangeList -RtlInitializeResource -RtlInitializeSListHead -RtlInitializeSid -RtlInitializeSRWLock -RtlInsertElementGenericTable -RtlInsertElementGenericTableAvl -RtlInt64ToUnicodeString -RtlIntegerToChar -RtlIntegerToUnicodeString -RtlInterlockedFlushSList -RtlInterlockedPopEntrySList -RtlInterlockedPushEntrySList -RtlInterlockedPushListSList -RtlInvertRangeList -RtlIpv4AddressToStringA -RtlIpv4AddressToStringExA -RtlIpv4AddressToStringExW -RtlIpv4AddressToStringW -RtlIpv4StringToAddressA -RtlIpv4StringToAddressExA -RtlIpv4StringToAddressExW -RtlIpv4StringToAddressW -RtlIpv6AddressToStringA -RtlIpv6AddressToStringExA -RtlIpv6AddressToStringExW -RtlIpv6AddressToStringW -RtlIpv6StringToAddressA -RtlIpv6StringToAddressExA -RtlIpv6StringToAddressExW -RtlIpv6StringToAddressW -RtlIsActivationContextActive -RtlIsDosDeviceName_U -RtlIsGenericTableEmpty -RtlIsGenericTableEmptyAvl -RtlIsNameLegalDOS8Dot3 -RtlIsRangeAvailable -RtlIsTextUnicode -RtlIsThreadWithinLoaderCallout -RtlIsValidHandle -RtlIsValidIndexHandle -RtlLargeIntegerAdd -RtlLargeIntegerArithmeticShift -RtlLargeIntegerDivide -RtlLargeIntegerNegate -RtlLargeIntegerShiftLeft -RtlLargeIntegerShiftRight -RtlLargeIntegerSubtract -RtlLargeIntegerToChar -RtlLeaveCriticalSection -RtlLengthRequiredSid -RtlLengthSecurityDescriptor -RtlLengthSid -RtlLocalTimeToSystemTime -RtlLockBootStatusData -RtlLockHeap -RtlLookupAtomInAtomTable -RtlLookupElementGenericTable -RtlLookupElementGenericTableAvl -RtlMakeSelfRelativeSD -RtlMapGenericMask -RtlMergeRangeLists -RtlMoveMemory -RtlMultiByteToUnicodeN -RtlMultiByteToUnicodeSize -RtlNewSecurityObject -RtlNormalizeProcessParams -RtlNtPathNameToDosPathName -RtlNtStatusToDosError -RtlNtStatusToDosErrorNoTeb -RtlNumberGenericTableElements -RtlNumberGenericTableElementsAvl -RtlNumberOfClearBits -RtlNumberOfSetBits -RtlOemStringToUnicodeString -RtlOemToUnicodeN -RtlOpenCurrentUser -RtlPcToFileHeader -RtlPinAtomInAtomTable -RtlPrefixString -RtlPrefixUnicodeString -RtlProtectHeap -RtlQueryAtomInAtomTable -RtlQueryDepthSList -RtlQueryEnvironmentVariable_U -RtlQueryHeapInformation -RtlQueryInformationAcl -RtlQueryInformationActivationContext -RtlQueryProcessDebugInformation -RtlQueryRegistryValues -RtlQuerySecurityObject -RtlQueryTagHeap -RtlQueryTimeZoneInformation -RtlQueueWorkItem -RtlRaiseException -RtlRaiseStatus -RtlRandom -RtlRandomEx -RtlReAllocateHeap -RtlRealPredecessor -RtlRealSuccessor -RtlRegisterSecureMemoryCacheCallback -RtlRegisterWait -RtlReleaseActivationContext -RtlReleasePebLock -RtlReleaseResource -RtlReleaseSRWLockExclusive -RtlReleaseSRWLockShared -RtlRemoteCall -RtlRemoveVectoredExceptionHandler -RtlResetRtlTranslations -RtlRestoreLastWin32Error=RtlSetLastWin32Error -RtlRunDecodeUnicodeString -RtlRunEncodeUnicodeString -RtlSecondsSince1970ToTime -RtlSecondsSince1980ToTime -RtlSelfRelativeToAbsoluteSD2 -RtlSelfRelativeToAbsoluteSD -RtlSetAllBits -RtlSetAttributesSecurityDescriptor -RtlSetBits -RtlSetControlSecurityDescriptor -RtlSetCriticalSectionSpinCount -RtlSetCurrentDirectory_U -RtlSetCurrentEnvironment -RtlSetDaclSecurityDescriptor -RtlSetEnvironmentVariable -RtlSetGroupSecurityDescriptor -RtlSetHeapInformation -RtlSetInformationAcl -RtlSetIoCompletionCallback -RtlSetLastWin32Error -RtlSetLastWin32ErrorAndNtStatusFromNtStatus -RtlSetOwnerSecurityDescriptor -RtlSetProcessIsCritical -RtlSetSaclSecurityDescriptor -RtlSetSecurityDescriptorRMControl -RtlSetSecurityObject -RtlSetTimeZoneInformation -RtlSetUnhandledExceptionFilter -RtlSetUserFlagsHeap -RtlSetUserValueHeap -RtlSizeHeap -RtlSleepConditionVariableCS -RtlSleepConditionVariableSRW -RtlSplay -RtlStringFromGUID -RtlSubAuthorityCountSid -RtlSubAuthoritySid -RtlSubtreePredecessor -RtlSubtreeSuccessor -RtlSystemTimeToLocalTime -RtlTimeFieldsToTime -RtlTimeToElapsedTimeFields -RtlTimeToSecondsSince1970 -RtlTimeToSecondsSince1980 -RtlTimeToTimeFields -RtlTryEnterCriticalSection -RtlUlongByteSwap -RtlUlonglongByteSwap -RtlUnhandledExceptionFilter -RtlUnicodeStringToAnsiString -RtlUnicodeStringToCountedOemString -RtlUnicodeStringToInteger -RtlUnicodeStringToOemString -RtlUnicodeToCustomCPN -RtlUnicodeToMultiByteN -RtlUnicodeToMultiByteSize -RtlUnicodeToOemN -RtlUniform -RtlUnlockBootStatusData -RtlUnlockHeap -RtlUnwind -RtlUpcaseUnicodeChar -RtlUpcaseUnicodeString -RtlUpcaseUnicodeStringToAnsiString -RtlUpcaseUnicodeStringToCountedOemString -RtlUpcaseUnicodeStringToOemString -RtlUpcaseUnicodeToCustomCPN -RtlUpcaseUnicodeToMultiByteN -RtlUpcaseUnicodeToOemN -RtlUpdateTimer -RtlUpperChar -RtlUpperString -RtlUsageHeap -RtlUshortByteSwap -RtlValidAcl -RtlValidRelativeSecurityDescriptor -RtlValidSecurityDescriptor -RtlValidSid -RtlValidateHeap -RtlValidateProcessHeaps -RtlValidateUnicodeString -RtlVerifyVersionInfo -RtlWalkFrameChain -RtlWalkHeap -RtlWakeAllConditionVariable -RtlWakeConditionVariable -RtlWriteRegistryValue -RtlZeroHeap -RtlZeroMemory -RtlZombifyActivationContext -RtlpEnsureBufferSize -RtlpNtCreateKey -RtlpNtEnumerateSubKey -RtlpNtMakeTemporaryKey -RtlpNtOpenKey -RtlpNtQueryValueKey -RtlpNtSetValueKey -RtlpUnWaitCriticalSection -RtlpWaitForCriticalSection -RtlxAnsiStringToUnicodeSize -RtlxOemStringToUnicodeSize -RtlxUnicodeStringToAnsiSize -RtlxUnicodeStringToOemSize -VerSetConditionMask -ZwAcceptConnectPort=NtAcceptConnectPort -ZwAccessCheck=NtAccessCheck -ZwAccessCheckAndAuditAlarm=NtAccessCheckAndAuditAlarm -ZwAccessCheckByType=NtAccessCheckByType -ZwAccessCheckByTypeAndAuditAlarm=NtAccessCheckByTypeAndAuditAlarm -ZwAccessCheckByTypeResultList=NtAccessCheckByTypeResultList -ZwAccessCheckByTypeResultListAndAuditAlarm=NtAccessCheckByTypeResultListAndAuditAlarm -ZwAccessCheckByTypeResultListAndAuditAlarmByHandle=NtAccessCheckByTypeResultListAndAuditAlarmByHandle -ZwAddAtom=NtAddAtom -ZwAddBootEntry -ZwAdjustGroupsToken=NtAdjustGroupsToken -ZwAdjustPrivilegesToken=NtAdjustPrivilegesToken -ZwAlertResumeThread=NtAlertResumeThread -ZwAlertThread=NtAlertThread -ZwAllocateLocallyUniqueId=NtAllocateLocallyUniqueId -ZwAllocateUserPhysicalPages -ZwAllocateUuids=NtAllocateUuids -ZwAllocateVirtualMemory=NtAllocateVirtualMemory -ZwAreMappedFilesTheSame=NtAreMappedFilesTheSame -ZwAssignProcessToJobObject=NtAssignProcessToJobObject -ZwCallbackReturn -ZwCancelDeviceWakeupRequest -ZwCancelIoFile=NtCancelIoFile -ZwCancelTimer=NtCancelTimer -ZwClearEvent=NtClearEvent -ZwClose=NtClose -ZwCloseObjectAuditAlarm -ZwCompactKeys=NtCompactKeys -ZwCompareTokens=NtCompareTokens -ZwCompleteConnectPort=NtCompleteConnectPort -ZwCompressKey=NtCompressKey -ZwConnectPort=NtConnectPort -ZwContinue=NtContinue -ZwCreateDebugObject=NtCreateDebugObject -ZwCreateDirectoryObject=NtCreateDirectoryObject -ZwCreateEvent=NtCreateEvent -ZwCreateEventPair=NtCreateEventPair -ZwCreateFile=NtCreateFile -ZwCreateIoCompletion=NtCreateIoCompletion -ZwCreateJobObject=NtCreateJobObject -ZwCreateJobSet=NtCreateJobSet -ZwCreateKey=NtCreateKey -ZwCreateKeyedEvent=NtCreateKeyedEvent -ZwCreateMailslotFile=NtCreateMailslotFile -ZwCreateMutant=NtCreateMutant -ZwCreateNamedPipeFile=NtCreateNamedPipeFile -ZwCreatePagingFile=NtCreatePagingFile -ZwCreatePort=NtCreatePort -ZwCreateProcess -ZwCreateProcessEx=NtCreateProcessEx -ZwCreateProfile=NtCreateProfile -ZwCreateSection=NtCreateSection -ZwCreateSemaphore=NtCreateSemaphore -ZwCreateSymbolicLinkObject=NtCreateSymbolicLinkObject -ZwCreateThread -ZwCreateTimer=NtCreateTimer -ZwCreateToken -ZwCreateWaitablePort=NtCreateWaitablePort -ZwDebugActiveProcess=NtDebugActiveProcess -ZwDebugContinue=NtDebugContinue -ZwDelayExecution=NtDelayExecution -ZwDeleteAtom=NtDeleteAtom -ZwDeleteBootEntry=NtDeleteBootEntry -ZwDeleteFile=NtDeleteFile -ZwDeleteKey=NtDeleteKey -ZwDeleteObjectAuditAlarm -ZwDeleteValueKey=NtDeleteValueKey -ZwDeviceIoControlFile=NtDeviceIoControlFile -ZwDisplayString=NtDisplayString -ZwDuplicateObject=NtDuplicateObject -ZwDuplicateToken=NtDuplicateToken -ZwEnumerateBootEntries -ZwEnumerateKey=NtEnumerateKey -ZwEnumerateSystemEnvironmentValuesEx=NtEnumerateSystemEnvironmentValuesEx -ZwEnumerateValueKey=NtEnumerateValueKey -ZwExtendSection=NtExtendSection -ZwFilterToken=NtFilterToken -ZwFindAtom=NtFindAtom -ZwFlushBuffersFile=NtFlushBuffersFile -ZwFlushInstructionCache=NtFlushInstructionCache -ZwFlushKey=NtFlushKey -ZwFlushVirtualMemory=NtFlushVirtualMemory -ZwFlushWriteBuffer -ZwFreeUserPhysicalPages -ZwFreeVirtualMemory=NtFreeVirtualMemory -ZwFsControlFile=NtFsControlFile -ZwGetContextThread=NtGetContextThread -ZwGetCurrentProcessorNumber -ZwGetDevicePowerState -ZwGetPlugPlayEvent -ZwGetWriteWatch=NtGetWriteWatch -ZwImpersonateAnonymousToken -ZwImpersonateClientOfPort=NtImpersonateClientOfPort -ZwImpersonateThread=NtImpersonateThread -ZwInitializeRegistry -ZwInitiatePowerAction=NtInitiatePowerAction -ZwIsProcessInJob=NtIsProcessInJob -ZwIsSystemResumeAutomatic -ZwListenPort=NtListenPort -ZwLoadDriver=NtLoadDriver -ZwLoadKey2=NtLoadKey2 -ZwLoadKey=NtLoadKey -ZwLockFile=NtLockFile -ZwLockProductActivationKeys=NtLockProductActivationKeys -ZwLockRegistryKey=NtLockRegistryKey -ZwLockVirtualMemory=NtLockVirtualMemory -ZwMakePermanentObject=NtMakePermanentObject -ZwMakeTemporaryObject=NtMakeTemporaryObject -ZwMapUserPhysicalPages -ZwMapUserPhysicalPagesScatter -ZwMapViewOfSection=NtMapViewOfSection -ZwModifyBootEntry=NtModifyBootEntry -ZwNotifyChangeDirectoryFile=NtNotifyChangeDirectoryFile -ZwNotifyChangeKey=NtNotifyChangeKey -ZwNotifyChangeMultipleKeys=NtNotifyChangeMultipleKeys -ZwOpenDirectoryObject=NtOpenDirectoryObject -ZwOpenEvent=NtOpenEvent -ZwOpenEventPair=NtOpenEventPair -ZwOpenFile=NtOpenFile -ZwOpenIoCompletion=NtOpenIoCompletion -ZwOpenJobObject=NtOpenJobObject -ZwOpenKey=NtOpenKey -ZwOpenKeyedEvent=NtOpenKeyedEvent -ZwOpenMutant=NtOpenMutant -ZwOpenObjectAuditAlarm -ZwOpenProcess=NtOpenProcess -ZwOpenProcessToken=NtOpenProcessToken -ZwOpenProcessTokenEx=NtOpenProcessTokenEx -ZwOpenSection=NtOpenSection -ZwOpenSemaphore=NtOpenSemaphore -ZwOpenSymbolicLinkObject=NtOpenSymbolicLinkObject -ZwOpenThread=NtOpenThread -ZwOpenThreadToken=NtOpenThreadToken -ZwOpenThreadTokenEx=NtOpenThreadTokenEx -ZwOpenTimer=NtOpenTimer -ZwPlugPlayControl -ZwPowerInformation=NtPowerInformation -ZwPrivilegeCheck=NtPrivilegeCheck -ZwPrivilegeObjectAuditAlarm -ZwPrivilegedServiceAuditAlarm -ZwProtectVirtualMemory=NtProtectVirtualMemory -ZwPulseEvent=NtPulseEvent -ZwQueryAttributesFile=NtQueryAttributesFile -ZwQueryBootEntryOrder=NtQueryBootEntryOrder -ZwQueryBootOptions=NtQueryBootOptions -ZwQueryDebugFilterState=NtQueryDebugFilterState -ZwQueryDefaultLocale=NtQueryDefaultLocale -ZwQueryDefaultUILanguage=NtQueryDefaultUILanguage -ZwQueryDirectoryFile=NtQueryDirectoryFile -ZwQueryDirectoryObject=NtQueryDirectoryObject -ZwQueryEaFile=NtQueryEaFile -ZwQueryEvent=NtQueryEvent -ZwQueryFullAttributesFile=NtQueryFullAttributesFile -ZwQueryInformationAtom=NtQueryInformationAtom -ZwQueryInformationFile=NtQueryInformationFile -ZwQueryInformationJobObject=NtQueryInformationJobObject -ZwQueryInformationPort=NtQueryInformationPort -ZwQueryInformationProcess=NtQueryInformationProcess -ZwQueryInformationThread=NtQueryInformationThread -ZwQueryInformationToken=NtQueryInformationToken -ZwQueryInstallUILanguage=NtQueryInstallUILanguage -ZwQueryIntervalProfile=NtQueryIntervalProfile -ZwQueryIoCompletion=NtQueryIoCompletion -ZwQueryKey=NtQueryKey -ZwQueryMultipleValueKey=NtQueryMultipleValueKey -ZwQueryMutant=NtQueryMutant -ZwQueryObject=NtQueryObject -ZwQueryOpenSubKeys=NtQueryOpenSubKeys -ZwQueryPerformanceCounter=NtQueryPerformanceCounter -ZwQueryPortInformationProcess=NtQueryPortInformationProcess -ZwQueryQuotaInformationFile=NtQueryQuotaInformationFile -ZwQuerySection=NtQuerySection -ZwQuerySecurityObject=NtQuerySecurityObject -ZwQuerySemaphore=NtQuerySemaphore -ZwQuerySymbolicLinkObject=NtQuerySymbolicLinkObject -ZwQuerySystemEnvironmentValue=NtQuerySystemEnvironmentValue -ZwQuerySystemEnvironmentValueEx=NtQuerySystemEnvironmentValueEx -ZwQuerySystemInformation=NtQuerySystemInformation -ZwQuerySystemTime=NtQuerySystemTime -ZwQueryTimer=NtQueryTimer -ZwQueryTimerResolution=NtQueryTimerResolution -ZwQueryValueKey=NtQueryValueKey -ZwQueryVirtualMemory=NtQueryVirtualMemory -ZwQueryVolumeInformationFile=NtQueryVolumeInformationFile -ZwQueueApcThread=NtQueueApcThread -ZwRaiseException=NtRaiseException -ZwRaiseHardError=NtRaiseHardError -ZwReadFile=NtReadFile -ZwReadFileScatter=NtReadFileScatter -ZwReadRequestData=NtReadRequestData -ZwReadVirtualMemory=NtReadVirtualMemory -ZwRegisterThreadTerminatePort=NtRegisterThreadTerminatePort -ZwReleaseKeyedEvent=NtReleaseKeyedEvent -ZwReleaseMutant=NtReleaseMutant -ZwReleaseSemaphore=NtReleaseSemaphore -ZwRemoveIoCompletion=NtRemoveIoCompletion -ZwRemoveProcessDebug=NtRemoveProcessDebug -ZwRenameKey=NtRenameKey -ZwReplaceKey=NtReplaceKey -ZwReplyPort=NtReplyPort -ZwReplyWaitReceivePort=NtReplyWaitReceivePort -ZwReplyWaitReceivePortEx -ZwReplyWaitReplyPort -ZwRequestDeviceWakeup -ZwRequestPort -ZwRequestWaitReplyPort -ZwRequestWakeupLatency -ZwResetEvent -ZwResetWriteWatch -ZwRestoreKey -ZwResumeProcess -ZwResumeThread -ZwSaveKey -ZwSaveKeyEx -ZwSaveMergedKeys -ZwSecureConnectPort -ZwSetBootEntryOrder -ZwSetBootOptions -ZwSetContextThread -ZwSetDebugFilterState -ZwSetDefaultHardErrorPort -ZwSetDefaultLocale -ZwSetDefaultUILanguage -ZwSetEaFile -ZwSetEvent -ZwSetEventBoostPriority -ZwSetHighEventPair -ZwSetHighWaitLowEventPair -ZwSetInformationDebugObject -ZwSetInformationFile -ZwSetInformationJobObject -ZwSetInformationKey -ZwSetInformationObject -ZwSetInformationProcess -ZwSetInformationThread -ZwSetInformationToken -ZwSetIntervalProfile -ZwSetIoCompletion -ZwSetLdtEntries -ZwSetLowEventPair -ZwSetLowWaitHighEventPair -ZwSetQuotaInformationFile -ZwSetSecurityObject -ZwSetSystemEnvironmentValue -ZwSetSystemEnvironmentValueEx -ZwSetSystemInformation -ZwSetSystemPowerState -ZwSetSystemTime -ZwSetThreadExecutionState -ZwSetTimer -ZwSetTimerResolution -ZwSetUuidSeed -ZwSetValueKey -ZwSetVolumeInformationFile -ZwShutdownSystem -ZwSignalAndWaitForSingleObject -ZwStartProfile -ZwStopProfile -ZwSuspendProcess -ZwSuspendThread -ZwSystemDebugControl -ZwTerminateJobObject -ZwTerminateProcess -ZwTerminateThread -ZwTestAlert -ZwTraceEvent -ZwTranslateFilePath -ZwUnloadDriver -ZwUnloadKey -ZwUnloadKeyEx -ZwUnlockFile -ZwUnlockVirtualMemory -ZwUnmapViewOfSection -ZwVdmControl -ZwWaitForDebugEvent -ZwWaitForKeyedEvent -ZwWaitForMultipleObjects -ZwWaitForSingleObject -ZwWaitHighEventPair -ZwWaitLowEventPair -ZwWriteFile -ZwWriteFileGather -ZwWriteRequestData -ZwWriteVirtualMemory -ZwYieldExecution -__isascii -__iscsym -__iscsymf -__toascii -_alldiv -_alldvrm -_allmul -_alloca_probe -_allrem -_allshl -_allshr -_atoi64 -_aulldiv -_aulldvrm -_aullrem -_aullshr -_chkstk -_fltused -_ftol -_i64toa -_i64tow -_itoa -_itow -_lfind -_ltoa -_ltow -_memccpy -_memicmp -_snprintf -_snwprintf -_splitpath -_strcmpi=_stricmp -_stricmp -_strlwr -_strnicmp -_strupr -_tolower -_toupper -_ui64toa -_ui64tow -_ultoa -_ultow -_vsnprintf -_vsnwprintf -_wcsicmp -_wcslwr -_wcsnicmp -_wcsupr -_wtoi -_wtoi64 -_wtol -abs -atan -atoi -atol -bsearch -ceil -cos -fabs -floor -isalnum -isalpha -iscntrl -isdigit -isgraph -islower -isprint -ispunct -isspace -isupper -iswalpha -iswctype -iswdigit -iswlower -iswspace -iswxdigit -isxdigit -labs -log -mbstowcs -memchr -memcmp -memcpy=memmove -memmove -memset -pow -qsort -sin -sprintf -sqrt -sscanf -strcat -strchr -strcmp -strcpy -strcspn -strlen -strncat -strncmp -strncpy -strpbrk -strrchr -strspn -strstr -strtol -strtoul -swprintf -tan -tolower -toupper -towlower -towupper -vDbgPrintEx -vDbgPrintExWithPrefix -vsprintf -wcscat -wcschr -wcscmp -wcscpy -wcscspn -wcslen -wcsncat -wcsncmp -wcsncpy -wcspbrk -wcsrchr -wcsspn -wcsstr -wcstol -wcstombs -wcstoul + CsrAllocateCaptureBuffer@8 @1 + CsrAllocateMessagePointer@12 @2 + CsrCaptureMessageBuffer@16 @3 + CsrCaptureMessageMultiUnicodeStringsInPlace@12 @4 + CsrCaptureMessageString@20 @5 + CsrCaptureTimeout@8 @6 + CsrClientCallServer@16 @7 + CsrClientConnectToServer@20 @8 + CsrFreeCaptureBuffer@4 @9 + CsrGetProcessId@0 @10 + CsrIdentifyAlertableThread@0 @11 + CsrNewThread@0 @12 + CsrProbeForRead@12 @13 + CsrProbeForWrite@12 @14 + CsrSetPriorityClass@8 @15 + DbgBreakPoint@0 @16 + DbgPrint @17 + DbgPrintEx @18 + DbgPrintReturnControlC @19 + DbgPrompt@12 @20 + DbgQueryDebugFilterState@8 @21 + DbgSetDebugFilterState@12 @22 + DbgUiConnectToDbg@0 @23 + DbgUiContinue@8 @24 + DbgUiConvertStateChangeStructure@8 @25 + DbgUiDebugActiveProcess@4 @26 + DbgUiGetThreadDebugObject@0 @27 + DbgUiIssueRemoteBreakin@4 @28 + DbgUiRemoteBreakin@0 @29 + DbgUiSetThreadDebugObject@4 @30 + DbgUiStopDebugging@4 @31 + DbgUiWaitStateChange@8 @32 + DbgUserBreakPoint@0 @33 + KiFastSystemCall@0 @34 + KiFastSystemCallRet@0 @35 + KiIntSystemCall@0 @36 + ExpInterlockedPopEntrySListEnd@0 @37 + ExpInterlockedPopEntrySListFault@0 @38 + ExpInterlockedPopEntrySListResume@0 @39 + KiRaiseUserExceptionDispatcher@0 @40 + KiUserApcDispatcher@16 @41 + KiUserCallbackDispatcher@12 @42 + KiUserExceptionDispatcher@8 @43 + LdrAccessResource@16 @44 + LdrAddRefDll@8 @45 + LdrDisableThreadCalloutsForDll@4 @46 + LdrEnumResources@20 @47 + LdrFindEntryForAddress@8 @48 + LdrFindResourceDirectory_U@16 @49 + LdrFindResource_U@16 @50 + LdrGetDllHandle@16 @51 + LdrGetProcedureAddress@16 @52 + LdrInitializeThunk@16 @53 + LdrLoadDll@16 @54 + LdrLockLoaderLock@12 @55 + LdrProcessRelocationBlock@16 @56 + LdrQueryImageFileExecutionOptions@24 @57 + LdrQueryProcessModuleInformation@12 @58 + LdrShutdownProcess@0 @59 + LdrShutdownThread@0 @60 + LdrUnloadAlternateResourceModule@4 @61 + LdrUnloadDll@4 @62 + LdrUnlockLoaderLock@8 @63 + LdrVerifyImageMatchesChecksum@16 @64 + NlsAnsiCodePage @65 DATA + NlsMbCodePageTag @66 DATA + NlsMbOemCodePageTag @67 DATA + NtAcceptConnectPort@24 @68 + NtAccessCheck@32 @69 + NtAccessCheckAndAuditAlarm@44 @70 + NtAccessCheckByType@44 @71 + NtAccessCheckByTypeAndAuditAlarm@64 @72 + NtAccessCheckByTypeResultList@44 @73 + NtAccessCheckByTypeResultListAndAuditAlarm@64 @74 + NtAccessCheckByTypeResultListAndAuditAlarmByHandle@68 @75 + NtAddAtom@12 @76 + NtAddBootEntry@8 @77 + NtAddDriverEntry@8 @78 + NtAdjustGroupsToken@24 @79 + NtAdjustPrivilegesToken@24 @80 + NtAlertResumeThread@8 @81 + NtAlertThread@4 @82 + NtAllocateLocallyUniqueId@4 @83 + NtAllocateUserPhysicalPages@12 @84 + NtAllocateUuids@16 @85 + NtAllocateVirtualMemory@24 @86 + NtApphelpCacheControl@8 @87 + NtAreMappedFilesTheSame@8 @88 + NtAssignProcessToJobObject@8 @89 + NtCallbackReturn@12 @90 + NtCancelDeviceWakeupRequest@4 @91 + NtCancelIoFile@8 @92 + NtCancelTimer@8 @93 + NtClearEvent@4 @94 + NtClose@4 @95 + NtCloseObjectAuditAlarm@12 @96 + NtCompactKeys@8 @97 + NtCompareTokens@12 @98 + NtCompleteConnectPort@4 @99 + NtCompressKey@4 @100 + NtConnectPort@32 @101 + NtContinue@8 @102 + NtCreateDebugObject@16 @103 + NtCreateDirectoryObject@12 @104 + NtCreateEvent@20 @105 + NtCreateEventPair@12 @106 + NtCreateFile@44 @107 + NtCreateIoCompletion@16 @108 + NtCreateJobObject@12 @109 + NtCreateJobSet@12 @110 + NtCreateKey@28 @111 + NtCreateKeyedEvent@16 @112 + NtCreateMailslotFile@32 @113 + NtCreateMutant@16 @114 + NtCreateNamedPipeFile@56 @115 + NtCreatePagingFile@16 @116 + NtCreatePort@20 @117 + NtCreateProcess@32 @118 + NtCreateProcessEx@36 @119 + NtCreateProfile@36 @120 + NtCreateSection@28 @121 + NtCreateSemaphore@20 @122 + NtCreateSymbolicLinkObject@16 @123 + NtCreateThread@32 @124 + NtCreateTimer@16 @125 + NtCreateToken@52 @126 + NtCreateWaitablePort@20 @127 + NtCurrentTeb@0=_NtCurrentTeb@0 @128 + NtDebugActiveProcess@8 @129 + NtDebugContinue@12 @130 + NtDelayExecution@8 @131 + NtDeleteAtom@4 @132 + NtDeleteBootEntry@4 @133 + NtDeleteFile@4 @134 + NtDeleteKey@4 @135 + NtDeleteObjectAuditAlarm@12 @136 + NtDeleteValueKey@8 @137 + NtDeviceIoControlFile@40 @138 + NtDisplayString@4 @139 + NtDuplicateObject@28 @140 + NtDuplicateToken@24 @141 + NtEnumerateBootEntries@8 @142 + NtEnumerateKey@24 @143 + NtEnumerateSystemEnvironmentValuesEx@12 @144 + NtEnumerateValueKey@24 @145 + NtExtendSection@8 @146 + NtFilterToken@24 @147 + NtFindAtom@12 @148 + NtFlushBuffersFile@8 @149 + NtFlushInstructionCache@12 @150 + NtFlushKey@4 @151 + NtFlushVirtualMemory@16 @152 + NtFlushWriteBuffer@0 @153 + NtFreeUserPhysicalPages@12 @154 + NtFreeVirtualMemory@16 @155 + NtFsControlFile@40 @156 + NtGetContextThread@8 @157 + NtGetCurrentProcessorNumber@0 @158 + NtGetDevicePowerState@8 @159 + NtGetPlugPlayEvent@16 @160 + NtGetWriteWatch@28 @161 + NtImpersonateAnonymousToken@4 @162 + NtImpersonateClientOfPort@8 @163 + NtImpersonateThread@12 @164 + NtInitializeRegistry@4 @165 + NtInitiatePowerAction@16 @166 + NtIsProcessInJob@8 @167 + NtIsSystemResumeAutomatic@0 @168 + NtListenPort@8 @169 + NtLoadDriver@4 @170 + NtLoadKey2@12 @171 + NtLoadKey@8 @172 + NtLockFile@40 @173 + NtLockProductActivationKeys@8 @174 + NtLockRegistryKey@4 @175 + NtLockVirtualMemory@16 @176 + NtMakePermanentObject@4 @177 + NtMakeTemporaryObject@4 @178 + NtMapUserPhysicalPages@12 @179 + NtMapUserPhysicalPagesScatter@12 @180 + NtMapViewOfSection@40 @181 + NtModifyBootEntry@4 @182 + NtNotifyChangeDirectoryFile@36 @183 + NtNotifyChangeKey@40 @184 + NtNotifyChangeMultipleKeys@48 @185 + NtOpenDirectoryObject@12 @186 + NtOpenEvent@12 @187 + NtOpenEventPair@12 @188 + NtOpenFile@24 @189 + NtOpenIoCompletion@12 @190 + NtOpenJobObject@12 @191 + NtOpenKey@12 @192 + NtOpenKeyedEvent@12 @193 + NtOpenMutant@12 @194 + NtOpenObjectAuditAlarm@48 @195 + NtOpenProcess@16 @196 + NtOpenProcessToken@12 @197 + NtOpenProcessTokenEx@16 @198 + NtOpenSection@12 @199 + NtOpenSemaphore@12 @200 + NtOpenSymbolicLinkObject@12 @201 + NtOpenThread@16 @202 + NtOpenThreadToken@16 @203 + NtOpenThreadTokenEx@20 @204 + NtOpenTimer@12 @205 + NtPlugPlayControl@12 @206 + NtPowerInformation@20 @207 + NtPrivilegeCheck@12 @208 + NtPrivilegeObjectAuditAlarm@24 @209 + NtPrivilegedServiceAuditAlarm@20 @210 + NtProtectVirtualMemory@20 @211 + NtPulseEvent@8 @212 + NtQueryAttributesFile@8 @213 + NtQueryBootEntryOrder@8 @214 + NtQueryBootOptions@8 @215 + NtQueryDebugFilterState@8 @216 + NtQueryDefaultLocale@8 @217 + NtQueryDefaultUILanguage@4 @218 + NtQueryDirectoryFile@44 @219 + NtQueryDirectoryObject@28 @220 + NtQueryEaFile@36 @221 + NtQueryEvent@20 @222 + NtQueryFullAttributesFile@8 @223 + NtQueryInformationAtom@20 @224 + NtQueryInformationFile@20 @225 + NtQueryInformationJobObject@20 @226 + NtQueryInformationPort@20 @227 + NtQueryInformationProcess@20 @228 + NtQueryInformationThread@20 @229 + NtQueryInformationToken@20 @230 + NtQueryInstallUILanguage@4 @231 + NtQueryIntervalProfile@8 @232 + NtQueryIoCompletion@20 @233 + NtQueryKey@20 @234 + NtQueryMultipleValueKey@24 @235 + NtQueryMutant@20 @236 + NtQueryObject@20 @237 + NtQueryOpenSubKeys@8 @238 + NtQueryPerformanceCounter@8 @239 + NtQueryPortInformationProcess@0 @240 + NtQueryQuotaInformationFile@36 @241 + NtQuerySection@20 @242 + NtQuerySecurityObject@20 @243 + NtQuerySemaphore@20 @244 + NtQuerySymbolicLinkObject@12 @245 + NtQuerySystemEnvironmentValue@16 @246 + NtQuerySystemEnvironmentValueEx@20 @247 + NtQuerySystemInformation@16 @248 + NtQuerySystemTime@4 @249 + NtQueryTimer@20 @250 + NtQueryTimerResolution@12 @251 + NtQueryValueKey@24 @252 + NtQueryVirtualMemory@24 @253 + NtQueryVolumeInformationFile@20 @254 + NtQueueApcThread@20 @255 + NtRaiseException@12 @256 + NtRaiseHardError@24 @257 + NtReadFile@36 @258 + NtReadFileScatter@36 @259 + NtReadRequestData@24 @260 + NtReadVirtualMemory@20 @261 + NtRegisterThreadTerminatePort@4 @262 + NtReleaseKeyedEvent@16 @263 + NtReleaseMutant@8 @264 + NtReleaseSemaphore@12 @265 + NtRemoveIoCompletion@20 @266 + NtRemoveProcessDebug@8 @267 + NtRenameKey@8 @268 + NtReplaceKey@12 @269 + NtReplyPort@8 @270 + NtReplyWaitReceivePort@16 @271 + NtReplyWaitReceivePortEx@20 @272 + NtReplyWaitReplyPort@8 @273 + NtRequestDeviceWakeup@4 @274 + NtRequestPort@8 @275 + NtRequestWaitReplyPort@12 @276 + NtRequestWakeupLatency@4 @277 + NtResetEvent@8 @278 + NtResetWriteWatch@12 @279 + NtRestoreKey@12 @280 + NtResumeProcess@4 @281 + NtResumeThread@8 @282 + NtSaveKey@8 @283 + NtSaveKeyEx@12 @284 + NtSaveMergedKeys@12 @285 + NtSecureConnectPort@36 @286 + NtSetBootEntryOrder@8 @287 + NtSetBootOptions@8 @288 + NtSetContextThread@8 @289 + NtSetDebugFilterState@12 @290 + NtSetDefaultHardErrorPort@4 @291 + NtSetDefaultLocale@8 @292 + NtSetDefaultUILanguage@4 @293 + NtSetEaFile@16 @294 + NtSetEvent@8 @295 + NtSetEventBoostPriority@4 @296 + NtSetHighEventPair@4 @297 + NtSetHighWaitLowEventPair@4 @298 + NtSetInformationDebugObject@20 @299 + NtSetInformationFile@20 @300 + NtSetInformationJobObject@16 @301 + NtSetInformationKey@16 @302 + NtSetInformationObject@16 @303 + NtSetInformationProcess@16 @304 + NtSetInformationThread@16 @305 + NtSetInformationToken@16 @306 + NtSetIntervalProfile@8 @307 + NtSetIoCompletion@20 @308 + NtSetLdtEntries@24 @309 + NtSetLowEventPair@4 @310 + NtSetLowWaitHighEventPair@4 @311 + NtSetQuotaInformationFile@16 @312 + NtSetSecurityObject@12 @313 + NtSetSystemEnvironmentValue@8 @314 + NtSetSystemEnvironmentValueEx@8 @315 + NtSetSystemInformation@12 @316 + NtSetSystemPowerState@12 @317 + NtSetSystemTime@8 @318 + NtSetThreadExecutionState@8 @319 + NtSetTimer@28 @320 + NtSetTimerResolution@12 @321 + NtSetUuidSeed@4 @322 + NtSetValueKey@24 @323 + NtSetVolumeInformationFile@20 @324 + NtShutdownSystem@4 @325 + NtSignalAndWaitForSingleObject@16 @326 + NtStartProfile@4 @327 + NtStopProfile@4 @328 + NtSuspendProcess@4 @329 + NtSuspendThread@8 @330 + NtSystemDebugControl@24 @331 + NtTerminateJobObject@8 @332 + NtTerminateProcess@8 @333 + NtTerminateThread@8 @334 + NtTestAlert@0 @335 + NtTraceEvent@16 @336 + NtTranslateFilePath@16 @337 + NtUnloadDriver@4 @338 + NtUnloadKey@4 @339 + NtUnloadKeyEx@8 @340 + NtUnlockFile@20 @341 + NtUnlockVirtualMemory@16 @342 + NtUnmapViewOfSection@8 @343 + NtVdmControl@8 @344 + NtWaitForDebugEvent@16 @345 + NtWaitForKeyedEvent@16 @346 + NtWaitForMultipleObjects@20 @347 + NtWaitForSingleObject@12 @348 + NtWaitHighEventPair@4 @349 + NtWaitLowEventPair@4 @350 + NtWriteFile@36 @351 + NtWriteFileGather@36 @352 + NtWriteRequestData@24 @353 + NtWriteVirtualMemory@20 @354 + NtYieldExecution@0 @355 + RtlAbsoluteToSelfRelativeSD@12 @356 + RtlAcquirePebLock@0 @357 + RtlAcquireResourceExclusive@8 @358 + RtlAcquireResourceShared@8 @359 + RtlAcquireSRWLockExclusive@4 @360 + RtlAcquireSRWLockShared@4 @361 + RtlActivateActivationContext@12 @362 + RtlActivateActivationContextUnsafeFast@8 @363 + RtlAddAccessAllowedAce@16 @364 + RtlAddAccessAllowedAceEx@20 @365 + RtlAddAccessAllowedObjectAce@28 @366 + RtlAddAccessDeniedAce@16 @367 + RtlAddAccessDeniedAceEx@20 @368 + RtlAddAccessDeniedObjectAce@28 @369 + RtlAddAce@20 @370 + RtlAddAtomToAtomTable@12 @371 + RtlAddAuditAccessAce@24 @372 + RtlAddAuditAccessAceEx@28 @373 + RtlAddAuditAccessObjectAce@36 @374 + RtlAddMandatoryAce@24 @375 + RtlAddRefActivationContext@4 @376 + RtlAddVectoredExceptionHandler@8 @377 + RtlAdjustPrivilege@16 @378 + RtlAllocateActivationContextStack@4 @379 + RtlAllocateAndInitializeSid@44 @380 + RtlAllocateHandle@8 @381 + RtlAllocateHeap@12 @382 + RtlAnsiCharToUnicodeChar@4 @383 + RtlAnsiStringToUnicodeSize@4=RtlxAnsiStringToUnicodeSize@4 @384 + RtlAnsiStringToUnicodeString@12 @385 + RtlAppendAsciizToString@8 @386 + RtlAppendStringToString@8 @387 + RtlAppendUnicodeStringToString@8 @388 + RtlAppendUnicodeToString@8 @389 + RtlAreAllAccessesGranted@8 @390 + RtlAreAnyAccessesGranted@8 @391 + RtlAreBitsClear@12 @392 + RtlAreBitsSet@12 @393 + RtlAssert@16 @394 + RtlCaptureContext@4 @395 + RtlCaptureStackBackTrace@16 @396 + RtlCharToInteger@12 @397 + RtlCheckRegistryKey@8 @398 + RtlClearAllBits@4 @399 + RtlClearBits@12 @400 + RtlCompactHeap@8 @401 + RtlCompareMemory@12 @402 + RtlCompareMemoryUlong@12 @403 + RtlCompareString@12 @404 + RtlCompareUnicodeString@12 @405 + RtlCompressBuffer@32 @406 + RtlComputeCrc32@12 @407 + RtlConvertExclusiveToShared@4 @408 + RtlConvertLongToLargeInteger@4 @409 + RtlConvertSharedToExclusive@4 @410 + RtlConvertSidToUnicodeString@12 @411 + RtlConvertUlongToLargeInteger@4 @412 + RtlCopyLuid@8 @413 + RtlCopyLuidAndAttributesArray@12 @414 + RtlCopySecurityDescriptor@8 @415 + RtlCopySid@12 @416 + RtlCopySidAndAttributesArray@28 @417 + RtlCopyString@8 @418 + RtlCopyUnicodeString@8 @419 + RtlCreateAcl@12 @420 + RtlCreateActivationContext@8 @421 + RtlCreateAtomTable@8 @422 + RtlCreateBootStatusDataFile@0 @423 + RtlCreateEnvironment@8 @424 + RtlCreateHeap@24 @425 + RtlCreateProcessParameters@40 @426 + RtlCreateQueryDebugBuffer@8 @427 + RtlCreateRegistryKey@8 @428 + RtlCreateSecurityDescriptor@8 @429 + RtlCreateSystemVolumeInformationFolder@4 @430 + RtlCreateTagHeap@16 @431 + RtlCreateTimer@28 @432 + RtlCreateTimerQueue@4 @433 + RtlCreateUnicodeString@8 @434 + RtlCreateUnicodeStringFromAsciiz@8 @435 + RtlCreateUserProcess@40 @436 + RtlCreateUserThread@40 @437 + RtlCustomCPToUnicodeN@24 @438 + RtlCutoverTimeToSystemTime@16 @439 + RtlDeNormalizeProcessParams@4 @440 + RtlDeactivateActivationContext@8 @441 + RtlDeactivateActivationContextUnsafeFast@4 @442 + RtlDecodePointer@4 @443 + RtlDecodeSystemPointer@4=RtlEncodeSystemPointer@4 @444 + RtlDecompressBuffer@24 @445 + RtlDecompressFragment@32 @446 + RtlDelete@4 @447 + RtlDeleteAce@8 @448 + RtlDeleteAtomFromAtomTable@8 @449 + RtlDeleteCriticalSection@4 @450 + RtlDeleteElementGenericTable@8 @451 + RtlDeleteElementGenericTableAvl@8 @452 + RtlDeleteNoSplay@8 @453 + RtlDeleteOwnersRanges@8 @454 + RtlDeleteRange@24 @455 + RtlDeleteRegistryValue@12 @456 + RtlDeleteResource@4 @457 + RtlDeleteSecurityObject@4 @458 + RtlDeleteTimer@12 @459 + RtlDeleteTimerQueue@4 @460 + RtlDeleteTimerQueueEx@8 @461 + RtlDeregisterWait@4 @462 + RtlDeregisterWaitEx@8 @463 + RtlDestroyAtomTable@4 @464 + RtlDestroyEnvironment@4 @465 + RtlDestroyHandleTable@4 @466 + RtlDestroyHeap@4 @467 + RtlDestroyProcessParameters@4 @468 + RtlDestroyQueryDebugBuffer@4 @469 + RtlDetermineDosPathNameType_U@4 @470 + RtlDllShutdownInProgress@0 @471 + RtlDnsHostNameToComputerName@12 @472 + RtlDoesFileExists_U@4 @473 + RtlDosPathNameToNtPathName_U@16 @474 + RtlDosPathNameToRelativeNtPathName_U@16 @475 + RtlDosSearchPath_U@24 @476 + RtlDowncaseUnicodeChar@4 @477 + RtlDowncaseUnicodeString@12 @478 + RtlDumpResource@4 @479 + RtlDuplicateUnicodeString@12 @480 + RtlEmptyAtomTable@8 @481 + RtlEncodePointer@4 @482 + RtlEncodeSystemPointer@4 @483 + RtlEnlargedIntegerMultiply@8 @484 + RtlEnlargedUnsignedDivide@16 @485 + RtlEnlargedUnsignedMultiply@8 @486 + RtlEnterCriticalSection@4 @487 + RtlEnumProcessHeaps@8 @488 + RtlEnumerateGenericTable@8 @489 + RtlEnumerateGenericTableAvl@8 @490 + RtlEnumerateGenericTableLikeADirectory@28 @491 + RtlEnumerateGenericTableWithoutSplaying@8 @492 + RtlEnumerateGenericTableWithoutSplayingAvl@8 @493 + RtlEqualComputerName@8 @494 + RtlEqualDomainName@8 @495 + RtlEqualLuid@8 @496 + RtlEqualPrefixSid@8 @497 + RtlEqualSid@8 @498 + RtlEqualString@12 @499 + RtlEqualUnicodeString@12 @500 + RtlEraseUnicodeString@4 @501 + RtlExitUserThread@4 @502 + RtlExpandEnvironmentStrings_U@16 @503 + RtlExtendHeap@16 @504 + RtlExtendedIntegerMultiply@12 @505 + RtlExtendedLargeIntegerDivide@16 @506 + RtlExtendedMagicDivide@20 @507 + RtlFillMemory@12 @508 + RtlFillMemoryUlong@12 @509 + RtlFindActivationContextSectionString@20 @510 + RtlFindCharInUnicodeString@16 @511 + RtlFindClearBits@12 @512 + RtlFindClearBitsAndSet@12 @513 + RtlFindClearRuns@16 @514 + RtlFindLastBackwardRunClear@12 @515 + RtlFindLeastSignificantBit@8 @516 + RtlFindLongestRunClear@8 @517 + RtlFindLongestRunSet@8 @518 + RtlFindMessage@20 @519 + RtlFindMostSignificantBit@8 @520 + RtlFindNextForwardRunClear@12 @521 + RtlFindRange@48 @522 + RtlFindSetBits@12 @523 + RtlFindSetBitsAndClear@12 @524 + RtlFirstEntrySList@4 @525 + RtlFirstFreeAce@8 @526 + RtlFlushSecureMemoryCache@8 @527 + RtlFormatCurrentUserKeyPath@4 @528 + RtlFormatMessage@32 @529 + RtlFreeAnsiString@4 @530 + RtlFreeHandle@8 @531 + RtlFreeHeap@12 @532 + RtlFreeOemString@4 @533 + RtlFreeRangeList@4 @534 + RtlFreeSid@4 @535 + RtlFreeThreadActivationContextStack@0 @536 + RtlFreeUnicodeString@4 @537 + RtlFreeUserThreadStack@8 @538 + RtlGUIDFromString@8 @539 + RtlGenerate8dot3Name@16 @540 + RtlGetAce@12 @541 + RtlGetActiveActivationContext@4 @542 + RtlGetCallersAddress@8 @543 + RtlGetCompressionWorkSpaceSize@12 @544 + RtlGetControlSecurityDescriptor@12 @545 + RtlGetCurrentDirectory_U@8 @546 + RtlGetCurrentPeb@0 @547 + RtlGetCurrentProcessorNumber@0 @548 + RtlGetDaclSecurityDescriptor@16 @549 + RtlGetElementGenericTable@8 @550 + RtlGetElementGenericTableAvl@8 @551 + RtlGetFirstRange@12 @552 + RtlGetFullPathName_U@16 @553 + RtlGetGroupSecurityDescriptor@12 @554 + RtlGetLastNtStatus@0 @555 + RtlGetLastWin32Error@0 @556 + RtlGetLongestNtPathLength@0 @557 + RtlGetNextRange@12 @558 + RtlGetNtGlobalFlags@0 @559 + RtlGetNtProductType@4 @560 + RtlGetNtVersionNumbers@12 @561 + RtlGetOwnerSecurityDescriptor@12 @562 + RtlGetProcessHeaps@8 @563 + RtlGetSaclSecurityDescriptor@16 @564 + RtlGetSecurityDescriptorRMControl@8 @565 + RtlGetSetBootStatusData@24 @566 + RtlGetUserInfoHeap@20 @567 + RtlGetVersion@4 @568 + RtlHashUnicodeString@16 @569 + RtlIdentifierAuthoritySid@4 @570 + RtlImageDirectoryEntryToData@16 @571 + RtlImageNtHeader@4 @572 + RtlImageRvaToSection@12 @573 + RtlImageRvaToVa@16 @574 + RtlImpersonateSelf@4 @575 + RtlInitAnsiString@8 @576 + RtlInitAnsiStringEx@8 @577 + RtlInitCodePageTable@8 @578 + RtlInitNlsTables@16 @579 + RtlInitString@8 @580 + RtlInitUnicodeString@8 @581 + RtlInitUnicodeStringEx@8 @582 + RtlInitializeBitMap@12 @583 + RtlInitializeContext@20 @584 + RtlInitializeCriticalSection@4 @585 + RtlInitializeCriticalSectionAndSpinCount@8 @586 + RtlInitializeGenericTable@20 @587 + RtlInitializeGenericTableAvl@20 @588 + RtlInitializeHandleTable@12 @589 + RtlInitializeRangeList@4 @590 + RtlInitializeResource@4 @591 + RtlInitializeSListHead@4 @592 + RtlInitializeSid@12 @593 + RtlInitializeSRWLock@4 @594 + RtlInsertElementGenericTable@16 @595 + RtlInsertElementGenericTableAvl@16 @596 + RtlInt64ToUnicodeString@16 @597 + RtlIntegerToChar@16 @598 + RtlIntegerToUnicodeString@12 @599 + RtlInterlockedFlushSList@4 @600 + RtlInterlockedPopEntrySList@4 @601 + RtlInterlockedPushEntrySList@8 @602 + RtlInterlockedPushListSList@16 @603 + RtlInvertRangeList@8 @604 + RtlIpv4AddressToStringA@8 @605 + RtlIpv4AddressToStringExA@16 @606 + RtlIpv4AddressToStringExW@16 @607 + RtlIpv4AddressToStringW@8 @608 + RtlIpv4StringToAddressA@16 @609 + RtlIpv4StringToAddressExA@16 @610 + RtlIpv4StringToAddressExW@16 @611 + RtlIpv4StringToAddressW@16 @612 + RtlIpv6AddressToStringA@8 @613 + RtlIpv6AddressToStringExA@20 @614 + RtlIpv6AddressToStringExW@20 @615 + RtlIpv6AddressToStringW@8 @616 + RtlIpv6StringToAddressA@12 @617 + RtlIpv6StringToAddressExA@16 @618 + RtlIpv6StringToAddressExW@16 @619 + RtlIpv6StringToAddressW@12 @620 + RtlIsActivationContextActive@4 @621 + RtlIsDosDeviceName_U@4 @622 + RtlIsGenericTableEmpty@4 @623 + RtlIsGenericTableEmptyAvl@4 @624 + RtlIsNameLegalDOS8Dot3@12 @625 + RtlIsRangeAvailable@40 @626 + RtlIsTextUnicode@12 @627 + RtlIsThreadWithinLoaderCallout@0 @628 + RtlIsValidHandle@8 @629 + RtlIsValidIndexHandle@12 @630 + RtlLargeIntegerAdd@16 @631 + RtlLargeIntegerArithmeticShift@12 @632 + RtlLargeIntegerDivide@20 @633 + RtlLargeIntegerNegate@8 @634 + RtlLargeIntegerShiftLeft@12 @635 + RtlLargeIntegerShiftRight@12 @636 + RtlLargeIntegerSubtract@16 @637 + RtlLargeIntegerToChar@16 @638 + RtlLeaveCriticalSection@4 @639 + RtlLengthRequiredSid@4 @640 + RtlLengthSecurityDescriptor@4 @641 + RtlLengthSid@4 @642 + RtlLocalTimeToSystemTime@8 @643 + RtlLockBootStatusData@4 @644 + RtlLockHeap@4 @645 + RtlLookupAtomInAtomTable@12 @646 + RtlLookupElementGenericTable@8 @647 + RtlLookupElementGenericTableAvl@8 @648 + RtlMakeSelfRelativeSD@12 @649 + RtlMapGenericMask@8 @650 + RtlMergeRangeLists@16 @651 + RtlMoveMemory@12 @652 + RtlMultiByteToUnicodeN@20 @653 + RtlMultiByteToUnicodeSize@12 @654 + RtlNewSecurityObject@24 @655 + RtlNormalizeProcessParams@4 @656 + RtlNtPathNameToDosPathName@16 @657 + RtlNtStatusToDosError@4 @658 + RtlNtStatusToDosErrorNoTeb@4 @659 + RtlNumberGenericTableElements@4 @660 + RtlNumberGenericTableElementsAvl@4 @661 + RtlNumberOfClearBits@4 @662 + RtlNumberOfSetBits@4 @663 + RtlOemStringToUnicodeString@12 @664 + RtlOemToUnicodeN@20 @665 + RtlOpenCurrentUser@8 @666 + RtlPcToFileHeader@8 @667 + RtlPinAtomInAtomTable@8 @668 + RtlPrefixString@12 @669 + RtlPrefixUnicodeString@12 @670 + RtlProtectHeap@8 @671 + RtlQueryAtomInAtomTable@24 @672 + RtlQueryDepthSList@4 @673 + RtlQueryEnvironmentVariable_U@12 @674 + RtlQueryHeapInformation@20 @675 + RtlQueryInformationAcl@16 @676 + RtlQueryInformationActivationContext@28 @677 + RtlQueryProcessDebugInformation@12 @678 + RtlQueryRegistryValues@20 @679 + RtlQuerySecurityObject@20 @680 + RtlQueryTagHeap@20 @681 + RtlQueryTimeZoneInformation@4 @682 + RtlQueueWorkItem@12 @683 + RtlRaiseException@4 @684 + RtlRaiseStatus@4 @685 + RtlRandom@4 @686 + RtlRandomEx@4 @687 + RtlReAllocateHeap@16 @688 + RtlRealPredecessor@4 @689 + RtlRealSuccessor@4 @690 + RtlRegisterSecureMemoryCacheCallback@4 @691 + RtlRegisterWait@24 @692 + RtlReleaseActivationContext@4 @693 + RtlReleasePebLock@0 @694 + RtlReleaseResource@4 @695 + RtlReleaseSRWLockExclusive@4 @696 + RtlReleaseSRWLockShared@4 @697 + RtlRemoteCall@28 @698 + RtlRemoveVectoredExceptionHandler@4 @699 + RtlResetRtlTranslations@4 @700 + RtlRestoreLastWin32Error@4=RtlSetLastWin32Error@4 @701 + RtlRunDecodeUnicodeString@8 @702 + RtlRunEncodeUnicodeString@8 @703 + RtlSecondsSince1970ToTime@8 @704 + RtlSecondsSince1980ToTime@8 @705 + RtlSelfRelativeToAbsoluteSD2@8 @706 + RtlSelfRelativeToAbsoluteSD@44 @707 + RtlSetAllBits@4 @708 + RtlSetAttributesSecurityDescriptor@12 @709 + RtlSetBits@12 @710 + RtlSetControlSecurityDescriptor@12 @711 + RtlSetCriticalSectionSpinCount@8 @712 + RtlSetCurrentDirectory_U@4 @713 + RtlSetCurrentEnvironment@8 @714 + RtlSetDaclSecurityDescriptor@16 @715 + RtlSetEnvironmentVariable@12 @716 + RtlSetGroupSecurityDescriptor@12 @717 + RtlSetHeapInformation@16 @718 + RtlSetInformationAcl@16 @719 + RtlSetIoCompletionCallback@12 @720 + RtlSetLastWin32Error@4 @721 + RtlSetLastWin32ErrorAndNtStatusFromNtStatus@4 @722 + RtlSetOwnerSecurityDescriptor@12 @723 + RtlSetProcessIsCritical@12 @724 + RtlSetSaclSecurityDescriptor@16 @725 + RtlSetSecurityDescriptorRMControl@8 @726 + RtlSetSecurityObject@20 @727 + RtlSetTimeZoneInformation@4 @728 + RtlSetUnhandledExceptionFilter@4 @729 + RtlSetUserFlagsHeap@20 @730 + RtlSetUserValueHeap@16 @731 + RtlSizeHeap@12 @732 + RtlSleepConditionVariableCS@12 @733 + RtlSleepConditionVariableSRW@16 @734 + RtlSplay@4 @735 + RtlStringFromGUID@8 @736 + RtlSubAuthorityCountSid@4 @737 + RtlSubAuthoritySid@8 @738 + RtlSubtreePredecessor@4 @739 + RtlSubtreeSuccessor@4 @740 + RtlSystemTimeToLocalTime@8 @741 + RtlTimeFieldsToTime@8 @742 + RtlTimeToElapsedTimeFields@8 @743 + RtlTimeToSecondsSince1970@8 @744 + RtlTimeToSecondsSince1980@8 @745 + RtlTimeToTimeFields@8 @746 + RtlTryEnterCriticalSection@4 @747 + @RtlUlongByteSwap@4 @748 + @RtlUlonglongByteSwap@8 @749 + RtlUnhandledExceptionFilter@4 @750 + RtlUnicodeStringToAnsiString@12 @751 + RtlUnicodeStringToCountedOemString@12 @752 + RtlUnicodeStringToInteger@12 @753 + RtlUnicodeStringToOemString@12 @754 + RtlUnicodeToCustomCPN@24 @755 + RtlUnicodeToMultiByteN@20 @756 + RtlUnicodeToMultiByteSize@12 @757 + RtlUnicodeToOemN@20 @758 + RtlUniform@4 @759 + RtlUnlockBootStatusData@4 @760 + RtlUnlockHeap@4 @761 + RtlUnwind@16 @762 + RtlUpcaseUnicodeChar@4 @763 + RtlUpcaseUnicodeString@12 @764 + RtlUpcaseUnicodeStringToAnsiString@12 @765 + RtlUpcaseUnicodeStringToCountedOemString@12 @766 + RtlUpcaseUnicodeStringToOemString@12 @767 + RtlUpcaseUnicodeToCustomCPN@24 @768 + RtlUpcaseUnicodeToMultiByteN@20 @769 + RtlUpcaseUnicodeToOemN@20 @770 + RtlUpdateTimer@16 @771 + RtlUpperChar@4 @772 + RtlUpperString@8 @773 + RtlUsageHeap@12 @774 + @RtlUshortByteSwap@4 @775 + RtlValidAcl@4 @776 + RtlValidRelativeSecurityDescriptor@12 @777 + RtlValidSecurityDescriptor@4 @778 + RtlValidSid@4 @779 + RtlValidateHeap@12 @780 + RtlValidateProcessHeaps@0 @781 + RtlValidateUnicodeString@8 @782 + RtlVerifyVersionInfo@16 @783 + RtlWalkFrameChain@12 @784 + RtlWalkHeap@8 @785 + RtlWakeAllConditionVariable@4 @786 + RtlWakeConditionVariable@4 @787 + RtlWriteRegistryValue@24 @788 + RtlZeroHeap@8 @789 + RtlZeroMemory@8 @790 + RtlZombifyActivationContext@4 @791 + RtlpEnsureBufferSize@12 @792 + RtlpNtCreateKey@24 @793 + RtlpNtEnumerateSubKey@16 @794 + RtlpNtMakeTemporaryKey@4 @795 + RtlpNtOpenKey@16 @796 + RtlpNtQueryValueKey@20 @797 + RtlpNtSetValueKey@16 @798 + RtlpUnWaitCriticalSection@4 @799 + RtlpWaitForCriticalSection@4 @800 + RtlxAnsiStringToUnicodeSize@4 @801 + RtlxOemStringToUnicodeSize@4 @802 + RtlxUnicodeStringToAnsiSize@4 @803 + RtlxUnicodeStringToOemSize@4 @804 + VerSetConditionMask@16 @805 + ZwAcceptConnectPort@24=NtAcceptConnectPort@24 @806 + ZwAccessCheck@32=NtAccessCheck@32 @807 + ZwAccessCheckAndAuditAlarm@44=NtAccessCheckAndAuditAlarm@44 @808 + ZwAccessCheckByType@44=NtAccessCheckByType@44 @809 + ZwAccessCheckByTypeAndAuditAlarm@64=NtAccessCheckByTypeAndAuditAlarm@64 @810 + ZwAccessCheckByTypeResultList@44=NtAccessCheckByTypeResultList@44 @811 + ZwAccessCheckByTypeResultListAndAuditAlarm@64=NtAccessCheckByTypeResultListAndAuditAlarm@64 @812 + ZwAccessCheckByTypeResultListAndAuditAlarmByHandle@68=NtAccessCheckByTypeResultListAndAuditAlarmByHandle@68 @813 + ZwAddAtom@12=NtAddAtom@12 @814 + ZwAddBootEntry@8 @815 + ZwAdjustGroupsToken@24=NtAdjustGroupsToken@24 @816 + ZwAdjustPrivilegesToken@24=NtAdjustPrivilegesToken@24 @817 + ZwAlertResumeThread@8=NtAlertResumeThread@8 @818 + ZwAlertThread@4=NtAlertThread@4 @819 + ZwAllocateLocallyUniqueId@4=NtAllocateLocallyUniqueId@4 @820 + ZwAllocateUserPhysicalPages@12 @821 + ZwAllocateUuids@16=NtAllocateUuids@16 @822 + ZwAllocateVirtualMemory@24=NtAllocateVirtualMemory@24 @823 + ZwAreMappedFilesTheSame@8=NtAreMappedFilesTheSame@8 @824 + ZwAssignProcessToJobObject@8=NtAssignProcessToJobObject@8 @825 + ZwCallbackReturn@12 @826 + ZwCancelDeviceWakeupRequest@4 @827 + ZwCancelIoFile@8=NtCancelIoFile@8 @828 + ZwCancelTimer@8=NtCancelTimer@8 @829 + ZwClearEvent@4=NtClearEvent@4 @830 + ZwClose@4=NtClose@4 @831 + ZwCloseObjectAuditAlarm@12 @832 + ZwCompactKeys@8=NtCompactKeys@8 @833 + ZwCompareTokens@12=NtCompareTokens@12 @834 + ZwCompleteConnectPort@4=NtCompleteConnectPort@4 @835 + ZwCompressKey@4=NtCompressKey@4 @836 + ZwConnectPort@32=NtConnectPort@32 @837 + ZwContinue@8=NtContinue@8 @838 + ZwCreateDebugObject@16=NtCreateDebugObject@16 @839 + ZwCreateDirectoryObject@12=NtCreateDirectoryObject@12 @840 + ZwCreateEvent@20=NtCreateEvent@20 @841 + ZwCreateEventPair@12=NtCreateEventPair@12 @842 + ZwCreateFile@44=NtCreateFile@44 @843 + ZwCreateIoCompletion@16=NtCreateIoCompletion@16 @844 + ZwCreateJobObject@12=NtCreateJobObject@12 @845 + ZwCreateJobSet@12=NtCreateJobSet@12 @846 + ZwCreateKey@28=NtCreateKey@28 @847 + ZwCreateKeyedEvent@16=NtCreateKeyedEvent@16 @848 + ZwCreateMailslotFile@32=NtCreateMailslotFile@32 @849 + ZwCreateMutant@16=NtCreateMutant@16 @850 + ZwCreateNamedPipeFile@56=NtCreateNamedPipeFile@56 @851 + ZwCreatePagingFile@16=NtCreatePagingFile@16 @852 + ZwCreatePort@20=NtCreatePort@20 @853 + ZwCreateProcess@32 @854 + ZwCreateProcessEx@36=NtCreateProcessEx@36 @855 + ZwCreateProfile@36=NtCreateProfile@36 @856 + ZwCreateSection@28=NtCreateSection@28 @857 + ZwCreateSemaphore@20=NtCreateSemaphore@20 @858 + ZwCreateSymbolicLinkObject@16=NtCreateSymbolicLinkObject@16 @859 + ZwCreateThread@32 @860 + ZwCreateTimer@16=NtCreateTimer@16 @861 + ZwCreateToken@52 @862 + ZwCreateWaitablePort@20=NtCreateWaitablePort@20 @863 + ZwDebugActiveProcess@8=NtDebugActiveProcess@8 @864 + ZwDebugContinue@12=NtDebugContinue@12 @865 + ZwDelayExecution@8=NtDelayExecution@8 @866 + ZwDeleteAtom@4=NtDeleteAtom@4 @867 + ZwDeleteBootEntry@4=NtDeleteBootEntry@4 @868 + ZwDeleteFile@4=NtDeleteFile@4 @869 + ZwDeleteKey@4=NtDeleteKey@4 @870 + ZwDeleteObjectAuditAlarm@12 @871 + ZwDeleteValueKey@8=NtDeleteValueKey@8 @872 + ZwDeviceIoControlFile@40=NtDeviceIoControlFile@40 @873 + ZwDisplayString@4=NtDisplayString@4 @874 + ZwDuplicateObject@28=NtDuplicateObject@28 @875 + ZwDuplicateToken@24=NtDuplicateToken@24 @876 + ZwEnumerateBootEntries@8 @877 + ZwEnumerateKey@24=NtEnumerateKey@24 @878 + ZwEnumerateSystemEnvironmentValuesEx@12=NtEnumerateSystemEnvironmentValuesEx@12 @879 + ZwEnumerateValueKey@24=NtEnumerateValueKey@24 @880 + ZwExtendSection@8=NtExtendSection@8 @881 + ZwFilterToken@24=NtFilterToken@24 @882 + ZwFindAtom@12=NtFindAtom@12 @883 + ZwFlushBuffersFile@8=NtFlushBuffersFile@8 @884 + ZwFlushInstructionCache@12=NtFlushInstructionCache@12 @885 + ZwFlushKey@4=NtFlushKey@4 @886 + ZwFlushVirtualMemory@16=NtFlushVirtualMemory@16 @887 + ZwFlushWriteBuffer@0 @888 + ZwFreeUserPhysicalPages@12 @889 + ZwFreeVirtualMemory@16=NtFreeVirtualMemory@16 @890 + ZwFsControlFile@40=NtFsControlFile@40 @891 + ZwGetContextThread@8=NtGetContextThread@8 @892 + ZwGetCurrentProcessorNumber@0 @893 + ZwGetDevicePowerState@8 @894 + ZwGetPlugPlayEvent@16 @895 + ZwGetWriteWatch@28=NtGetWriteWatch@28 @896 + ZwImpersonateAnonymousToken@4 @897 + ZwImpersonateClientOfPort@8=NtImpersonateClientOfPort@8 @898 + ZwImpersonateThread@12=NtImpersonateThread@12 @899 + ZwInitializeRegistry@4 @900 + ZwInitiatePowerAction@16=NtInitiatePowerAction@16 @901 + ZwIsProcessInJob@8=NtIsProcessInJob@8 @902 + ZwIsSystemResumeAutomatic@0 @903 + ZwListenPort@8=NtListenPort@8 @904 + ZwLoadDriver@4=NtLoadDriver@4 @905 + ZwLoadKey2@12=NtLoadKey2@12 @906 + ZwLoadKey@8=NtLoadKey@8 @907 + ZwLockFile@40=NtLockFile@40 @908 + ZwLockProductActivationKeys@8=NtLockProductActivationKeys@8 @909 + ZwLockRegistryKey@4=NtLockRegistryKey@4 @910 + ZwLockVirtualMemory@16=NtLockVirtualMemory@16 @911 + ZwMakePermanentObject@4=NtMakePermanentObject@4 @912 + ZwMakeTemporaryObject@4=NtMakeTemporaryObject@4 @913 + ZwMapUserPhysicalPages@12 @914 + ZwMapUserPhysicalPagesScatter@12 @915 + ZwMapViewOfSection@40=NtMapViewOfSection@40 @916 + ZwModifyBootEntry@4=NtModifyBootEntry@4 @917 + ZwNotifyChangeDirectoryFile@36=NtNotifyChangeDirectoryFile@36 @918 + ZwNotifyChangeKey@40=NtNotifyChangeKey@40 @919 + ZwNotifyChangeMultipleKeys@48=NtNotifyChangeMultipleKeys@48 @920 + ZwOpenDirectoryObject@12=NtOpenDirectoryObject@12 @921 + ZwOpenEvent@12=NtOpenEvent@12 @922 + ZwOpenEventPair@12=NtOpenEventPair@12 @923 + ZwOpenFile@24=NtOpenFile@24 @924 + ZwOpenIoCompletion@12=NtOpenIoCompletion@12 @925 + ZwOpenJobObject@12=NtOpenJobObject@12 @926 + ZwOpenKey@12=NtOpenKey@12 @927 + ZwOpenKeyedEvent@12=NtOpenKeyedEvent@12 @928 + ZwOpenMutant@12=NtOpenMutant@12 @929 + ZwOpenObjectAuditAlarm@48 @930 + ZwOpenProcess@16=NtOpenProcess@16 @931 + ZwOpenProcessToken@12=NtOpenProcessToken@12 @932 + ZwOpenProcessTokenEx@16=NtOpenProcessTokenEx@16 @933 + ZwOpenSection@12=NtOpenSection@12 @934 + ZwOpenSemaphore@12=NtOpenSemaphore@12 @935 + ZwOpenSymbolicLinkObject@12=NtOpenSymbolicLinkObject@12 @936 + ZwOpenThread@16=NtOpenThread@16 @937 + ZwOpenThreadToken@16=NtOpenThreadToken@16 @938 + ZwOpenThreadTokenEx@20=NtOpenThreadTokenEx@20 @939 + ZwOpenTimer@12=NtOpenTimer@12 @940 + ZwPlugPlayControl@12 @941 + ZwPowerInformation@20=NtPowerInformation@20 @942 + ZwPrivilegeCheck@12=NtPrivilegeCheck@12 @943 + ZwPrivilegeObjectAuditAlarm@24 @944 + ZwPrivilegedServiceAuditAlarm@20 @945 + ZwProtectVirtualMemory@20=NtProtectVirtualMemory@20 @946 + ZwPulseEvent@8=NtPulseEvent@8 @947 + ZwQueryAttributesFile@8=NtQueryAttributesFile@8 @948 + ZwQueryBootEntryOrder@8=NtQueryBootEntryOrder@8 @949 + ZwQueryBootOptions@8=NtQueryBootOptions@8 @950 + ZwQueryDebugFilterState@8=NtQueryDebugFilterState@8 @951 + ZwQueryDefaultLocale@8=NtQueryDefaultLocale@8 @952 + ZwQueryDefaultUILanguage@4=NtQueryDefaultUILanguage@4 @953 + ZwQueryDirectoryFile@44=NtQueryDirectoryFile@44 @954 + ZwQueryDirectoryObject@28=NtQueryDirectoryObject@28 @955 + ZwQueryEaFile@36=NtQueryEaFile@36 @956 + ZwQueryEvent@20=NtQueryEvent@20 @957 + ZwQueryFullAttributesFile@8=NtQueryFullAttributesFile@8 @958 + ZwQueryInformationAtom@20=NtQueryInformationAtom@20 @959 + ZwQueryInformationFile@20=NtQueryInformationFile@20 @960 + ZwQueryInformationJobObject@20=NtQueryInformationJobObject@20 @961 + ZwQueryInformationPort@20=NtQueryInformationPort@20 @962 + ZwQueryInformationProcess@20=NtQueryInformationProcess@20 @963 + ZwQueryInformationThread@20=NtQueryInformationThread@20 @964 + ZwQueryInformationToken@20=NtQueryInformationToken@20 @965 + ZwQueryInstallUILanguage@4=NtQueryInstallUILanguage@4 @966 + ZwQueryIntervalProfile@8=NtQueryIntervalProfile@8 @967 + ZwQueryIoCompletion@20=NtQueryIoCompletion@20 @968 + ZwQueryKey@20=NtQueryKey@20 @969 + ZwQueryMultipleValueKey@24=NtQueryMultipleValueKey@24 @970 + ZwQueryMutant@20=NtQueryMutant@20 @971 + ZwQueryObject@20=NtQueryObject@20 @972 + ZwQueryOpenSubKeys@8=NtQueryOpenSubKeys@8 @973 + ZwQueryPerformanceCounter@8=NtQueryPerformanceCounter@8 @974 + ZwQueryPortInformationProcess@0=NtQueryPortInformationProcess@0 @975 + ZwQueryQuotaInformationFile@36=NtQueryQuotaInformationFile@36 @976 + ZwQuerySection@20=NtQuerySection@20 @977 + ZwQuerySecurityObject@20=NtQuerySecurityObject@20 @978 + ZwQuerySemaphore@20=NtQuerySemaphore@20 @979 + ZwQuerySymbolicLinkObject@12=NtQuerySymbolicLinkObject@12 @980 + ZwQuerySystemEnvironmentValue@16=NtQuerySystemEnvironmentValue@16 @981 + ZwQuerySystemEnvironmentValueEx@20=NtQuerySystemEnvironmentValueEx@20 @982 + ZwQuerySystemInformation@16=NtQuerySystemInformation@16 @983 + ZwQuerySystemTime@4=NtQuerySystemTime@4 @984 + ZwQueryTimer@20=NtQueryTimer@20 @985 + ZwQueryTimerResolution@12=NtQueryTimerResolution@12 @986 + ZwQueryValueKey@24=NtQueryValueKey@24 @987 + ZwQueryVirtualMemory@24=NtQueryVirtualMemory@24 @988 + ZwQueryVolumeInformationFile@20=NtQueryVolumeInformationFile@20 @989 + ZwQueueApcThread@20=NtQueueApcThread@20 @990 + ZwRaiseException@12=NtRaiseException@12 @991 + ZwRaiseHardError@24=NtRaiseHardError@24 @992 + ZwReadFile@36=NtReadFile@36 @993 + ZwReadFileScatter@36=NtReadFileScatter@36 @994 + ZwReadRequestData@24=NtReadRequestData@24 @995 + ZwReadVirtualMemory@20=NtReadVirtualMemory@20 @996 + ZwRegisterThreadTerminatePort@4=NtRegisterThreadTerminatePort@4 @997 + ZwReleaseKeyedEvent@16=NtReleaseKeyedEvent@16 @998 + ZwReleaseMutant@8=NtReleaseMutant@8 @999 + ZwReleaseSemaphore@12=NtReleaseSemaphore@12 @1000 + ZwRemoveIoCompletion@20=NtRemoveIoCompletion@20 @1001 + ZwRemoveProcessDebug@8=NtRemoveProcessDebug@8 @1002 + ZwRenameKey@8=NtRenameKey@8 @1003 + ZwReplaceKey@12=NtReplaceKey@12 @1004 + ZwReplyPort@8=NtReplyPort@8 @1005 + ZwReplyWaitReceivePort@16=NtReplyWaitReceivePort@16 @1006 + ZwReplyWaitReceivePortEx@20 @1007 + ZwReplyWaitReplyPort@8 @1008 + ZwRequestDeviceWakeup@4 @1009 + ZwRequestPort@8 @1010 + ZwRequestWaitReplyPort@12 @1011 + ZwRequestWakeupLatency@4 @1012 + ZwResetEvent@8 @1013 + ZwResetWriteWatch@12 @1014 + ZwRestoreKey@12 @1015 + ZwResumeProcess@4 @1016 + ZwResumeThread@8 @1017 + ZwSaveKey@8 @1018 + ZwSaveKeyEx@12 @1019 + ZwSaveMergedKeys@12 @1020 + ZwSecureConnectPort@36 @1021 + ZwSetBootEntryOrder@8 @1022 + ZwSetBootOptions@8 @1023 + ZwSetContextThread@8 @1024 + ZwSetDebugFilterState@12 @1025 + ZwSetDefaultHardErrorPort@4 @1026 + ZwSetDefaultLocale@8 @1027 + ZwSetDefaultUILanguage@4 @1028 + ZwSetEaFile@16 @1029 + ZwSetEvent@8 @1030 + ZwSetEventBoostPriority@4 @1031 + ZwSetHighEventPair@4 @1032 + ZwSetHighWaitLowEventPair@4 @1033 + ZwSetInformationDebugObject@20 @1034 + ZwSetInformationFile@20 @1035 + ZwSetInformationJobObject@16 @1036 + ZwSetInformationKey@16 @1037 + ZwSetInformationObject@16 @1038 + ZwSetInformationProcess@16 @1039 + ZwSetInformationThread@16 @1040 + ZwSetInformationToken@16 @1041 + ZwSetIntervalProfile@8 @1042 + ZwSetIoCompletion@20 @1043 + ZwSetLdtEntries@24 @1044 + ZwSetLowEventPair@4 @1045 + ZwSetLowWaitHighEventPair@4 @1046 + ZwSetQuotaInformationFile@16 @1047 + ZwSetSecurityObject@12 @1048 + ZwSetSystemEnvironmentValue@8 @1049 + ZwSetSystemEnvironmentValueEx@8 @1050 + ZwSetSystemInformation@12 @1051 + ZwSetSystemPowerState@12 @1052 + ZwSetSystemTime@8 @1053 + ZwSetThreadExecutionState@8 @1054 + ZwSetTimer@28 @1055 + ZwSetTimerResolution@12 @1056 + ZwSetUuidSeed@4 @1057 + ZwSetValueKey@24 @1058 + ZwSetVolumeInformationFile@20 @1059 + ZwShutdownSystem@4 @1060 + ZwSignalAndWaitForSingleObject@16 @1061 + ZwStartProfile@4 @1062 + ZwStopProfile@4 @1063 + ZwSuspendProcess@4 @1064 + ZwSuspendThread@8 @1065 + ZwSystemDebugControl@24 @1066 + ZwTerminateJobObject@8 @1067 + ZwTerminateProcess@8 @1068 + ZwTerminateThread@8 @1069 + ZwTestAlert@0 @1070 + ZwTraceEvent@16 @1071 + ZwTranslateFilePath@16 @1072 + ZwUnloadDriver@4 @1073 + ZwUnloadKey@4 @1074 + ZwUnloadKeyEx@8 @1075 + ZwUnlockFile@20 @1076 + ZwUnlockVirtualMemory@16 @1077 + ZwUnmapViewOfSection@8 @1078 + ZwVdmControl@8 @1079 + ZwWaitForDebugEvent@16 @1080 + ZwWaitForKeyedEvent@16 @1081 + ZwWaitForMultipleObjects@20 @1082 + ZwWaitForSingleObject@12 @1083 + ZwWaitHighEventPair@4 @1084 + ZwWaitLowEventPair@4 @1085 + ZwWriteFile@36 @1086 + ZwWriteFileGather@36 @1087 + ZwWriteRequestData@24 @1088 + ZwWriteVirtualMemory@20 @1089 + ZwYieldExecution@0 @1090 + __isascii @1091 + __iscsym @1092 + __iscsymf @1093 + __toascii @1094 + _alldiv @1095 + _alldvrm @1096 + _allmul @1097 + _alloca_probe @1098 + _allrem @1099 + _allshl @1100 + _allshr @1101 + _atoi64 @1102 + _aulldiv @1103 + _aulldvrm @1104 + _aullrem @1105 + _aullshr @1106 + _chkstk @1107 + _fltused @1108 + _ftol @1109 + _i64toa @1110 + _i64tow @1111 + _itoa @1112 + _itow @1113 + _lfind @1114 + _ltoa @1115 + _ltow @1116 + _memccpy @1117 + _memicmp @1118 + _snprintf @1119 + _snwprintf @1120 + _splitpath @1121 + _strcmpi=_stricmp @1122 + _stricmp @1123 + _strlwr @1124 + _strnicmp @1125 + _strupr @1126 + _tolower @1127 + _toupper @1128 + _ui64toa @1129 + _ui64tow @1130 + _ultoa @1131 + _ultow @1132 + _vsnprintf @1133 + _vsnwprintf @1134 + _wcsicmp @1135 + _wcslwr @1136 + _wcsnicmp @1137 + _wcsupr @1138 + _wtoi @1139 + _wtoi64 @1140 + _wtol @1141 + abs @1142 + atan @1143 + atoi @1144 + atol @1145 + bsearch @1146 + ceil @1147 + cos @1148 + fabs @1149 + floor @1150 + isalnum @1151 + isalpha @1152 + iscntrl @1153 + isdigit @1154 + isgraph @1155 + islower @1156 + isprint @1157 + ispunct @1158 + isspace @1159 + isupper @1160 + iswalpha @1161 + iswctype @1162 + iswdigit @1163 + iswlower @1164 + iswspace @1165 + iswxdigit @1166 + isxdigit @1167 + labs @1168 + log @1169 + mbstowcs @1170 + memchr @1171 + memcmp @1172 + memcpy=memmove @1173 + memmove @1174 + memset @1175 + pow @1176 + qsort @1177 + sin @1178 + sprintf @1179 + sqrt @1180 + sscanf @1181 + strcat @1182 + strchr @1183 + strcmp @1184 + strcpy @1185 + strcspn @1186 + strlen @1187 + strncat @1188 + strncmp @1189 + strncpy @1190 + strpbrk @1191 + strrchr @1192 + strspn @1193 + strstr @1194 + strtol @1195 + strtoul @1196 + swprintf @1197 + tan @1198 + tolower @1199 + toupper @1200 + towlower @1201 + towupper @1202 + vDbgPrintEx@16 @1203 + vDbgPrintExWithPrefix@20 @1204 + vsprintf @1205 + wcscat @1206 + wcschr @1207 + wcscmp @1208 + wcscpy @1209 + wcscspn @1210 + wcslen @1211 + wcsncat @1212 + wcsncmp @1213 + wcsncpy @1214 + wcspbrk @1215 + wcsrchr @1216 + wcsspn @1217 + wcsstr @1218 + wcstol @1219 + wcstombs @1220 + wcstoul @1221 diff --git a/dll/ntdll/def/ntdll.pspec b/dll/ntdll/def/ntdll.pspec index e8a703cc9de..f9027dda2a1 100644 --- a/dll/ntdll/def/ntdll.pspec +++ b/dll/ntdll/def/ntdll.pspec @@ -62,6 +62,9 @@ @ stdcall -arch=i386 KiFastSystemCall() @ stdcall -arch=i386 KiFastSystemCallRet() @ stdcall -arch=i386 KiIntSystemCall() +@ stdcall -arch=i386 ExpInterlockedPopEntrySListEnd() +@ stdcall -arch=i386 ExpInterlockedPopEntrySListFault() +@ stdcall -arch=i386 ExpInterlockedPopEntrySListResume() @ stdcall KiRaiseUserExceptionDispatcher() @ stdcall KiUserApcDispatcher(ptr ptr ptr ptr) @ stdcall KiUserCallbackDispatcher(ptr ptr long) // CHECKME @@ -894,7 +897,7 @@ //@ stdcall RtlSetTimer @ stdcall RtlSetUnhandledExceptionFilter(ptr) //@ stdcall RtlSetUnicodeCallouts -@ stdcall RtlSetUserFlagsHeap(ptr long ptr long) +@ stdcall RtlSetUserFlagsHeap(ptr long ptr long long) @ stdcall RtlSetUserValueHeap(ptr long ptr ptr) @ stdcall RtlSizeHeap(long long ptr) @ stdcall RtlSleepConditionVariableCS(ptr ptr ptr) diff --git a/dll/ntdll/ldr/startup.c b/dll/ntdll/ldr/startup.c index 49a4a2c8527..83cea3032f8 100644 --- a/dll/ntdll/ldr/startup.c +++ b/dll/ntdll/ldr/startup.c @@ -71,11 +71,13 @@ LoadImageFileExecutionOptions(PPEB Peb) { NTSTATUS Status = STATUS_SUCCESS; ULONG Value = 0; - UNICODE_STRING ValueString; UNICODE_STRING ImageName; UNICODE_STRING ImagePathName; - WCHAR ValueBuffer[64]; ULONG ValueSize; + extern ULONG RtlpPageHeapGlobalFlags, RtlpPageHeapSizeRangeStart, RtlpPageHeapSizeRangeEnd; + extern ULONG RtlpPageHeapDllRangeStart, RtlpPageHeapDllRangeEnd; + extern WCHAR RtlpPageHeapTargetDlls[512]; + extern BOOLEAN RtlpPageHeapEnabled; if (Peb->ProcessParameters && Peb->ProcessParameters->ImagePathName.Length > 0) @@ -106,26 +108,84 @@ LoadImageFileExecutionOptions(PPEB Peb) /* global flag */ Status = LdrQueryImageFileExecutionOptions(&ImageName, L"GlobalFlag", - REG_SZ, - (PVOID)ValueBuffer, - sizeof(ValueBuffer), + REG_DWORD, + (PVOID)&Value, + sizeof(Value), &ValueSize); if (NT_SUCCESS(Status)) { - ValueString.Buffer = ValueBuffer; - ValueString.Length = ValueSize - sizeof(WCHAR); - ValueString.MaximumLength = sizeof(ValueBuffer); - Status = RtlUnicodeStringToInteger(&ValueString, 16, &Value); - if (NT_SUCCESS(Status)) + Peb->NtGlobalFlag = Value; + DPRINT("GlobalFlag: Value=0x%lx\n", Value); + } + else + { + /* Add debugging flags if there is no GlobalFlags override */ + if (Peb->BeingDebugged) { - Peb->NtGlobalFlag |= Value; - DPRINT("GlobalFlag: Key='%S', Value=0x%lx\n", ValueBuffer, Value); + Peb->NtGlobalFlag |= FLG_HEAP_VALIDATE_PARAMETERS | + FLG_HEAP_ENABLE_FREE_CHECK | + FLG_HEAP_ENABLE_TAIL_CHECK; } } - /* - * FIXME: - * read more options - */ + + /* Handle the case when page heap is enabled */ + if (Peb->NtGlobalFlag & FLG_HEAP_PAGE_ALLOCS) + { + /* Disable all heap debugging flags so that no heap call goes via page heap branch */ + Peb->NtGlobalFlag &= ~(FLG_HEAP_VALIDATE_PARAMETERS | + FLG_HEAP_VALIDATE_ALL | + FLG_HEAP_ENABLE_FREE_CHECK | + FLG_HEAP_ENABLE_TAIL_CHECK | + FLG_USER_STACK_TRACE_DB | + FLG_HEAP_ENABLE_TAGGING | + FLG_HEAP_ENABLE_TAG_BY_DLL); + + /* Get page heap flags without checking return value */ + LdrQueryImageFileExecutionOptions(&ImageName, + L"PageHeapFlags", + REG_DWORD, + (PVOID)&RtlpPageHeapGlobalFlags, + sizeof(RtlpPageHeapGlobalFlags), + &ValueSize); + + LdrQueryImageFileExecutionOptions(&ImageName, + L"PageHeapSizeRangeStart", + REG_DWORD, + (PVOID)&RtlpPageHeapSizeRangeStart, + sizeof(RtlpPageHeapSizeRangeStart), + &ValueSize); + + LdrQueryImageFileExecutionOptions(&ImageName, + L"PageHeapSizeRangeEnd", + REG_DWORD, + (PVOID)&RtlpPageHeapSizeRangeEnd, + sizeof(RtlpPageHeapSizeRangeEnd), + &ValueSize); + + LdrQueryImageFileExecutionOptions(&ImageName, + L"PageHeapDllRangeStart", + REG_DWORD, + (PVOID)&RtlpPageHeapDllRangeStart, + sizeof(RtlpPageHeapDllRangeStart), + &ValueSize); + + LdrQueryImageFileExecutionOptions(&ImageName, + L"PageHeapDllRangeEnd", + REG_DWORD, + (PVOID)&RtlpPageHeapDllRangeEnd, + sizeof(RtlpPageHeapDllRangeEnd), + &ValueSize); + + LdrQueryImageFileExecutionOptions(&ImageName, + L"PageHeapTargetDlls", + REG_SZ, + (PVOID)RtlpPageHeapTargetDlls, + sizeof(RtlpPageHeapTargetDlls), + &ValueSize); + + /* Now when all parameters are read, enable page heap */ + RtlpPageHeapEnabled = TRUE; + } } } @@ -323,6 +383,9 @@ LdrpInit2(PCONTEXT Context, /* Initialize Critical Section Data */ RtlpInitDeferedCriticalSection(); + /* Load execution options */ + LoadImageFileExecutionOptions(Peb); + /* create process heap */ RtlInitializeHeapManager(); Peb->ProcessHeap = RtlCreateHeap(HEAP_GROWABLE, @@ -387,9 +450,6 @@ LdrpInit2(PCONTEXT Context, /* Load compatibility settings */ LoadCompatibilitySettings(Peb); - /* Load execution options */ - LoadImageFileExecutionOptions(Peb); - /* build full ntdll path */ wcscpy(FullNtDllPath, SharedUserData->NtSystemRoot); wcscat(FullNtDllPath, L"\\system32\\ntdll.dll"); @@ -429,7 +489,7 @@ LdrpInit2(PCONTEXT Context, /* add entry for executable (becomes first list entry) */ ExeModule = (PLDR_DATA_TABLE_ENTRY) RtlAllocateHeap(Peb->ProcessHeap, - 0, + HEAP_ZERO_MEMORY, sizeof(LDR_DATA_TABLE_ENTRY)); if (ExeModule == NULL) { diff --git a/dll/ntdll/ldr/utils.c b/dll/ntdll/ldr/utils.c index fcbd21f800d..30373f35848 100644 --- a/dll/ntdll/ldr/utils.c +++ b/dll/ntdll/ldr/utils.c @@ -3337,6 +3337,7 @@ LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey, OUT PULONG ReturnedLength OPTIONAL) { PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; + CHAR KeyInfoBuffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 32]; OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING ValueNameString; UNICODE_STRING KeyName; @@ -3377,15 +3378,8 @@ LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey, return Status; } - KeyInfoSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 32; - KeyInfo = RtlAllocateHeap (RtlGetProcessHeap(), - HEAP_ZERO_MEMORY, - KeyInfoSize); - if (KeyInfo == NULL) - { - NtClose (KeyHandle); - return STATUS_INSUFFICIENT_RESOURCES; - } + KeyInfoSize = sizeof(KeyInfoBuffer); + KeyInfo = (PKEY_VALUE_PARTIAL_INFORMATION)KeyInfoBuffer; RtlInitUnicodeString (&ValueNameString, (PWSTR)ValueName); @@ -3397,10 +3391,13 @@ LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey, &ResultSize); if (Status == STATUS_BUFFER_OVERFLOW) { + /* We can allocate only if there is a process heap already */ + if (!RtlGetProcessHeap()) + { + NtClose (KeyHandle); + return STATUS_NO_MEMORY; + } KeyInfoSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + KeyInfo->DataLength; - RtlFreeHeap (RtlGetProcessHeap(), - 0, - KeyInfo); KeyInfo = RtlAllocateHeap (RtlGetProcessHeap(), HEAP_ZERO_MEMORY, KeyInfoSize); @@ -3421,7 +3418,7 @@ LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey, if (!NT_SUCCESS(Status)) { - if (KeyInfo != NULL) + if ((PCHAR)KeyInfo != KeyInfoBuffer) { RtlFreeHeap (RtlGetProcessHeap(), 0, @@ -3432,9 +3429,12 @@ LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey, if (KeyInfo->Type != Type) { - RtlFreeHeap (RtlGetProcessHeap(), - 0, - KeyInfo); + if ((PCHAR)KeyInfo != KeyInfoBuffer) + { + RtlFreeHeap (RtlGetProcessHeap(), + 0, + KeyInfo); + } return STATUS_OBJECT_TYPE_MISMATCH; } @@ -3451,9 +3451,12 @@ LdrQueryImageFileExecutionOptions (IN PUNICODE_STRING SubKey, &KeyInfo->Data, ResultSize); - RtlFreeHeap (RtlGetProcessHeap(), - 0, - KeyInfo); + if ((PCHAR)KeyInfo != KeyInfoBuffer) + { + RtlFreeHeap (RtlGetProcessHeap(), + 0, + KeyInfo); + } if (ReturnedLength != NULL) { diff --git a/dll/ntdll/rtl/libsupp.c b/dll/ntdll/rtl/libsupp.c index 47e4359e054..5237098df27 100644 --- a/dll/ntdll/rtl/libsupp.c +++ b/dll/ntdll/rtl/libsupp.c @@ -113,33 +113,33 @@ RtlGetNtGlobalFlags(VOID) NTSTATUS NTAPI RtlDeleteHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - return RtlDeleteCriticalSection(CriticalSection); + return RtlDeleteCriticalSection(&Lock->CriticalSection); } NTSTATUS NTAPI RtlEnterHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - return RtlEnterCriticalSection(CriticalSection); + return RtlEnterCriticalSection(&Lock->CriticalSection); } NTSTATUS NTAPI RtlInitializeHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - return RtlInitializeCriticalSection(CriticalSection); + return RtlInitializeCriticalSection(&Lock->CriticalSection); } NTSTATUS NTAPI RtlLeaveHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - return RtlLeaveCriticalSection(CriticalSection ); + return RtlLeaveCriticalSection(&Lock->CriticalSection); } PVOID diff --git a/dll/win32/advapi32/CMakeLists.txt b/dll/win32/advapi32/CMakeLists.txt index 922e989ec7d..d6e25b0e9f9 100644 --- a/dll/win32/advapi32/CMakeLists.txt +++ b/dll/win32/advapi32/CMakeLists.txt @@ -17,6 +17,7 @@ list(APPEND SOURCE crypt/crypt_md5.c crypt/crypt_sha.c misc/dllmain.c + misc/efs.c misc/hwprofiles.c misc/logon.c misc/msi.c diff --git a/dll/win32/advapi32/advapi32.spec b/dll/win32/advapi32/advapi32.spec index fe952b95616..810c1ab4754 100644 --- a/dll/win32/advapi32/advapi32.spec +++ b/dll/win32/advapi32/advapi32.spec @@ -345,12 +345,12 @@ @ stub LookupSecurityDescriptorPartsA @ stub LookupSecurityDescriptorPartsW @ stdcall LsaAddAccountRights(ptr ptr ptr long) -@ stub LsaAddPrivilegesToAccount +@ stdcall LsaAddPrivilegesToAccount(ptr ptr) @ stub LsaClearAuditLog @ stdcall LsaClose(ptr) -@ stub LsaCreateAccount +@ stdcall LsaCreateAccount(ptr ptr long ptr) @ stub LsaCreateSecret -@ stub LsaCreateTrustedDomain +@ stdcall LsaCreateTrustedDomain(ptr ptr long ptr) @ stdcall LsaCreateTrustedDomainEx(ptr ptr ptr long ptr) @ stdcall LsaDelete(ptr) @ stdcall LsaDeleteTrustedDomain(ptr ptr) @@ -377,8 +377,8 @@ @ stdcall LsaLookupPrivilegeValue(ptr ptr ptr) @ stdcall LsaLookupSids(ptr long ptr ptr ptr) @ stdcall LsaNtStatusToWinError(long) -@ stub LsaOpenAccount -@ stdcall LsaOpenPolicy(long long long long) +@ stdcall LsaOpenAccount(ptr ptr long ptr) +@ stdcall LsaOpenPolicy(ptr ptr long ptr) @ stub LsaOpenPolicySce @ stub LsaOpenSecret @ stub LsaOpenTrustedDomain @@ -395,10 +395,9 @@ @ stdcall LsaRemoveAccountRights(ptr ptr long ptr long) @ stub LsaRemovePrivilegesFromAccount @ stdcall LsaRetrievePrivateData(ptr ptr ptr) -# @ stub LsaSetDomainInformationPolicy -# @ stub LsaSetForestTrustInformation -@ stdcall LsaSetInformationPolicy(long long ptr) +@ stdcall LsaSetDomainInformationPolicy(ptr long ptr) @ stub LsaSetForestTrustInformation +@ stdcall LsaSetInformationPolicy(long long ptr) @ stub LsaSetInformationTrustedDomain @ stub LsaSetQuotasForAccount @ stdcall LsaSetSecret(ptr ptr ptr) diff --git a/dll/win32/advapi32/misc/efs.c b/dll/win32/advapi32/misc/efs.c new file mode 100644 index 00000000000..11fb8e588ed --- /dev/null +++ b/dll/win32/advapi32/misc/efs.c @@ -0,0 +1,85 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: dlls/win32/advapi32/misc/efs.c + * PURPOSE: Encrypted File System support + * PROGRAMMER: Christoph_vW + */ + +#include +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(advapi); + + +/* + * @implemented + */ +BOOL WINAPI +DecryptFileA(LPCSTR lpFileName, DWORD dwReserved) +{ + UNICODE_STRING FileName; + NTSTATUS Status; + BOOL ret; + + Status = RtlCreateUnicodeStringFromAsciiz(&FileName, lpFileName); + if (!NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + + ret = DecryptFileW(FileName.Buffer, dwReserved); + + if (FileName.Buffer != NULL) + RtlFreeUnicodeString(&FileName); + return ret; +} + + +/* + * @unimplemented + */ +BOOL WINAPI DecryptFileW(LPCWSTR lpFileName, DWORD dwReserved) +{ + FIXME("%s(%S) not implemented!\n", __FUNCTION__, lpFileName); + return TRUE; +} + + +/* + * @implemented + */ +BOOL WINAPI +EncryptFileA(LPCSTR lpFileName) +{ + UNICODE_STRING FileName; + NTSTATUS Status; + BOOL ret; + + Status = RtlCreateUnicodeStringFromAsciiz(&FileName, lpFileName); + if (!NT_SUCCESS(Status)) + { + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } + + ret = EncryptFileW(FileName.Buffer); + + if (FileName.Buffer != NULL) + RtlFreeUnicodeString(&FileName); + return ret; +} + + +/* + * @unimplemented + */ +BOOL WINAPI +EncryptFileW(LPCWSTR lpFileName) +{ + FIXME("%s() not implemented!\n", __FUNCTION__); + return TRUE; +} + +/* EOF */ diff --git a/dll/win32/advapi32/reg/reg.c b/dll/win32/advapi32/reg/reg.c index 26036dc1963..c6af98b5b4f 100644 --- a/dll/win32/advapi32/reg/reg.c +++ b/dll/win32/advapi32/reg/reg.c @@ -2793,14 +2793,14 @@ RegEnumValueA(HKEY hKey, status = NtEnumerateValueKey( KeyHandle, index, KeyValueFullInformation, buffer, total_size, &total_size ); - if (status && status != STATUS_BUFFER_OVERFLOW) goto done; + if (status && (status != STATUS_BUFFER_OVERFLOW) && (status != STATUS_BUFFER_TOO_SMALL)) goto done; /* we need to fetch the contents for a string type even if not requested, * because we need to compute the length of the ASCII string. */ if (value || data || is_string(info->Type)) { /* retry with a dynamically allocated buffer */ - while (status == STATUS_BUFFER_OVERFLOW) + while ((status == STATUS_BUFFER_OVERFLOW) || (status == STATUS_BUFFER_TOO_SMALL)) { if (buf_ptr != buffer) HeapFree( GetProcessHeap(), 0, buf_ptr ); if (!(buf_ptr = HeapAlloc( GetProcessHeap(), 0, total_size ))) @@ -2819,14 +2819,14 @@ RegEnumValueA(HKEY hKey, { ULONG len; RtlUnicodeToMultiByteSize( &len, (WCHAR *)(buf_ptr + info->DataOffset), - total_size - info->DataOffset ); + info->DataLength ); if (data && len) { if (len > *count) status = STATUS_BUFFER_OVERFLOW; else { RtlUnicodeToMultiByteN( (PCHAR)data, len, NULL, (WCHAR *)(buf_ptr + info->DataOffset), - total_size - info->DataOffset ); + info->DataLength ); /* if the type is REG_SZ and data is not 0-terminated * and there is enough space in the buffer NT appends a \0 */ if (len < *count && data[len-1]) data[len] = 0; @@ -2836,8 +2836,8 @@ RegEnumValueA(HKEY hKey, } else if (data) { - if (total_size - info->DataOffset > *count) status = STATUS_BUFFER_OVERFLOW; - else memcpy( data, buf_ptr + info->DataOffset, total_size - info->DataOffset ); + if (info->DataLength > *count) status = STATUS_BUFFER_OVERFLOW; + else memcpy( data, buf_ptr + info->DataOffset, info->DataLength ); } if (value && !status) @@ -2928,12 +2928,12 @@ RegEnumValueW(HKEY hKey, status = NtEnumerateValueKey( KeyHandle, index, KeyValueFullInformation, buffer, total_size, &total_size ); - if (status && status != STATUS_BUFFER_OVERFLOW) goto done; + if (status && (status != STATUS_BUFFER_OVERFLOW) && (status != STATUS_BUFFER_TOO_SMALL)) goto done; if (value || data) { /* retry with a dynamically allocated buffer */ - while (status == STATUS_BUFFER_OVERFLOW) + while ((status == STATUS_BUFFER_OVERFLOW) || (status == STATUS_BUFFER_TOO_SMALL)) { if (buf_ptr != buffer) HeapFree( GetProcessHeap(), 0, buf_ptr ); if (!(buf_ptr = HeapAlloc( GetProcessHeap(), 0, total_size ))) @@ -2962,17 +2962,17 @@ RegEnumValueW(HKEY hKey, if (data) { - if (total_size - info->DataOffset > *count) + if (info->DataLength > *count) { status = STATUS_BUFFER_OVERFLOW; goto overflow; } - memcpy( data, buf_ptr + info->DataOffset, total_size - info->DataOffset ); - if (total_size - info->DataOffset <= *count-sizeof(WCHAR) && is_string(info->Type)) + memcpy( data, buf_ptr + info->DataOffset, info->DataLength ); + if (is_string(info->Type) && info->DataLength <= *count - sizeof(WCHAR)) { /* if the type is REG_SZ and data is not 0-terminated * and there is enough space in the buffer NT appends a \0 */ - WCHAR *ptr = (WCHAR *)(data + total_size - info->DataOffset); + WCHAR *ptr = (WCHAR *)(data + info->DataLength); if (ptr > (WCHAR *)data && ptr[-1]) *ptr = 0; } } diff --git a/dll/win32/advapi32/sec/cred.c b/dll/win32/advapi32/sec/cred.c index e8e0283b2ee..cd74a6a17d0 100644 --- a/dll/win32/advapi32/sec/cred.c +++ b/dll/win32/advapi32/sec/cred.c @@ -103,16 +103,22 @@ static DWORD registry_read_credential(HKEY hkey, PCREDENTIALW credential, credential->TargetName = (LPWSTR)buffer; ret = RegQueryValueExW(hkey, NULL, 0, &type, (LPVOID)credential->TargetName, &count); - if (ret != ERROR_SUCCESS || type != REG_SZ) return ret; + if (ret != ERROR_SUCCESS) + return ret; + else if (type != REG_SZ) + return ERROR_REGISTRY_CORRUPT; buffer += count; } ret = RegQueryValueExW(hkey, wszCommentValue, 0, &type, NULL, &count); - if (ret != ERROR_FILE_NOT_FOUND && ret != ERROR_SUCCESS) - return ret; - else if (type != REG_SZ) - return ERROR_REGISTRY_CORRUPT; - *len += count; + if (ret != ERROR_FILE_NOT_FOUND) + { + if (ret != ERROR_SUCCESS) + return ret; + else if (type != REG_SZ) + return ERROR_REGISTRY_CORRUPT; + *len += count; + } if (credential) { credential->Comment = (LPWSTR)buffer; @@ -129,11 +135,14 @@ static DWORD registry_read_credential(HKEY hkey, PCREDENTIALW credential, } ret = RegQueryValueExW(hkey, wszTargetAliasValue, 0, &type, NULL, &count); - if (ret != ERROR_FILE_NOT_FOUND && ret != ERROR_SUCCESS) - return ret; - else if (type != REG_SZ) - return ERROR_REGISTRY_CORRUPT; - *len += count; + if (ret != ERROR_FILE_NOT_FOUND) + { + if (ret != ERROR_SUCCESS) + return ret; + else if (type != REG_SZ) + return ERROR_REGISTRY_CORRUPT; + *len += count; + } if (credential) { credential->TargetAlias = (LPWSTR)buffer; @@ -150,11 +159,14 @@ static DWORD registry_read_credential(HKEY hkey, PCREDENTIALW credential, } ret = RegQueryValueExW(hkey, wszUserNameValue, 0, &type, NULL, &count); - if (ret != ERROR_FILE_NOT_FOUND && ret != ERROR_SUCCESS) - return ret; - else if (type != REG_SZ) - return ERROR_REGISTRY_CORRUPT; - *len += count; + if (ret != ERROR_FILE_NOT_FOUND) + { + if (ret != ERROR_SUCCESS) + return ret; + else if (type != REG_SZ) + return ERROR_REGISTRY_CORRUPT; + *len += count; + } if (credential) { credential->UserName = (LPWSTR)buffer; @@ -171,9 +183,12 @@ static DWORD registry_read_credential(HKEY hkey, PCREDENTIALW credential, } ret = read_credential_blob(hkey, key_data, NULL, &count); - if (ret != ERROR_FILE_NOT_FOUND && ret != ERROR_SUCCESS) - return ret; - *len += count; + if (ret != ERROR_FILE_NOT_FOUND) + { + if (ret != ERROR_SUCCESS) + return ret; + *len += count; + } if (credential) { credential->CredentialBlob = (LPBYTE)buffer; diff --git a/dll/win32/advapi32/sec/lsa.c b/dll/win32/advapi32/sec/lsa.c index 90a257b8a60..604dcb26b98 100644 --- a/dll/win32/advapi32/sec/lsa.c +++ b/dll/win32/advapi32/sec/lsa.c @@ -16,59 +16,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(advapi); -/* imported from wine 1.1.14 */ -static void* ADVAPI_GetDomainName(unsigned sz, unsigned ofs) -{ - HKEY key; - LONG ret; - BYTE* ptr = NULL; - UNICODE_STRING* ustr; - - static const WCHAR wVNETSUP[] = { - 'S','y','s','t','e','m','\\', - 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', - 'S','e','r','v','i','c','e','s','\\', - 'V','x','D','\\','V','N','E','T','S','U','P','\0'}; - - ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, wVNETSUP, 0, KEY_READ, &key); - if (ret == ERROR_SUCCESS) - { - DWORD size = 0; - static const WCHAR wg[] = { 'W','o','r','k','g','r','o','u','p',0 }; - - ret = RegQueryValueExW(key, wg, NULL, NULL, NULL, &size); - if (ret == ERROR_MORE_DATA || ret == ERROR_SUCCESS) - { - ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sz + size); - if (!ptr) return NULL; - ustr = (UNICODE_STRING*)(ptr + ofs); - ustr->MaximumLength = size; - ustr->Buffer = (WCHAR*)(ptr + sz); - ret = RegQueryValueExW(key, wg, NULL, NULL, (LPBYTE)ustr->Buffer, &size); - if (ret != ERROR_SUCCESS) - { - HeapFree(GetProcessHeap(), 0, ptr); - ptr = NULL; - } - else ustr->Length = size - sizeof(WCHAR); - } - RegCloseKey(key); - } - if (!ptr) - { - static const WCHAR wDomain[] = {'D','O','M','A','I','N','\0'}; - ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - sz + sizeof(wDomain)); - if (!ptr) return NULL; - ustr = (UNICODE_STRING*)(ptr + ofs); - ustr->MaximumLength = sizeof(wDomain); - ustr->Buffer = (WCHAR*)(ptr + sz); - ustr->Length = sizeof(wDomain) - sizeof(WCHAR); - memcpy(ustr->Buffer, wDomain, sizeof(wDomain)); - } - return ptr; -} - static BOOL LsapIsLocalComputer(PLSA_UNICODE_STRING ServerName) { @@ -148,8 +95,9 @@ PLSAPR_SERVER_NAME_unbind(PLSAPR_SERVER_NAME pszSystemName, /* * @implemented */ -NTSTATUS WINAPI -LsaClose(LSA_HANDLE ObjectHandle) +NTSTATUS +WINAPI +LsaClose(IN LSA_HANDLE ObjectHandle) { NTSTATUS Status; @@ -172,8 +120,9 @@ LsaClose(LSA_HANDLE ObjectHandle) /* * @implemented */ -NTSTATUS WINAPI -LsaDelete(LSA_HANDLE ObjectHandle) +NTSTATUS +WINAPI +LsaDelete(IN LSA_HANDLE ObjectHandle) { NTSTATUS Status; @@ -208,6 +157,97 @@ LsaAddAccountRights( return STATUS_OBJECT_NAME_NOT_FOUND; } + +/* + * @implemented + */ +NTSTATUS +WINAPI +LsaAddPrivilegesToAccount(IN LSA_HANDLE AccountHandle, + IN PPRIVILEGE_SET PrivilegeSet) +{ + NTSTATUS Status; + + TRACE("(%p,%p) stub\n", AccountHandle, PrivilegeSet); + + RpcTryExcept + { + Status = LsarAddPrivilegesToAccount((LSAPR_HANDLE)AccountHandle, + (PLSAPR_PRIVILEGE_SET)PrivilegeSet); + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + Status = I_RpcMapWin32Status(RpcExceptionCode()); + } + RpcEndExcept; + + return Status; +} + + +/* + * @implemented + */ +NTSTATUS +WINAPI +LsaCreateAccount(IN LSA_HANDLE PolicyHandle, + IN PSID AccountSid, + IN ULONG Flags, + OUT PLSA_HANDLE AccountHandle) +{ + NTSTATUS Status; + + TRACE("(%p,%p,0x%08x,%p)\n", PolicyHandle, AccountSid, Flags, AccountHandle); + + RpcTryExcept + { + Status = LsarCreateAccount((LSAPR_HANDLE)PolicyHandle, + AccountSid, + Flags, + AccountHandle); + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + Status = I_RpcMapWin32Status(RpcExceptionCode()); + } + RpcEndExcept; + + return Status; +} + + +/* + * @implemented + */ +NTSTATUS +WINAPI +LsaCreateTrustedDomain(IN LSA_HANDLE PolicyHandle, + IN PLSA_TRUST_INFORMATION TrustedDomainInformation, + IN ACCESS_MASK DesiredAccess, + OUT PLSA_HANDLE TrustedDomainHandle) +{ + NTSTATUS Status; + + TRACE("(%p,%p,0x%08x,%p)\n", PolicyHandle, TrustedDomainInformation, + DesiredAccess, TrustedDomainHandle); + + RpcTryExcept + { + Status = LsarCreateTrustedDomain((LSAPR_HANDLE)PolicyHandle, + (PLSAPR_TRUST_INFORMATION)TrustedDomainInformation, + DesiredAccess, + (PLSAPR_HANDLE)TrustedDomainHandle); + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + Status = I_RpcMapWin32Status(RpcExceptionCode()); + } + RpcEndExcept; + + return Status; +} + + /* * @unimplemented */ @@ -226,16 +266,29 @@ LsaCreateTrustedDomainEx( } /* - * @unimplemented + * @implemented */ NTSTATUS WINAPI -LsaDeleteTrustedDomain( - LSA_HANDLE PolicyHandle, - PSID TrustedDomainSid) +LsaDeleteTrustedDomain(IN LSA_HANDLE PolicyHandle, + IN PSID TrustedDomainSid) { - FIXME("(%p,%p) stub\n", PolicyHandle, TrustedDomainSid); - return STATUS_SUCCESS; + NTSTATUS Status; + + TRACE("(%p,%p)\n", PolicyHandle, TrustedDomainSid); + + RpcTryExcept + { + Status = LsarDeleteTrustedDomain((LSAPR_HANDLE)PolicyHandle, + TrustedDomainSid); + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + Status = I_RpcMapWin32Status(RpcExceptionCode()); + } + RpcEndExcept; + + return Status; } /* @@ -547,12 +600,44 @@ LsaLookupSids(IN LSA_HANDLE PolicyHandle, * @implemented */ ULONG WINAPI -LsaNtStatusToWinError(NTSTATUS Status) +LsaNtStatusToWinError(IN NTSTATUS Status) { TRACE("(%lx)\n", Status); return RtlNtStatusToDosError(Status); } + +/* + * @implemented + */ +NTSTATUS +WINAPI +LsaOpenAccount(IN LSA_HANDLE PolicyHandle, + IN PSID AccountSid, + IN ULONG Flags, + OUT PLSA_HANDLE AccountHandle) +{ + NTSTATUS Status; + + TRACE("(%p,%p,0x%08x,%p)\n", PolicyHandle, AccountSid, Flags, AccountHandle); + + RpcTryExcept + { + Status = LsarOpenAccount((LSAPR_HANDLE)PolicyHandle, + AccountSid, + Flags, + AccountHandle); + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + Status = I_RpcMapWin32Status(RpcExceptionCode()); + } + RpcEndExcept; + + return Status; +} + + /****************************************************************************** * LsaOpenPolicy * @@ -562,15 +647,14 @@ LsaNtStatusToWinError(NTSTATUS Status) * x3 [] * x4 [] * - * @unimplemented + * @implemented */ NTSTATUS WINAPI -LsaOpenPolicy( - IN PLSA_UNICODE_STRING SystemName, - IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes, - IN ACCESS_MASK DesiredAccess, - IN OUT PLSA_HANDLE PolicyHandle) +LsaOpenPolicy(IN PLSA_UNICODE_STRING SystemName, + IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes, + IN ACCESS_MASK DesiredAccess, + OUT PLSA_HANDLE PolicyHandle) { NTSTATUS Status; @@ -604,20 +688,37 @@ LsaOpenPolicy( /* - * @unimplemented + * @implemented */ NTSTATUS WINAPI -LsaOpenTrustedDomainByName( - LSA_HANDLE PolicyHandle, - PLSA_UNICODE_STRING TrustedDomainName, - ACCESS_MASK DesiredAccess, - PLSA_HANDLE TrustedDomainHandle) +LsaOpenTrustedDomainByName(IN LSA_HANDLE PolicyHandle, + IN PLSA_UNICODE_STRING TrustedDomainName, + IN ACCESS_MASK DesiredAccess, + OUT PLSA_HANDLE TrustedDomainHandle) { - FIXME("(%p,%p,0x%08x,%p) stub\n", PolicyHandle, TrustedDomainName, DesiredAccess, TrustedDomainHandle); - return STATUS_OBJECT_NAME_NOT_FOUND; + NTSTATUS Status; + + TRACE("(%p,%p,0x%08x,%p)\n", PolicyHandle, TrustedDomainName, + DesiredAccess, TrustedDomainHandle); + + RpcTryExcept + { + Status = LsarOpenTrustedDomainByName((LSAPR_HANDLE)PolicyHandle, + (PRPC_UNICODE_STRING)TrustedDomainName, + DesiredAccess, + TrustedDomainHandle); + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + Status = I_RpcMapWin32Status(RpcExceptionCode()); + } + RpcEndExcept; + + return Status; } + /* * @unimplemented */ @@ -647,103 +748,38 @@ LsaQueryForestTrustInformation( } /* - * @unimplemented + * @implemented */ -NTSTATUS WINAPI -LsaQueryInformationPolicy(LSA_HANDLE PolicyHandle, - POLICY_INFORMATION_CLASS InformationClass, - PVOID *Buffer) +NTSTATUS +WINAPI +LsaQueryInformationPolicy(IN LSA_HANDLE PolicyHandle, + IN POLICY_INFORMATION_CLASS InformationClass, + OUT PVOID *Buffer) { + PLSAPR_POLICY_INFORMATION PolicyInformation = NULL; + NTSTATUS Status; + TRACE("(%p,0x%08x,%p)\n", PolicyHandle, InformationClass, Buffer); - if(!Buffer) return STATUS_INVALID_PARAMETER; - switch (InformationClass) + RpcTryExcept { - case PolicyAuditEventsInformation: /* 2 */ - { - PPOLICY_AUDIT_EVENTS_INFO p = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof(POLICY_AUDIT_EVENTS_INFO)); - p->AuditingMode = FALSE; /* no auditing */ - *Buffer = p; - } - break; - case PolicyPrimaryDomainInformation: /* 3 */ - { - /* Only the domain name is valid for the local computer. - * All other fields are zero. - */ - PPOLICY_PRIMARY_DOMAIN_INFO pinfo; - - pinfo = ADVAPI_GetDomainName(sizeof(*pinfo), offsetof(POLICY_PRIMARY_DOMAIN_INFO, Name)); - - TRACE("setting domain to %s\n", debugstr_w(pinfo->Name.Buffer)); - - *Buffer = pinfo; - } - case PolicyAccountDomainInformation: /* 5 */ - { - struct di - { - POLICY_ACCOUNT_DOMAIN_INFO info; - SID sid; - DWORD padding[3]; - WCHAR domain[MAX_COMPUTERNAME_LENGTH + 1]; - }; - - DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1; - struct di * xdi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*xdi)); - - xdi->info.DomainName.MaximumLength = dwSize * sizeof(WCHAR); - xdi->info.DomainName.Buffer = xdi->domain; - if (GetComputerNameW(xdi->info.DomainName.Buffer, &dwSize)) - xdi->info.DomainName.Length = dwSize * sizeof(WCHAR); - - TRACE("setting name to %s\n", debugstr_w(xdi->info.DomainName.Buffer)); - - xdi->info.DomainSid = &xdi->sid; - - /* read the computer SID from the registry */ - if (!ADVAPI_GetComputerSid(&xdi->sid)) - { - HeapFree(GetProcessHeap(), 0, xdi); - - WARN("Computer SID not found\n"); - - return STATUS_UNSUCCESSFUL; - } - - *Buffer = xdi; - } - break; - case PolicyDnsDomainInformation: /* 12 (0xc) */ - { - /* Only the domain name is valid for the local computer. - * All other fields are zero. - */ - PPOLICY_DNS_DOMAIN_INFO pinfo; - - pinfo = ADVAPI_GetDomainName(sizeof(*pinfo), offsetof(POLICY_DNS_DOMAIN_INFO, Name)); - - TRACE("setting domain to %s\n", debugstr_w(pinfo->Name.Buffer)); - - *Buffer = pinfo; - } - break; - case PolicyAuditLogInformation: - case PolicyPdAccountInformation: - case PolicyLsaServerRoleInformation: - case PolicyReplicaSourceInformation: - case PolicyDefaultQuotaInformation: - case PolicyModificationInformation: - case PolicyAuditFullSetInformation: - case PolicyAuditFullQueryInformation: - case PolicyEfsInformation: - { - FIXME("category not implemented\n"); - return STATUS_UNSUCCESSFUL; - } + Status = LsarQueryInformationPolicy((LSAPR_HANDLE)PolicyHandle, + InformationClass, + &PolicyInformation); + *Buffer = PolicyInformation; } - return STATUS_SUCCESS; + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + if (PolicyInformation != NULL) + MIDL_user_free(PolicyInformation); + + Status = I_RpcMapWin32Status(RpcExceptionCode()); + } + RpcEndExcept; + + TRACE("Done (Status: 0x%08x)\n", Status); + + return Status; } /* @@ -820,20 +856,36 @@ LsaSetDomainInformationPolicy( return STATUS_UNSUCCESSFUL; } + /* - * @unimplemented + * @implemented */ NTSTATUS WINAPI -LsaSetInformationPolicy( - LSA_HANDLE PolicyHandle, - POLICY_INFORMATION_CLASS InformationClass, - PVOID Buffer) +LsaSetInformationPolicy(IN LSA_HANDLE PolicyHandle, + IN POLICY_INFORMATION_CLASS InformationClass, + IN PVOID Buffer) { - FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle, InformationClass, Buffer); - return STATUS_UNSUCCESSFUL; + NTSTATUS Status; + + TRACE("(%p,0x%08x,%p)\n", PolicyHandle, InformationClass, Buffer); + + RpcTryExcept + { + Status = LsarSetInformationPolicy((LSAPR_HANDLE)PolicyHandle, + InformationClass, + (PLSAPR_POLICY_INFORMATION)Buffer); + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + Status = I_RpcMapWin32Status(RpcExceptionCode()); + } + RpcEndExcept; + + return Status; } + /* * @unimplemented */ diff --git a/dll/win32/advapi32/sec/sec.c b/dll/win32/advapi32/sec/sec.c index 2ad2bff688c..99222f3f315 100644 --- a/dll/win32/advapi32/sec/sec.c +++ b/dll/win32/advapi32/sec/sec.c @@ -534,75 +534,4 @@ BuildSecurityDescriptorA(IN PTRUSTEE_A pOwner OPTIONAL, return FALSE; } - -/* - * @unimplemented - */ -BOOL WINAPI DecryptFileW(LPCWSTR lpFileName, DWORD dwReserved) -{ - FIXME("%s(%S) not implemented!\n", __FUNCTION__, lpFileName); - return TRUE; -} - - -/* - * @implemented - */ -BOOL WINAPI -DecryptFileA(LPCSTR lpFileName, DWORD dwReserved) -{ - UNICODE_STRING FileName; - NTSTATUS Status; - BOOL ret; - - Status = RtlCreateUnicodeStringFromAsciiz(&FileName, lpFileName); - if (!NT_SUCCESS(Status)) - { - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } - - ret = DecryptFileW(FileName.Buffer, dwReserved); - - if (FileName.Buffer != NULL) - RtlFreeUnicodeString(&FileName); - return ret; -} - - -/* - * @unimplemented - */ -BOOL WINAPI -EncryptFileW(LPCWSTR lpFileName) -{ - FIXME("%s() not implemented!\n", __FUNCTION__); - return TRUE; -} - - -/* - * @implemented - */ -BOOL WINAPI -EncryptFileA(LPCSTR lpFileName) -{ - UNICODE_STRING FileName; - NTSTATUS Status; - BOOL ret; - - Status = RtlCreateUnicodeStringFromAsciiz(&FileName, lpFileName); - if (!NT_SUCCESS(Status)) - { - SetLastError(RtlNtStatusToDosError(Status)); - return FALSE; - } - - ret = EncryptFileW(FileName.Buffer); - - if (FileName.Buffer != NULL) - RtlFreeUnicodeString(&FileName); - return ret; -} - /* EOF */ diff --git a/dll/win32/authz/authz.c b/dll/win32/authz/authz.c index 815f2b3d1c1..2a17c93cc50 100644 --- a/dll/win32/authz/authz.c +++ b/dll/win32/authz/authz.c @@ -170,7 +170,7 @@ AuthzInitializeContextFromToken(IN DWORD Flags, */ AUTHZAPI BOOL -WINAPI +WINAPIV AuthzInitializeObjectAccessAuditEvent(IN DWORD Flags, IN AUTHZ_AUDIT_EVENT_TYPE_HANDLE hAuditEventType, IN PWSTR szOperationType, @@ -178,7 +178,8 @@ AuthzInitializeObjectAccessAuditEvent(IN DWORD Flags, IN PWSTR szObjectName, IN PWSTR szAdditionalInfo, OUT PAUTHZ_AUDIT_EVENT_HANDLE phAuditEvent, - IN DWORD dwAdditionalParamCount) + IN DWORD dwAdditionalParamCount, + ...) { UNIMPLEMENTED; return FALSE; @@ -190,7 +191,7 @@ AuthzInitializeObjectAccessAuditEvent(IN DWORD Flags, */ AUTHZAPI BOOL -WINAPI +WINAPIV AuthzInitializeObjectAccessAuditEvent2(IN DWORD Flags, IN AUTHZ_AUDIT_EVENT_TYPE_HANDLE hAuditEventType, IN PWSTR szOperationType, @@ -199,7 +200,8 @@ AuthzInitializeObjectAccessAuditEvent2(IN DWORD Flags, IN PWSTR szAdditionalInfo, IN PWSTR szAdditionalInfo2, OUT PAUTHZ_AUDIT_EVENT_HANDLE phAuditEvent, - IN DWORD dwAdditionalParameterCount) + IN DWORD dwAdditionalParameterCount, + ...) { UNIMPLEMENTED; return FALSE; @@ -260,7 +262,7 @@ AuthzRegisterSecurityEventSource(IN DWORD dwFlags, */ AUTHZAPI BOOL -WINAPI +WINAPIV AuthzReportSecurityEvent(IN DWORD dwFlags, IN AUTHZ_SECURITY_EVENT_PROVIDER_HANDLE hEventProvider, IN DWORD dwAuditId, diff --git a/dll/win32/authz/authz.spec b/dll/win32/authz/authz.spec index d39efcf1247..87211f5f919 100644 --- a/dll/win32/authz/authz.spec +++ b/dll/win32/authz/authz.spec @@ -11,13 +11,13 @@ @ stdcall AuthzInitializeContextFromAuthzContext(long ptr ptr long long ptr ptr) @ stdcall AuthzInitializeContextFromSid(long ptr ptr ptr long long ptr ptr) @ stdcall AuthzInitializeContextFromToken(long ptr ptr ptr long long ptr ptr) -@ stdcall AuthzInitializeObjectAccessAuditEvent(long ptr wstr wstr wstr wstr ptr long) -@ stdcall AuthzInitializeObjectAccessAuditEvent2(long ptr wstr wstr wstr wstr wstr ptr long) +@ cdecl AuthzInitializeObjectAccessAuditEvent(long ptr wstr wstr wstr wstr ptr long) +@ cdecl AuthzInitializeObjectAccessAuditEvent2(long ptr wstr wstr wstr wstr wstr ptr long) @ stdcall AuthzInitializeResourceManager(long ptr ptr ptr wstr ptr) @ stdcall AuthzInstallSecurityEventSource(long ptr) @ stdcall AuthzOpenObjectAudit(long ptr ptr ptr ptr ptr long ptr) @ stdcall AuthzRegisterSecurityEventSource(long ptr ptr) -@ stdcall AuthzReportSecurityEvent(long ptr long ptr long) authz.AuthzReportSecurityEvent +@ cdecl AuthzReportSecurityEvent(long ptr long ptr long) authz.AuthzReportSecurityEvent @ stdcall AuthzReportSecurityEventFromParams(long ptr long ptr ptr) @ stdcall AuthzUninstallSecurityEventSource(long wstr) @ stdcall AuthzUnregisterSecurityEventSource(long ptr) diff --git a/dll/win32/kernel32/file/bintype.c b/dll/win32/kernel32/file/bintype.c index bc8f2ed35d4..e59a1c48c26 100644 --- a/dll/win32/kernel32/file/bintype.c +++ b/dll/win32/kernel32/file/bintype.c @@ -17,7 +17,7 @@ #include #if DBG -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); #endif /* FUNCTIONS ****************************************************************/ diff --git a/dll/win32/kernel32/file/copy.c b/dll/win32/kernel32/file/copy.c index 786c8f79b0c..a55fbff84cd 100644 --- a/dll/win32/kernel32/file/copy.c +++ b/dll/win32/kernel32/file/copy.c @@ -17,7 +17,7 @@ #include #if DBG -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); #endif /* FUNCTIONS ****************************************************************/ diff --git a/dll/win32/kernel32/file/create.c b/dll/win32/kernel32/file/create.c index 8b487c3de92..8da66358bd6 100644 --- a/dll/win32/kernel32/file/create.c +++ b/dll/win32/kernel32/file/create.c @@ -19,7 +19,7 @@ #include #if DBG -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); #endif #define SYMLINK_FLAG_RELATIVE 1 diff --git a/dll/win32/kernel32/file/curdir.c b/dll/win32/kernel32/file/curdir.c index d58059d9539..8c74fbe11a1 100644 --- a/dll/win32/kernel32/file/curdir.c +++ b/dll/win32/kernel32/file/curdir.c @@ -21,7 +21,7 @@ #include #if DBG -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); #endif /* GLOBAL VARIABLES **********************************************************/ diff --git a/dll/win32/kernel32/file/delete.c b/dll/win32/kernel32/file/delete.c index 333851655c8..78f62c11622 100644 --- a/dll/win32/kernel32/file/delete.c +++ b/dll/win32/kernel32/file/delete.c @@ -14,7 +14,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); /* FUNCTIONS ****************************************************************/ diff --git a/dll/win32/kernel32/file/dir.c b/dll/win32/kernel32/file/dir.c index 5d352b172b0..c1de9c0b987 100644 --- a/dll/win32/kernel32/file/dir.c +++ b/dll/win32/kernel32/file/dir.c @@ -18,7 +18,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); UNICODE_STRING DllDirectory = {0, 0, NULL}; diff --git a/dll/win32/kernel32/file/dosdev.c b/dll/win32/kernel32/file/dosdev.c index 0ac01917680..1e15166bb64 100644 --- a/dll/win32/kernel32/file/dosdev.c +++ b/dll/win32/kernel32/file/dosdev.c @@ -14,7 +14,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); /* FUNCTIONS *****************************************************************/ diff --git a/dll/win32/kernel32/file/file.c b/dll/win32/kernel32/file/file.c index 7210147a031..24e4e47ba45 100644 --- a/dll/win32/kernel32/file/file.c +++ b/dll/win32/kernel32/file/file.c @@ -15,7 +15,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); /* GLOBALS ******************************************************************/ diff --git a/dll/win32/kernel32/file/find.c b/dll/win32/kernel32/file/find.c index e2d476c10b3..967d94c3df5 100644 --- a/dll/win32/kernel32/file/find.c +++ b/dll/win32/kernel32/file/find.c @@ -14,7 +14,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); /* TYPES ********************************************************************/ diff --git a/dll/win32/kernel32/file/hardlink.c b/dll/win32/kernel32/file/hardlink.c index 5e8e91f50b9..004d5b8735b 100644 --- a/dll/win32/kernel32/file/hardlink.c +++ b/dll/win32/kernel32/file/hardlink.c @@ -14,7 +14,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); /* FUNCTIONS ****************************************************************/ diff --git a/dll/win32/kernel32/file/lock.c b/dll/win32/kernel32/file/lock.c index 6cb386025d1..a18425ad174 100644 --- a/dll/win32/kernel32/file/lock.c +++ b/dll/win32/kernel32/file/lock.c @@ -16,7 +16,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); /* FUNCTIONS ****************************************************************/ diff --git a/dll/win32/kernel32/file/mailslot.c b/dll/win32/kernel32/file/mailslot.c index cbc7900b3eb..6dceaf9e2a0 100644 --- a/dll/win32/kernel32/file/mailslot.c +++ b/dll/win32/kernel32/file/mailslot.c @@ -13,7 +13,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); /* FUNCTIONS ****************************************************************/ diff --git a/dll/win32/kernel32/file/move.c b/dll/win32/kernel32/file/move.c index cdf53527fbd..846d78cb976 100644 --- a/dll/win32/kernel32/file/move.c +++ b/dll/win32/kernel32/file/move.c @@ -19,7 +19,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); /* GLOBALS *****************************************************************/ diff --git a/dll/win32/kernel32/file/npipe.c b/dll/win32/kernel32/file/npipe.c index 3896e9b2b38..629b69b678f 100644 --- a/dll/win32/kernel32/file/npipe.c +++ b/dll/win32/kernel32/file/npipe.c @@ -12,7 +12,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); //#define USING_PROPER_NPFS_WAIT_SEMANTICS diff --git a/dll/win32/kernel32/file/pipe.c b/dll/win32/kernel32/file/pipe.c index a48150d5156..21f709d08b5 100644 --- a/dll/win32/kernel32/file/pipe.c +++ b/dll/win32/kernel32/file/pipe.c @@ -13,7 +13,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); /* GLOBALS ******************************************************************/ diff --git a/dll/win32/kernel32/file/rw.c b/dll/win32/kernel32/file/rw.c index dc89e4da8bc..13e15da3463 100644 --- a/dll/win32/kernel32/file/rw.c +++ b/dll/win32/kernel32/file/rw.c @@ -14,7 +14,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); /* FUNCTIONS ****************************************************************/ diff --git a/dll/win32/kernel32/file/volume.c b/dll/win32/kernel32/file/volume.c index 2af3e8ed03d..0e336661a6b 100644 --- a/dll/win32/kernel32/file/volume.c +++ b/dll/win32/kernel32/file/volume.c @@ -22,7 +22,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32file; +DEBUG_CHANNEL(kernel32file); #define MAX_DOS_DRIVES 26 diff --git a/dll/win32/kernel32/include/kernel32.h b/dll/win32/kernel32/include/kernel32.h index 55b1338786c..fae3e844009 100755 --- a/dll/win32/kernel32/include/kernel32.h +++ b/dll/win32/kernel32/include/kernel32.h @@ -9,6 +9,13 @@ #define resource 203 #define kernel32session 204 + +#if DBG +#define DEBUG_CHANNEL(ch) static ULONG gDebugChannel = ch; +#else +#define DEBUG_CHANNEL(ch) +#endif + #define TRACE(fmt, ...) TRACE__(gDebugChannel, fmt, ##__VA_ARGS__) #define WARN(fmt, ...) WARN__(gDebugChannel, fmt, ##__VA_ARGS__) #define FIXME(fmt, ...) WARN__(gDebugChannel, fmt,## __VA_ARGS__) diff --git a/dll/win32/kernel32/mem/global.c b/dll/win32/kernel32/mem/global.c index f2cfca5b01c..a0449e36fca 100644 --- a/dll/win32/kernel32/mem/global.c +++ b/dll/win32/kernel32/mem/global.c @@ -101,7 +101,6 @@ GlobalAlloc(UINT uFlags, { /* All worked well, save our heap entry */ RtlSetUserValueHeap(hProcessHeap, HEAP_NO_SERIALIZE, Ptr, hMemory); - RtlSetUserFlagsHeap(hProcessHeap, HEAP_NO_SERIALIZE, Ptr, Flags); } } @@ -529,10 +528,6 @@ GlobalReAlloc(HGLOBAL hMem, HEAP_NO_SERIALIZE, Ptr, hMem); - RtlSetUserFlagsHeap(hProcessHeap, - HEAP_NO_SERIALIZE, - Ptr, - Flags); } } else @@ -562,10 +557,6 @@ GlobalReAlloc(HGLOBAL hMem, HEAP_NO_SERIALIZE, Ptr, hMem); - RtlSetUserFlagsHeap(hProcessHeap, - HEAP_NO_SERIALIZE, - Ptr, - Flags); } } @@ -668,10 +659,6 @@ GlobalReAlloc(HGLOBAL hMem, HEAP_NO_SERIALIZE, HandleEntry->Object, hMem); - RtlSetUserFlagsHeap(hProcessHeap, - HEAP_NO_SERIALIZE, - HandleEntry->Object, - Flags); } } } diff --git a/dll/win32/kernel32/mem/heap.c b/dll/win32/kernel32/mem/heap.c index 41228b737aa..80aefa15cbe 100644 --- a/dll/win32/kernel32/mem/heap.c +++ b/dll/win32/kernel32/mem/heap.c @@ -13,6 +13,10 @@ #define NDEBUG #include +/* TYPES *********************************************************************/ + +extern SYSTEM_BASIC_INFORMATION BaseCachedSysInfo; + /* FUNCTIONS ***************************************************************/ /* @@ -31,6 +35,17 @@ HeapCreate(DWORD flOptions, Flags = (flOptions & (HEAP_GENERATE_EXCEPTIONS | HEAP_NO_SERIALIZE)) | HEAP_CLASS_1; + /* Check if heap is growable and ensure max size is correct */ + if (dwMaximumSize == 0) + Flags |= HEAP_GROWABLE; + else if (dwMaximumSize < BaseCachedSysInfo.PageSize && + dwInitialSize > dwMaximumSize) + { + /* Max size is non-zero but less than page size which can't be correct. + Fix it up by bumping it to the initial size whatever it is. */ + dwMaximumSize = dwInitialSize; + } + /* Call RTL Heap */ hRet = RtlCreateHeap(Flags, NULL, diff --git a/dll/win32/kernel32/mem/local.c b/dll/win32/kernel32/mem/local.c index 61428b97166..68d9de20699 100644 --- a/dll/win32/kernel32/mem/local.c +++ b/dll/win32/kernel32/mem/local.c @@ -352,11 +352,6 @@ LocalReAlloc(HLOCAL hMem, HEAP_NO_SERIALIZE, Ptr, hMem); - RtlSetUserFlagsHeap(hProcessHeap, - HEAP_NO_SERIALIZE, - Ptr, - Flags); - } } else @@ -378,19 +373,6 @@ LocalReAlloc(HLOCAL hMem, /* And do the re-allocation */ Ptr = RtlReAllocateHeap(hProcessHeap, Flags, Ptr, dwBytes); - - if (Ptr) - { - /* Allocation succeeded, so save our entry */ - RtlSetUserValueHeap(hProcessHeap, - HEAP_NO_SERIALIZE, - Ptr, - hMem); - RtlSetUserFlagsHeap(hProcessHeap, - HEAP_NO_SERIALIZE, - Ptr, - Flags); - } } /* Make sure we have a pointer by now */ diff --git a/dll/win32/kernel32/mem/section.c b/dll/win32/kernel32/mem/section.c index 142d9287fdf..705a8c360de 100644 --- a/dll/win32/kernel32/mem/section.c +++ b/dll/win32/kernel32/mem/section.c @@ -87,7 +87,7 @@ CreateFileMappingW(HANDLE hFile, DesiredAccess = STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_READ; /* Get the attributes for the actual allocation and cleanup flProtect */ - Attributes = flProtect & (SEC_FILE | SEC_IMAGE | SEC_RESERVE | SEC_NOCACHE | SEC_COMMIT); + Attributes = flProtect & (SEC_FILE | SEC_IMAGE | SEC_RESERVE | SEC_NOCACHE | SEC_COMMIT | SEC_LARGE_PAGES); flProtect ^= Attributes; /* If the caller didn't say anything, assume SEC_COMMIT */ diff --git a/dll/win32/kernel32/misc/actctx.c b/dll/win32/kernel32/misc/actctx.c index 2cf99fef463..516dcb5d9c8 100644 --- a/dll/win32/kernel32/misc/actctx.c +++ b/dll/win32/kernel32/misc/actctx.c @@ -15,7 +15,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = actctx; +DEBUG_CHANNEL(actctx); #define ACTCTX_FAKE_HANDLE ((HANDLE) 0xf00baa) diff --git a/dll/win32/kernel32/misc/format_msg.c b/dll/win32/kernel32/misc/format_msg.c index 122cac57f6e..35b3c017274 100644 --- a/dll/win32/kernel32/misc/format_msg.c +++ b/dll/win32/kernel32/misc/format_msg.c @@ -22,7 +22,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = resource; +DEBUG_CHANNEL(resource); struct format_args { diff --git a/dll/win32/kernel32/misc/lang.c b/dll/win32/kernel32/misc/lang.c index 78cf47fe5c4..ac9868e21a1 100644 --- a/dll/win32/kernel32/misc/lang.c +++ b/dll/win32/kernel32/misc/lang.c @@ -17,17 +17,13 @@ */ #include +#include #define NDEBUG #include #include "lcformat_private.h" -/* FIXME: these are included in winnls.h, however including this file causes alot of - conflicting type errors. */ - -#define LOCALE_RETURN_NUMBER 0x20000000 -#define LOCALE_USE_CP_ACP 0x40000000 #define LOCALE_LOCALEINFOFLAGSMASK (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP|\ LOCALE_RETURN_NUMBER|LOCALE_RETURN_GENITIVE_NAMES) #define CALINFO_MAX_YEAR 2029 @@ -1765,7 +1761,7 @@ GetLocaleInfoW ( } else { - memcpy( lpLCData, ch + 1, *ch * sizeof(WCHAR) ); + memcpy( lpLCData, ch + 1, nRet * sizeof(WCHAR) ); if (LCType != LOCALE_FONTSIGNATURE) lpLCData[nRet-1] = 0; } return nRet; diff --git a/dll/win32/kernel32/misc/lcformat.c b/dll/win32/kernel32/misc/lcformat.c index fdfcf39bb40..663dec62819 100644 --- a/dll/win32/kernel32/misc/lcformat.c +++ b/dll/win32/kernel32/misc/lcformat.c @@ -32,7 +32,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = resource; +DEBUG_CHANNEL(resource); #define DATE_DATEVARSONLY 0x0100 /* only date stuff: yMdg */ #define TIME_TIMEVARSONLY 0x0200 /* only time stuff: hHmst */ diff --git a/dll/win32/kernel32/misc/nls.c b/dll/win32/kernel32/misc/nls.c index 4e082011b17..340ce2cfe30 100644 --- a/dll/win32/kernel32/misc/nls.c +++ b/dll/win32/kernel32/misc/nls.c @@ -282,7 +282,7 @@ IntGetCodePageEntry(UINT CodePage) &ObjectAttributes, NULL, PAGE_READONLY, - SEC_FILE, + SEC_COMMIT, FileHandle); /* HACK: Check if another process was faster diff --git a/dll/win32/kernel32/misc/version.c b/dll/win32/kernel32/misc/version.c index bb9288e930f..86eb50d5052 100644 --- a/dll/win32/kernel32/misc/version.c +++ b/dll/win32/kernel32/misc/version.c @@ -11,7 +11,7 @@ #include #define NDEBUG #include -static ULONG gDebugChannel = kernel32ver; +DEBUG_CHANNEL(kernel32ver); #define UNICODIZE1(x) L##x #define UNICODIZE(x) UNICODIZE1(x) diff --git a/dll/win32/kernel32/process/procsup.c b/dll/win32/kernel32/process/procsup.c index 2e45bbcc423..2afb4e06111 100644 --- a/dll/win32/kernel32/process/procsup.c +++ b/dll/win32/kernel32/process/procsup.c @@ -805,7 +805,7 @@ CreateProcessInternalW(HANDLE hToken, if (lpCommandLine) { - /* Serach for escape sequences */ + /* Search for escape sequences */ ScanString = lpCommandLine; while (NULL != (ScanString = wcschr(ScanString, L'^'))) { diff --git a/dll/win32/kernel32/process/session.c b/dll/win32/kernel32/process/session.c index 3c61ebec7a6..7e9dcd148d7 100644 --- a/dll/win32/kernel32/process/session.c +++ b/dll/win32/kernel32/process/session.c @@ -11,7 +11,7 @@ #include #define NDEBUG #include -//static ULONG gDebugChannel = kernel32session; not actually used +//DEBUG_CHANNEL(kernel32session); not actually used DWORD ActiveConsoleSessionId = 0; diff --git a/dll/win32/lsasrv/lsarpc.c b/dll/win32/lsasrv/lsarpc.c index 6100e0748e3..9055bf608e0 100644 --- a/dll/win32/lsasrv/lsarpc.c +++ b/dll/win32/lsasrv/lsarpc.c @@ -60,9 +60,10 @@ LsapCreateDbHandle(LSA_DB_HANDLE_TYPE HandleType, } -static BOOL +static NTSTATUS LsapValidateDbHandle(LSAPR_HANDLE Handle, - LSA_DB_HANDLE_TYPE HandleType) + LSA_DB_HANDLE_TYPE HandleType, + ACCESS_MASK GrantedAccess) { PLSA_DB_HANDLE DbHandle = (PLSA_DB_HANDLE)Handle; BOOL bValid = FALSE; @@ -83,8 +84,15 @@ LsapValidateDbHandle(LSAPR_HANDLE Handle, } _SEH2_END; + if (bValid == FALSE) + return STATUS_INVALID_HANDLE; - return bValid; + if (GrantedAccess != 0) + { + /* FIXME: Check for granted access rights */ + } + + return STATUS_SUCCESS; } @@ -136,7 +144,7 @@ void __RPC_USER LSAPR_HANDLE_rundown(LSAPR_HANDLE hHandle) /* Function 0 */ -NTSTATUS LsarClose( +NTSTATUS WINAPI LsarClose( LSAPR_HANDLE *ObjectHandle) { NTSTATUS Status = STATUS_SUCCESS; @@ -145,13 +153,15 @@ NTSTATUS LsarClose( // RtlEnterCriticalSection(&PolicyHandleTableLock); - if (LsapValidateDbHandle(*ObjectHandle, LsaDbIgnoreHandle)) + Status = LsapValidateDbHandle(*ObjectHandle, + LsaDbIgnoreHandle, + 0); + + if (Status == STATUS_SUCCESS) { RtlFreeHeap(RtlGetProcessHeap(), 0, *ObjectHandle); *ObjectHandle = NULL; } - else - Status = STATUS_INVALID_HANDLE; // RtlLeaveCriticalSection(&PolicyHandleTableLock); @@ -160,7 +170,7 @@ NTSTATUS LsarClose( /* Function 1 */ -NTSTATUS LsarDelete( +NTSTATUS WINAPI LsarDelete( LSAPR_HANDLE ObjectHandle) { /* Deprecated */ @@ -169,7 +179,7 @@ NTSTATUS LsarDelete( /* Function 2 */ -NTSTATUS LsarEnumeratePrivileges( +NTSTATUS WINAPI LsarEnumeratePrivileges( LSAPR_HANDLE PolicyHandle, DWORD *EnumerationContext, PLSAPR_PRIVILEGE_ENUM_BUFFER EnumerationBuffer, @@ -181,7 +191,7 @@ NTSTATUS LsarEnumeratePrivileges( /* Function 3 */ -NTSTATUS LsarQuerySecurityObject( +NTSTATUS WINAPI LsarQuerySecurityObject( LSAPR_HANDLE ObjectHandle, SECURITY_INFORMATION SecurityInformation, PLSAPR_SR_SECURITY_DESCRIPTOR *SecurityDescriptor) @@ -192,7 +202,7 @@ NTSTATUS LsarQuerySecurityObject( /* Function 4 */ -NTSTATUS LsarSetSecurityObject( +NTSTATUS WINAPI LsarSetSecurityObject( LSAPR_HANDLE ObjectHandle, SECURITY_INFORMATION SecurityInformation, PLSAPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor) @@ -203,7 +213,7 @@ NTSTATUS LsarSetSecurityObject( /* Function 5 */ -NTSTATUS LsarChangePassword( +NTSTATUS WINAPI LsarChangePassword( handle_t IDL_handle, PRPC_UNICODE_STRING String1, PRPC_UNICODE_STRING String2, @@ -217,7 +227,7 @@ NTSTATUS LsarChangePassword( /* Function 6 */ -NTSTATUS LsarOpenPolicy( +NTSTATUS WINAPI LsarOpenPolicy( LPWSTR SystemName, PLSAPR_OBJECT_ATTRIBUTES ObjectAttributes, ACCESS_MASK DesiredAccess, @@ -243,18 +253,158 @@ NTSTATUS LsarOpenPolicy( /* Function 7 */ -NTSTATUS LsarQueryInformationPolicy( +NTSTATUS WINAPI LsarQueryInformationPolicy( LSAPR_HANDLE PolicyHandle, POLICY_INFORMATION_CLASS InformationClass, PLSAPR_POLICY_INFORMATION *PolicyInformation) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + + TRACE("LsarQueryInformationPolicy(%p,0x%08x,%p)\n", + PolicyHandle, InformationClass, PolicyInformation); + + if (PolicyInformation) + { + TRACE("*PolicyInformation %p\n", *PolicyInformation); + } + + Status = LsapValidateDbHandle(PolicyHandle, + LsaDbPolicyHandle, + 0); /* FIXME */ + if (!NT_SUCCESS(Status)) + return Status; + + switch (InformationClass) + { + case PolicyAuditEventsInformation: /* 2 */ + { + PLSAPR_POLICY_AUDIT_EVENTS_INFO p = MIDL_user_allocate(sizeof(LSAPR_POLICY_AUDIT_EVENTS_INFO)); + if (p == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + p->AuditingMode = FALSE; /* no auditing */ + p->EventAuditingOptions = NULL; + p->MaximumAuditEventCount = 0; + + *PolicyInformation = (PLSAPR_POLICY_INFORMATION)p; + } + break; + + case PolicyPrimaryDomainInformation: /* 3 */ + { + PLSAPR_POLICY_PRIMARY_DOM_INFO p = MIDL_user_allocate(sizeof(LSAPR_POLICY_PRIMARY_DOM_INFO)); + if (p == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + p->Name.Length = 0; + p->Name.MaximumLength = 0; + p->Name.Buffer = NULL; +#if 0 + p->Name.Length = wcslen(L"COMPUTERNAME"); + p->Name.MaximumLength = p->Name.Length + sizeof(WCHAR); + p->Name.Buffer = MIDL_user_allocate(p->Name.MaximumLength); + if (p->Name.Buffer == NULL) + { + MIDL_user_free(p); + return STATUS_INSUFFICIENT_RESOURCES; + } + + wcscpy(p->Name.Buffer, L"COMPUTERNAME"); +#endif + + p->Sid = NULL; /* no domain, no workgroup */ + + *PolicyInformation = (PLSAPR_POLICY_INFORMATION)p; + } + break; + + case PolicyAccountDomainInformation: /* 5 */ + { + PLSAPR_POLICY_ACCOUNT_DOM_INFO p = MIDL_user_allocate(sizeof(LSAPR_POLICY_ACCOUNT_DOM_INFO)); + if (p == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + p->DomainName.Length = 0; + p->DomainName.MaximumLength = 0; + p->DomainName.Buffer = NULL; +#if 0 + p->DomainName.Length = wcslen(L"COMPUTERNAME"); + p->DomainName.MaximumLength = p->DomainName.Length + sizeof(WCHAR); + p->DomainName.Buffer = MIDL_user_allocate(p->DomainName.MaximumLength); + if (p->DomainName.Buffer == NULL) + { + MIDL_user_free(p); + return STATUS_INSUFFICIENT_RESOURCES; + } + + wcscpy(p->DomainName.Buffer, L"COMPUTERNAME"); +#endif + + p->Sid = NULL; /* no domain, no workgroup */ + + *PolicyInformation = (PLSAPR_POLICY_INFORMATION)p; + } + break; + + case PolicyDnsDomainInformation: /* 12 (0xc) */ + { + PLSAPR_POLICY_DNS_DOMAIN_INFO p = MIDL_user_allocate(sizeof(LSAPR_POLICY_DNS_DOMAIN_INFO)); + if (p == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + p->Name.Length = 0; + p->Name.MaximumLength = 0; + p->Name.Buffer = NULL; +#if 0 + p->Name.Length = wcslen(L"COMPUTERNAME"); + p->Name.MaximumLength = p->Name.Length + sizeof(WCHAR); + p->Name.Buffer = MIDL_user_allocate(p->Name.MaximumLength); + if (p->Name.Buffer == NULL) + { + MIDL_user_free(p); + return STATUS_INSUFFICIENT_RESOURCES; + } + + wcscpy(p->Name.Buffer, L"COMPUTERNAME"); +#endif + + p->DnsDomainName.Length = 0; + p->DnsDomainName.MaximumLength = 0; + p->DnsDomainName.Buffer = NULL; + + p->DnsForestName.Length = 0; + p->DnsForestName.MaximumLength = 0; + p->DnsForestName.Buffer = 0; + + memset(&p->DomainGuid, 0, sizeof(GUID)); + + p->Sid = NULL; /* no domain, no workgroup */ + + *PolicyInformation = (PLSAPR_POLICY_INFORMATION)p; + } + break; + + case PolicyAuditLogInformation: + case PolicyPdAccountInformation: + case PolicyLsaServerRoleInformation: + case PolicyReplicaSourceInformation: + case PolicyDefaultQuotaInformation: + case PolicyModificationInformation: + case PolicyAuditFullSetInformation: + case PolicyAuditFullQueryInformation: + case PolicyEfsInformation: + { + FIXME("category not implemented\n"); + return STATUS_UNSUCCESSFUL; + } + } + + return STATUS_SUCCESS; } /* Function 8 */ -NTSTATUS LsarSetInformationPolicy( +NTSTATUS WINAPI LsarSetInformationPolicy( LSAPR_HANDLE PolicyHandle, POLICY_INFORMATION_CLASS InformationClass, PLSAPR_POLICY_INFORMATION PolicyInformation) @@ -265,7 +415,7 @@ NTSTATUS LsarSetInformationPolicy( /* Function 9 */ -NTSTATUS LsarClearAuditLog( +NTSTATUS WINAPI LsarClearAuditLog( LSAPR_HANDLE ObjectHandle) { /* Deprecated */ @@ -274,7 +424,7 @@ NTSTATUS LsarClearAuditLog( /* Function 10 */ -NTSTATUS LsarCreateAccount( +NTSTATUS WINAPI LsarCreateAccount( LSAPR_HANDLE PolicyHandle, PRPC_SID AccountSid, ACCESS_MASK DesiredAccess, @@ -286,7 +436,7 @@ NTSTATUS LsarCreateAccount( /* Function 11 */ -NTSTATUS LsarEnumerateAccounts( +NTSTATUS WINAPI LsarEnumerateAccounts( LSAPR_HANDLE PolicyHandle, DWORD *EnumerationContext, PLSAPR_ACCOUNT_ENUM_BUFFER EnumerationBuffer, @@ -298,7 +448,7 @@ NTSTATUS LsarEnumerateAccounts( /* Function 12 */ -NTSTATUS LsarCreateTrustedDomain( +NTSTATUS WINAPI LsarCreateTrustedDomain( LSAPR_HANDLE PolicyHandle, PLSAPR_TRUST_INFORMATION TrustedDomainInformation, ACCESS_MASK DesiredAccess, @@ -310,7 +460,7 @@ NTSTATUS LsarCreateTrustedDomain( /* Function 13 */ -NTSTATUS LsarEnumerateTrustedDomains( +NTSTATUS WINAPI LsarEnumerateTrustedDomains( LSAPR_HANDLE PolicyHandle, DWORD *EnumerationContext, PLSAPR_TRUSTED_ENUM_BUFFER EnumerationBuffer, @@ -322,7 +472,7 @@ NTSTATUS LsarEnumerateTrustedDomains( /* Function 14 */ -NTSTATUS LsarLookupNames( +NTSTATUS WINAPI LsarLookupNames( LSAPR_HANDLE PolicyHandle, DWORD Count, PRPC_UNICODE_STRING Names, @@ -420,7 +570,7 @@ NTSTATUS LsarLookupNames( /* Function 15 */ -NTSTATUS LsarLookupSids( +NTSTATUS WINAPI LsarLookupSids( LSAPR_HANDLE PolicyHandle, PLSAPR_SID_ENUM_BUFFER SidEnumBuffer, PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, @@ -513,7 +663,7 @@ NTSTATUS LsarLookupSids( /* Function 16 */ -NTSTATUS LsarCreateSecret( +NTSTATUS WINAPI LsarCreateSecret( LSAPR_HANDLE PolicyHandle, PRPC_UNICODE_STRING SecretName, ACCESS_MASK DesiredAccess, @@ -525,7 +675,7 @@ NTSTATUS LsarCreateSecret( /* Function 17 */ -NTSTATUS LsarOpenAccount( +NTSTATUS WINAPI LsarOpenAccount( LSAPR_HANDLE PolicyHandle, PRPC_SID AccountSid, ACCESS_MASK DesiredAccess, @@ -537,7 +687,7 @@ NTSTATUS LsarOpenAccount( /* Function 18 */ -NTSTATUS LsarEnumeratePrivilegesAccount( +NTSTATUS WINAPI LsarEnumeratePrivilegesAccount( LSAPR_HANDLE AccountHandle, PLSAPR_PRIVILEGE_SET *Privileges) { @@ -547,7 +697,7 @@ NTSTATUS LsarEnumeratePrivilegesAccount( /* Function 19 */ -NTSTATUS LsarAddPrivilegesToAccount( +NTSTATUS WINAPI LsarAddPrivilegesToAccount( LSAPR_HANDLE AccountHandle, PLSAPR_PRIVILEGE_SET Privileges) { @@ -557,7 +707,7 @@ NTSTATUS LsarAddPrivilegesToAccount( /* Function 20 */ -NTSTATUS LsarRemovePrivilegesFromAccount( +NTSTATUS WINAPI LsarRemovePrivilegesFromAccount( LSAPR_HANDLE AccountHandle, BOOL AllPrivileges, PLSAPR_PRIVILEGE_SET Privileges) @@ -568,7 +718,7 @@ NTSTATUS LsarRemovePrivilegesFromAccount( /* Function 21 */ -NTSTATUS LsarGetQuotasForAccount( +NTSTATUS WINAPI LsarGetQuotasForAccount( LSAPR_HANDLE AccountHandle, PQUOTA_LIMITS QuotaLimits) { @@ -578,7 +728,7 @@ NTSTATUS LsarGetQuotasForAccount( /* Function 22 */ -NTSTATUS LsarSetQuotasForAccount( +NTSTATUS WINAPI LsarSetQuotasForAccount( LSAPR_HANDLE AccountHandle, PQUOTA_LIMITS QuotaLimits) { @@ -588,7 +738,7 @@ NTSTATUS LsarSetQuotasForAccount( /* Function 23 */ -NTSTATUS LsarGetSystemAccessAccount( +NTSTATUS WINAPI LsarGetSystemAccessAccount( LSAPR_HANDLE AccountHandle, ACCESS_MASK *SystemAccess) { @@ -598,7 +748,7 @@ NTSTATUS LsarGetSystemAccessAccount( /* Function 24 */ -NTSTATUS LsarSetSystemAccessAccount( +NTSTATUS WINAPI LsarSetSystemAccessAccount( LSAPR_HANDLE AccountHandle, ACCESS_MASK SystemAccess) { @@ -608,7 +758,7 @@ NTSTATUS LsarSetSystemAccessAccount( /* Function 25 */ -NTSTATUS LsarOpenTrustedDomain( +NTSTATUS WINAPI LsarOpenTrustedDomain( LSAPR_HANDLE PolicyHandle, PRPC_SID TrustedDomainSid, ACCESS_MASK DesiredAccess, @@ -620,7 +770,7 @@ NTSTATUS LsarOpenTrustedDomain( /* Function 26 */ -NTSTATUS LsarQueryInfoTrustedDomain( +NTSTATUS WINAPI LsarQueryInfoTrustedDomain( LSAPR_HANDLE TrustedDomainHandle, TRUSTED_INFORMATION_CLASS InformationClass, PLSAPR_TRUSTED_DOMAIN_INFO *TrustedDomainInformation) @@ -631,7 +781,7 @@ NTSTATUS LsarQueryInfoTrustedDomain( /* Function 27 */ -NTSTATUS LsarSetInformationTrustedDomain( +NTSTATUS WINAPI LsarSetInformationTrustedDomain( LSAPR_HANDLE TrustedDomainHandle, TRUSTED_INFORMATION_CLASS InformationClass, PLSAPR_TRUSTED_DOMAIN_INFO TrustedDomainInformation) @@ -642,7 +792,7 @@ NTSTATUS LsarSetInformationTrustedDomain( /* Function 28 */ -NTSTATUS LsarOpenSecret( +NTSTATUS WINAPI LsarOpenSecret( LSAPR_HANDLE PolicyHandle, PRPC_UNICODE_STRING SecretName, ACCESS_MASK DesiredAccess, @@ -654,7 +804,7 @@ NTSTATUS LsarOpenSecret( /* Function 29 */ -NTSTATUS LsarSetSecret( +NTSTATUS WINAPI LsarSetSecret( LSAPR_HANDLE *SecretHandle, PLSAPR_CR_CIPHER_VALUE EncryptedCurrentValue, PLSAPR_CR_CIPHER_VALUE EncryptedOldValue) @@ -665,7 +815,7 @@ NTSTATUS LsarSetSecret( /* Function 30 */ -NTSTATUS LsarQuerySecret( +NTSTATUS WINAPI LsarQuerySecret( LSAPR_HANDLE SecretHandle, PLSAPR_CR_CIPHER_VALUE *EncryptedCurrentValue, PLARGE_INTEGER CurrentValueSetTime, @@ -678,7 +828,7 @@ NTSTATUS LsarQuerySecret( /* Function 31 */ -NTSTATUS LsarLookupPrivilegeValue( +NTSTATUS WINAPI LsarLookupPrivilegeValue( LSAPR_HANDLE PolicyHandle, PRPC_UNICODE_STRING Name, PLUID Value) @@ -688,10 +838,13 @@ NTSTATUS LsarLookupPrivilegeValue( TRACE("LsarLookupPrivilegeValue(%p, %wZ, %p)\n", PolicyHandle, Name, Value); - if (!LsapValidateDbHandle(PolicyHandle, LsaDbPolicyHandle)) + Status = LsapValidateDbHandle(PolicyHandle, + LsaDbPolicyHandle, + 0); /* FIXME */ + if (!NT_SUCCESS(Status)) { - ERR("Invalid handle\n"); - return STATUS_INVALID_HANDLE; + ERR("Invalid handle (Status %lx)\n", Status); + return Status; } TRACE("Privilege: %wZ\n", Name); @@ -704,7 +857,7 @@ NTSTATUS LsarLookupPrivilegeValue( /* Function 32 */ -NTSTATUS LsarLookupPrivilegeName( +NTSTATUS WINAPI LsarLookupPrivilegeName( LSAPR_HANDLE PolicyHandle, PLUID Value, PRPC_UNICODE_STRING *Name) @@ -714,10 +867,13 @@ NTSTATUS LsarLookupPrivilegeName( TRACE("LsarLookupPrivilegeName(%p, %p, %p)\n", PolicyHandle, Value, Name); - if (!LsapValidateDbHandle(PolicyHandle, LsaDbPolicyHandle)) + Status = LsapValidateDbHandle(PolicyHandle, + LsaDbPolicyHandle, + 0); /* FIXME */ + if (!NT_SUCCESS(Status)) { ERR("Invalid handle\n"); - return STATUS_INVALID_HANDLE; + return Status; } Status = LsarpLookupPrivilegeName(Value, (PUNICODE_STRING*)Name); @@ -727,7 +883,7 @@ NTSTATUS LsarLookupPrivilegeName( /* Function 33 */ -NTSTATUS LsarLookupPrivilegeDisplayName( +NTSTATUS WINAPI LsarLookupPrivilegeDisplayName( LSAPR_HANDLE PolicyHandle, PRPC_UNICODE_STRING Name, USHORT ClientLanguage, @@ -741,7 +897,7 @@ NTSTATUS LsarLookupPrivilegeDisplayName( /* Function 34 */ -NTSTATUS LsarDeleteObject( +NTSTATUS WINAPI LsarDeleteObject( LSAPR_HANDLE *ObjectHandle) { UNIMPLEMENTED; @@ -750,7 +906,7 @@ NTSTATUS LsarDeleteObject( /* Function 35 */ -NTSTATUS LsarEnumerateAccountsWithUserRight( +NTSTATUS WINAPI LsarEnumerateAccountsWithUserRight( LSAPR_HANDLE PolicyHandle, PRPC_UNICODE_STRING UserRight, PLSAPR_ACCOUNT_ENUM_BUFFER EnumerationBuffer) @@ -761,15 +917,20 @@ NTSTATUS LsarEnumerateAccountsWithUserRight( /* Function 36 */ -NTSTATUS LsarEnmuerateAccountRights( +NTSTATUS WINAPI LsarEnmuerateAccountRights( LSAPR_HANDLE PolicyHandle, PRPC_SID AccountSid, PLSAPR_USER_RIGHT_SET UserRights) { + NTSTATUS Status; + FIXME("(%p,%p,%p) stub\n", PolicyHandle, AccountSid, UserRights); - if (!LsapValidateDbHandle(PolicyHandle, LsaDbPolicyHandle)) - return STATUS_INVALID_HANDLE; + Status = LsapValidateDbHandle(PolicyHandle, + LsaDbPolicyHandle, + 0); /* FIXME */ + if (!NT_SUCCESS(Status)) + return Status; UserRights->Entries = 0; UserRights->UserRights = NULL; @@ -778,7 +939,7 @@ NTSTATUS LsarEnmuerateAccountRights( /* Function 37 */ -NTSTATUS LsarAddAccountRights( +NTSTATUS WINAPI LsarAddAccountRights( LSAPR_HANDLE PolicyHandle, PRPC_SID AccountSid, PLSAPR_USER_RIGHT_SET UserRights) @@ -789,7 +950,7 @@ NTSTATUS LsarAddAccountRights( /* Function 38 */ -NTSTATUS LsarRemoveAccountRights( +NTSTATUS WINAPI LsarRemoveAccountRights( LSAPR_HANDLE PolicyHandle, PRPC_SID AccountSid, BOOL AllRights, @@ -801,7 +962,7 @@ NTSTATUS LsarRemoveAccountRights( /* Function 39 */ -NTSTATUS LsarQueryTrustedDomainInfo( +NTSTATUS WINAPI LsarQueryTrustedDomainInfo( LSAPR_HANDLE PolicyHandle, PRPC_SID TrustedDomainSid, TRUSTED_INFORMATION_CLASS InformationClass, @@ -813,7 +974,7 @@ NTSTATUS LsarQueryTrustedDomainInfo( /* Function 40 */ -NTSTATUS LsarSetTrustedDomainInfo( +NTSTATUS WINAPI LsarSetTrustedDomainInfo( LSAPR_HANDLE PolicyHandle, PRPC_SID TrustedDomainSid, TRUSTED_INFORMATION_CLASS InformationClass, @@ -825,7 +986,7 @@ NTSTATUS LsarSetTrustedDomainInfo( /* Function 41 */ -NTSTATUS LsarDeleteTrustedDomain( +NTSTATUS WINAPI LsarDeleteTrustedDomain( LSAPR_HANDLE PolicyHandle, PRPC_SID TrustedDomainSid) { @@ -835,7 +996,7 @@ NTSTATUS LsarDeleteTrustedDomain( /* Function 42 */ -NTSTATUS LsarStorePrivateData( +NTSTATUS WINAPI LsarStorePrivateData( LSAPR_HANDLE PolicyHandle, PRPC_UNICODE_STRING KeyName, PLSAPR_CR_CIPHER_VALUE EncryptedData) @@ -846,7 +1007,7 @@ NTSTATUS LsarStorePrivateData( /* Function 43 */ -NTSTATUS LsarRetrievePrivateData( +NTSTATUS WINAPI LsarRetrievePrivateData( LSAPR_HANDLE PolicyHandle, PRPC_UNICODE_STRING KeyName, PLSAPR_CR_CIPHER_VALUE *EncryptedData) @@ -857,7 +1018,7 @@ NTSTATUS LsarRetrievePrivateData( /* Function 44 */ -NTSTATUS LsarOpenPolicy2( +NTSTATUS WINAPI LsarOpenPolicy2( LPWSTR SystemName, PLSAPR_OBJECT_ATTRIBUTES ObjectAttributes, ACCESS_MASK DesiredAccess, @@ -869,7 +1030,7 @@ NTSTATUS LsarOpenPolicy2( /* Function 45 */ -NTSTATUS LsarGetUserName( +NTSTATUS WINAPI LsarGetUserName( LPWSTR SystemName, PRPC_UNICODE_STRING *UserName, PRPC_UNICODE_STRING *DomainName) @@ -880,7 +1041,7 @@ NTSTATUS LsarGetUserName( /* Function 46 */ -NTSTATUS LsarQueryInformationPolicy2( +NTSTATUS WINAPI LsarQueryInformationPolicy2( LSAPR_HANDLE PolicyHandle, POLICY_INFORMATION_CLASS InformationClass, unsigned long *PolicyInformation) @@ -891,7 +1052,7 @@ NTSTATUS LsarQueryInformationPolicy2( /* Function 47 */ -NTSTATUS LsarSetInformationPolicy2( +NTSTATUS WINAPI LsarSetInformationPolicy2( LSAPR_HANDLE PolicyHandle, POLICY_INFORMATION_CLASS InformationClass, unsigned long PolicyInformation) @@ -902,7 +1063,7 @@ NTSTATUS LsarSetInformationPolicy2( /* Function 48 */ -NTSTATUS LsarQueryTrustedDomainInfoByName( +NTSTATUS WINAPI LsarQueryTrustedDomainInfoByName( LSAPR_HANDLE PolicyHandle, PRPC_UNICODE_STRING TrustedDomainName, POLICY_INFORMATION_CLASS InformationClass, @@ -914,7 +1075,7 @@ NTSTATUS LsarQueryTrustedDomainInfoByName( /* Function 49 */ -NTSTATUS LsarSetTrustedDomainInfoByName( +NTSTATUS WINAPI LsarSetTrustedDomainInfoByName( LSAPR_HANDLE PolicyHandle, PRPC_UNICODE_STRING TrustedDomainName, POLICY_INFORMATION_CLASS InformationClass, @@ -926,7 +1087,7 @@ NTSTATUS LsarSetTrustedDomainInfoByName( /* Function 50 */ -NTSTATUS LsarEnumerateTrustedDomainsEx( +NTSTATUS WINAPI LsarEnumerateTrustedDomainsEx( LSAPR_HANDLE PolicyHandle, DWORD *EnumerationContext, PLSAPR_TRUSTED_ENUM_BUFFER_EX EnumerationBuffer, @@ -938,7 +1099,7 @@ NTSTATUS LsarEnumerateTrustedDomainsEx( /* Function 51 */ -NTSTATUS LsarCreateTrustedDomainEx( +NTSTATUS WINAPI LsarCreateTrustedDomainEx( LSAPR_HANDLE PolicyHandle, PLSAPR_TRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation, PLSAPR_TRUSTED_DOMAIN_AUTH_INFORMATION AuthentificationInformation, @@ -951,7 +1112,7 @@ NTSTATUS LsarCreateTrustedDomainEx( /* Function 52 */ -NTSTATUS LsarSetPolicyReplicationHandle( +NTSTATUS WINAPI LsarSetPolicyReplicationHandle( PLSAPR_HANDLE PolicyHandle) { /* Deprecated */ @@ -960,7 +1121,7 @@ NTSTATUS LsarSetPolicyReplicationHandle( /* Function 53 */ -NTSTATUS LsarQueryDomainInformationPolicy( +NTSTATUS WINAPI LsarQueryDomainInformationPolicy( LSAPR_HANDLE PolicyHandle, POLICY_INFORMATION_CLASS InformationClass, unsigned long *PolicyInformation) @@ -971,7 +1132,7 @@ NTSTATUS LsarQueryDomainInformationPolicy( /* Function 54 */ -NTSTATUS LsarSetDomainInformationPolicy( +NTSTATUS WINAPI LsarSetDomainInformationPolicy( LSAPR_HANDLE PolicyHandle, POLICY_INFORMATION_CLASS InformationClass, unsigned long PolicyInformation) @@ -982,7 +1143,7 @@ NTSTATUS LsarSetDomainInformationPolicy( /* Function 55 */ -NTSTATUS LsarOpenTrustedDomainByName( +NTSTATUS WINAPI LsarOpenTrustedDomainByName( LSAPR_HANDLE PolicyHandle, PRPC_UNICODE_STRING TrustedDomainName, ACCESS_MASK DesiredAccess, @@ -994,7 +1155,7 @@ NTSTATUS LsarOpenTrustedDomainByName( /* Function 56 */ -NTSTATUS LsarTestCall( +NTSTATUS WINAPI LsarTestCall( handle_t hBinding) { UNIMPLEMENTED; @@ -1003,7 +1164,7 @@ NTSTATUS LsarTestCall( /* Function 57 */ -NTSTATUS LsarLookupSids2( +NTSTATUS WINAPI LsarLookupSids2( LSAPR_HANDLE PolicyHandle, PLSAPR_SID_ENUM_BUFFER SidEnumBuffer, PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, @@ -1019,7 +1180,7 @@ NTSTATUS LsarLookupSids2( /* Function 58 */ -NTSTATUS LsarLookupNames2( +NTSTATUS WINAPI LsarLookupNames2( LSAPR_HANDLE PolicyHandle, DWORD Count, PRPC_UNICODE_STRING Names, @@ -1036,7 +1197,7 @@ NTSTATUS LsarLookupNames2( /* Function 59 */ -NTSTATUS LsarCreateTrustedDomainEx2( +NTSTATUS WINAPI LsarCreateTrustedDomainEx2( LSAPR_HANDLE PolicyHandle, PLSAPR_TRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation, PLSAPR_TRUSTED_DOMAIN_AUTH_INFORMATION_INTERNAL AuthentificationInformation, @@ -1049,7 +1210,7 @@ NTSTATUS LsarCreateTrustedDomainEx2( /* Function 60 */ -NTSTATUS CredrWrite( +NTSTATUS WINAPI CredrWrite( handle_t hBinding) { UNIMPLEMENTED; @@ -1058,7 +1219,7 @@ NTSTATUS CredrWrite( /* Function 61 */ -NTSTATUS CredrRead( +NTSTATUS WINAPI CredrRead( handle_t hBinding) { UNIMPLEMENTED; @@ -1067,7 +1228,7 @@ NTSTATUS CredrRead( /* Function 62 */ -NTSTATUS CredrEnumerate( +NTSTATUS WINAPI CredrEnumerate( handle_t hBinding) { UNIMPLEMENTED; @@ -1076,7 +1237,7 @@ NTSTATUS CredrEnumerate( /* Function 63 */ -NTSTATUS CredrWriteDomainCredentials( +NTSTATUS WINAPI CredrWriteDomainCredentials( handle_t hBinding) { UNIMPLEMENTED; @@ -1085,7 +1246,7 @@ NTSTATUS CredrWriteDomainCredentials( /* Function 64 */ -NTSTATUS CredrReadDomainCredentials( +NTSTATUS WINAPI CredrReadDomainCredentials( handle_t hBinding) { UNIMPLEMENTED; @@ -1094,7 +1255,7 @@ NTSTATUS CredrReadDomainCredentials( /* Function 65 */ -NTSTATUS CredrDelete( +NTSTATUS WINAPI CredrDelete( handle_t hBinding) { UNIMPLEMENTED; @@ -1103,7 +1264,7 @@ NTSTATUS CredrDelete( /* Function 66 */ -NTSTATUS CredrGetTargetInfo( +NTSTATUS WINAPI CredrGetTargetInfo( handle_t hBinding) { UNIMPLEMENTED; @@ -1112,7 +1273,7 @@ NTSTATUS CredrGetTargetInfo( /* Function 67 */ -NTSTATUS CredrProfileLoaded( +NTSTATUS WINAPI CredrProfileLoaded( handle_t hBinding) { UNIMPLEMENTED; @@ -1121,7 +1282,7 @@ NTSTATUS CredrProfileLoaded( /* Function 68 */ -NTSTATUS LsarLookupNames3( +NTSTATUS WINAPI LsarLookupNames3( LSAPR_HANDLE PolicyHandle, DWORD Count, PRPC_UNICODE_STRING Names, @@ -1138,7 +1299,7 @@ NTSTATUS LsarLookupNames3( /* Function 69 */ -NTSTATUS CredrGetSessionTypes( +NTSTATUS WINAPI CredrGetSessionTypes( handle_t hBinding) { UNIMPLEMENTED; @@ -1147,7 +1308,7 @@ NTSTATUS CredrGetSessionTypes( /* Function 70 */ -NTSTATUS LsarRegisterAuditEvent( +NTSTATUS WINAPI LsarRegisterAuditEvent( handle_t hBinding) { UNIMPLEMENTED; @@ -1156,7 +1317,7 @@ NTSTATUS LsarRegisterAuditEvent( /* Function 71 */ -NTSTATUS LsarGenAuditEvent( +NTSTATUS WINAPI LsarGenAuditEvent( handle_t hBinding) { UNIMPLEMENTED; @@ -1165,7 +1326,7 @@ NTSTATUS LsarGenAuditEvent( /* Function 72 */ -NTSTATUS LsarUnregisterAuditEvent( +NTSTATUS WINAPI LsarUnregisterAuditEvent( handle_t hBinding) { UNIMPLEMENTED; @@ -1174,7 +1335,7 @@ NTSTATUS LsarUnregisterAuditEvent( /* Function 73 */ -NTSTATUS LsarQueryForestTrustInformation( +NTSTATUS WINAPI LsarQueryForestTrustInformation( LSAPR_HANDLE PolicyHandle, PLSA_UNICODE_STRING TrustedDomainName, LSA_FOREST_TRUST_RECORD_TYPE HighestRecordType, @@ -1186,7 +1347,7 @@ NTSTATUS LsarQueryForestTrustInformation( /* Function 74 */ -NTSTATUS LsarSetForestTrustInformation( +NTSTATUS WINAPI LsarSetForestTrustInformation( LSAPR_HANDLE PolicyHandle, PLSA_UNICODE_STRING TrustedDomainName, LSA_FOREST_TRUST_RECORD_TYPE HighestRecordType, @@ -1200,7 +1361,7 @@ NTSTATUS LsarSetForestTrustInformation( /* Function 75 */ -NTSTATUS CredrRename( +NTSTATUS WINAPI CredrRename( handle_t hBinding) { UNIMPLEMENTED; @@ -1209,7 +1370,7 @@ NTSTATUS CredrRename( /* Function 76 */ -NTSTATUS LsarLookupSids3( +NTSTATUS WINAPI LsarLookupSids3( LSAPR_HANDLE PolicyHandle, PLSAPR_SID_ENUM_BUFFER SidEnumBuffer, PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, @@ -1225,7 +1386,7 @@ NTSTATUS LsarLookupSids3( /* Function 77 */ -NTSTATUS LsarLookupNames4( +NTSTATUS WINAPI LsarLookupNames4( handle_t RpcHandle, DWORD Count, PRPC_UNICODE_STRING Names, @@ -1242,7 +1403,7 @@ NTSTATUS LsarLookupNames4( /* Function 78 */ -NTSTATUS LsarOpenPolicySce( +NTSTATUS WINAPI LsarOpenPolicySce( handle_t hBinding) { UNIMPLEMENTED; @@ -1251,7 +1412,7 @@ NTSTATUS LsarOpenPolicySce( /* Function 79 */ -NTSTATUS LsarAdtRegisterSecurityEventSource( +NTSTATUS WINAPI LsarAdtRegisterSecurityEventSource( handle_t hBinding) { UNIMPLEMENTED; @@ -1260,7 +1421,7 @@ NTSTATUS LsarAdtRegisterSecurityEventSource( /* Function 80 */ -NTSTATUS LsarAdtUnregisterSecurityEventSource( +NTSTATUS WINAPI LsarAdtUnregisterSecurityEventSource( handle_t hBinding) { UNIMPLEMENTED; @@ -1269,7 +1430,7 @@ NTSTATUS LsarAdtUnregisterSecurityEventSource( /* Function 81 */ -NTSTATUS LsarAdtReportSecurityEvent( +NTSTATUS WINAPI LsarAdtReportSecurityEvent( handle_t hBinding) { UNIMPLEMENTED; @@ -1278,7 +1439,7 @@ NTSTATUS LsarAdtReportSecurityEvent( /* Function 82 */ -NTSTATUS CredrFindBestCredential( +NTSTATUS WINAPI CredrFindBestCredential( handle_t hBinding) { UNIMPLEMENTED; @@ -1287,7 +1448,7 @@ NTSTATUS CredrFindBestCredential( /* Function 83 */ -NTSTATUS LsarSetAuditPolicy( +NTSTATUS WINAPI LsarSetAuditPolicy( handle_t hBinding) { UNIMPLEMENTED; @@ -1296,7 +1457,7 @@ NTSTATUS LsarSetAuditPolicy( /* Function 84 */ -NTSTATUS LsarQueryAuditPolicy( +NTSTATUS WINAPI LsarQueryAuditPolicy( handle_t hBinding) { UNIMPLEMENTED; @@ -1305,7 +1466,7 @@ NTSTATUS LsarQueryAuditPolicy( /* Function 85 */ -NTSTATUS LsarEnumerateAuditPolicy( +NTSTATUS WINAPI LsarEnumerateAuditPolicy( handle_t hBinding) { UNIMPLEMENTED; @@ -1314,7 +1475,7 @@ NTSTATUS LsarEnumerateAuditPolicy( /* Function 86 */ -NTSTATUS LsarEnumerateAuditCategories( +NTSTATUS WINAPI LsarEnumerateAuditCategories( handle_t hBinding) { UNIMPLEMENTED; @@ -1323,7 +1484,7 @@ NTSTATUS LsarEnumerateAuditCategories( /* Function 87 */ -NTSTATUS LsarEnumerateAuditSubCategories( +NTSTATUS WINAPI LsarEnumerateAuditSubCategories( handle_t hBinding) { UNIMPLEMENTED; @@ -1332,7 +1493,7 @@ NTSTATUS LsarEnumerateAuditSubCategories( /* Function 88 */ -NTSTATUS LsarLookupAuditCategoryName( +NTSTATUS WINAPI LsarLookupAuditCategoryName( handle_t hBinding) { UNIMPLEMENTED; @@ -1341,7 +1502,7 @@ NTSTATUS LsarLookupAuditCategoryName( /* Function 89 */ -NTSTATUS LsarLookupAuditSubCategoryName( +NTSTATUS WINAPI LsarLookupAuditSubCategoryName( handle_t hBinding) { UNIMPLEMENTED; @@ -1350,7 +1511,7 @@ NTSTATUS LsarLookupAuditSubCategoryName( /* Function 90 */ -NTSTATUS LsarSetAuditSecurity( +NTSTATUS WINAPI LsarSetAuditSecurity( handle_t hBinding) { UNIMPLEMENTED; @@ -1359,7 +1520,7 @@ NTSTATUS LsarSetAuditSecurity( /* Function 91 */ -NTSTATUS LsarQueryAuditSecurity( +NTSTATUS WINAPI LsarQueryAuditSecurity( handle_t hBinding) { UNIMPLEMENTED; @@ -1368,7 +1529,7 @@ NTSTATUS LsarQueryAuditSecurity( /* Function 92 */ -NTSTATUS CredReadByTokenHandle( +NTSTATUS WINAPI CredReadByTokenHandle( handle_t hBinding) { UNIMPLEMENTED; @@ -1377,7 +1538,7 @@ NTSTATUS CredReadByTokenHandle( /* Function 93 */ -NTSTATUS CredrRestoreCredentials( +NTSTATUS WINAPI CredrRestoreCredentials( handle_t hBinding) { UNIMPLEMENTED; @@ -1386,7 +1547,7 @@ NTSTATUS CredrRestoreCredentials( /* Function 94 */ -NTSTATUS CredrBackupCredentials( +NTSTATUS WINAPI CredrBackupCredentials( handle_t hBinding) { UNIMPLEMENTED; diff --git a/dll/win32/lsasrv/lsasrv.c b/dll/win32/lsasrv/lsasrv.c index c6468a47e03..1a007ecef16 100644 --- a/dll/win32/lsasrv/lsasrv.c +++ b/dll/win32/lsasrv/lsasrv.c @@ -64,6 +64,14 @@ LsapInitLsa(VOID) } +NTSTATUS WINAPI +ServiceInit(VOID) +{ + TRACE("ServiceInit() called\n"); + return STATUS_SUCCESS; +} + + void __RPC_FAR * __RPC_USER midl_user_allocate(SIZE_T len) { return RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, len); diff --git a/dll/win32/lsasrv/lsasrv.spec b/dll/win32/lsasrv/lsasrv.spec index 17f5d363039..7372ad6258e 100644 --- a/dll/win32/lsasrv/lsasrv.spec +++ b/dll/win32/lsasrv/lsasrv.spec @@ -30,36 +30,36 @@ @ stub LsaISetupWasRun @ stub LsapAuOpenSam @ stdcall LsapInitLsa() - @ stub LsarAddPrivilegesToAccount - @ stub LsarClose - @ stub LsarCreateAccount - @ stub LsarCreateSecret - @ stub LsarCreateTrustedDomain - @ stub LsarDelete - @ stub LsarEnumerateAccounts - @ stub LsarEnumeratePrivileges - @ stub LsarEnumeratePrivilegesAccount - @ stub LsarEnumerateTrustedDomains - @ stub LsarGetQuotasForAccount - @ stub LsarGetSystemAccessAccount - @ stub LsarLookupNames - @ stub LsarLookupPrivilegeDisplayName - @ stub LsarLookupPrivilegeName - @ stub LsarLookupPrivilegeValue - @ stub LsarLookupSids - @ stub LsarOpenAccount - @ stub LsarOpenPolicy - @ stub LsarOpenSecret - @ stub LsarOpenTrustedDomain - @ stub LsarQueryInfoTrustedDomain - @ stub LsarQueryInformationPolicy - @ stub LsarQuerySecret - @ stub LsarQuerySecurityObject - @ stub LsarRemovePrivilegesFromAccount - @ stub LsarSetInformationPolicy - @ stub LsarSetInformationTrustedDomain - @ stub LsarSetQuotasForAccount - @ stub LsarSetSecret - @ stub LsarSetSecurityObject - @ stub LsarSetSystemAccessAccount - @ stub ServiceInit + @ stdcall LsarAddPrivilegesToAccount(ptr ptr) + @ stdcall LsarClose(ptr) + @ stdcall LsarCreateAccount(ptr ptr long ptr) + @ stdcall LsarCreateSecret(ptr ptr long ptr) + @ stdcall LsarCreateTrustedDomain(ptr ptr long ptr) + @ stdcall LsarDelete(ptr) + @ stdcall LsarEnumerateAccounts(ptr ptr ptr long) + @ stdcall LsarEnumeratePrivileges(ptr ptr ptr long) + @ stdcall LsarEnumeratePrivilegesAccount(ptr ptr) + @ stdcall LsarEnumerateTrustedDomains(ptr ptr ptr long) + @ stdcall LsarGetQuotasForAccount(ptr ptr) + @ stdcall LsarGetSystemAccessAccount(ptr ptr) + @ stdcall LsarLookupNames(ptr long ptr ptr ptr long ptr) + @ stdcall LsarLookupPrivilegeDisplayName(ptr ptr long long ptr ptr) + @ stdcall LsarLookupPrivilegeName(ptr ptr ptr) + @ stdcall LsarLookupPrivilegeValue(ptr ptr ptr) + @ stdcall LsarLookupSids(ptr ptr ptr ptr long ptr) + @ stdcall LsarOpenAccount(ptr ptr long ptr) + @ stdcall LsarOpenPolicy(ptr ptr long ptr) + @ stdcall LsarOpenSecret(ptr ptr long ptr) + @ stdcall LsarOpenTrustedDomain(ptr ptr long ptr) + @ stdcall LsarQueryInfoTrustedDomain(ptr long ptr) + @ stdcall LsarQueryInformationPolicy(ptr long ptr) + @ stdcall LsarQuerySecret(ptr ptr ptr ptr ptr) + @ stdcall LsarQuerySecurityObject(ptr long ptr) + @ stdcall LsarRemovePrivilegesFromAccount(ptr long ptr) + @ stdcall LsarSetInformationPolicy(ptr long ptr) + @ stdcall LsarSetInformationTrustedDomain(ptr long ptr) + @ stdcall LsarSetQuotasForAccount(ptr ptr) + @ stdcall LsarSetSecret(ptr ptr ptr) + @ stdcall LsarSetSecurityObject(ptr long ptr) + @ stdcall LsarSetSystemAccessAccount(ptr long) + @ stdcall ServiceInit() diff --git a/dll/win32/msi/action.c b/dll/win32/msi/action.c index bb559c016af..808386f96e9 100644 --- a/dll/win32/msi/action.c +++ b/dll/win32/msi/action.c @@ -1785,7 +1785,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) BOOL feature_state = ((feature->Level > 0) && (feature->Level <= level)); - if ((feature_state) && (feature->Action == INSTALLSTATE_UNKNOWN)) + if (feature_state && feature->ActionRequest == INSTALLSTATE_UNKNOWN) { if (feature->Attributes & msidbFeatureAttributesFavorSource) msi_feature_set_state(package, feature, INSTALLSTATE_SOURCE); @@ -1814,7 +1814,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) { BOOL selected = feature->Level > 0 && feature->Level <= level; - if (selected && feature->Action == INSTALLSTATE_UNKNOWN) + if (selected && feature->ActionRequest == INSTALLSTATE_UNKNOWN) { msi_feature_set_state(package, feature, feature->Installed); } @@ -1839,7 +1839,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) LIST_FOR_EACH_ENTRY( cl, &feature->Components, ComponentList, entry ) { if (cl->component->ForceLocalState && - feature->Action == INSTALLSTATE_SOURCE) + feature->ActionRequest == INSTALLSTATE_SOURCE) { msi_feature_set_state(package, feature, INSTALLSTATE_LOCAL); break; @@ -1850,7 +1850,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) { component = cl->component; - switch (feature->Action) + switch (feature->ActionRequest) { case INSTALLSTATE_ABSENT: component->anyAbsent = 1; @@ -1985,7 +1985,7 @@ static UINT ITERATE_CostFinalizeConditions(MSIRECORD *row, LPVOID param) VS_FIXEDFILEINFO *msi_get_disk_file_version( LPCWSTR filename ) { static const WCHAR name[] = {'\\',0}; - VS_FIXEDFILEINFO *ret; + VS_FIXEDFILEINFO *ptr, *ret; LPVOID version; DWORD versize, handle; UINT sz; @@ -2002,12 +2002,15 @@ VS_FIXEDFILEINFO *msi_get_disk_file_version( LPCWSTR filename ) GetFileVersionInfoW( filename, 0, versize, version ); - if (!VerQueryValueW( version, name, (LPVOID *)&ret, &sz )) + if (!VerQueryValueW( version, name, (LPVOID *)&ptr, &sz )) { msi_free( version ); return NULL; } + ret = msi_alloc( sz ); + memcpy( ret, ptr, sz ); + msi_free( version ); return ret; } @@ -2371,17 +2374,43 @@ static const WCHAR *get_root_key( MSIPACKAGE *package, INT root, HKEY *root_key return ret; } +static WCHAR *get_keypath( MSIPACKAGE *package, HKEY root, const WCHAR *path ) +{ + static const WCHAR prefixW[] = {'S','O','F','T','W','A','R','E','\\'}; + static const UINT len = sizeof(prefixW) / sizeof(prefixW[0]); + + if (is_64bit && package->platform == PLATFORM_INTEL && + root == HKEY_LOCAL_MACHINE && !strncmpiW( path, prefixW, len )) + { + UINT size; + WCHAR *path_32node; + + size = (strlenW( path ) + strlenW( szWow6432Node ) + 1) * sizeof(WCHAR); + path_32node = msi_alloc( size ); + if (!path_32node) + return NULL; + + memcpy( path_32node, path, len * sizeof(WCHAR) ); + path_32node[len] = 0; + strcatW( path_32node, szWow6432Node ); + strcatW( path_32node, szBackSlash ); + strcatW( path_32node, path + len ); + return path_32node; + } + + return strdupW( path ); +} + static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param) { MSIPACKAGE *package = param; LPSTR value_data = NULL; HKEY root_key, hkey; DWORD type,size; - LPWSTR deformated; + LPWSTR deformated, uikey, keypath; LPCWSTR szRoot, component, name, key, value; MSICOMPONENT *comp; MSIRECORD * uirow; - LPWSTR uikey; INT root; BOOL check_first = FALSE; UINT rc; @@ -2432,14 +2461,14 @@ static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param) strcpyW(uikey,szRoot); strcatW(uikey,deformated); - if (RegCreateKeyW( root_key, deformated, &hkey)) + keypath = get_keypath( package, root_key, deformated ); + msi_free( deformated ); + if (RegCreateKeyW( root_key, keypath, &hkey )) { - ERR("Could not create key %s\n",debugstr_w(deformated)); - msi_free(deformated); + ERR("Could not create key %s\n", debugstr_w(keypath)); msi_free(uikey); return ERROR_SUCCESS; } - msi_free(deformated); value = MSI_RecordGetString(row,5); if (value) @@ -2554,7 +2583,7 @@ static UINT ITERATE_RemoveRegistryValuesOnUninstall( MSIRECORD *row, LPVOID para { MSIPACKAGE *package = param; LPCWSTR component, name, key_str, root_key_str; - LPWSTR deformated_key, deformated_name, ui_key_str; + LPWSTR deformated_key, deformated_name, ui_key_str, keypath; MSICOMPONENT *comp; MSIRECORD *uirow; BOOL delete_key = FALSE; @@ -2610,8 +2639,10 @@ static UINT ITERATE_RemoveRegistryValuesOnUninstall( MSIRECORD *row, LPVOID para deformat_string( package, name, &deformated_name ); - delete_reg_key_or_value( hkey_root, deformated_key, deformated_name, delete_key ); + keypath = get_keypath( package, hkey_root, deformated_key ); msi_free( deformated_key ); + delete_reg_key_or_value( hkey_root, keypath, deformated_name, delete_key ); + msi_free( keypath ); uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, ui_key_str ); @@ -2629,7 +2660,7 @@ static UINT ITERATE_RemoveRegistryValuesOnInstall( MSIRECORD *row, LPVOID param { MSIPACKAGE *package = param; LPCWSTR component, name, key_str, root_key_str; - LPWSTR deformated_key, deformated_name, ui_key_str; + LPWSTR deformated_key, deformated_name, ui_key_str, keypath; MSICOMPONENT *comp; MSIRECORD *uirow; BOOL delete_key = FALSE; @@ -2682,8 +2713,10 @@ static UINT ITERATE_RemoveRegistryValuesOnInstall( MSIRECORD *row, LPVOID param deformat_string( package, name, &deformated_name ); - delete_reg_key_or_value( hkey_root, deformated_key, deformated_name, delete_key ); + keypath = get_keypath( package, hkey_root, deformated_key ); msi_free( deformated_key ); + delete_reg_key_or_value( hkey_root, keypath, deformated_name, delete_key ); + msi_free( keypath ); uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, ui_key_str ); @@ -3891,7 +3924,7 @@ static UINT msi_publish_patches( MSIPACKAGE *package ) WCHAR *p, *all_patches = NULL; DWORD len = 0; - r = MSIREG_OpenProductKey( package->ProductCode, NULL, package->Context, &product_key, FALSE ); + r = MSIREG_OpenProductKey( package->ProductCode, NULL, package->Context, &product_key, TRUE ); if (r != ERROR_SUCCESS) return ERROR_FUNCTION_FAILED; @@ -4759,7 +4792,7 @@ static UINT ACTION_RegisterProduct(MSIPACKAGE *package) if (!msi_check_publish(package)) return ERROR_SUCCESS; - rc = MSIREG_OpenUninstallKey(package->ProductCode, &hkey, TRUE); + rc = MSIREG_OpenUninstallKey(package, &hkey, TRUE); if (rc != ERROR_SUCCESS) return rc; @@ -4839,7 +4872,7 @@ static UINT msi_unpublish_product(MSIPACKAGE *package, WCHAR *remove) MSIREG_DeleteProductKey(package->ProductCode); MSIREG_DeleteUserDataProductKey(package->ProductCode); - MSIREG_DeleteUninstallKey(package->ProductCode); + MSIREG_DeleteUninstallKey(package); if (package->Context == MSIINSTALLCONTEXT_MACHINE) { @@ -7498,7 +7531,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath, msi_clone_properties( package ); msi_parse_command_line( package, szCommandLine, FALSE ); - msi_adjust_allusers_property( package ); + msi_adjust_privilege_properties( package ); msi_set_context( package ); if (needs_ui_sequence( package)) diff --git a/dll/win32/msi/appsearch.c b/dll/win32/msi/appsearch.c index a516bdad1c8..dfab3960b01 100644 --- a/dll/win32/msi/appsearch.c +++ b/dll/win32/msi/appsearch.c @@ -89,7 +89,7 @@ static UINT ACTION_AppSearchGetSignature(MSIPACKAGE *package, MSISIGNATURE *sig, 'S','i','g','n','a','t','u','r','e',' ', 'w','h','e','r','e',' ','S','i','g','n','a','t','u','r','e',' ','=',' ', '\'','%','s','\'',0}; - LPWSTR minVersion, maxVersion; + LPWSTR minVersion, maxVersion, p; MSIRECORD *row; DWORD time; @@ -106,6 +106,12 @@ static UINT ACTION_AppSearchGetSignature(MSIPACKAGE *package, MSISIGNATURE *sig, /* get properties */ sig->File = msi_dup_record_field(row,2); + if ((p = strchrW(sig->File, '|'))) + { + p++; + memmove(sig->File, p, (strlenW(p) + 1) * sizeof(WCHAR)); + } + minVersion = msi_dup_record_field(row,3); if (minVersion) { diff --git a/dll/win32/msi/classes.c b/dll/win32/msi/classes.c index 30ee36b4bfd..beaf1f0ff93 100644 --- a/dll/win32/msi/classes.c +++ b/dll/win32/msi/classes.c @@ -804,12 +804,19 @@ static UINT register_appid(const MSIAPPID *appid, LPCWSTR app ) UINT ACTION_RegisterClassInfo(MSIPACKAGE *package) { static const WCHAR szFileType_fmt[] = {'F','i','l','e','T','y','p','e','\\','%','s','\\','%','i',0}; + const WCHAR *keypath; MSIRECORD *uirow; HKEY hkey,hkey2,hkey3; MSICLASS *cls; load_classes_and_such(package); - if (RegCreateKeyW(HKEY_CLASSES_ROOT, szCLSID, &hkey) != ERROR_SUCCESS) + + if (is_64bit && package->platform == PLATFORM_INTEL) + keypath = szWow6432NodeCLSID; + else + keypath = szCLSID; + + if (RegCreateKeyW(HKEY_CLASSES_ROOT, keypath, &hkey) != ERROR_SUCCESS) return ERROR_FUNCTION_FAILED; LIST_FOR_EACH_ENTRY( cls, &package->classes, MSICLASS, entry ) @@ -963,12 +970,19 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package) UINT ACTION_UnregisterClassInfo( MSIPACKAGE *package ) { static const WCHAR szFileType[] = {'F','i','l','e','T','y','p','e','\\',0}; + const WCHAR *keypath; MSIRECORD *uirow; MSICLASS *cls; HKEY hkey, hkey2; load_classes_and_such( package ); - if (RegOpenKeyW( HKEY_CLASSES_ROOT, szCLSID, &hkey ) != ERROR_SUCCESS) + + if (is_64bit && package->platform == PLATFORM_INTEL) + keypath = szWow6432NodeCLSID; + else + keypath = szCLSID; + + if (RegOpenKeyW( HKEY_CLASSES_ROOT, keypath, &hkey ) != ERROR_SUCCESS) return ERROR_SUCCESS; LIST_FOR_EACH_ENTRY( cls, &package->classes, MSICLASS, entry ) @@ -1072,7 +1086,7 @@ static UINT register_progid( const MSIPROGID* progid ) if (clsid) msi_reg_set_subkey_val( hkey, szCLSID, NULL, clsid ); else - ERR("%s has no class\n", debugstr_w( progid->ProgID ) ); + TRACE("%s has no class\n", debugstr_w( progid->ProgID ) ); if (progid->Description) msi_reg_set_val_str( hkey, NULL, progid->Description ); diff --git a/dll/win32/msi/cond.tab.c b/dll/win32/msi/cond.tab.c index 2b10d209be6..e68723db89b 100644 --- a/dll/win32/msi/cond.tab.c +++ b/dll/win32/msi/cond.tab.c @@ -2329,11 +2329,21 @@ static INT compare_substring( LPCWSTR a, INT operator, LPCWSTR b ) case COND_LHS: return 0 == strncmpW( a, b, lstrlenW( b ) ); case COND_RHS: - return 0 == lstrcmpW( a + (lstrlenW( a ) - lstrlenW( b )), b ); + { + int l = lstrlenW( a ); + int r = lstrlenW( b ); + if (r > l) return 0; + return 0 == lstrcmpW( a + (l - r), b ); + } case COND_ILHS: return 0 == strncmpiW( a, b, lstrlenW( b ) ); case COND_IRHS: - return 0 == lstrcmpiW( a + (lstrlenW( a ) - lstrlenW( b )), b ); + { + int l = lstrlenW( a ); + int r = lstrlenW( b ); + if (r > l) return 0; + return 0 == lstrcmpiW( a + (l - r), b ); + } default: ERR("invalid substring operator\n"); return 0; diff --git a/dll/win32/msi/cond.y b/dll/win32/msi/cond.y index 9a7a16d67df..03ea4938ade 100644 --- a/dll/win32/msi/cond.y +++ b/dll/win32/msi/cond.y @@ -462,11 +462,21 @@ static INT compare_substring( LPCWSTR a, INT operator, LPCWSTR b ) case COND_LHS: return 0 == strncmpW( a, b, lstrlenW( b ) ); case COND_RHS: - return 0 == lstrcmpW( a + (lstrlenW( a ) - lstrlenW( b )), b ); + { + int l = lstrlenW( a ); + int r = lstrlenW( b ); + if (r > l) return 0; + return 0 == lstrcmpW( a + (l - r), b ); + } case COND_ILHS: return 0 == strncmpiW( a, b, lstrlenW( b ) ); case COND_IRHS: - return 0 == lstrcmpiW( a + (lstrlenW( a ) - lstrlenW( b )), b ); + { + int l = lstrlenW( a ); + int r = lstrlenW( b ); + if (r > l) return 0; + return 0 == lstrcmpiW( a + (l - r), b ); + } default: ERR("invalid substring operator\n"); return 0; diff --git a/dll/win32/msi/custom.c b/dll/win32/msi/custom.c index 5a1787f7d15..b56139fb665 100644 --- a/dll/win32/msi/custom.c +++ b/dll/win32/msi/custom.c @@ -222,13 +222,6 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL if (type & msidbCustomActionTypeNoImpersonate) WARN("msidbCustomActionTypeNoImpersonate not handled\n"); - if (type & msidbCustomActionTypeRollback) - { - FIXME("Rollback only action... rollbacks not supported yet\n"); - schedule_action(package, ROLLBACK_SCRIPT, action); - rc = ERROR_SUCCESS; - goto end; - } if (!execute) { LPWSTR actiondata = msi_dup_property(package->db, action); @@ -238,12 +231,17 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL if (type & msidbCustomActionTypeCommit) { - TRACE("Deferring Commit Action!\n"); + TRACE("Deferring commit action\n"); schedule_action(package, COMMIT_SCRIPT, deferred); } + else if (type & msidbCustomActionTypeRollback) + { + FIXME("Deferring rollback only action... rollbacks not supported yet\n"); + schedule_action(package, ROLLBACK_SCRIPT, deferred); + } else { - TRACE("Deferring Action!\n"); + TRACE("Deferring action\n"); schedule_action(package, INSTALL_SCRIPT, deferred); } @@ -258,20 +256,14 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL { LPWSTR actiondata = msi_dup_property( package->db, action ); - switch (script) - { - case INSTALL_SCRIPT: + if (type & msidbCustomActionTypeInScript) package->scheduled_action_running = TRUE; - break; - case COMMIT_SCRIPT: + + if (type & msidbCustomActionTypeCommit) package->commit_action_running = TRUE; - break; - case ROLLBACK_SCRIPT: + + if (type & msidbCustomActionTypeRollback) package->rollback_action_running = TRUE; - break; - default: - break; - } if (deferred_data) set_deferred_action_props(package, deferred_data); diff --git a/dll/win32/msi/database.c b/dll/win32/msi/database.c index 01c32497a37..3007d485b2b 100644 --- a/dll/win32/msi/database.c +++ b/dll/win32/msi/database.c @@ -241,7 +241,7 @@ static VOID MSI_CloseDatabase( MSIOBJECTHDR *arg ) free_cached_tables( db ); free_streams( db ); free_transforms( db ); - msi_destroy_stringtable( db->strings ); + if (db->strings) msi_destroy_stringtable( db->strings ); IStorage_Release( db->storage ); if (db->deletefile) { @@ -255,6 +255,43 @@ static VOID MSI_CloseDatabase( MSIOBJECTHDR *arg ) } } +static HRESULT db_initialize( IStorage *stg, const GUID *clsid ) +{ + static const WCHAR szTables[] = { '_','T','a','b','l','e','s',0 }; + HRESULT hr; + + hr = IStorage_SetClass( stg, clsid ); + if (FAILED( hr )) + { + WARN("failed to set class id 0x%08x\n", hr); + return hr; + } + + /* create the _Tables stream */ + hr = write_stream_data( stg, szTables, NULL, 0, TRUE ); + if (FAILED( hr )) + { + WARN("failed to create _Tables stream 0x%08x\n", hr); + return hr; + } + + hr = msi_init_string_table( stg ); + if (FAILED( hr )) + { + WARN("failed to initialize string table 0x%08x\n", hr); + return hr; + } + + hr = IStorage_Commit( stg, 0 ); + if (FAILED( hr )) + { + WARN("failed to commit changes 0x%08x\n", hr); + return hr; + } + + return S_OK; +} + UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb) { IStorage *stg = NULL; @@ -266,8 +303,6 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb) BOOL created = FALSE, patch = FALSE; WCHAR path[MAX_PATH]; - static const WCHAR szTables[] = { '_','T','a','b','l','e','s',0 }; - TRACE("%s %s\n",debugstr_w(szDBPath),debugstr_w(szPersist) ); if( !pdb ) @@ -298,28 +333,28 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb) r = StgOpenStorage( szDBPath, NULL, STGM_DIRECT|STGM_READ|STGM_SHARE_DENY_WRITE, NULL, 0, &stg); } - else if( szPersist == MSIDBOPEN_CREATE || szPersist == MSIDBOPEN_CREATEDIRECT ) + else if( szPersist == MSIDBOPEN_CREATE ) { - /* FIXME: MSIDBOPEN_CREATE should case STGM_TRANSACTED flag to be - * used here: */ r = StgCreateDocfile( szDBPath, - STGM_CREATE|STGM_DIRECT|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, &stg); - if( r == ERROR_SUCCESS ) - { - IStorage_SetClass( stg, patch ? &CLSID_MsiPatch : &CLSID_MsiDatabase ); - /* create the _Tables stream */ - r = write_stream_data(stg, szTables, NULL, 0, TRUE); - if (SUCCEEDED(r)) - r = msi_init_string_table( stg ); - } + STGM_CREATE|STGM_TRANSACTED|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, &stg ); + + if( SUCCEEDED(r) ) + r = db_initialize( stg, patch ? &CLSID_MsiPatch : &CLSID_MsiDatabase ); + created = TRUE; + } + else if( szPersist == MSIDBOPEN_CREATEDIRECT ) + { + r = StgCreateDocfile( szDBPath, + STGM_CREATE|STGM_DIRECT|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, &stg ); + + if( SUCCEEDED(r) ) + r = db_initialize( stg, patch ? &CLSID_MsiPatch : &CLSID_MsiDatabase ); created = TRUE; } else if( szPersist == MSIDBOPEN_TRANSACT ) { - /* FIXME: MSIDBOPEN_TRANSACT should case STGM_TRANSACTED flag to be - * used here: */ r = StgOpenStorage( szDBPath, NULL, - STGM_DIRECT|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, NULL, 0, &stg); + STGM_TRANSACTED|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, NULL, 0, &stg); } else if( szPersist == MSIDBOPEN_DIRECT ) { diff --git a/dll/win32/msi/join.c b/dll/win32/msi/join.c index f787c309a41..7fe7f1c2677 100644 --- a/dll/win32/msi/join.c +++ b/dll/win32/msi/join.c @@ -60,8 +60,6 @@ static UINT JOIN_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT *v UINT cols = 0; UINT prev_rows = 1; - TRACE("%d, %d\n", row, col); - if (col == 0 || col > jv->columns) return ERROR_FUNCTION_FAILED; @@ -225,10 +223,12 @@ static UINT JOIN_get_column_info( struct tagMSIVIEW *view, static UINT join_find_row( MSIJOINVIEW *jv, MSIRECORD *rec, UINT *row ) { LPCWSTR str; - UINT i, id, data; + UINT r, i, id, data; str = MSI_RecordGetString( rec, 1 ); - msi_string2idW( jv->db->strings, str, &id ); + r = msi_string2idW( jv->db->strings, str, &id ); + if (r != ERROR_SUCCESS) + return r; for (i = 0; i < jv->rows; i++) { diff --git a/dll/win32/msi/media.c b/dll/win32/msi/media.c index a2a90654186..788528e9b37 100644 --- a/dll/win32/msi/media.c +++ b/dll/win32/msi/media.c @@ -211,9 +211,6 @@ static INT_PTR CDECL cabinet_open_stream( char *pszFile, int oflag, int pmode ) UINT r; IStream *stm; - if (oflag) - WARN("ignoring open flags 0x%08x\n", oflag); - r = db_get_raw_stream( cab_stream.db, cab_stream.name, &stm ); if (r != ERROR_SUCCESS) { @@ -358,6 +355,40 @@ done: return res; } +static INT_PTR cabinet_next_cabinet_stream( FDINOTIFICATIONTYPE fdint, + PFDINOTIFICATION pfdin ) +{ + MSICABDATA *data = pfdin->pv; + MSIMEDIAINFO *mi = data->mi; + UINT rc; + + msi_free( mi->disk_prompt ); + msi_free( mi->cabinet ); + msi_free( mi->volume_label ); + mi->disk_prompt = NULL; + mi->cabinet = NULL; + mi->volume_label = NULL; + + mi->disk_id++; + mi->is_continuous = TRUE; + + rc = msi_media_get_disk_info( data->package, mi ); + if (rc != ERROR_SUCCESS) + { + ERR("Failed to get next cabinet information: %u\n", rc); + return -1; + } + + msi_free( cab_stream.name ); + cab_stream.name = encode_streamname( FALSE, mi->cabinet + 1 ); + if (!cab_stream.name) + return -1; + + TRACE("next cabinet is %s\n", debugstr_w(mi->cabinet)); + + return 0; +} + static INT_PTR cabinet_copy_file(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin) { @@ -494,6 +525,12 @@ static INT_PTR CDECL cabinet_notify_stream( FDINOTIFICATIONTYPE fdint, PFDINOTIF { switch (fdint) { + case fdintPARTIAL_FILE: + return cabinet_partial_file( fdint, pfdin ); + + case fdintNEXT_CABINET: + return cabinet_next_cabinet_stream( fdint, pfdin ); + case fdintCOPY_FILE: return cabinet_copy_file( fdint, pfdin ); diff --git a/dll/win32/msi/msi.c b/dll/win32/msi/msi.c index fb7eba5f54e..7d1b9a55095 100644 --- a/dll/win32/msi/msi.c +++ b/dll/win32/msi/msi.c @@ -3779,3 +3779,44 @@ UINT WINAPI MsiInstallMissingComponentW(LPCWSTR szProduct, LPCWSTR szComponent, FIXME("(%s %s %d\n", debugstr_w(szProduct), debugstr_w(szComponent), eInstallState); return ERROR_SUCCESS; } + +/*********************************************************************** + * MsiBeginTransactionA [MSI.@] + */ +UINT WINAPI MsiBeginTransactionA( LPCSTR name, DWORD attrs, MSIHANDLE *id, HANDLE *event ) +{ + WCHAR *nameW; + UINT r; + + FIXME("%s %u %p %p\n", debugstr_a(name), attrs, id, event); + + nameW = strdupAtoW( name ); + if (name && !nameW) + return ERROR_OUTOFMEMORY; + + r = MsiBeginTransactionW( nameW, attrs, id, event ); + msi_free( nameW ); + return r; +} + +/*********************************************************************** + * MsiBeginTransactionW [MSI.@] + */ +UINT WINAPI MsiBeginTransactionW( LPCWSTR name, DWORD attrs, MSIHANDLE *id, HANDLE *event ) +{ + FIXME("%s %u %p %p\n", debugstr_w(name), attrs, id, event); + + *id = (MSIHANDLE)0xdeadbeef; + *event = (HANDLE)0xdeadbeef; + + return ERROR_SUCCESS; +} + +/*********************************************************************** + * MsiEndTransaction [MSI.@] + */ +UINT WINAPI MsiEndTransaction( DWORD state ) +{ + FIXME("%u\n", state); + return ERROR_SUCCESS; +} diff --git a/dll/win32/msi/msi.spec b/dll/win32/msi/msi.spec index 6fdebd86f10..fd047f8a652 100644 --- a/dll/win32/msi/msi.spec +++ b/dll/win32/msi/msi.spec @@ -174,7 +174,7 @@ 178 stdcall MsiGetPatchInfoA(str str ptr ptr) 179 stdcall MsiGetPatchInfoW(wstr wstr ptr ptr) 180 stdcall MsiEnumPatchesA(str long ptr ptr ptr) -181 stdcall MsiEnumPatchesW(str long ptr ptr ptr) +181 stdcall MsiEnumPatchesW(wstr long ptr ptr ptr) 182 stdcall -private DllGetVersion(ptr) 183 stub MsiGetProductCodeFromPackageCodeA 184 stub MsiGetProductCodeFromPackageCodeW @@ -214,7 +214,7 @@ 218 stdcall MsiGetFileHashA(str long ptr) 219 stdcall MsiGetFileHashW(wstr long ptr) 220 stub MsiEnumComponentCostsA -221 stdcall MsiEnumComponentCostsW(long str long long ptr ptr ptr ptr) +221 stdcall MsiEnumComponentCostsW(long wstr long long ptr ptr ptr ptr) 222 stdcall MsiCreateAndVerifyInstallerDirectory(long) 223 stdcall MsiGetFileSignatureInformationA(str long ptr ptr ptr) 224 stdcall MsiGetFileSignatureInformationW(wstr long ptr ptr ptr) @@ -277,9 +277,9 @@ 281 stdcall MsiSetExternalUIRecord(ptr long ptr ptr) 282 stub MsiGetPatchFileListA 283 stub MsiGetPatchFileListW -284 stub MsiBeginTransactionA -285 stub MsiBeginTransactionW -286 stub MsiEndTransaction +284 stdcall MsiBeginTransactionA(str long ptr ptr) +285 stdcall MsiBeginTransactionW(wstr long ptr ptr) +286 stdcall MsiEndTransaction(long) 287 stub MsiJoinTransaction 288 stub MsiSetOfflineContextW 289 stub MsiEnumComponentsExA diff --git a/dll/win32/msi/msi_Fi.rc b/dll/win32/msi/msi_Fi.rc index 7769a8afe76..89841729a73 100644 --- a/dll/win32/msi/msi_Fi.rc +++ b/dll/win32/msi/msi_Fi.rc @@ -24,39 +24,39 @@ LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT STRINGTABLE { - 4 "The specified installation package could not be opened. Please check the file path and try again." + 4 "Annettua asennuspakettia ei voitu avata. Tarkista tiedoston polku ja yrit uudelleen." 5 "Polkua %s ei lydy." 9 "Anna levy %s" 10 "Windows Installer %s\n\n" \ - "Usage:\n" \ - "msiexec command {required parameter} [optional parammeter]\n\n" \ - "Install a product:\n" \ - "\t/i {package|productcode} [property]\n" \ - "\t/package {package|productcode} [property]\n" \ - "\t/a package [property]\n" \ - "Repair an installation:\n" \ - "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \ - "Uninstall a product:\n" \ - "\t/uninstall {package|productcode} [property]\n" \ - "\t/x {package|productcode} [property]\n" \ - "Advertise a product:\n" \ - "\t/j[u|m] package [/t transform] [/g languageid]\n" \ - "Apply a patch:\n" \ - "\t/p patchpackage [property]\n" \ - "\t/p patchpackage /a package [property]\n" \ - "Log and UI Modifiers for above commands:\n" \ - "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \ + "K艙tt:\n" \ + "msiexec komento {pakollinen parametri} [valinnainen parametri]\n\n" \ + "Asenna tuote:\n" \ + "\t/i {paketti|tuotekoodi} [ominaisuus]\n" \ + "\t/package {paketti|tuotekoodi} [ominaisuus]\n" \ + "\t/a {paketti} [ominaisuus]\n" \ + "Korjaa asennus:\n" \ + "\t/f[p|o|e|d|c|a|u|m|s|v] {paketti|tuotekoodi}\n" \ + "Poista tuote:\n" \ + "\t/uninstall {paketti|tuotekoodi} [ominaisuus]\n" \ + "\t/x {paketti|tuotekoodi} [ominaisuus]\n" \ + "Mainosta (advertise) tuotetta:\n" \ + "\t/j[u|m] paketti [/t muunnos] [/g kielitunnus]\n" \ + "Asenna korjaus:\n" \ + "\t/p korjauspaketti [ominaisuus]\n" \ + "\t/p korjauspaketti /a paketti [ominaisuus]\n" \ + "Loki- ja k艙ttliittym臑setukset edellisille komennoille:\n" \ + "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] lokitiedosto\n" \ "\t/q{|n|b|r|f|n+|b+|b-}\n" \ - "Register MSI Service:\n" \ + "Rekisteri MSI-palvelu:\n" \ "\t/y\n" \ - "Unregister MSI Service:\n" \ + "Peru MSI-palvelun rekisterinti:\n" \ "\t/z\n" \ - "Display this help:\n" \ + "N艙t t舂 ohje:\n" \ "\t/help\n" \ "\t/?\n" - 11 "Anna kansio, joka sis舁t蒿 %s" + 11 "Anna kansio, jossa on %s" 12 "Ominaisuuden asennusl臧de puuttuu." 13 "Ominaisuuden verkkolevy puuttuu." 14 "Ominaisuus:" - 15 "Valitse kansio, joka sis舁t蒿 %s" + 15 "Valitse kansio, jossa on %s" } diff --git a/dll/win32/msi/msipriv.h b/dll/win32/msi/msipriv.h index 344b1450e3a..0361ff42c6e 100644 --- a/dll/win32/msi/msipriv.h +++ b/dll/win32/msi/msipriv.h @@ -29,6 +29,7 @@ #include "fdi.h" #include "msi.h" #include "msiquery.h" +#include "msidefs.h" #include "objbase.h" #include "objidl.h" #include "winnls.h" @@ -36,6 +37,8 @@ #include "wine/list.h" #include "wine/debug.h" +static const BOOL is_64bit = sizeof(void *) > sizeof(int); + #define MSI_DATASIZEMASK 0x00ff #define MSITYPE_VALID 0x0100 #define MSITYPE_LOCALIZABLE 0x200 @@ -45,6 +48,7 @@ #define MSITYPE_TEMPORARY 0x4000 #define MAX_STREAM_NAME_LEN 62 +#define LONG_STR_BYTES 3 /* Install UI level mask for AND operation to exclude flags */ #define INSTALLUILEVEL_MASK 0x0007 @@ -103,6 +107,7 @@ typedef struct tagMSIFIELD union { INT iVal; + INT_PTR pVal; LPWSTR szwVal; IStream *stream; } u; @@ -303,10 +308,21 @@ struct tagMSIVIEW struct msi_dialog_tag; typedef struct msi_dialog_tag msi_dialog; +enum platform +{ + PLATFORM_INTEL, + PLATFORM_INTEL64, + PLATFORM_X64 +}; + typedef struct tagMSIPACKAGE { MSIOBJECTHDR hdr; MSIDATABASE *db; + INT version; + enum platform platform; + UINT num_langids; + LANGID *langids; struct list patches; struct list components; struct list features; @@ -388,7 +404,6 @@ typedef struct tagMSIFEATURE typedef struct tagMSICOMPONENT { struct list entry; - DWORD magic; LPWSTR Component; LPWSTR ComponentId; LPWSTR Directory; @@ -595,9 +610,9 @@ typedef struct tagMSISCRIPT #define MSIHANDLETYPE_PACKAGE 5 #define MSIHANDLETYPE_PREVIEW 6 -#define MSI_MAJORVERSION 3 -#define MSI_MINORVERSION 1 -#define MSI_BUILDNUMBER 4000 +#define MSI_MAJORVERSION 4 +#define MSI_MINORVERSION 5 +#define MSI_BUILDNUMBER 6001 #define GUID_SIZE 39 #define SQUISH_GUID_SIZE 33 @@ -672,7 +687,7 @@ extern VOID msi_destroy_stringtable( string_table *st ); extern const WCHAR *msi_string_lookup_id( const string_table *st, UINT id ); extern HRESULT msi_init_string_table( IStorage *stg ); extern string_table *msi_load_string_table( IStorage *stg, UINT *bytes_per_strref ); -extern UINT msi_save_string_table( const string_table *st, IStorage *storage ); +extern UINT msi_save_string_table( const string_table *st, IStorage *storage, UINT *bytes_per_strref ); extern BOOL TABLE_Exists( MSIDATABASE *db, LPCWSTR name ); extern MSICONDITION MSI_DatabaseIsTablePersistent( MSIDATABASE *db, LPCWSTR table ); @@ -709,11 +724,13 @@ extern UINT MSI_RecordGetIStream( MSIRECORD *, UINT, IStream **); extern const WCHAR *MSI_RecordGetString( const MSIRECORD *, UINT ); extern MSIRECORD *MSI_CreateRecord( UINT ); extern UINT MSI_RecordSetInteger( MSIRECORD *, UINT, int ); +extern UINT MSI_RecordSetIntPtr( MSIRECORD *, UINT, INT_PTR ); extern UINT MSI_RecordSetStringW( MSIRECORD *, UINT, LPCWSTR ); extern BOOL MSI_RecordIsNull( MSIRECORD *, UINT ); extern UINT MSI_RecordGetStringW( MSIRECORD * , UINT, LPWSTR, LPDWORD); extern UINT MSI_RecordGetStringA( MSIRECORD *, UINT, LPSTR, LPDWORD); extern int MSI_RecordGetInteger( MSIRECORD *, UINT ); +extern INT_PTR MSI_RecordGetIntPtr( MSIRECORD *, UINT ); extern UINT MSI_RecordReadStream( MSIRECORD *, UINT, char *, LPDWORD); extern UINT MSI_RecordSetStream(MSIRECORD *, UINT, IStream *); extern UINT MSI_RecordGetFieldCount( const MSIRECORD *rec ); @@ -765,7 +782,7 @@ extern UINT msi_package_add_info(MSIPACKAGE *, DWORD, DWORD, LPCWSTR, LPWSTR); extern UINT msi_package_add_media_disk(MSIPACKAGE *, DWORD, DWORD, DWORD, LPWSTR, LPWSTR); extern UINT msi_clone_properties(MSIPACKAGE *); extern UINT msi_set_context(MSIPACKAGE *); -extern void msi_adjust_allusers_property(MSIPACKAGE *); +extern void msi_adjust_privilege_properties(MSIPACKAGE *); extern UINT MSI_GetFeatureCost(MSIPACKAGE *, MSIFEATURE *, MSICOSTTREE, INSTALLSTATE, LPINT); /* for deformating */ @@ -776,8 +793,8 @@ extern BOOL unsquash_guid(LPCWSTR in, LPWSTR out); extern BOOL squash_guid(LPCWSTR in, LPWSTR out); extern BOOL encode_base85_guid(GUID *,LPWSTR); extern BOOL decode_base85_guid(LPCWSTR,GUID*); -extern UINT MSIREG_OpenUninstallKey(LPCWSTR szProduct, HKEY* key, BOOL create); -extern UINT MSIREG_DeleteUninstallKey(LPCWSTR szProduct); +extern UINT MSIREG_OpenUninstallKey(MSIPACKAGE *package, HKEY *key, BOOL create); +extern UINT MSIREG_DeleteUninstallKey(MSIPACKAGE *package); extern UINT MSIREG_OpenProductKey(LPCWSTR szProduct, LPCWSTR szUserSid, MSIINSTALLCONTEXT context, HKEY* key, BOOL create); extern UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context, @@ -843,6 +860,7 @@ extern UINT msi_spawn_error_dialog( MSIPACKAGE*, LPWSTR, LPWSTR ); /* summary information */ extern MSISUMMARYINFO *MSI_GetSummaryInformationW( IStorage *stg, UINT uiUpdateCount ); extern LPWSTR msi_suminfo_dup_string( MSISUMMARYINFO *si, UINT uiProperty ); +extern INT msi_suminfo_get_int32( MSISUMMARYINFO *si, UINT uiProperty ); extern LPWSTR msi_get_suminfo_product( IStorage *stg ); extern UINT msi_add_suminfo( MSIDATABASE *db, LPWSTR **records, int num_records, int num_columns ); @@ -915,6 +933,10 @@ static inline void msi_feature_set_state(MSIPACKAGE *package, feature->ActionRequest = state; feature->Action = state; } + if (feature->Attributes & msidbFeatureAttributesUIDisallowAbsent) + { + feature->Action = INSTALLSTATE_UNKNOWN; + } } static inline void msi_component_set_state(MSIPACKAGE *package, @@ -1123,6 +1145,12 @@ static const WCHAR szMIMEDatabase[] = {'M','I','M','E','\\','D','a','t','a','b', static const WCHAR szLocalPackage[] = {'L','o','c','a','l','P','a','c','k','a','g','e',0}; static const WCHAR szOriginalDatabase[] = {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0}; static const WCHAR szUpgradeCode[] = {'U','p','g','r','a','d','e','C','o','d','e',0}; +static const WCHAR szAdminUser[] = {'A','d','m','i','n','U','s','e','r',0}; +static const WCHAR szIntel[] = {'I','n','t','e','l',0}; +static const WCHAR szIntel64[] = {'I','n','t','e','l','6','4',0}; +static const WCHAR szX64[] = {'x','6','4',0}; +static const WCHAR szWow6432NodeCLSID[] = {'W','o','w','6','4','3','2','N','o','d','e','\\','C','L','S','I','D',0}; +static const WCHAR szWow6432Node[] = {'W','o','w','6','4','3','2','N','o','d','e',0}; /* memory allocation macro functions */ static void *msi_alloc( size_t len ) __WINE_ALLOC_SIZE(1); diff --git a/dll/win32/msi/msiquery.c b/dll/win32/msi/msiquery.c index df81a748223..cf6959391d3 100644 --- a/dll/win32/msi/msiquery.c +++ b/dll/win32/msi/msiquery.c @@ -382,7 +382,7 @@ UINT MSI_ViewFetch(MSIQUERY *query, MSIRECORD **prec) if (r == ERROR_SUCCESS) { query->row ++; - MSI_RecordSetInteger(*prec, 0, (int)query); + MSI_RecordSetIntPtr(*prec, 0, (INT_PTR)query); } return r; @@ -617,7 +617,7 @@ UINT MSI_ViewModify( MSIQUERY *query, MSIMODIFY mode, MSIRECORD *rec ) if ( !view || !view->ops->modify) return ERROR_FUNCTION_FAILED; - if ( mode == MSIMODIFY_UPDATE && MSI_RecordGetInteger( rec, 0 ) != (int)query ) + if ( mode == MSIMODIFY_UPDATE && MSI_RecordGetIntPtr( rec, 0 ) != (INT_PTR)query ) return ERROR_FUNCTION_FAILED; r = view->ops->modify( view, mode, rec, query->row ); @@ -901,6 +901,9 @@ UINT MSI_DatabaseGetPrimaryKeys( MSIDATABASE *db, MSIQUERY *query = NULL; UINT r; + if (!TABLE_Exists( db, table )) + return ERROR_INVALID_TABLE; + r = MSI_OpenQuery( db, &query, sql, table ); if( r != ERROR_SUCCESS ) return r; diff --git a/dll/win32/msi/package.c b/dll/win32/msi/package.c index d3321686964..32576a0362c 100644 --- a/dll/win32/msi/package.c +++ b/dll/win32/msi/package.c @@ -280,6 +280,7 @@ static void free_package_structures( MSIPACKAGE *package ) msi_free( package->ProductCode ); msi_free( package->ActionFormat ); msi_free( package->LastAction ); + msi_free( package->langids ); /* cleanup control event subscriptions */ ControlEvent_CleanupSubscriptions( package ); @@ -417,7 +418,7 @@ static UINT set_installed_prop( MSIPACKAGE *package ) HKEY hkey = 0; UINT r; - r = MSIREG_OpenUninstallKey( package->ProductCode, &hkey, FALSE ); + r = MSIREG_OpenUninstallKey( package, &hkey, FALSE ); if (r == ERROR_SUCCESS) { RegCloseKey( hkey ); @@ -618,72 +619,49 @@ static VOID set_installer_properties(MSIPACKAGE *package) SYSTEMTIME systemtime; LANGID langid; - static const WCHAR CFF[] = -{'C','o','m','m','o','n','F','i','l','e','s','F','o','l','d','e','r',0}; - static const WCHAR PFF[] = -{'P','r','o','g','r','a','m','F','i','l','e','s','F','o','l','d','e','r',0}; - static const WCHAR CADF[] = -{'C','o','m','m','o','n','A','p','p','D','a','t','a','F','o','l','d','e','r',0}; - static const WCHAR FaF[] = -{'F','a','v','o','r','i','t','e','s','F','o','l','d','e','r',0}; - static const WCHAR FoF[] = -{'F','o','n','t','s','F','o','l','d','e','r',0}; - static const WCHAR SendTF[] = -{'S','e','n','d','T','o','F','o','l','d','e','r',0}; - static const WCHAR SMF[] = -{'S','t','a','r','t','M','e','n','u','F','o','l','d','e','r',0}; - static const WCHAR StF[] = -{'S','t','a','r','t','u','p','F','o','l','d','e','r',0}; - static const WCHAR TemplF[] = -{'T','e','m','p','l','a','t','e','F','o','l','d','e','r',0}; - static const WCHAR DF[] = -{'D','e','s','k','t','o','p','F','o','l','d','e','r',0}; - static const WCHAR PMF[] = -{'P','r','o','g','r','a','m','M','e','n','u','F','o','l','d','e','r',0}; - static const WCHAR ATF[] = -{'A','d','m','i','n','T','o','o','l','s','F','o','l','d','e','r',0}; - static const WCHAR ADF[] = -{'A','p','p','D','a','t','a','F','o','l','d','e','r',0}; - static const WCHAR SF[] = -{'S','y','s','t','e','m','F','o','l','d','e','r',0}; - static const WCHAR SF16[] = -{'S','y','s','t','e','m','1','6','F','o','l','d','e','r',0}; - static const WCHAR LADF[] = -{'L','o','c','a','l','A','p','p','D','a','t','a','F','o','l','d','e','r',0}; - static const WCHAR MPF[] = -{'M','y','P','i','c','t','u','r','e','s','F','o','l','d','e','r',0}; - static const WCHAR PF[] = -{'P','e','r','s','o','n','a','l','F','o','l','d','e','r',0}; - static const WCHAR WF[] = -{'W','i','n','d','o','w','s','F','o','l','d','e','r',0}; - static const WCHAR WV[] = -{'W','i','n','d','o','w','s','V','o','l','u','m','e',0}; - static const WCHAR TF[]= -{'T','e','m','p','F','o','l','d','e','r',0}; - static const WCHAR szAdminUser[] = -{'A','d','m','i','n','U','s','e','r',0}; - static const WCHAR szPriv[] = -{'P','r','i','v','i','l','e','g','e','d',0}; - static const WCHAR v9x[] = { 'V','e','r','s','i','o','n','9','X',0 }; - static const WCHAR vNT[] = { 'V','e','r','s','i','o','n','N','T',0 }; - static const WCHAR szMsiNTProductType[] = { 'M','s','i','N','T','P','r','o','d','u','c','t','T','y','p','e',0 }; + static const WCHAR szCommonFilesFolder[] = {'C','o','m','m','o','n','F','i','l','e','s','F','o','l','d','e','r',0}; + static const WCHAR szProgramFilesFolder[] = {'P','r','o','g','r','a','m','F','i','l','e','s','F','o','l','d','e','r',0}; + static const WCHAR szCommonAppDataFolder[] = {'C','o','m','m','o','n','A','p','p','D','a','t','a','F','o','l','d','e','r',0}; + static const WCHAR szFavoritesFolder[] = {'F','a','v','o','r','i','t','e','s','F','o','l','d','e','r',0}; + static const WCHAR szFontsFolder[] = {'F','o','n','t','s','F','o','l','d','e','r',0}; + static const WCHAR szSendToFolder[] = {'S','e','n','d','T','o','F','o','l','d','e','r',0}; + static const WCHAR szStartMenuFolder[] = {'S','t','a','r','t','M','e','n','u','F','o','l','d','e','r',0}; + static const WCHAR szStartupFolder[] = {'S','t','a','r','t','u','p','F','o','l','d','e','r',0}; + static const WCHAR szTemplateFolder[] = {'T','e','m','p','l','a','t','e','F','o','l','d','e','r',0}; + static const WCHAR szDesktopFolder[] = {'D','e','s','k','t','o','p','F','o','l','d','e','r',0}; + static const WCHAR szProgramMenuFolder[] = {'P','r','o','g','r','a','m','M','e','n','u','F','o','l','d','e','r',0}; + static const WCHAR szAdminToolsFolder[] = {'A','d','m','i','n','T','o','o','l','s','F','o','l','d','e','r',0}; + static const WCHAR szAppDataFolder[] = {'A','p','p','D','a','t','a','F','o','l','d','e','r',0}; + static const WCHAR szSystemFolder[] = {'S','y','s','t','e','m','F','o','l','d','e','r',0}; + static const WCHAR szSystem16Folder[] = {'S','y','s','t','e','m','1','6','F','o','l','d','e','r',0}; + static const WCHAR szLocalAppDataFolder[] = {'L','o','c','a','l','A','p','p','D','a','t','a','F','o','l','d','e','r',0}; + static const WCHAR szMyPicturesFolder[] = {'M','y','P','i','c','t','u','r','e','s','F','o','l','d','e','r',0}; + static const WCHAR szPersonalFolder[] = {'P','e','r','s','o','n','a','l','F','o','l','d','e','r',0}; + static const WCHAR szWindowsFolder[] = {'W','i','n','d','o','w','s','F','o','l','d','e','r',0}; + static const WCHAR szWindowsVolume[] = {'W','i','n','d','o','w','s','V','o','l','u','m','e',0}; + static const WCHAR szTempFolder[]= {'T','e','m','p','F','o','l','d','e','r',0}; + static const WCHAR szPrivileged[] = {'P','r','i','v','i','l','e','g','e','d',0}; + static const WCHAR szVersion9x[] = {'V','e','r','s','i','o','n','9','X',0}; + static const WCHAR szVersionNT[] = {'V','e','r','s','i','o','n','N','T',0}; + static const WCHAR szMsiNTProductType[] = {'M','s','i','N','T','P','r','o','d','u','c','t','T','y','p','e',0}; static const WCHAR szFormat[] = {'%','l','i',0}; - static const WCHAR szWinBuild[] = -{'W','i','n','d','o','w','s','B','u','i','l','d', 0 }; - static const WCHAR szSPL[] = -{'S','e','r','v','i','c','e','P','a','c','k','L','e','v','e','l',0 }; + static const WCHAR szWindowsBuild[] = {'W','i','n','d','o','w','s','B','u','i','l','d',0}; + static const WCHAR szServicePackLevel[] = {'S','e','r','v','i','c','e','P','a','c','k','L','e','v','e','l',0}; static const WCHAR szSix[] = {'6',0 }; - static const WCHAR szVersionMsi[] = { 'V','e','r','s','i','o','n','M','s','i',0 }; static const WCHAR szVersionDatabase[] = { 'V','e','r','s','i','o','n','D','a','t','a','b','a','s','e',0 }; static const WCHAR szPhysicalMemory[] = { 'P','h','y','s','i','c','a','l','M','e','m','o','r','y',0 }; static const WCHAR szFormat2[] = {'%','l','i','.','%','l','i',0}; -/* Screen properties */ static const WCHAR szScreenX[] = {'S','c','r','e','e','n','X',0}; static const WCHAR szScreenY[] = {'S','c','r','e','e','n','Y',0}; static const WCHAR szColorBits[] = {'C','o','l','o','r','B','i','t','s',0}; static const WCHAR szIntFormat[] = {'%','d',0}; - static const WCHAR szIntel[] = { 'I','n','t','e','l',0 }; + static const WCHAR szMsiAMD64[] = { 'M','s','i','A','M','D','6','4',0 }; + static const WCHAR szMsix64[] = { 'M','s','i','x','6','4',0 }; + static const WCHAR szSystem64Folder[] = { 'S','y','s','t','e','m','6','4','F','o','l','d','e','r',0 }; + static const WCHAR szCommonFiles64Folder[] = { 'C','o','m','m','o','n','F','i','l','e','s','6','4','F','o','l','d','e','r',0 }; + static const WCHAR szProgramFiles64Folder[] = { 'P','r','o','g','r','a','m','F','i','l','e','s','6','4','F','o','l','d','e','r',0 }; + static const WCHAR szVersionNT64[] = { 'V','e','r','s','i','o','n','N','T','6','4',0 }; static const WCHAR szUserInfo[] = { 'S','O','F','T','W','A','R','E','\\', 'M','i','c','r','o','s','o','f','t','\\', @@ -699,17 +677,20 @@ static VOID set_installer_properties(MSIPACKAGE *package) 'C','u','r','r','e','n','t','V','e','r','s','i','o','n',0 }; static const WCHAR szRegisteredUser[] = {'R','e','g','i','s','t','e','r','e','d','O','w','n','e','r',0}; - static const WCHAR szRegisteredOrg[] = { + static const WCHAR szRegisteredOrganization[] = { 'R','e','g','i','s','t','e','r','e','d','O','r','g','a','n','i','z','a','t','i','o','n',0 }; static const WCHAR szUSERNAME[] = {'U','S','E','R','N','A','M','E',0}; static const WCHAR szCOMPANYNAME[] = {'C','O','M','P','A','N','Y','N','A','M','E',0}; static const WCHAR szDate[] = {'D','a','t','e',0}; static const WCHAR szTime[] = {'T','i','m','e',0}; - static const WCHAR szUserLangID[] = {'U','s','e','r','L','a','n','g','u','a','g','e','I','D',0}; + static const WCHAR szUserLanguageID[] = {'U','s','e','r','L','a','n','g','u','a','g','e','I','D',0}; static const WCHAR szSystemLangID[] = {'S','y','s','t','e','m','L','a','n','g','u','a','g','e','I','D',0}; static const WCHAR szProductState[] = {'P','r','o','d','u','c','t','S','t','a','t','e',0}; static const WCHAR szLogonUser[] = {'L','o','g','o','n','U','s','e','r',0}; + static const WCHAR szNetHoodFolder[] = {'N','e','t','H','o','o','d','F','o','l','d','e','r',0}; + static const WCHAR szPrintHoodFolder[] = {'P','r','i','n','t','H','o','o','d','F','o','l','d','e','r',0}; + static const WCHAR szRecentFolder[] = {'R','e','c','e','n','t','F','o','l','d','e','r',0}; /* * Other things that probably should be set: @@ -720,130 +701,175 @@ static VOID set_installer_properties(MSIPACKAGE *package) * RedirectedDllSupport */ - SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES_COMMON,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, CFF, pth); + msi_set_property(package->db, szCommonAppDataFolder, pth); - SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_FAVORITES, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, PFF, pth); + msi_set_property(package->db, szFavoritesFolder, pth); - SHGetFolderPathW(NULL,CSIDL_COMMON_APPDATA,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_FONTS, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, CADF, pth); + msi_set_property(package->db, szFontsFolder, pth); - SHGetFolderPathW(NULL,CSIDL_FAVORITES,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_SENDTO, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, FaF, pth); + msi_set_property(package->db, szSendToFolder, pth); - SHGetFolderPathW(NULL,CSIDL_FONTS,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_STARTMENU, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, FoF, pth); + msi_set_property(package->db, szStartMenuFolder, pth); - SHGetFolderPathW(NULL,CSIDL_SENDTO,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_STARTUP, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, SendTF, pth); + msi_set_property(package->db, szStartupFolder, pth); - SHGetFolderPathW(NULL,CSIDL_STARTMENU,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_TEMPLATES, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, SMF, pth); + msi_set_property(package->db, szTemplateFolder, pth); - SHGetFolderPathW(NULL,CSIDL_STARTUP,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_DESKTOP, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, StF, pth); + msi_set_property(package->db, szDesktopFolder, pth); - SHGetFolderPathW(NULL,CSIDL_TEMPLATES,NULL,0,pth); + /* FIXME: set to AllUsers profile path if ALLUSERS is set */ + SHGetFolderPathW(NULL, CSIDL_PROGRAMS, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, TemplF, pth); + msi_set_property(package->db, szProgramMenuFolder, pth); - SHGetFolderPathW(NULL,CSIDL_DESKTOP,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_ADMINTOOLS, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, DF, pth); + msi_set_property(package->db, szAdminToolsFolder, pth); - SHGetFolderPathW(NULL,CSIDL_PROGRAMS,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, PMF, pth); + msi_set_property(package->db, szAppDataFolder, pth); - SHGetFolderPathW(NULL,CSIDL_ADMINTOOLS,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_SYSTEM, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, ATF, pth); + msi_set_property(package->db, szSystemFolder, pth); + msi_set_property(package->db, szSystem16Folder, pth); - SHGetFolderPathW(NULL,CSIDL_APPDATA,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, ADF, pth); + msi_set_property(package->db, szLocalAppDataFolder, pth); - SHGetFolderPathW(NULL,CSIDL_SYSTEM,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_MYPICTURES, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, SF, pth); - msi_set_property(package->db, SF16, pth); + msi_set_property(package->db, szMyPicturesFolder, pth); - SHGetFolderPathW(NULL,CSIDL_LOCAL_APPDATA,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_PERSONAL, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, LADF, pth); + msi_set_property(package->db, szPersonalFolder, pth); - SHGetFolderPathW(NULL,CSIDL_MYPICTURES,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_WINDOWS, NULL, 0, pth); strcatW(pth, szBackSlash); - msi_set_property(package->db, MPF, pth); - - SHGetFolderPathW(NULL,CSIDL_PERSONAL,NULL,0,pth); - strcatW(pth, szBackSlash); - msi_set_property(package->db, PF, pth); - - SHGetFolderPathW(NULL,CSIDL_WINDOWS,NULL,0,pth); - strcatW(pth, szBackSlash); - msi_set_property(package->db, WF, pth); + msi_set_property(package->db, szWindowsFolder, pth); + SHGetFolderPathW(NULL, CSIDL_PRINTHOOD, NULL, 0, pth); + strcatW(pth, szBackSlash); + msi_set_property(package->db, szPrintHoodFolder, pth); + + SHGetFolderPathW(NULL, CSIDL_NETHOOD, NULL, 0, pth); + strcatW(pth, szBackSlash); + msi_set_property(package->db, szNetHoodFolder, pth); + + SHGetFolderPathW(NULL, CSIDL_RECENT, NULL, 0, pth); + strcatW(pth, szBackSlash); + msi_set_property(package->db, szRecentFolder, pth); + /* Physical Memory is specified in MB. Using total amount. */ msex.dwLength = sizeof(msex); GlobalMemoryStatusEx( &msex ); - sprintfW( bufstr, szIntFormat, (int)(msex.ullTotalPhys/1024/1024)); + sprintfW( bufstr, szIntFormat, (int)(msex.ullTotalPhys / 1024 / 1024) ); msi_set_property(package->db, szPhysicalMemory, bufstr); - SHGetFolderPathW(NULL,CSIDL_WINDOWS,NULL,0,pth); + SHGetFolderPathW(NULL, CSIDL_WINDOWS, NULL, 0, pth); ptr = strchrW(pth,'\\'); - if (ptr) - *(ptr+1) = 0; - msi_set_property(package->db, WV, pth); + if (ptr) *(ptr + 1) = 0; + msi_set_property(package->db, szWindowsVolume, pth); GetTempPathW(MAX_PATH,pth); - msi_set_property(package->db, TF, pth); - + msi_set_property(package->db, szTempFolder, pth); /* in a wine environment the user is always admin and privileged */ msi_set_property(package->db, szAdminUser, szOne); - msi_set_property(package->db, szPriv, szOne); + msi_set_property(package->db, szPrivileged, szOne); /* set the os things */ OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW); GetVersionExW((OSVERSIONINFOW *)&OSVersion); - verval = OSVersion.dwMinorVersion+OSVersion.dwMajorVersion*100; - sprintfW(verstr,szFormat,verval); + verval = OSVersion.dwMinorVersion + OSVersion.dwMajorVersion * 100; + sprintfW(verstr, szFormat, verval); switch (OSVersion.dwPlatformId) { case VER_PLATFORM_WIN32_WINDOWS: - msi_set_property(package->db, v9x, verstr); + msi_set_property(package->db, szVersion9x, verstr); break; case VER_PLATFORM_WIN32_NT: - msi_set_property(package->db, vNT, verstr); - sprintfW(verstr,szFormat,OSVersion.wProductType); + msi_set_property(package->db, szVersionNT, verstr); + sprintfW(verstr, szFormat,OSVersion.wProductType); msi_set_property(package->db, szMsiNTProductType, verstr); break; } - sprintfW(verstr,szFormat,OSVersion.dwBuildNumber); - msi_set_property(package->db, szWinBuild, verstr); + sprintfW(verstr, szFormat, OSVersion.dwBuildNumber); + msi_set_property(package->db, szWindowsBuild, verstr); /* just fudge this */ - msi_set_property(package->db, szSPL, szSix); + msi_set_property(package->db, szServicePackLevel, szSix); sprintfW( bufstr, szFormat2, MSI_MAJORVERSION, MSI_MINORVERSION); msi_set_property( package->db, szVersionMsi, bufstr ); sprintfW( bufstr, szFormat, MSI_MAJORVERSION * 100); msi_set_property( package->db, szVersionDatabase, bufstr ); - GetSystemInfo( &sys_info ); + GetNativeSystemInfo( &sys_info ); + sprintfW( bufstr, szIntFormat, sys_info.wProcessorLevel ); if (sys_info.u.s.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) { - sprintfW( bufstr, szIntFormat, sys_info.wProcessorLevel ); msi_set_property( package->db, szIntel, bufstr ); + + GetSystemDirectoryW( pth, MAX_PATH ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szSystemFolder, pth ); + + SHGetFolderPathW( NULL, CSIDL_PROGRAM_FILES, NULL, 0, pth ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szProgramFilesFolder, pth ); + + SHGetFolderPathW( NULL, CSIDL_PROGRAM_FILES_COMMON, NULL, 0, pth ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szCommonFilesFolder, pth ); + } + else if (sys_info.u.s.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) + { + msi_set_property( package->db, szMsiAMD64, bufstr ); + msi_set_property( package->db, szMsix64, bufstr ); + msi_set_property( package->db, szVersionNT64, verstr ); + + GetSystemDirectoryW( pth, MAX_PATH ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szSystem64Folder, pth ); + + GetSystemWow64DirectoryW( pth, MAX_PATH ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szSystemFolder, pth ); + + SHGetFolderPathW( NULL, CSIDL_PROGRAM_FILES, NULL, 0, pth ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szProgramFiles64Folder, pth ); + + SHGetFolderPathW( NULL, CSIDL_PROGRAM_FILESX86, NULL, 0, pth ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szProgramFilesFolder, pth ); + + SHGetFolderPathW( NULL, CSIDL_PROGRAM_FILES_COMMON, NULL, 0, pth ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szCommonFiles64Folder, pth ); + + SHGetFolderPathW( NULL, CSIDL_PROGRAM_FILES_COMMONX86, NULL, 0, pth ); + PathAddBackslashW( pth ); + msi_set_property( package->db, szCommonFilesFolder, pth ); } /* Screen properties. */ @@ -878,7 +904,7 @@ static VOID set_installer_properties(MSIPACKAGE *package) (username = msi_reg_get_val_str( hkey, szRegisteredUser ))) msi_set_property( package->db, szUSERNAME, username ); if (!companyname && - (companyname = msi_reg_get_val_str( hkey, szRegisteredOrg ))) + (companyname = msi_reg_get_val_str( hkey, szRegisteredOrganization ))) msi_set_property( package->db, szCOMPANYNAME, companyname ); CloseHandle( hkey ); } @@ -908,7 +934,7 @@ static VOID set_installer_properties(MSIPACKAGE *package) langid = GetUserDefaultLangID(); sprintfW(bufstr, szIntFormat, langid); - msi_set_property( package->db, szUserLangID, bufstr ); + msi_set_property( package->db, szUserLanguageID, bufstr ); langid = GetSystemDefaultLangID(); sprintfW(bufstr, szIntFormat, langid); @@ -1042,7 +1068,7 @@ static UINT msi_load_admin_properties(MSIPACKAGE *package) return r; } -void msi_adjust_allusers_property( MSIPACKAGE *package ) +void msi_adjust_privilege_properties( MSIPACKAGE *package ) { /* FIXME: this should depend on the user's privileges */ if (msi_get_property_int( package->db, szAllUsers, 0 ) == 2) @@ -1050,6 +1076,7 @@ void msi_adjust_allusers_property( MSIPACKAGE *package ) TRACE("resetting ALLUSERS property from 2 to 1\n"); msi_set_property( package->db, szAllUsers, szOne ); } + msi_set_property( package->db, szAdminUser, szOne ); } MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url ) @@ -1074,7 +1101,7 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url ) create_temp_property_table( package ); msi_clone_properties( package ); - msi_adjust_allusers_property( package ); + msi_adjust_privilege_properties( package ); package->ProductCode = msi_dup_property( package->db, szProductCode ); package->script = msi_alloc_zero( sizeof(MSISCRIPT) ); @@ -1119,7 +1146,10 @@ static UINT copy_package_to_temp( LPCWSTR szPackage, LPWSTR filename ) if( !CopyFileW( szPackage, filename, FALSE ) ) { UINT error = GetLastError(); - ERR("failed to copy package %s to %s (%u)\n", debugstr_w(szPackage), debugstr_w(filename), error); + if ( error == ERROR_FILE_NOT_FOUND ) + ERR("can't find %s\n", debugstr_w(szPackage)); + else + ERR("failed to copy package %s to %s (%u)\n", debugstr_w(szPackage), debugstr_w(filename), error); DeleteFileW( filename ); return error; } @@ -1257,6 +1287,92 @@ static UINT apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code ) return r; } +static UINT msi_parse_summary( MSISUMMARYINFO *si, MSIPACKAGE *package ) +{ + WCHAR *template, *p, *q; + DWORD i, count; + + package->version = msi_suminfo_get_int32( si, PID_PAGECOUNT ); + TRACE("version: %d\n", package->version); + + template = msi_suminfo_dup_string( si, PID_TEMPLATE ); + if (!template) + return ERROR_SUCCESS; /* native accepts missing template property */ + + TRACE("template: %s\n", debugstr_w(template)); + + p = strchrW( template, ';' ); + if (!p) + { + WARN("invalid template string %s\n", debugstr_w(template)); + msi_free( template ); + return ERROR_PATCH_PACKAGE_INVALID; + } + *p = 0; + if (!template[0] || !strcmpW( template, szIntel )) + package->platform = PLATFORM_INTEL; + else if (!strcmpW( template, szIntel64 )) + package->platform = PLATFORM_INTEL64; + else if (!strcmpW( template, szX64 )) + package->platform = PLATFORM_X64; + else + { + WARN("unknown platform %s\n", debugstr_w(template)); + msi_free( template ); + return ERROR_INSTALL_PLATFORM_UNSUPPORTED; + } + + count = 1; + for (q = ++p; (q = strchrW( q, ',' )); q++) count++; + + package->langids = msi_alloc( count * sizeof(LANGID) ); + if (!package->langids) + { + msi_free( template ); + return ERROR_OUTOFMEMORY; + } + + i = 0; + while (*p) + { + q = strchrW( p, ',' ); + if (q) *q = 0; + package->langids[i] = atoiW( p ); + if (!q) break; + p = q + 1; + i++; + } + package->num_langids = i + 1; + + msi_free( template ); + return ERROR_SUCCESS; +} + +static UINT validate_package( MSIPACKAGE *package ) +{ + BOOL is_wow64; + UINT i; + + IsWow64Process( GetCurrentProcess(), &is_wow64 ); + if (package->platform == PLATFORM_X64) + { + if (!is_64bit && !is_wow64) + return ERROR_INSTALL_PLATFORM_UNSUPPORTED; + if (package->version < 200) + return ERROR_INSTALL_PACKAGE_INVALID; + } + if (!package->num_langids) + { + return ERROR_SUCCESS; + } + for (i = 0; i < package->num_langids; i++) + { + if (!package->langids[i] || IsValidLocale( package->langids[i], LCID_INSTALLED )) + return ERROR_SUCCESS; + } + return ERROR_INSTALL_LANGUAGE_UNSUPPORTED; +} + UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) { static const WCHAR Database[] = {'D','A','T','A','B','A','S','E',0}; @@ -1269,6 +1385,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) WCHAR temppath[MAX_PATH], localfile[MAX_PATH], cachefile[MAX_PATH]; LPCWSTR file = szPackage; DWORD index = 0; + MSISUMMARYINFO *si; TRACE("%s %p\n", debugstr_w(szPackage), pPackage); @@ -1339,7 +1456,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) * read/write, which is safe because we always create a copy that is thrown * away when we're done. */ - r = MSI_OpenDatabaseW( file, MSIDBOPEN_DIRECT, &db ); + r = MSI_OpenDatabaseW( file, MSIDBOPEN_TRANSACT, &db ); if( r != ERROR_SUCCESS ) { if (file != szPackage) @@ -1368,6 +1485,29 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) if( file != szPackage ) track_tempfile( package, file ); + si = MSI_GetSummaryInformationW( db->storage, 0 ); + if (!si) + { + WARN("failed to load summary info %u\n", r); + msiobj_release( &package->hdr ); + return ERROR_INSTALL_PACKAGE_INVALID; + } + + r = msi_parse_summary( si, package ); + msiobj_release( &si->hdr ); + if (r != ERROR_SUCCESS) + { + WARN("failed to parse summary info %u\n", r); + msiobj_release( &package->hdr ); + return r; + } + + r = validate_package( package ); + if (r != ERROR_SUCCESS) + { + msiobj_release( &package->hdr ); + return r; + } msi_set_property( package->db, Database, db->path ); if( UrlIsW( szPackage, URLIS_URL ) ) @@ -1398,7 +1538,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) if (r != ERROR_SUCCESS) { ERR("registered patch failed to apply %u\n", r); - MSI_FreePackage( (MSIOBJECTHDR *)package ); + msiobj_release( &package->hdr ); return r; } @@ -1408,7 +1548,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) if (index) { msi_clone_properties( package ); - msi_adjust_allusers_property( package ); + msi_adjust_privilege_properties( package ); } *pPackage = package; diff --git a/dll/win32/msi/record.c b/dll/win32/msi/record.c index 45adbac8471..7bc82814b2e 100644 --- a/dll/win32/msi/record.c +++ b/dll/win32/msi/record.c @@ -45,6 +45,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msidb); #define MSIFIELD_INT 1 #define MSIFIELD_WSTR 3 #define MSIFIELD_STREAM 4 +#define MSIFIELD_INTPTR 5 static void MSI_FreeField( MSIFIELD *field ) { @@ -52,6 +53,7 @@ static void MSI_FreeField( MSIFIELD *field ) { case MSIFIELD_NULL: case MSIFIELD_INT: + case MSIFIELD_INTPTR: break; case MSIFIELD_WSTR: msi_free( field->u.szwVal); @@ -177,6 +179,9 @@ UINT MSI_RecordCopyField( MSIRECORD *in_rec, UINT in_n, case MSIFIELD_INT: out->u.iVal = in->u.iVal; break; + case MSIFIELD_INTPTR: + out->u.pVal = in->u.pVal; + break; case MSIFIELD_WSTR: str = strdupW( in->u.szwVal ); if ( !str ) @@ -200,6 +205,32 @@ UINT MSI_RecordCopyField( MSIRECORD *in_rec, UINT in_n, return r; } +INT_PTR MSI_RecordGetIntPtr( MSIRECORD *rec, UINT iField ) +{ + int ret; + + TRACE( "%p %d\n", rec, iField ); + + if( iField > rec->count ) + return MININT_PTR; + + switch( rec->fields[iField].type ) + { + case MSIFIELD_INT: + return rec->fields[iField].u.iVal; + case MSIFIELD_INTPTR: + return rec->fields[iField].u.pVal; + case MSIFIELD_WSTR: + if( string2intW( rec->fields[iField].u.szwVal, &ret ) ) + return ret; + return MININT_PTR; + default: + break; + } + + return MININT_PTR; +} + int MSI_RecordGetInteger( MSIRECORD *rec, UINT iField) { int ret = 0; @@ -213,6 +244,8 @@ int MSI_RecordGetInteger( MSIRECORD *rec, UINT iField) { case MSIFIELD_INT: return rec->fields[iField].u.iVal; + case MSIFIELD_INTPTR: + return rec->fields[iField].u.pVal; case MSIFIELD_WSTR: if( string2intW( rec->fields[iField].u.szwVal, &ret ) ) return ret; @@ -267,6 +300,20 @@ UINT WINAPI MsiRecordClearData( MSIHANDLE handle ) return ERROR_SUCCESS; } +UINT MSI_RecordSetIntPtr( MSIRECORD *rec, UINT iField, INT_PTR pVal ) +{ + TRACE("%p %u %ld\n", rec, iField, pVal); + + if( iField > rec->count ) + return ERROR_INVALID_PARAMETER; + + MSI_FreeField( &rec->fields[iField] ); + rec->fields[iField].type = MSIFIELD_INTPTR; + rec->fields[iField].u.pVal = pVal; + + return ERROR_SUCCESS; +} + UINT MSI_RecordSetInteger( MSIRECORD *rec, UINT iField, int iVal ) { TRACE("%p %u %d\n", rec, iField, iVal); diff --git a/dll/win32/msi/registry.c b/dll/win32/msi/registry.c index 2a84e11be61..e83490f5e36 100644 --- a/dll/win32/msi/registry.c +++ b/dll/win32/msi/registry.c @@ -40,7 +40,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi); - /* * This module will be all the helper functions for registry access by the * installer bits. @@ -103,6 +102,15 @@ static const WCHAR szUninstall_fmt[] = { 'U','n','i','n','s','t','a','l','l','\\', '%','s',0 }; +static const WCHAR szUninstall_32node_fmt[] = { +'S','o','f','t','w','a','r','e','\\', +'W','o','w','6','4','3','2','N','o','d','e','\\', +'M','i','c','r','o','s','o','f','t','\\', +'W','i','n','d','o','w','s','\\', +'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', +'U','n','i','n','s','t','a','l','l','\\', +'%','s',0 }; + static const WCHAR szUserProduct[] = { 'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\', @@ -509,28 +517,36 @@ static UINT get_user_sid(LPWSTR *usersid) return ERROR_SUCCESS; } -UINT MSIREG_OpenUninstallKey(LPCWSTR szProduct, HKEY* key, BOOL create) +UINT MSIREG_OpenUninstallKey(MSIPACKAGE *package, HKEY *key, BOOL create) { UINT rc; WCHAR keypath[0x200]; - TRACE("%s\n",debugstr_w(szProduct)); - sprintfW(keypath,szUninstall_fmt,szProduct); + TRACE("%s\n", debugstr_w(package->ProductCode)); + + if (is_64bit && package->platform == PLATFORM_INTEL) + sprintfW(keypath, szUninstall_32node_fmt, package->ProductCode); + else + sprintfW(keypath, szUninstall_fmt, package->ProductCode); if (create) - rc = RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key); + rc = RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, KEY_ALL_ACCESS, NULL, key, NULL); else - rc = RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key); + rc = RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, KEY_ALL_ACCESS, key); return rc; } -UINT MSIREG_DeleteUninstallKey(LPCWSTR szProduct) +UINT MSIREG_DeleteUninstallKey(MSIPACKAGE *package) { WCHAR keypath[0x200]; - TRACE("%s\n",debugstr_w(szProduct)); - sprintfW(keypath,szUninstall_fmt,szProduct); + TRACE("%s\n", debugstr_w(package->ProductCode)); + + if (is_64bit && package->platform == PLATFORM_INTEL) + sprintfW(keypath, szUninstall_32node_fmt, package->ProductCode); + else + sprintfW(keypath, szUninstall_fmt, package->ProductCode); return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath); } diff --git a/dll/win32/msi/storages.c b/dll/win32/msi/storages.c index 3e8887437a7..56f252fa37f 100644 --- a/dll/win32/msi/storages.c +++ b/dll/win32/msi/storages.c @@ -334,10 +334,12 @@ static UINT STORAGES_get_column_info(struct tagMSIVIEW *view, UINT n, static UINT storages_find_row(MSISTORAGESVIEW *sv, MSIRECORD *rec, UINT *row) { LPCWSTR str; - UINT i, id, data; + UINT r, i, id, data; str = MSI_RecordGetString(rec, 1); - msi_string2idW(sv->db->strings, str, &id); + r = msi_string2idW(sv->db->strings, str, &id); + if (r != ERROR_SUCCESS) + return r; for (i = 0; i < sv->num_rows; i++) { diff --git a/dll/win32/msi/string.c b/dll/win32/msi/string.c index 21b1db2a405..5644749392f 100644 --- a/dll/win32/msi/string.c +++ b/dll/win32/msi/string.c @@ -3,6 +3,7 @@ * * Copyright 2002-2004, Mike McCormack for CodeWeavers * Copyright 2007 Robert Shearman for CodeWeavers + * Copyright 2010 Hans Leidekker for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -40,8 +41,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(msidb); -#define LONG_STR_BYTES 3 - typedef struct _msistring { USHORT persistent_refcount; @@ -564,7 +563,7 @@ end: return st; } -UINT msi_save_string_table( const string_table *st, IStorage *storage ) +UINT msi_save_string_table( const string_table *st, IStorage *storage, UINT *bytes_per_strref ) { UINT i, datasize = 0, poolsize = 0, sz, used, r, codepage, n; UINT ret = ERROR_FUNCTION_FAILED; @@ -593,8 +592,16 @@ UINT msi_save_string_table( const string_table *st, IStorage *storage ) used = 0; codepage = st->codepage; - pool[0]=codepage&0xffff; - pool[1]=(codepage>>16); + pool[0] = codepage & 0xffff; + pool[1] = codepage >> 16; + if (st->maxcount > 0xffff) + { + pool[1] |= 0x8000; + *bytes_per_strref = LONG_STR_BYTES; + } + else + *bytes_per_strref = sizeof(USHORT); + n = 1; for( i=1; imaxcount; i++ ) { diff --git a/dll/win32/msi/suminfo.c b/dll/win32/msi/suminfo.c index 902a61f6544..2a9cd713001 100644 --- a/dll/win32/msi/suminfo.c +++ b/dll/win32/msi/suminfo.c @@ -469,7 +469,7 @@ UINT WINAPI MsiGetSummaryInformationW( MSIHANDLE hDatabase, if( !pHandle ) return ERROR_INVALID_PARAMETER; - if( szDatabase ) + if( szDatabase && szDatabase[0] ) { LPCWSTR persist = uiUpdateCount ? MSIDBOPEN_TRANSACT : MSIDBOPEN_READONLY; @@ -644,6 +644,18 @@ LPWSTR msi_suminfo_dup_string( MSISUMMARYINFO *si, UINT uiProperty ) return strdupAtoW( prop->u.pszVal ); } +INT msi_suminfo_get_int32( MSISUMMARYINFO *si, UINT uiProperty ) +{ + PROPVARIANT *prop; + + if ( uiProperty >= MSI_MAX_PROPS ) + return -1; + prop = &si->property[uiProperty]; + if( prop->vt != VT_I4 ) + return -1; + return prop->u.lVal; +} + LPWSTR msi_get_suminfo_product( IStorage *stg ) { MSISUMMARYINFO *si; diff --git a/dll/win32/msi/table.c b/dll/win32/msi/table.c index 72d1f2103a5..3e456ed56c4 100644 --- a/dll/win32/msi/table.c +++ b/dll/win32/msi/table.c @@ -42,7 +42,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(msidb); #define MSITABLE_HASH_TABLE_SIZE 37 -#define LONG_STR_BYTES 3 typedef struct tagMSICOLUMNHASHENTRY { @@ -117,13 +116,13 @@ static UINT get_tablecolumns( MSIDATABASE *db, LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz); static void msi_free_colinfo( MSICOLUMNINFO *colinfo, UINT count ); -static inline UINT bytes_per_column( MSIDATABASE *db, const MSICOLUMNINFO *col ) +static inline UINT bytes_per_column( MSIDATABASE *db, const MSICOLUMNINFO *col, UINT bytes_per_strref ) { if( MSITYPE_IS_BINARY(col->type) ) return 2; if( col->type & MSITYPE_STRING ) - return db->bytes_per_strref; + return bytes_per_strref; if( (col->type & 0xff) <= 2) return 2; @@ -399,24 +398,33 @@ static void free_table( MSITABLE *table ) msi_free( table ); } -static UINT msi_table_get_row_size( MSIDATABASE *db,const MSICOLUMNINFO *cols, - UINT count ) +static UINT msi_table_get_row_size( MSIDATABASE *db, const MSICOLUMNINFO *cols, UINT count, UINT bytes_per_strref ) { - const MSICOLUMNINFO *last_col = &cols[count-1]; + const MSICOLUMNINFO *last_col; + if (!count) return 0; - return last_col->offset + bytes_per_column( db, last_col ); + + if (bytes_per_strref != LONG_STR_BYTES) + { + UINT i, size = 0; + for (i = 0; i < count; i++) size += bytes_per_column( db, &cols[i], bytes_per_strref ); + return size; + } + last_col = &cols[count - 1]; + return last_col->offset + bytes_per_column( db, last_col, bytes_per_strref ); } /* add this table to the list of cached tables in the database */ static UINT read_table_from_storage( MSIDATABASE *db, MSITABLE *t, IStorage *stg ) { BYTE *rawdata = NULL; - UINT rawsize = 0, i, j, row_size = 0; + UINT rawsize = 0, i, j, row_size, row_size_mem; TRACE("%s\n",debugstr_w(t->name)); - row_size = msi_table_get_row_size( db, t->colinfo, t->col_count ); + row_size = msi_table_get_row_size( db, t->colinfo, t->col_count, db->bytes_per_strref ); + row_size_mem = msi_table_get_row_size( db, t->colinfo, t->col_count, LONG_STR_BYTES ); /* if we can't read the table, just assume that it's empty */ read_stream_data( stg, t->name, TRUE, &rawdata, &rawsize ); @@ -441,17 +449,19 @@ static UINT read_table_from_storage( MSIDATABASE *db, MSITABLE *t, IStorage *stg /* transpose all the data */ TRACE("Transposing data from %d rows\n", t->row_count ); - for( i=0; irow_count; i++ ) + for (i = 0; i < t->row_count; i++) { - t->data[i] = msi_alloc( row_size ); + UINT ofs = 0, ofs_mem = 0; + + t->data[i] = msi_alloc( row_size_mem ); if( !t->data[i] ) goto err; t->data_persistent[i] = TRUE; - for( j=0; jcol_count; j++ ) + for (j = 0; j < t->col_count; j++) { - UINT ofs = t->colinfo[j].offset; - UINT n = bytes_per_column( db, &t->colinfo[j] ); + UINT m = bytes_per_column( db, &t->colinfo[j], LONG_STR_BYTES ); + UINT n = bytes_per_column( db, &t->colinfo[j], db->bytes_per_strref ); UINT k; if ( n != 2 && n != 3 && n != 4 ) @@ -459,9 +469,23 @@ static UINT read_table_from_storage( MSIDATABASE *db, MSITABLE *t, IStorage *stg ERR("oops - unknown column width %d\n", n); goto err; } - - for ( k = 0; k < n; k++ ) - t->data[i][ofs + k] = rawdata[ofs*t->row_count + i * n + k]; + if (t->colinfo[j].type & MSITYPE_STRING && n < m) + { + for (k = 0; k < m; k++) + { + if (k < n) + t->data[i][ofs_mem + k] = rawdata[ofs * t->row_count + i * n + k]; + else + t->data[i][ofs_mem + k] = 0; + } + } + else + { + for (k = 0; k < n; k++) + t->data[i][ofs_mem + k] = rawdata[ofs * t->row_count + i * n + k]; + } + ofs_mem += m; + ofs += n; } } @@ -729,10 +753,20 @@ static UINT get_table( MSIDATABASE *db, LPCWSTR name, MSITABLE **table_ret ) return ERROR_SUCCESS; } -static UINT save_table( MSIDATABASE *db, const MSITABLE *t ) +static UINT read_table_int(BYTE *const *data, UINT row, UINT col, UINT bytes) { - BYTE *rawdata = NULL, *p; - UINT rawsize, r, i, j, row_size; + UINT ret = 0, i; + + for (i = 0; i < bytes; i++) + ret += data[row][col + i] << i * 8; + + return ret; +} + +static UINT save_table( MSIDATABASE *db, const MSITABLE *t, UINT bytes_per_strref ) +{ + BYTE *rawdata = NULL; + UINT rawsize, r, i, j, row_size, row_count; /* Nothing to do for non-persistent tables */ if( t->persistent == MSICONDITION_FALSE ) @@ -740,9 +774,17 @@ static UINT save_table( MSIDATABASE *db, const MSITABLE *t ) TRACE("Saving %s\n", debugstr_w( t->name ) ); - row_size = msi_table_get_row_size( db, t->colinfo, t->col_count ); - - rawsize = t->row_count * row_size; + row_size = msi_table_get_row_size( db, t->colinfo, t->col_count, bytes_per_strref ); + row_count = t->row_count; + for (i = 0; i < t->row_count; i++) + { + if (!t->data_persistent[i]) + { + row_count = 1; /* yes, this is bizarre */ + break; + } + } + rawsize = row_count * row_size; rawdata = msi_alloc_zero( rawsize ); if( !rawdata ) { @@ -751,25 +793,41 @@ static UINT save_table( MSIDATABASE *db, const MSITABLE *t ) } rawsize = 0; - p = rawdata; - for( i=0; icol_count; i++ ) + for (i = 0; i < t->row_count; i++) { - for( j=0; jrow_count; j++ ) + UINT ofs = 0, ofs_mem = 0; + + if (!t->data_persistent[i]) break; + + for (j = 0; j < t->col_count; j++) { - UINT offset = t->colinfo[i].offset; + UINT m = bytes_per_column( db, &t->colinfo[j], LONG_STR_BYTES ); + UINT n = bytes_per_column( db, &t->colinfo[j], bytes_per_strref ); + UINT k; - if (!t->data_persistent[j]) continue; - if (i == 0) - rawsize += row_size; - - *p++ = t->data[j][offset]; - *p++ = t->data[j][offset + 1]; - if( 4 == bytes_per_column( db, &t->colinfo[i] ) ) + if (n != 2 && n != 3 && n != 4) { - *p++ = t->data[j][offset + 2]; - *p++ = t->data[j][offset + 3]; + ERR("oops - unknown column width %d\n", n); + goto err; } + if (t->colinfo[j].type & MSITYPE_STRING && n < m) + { + UINT id = read_table_int( t->data, i, ofs_mem, LONG_STR_BYTES ); + if (id > 1 << bytes_per_strref * 8) + { + ERR("string id %u out of range\n", id); + r = ERROR_FUNCTION_FAILED; + goto err; + } + } + for (k = 0; k < n; k++) + { + rawdata[ofs * row_count + i * n + k] = t->data[i][ofs_mem + k]; + } + ofs_mem += m; + ofs += n; } + rawsize += row_size; } TRACE("writing %d bytes\n", rawsize); @@ -777,12 +835,10 @@ static UINT save_table( MSIDATABASE *db, const MSITABLE *t ) err: msi_free( rawdata ); - return r; } -static void table_calc_column_offsets( MSIDATABASE *db, MSICOLUMNINFO *colinfo, - DWORD count ) +static void table_calc_column_offsets( MSIDATABASE *db, MSICOLUMNINFO *colinfo, DWORD count ) { DWORD i; @@ -791,7 +847,7 @@ static void table_calc_column_offsets( MSIDATABASE *db, MSICOLUMNINFO *colinfo, assert( (i+1) == colinfo[ i ].number ); if (i) colinfo[i].offset = colinfo[ i - 1 ].offset - + bytes_per_column( db, &colinfo[ i - 1 ] ); + + bytes_per_column( db, &colinfo[ i - 1 ], LONG_STR_BYTES ); else colinfo[i].offset = 0; TRACE("column %d is [%s] with type %08x ofs %d\n", @@ -855,16 +911,6 @@ static LPWSTR msi_makestring( const MSIDATABASE *db, UINT stringid) return strdupW(msi_string_lookup_id( db->strings, stringid )); } -static UINT read_table_int(BYTE *const *data, UINT row, UINT col, UINT bytes) -{ - UINT ret = 0, i; - - for (i = 0; i < bytes; i++) - ret += (data[row][col + i] << i * 8); - - return ret; -} - static UINT get_tablecolumns( MSIDATABASE *db, LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz) { @@ -902,11 +948,11 @@ static UINT get_tablecolumns( MSIDATABASE *db, count = table->row_count; for( i=0; idata, i, 0, db->bytes_per_strref) != table_id ) + if( read_table_int(table->data, i, 0, LONG_STR_BYTES) != table_id ) continue; if( colinfo ) { - UINT id = read_table_int(table->data, i, table->colinfo[2].offset, db->bytes_per_strref); + UINT id = read_table_int(table->data, i, table->colinfo[2].offset, LONG_STR_BYTES); UINT col = read_table_int(table->data, i, table->colinfo[1].offset, sizeof(USHORT)) - (1<<15); /* check the column number is in range */ @@ -971,7 +1017,7 @@ static void msi_update_table_columns( MSIDATABASE *db, LPCWSTR name ) if (!table->col_count) goto done; - size = msi_table_get_row_size( db, table->colinfo, table->col_count ); + size = msi_table_get_row_size( db, table->colinfo, table->col_count, LONG_STR_BYTES ); offset = table->colinfo[table->col_count - 1].offset; for ( n = 0; n < table->row_count; n++ ) @@ -988,8 +1034,8 @@ done: /* try to find the table name in the _Tables table */ BOOL TABLE_Exists( MSIDATABASE *db, LPCWSTR name ) { - UINT r, table_id = 0, i, count; - MSITABLE *table = NULL; + UINT r, table_id, i; + MSITABLE *table; static const WCHAR szStreams[] = {'_','S','t','r','e','a','m','s',0}; static const WCHAR szStorages[] = {'_','S','t','o','r','a','g','e','s',0}; @@ -1012,10 +1058,11 @@ BOOL TABLE_Exists( MSIDATABASE *db, LPCWSTR name ) return FALSE; } - count = table->row_count; - for( i=0; idata[ i ][ 0 ] == table_id ) + for( i = 0; i < table->row_count; i++ ) + { + if( read_table_int( table->data, i, 0, LONG_STR_BYTES ) == table_id ) return TRUE; + } return FALSE; } @@ -1059,7 +1106,7 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT * if (tv->order) row = tv->order->reorder[row]; - n = bytes_per_column( tv->db, &tv->columns[col-1] ); + n = bytes_per_column( tv->db, &tv->columns[col - 1], LONG_STR_BYTES ); if (n != 2 && n != 3 && n != 4) { ERR("oops! what is %d bytes per column?\n", n ); @@ -1116,7 +1163,7 @@ static UINT msi_stream_name( const MSITABLEVIEW *tv, UINT row, LPWSTR *pstname ) { static const WCHAR fmt[] = { '%','d',0 }; WCHAR number[0x20]; - UINT n = bytes_per_column( tv->db, &tv->columns[i] ); + UINT n = bytes_per_column( tv->db, &tv->columns[i], LONG_STR_BYTES ); switch( n ) { @@ -1213,7 +1260,7 @@ static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val ) msi_free( tv->columns[col-1].hash_table ); tv->columns[col-1].hash_table = NULL; - n = bytes_per_column( tv->db, &tv->columns[col-1] ); + n = bytes_per_column( tv->db, &tv->columns[col - 1], LONG_STR_BYTES ); if ( n != 2 && n != 3 && n != 4 ) { ERR("oops! what is %d bytes per column?\n", n ); @@ -1304,7 +1351,7 @@ static UINT get_table_value_from_record( MSITABLEVIEW *tv, MSIRECORD *rec, UINT if (r != ERROR_SUCCESS) return ERROR_NOT_FOUND; } - else if ( 2 == bytes_per_column( tv->db, &columninfo ) ) + else if ( bytes_per_column( tv->db, &columninfo, LONG_STR_BYTES ) == 2 ) { *pvalue = 0x8000 + MSI_RecordGetInteger( rec, iField ); if ( *pvalue & 0xffff0000 ) @@ -1577,39 +1624,60 @@ static UINT table_validate_new( MSITABLEVIEW *tv, MSIRECORD *rec ) return ERROR_SUCCESS; } -static UINT find_insert_index( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *pidx ) +static int compare_record( MSITABLEVIEW *tv, UINT row, MSIRECORD *rec ) { - UINT r, idx, j, ivalue, x; + UINT r, i, ivalue, x; - TRACE("%p %p %p\n", tv, rec, pidx); - - for (idx = 0; idx < tv->table->row_count; idx++) + for (i = 0; i < tv->num_cols; i++ ) { - for (j = 0; j < tv->num_cols; j++ ) + r = get_table_value_from_record( tv, rec, i + 1, &ivalue ); + if (r != ERROR_SUCCESS) + return 1; + + r = TABLE_fetch_int( &tv->view, row, i + 1, &x ); + if (r != ERROR_SUCCESS) { - r = get_table_value_from_record (tv, rec, j+1, &ivalue); - if (r != ERROR_SUCCESS) - break; + WARN("TABLE_fetch_int should not fail here %u\n", r); + return -1; + } + if (ivalue > x) + { + return 1; + } + else if (ivalue == x) + { + if (i < tv->num_cols - 1) continue; + return 0; + } + else + return -1; + } + return 1; +} - r = TABLE_fetch_int(&tv->view, idx, j + 1, &x); - if (r != ERROR_SUCCESS) - return r; +static int find_insert_index( MSITABLEVIEW *tv, MSIRECORD *rec ) +{ + int idx, c, low = 0, high = tv->table->row_count - 1; - if (ivalue > x) - break; - else if (ivalue == x) - continue; - else { - TRACE("Found %d.\n", idx); - *pidx = idx; - return ERROR_SUCCESS; - } + TRACE("%p %p\n", tv, rec); + + while (low <= high) + { + idx = (low + high) / 2; + c = compare_record( tv, idx, rec ); + + if (c < 0) + high = idx - 1; + else if (c > 0) + low = idx + 1; + else + { + TRACE("found %u\n", idx); + return idx; } } - - TRACE("Found %d.\n", idx); - *pidx = idx; - return ERROR_SUCCESS; + TRACE("found %u\n", high + 1); + return high + 1; } static UINT TABLE_insert_row( struct tagMSIVIEW *view, MSIRECORD *rec, UINT row, BOOL temporary ) @@ -1625,11 +1693,7 @@ static UINT TABLE_insert_row( struct tagMSIVIEW *view, MSIRECORD *rec, UINT row, return ERROR_FUNCTION_FAILED; if (row == -1) - { - r = find_insert_index(tv, rec, &row); - if( r != ERROR_SUCCESS ) - return ERROR_FUNCTION_FAILED; - } + row = find_insert_index( tv, rec ); r = table_create_new_row( view, &row, temporary ); TRACE("insert_row returned %08x\n", r); @@ -2306,7 +2370,7 @@ UINT TABLE_CreateView( MSIDATABASE *db, LPCWSTR name, MSIVIEW **view ) tv->db = db; tv->columns = tv->table->colinfo; tv->num_cols = tv->table->col_count; - tv->row_size = msi_table_get_row_size( db, tv->table->colinfo, tv->table->col_count ); + tv->row_size = msi_table_get_row_size( db, tv->table->colinfo, tv->table->col_count, LONG_STR_BYTES ); TRACE("%s one row is %d bytes\n", debugstr_w(name), tv->row_size ); @@ -2318,12 +2382,13 @@ UINT TABLE_CreateView( MSIDATABASE *db, LPCWSTR name, MSIVIEW **view ) UINT MSI_CommitTables( MSIDATABASE *db ) { - UINT r; + UINT r, bytes_per_strref; + HRESULT hr; MSITABLE *table = NULL; TRACE("%p\n",db); - r = msi_save_string_table( db->strings, db->storage ); + r = msi_save_string_table( db->strings, db->storage, &bytes_per_strref ); if( r != ERROR_SUCCESS ) { WARN("failed to save string table r=%08x\n",r); @@ -2332,7 +2397,7 @@ UINT MSI_CommitTables( MSIDATABASE *db ) LIST_FOR_EACH_ENTRY( table, &db->tables, MSITABLE, entry ) { - r = save_table( db, table ); + r = save_table( db, table, bytes_per_strref ); if( r != ERROR_SUCCESS ) { WARN("failed to save table %s (r=%08x)\n", @@ -2344,7 +2409,13 @@ UINT MSI_CommitTables( MSIDATABASE *db ) /* force everything to reload next time */ free_cached_tables( db ); - return ERROR_SUCCESS; + hr = IStorage_Commit( db->storage, 0 ); + if (FAILED( hr )) + { + WARN("failed to commit changes 0x%08x\n", hr); + r = ERROR_FUNCTION_FAILED; + } + return r; } MSICONDITION MSI_DatabaseIsTablePersistent( MSIDATABASE *db, LPCWSTR table ) @@ -2463,7 +2534,7 @@ static MSIRECORD *msi_get_transform_record( const MSITABLEVIEW *tv, const string IStream *stm = NULL; UINT r; - ofs += bytes_per_column( tv->db, &columns[i] ); + ofs += bytes_per_column( tv->db, &columns[i], bytes_per_strref ); r = msi_record_encoded_stream_name( tv, rec, &encname ); if ( r != ERROR_SUCCESS ) @@ -2490,7 +2561,7 @@ static MSIRECORD *msi_get_transform_record( const MSITABLEVIEW *tv, const string } else { - UINT n = bytes_per_column( tv->db, &columns[i] ); + UINT n = bytes_per_column( tv->db, &columns[i], bytes_per_strref ); switch( n ) { case 2: @@ -2704,7 +2775,7 @@ static UINT msi_table_load_transform( MSIDATABASE *db, IStorage *stg, ! MSITYPE_IS_BINARY(tv->columns[i].type) ) sz += bytes_per_strref; else - sz += bytes_per_column( tv->db, &tv->columns[i] ); + sz += bytes_per_column( tv->db, &tv->columns[i], bytes_per_strref ); } } else @@ -2726,7 +2797,7 @@ static UINT msi_table_load_transform( MSIDATABASE *db, IStorage *stg, ! MSITYPE_IS_BINARY(tv->columns[i].type) ) sz += bytes_per_strref; else - sz += bytes_per_column( tv->db, &tv->columns[i] ); + sz += bytes_per_column( tv->db, &tv->columns[i], bytes_per_strref ); } } } diff --git a/dll/win32/msi/version.rc b/dll/win32/msi/version.rc index 4fe3d9173e9..ab027f409a2 100644 --- a/dll/win32/msi/version.rc +++ b/dll/win32/msi/version.rc @@ -18,9 +18,9 @@ #define WINE_FILEDESCRIPTION_STR "Wine MSI dll" #define WINE_FILENAME_STR "msi.dll" -#define WINE_FILEVERSION 3,1,4000,2435 -#define WINE_FILEVERSION_STR "3.1.4000.2435" -#define WINE_PRODUCTVERSION 3,1,4000,2435 -#define WINE_PRODUCTVERSION_STR "3.1.4000.2435" +#define WINE_FILEVERSION 4,5,6001,22159 +#define WINE_FILEVERSION_STR "4.5.6001.22159" +#define WINE_PRODUCTVERSION 4,5,6001,22159 +#define WINE_PRODUCTVERSION_STR "4.5.6001.22159" #include "wine/wine_common_ver.rc" diff --git a/dll/win32/newdev/lang/ja-JP.rc b/dll/win32/newdev/lang/ja-JP.rc index e0600cf8ac3..ea51d295694 100644 --- a/dll/win32/newdev/lang/ja-JP.rc +++ b/dll/win32/newdev/lang/ja-JP.rc @@ -8,10 +8,10 @@ FONT 9, "MS UI Gothic" BEGIN LTEXT "ようこそ",IDC_WELCOMETITLE,120,8,195,24 LTEXT "このウィザードでは、以下の新しいデバイス ドライバをインストールします:", - IDC_STATIC,120,21,195,16 + IDC_STATIC,120,21,195,30 LTEXT "続行するには、[次へ] をクリックしてください。",IDC_STATIC,120,169,195,17 - LTEXT "不明なデバイス",IDC_DEVICE,134,36,164,11 - LTEXT "警告! カスタム デバイスをインストールすると、コンピュータがフリーズしたり、起動不能\になる可能\性があります!",IDC_STATIC,120,59,195,16 + LTEXT "不明なデバイス",IDC_DEVICE,134,52,164,11 + LTEXT "警告! カスタム デバイスをインストールすると、コンピュータがフリーズしたり、起動不能\になる可能\性があります!",IDC_STATIC,120,67,195,34 CONTROL "ドライバを自動的にインストールする",IDC_RADIO_AUTO,"Button", BS_AUTORADIOBUTTON,120,112,178,13 CONTROL "ドライバを特定の場所からインストールする",IDC_RADIO_MANUAL, diff --git a/dll/win32/rpcrt4/ndr_marshall.c b/dll/win32/rpcrt4/ndr_marshall.c index 9946bd13d57..839a4cad882 100644 --- a/dll/win32/rpcrt4/ndr_marshall.c +++ b/dll/win32/rpcrt4/ndr_marshall.c @@ -6032,6 +6032,7 @@ static LONG unmarshall_discriminant(PMIDL_STUB_MESSAGE pStubMsg, case RPC_FC_WCHAR: case RPC_FC_SHORT: case RPC_FC_USHORT: + case RPC_FC_ENUM16: { USHORT d; ALIGN_POINTER(pStubMsg->Buffer, sizeof(USHORT)); diff --git a/dll/win32/rpcrt4/rpcrt4_ros.diff b/dll/win32/rpcrt4/rpcrt4_ros.diff index 548e18aacdb..a3309f0b565 100644 --- a/dll/win32/rpcrt4/rpcrt4_ros.diff +++ b/dll/win32/rpcrt4/rpcrt4_ros.diff @@ -15,6 +15,18 @@ Index: epm_towers.h #define EPM_PROTOCOL_OSI_TP4 0x05 #define EPM_PROTOCOL_OSI_CLNS 0x06 #define EPM_PROTOCOL_TCP 0x07 +Index: ndr_marshall.c +=================================================================== +--- ndr_marshall.c (working copy) ++++ ndr_marshall.c (working copy) +@@ -6032,6 +6032,7 @@ + case RPC_FC_WCHAR: + case RPC_FC_SHORT: + case RPC_FC_USHORT: ++ case RPC_FC_ENUM16: + { + USHORT d; + ALIGN_POINTER(pStubMsg->Buffer, sizeof(USHORT)); Index: rpc_epmap.c =================================================================== --- rpc_epmap.c (working copy) diff --git a/dll/win32/syssetup/install.c b/dll/win32/syssetup/install.c index b5c226fd755..adf909ada4c 100644 --- a/dll/win32/syssetup/install.c +++ b/dll/win32/syssetup/install.c @@ -810,7 +810,7 @@ CreateShortcuts(VOID) if (CreateShortcutFolder(CSIDL_PROGRAMS, IDS_GAMES, szFolder, sizeof(szFolder)/sizeof(szFolder[0]))) { CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_SOLITAIRE, _T("%SystemRoot%\\system32\\sol.exe"), IDS_CMT_SOLITAIRE, TRUE); - CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_WINEMINE, _T("%SystemRoot%\\system32\\winemine.exe"), IDS_CMT_WINEMINE, TRUE); + CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_WINEMINE, _T("%SystemRoot%\\system32\\winmine.exe"), IDS_CMT_WINEMINE, TRUE); CreateShortcut(CSIDL_PROGRAMS, szFolder, IDS_SHORT_SPIDER, _T("%SystemRoot%\\system32\\spider.exe"), IDS_CMT_SPIDER, TRUE); } diff --git a/dll/win32/syssetup/lang/it-IT.rc b/dll/win32/syssetup/lang/it-IT.rc index bc76a2eaca5..693ab3eeaa7 100644 --- a/dll/win32/syssetup/lang/it-IT.rc +++ b/dll/win32/syssetup/lang/it-IT.rc @@ -110,16 +110,16 @@ CAPTION "Installazione di ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_ICON3, IDC_STATIC, 21, 10, 20, 20 - LTEXT "Data e ora", IDC_STATIC, 56, 7, 253, 8 + LTEXT "Data e ora", IDC_STATIC, 53, 7, 253, 8 CONTROL "", IDC_DATEPICKER, "SysDateTimePick32", - DTS_LONGDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 56, 17, 137, 10 + DTS_LONGDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 53, 17, 137, 14 CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32", - DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 200, 17, 54, 10 - LTEXT "Fuso orario", IDC_STATIC, 20, 42, 253, 8 - COMBOBOX IDC_TIMEZONELIST, 20, 52, 201, 93, + DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 200, 17, 54, 14 + LTEXT "Fuso orario", IDC_STATIC, 53, 42, 253, 8 + COMBOBOX IDC_TIMEZONELIST, 53, 52, 201, 93, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL AUTOCHECKBOX "Cambia automaticamente con l'ora &legale", - IDC_AUTODAYLIGHT, 20, 124, 201, 10 + IDC_AUTODAYLIGHT, 53, 124, 201, 10 END diff --git a/dll/win32/syssetup/lang/ja-JP.rc b/dll/win32/syssetup/lang/ja-JP.rc index 242f54e6ccb..ebe36a432d3 100644 --- a/dll/win32/syssetup/lang/ja-JP.rc +++ b/dll/win32/syssetup/lang/ja-JP.rc @@ -102,14 +102,14 @@ BEGIN "", IDC_STATIC, 53, 7, 253, 20 LTEXT "", IDC_LOCALETEXT, 53, 29, 250, 16 LTEXT "システム、ユーザーロケール設定変更には[カスタマイズ]をクリックします。", - IDC_STATIC, 53, 60, 196, 8 - PUSHBUTTON "カスタマイズ(&C)...", IDC_CUSTOMLOCALE, 250, 57, 50, 14 + IDC_STATIC, 53, 50, 166, 25 + PUSHBUTTON "カスタマイズ(&C)...", IDC_CUSTOMLOCALE, 220, 52, 80, 14 LTEXT "キーボード レイアウトは、キーを押したときにどの文字が入力されるかを制御します。", - IDC_STATIC, 53, 86, 253, 8 - LTEXT "", IDC_LAYOUTTEXT, 53, 100, 250, 16 + IDC_STATIC, 53, 81, 253, 20 + LTEXT "", IDC_LAYOUTTEXT, 53, 106, 250, 14 LTEXT "キーボードレイアウト変更には[カスタマイズ]をクリックします。", - IDC_STATIC, 53, 126, 184, 8 - PUSHBUTTON "カスタマイズ(&U)...", IDC_CUSTOMLAYOUT, 250, 122, 50, 14 + IDC_STATIC, 53, 120, 166, 25 + PUSHBUTTON "カスタマイズ(&U)...", IDC_CUSTOMLAYOUT, 220, 122, 80, 14 END diff --git a/dll/win32/syssetup/lang/pt-BR.rc b/dll/win32/syssetup/lang/pt-BR.rc new file mode 100644 index 00000000000..9474e3556cc --- /dev/null +++ b/dll/win32/syssetup/lang/pt-BR.rc @@ -0,0 +1,305 @@ +/* + * Copyright (C) 2010 Marcelo Zamperetti - marcelohz@gmail.com + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL + +IDD_WELCOMEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Instala鈬o do ReactOS" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Bem-vindo ao assistente de instala鈬o do ReactOS.", IDC_WELCOMETITLE, 115, 8, 195, 24 + LTEXT "Este assistente instala o ReactOS no seu computador. Ele "\ + "precisa reunir algumas informa鋏es sobre voc e seu computador "\ + "para instalar o ReactOS devidamente.", IDC_STATIC, 115, 40, 195, 100 + LTEXT "Clique Avan軋r para continuar a instala鈬o.", IDC_STATIC, 115, 169, 195, 17 +END + + +IDD_ACKPAGE DIALOGEX 0, 0, 317, 143 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Instala鈬o do ReactOS" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "Os desenvolvedores do ReactOS gostariam de agradecer aos seguintes projetos Open Source, "\ + "cujo partes foram utilizadas para criar o ReactOS:", + IDC_STATIC,15,7,286,19 + LISTBOX IDC_PROJECTS,15,30,286,75,LBS_NOSEL | LBS_HASSTRINGS | + LBS_NOINTEGRALHEIGHT | WS_VSCROLL + LTEXT "ReactOS est licenciado sob a GPL, se voc deseja reutilizar ou redistribuir "\ + "(partes) (d)ele voc deve respeitar a GPL", + IDC_STATIC,15,110,227,19 + PUSHBUTTON "&Visualizar GPL...",IDC_VIEWGPL,251,110,50,19 + LTEXT "Clique Avan軋r para continuar com a instala鈬o.",IDC_STATIC,15,136, + 195,17 +END + + +IDD_OWNERPAGE DIALOGEX DISCARDABLE 0, 0, 317, 143 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Instala鈬o do ReactOS" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_ICON2, IDC_STATIC, 21, 7, 20, 20 + LTEXT "Digite seu nome completo e o nome de sua empresa ou organiza鈬o.", + IDC_STATIC, 54, 7, 242, 21 + LTEXT "No&me:", IDC_STATIC, 54, 37, 44, 8 + EDITTEXT IDC_OWNERNAME, 132, 35, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL + LTEXT "&Organiza鈬o:", IDC_STATIC, 54, 57, 44, 8 + EDITTEXT IDC_OWNERORGANIZATION, 132, 55, 163, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL +END + + +IDD_COMPUTERPAGE DIALOGEX DISCARDABLE 0, 0, 317, 143 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Instala鈬o do ReactOS" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_ICON1, IDC_STATIC, 21, 7, 20, 20 + LTEXT "Digite um nome para o seu computador com 63 caracteres ou menos. "\ + "Se voc est em uma rede, o nome do computador deve ser exclusivo.", + IDC_STATIC, 54, 7, 250, 24 + LTEXT "Nome do &Computador:", IDC_STATIC, 54, 38, 75, 8 + EDITTEXT IDC_COMPUTERNAME, 165, 35, 148, 14, WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | ES_UPPERCASE + ICON IDI_ICON5, IDC_STATIC, 21, 57, 20, 20 + LTEXT "A instala鈬o vai criar uma conta no seu computador chamada Administrator. "\ + "Voc pode usar esta conta se precisar de acesso total ao seu computador.", + IDC_STATIC, 54, 57, 250, 25 + LTEXT "Digite uma senha para o administrador com 14 caracteres ou menos.", + IDC_STATIC, 54, 87, 250, 8 + LTEXT "Senha do &Administrador:", IDC_STATIC, 54, 104, 105, 8 + EDITTEXT IDC_ADMINPASSWORD1, 165, 101, 148, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD + LTEXT "C&onfirma Senha:", IDC_STATIC, 54, 123, 105, 8 + EDITTEXT IDC_ADMINPASSWORD2, 165, 120, 148, 14, WS_VISIBLE | WS_TABSTOP | ES_PASSWORD +END + + +IDD_LOCALEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 143 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Instala鈬o do ReactOS" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_ICON4, IDC_STATIC, 21, 7, 20, 20 + LTEXT "A localidade do sistema deve coincidir com o idioma das aplica鋏es "\ + "que voc quer utilizar. A localidade de usu疵io controla como nmeros, "\ + "moeda e datas aparecem.", IDC_STATIC, 53, 7, 253, 20 + LTEXT "", IDC_LOCALETEXT, 53, 29, 250, 16 + LTEXT "Para alterar a localidade de sistema ou usu疵io, clique Personalizar.", + IDC_STATIC, 53, 60, 196, 8 + PUSHBUTTON "&Personalizar...", IDC_CUSTOMLOCALE, 250, 57, 50, 14 + LTEXT "O layout do teclado controla os caracteres que aparecem quando voc digita.", + IDC_STATIC, 53, 86, 253, 8 + LTEXT "", IDC_LAYOUTTEXT, 53, 100, 250, 16 + LTEXT "Para alterar o layout do teclado, clique Personalizar.", + IDC_STATIC, 53, 126, 184, 8 + PUSHBUTTON "P&ersonalizar...", IDC_CUSTOMLAYOUT, 250, 122, 50, 14 +END + + +IDD_DATETIMEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 143 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Instala鈬o do ReactOS" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_ICON3, IDC_STATIC, 21, 10, 20, 20 + LTEXT "Data e Hora:", IDC_STATIC, 53, 7, 253, 8 + CONTROL "", IDC_DATEPICKER, "SysDateTimePick32", + DTS_LONGDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 53, 17, 137, 14 + CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32", + DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 200, 17, 54, 14 + LTEXT "Fuso Hor疵io:", IDC_STATIC, 53, 42, 253, 8 + COMBOBOX IDC_TIMEZONELIST, 53, 52, 201, 93, + CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL + AUTOCHECKBOX "Ajustar o relgio automaticamente para o hor疵io de &ver縊", + IDC_AUTODAYLIGHT, 53, 124, 201, 10 +END + + +IDD_PROCESSPAGE DIALOGEX 0, 0, 317, 143 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Instala鈬o do ReactOS" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "", IDC_ACTIVITY, 53, 7, 253, 20 + LTEXT "", IDC_ITEM, 53, 29, 253, 20 + CONTROL "", IDC_PROCESSPROGRESS, "msctls_progress32", + PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 53, 70, 253, 8 +END + + +IDD_FINISHPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Finalizando a instala鈬o do ReactOS" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Finalizando o Assistente de Instala鈬o do ReactOS", IDC_FINISHTITLE, 115, 8, 195, 24 + LTEXT "Voc completou a instala鈬o do ReactOS com sucesso.\n\n" \ + "Quando voc clicar em Finalizar, o computador ser reiniciado.", IDC_STATIC, 115, 40, 195, 100 + CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 115, 138, 188, 12 + LTEXT "Se houver um cd em algum drive, remova-o. Depois, para "\ + "reiniciar seu computador, clique Finalizar.", IDC_STATIC, 115, 169, 195, 17 +END + + +IDD_GPL DIALOGEX 0, 0, 333, 230 +STYLE DS_SHELLFONT | DS_CENTER | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "GNU General Public License" +FONT 8, "MS Shell Dlg" +BEGIN + EDITTEXT IDC_GPL_TEXT,7,7,319,190,ES_MULTILINE | ES_AUTOHSCROLL | + ES_READONLY | WS_VSCROLL + DEFPUSHBUTTON "OK",IDOK,141,209,50,14 +END + + +IDD_STATUSWINDOW_DLG DIALOGEX 0,0,274,26 +STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP +CAPTION "Por favor aguarde..." +FONT 8,"MS Shell Dlg 2",400,0,1 +BEGIN + LTEXT "",IDC_STATUSLABEL,7,8,234,12,SS_WORDELLIPSIS +END + + +STRINGTABLE +BEGIN + IDS_ACKTITLE "Agradecimentos" + IDS_ACKSUBTITLE "Os ombros nos quais o ReactOS se apoia e informa鋏es de licen軋" + IDS_OWNERTITLE "Personalize seu Software" + IDS_OWNERSUBTITLE "A Instala鈬o utiliza esta sua informa鈬o para personalizar o ReactOS." + IDS_COMPUTERTITLE "Nome do computador e senha do administrador" + IDS_COMPUTERSUBTITLE "Voc deve fornecer um nome e senha de administrador para o seu computador." + IDS_LOCALETITLE "Configura鋏es Regionais" + IDS_LOCALESUBTITLE "Voc pode personalizar o ReactOS para diferentes regies e lnguas." + IDS_DATETIMETITLE "Data e Hora" + IDS_DATETIMESUBTITLE "Definir a data e a hora corretas para o seu computador." + IDS_PROCESSTITLE "Registrando componentes" + IDS_PROCESSSUBTITLE "Por favor aguarde..." +END + +STRINGTABLE +BEGIN + IDS_CMT_DOWNLOADER "Fa軋 o download e instale v疵ias aplica鋏es" +END + +STRINGTABLE +BEGIN + IDS_ACCESSORIES "Acessrios" + IDS_CMT_CALC "Iniciar Calculadora" + IDS_CMT_CMD "Abrir prompt de comando" + IDS_CMT_DEVMGMT "Iniciar Gerenciador de Dispositivos" + IDS_CMT_EVENTVIEW "Iniciar Visualizador de Eventos" + IDS_CMT_EXPLORER "Iniciar Explorer" + IDS_CMT_MSCONFIG "Iniciar Software de Configura鈬o do Sistema" + IDS_CMT_NOTEPAD "Iniciar Editor de Texto" + IDS_CMT_RDESKTOP "Iniciar チrea de Trabalho Remota" + IDS_CMT_REGEDIT "Iniciar Editor do Registro" + IDS_CMT_SCREENSHOT "Capturar Tela" + IDS_CMT_SERVMAN "Iniciar Gerenciador de Servi輟s" + IDS_CMT_WORDPAD "Iniciar Editor de Documentos" + IDS_CMT_PAINT "Iniciar Paint" +END + +STRINGTABLE +BEGIN + IDS_GAMES "Jogos" + IDS_CMT_SOLITAIRE "Paci麩cia" + IDS_CMT_WINEMINE "WineMine" + IDS_CMT_SPIDER "Paci麩cia Spider" +END + +STRINGTABLE +BEGIN + IDS_SYS_TOOLS "Ferramentas de Sistema" + IDS_CMT_CHARMAP "Mapa de Caracteres" + IDS_CMT_DXDIAG "Iniciar o ReactX-Diagnostic" + IDS_CMT_KBSWITCH "Alterador de Layout de Teclado" +END + +STRINGTABLE +BEGIN + IDS_SYS_ACCESSIBILITY "Acessibilidade" + IDS_CMT_MAGNIFY "Ampliar" +END + +STRINGTABLE +BEGIN + IDS_SYS_ENTERTAINMENT "Entretenimento" + IDS_CMT_MPLAY32 "Iniciar Player Multimdia" + IDS_CMT_SNDVOL32 "Iniciar Controle de Volume" + IDS_CMT_SNDREC32 "Iniciar Gravador de Som" +END + +STRINGTABLE +BEGIN + IDS_REACTOS_SETUP "Instala鈬o do ReactOS" + IDS_UNKNOWN_ERROR "Erro Desconhecido" + IDS_REGISTERING_COMPONENTS "Registrando componentes..." + IDS_LOADLIBRARY_FAILED "LoadLibrary falhou: " + IDS_GETPROCADDR_FAILED "GetProcAddr falhou: " + IDS_REGSVR_FAILED "DllRegisterServer falhou: " + IDS_DLLINSTALL_FAILED "DllInstall falhou: " + IDS_TIMEOUT "Tempo limite esgotado durante registro" + IDS_REASON_UNKNOWN "" +END + +STRINGTABLE +BEGIN + IDS_SHORT_CALC "Calculator.lnk" + IDS_SHORT_CHARMAP "Character Map.lnk" + IDS_SHORT_CMD "Command Prompt.lnk" + IDS_SHORT_DEVICE "Device Manager.lnk" + IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk" + IDS_SHORT_DXDIAG "ReactX Diagnostic.lnk" + IDS_SHORT_EVENTVIEW "Event Viewer.lnk" + IDS_SHORT_EXPLORER "ReactOS Explorer.lnk" + IDS_SHORT_KBSWITCH "Keyboard Layout Switcher.lnk" + IDS_SHORT_MAGNIFY "Magnify.lnk" + IDS_SHORT_MPLAY32 "Multimedia Player.lnk" + IDS_SHORT_MSCONFIG "System Configuration.lnk" + IDS_SHORT_NOTEPAD "Notepad.lnk" + IDS_SHORT_RDESKTOP "Remote Desktop.lnk" + IDS_SHORT_REGEDIT "Regedit.lnk" + IDS_SHORT_SERVICE "Service Manager.lnk" + IDS_SHORT_SNAP "SnapShot.lnk" + IDS_SHORT_SNDVOL32 "Volume Control.lnk" + IDS_SHORT_SNDREC32 "Audiorecorder.lnk" + IDS_SHORT_SOLITAIRE "Solitaire.lnk" + IDS_SHORT_WINEMINE "WineMine.lnk" + IDS_SHORT_WORDPAD "WordPad.lnk" + IDS_SHORT_PAINT "Paint.lnk" + IDS_SHORT_SPIDER "Spider Solitaire.lnk" +END + +STRINGTABLE +BEGIN + IDS_WZD_NAME "A Instala鈬o n縊 pode continuar at que voc digite seu nome." + IDS_WZD_SETCOMPUTERNAME "A Instala鈬o falhou tentando definir o nome do computador." + IDS_WZD_COMPUTERNAME "A Instala鈬o n縊 pode continuar at que voc digite o nome do seu computador." + IDS_WZD_PASSWORDEMPTY "Voc deve digitar uma senha." + IDS_WZD_PASSWORDMATCH "As senhas digitadas n縊 coincidem. Por favor, entre com a senha desejada novamente." + IDS_WZD_PASSWORDCHAR "A senha que voc digitou cont駑 caracteres inv疝idos. Por favor digite uma senha diferente." + IDS_WZD_LOCALTIME "A Instala鈬o n縊 pde definir a hora local." +END + +STRINGTABLE +BEGIN + IDS_STATUS_INSTALL_DEV "Instalando dispositivos..." +END + +/* EOF */ diff --git a/dll/win32/syssetup/syssetup.rc b/dll/win32/syssetup/syssetup.rc index 58ff9eb88ae..d13f09ba5eb 100644 --- a/dll/win32/syssetup/syssetup.rc +++ b/dll/win32/syssetup/syssetup.rc @@ -67,6 +67,7 @@ IDR_GPL RT_TEXT "COPYING" #include "lang/no-NO.rc" #include "lang/nl-NL.rc" #include "lang/pl-PL.rc" +#include "lang/pt-BR.rc" #include "lang/sk-SK.rc" #include "lang/uk-UA.rc" #include "lang/zh-CN.rc" diff --git a/dll/win32/urlmon/binding.c b/dll/win32/urlmon/binding.c index e0f3624ff6b..02053b0cf39 100644 --- a/dll/win32/urlmon/binding.c +++ b/dll/win32/urlmon/binding.c @@ -1077,8 +1077,11 @@ static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progres } if(This->to_object) { - if(!(This->state & BINDING_OBJAVAIL)) + if(!(This->state & BINDING_OBJAVAIL)) { + IBinding_AddRef(BINDING(This)); create_object(This); + IBinding_Release(BINDING(This)); + } }else { STGMEDIUM stgmed; HRESULT hres; @@ -1519,7 +1522,7 @@ static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, I } if(binding_ctx) { - set_binding_sink(binding->protocol, PROTSINK(binding)); + set_binding_sink(binding->protocol, PROTSINK(binding), BINDINF(binding)); if(binding_ctx->redirect_url) IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_REDIRECTING, binding_ctx->redirect_url); report_data(binding, 0, 0, 0); diff --git a/dll/win32/urlmon/bindprot.c b/dll/win32/urlmon/bindprot.c index 29b8532b13d..01443e37856 100644 --- a/dll/win32/urlmon/bindprot.c +++ b/dll/win32/urlmon/bindprot.c @@ -382,7 +382,7 @@ static ULONG WINAPI BindProtocol_Release(IInternetProtocol *iface) if(This->filter_proxy) IInternetProtocol_Release(PROTOCOL(This->filter_proxy)); - set_binding_sink(PROTOCOL(This), NULL); + set_binding_sink(PROTOCOL(This), NULL, NULL); if(This->notif_hwnd) release_notif_hwnd(This->notif_hwnd); @@ -488,7 +488,7 @@ static HRESULT WINAPI BindProtocol_UnlockRequest(IInternetProtocol *iface) return IInternetProtocol_UnlockRequest(This->protocol_handler); } -void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink) +void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink, IInternetBindInfo *bind_info) { BindProtocol *This = PROTOCOL_THIS(bind_protocol); IInternetProtocolSink *prev_sink; @@ -505,6 +505,12 @@ void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *s service_provider = InterlockedExchangePointer((void**)&This->service_provider, service_provider); if(service_provider) IServiceProvider_Release(service_provider); + + if(bind_info) + IInternetBindInfo_AddRef(bind_info); + bind_info = InterlockedExchangePointer((void**)&This->bind_info, bind_info); + if(bind_info) + IInternetBindInfo_Release(bind_info); } IWinInetInfo *get_wininet_info(IInternetProtocol *bind_protocol) @@ -619,10 +625,7 @@ static HRESULT WINAPI ProtocolHandler_Start(IInternetProtocol *iface, LPCWSTR sz if(urlmon_protocol) IInternetProtocol_QueryInterface(protocol, &IID_IWinInetInfo, (void**)&This->wininet_info); - IInternetBindInfo_AddRef(pOIBindInfo); - This->bind_info = pOIBindInfo; - - set_binding_sink(PROTOCOL(This), pOIProtSink); + set_binding_sink(PROTOCOL(This), pOIProtSink, pOIBindInfo); hres = IInternetProtocol_QueryInterface(protocol, &IID_IInternetPriority, (void**)&priority); if(SUCCEEDED(hres)) { @@ -670,7 +673,7 @@ static HRESULT WINAPI ProtocolHandler_Terminate(IInternetProtocol *iface, DWORD This->filter_proxy = NULL; } - set_binding_sink(PROTOCOL(This), NULL); + set_binding_sink(PROTOCOL(This), NULL, NULL); if(This->bind_info) { IInternetBindInfo_Release(This->bind_info); diff --git a/dll/win32/urlmon/download.c b/dll/win32/urlmon/download.c index ebcb9c932c7..fee96062ad6 100644 --- a/dll/win32/urlmon/download.c +++ b/dll/win32/urlmon/download.c @@ -119,22 +119,22 @@ static HRESULT WINAPI DownloadBSC_OnLowResource(IBindStatusCallback *iface, DWOR return E_NOTIMPL; } -static void on_progress(DownloadBSC *This, ULONG progress, ULONG progress_max, ULONG status_code, LPCWSTR status_text) +static HRESULT on_progress(DownloadBSC *This, ULONG progress, ULONG progress_max, ULONG status_code, LPCWSTR status_text) { HRESULT hres; if(!This->callback) - return; + return S_OK; hres = IBindStatusCallback_OnProgress(This->callback, progress, progress_max, status_code, status_text); - if(FAILED(hres)) - FIXME("OnProgress failed: %08x\n", hres); + return hres; } static HRESULT WINAPI DownloadBSC_OnProgress(IBindStatusCallback *iface, ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText) { DownloadBSC *This = STATUSCLB_THIS(iface); + HRESULT hres = S_OK; TRACE("%p)->(%u %u %u %s)\n", This, ulProgress, ulProgressMax, ulStatusCode, debugstr_w(szStatusText)); @@ -146,11 +146,11 @@ static HRESULT WINAPI DownloadBSC_OnProgress(IBindStatusCallback *iface, ULONG u case BINDSTATUS_ENDDOWNLOADDATA: case BINDSTATUS_SENDINGREQUEST: case BINDSTATUS_MIMETYPEAVAILABLE: - on_progress(This, ulProgress, ulProgressMax, ulStatusCode, szStatusText); + hres = on_progress(This, ulProgress, ulProgressMax, ulStatusCode, szStatusText); break; case BINDSTATUS_CACHEFILENAMEAVAILABLE: - on_progress(This, ulProgress, ulProgressMax, ulStatusCode, szStatusText); + hres = on_progress(This, ulProgress, ulProgressMax, ulStatusCode, szStatusText); This->cache_file = heap_strdupW(szStatusText); break; @@ -161,7 +161,7 @@ static HRESULT WINAPI DownloadBSC_OnProgress(IBindStatusCallback *iface, ULONG u FIXME("Unsupported status %u\n", ulStatusCode); } - return S_OK; + return hres; } static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface, diff --git a/dll/win32/urlmon/file.c b/dll/win32/urlmon/file.c index a517d949222..a1901565336 100644 --- a/dll/win32/urlmon/file.c +++ b/dll/win32/urlmon/file.c @@ -17,38 +17,46 @@ */ #include "urlmon_main.h" +#include "winreg.h" +#include "shlwapi.h" + #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(urlmon); typedef struct { - const IInternetProtocolVtbl *lpIInternetProtocolVtbl; - const IInternetPriorityVtbl *lpInternetPriorityVtbl; + const IInternetProtocolExVtbl *lpIInternetProtocolExVtbl; + const IInternetPriorityVtbl *lpInternetPriorityVtbl; HANDLE file; + ULONG size; LONG priority; LONG ref; } FileProtocol; -#define PRIORITY(x) ((IInternetPriority*) &(x)->lpInternetPriorityVtbl) +#define PRIORITY(x) ((IInternetPriority*) &(x)->lpInternetPriorityVtbl) +#define PROTOCOLEX(x) ((IInternetProtocolEx*) &(x)->lpIInternetProtocolExVtbl) -#define PROTOCOL_THIS(iface) DEFINE_THIS(FileProtocol, IInternetProtocol, iface) +#define PROTOCOL_THIS(iface) DEFINE_THIS(FileProtocol, IInternetProtocolEx, iface) -static HRESULT WINAPI FileProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) +static HRESULT WINAPI FileProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv) { FileProtocol *This = PROTOCOL_THIS(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = PROTOCOL(This); + *ppv = PROTOCOLEX(This); }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); - *ppv = PROTOCOL(This); + *ppv = PROTOCOLEX(This); }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); - *ppv = PROTOCOL(This); + *ppv = PROTOCOLEX(This); + }else if(IsEqualGUID(&IID_IInternetProtocolEx, riid)) { + TRACE("(%p)->(IID_IInternetProtocolEx %p)\n", This, ppv); + *ppv = PROTOCOLEX(This); }else if(IsEqualGUID(&IID_IInternetPriority, riid)) { TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv); *ppv = PRIORITY(This); @@ -63,7 +71,7 @@ static HRESULT WINAPI FileProtocol_QueryInterface(IInternetProtocol *iface, REFI return E_NOINTERFACE; } -static ULONG WINAPI FileProtocol_AddRef(IInternetProtocol *iface) +static ULONG WINAPI FileProtocol_AddRef(IInternetProtocolEx *iface) { FileProtocol *This = PROTOCOL_THIS(iface); LONG ref = InterlockedIncrement(&This->ref); @@ -71,7 +79,7 @@ static ULONG WINAPI FileProtocol_AddRef(IInternetProtocol *iface) return ref; } -static ULONG WINAPI FileProtocol_Release(IInternetProtocol *iface) +static ULONG WINAPI FileProtocol_Release(IInternetProtocolEx *iface) { FileProtocol *This = PROTOCOL_THIS(iface); LONG ref = InterlockedDecrement(&This->ref); @@ -79,7 +87,7 @@ static ULONG WINAPI FileProtocol_Release(IInternetProtocol *iface) TRACE("(%p) ref=%d\n", This, ref); if(!ref) { - if(This->file) + if(This->file != INVALID_HANDLE_VALUE) CloseHandle(This->file); heap_free(This); @@ -89,27 +97,168 @@ static ULONG WINAPI FileProtocol_Release(IInternetProtocol *iface) return ref; } -static HRESULT WINAPI FileProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, +static HRESULT WINAPI FileProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved) { FileProtocol *This = PROTOCOL_THIS(iface); - BINDINFO bindinfo; - DWORD grfBINDF = 0; - LARGE_INTEGER size; - DWORD len; - LPWSTR url, mime = NULL, file_name; - WCHAR null_char = 0; - BOOL first_call = FALSE; + IUri *uri; HRESULT hres; - static const WCHAR wszFile[] = {'f','i','l','e',':'}; - TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink, pOIBindInfo, grfPI, dwReserved); - if(!szUrl || strlenW(szUrl) < sizeof(wszFile)/sizeof(WCHAR) - || memcmp(szUrl, wszFile, sizeof(wszFile))) + hres = CreateUri(szUrl, Uri_CREATE_FILE_USE_DOS_PATH, 0, &uri); + if(FAILED(hres)) + return hres; + + hres = IInternetProtocolEx_StartEx(PROTOCOLEX(This), uri, pOIProtSink, pOIBindInfo, + grfPI, (HANDLE*)dwReserved); + + IUri_Release(uri); + return hres; +} + +static HRESULT WINAPI FileProtocol_Continue(IInternetProtocolEx *iface, PROTOCOLDATA *pProtocolData) +{ + FileProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%p)\n", This, pProtocolData); + return E_NOTIMPL; +} + +static HRESULT WINAPI FileProtocol_Abort(IInternetProtocolEx *iface, HRESULT hrReason, + DWORD dwOptions) +{ + FileProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions); + return E_NOTIMPL; +} + +static HRESULT WINAPI FileProtocol_Terminate(IInternetProtocolEx *iface, DWORD dwOptions) +{ + FileProtocol *This = PROTOCOL_THIS(iface); + + TRACE("(%p)->(%08x)\n", This, dwOptions); + + return S_OK; +} + +static HRESULT WINAPI FileProtocol_Suspend(IInternetProtocolEx *iface) +{ + FileProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI FileProtocol_Resume(IInternetProtocolEx *iface) +{ + FileProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI FileProtocol_Read(IInternetProtocolEx *iface, void *pv, + ULONG cb, ULONG *pcbRead) +{ + FileProtocol *This = PROTOCOL_THIS(iface); + DWORD read = 0; + + TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead); + + if (pcbRead) + *pcbRead = 0; + + if(This->file == INVALID_HANDLE_VALUE) + return INET_E_DATA_NOT_AVAILABLE; + + if (!ReadFile(This->file, pv, cb, &read, NULL)) + return INET_E_DOWNLOAD_FAILURE; + + if(pcbRead) + *pcbRead = read; + + return cb == read ? S_OK : S_FALSE; +} + +static HRESULT WINAPI FileProtocol_Seek(IInternetProtocolEx *iface, LARGE_INTEGER dlibMove, + DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition) +{ + FileProtocol *This = PROTOCOL_THIS(iface); + FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition); + return E_NOTIMPL; +} + +static HRESULT WINAPI FileProtocol_LockRequest(IInternetProtocolEx *iface, DWORD dwOptions) +{ + FileProtocol *This = PROTOCOL_THIS(iface); + + TRACE("(%p)->(%08x)\n", This, dwOptions); + + return S_OK; +} + +static HRESULT WINAPI FileProtocol_UnlockRequest(IInternetProtocolEx *iface) +{ + FileProtocol *This = PROTOCOL_THIS(iface); + + TRACE("(%p)\n", This); + + return S_OK; +} + +static inline HRESULT report_result(IInternetProtocolSink *protocol_sink, HRESULT hres, DWORD res) +{ + IInternetProtocolSink_ReportResult(protocol_sink, hres, res, NULL); + return hres; +} + +static HRESULT open_file(FileProtocol *This, const WCHAR *path, IInternetProtocolSink *protocol_sink) +{ + LARGE_INTEGER size; + HANDLE file; + + file = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if(file == INVALID_HANDLE_VALUE) + return report_result(protocol_sink, INET_E_RESOURCE_NOT_FOUND, GetLastError()); + + if(!GetFileSizeEx(file, &size)) { + CloseHandle(file); + return report_result(protocol_sink, INET_E_RESOURCE_NOT_FOUND, GetLastError()); + } + + This->file = file; + This->size = size.u.LowPart; + + IInternetProtocolSink_ReportProgress(protocol_sink, + BINDSTATUS_CACHEFILENAMEAVAILABLE, path); + return S_OK; +} + +static HRESULT WINAPI FileProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUri, + IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, + DWORD grfPI, HANDLE *dwReserved) +{ + FileProtocol *This = PROTOCOL_THIS(iface); + BINDINFO bindinfo; + DWORD grfBINDF = 0; + DWORD scheme; + LPWSTR mime = NULL; + WCHAR null_char = 0; + BSTR path, url; + HRESULT hres; + + TRACE("(%p)->(%p %p %p %08x %p)\n", This, pUri, pOIProtSink, + pOIBindInfo, grfPI, dwReserved); + + if(!pUri) + return E_INVALIDARG; + + scheme = 0; + hres = IUri_GetScheme(pUri, &scheme); + if(FAILED(hres)) + return hres; + if(scheme != URL_SCHEME_FILE) return E_INVALIDARG; memset(&bindinfo, 0, sizeof(bindinfo)); @@ -122,170 +271,52 @@ static HRESULT WINAPI FileProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl ReleaseBindInfo(&bindinfo); - len = lstrlenW(szUrl)+16; - url = heap_alloc(len*sizeof(WCHAR)); - hres = CoInternetParseUrl(szUrl, PARSE_ENCODE, 0, url, len, &len, 0); - if(FAILED(hres)) { - heap_free(url); - return hres; - } - if(!(grfBINDF & BINDF_FROMURLMON)) IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_DIRECTBIND, NULL); - if(!This->file) { - WCHAR *ptr; + if(This->file != INVALID_HANDLE_VALUE) { + IInternetProtocolSink_ReportData(pOIProtSink, + BSCF_FIRSTDATANOTIFICATION|BSCF_LASTDATANOTIFICATION, + This->size, This->size); + return S_OK; + } - first_call = TRUE; + IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_SENDINGREQUEST, &null_char); - IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_SENDINGREQUEST, &null_char); + hres = IUri_GetPath(pUri, &path); + if(FAILED(hres)) { + ERR("GetPath failed: %08x\n", hres); + return report_result(pOIProtSink, hres, 0); + } - file_name = url+sizeof(wszFile)/sizeof(WCHAR); - - /* Strip both forward and back slashes */ - if( (file_name[0] == '/' && file_name[1] == '/') || - (file_name[0] == '\\' && file_name[1] == '\\')) - file_name += 2; - if(*file_name == '/') - file_name++; - - for(ptr = file_name; *ptr; ptr++) { - if(*ptr == '?' || *ptr == '#') { - *ptr = 0; - break; - } - } - - if(file_name[1] == '|') - file_name[1] = ':'; - - This->file = CreateFileW(file_name, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - - if(This->file == INVALID_HANDLE_VALUE) { - This->file = NULL; - IInternetProtocolSink_ReportResult(pOIProtSink, INET_E_RESOURCE_NOT_FOUND, - GetLastError(), NULL); - heap_free(url); - return INET_E_RESOURCE_NOT_FOUND; - } - - IInternetProtocolSink_ReportProgress(pOIProtSink, - BINDSTATUS_CACHEFILENAMEAVAILABLE, file_name); + hres = open_file(This, path, pOIProtSink); + SysFreeString(path); + if(FAILED(hres)) + return hres; + hres = IUri_GetDisplayUri(pUri, &url); + if(hres == S_OK) { hres = FindMimeFromData(NULL, url, NULL, 0, NULL, 0, &mime, 0); + SysFreeString(url); if(SUCCEEDED(hres)) { IInternetProtocolSink_ReportProgress(pOIProtSink, (grfBINDF & BINDF_FROMURLMON) ? - BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE : BINDSTATUS_MIMETYPEAVAILABLE, + BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE : BINDSTATUS_MIMETYPEAVAILABLE, mime); CoTaskMemFree(mime); } } - heap_free(url); + IInternetProtocolSink_ReportData(pOIProtSink, + BSCF_FIRSTDATANOTIFICATION|BSCF_LASTDATANOTIFICATION, + This->size, This->size); - if(GetFileSizeEx(This->file, &size)) - IInternetProtocolSink_ReportData(pOIProtSink, - BSCF_FIRSTDATANOTIFICATION|BSCF_LASTDATANOTIFICATION, - size.u.LowPart, size.u.LowPart); - - if(first_call) - IInternetProtocolSink_ReportResult(pOIProtSink, S_OK, 0, NULL); - - return S_OK; -} - -static HRESULT WINAPI FileProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData) -{ - FileProtocol *This = PROTOCOL_THIS(iface); - FIXME("(%p)->(%p)\n", This, pProtocolData); - return E_NOTIMPL; -} - -static HRESULT WINAPI FileProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason, - DWORD dwOptions) -{ - FileProtocol *This = PROTOCOL_THIS(iface); - FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions); - return E_NOTIMPL; -} - -static HRESULT WINAPI FileProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions) -{ - FileProtocol *This = PROTOCOL_THIS(iface); - - TRACE("(%p)->(%08x)\n", This, dwOptions); - - return S_OK; -} - -static HRESULT WINAPI FileProtocol_Suspend(IInternetProtocol *iface) -{ - FileProtocol *This = PROTOCOL_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; -} - -static HRESULT WINAPI FileProtocol_Resume(IInternetProtocol *iface) -{ - FileProtocol *This = PROTOCOL_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; -} - -static HRESULT WINAPI FileProtocol_Read(IInternetProtocol *iface, void *pv, - ULONG cb, ULONG *pcbRead) -{ - FileProtocol *This = PROTOCOL_THIS(iface); - DWORD read = 0; - - TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead); - - if (pcbRead) - *pcbRead = 0; - - if(!This->file) - return INET_E_DATA_NOT_AVAILABLE; - - if (!ReadFile(This->file, pv, cb, &read, NULL)) - return INET_E_DOWNLOAD_FAILURE; - - if(pcbRead) - *pcbRead = read; - - return cb == read ? S_OK : S_FALSE; -} - -static HRESULT WINAPI FileProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, - DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition) -{ - FileProtocol *This = PROTOCOL_THIS(iface); - FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition); - return E_NOTIMPL; -} - -static HRESULT WINAPI FileProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions) -{ - FileProtocol *This = PROTOCOL_THIS(iface); - - TRACE("(%p)->(%08x)\n", This, dwOptions); - - return S_OK; -} - -static HRESULT WINAPI FileProtocol_UnlockRequest(IInternetProtocol *iface) -{ - FileProtocol *This = PROTOCOL_THIS(iface); - - TRACE("(%p)\n", This); - - return S_OK; + return report_result(pOIProtSink, S_OK, 0); } #undef PROTOCOL_THIS -static const IInternetProtocolVtbl FileProtocolVtbl = { +static const IInternetProtocolExVtbl FileProtocolExVtbl = { FileProtocol_QueryInterface, FileProtocol_AddRef, FileProtocol_Release, @@ -298,7 +329,8 @@ static const IInternetProtocolVtbl FileProtocolVtbl = { FileProtocol_Read, FileProtocol_Seek, FileProtocol_LockRequest, - FileProtocol_UnlockRequest + FileProtocol_UnlockRequest, + FileProtocol_StartEx }; #define PRIORITY_THIS(iface) DEFINE_THIS(FileProtocol, InternetPriority, iface) @@ -307,19 +339,19 @@ static HRESULT WINAPI FilePriority_QueryInterface(IInternetPriority *iface, REFIID riid, void **ppv) { FileProtocol *This = PRIORITY_THIS(iface); - return IInternetProtocol_QueryInterface(PROTOCOL(This), riid, ppv); + return IInternetProtocolEx_QueryInterface(PROTOCOLEX(This), riid, ppv); } static ULONG WINAPI FilePriority_AddRef(IInternetPriority *iface) { FileProtocol *This = PRIORITY_THIS(iface); - return IInternetProtocol_AddRef(PROTOCOL(This)); + return IInternetProtocolEx_AddRef(PROTOCOLEX(This)); } static ULONG WINAPI FilePriority_Release(IInternetPriority *iface) { FileProtocol *This = PRIORITY_THIS(iface); - return IInternetProtocol_Release(PROTOCOL(This)); + return IInternetProtocolEx_Release(PROTOCOLEX(This)); } static HRESULT WINAPI FilePriority_SetPriority(IInternetPriority *iface, LONG nPriority) @@ -362,13 +394,12 @@ HRESULT FileProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) ret = heap_alloc(sizeof(FileProtocol)); - ret->lpIInternetProtocolVtbl = &FileProtocolVtbl; + ret->lpIInternetProtocolExVtbl = &FileProtocolExVtbl; ret->lpInternetPriorityVtbl = &FilePriorityVtbl; - ret->file = NULL; + ret->file = INVALID_HANDLE_VALUE; ret->priority = 0; ret->ref = 1; - *ppobj = PROTOCOL(ret); - + *ppobj = PROTOCOLEX(ret); return S_OK; } diff --git a/dll/win32/urlmon/ftp.c b/dll/win32/urlmon/ftp.c index f5e35064c90..4fa0924387d 100644 --- a/dll/win32/urlmon/ftp.c +++ b/dll/win32/urlmon/ftp.c @@ -36,14 +36,21 @@ typedef struct { #define ASYNCPROTOCOL_THIS(iface) DEFINE_THIS2(FtpProtocol, base, iface) -static HRESULT FtpProtocol_open_request(Protocol *prot, LPCWSTR url, DWORD request_flags, +static HRESULT FtpProtocol_open_request(Protocol *prot, IUri *uri, DWORD request_flags, HINTERNET internet_session, IInternetBindInfo *bind_info) { FtpProtocol *This = ASYNCPROTOCOL_THIS(prot); + BSTR url; + HRESULT hres; + + hres = IUri_GetAbsoluteUri(uri, &url); + if(FAILED(hres)) + return hres; This->base.request = InternetOpenUrlW(internet_session, url, NULL, 0, request_flags|INTERNET_FLAG_EXISTING_CONNECT|INTERNET_FLAG_PASSIVE, (DWORD_PTR)&This->base); + SysFreeString(url); if (!This->base.request && GetLastError() != ERROR_IO_PENDING) { WARN("InternetOpenUrl failed: %d\n", GetLastError()); return INET_E_RESOURCE_NOT_FOUND; @@ -145,6 +152,8 @@ static HRESULT WINAPI FtpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, DWORD grfPI, HANDLE_PTR dwReserved) { FtpProtocol *This = PROTOCOL_THIS(iface); + IUri *uri; + HRESULT hres; static const WCHAR ftpW[] = {'f','t','p',':'}; @@ -154,7 +163,14 @@ static HRESULT WINAPI FtpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, if(strncmpW(szUrl, ftpW, sizeof(ftpW)/sizeof(WCHAR))) return MK_E_SYNTAX; - return protocol_start(&This->base, PROTOCOL(This), szUrl, pOIProtSink, pOIBindInfo); + hres = CreateUri(szUrl, 0, 0, &uri); + if(FAILED(hres)) + return hres; + + hres = protocol_start(&This->base, PROTOCOL(This), uri, pOIProtSink, pOIBindInfo); + + IUri_Release(uri); + return hres; } static HRESULT WINAPI FtpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData) diff --git a/dll/win32/urlmon/gopher.c b/dll/win32/urlmon/gopher.c index 18e397285df..d8781ce7925 100644 --- a/dll/win32/urlmon/gopher.c +++ b/dll/win32/urlmon/gopher.c @@ -34,13 +34,20 @@ typedef struct { #define ASYNCPROTOCOL_THIS(iface) DEFINE_THIS2(GopherProtocol, base, iface) -static HRESULT GopherProtocol_open_request(Protocol *prot, LPCWSTR url, DWORD request_flags, +static HRESULT GopherProtocol_open_request(Protocol *prot, IUri *uri, DWORD request_flags, HINTERNET internet_session, IInternetBindInfo *bind_info) { GopherProtocol *This = ASYNCPROTOCOL_THIS(prot); + BSTR url; + HRESULT hres; + + hres = IUri_GetAbsoluteUri(uri, &url); + if(FAILED(hres)) + return hres; This->base.request = InternetOpenUrlW(internet_session, url, NULL, 0, request_flags, (DWORD_PTR)&This->base); + SysFreeString(url); if (!This->base.request && GetLastError() != ERROR_IO_PENDING) { WARN("InternetOpenUrl failed: %d\n", GetLastError()); return INET_E_RESOURCE_NOT_FOUND; @@ -125,11 +132,20 @@ static HRESULT WINAPI GopherProtocol_Start(IInternetProtocol *iface, LPCWSTR szU DWORD grfPI, HANDLE_PTR dwReserved) { GopherProtocol *This = PROTOCOL_THIS(iface); + IUri *uri; + HRESULT hres; TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink, pOIBindInfo, grfPI, dwReserved); - return protocol_start(&This->base, PROTOCOL(This), szUrl, pOIProtSink, pOIBindInfo); + hres = CreateUri(szUrl, 0, 0, &uri); + if(FAILED(hres)) + return hres; + + hres = protocol_start(&This->base, PROTOCOL(This), uri, pOIProtSink, pOIBindInfo); + + IUri_Release(uri); + return hres; } static HRESULT WINAPI GopherProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData) diff --git a/dll/win32/urlmon/http.c b/dll/win32/urlmon/http.c index fc0b8c4ecfe..722ec501b4d 100644 --- a/dll/win32/urlmon/http.c +++ b/dll/win32/urlmon/http.c @@ -67,18 +67,18 @@ static LPWSTR query_http_info(HttpProtocol *This, DWORD option) #define ASYNCPROTOCOL_THIS(iface) DEFINE_THIS2(HttpProtocol, base, iface) -static HRESULT HttpProtocol_open_request(Protocol *prot, LPCWSTR url, DWORD request_flags, +static HRESULT HttpProtocol_open_request(Protocol *prot, IUri *uri, DWORD request_flags, HINTERNET internet_session, IInternetBindInfo *bind_info) { HttpProtocol *This = ASYNCPROTOCOL_THIS(prot); LPWSTR addl_header = NULL, post_cookie = NULL, optional = NULL; IServiceProvider *service_provider = NULL; IHttpNegotiate2 *http_negotiate2 = NULL; - LPWSTR host, user, pass, path; + BSTR url, host, user, pass, path; LPOLESTR accept_mimes[257]; - URL_COMPONENTSW url_comp; + const WCHAR **accept_types; BYTE security_id[512]; - DWORD len = 0; + DWORD len = 0, port; ULONG num; BOOL res, b; HRESULT hres; @@ -88,24 +88,28 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, LPCWSTR url, DWORD requ {'P','O','S','T',0}, {'P','U','T',0}}; - memset(&url_comp, 0, sizeof(url_comp)); - url_comp.dwStructSize = sizeof(url_comp); - url_comp.dwSchemeLength = url_comp.dwHostNameLength = url_comp.dwUrlPathLength = url_comp.dwExtraInfoLength = - url_comp.dwUserNameLength = url_comp.dwPasswordLength = 1; - if (!InternetCrackUrlW(url, 0, 0, &url_comp)) - return MK_E_SYNTAX; + hres = IUri_GetPort(uri, &port); + if(FAILED(hres)) + return hres; - if(!url_comp.nPort) - url_comp.nPort = This->https ? INTERNET_DEFAULT_HTTPS_PORT : INTERNET_DEFAULT_HTTP_PORT; + hres = IUri_GetHost(uri, &host); + if(FAILED(hres)) + return hres; - host = heap_strndupW(url_comp.lpszHostName, url_comp.dwHostNameLength); - user = heap_strndupW(url_comp.lpszUserName, url_comp.dwUserNameLength); - pass = heap_strndupW(url_comp.lpszPassword, url_comp.dwPasswordLength); - This->base.connection = InternetConnectW(internet_session, host, url_comp.nPort, user, pass, - INTERNET_SERVICE_HTTP, This->https ? INTERNET_FLAG_SECURE : 0, (DWORD_PTR)&This->base); - heap_free(pass); - heap_free(user); - heap_free(host); + hres = IUri_GetUserName(uri, &user); + if(SUCCEEDED(hres)) { + hres = IUri_GetPassword(uri, &pass); + + if(SUCCEEDED(hres)) { + This->base.connection = InternetConnectW(internet_session, host, port, user, pass, + INTERNET_SERVICE_HTTP, This->https ? INTERNET_FLAG_SECURE : 0, (DWORD_PTR)&This->base); + SysFreeString(pass); + } + SysFreeString(user); + } + SysFreeString(host); + if(FAILED(hres)) + return hres; if(!This->base.connection) { WARN("InternetConnect failed: %d\n", GetLastError()); return INET_E_CANNOT_CONNECT; @@ -113,27 +117,35 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, LPCWSTR url, DWORD requ num = sizeof(accept_mimes)/sizeof(accept_mimes[0])-1; hres = IInternetBindInfo_GetBindString(bind_info, BINDSTRING_ACCEPT_MIMES, accept_mimes, num, &num); - if(hres != S_OK) { + if(hres == INET_E_USE_DEFAULT_SETTING) { + static const WCHAR default_accept_mimeW[] = {'*','/','*',0}; + static const WCHAR *default_accept_mimes[] = {default_accept_mimeW, NULL}; + + accept_types = default_accept_mimes; + num = 0; + }else if(hres == S_OK) { + accept_types = (const WCHAR**)accept_mimes; + }else { WARN("GetBindString BINDSTRING_ACCEPT_MIMES failed: %08x\n", hres); return INET_E_NO_VALID_MEDIA; } accept_mimes[num] = 0; - path = heap_alloc((url_comp.dwUrlPathLength+url_comp.dwExtraInfoLength+1)*sizeof(WCHAR)); - if(url_comp.dwUrlPathLength) - memcpy(path, url_comp.lpszUrlPath, url_comp.dwUrlPathLength*sizeof(WCHAR)); - if(url_comp.dwExtraInfoLength) - memcpy(path+url_comp.dwUrlPathLength, url_comp.lpszExtraInfo, url_comp.dwExtraInfoLength*sizeof(WCHAR)); - path[url_comp.dwUrlPathLength+url_comp.dwExtraInfoLength] = 0; if(This->https) request_flags |= INTERNET_FLAG_SECURE; - This->base.request = HttpOpenRequestW(This->base.connection, - This->base.bind_info.dwBindVerb < BINDVERB_CUSTOM - ? wszBindVerb[This->base.bind_info.dwBindVerb] : This->base.bind_info.szCustomVerb, - path, NULL, NULL, (LPCWSTR *)accept_mimes, request_flags, (DWORD_PTR)&This->base); - heap_free(path); + + hres = IUri_GetPathAndQuery(uri, &path); + if(SUCCEEDED(hres)) { + This->base.request = HttpOpenRequestW(This->base.connection, + This->base.bind_info.dwBindVerb < BINDVERB_CUSTOM + ? wszBindVerb[This->base.bind_info.dwBindVerb] : This->base.bind_info.szCustomVerb, + path, NULL, NULL, accept_types, request_flags, (DWORD_PTR)&This->base); + SysFreeString(path); + } while(num--) CoTaskMemFree(accept_mimes[num]); + if(FAILED(hres)) + return hres; if (!This->base.request) { WARN("HttpOpenRequest failed: %d\n", GetLastError()); return INET_E_RESOURCE_NOT_FOUND; @@ -153,8 +165,15 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, LPCWSTR url, DWORD requ return hres; } + hres = IUri_GetAbsoluteUri(uri, &url); + if(FAILED(hres)) { + IServiceProvider_Release(service_provider); + return hres; + } + hres = IHttpNegotiate_BeginningTransaction(This->http_negotiate, url, wszHeaders, 0, &addl_header); + SysFreeString(url); if(hres != S_OK) { WARN("IHttpNegotiate_BeginningTransaction failed: %08x\n", hres); IServiceProvider_Release(service_provider); @@ -382,6 +401,8 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl DWORD grfPI, HANDLE_PTR dwReserved) { HttpProtocol *This = PROTOCOL_THIS(iface); + IUri *uri; + HRESULT hres; static const WCHAR httpW[] = {'h','t','t','p',':'}; static const WCHAR httpsW[] = {'h','t','t','p','s',':'}; @@ -394,7 +415,14 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl : strncmpW(szUrl, httpW, sizeof(httpW)/sizeof(WCHAR))) return MK_E_SYNTAX; - return protocol_start(&This->base, PROTOCOL(This), szUrl, pOIProtSink, pOIBindInfo); + hres = CreateUri(szUrl, 0, 0, &uri); + if(FAILED(hres)) + return hres; + + hres = protocol_start(&This->base, PROTOCOL(This), uri, pOIProtSink, pOIBindInfo); + + IUri_Release(uri); + return hres; } static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData) diff --git a/dll/win32/urlmon/protocol.c b/dll/win32/urlmon/protocol.c index 3f3cbe505bc..b423c67354f 100644 --- a/dll/win32/urlmon/protocol.c +++ b/dll/win32/urlmon/protocol.c @@ -234,7 +234,7 @@ HINTERNET get_internet_session(IInternetBindInfo *bind_info) return internet_session; } -HRESULT protocol_start(Protocol *protocol, IInternetProtocol *prot, LPCWSTR url, +HRESULT protocol_start(Protocol *protocol, IInternetProtocol *prot, IUri *uri, IInternetProtocolSink *protocol_sink, IInternetBindInfo *bind_info) { DWORD request_flags; @@ -265,7 +265,7 @@ HRESULT protocol_start(Protocol *protocol, IInternetProtocol *prot, LPCWSTR url, if(protocol->bindf & BINDF_NEEDFILE) request_flags |= INTERNET_FLAG_NEED_FILE; - hres = protocol->vtbl->open_request(protocol, url, request_flags, internet_session, bind_info); + hres = protocol->vtbl->open_request(protocol, uri, request_flags, internet_session, bind_info); if(FAILED(hres)) { protocol_close_connection(protocol); return report_result(protocol, hres); diff --git a/dll/win32/urlmon/uri.c b/dll/win32/urlmon/uri.c index 82f48a0cae5..2aee38a46ba 100644 --- a/dll/win32/urlmon/uri.c +++ b/dll/win32/urlmon/uri.c @@ -24,9 +24,19 @@ #include "shlwapi.h" #define UINT_MAX 0xffffffff +#define USHORT_MAX 0xffff + +#define ALLOW_NULL_TERM_SCHEME 0x01 +#define ALLOW_NULL_TERM_USER_NAME 0x02 +#define ALLOW_NULL_TERM_PASSWORD 0x04 +#define ALLOW_BRACKETLESS_IP_LITERAL 0x08 +#define SKIP_IP_FUTURE_CHECK 0x10 +#define IGNORE_PORT_DELIMITER 0x20 WINE_DEFAULT_DEBUG_CHANNEL(urlmon); +static const IID IID_IUriObj = {0x4b364760,0x9f51,0x11df,{0x98,0x1c,0x08,0x00,0x20,0x0c,0x9a,0x66}}; + typedef struct { const IUriVtbl *lpIUriVtbl; LONG ref; @@ -37,6 +47,8 @@ typedef struct { WCHAR *canon_uri; DWORD canon_size; DWORD canon_len; + BOOL display_absolute; + DWORD create_flags; INT scheme_start; DWORD scheme_len; @@ -49,13 +61,79 @@ typedef struct { INT host_start; DWORD host_len; Uri_HOST_TYPE host_type; + + USHORT port; + BOOL has_port; + + INT authority_start; + DWORD authority_len; + + INT domain_offset; + + INT path_start; + DWORD path_len; + INT extension_offset; + + INT query_start; + DWORD query_len; + + INT fragment_start; + DWORD fragment_len; } Uri; typedef struct { const IUriBuilderVtbl *lpIUriBuilderVtbl; LONG ref; + + Uri *uri; + DWORD modified_props; + + WCHAR *fragment; + DWORD fragment_len; + + WCHAR *host; + DWORD host_len; + + WCHAR *password; + DWORD password_len; + + WCHAR *path; + DWORD path_len; + + BOOL has_port; + DWORD port; + + WCHAR *query; + DWORD query_len; + + WCHAR *scheme; + DWORD scheme_len; + + WCHAR *username; + DWORD username_len; } UriBuilder; +typedef struct { + const WCHAR *str; + DWORD len; +} h16; + +typedef struct { + /* IPv6 addresses can hold up to 8 h16 components. */ + h16 components[8]; + DWORD h16_count; + + /* An IPv6 can have 1 elision ("::"). */ + const WCHAR *elision; + + /* An IPv6 can contain 1 IPv4 address as the last 32bits of the address. */ + const WCHAR *ipv4; + DWORD ipv4_len; + + INT components_size; + INT elision_size; +} ipv6_address; + typedef struct { BSTR uri; @@ -69,13 +147,32 @@ typedef struct { DWORD scheme_len; URL_SCHEME scheme_type; - const WCHAR *userinfo; - DWORD userinfo_len; - INT userinfo_split; + const WCHAR *username; + DWORD username_len; + + const WCHAR *password; + DWORD password_len; const WCHAR *host; DWORD host_len; Uri_HOST_TYPE host_type; + + BOOL has_ipv6; + ipv6_address ipv6_address; + + BOOL has_port; + const WCHAR *port; + DWORD port_len; + DWORD port_value; + + const WCHAR *path; + DWORD path_len; + + const WCHAR *query; + DWORD query_len; + + const WCHAR *fragment; + DWORD fragment_len; } parse_data; static const CHAR hexDigits[] = "0123456789ABCDEF"; @@ -109,6 +206,44 @@ static const struct { {URL_SCHEME_WILDCARD, {'*',0}} }; +/* List of default ports Windows recognizes. */ +static const struct { + URL_SCHEME scheme; + USHORT port; +} default_ports[] = { + {URL_SCHEME_FTP, 21}, + {URL_SCHEME_HTTP, 80}, + {URL_SCHEME_GOPHER, 70}, + {URL_SCHEME_NNTP, 119}, + {URL_SCHEME_TELNET, 23}, + {URL_SCHEME_WAIS, 210}, + {URL_SCHEME_HTTPS, 443}, +}; + +/* List of 3 character top level domain names Windows seems to recognize. + * There might be more, but, these are the only ones I've found so far. + */ +static const struct { + WCHAR tld_name[4]; +} recognized_tlds[] = { + {{'c','o','m',0}}, + {{'e','d','u',0}}, + {{'g','o','v',0}}, + {{'i','n','t',0}}, + {{'m','i','l',0}}, + {{'n','e','t',0}}, + {{'o','r','g',0}} +}; + +static Uri *get_uri_obj(IUri *uri) +{ + Uri *ret; + HRESULT hres; + + hres = IUri_QueryInterface(uri, &IID_IUriObj, (void**)&ret); + return SUCCEEDED(hres) ? ret : NULL; +} + static inline BOOL is_alpha(WCHAR val) { return ((val >= 'a' && val <= 'z') || (val >= 'A' && val <= 'Z')); } @@ -117,16 +252,23 @@ static inline BOOL is_num(WCHAR val) { return (val >= '0' && val <= '9'); } +static inline BOOL is_drive_path(const WCHAR *str) { + return (is_alpha(str[0]) && (str[1] == ':' || str[1] == '|')); +} + +static inline BOOL is_unc_path(const WCHAR *str) { + return (str[0] == '\\' && str[0] == '\\'); +} + +static inline BOOL is_forbidden_dos_path_char(WCHAR val) { + return (val == '>' || val == '<' || val == '\"'); +} + /* A URI is implicitly a file path if it begins with * a drive letter (eg X:) or starts with "\\" (UNC path). */ static inline BOOL is_implicit_file_path(const WCHAR *str) { - if(is_alpha(str[0]) && str[1] == ':') - return TRUE; - else if(str[0] == '\\' && str[1] == '\\') - return TRUE; - - return FALSE; + return (is_unc_path(str) || (is_alpha(str[0]) && str[1] == ':')); } /* Checks if the URI is a hierarchical URI. A hierarchical @@ -191,6 +333,194 @@ static inline BOOL is_hexdigit(WCHAR val) { (val >= '0' && val <= '9')); } +static inline BOOL is_path_delim(WCHAR val) { + return (!val || val == '#' || val == '?'); +} + +/* List of schemes types Windows seems to expect to be hierarchical. */ +static inline BOOL is_hierarchical_scheme(URL_SCHEME type) { + return(type == URL_SCHEME_HTTP || type == URL_SCHEME_FTP || + type == URL_SCHEME_GOPHER || type == URL_SCHEME_NNTP || + type == URL_SCHEME_TELNET || type == URL_SCHEME_WAIS || + type == URL_SCHEME_FILE || type == URL_SCHEME_HTTPS || + type == URL_SCHEME_RES); +} + +/* Checks if 'flags' contains an invalid combination of Uri_CREATE flags. */ +static inline BOOL has_invalid_flag_combination(DWORD flags) { + return((flags & Uri_CREATE_DECODE_EXTRA_INFO && flags & Uri_CREATE_NO_DECODE_EXTRA_INFO) || + (flags & Uri_CREATE_CANONICALIZE && flags & Uri_CREATE_NO_CANONICALIZE) || + (flags & Uri_CREATE_CRACK_UNKNOWN_SCHEMES && flags & Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES) || + (flags & Uri_CREATE_PRE_PROCESS_HTML_URI && flags & Uri_CREATE_NO_PRE_PROCESS_HTML_URI) || + (flags & Uri_CREATE_IE_SETTINGS && flags & Uri_CREATE_NO_IE_SETTINGS)); +} + +/* Applies each default Uri_CREATE flags to 'flags' if it + * doesn't cause a flag conflict. + */ +static void apply_default_flags(DWORD *flags) { + if(!(*flags & Uri_CREATE_NO_CANONICALIZE)) + *flags |= Uri_CREATE_CANONICALIZE; + if(!(*flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) + *flags |= Uri_CREATE_DECODE_EXTRA_INFO; + if(!(*flags & Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES)) + *flags |= Uri_CREATE_CRACK_UNKNOWN_SCHEMES; + if(!(*flags & Uri_CREATE_NO_PRE_PROCESS_HTML_URI)) + *flags |= Uri_CREATE_PRE_PROCESS_HTML_URI; + if(!(*flags & Uri_CREATE_IE_SETTINGS)) + *flags |= Uri_CREATE_NO_IE_SETTINGS; +} + +/* Determines if the URI is hierarchical using the information already parsed into + * data and using the current location of parsing in the URI string. + * + * Windows considers a URI hierarchical if on of the following is true: + * A.) It's a wildcard scheme. + * B.) It's an implicit file scheme. + * C.) It's a known hierarchical scheme and it has two '\\' after the scheme name. + * (the '\\' will be converted into "//" during canonicalization). + * D.) It's not a relative URI and "//" appears after the scheme name. + */ +static inline BOOL is_hierarchical_uri(const WCHAR **ptr, const parse_data *data) { + const WCHAR *start = *ptr; + + if(data->scheme_type == URL_SCHEME_WILDCARD) + return TRUE; + else if(data->scheme_type == URL_SCHEME_FILE && data->has_implicit_scheme) + return TRUE; + else if(is_hierarchical_scheme(data->scheme_type) && (*ptr)[0] == '\\' && (*ptr)[1] == '\\') { + *ptr += 2; + return TRUE; + } else if(!data->is_relative && check_hierarchical(ptr)) + return TRUE; + + *ptr = start; + return FALSE; +} + +/* Checks if the two Uri's are logically equivalent. It's a simple + * comparison, since they are both of type Uri, and it can access + * the properties of each Uri directly without the need to go + * through the "IUri_Get*" interface calls. + */ +static BOOL are_equal_simple(const Uri *a, const Uri *b) { + if(a->scheme_type == b->scheme_type) { + const BOOL known_scheme = a->scheme_type != URL_SCHEME_UNKNOWN; + const BOOL are_hierarchical = + (a->authority_start > -1 && b->authority_start > -1); + + if(a->scheme_type == URL_SCHEME_FILE) { + if(a->canon_len == b->canon_len) + return !StrCmpIW(a->canon_uri, b->canon_uri); + } + + /* Only compare the scheme names (if any) if their unknown scheme types. */ + if(!known_scheme) { + if((a->scheme_start > -1 && b->scheme_start > -1) && + (a->scheme_len == b->scheme_len)) { + /* Make sure the schemes are the same. */ + if(StrCmpNW(a->canon_uri+a->scheme_start, b->canon_uri+b->scheme_start, a->scheme_len)) + return FALSE; + } else if(a->scheme_len != b->scheme_len) + /* One of the Uri's has a scheme name, while the other doesn't. */ + return FALSE; + } + + /* If they have a userinfo component, perform case sensitive compare. */ + if((a->userinfo_start > -1 && b->userinfo_start > -1) && + (a->userinfo_len == b->userinfo_len)) { + if(StrCmpNW(a->canon_uri+a->userinfo_start, b->canon_uri+b->userinfo_start, a->userinfo_len)) + return FALSE; + } else if(a->userinfo_len != b->userinfo_len) + /* One of the Uri's had a userinfo, while the other one doesn't. */ + return FALSE; + + /* Check if they have a host name. */ + if((a->host_start > -1 && b->host_start > -1) && + (a->host_len == b->host_len)) { + /* Perform a case insensitive compare if they are a known scheme type. */ + if(known_scheme) { + if(StrCmpNIW(a->canon_uri+a->host_start, b->canon_uri+b->host_start, a->host_len)) + return FALSE; + } else if(StrCmpNW(a->canon_uri+a->host_start, b->canon_uri+b->host_start, a->host_len)) + return FALSE; + } else if(a->host_len != b->host_len) + /* One of the Uri's had a host, while the other one didn't. */ + return FALSE; + + if(a->has_port && b->has_port) { + if(a->port != b->port) + return FALSE; + } else if(a->has_port || b->has_port) + /* One had a port, while the other one didn't. */ + return FALSE; + + /* Windows is weird with how it handles paths. For example + * One URI could be "http://google.com" (after canonicalization) + * and one could be "http://google.com/" and the IsEqual function + * would still evaluate to TRUE, but, only if they are both hierarchical + * URIs. + */ + if((a->path_start > -1 && b->path_start > -1) && + (a->path_len == b->path_len)) { + if(StrCmpNW(a->canon_uri+a->path_start, b->canon_uri+b->path_start, a->path_len)) + return FALSE; + } else if(are_hierarchical && a->path_len == -1 && b->path_len == 0) { + if(*(a->canon_uri+a->path_start) != '/') + return FALSE; + } else if(are_hierarchical && b->path_len == 1 && a->path_len == 0) { + if(*(b->canon_uri+b->path_start) != '/') + return FALSE; + } else if(a->path_len != b->path_len) + return FALSE; + + /* Compare the query strings of the two URIs. */ + if((a->query_start > -1 && b->query_start > -1) && + (a->query_len == b->query_len)) { + if(StrCmpNW(a->canon_uri+a->query_start, b->canon_uri+b->query_start, a->query_len)) + return FALSE; + } else if(a->query_len != b->query_len) + return FALSE; + + if((a->fragment_start > -1 && b->fragment_start > -1) && + (a->fragment_len == b->fragment_len)) { + if(StrCmpNW(a->canon_uri+a->fragment_start, b->canon_uri+b->fragment_start, a->fragment_len)) + return FALSE; + } else if(a->fragment_len != b->fragment_len) + return FALSE; + + /* If we get here, the two URIs are equivalent. */ + return TRUE; + } + + return FALSE; +} + +/* Computes the size of the given IPv6 address. + * Each h16 component is 16bits, if there is an IPv4 address, it's + * 32bits. If there's an elision it can be 16bits to 128bits, depending + * on the number of other components. + * + * Modeled after google-url's CheckIPv6ComponentsSize function + */ +static void compute_ipv6_comps_size(ipv6_address *address) { + address->components_size = address->h16_count * 2; + + if(address->ipv4) + /* IPv4 address is 4 bytes. */ + address->components_size += 4; + + if(address->elision) { + /* An elision can be anywhere from 2 bytes up to 16 bytes. + * It size depends on the size of the h16 and IPv4 components. + */ + address->elision_size = 16 - address->components_size; + if(address->elision_size < 2) + address->elision_size = 2; + } else + address->elision_size = 0; +} + /* Taken from dlls/jscript/lex.c */ static int hex_to_int(WCHAR val) { if(val >= '0' && val <= '9') @@ -238,6 +568,343 @@ static inline void pct_encode_val(WCHAR val, WCHAR *dest) { dest[2] = hexDigits[val & 0xf]; } +/* Scans the range of characters [str, end] and returns the last occurrence + * of 'ch' or returns NULL. + */ +static const WCHAR *str_last_of(const WCHAR *str, const WCHAR *end, WCHAR ch) { + const WCHAR *ptr = end; + + while(ptr >= str) { + if(*ptr == ch) + return ptr; + --ptr; + } + + return NULL; +} + +/* Attempts to parse the domain name from the host. + * + * This function also includes the Top-level Domain (TLD) name + * of the host when it tries to find the domain name. If it finds + * a valid domain name it will assign 'domain_start' the offset + * into 'host' where the domain name starts. + * + * It's implied that if a domain name its range is implied to be + * [host+domain_start, host+host_len). + */ +static void find_domain_name(const WCHAR *host, DWORD host_len, + INT *domain_start) { + const WCHAR *last_tld, *sec_last_tld, *end; + + end = host+host_len-1; + + *domain_start = -1; + + /* There has to be at least enough room for a '.' followed by a + * 3 character TLD for a domain to even exist in the host name. + */ + if(host_len < 4) + return; + + last_tld = str_last_of(host, end, '.'); + if(!last_tld) + /* http://hostname -> has no domain name. */ + return; + + sec_last_tld = str_last_of(host, last_tld-1, '.'); + if(!sec_last_tld) { + /* If the '.' is at the beginning of the host there + * has to be at least 3 characters in the TLD for it + * to be valid. + * Ex: .com -> .com as the domain name. + * .co -> has no domain name. + */ + if(last_tld-host == 0) { + if(end-(last_tld-1) < 3) + return; + } else if(last_tld-host == 3) { + DWORD i; + + /* If there's three characters in front of last_tld and + * they are on the list of recognized TLDs, then this + * host doesn't have a domain (since the host only contains + * a TLD name. + * Ex: edu.uk -> has no domain name. + * foo.uk -> foo.uk as the domain name. + */ + for(i = 0; i < sizeof(recognized_tlds)/sizeof(recognized_tlds[0]); ++i) { + if(!StrCmpNIW(host, recognized_tlds[i].tld_name, 3)) + return; + } + } else if(last_tld-host < 3) + /* Anything less than 3 characters is considered part + * of the TLD name. + * Ex: ak.uk -> Has no domain name. + */ + return; + + /* Otherwise the domain name is the whole host name. */ + *domain_start = 0; + } else if(end+1-last_tld > 3) { + /* If the last_tld has more than 3 characters, then it's automatically + * considered the TLD of the domain name. + * Ex: www.winehq.org.uk.test -> uk.test as the domain name. + */ + *domain_start = (sec_last_tld+1)-host; + } else if(last_tld - (sec_last_tld+1) < 4) { + DWORD i; + /* If the sec_last_tld is 3 characters long it HAS to be on the list of + * recognized to still be considered part of the TLD name, otherwise + * its considered the domain name. + * Ex: www.google.com.uk -> google.com.uk as the domain name. + * www.google.foo.uk -> foo.uk as the domain name. + */ + if(last_tld - (sec_last_tld+1) == 3) { + for(i = 0; i < sizeof(recognized_tlds)/sizeof(recognized_tlds[0]); ++i) { + if(!StrCmpNIW(sec_last_tld+1, recognized_tlds[i].tld_name, 3)) { + const WCHAR *domain = str_last_of(host, sec_last_tld-1, '.'); + + if(!domain) + *domain_start = 0; + else + *domain_start = (domain+1) - host; + TRACE("Found domain name %s\n", debugstr_wn(host+*domain_start, + (host+host_len)-(host+*domain_start))); + return; + } + } + + *domain_start = (sec_last_tld+1)-host; + } else { + /* Since the sec_last_tld is less than 3 characters it's considered + * part of the TLD. + * Ex: www.google.fo.uk -> google.fo.uk as the domain name. + */ + const WCHAR *domain = str_last_of(host, sec_last_tld-1, '.'); + + if(!domain) + *domain_start = 0; + else + *domain_start = (domain+1) - host; + } + } else { + /* The second to last TLD has more than 3 characters making it + * the domain name. + * Ex: www.google.test.us -> test.us as the domain name. + */ + *domain_start = (sec_last_tld+1)-host; + } + + TRACE("Found domain name %s\n", debugstr_wn(host+*domain_start, + (host+host_len)-(host+*domain_start))); +} + +/* Removes the dot segments from a hierarchical URIs path component. This + * function performs the removal in place. + * + * This is a modified version of Qt's QUrl function "removeDotsFromPath". + * + * This function returns the new length of the path string. + */ +static DWORD remove_dot_segments(WCHAR *path, DWORD path_len) { + WCHAR *out = path; + const WCHAR *in = out; + const WCHAR *end = out + path_len; + DWORD len; + + while(in < end) { + /* A. if the input buffer begins with a prefix of "/./" or "/.", + * where "." is a complete path segment, then replace that + * prefix with "/" in the input buffer; otherwise, + */ + if(in <= end - 3 && in[0] == '/' && in[1] == '.' && in[2] == '/') { + in += 2; + continue; + } else if(in == end - 2 && in[0] == '/' && in[1] == '.') { + *out++ = '/'; + in += 2; + break; + } + + /* B. if the input buffer begins with a prefix of "/../" or "/..", + * where ".." is a complete path segment, then replace that + * prefix with "/" in the input buffer and remove the last + * segment and its preceding "/" (if any) from the output + * buffer; otherwise, + */ + if(in <= end - 4 && in[0] == '/' && in[1] == '.' && in[2] == '.' && in[3] == '/') { + while(out > path && *(--out) != '/'); + + in += 3; + continue; + } else if(in == end - 3 && in[0] == '/' && in[1] == '.' && in[2] == '.') { + while(out > path && *(--out) != '/'); + + if(*out == '/') + ++out; + + in += 3; + break; + } + + /* C. move the first path segment in the input buffer to the end of + * the output buffer, including the initial "/" character (if + * any) and any subsequent characters up to, but not including, + * the next "/" character or the end of the input buffer. + */ + *out++ = *in++; + while(in < end && *in != '/') + *out++ = *in++; + } + + len = out - path; + TRACE("(%p %d): Path after dot segments removed %s len=%d\n", path, path_len, + debugstr_wn(path, len), len); + return len; +} + +/* Attempts to find the file extension in a given path. */ +static INT find_file_extension(const WCHAR *path, DWORD path_len) { + const WCHAR *end; + + for(end = path+path_len-1; end >= path && *end != '/' && *end != '\\'; --end) { + if(*end == '.') + return end-path; + } + + return -1; +} + +/* Computes the location where the elision should occur in the IPv6 + * address using the numerical values of each component stored in + * 'values'. If the address shouldn't contain an elision then 'index' + * is assigned -1 as it's value. Otherwise 'index' will contain the + * starting index (into values) where the elision should be, and 'count' + * will contain the number of cells the elision covers. + * + * NOTES: + * Windows will expand an elision if the elision only represents 1 h16 + * component of the URI. + * + * Ex: [1::2:3:4:5:6:7] -> [1:0:2:3:4:5:6:7] + * + * If the IPv6 address contains an IPv4 address, the IPv4 address is also + * considered for being included as part of an elision if all it's components + * are zeros. + * + * Ex: [1:2:3:4:5:6:0.0.0.0] -> [1:2:3:4:5:6::] + */ +static void compute_elision_location(const ipv6_address *address, const USHORT values[8], + INT *index, DWORD *count) { + DWORD i, max_len, cur_len; + INT max_index, cur_index; + + max_len = cur_len = 0; + max_index = cur_index = -1; + for(i = 0; i < 8; ++i) { + BOOL check_ipv4 = (address->ipv4 && i == 6); + BOOL is_end = (check_ipv4 || i == 7); + + if(check_ipv4) { + /* Check if the IPv4 address contains only zeros. */ + if(values[i] == 0 && values[i+1] == 0) { + if(cur_index == -1) + cur_index = i; + + cur_len += 2; + ++i; + } + } else if(values[i] == 0) { + if(cur_index == -1) + cur_index = i; + + ++cur_len; + } + + if(is_end || values[i] != 0) { + /* We only consider it for an elision if it's + * more than 1 component long. + */ + if(cur_len > 1 && cur_len > max_len) { + /* Found the new elision location. */ + max_len = cur_len; + max_index = cur_index; + } + + /* Reset the current range for the next range of zeros. */ + cur_index = -1; + cur_len = 0; + } + } + + *index = max_index; + *count = max_len; +} + +/* Removes all the leading and trailing white spaces or + * control characters from the URI and removes all control + * characters inside of the URI string. + */ +static BSTR pre_process_uri(LPCWSTR uri) { + BSTR ret; + DWORD len; + const WCHAR *start, *end; + WCHAR *buf, *ptr; + + len = lstrlenW(uri); + + start = uri; + /* Skip leading controls and whitespace. */ + while(iscntrlW(*start) || isspaceW(*start)) ++start; + + end = uri+len-1; + if(start == end) + /* URI consisted only of control/whitespace. */ + ret = SysAllocStringLen(NULL, 0); + else { + while(iscntrlW(*end) || isspaceW(*end)) --end; + + buf = heap_alloc(((end+1)-start)*sizeof(WCHAR)); + if(!buf) + return NULL; + + for(ptr = buf; start < end+1; ++start) { + if(!iscntrlW(*start)) + *ptr++ = *start; + } + + ret = SysAllocStringLen(buf, ptr-buf); + heap_free(buf); + } + + return ret; +} + +/* Converts the specified IPv4 address into an uint value. + * + * This function assumes that the IPv4 address has already been validated. + */ +static UINT ipv4toui(const WCHAR *ip, DWORD len) { + UINT ret = 0; + DWORD comp_value = 0; + const WCHAR *ptr; + + for(ptr = ip; ptr < ip+len; ++ptr) { + if(*ptr == '.') { + ret <<= 8; + ret += comp_value; + comp_value = 0; + } else + comp_value = comp_value*10 + (*ptr-'0'); + } + + ret <<= 8; + ret += comp_value; + + return ret; +} + /* Converts an IPv4 address in numerical form into it's fully qualified * string form. This function returns the number of characters written * to 'dest'. If 'dest' is NULL this function will return the number of @@ -266,6 +933,70 @@ static DWORD ui2ipv4(WCHAR *dest, UINT address) { return ret; } +/* Converts an h16 component (from an IPv6 address) into it's + * numerical value. + * + * This function assumes that the h16 component has already been validated. + */ +static USHORT h16tous(h16 component) { + DWORD i; + USHORT ret = 0; + + for(i = 0; i < component.len; ++i) { + ret <<= 4; + ret += hex_to_int(component.str[i]); + } + + return ret; +} + +/* Converts an IPv6 address into it's 128 bits (16 bytes) numerical value. + * + * This function assumes that the ipv6_address has already been validated. + */ +static BOOL ipv6_to_number(const ipv6_address *address, USHORT number[8]) { + DWORD i, cur_component = 0; + BOOL already_passed_elision = FALSE; + + for(i = 0; i < address->h16_count; ++i) { + if(address->elision) { + if(address->components[i].str > address->elision && !already_passed_elision) { + /* Means we just passed the elision and need to add it's values to + * 'number' before we do anything else. + */ + DWORD j = 0; + for(j = 0; j < address->elision_size; j+=2) + number[cur_component++] = 0; + + already_passed_elision = TRUE; + } + } + + number[cur_component++] = h16tous(address->components[i]); + } + + /* Case when the elision appears after the h16 components. */ + if(!already_passed_elision && address->elision) { + for(i = 0; i < address->elision_size; i+=2) + number[cur_component++] = 0; + already_passed_elision = TRUE; + } + + if(address->ipv4) { + UINT value = ipv4toui(address->ipv4, address->ipv4_len); + + if(cur_component != 6) { + ERR("(%p %p): Failed sanity check with %d\n", address, number, cur_component); + return FALSE; + } + + number[cur_component++] = (value >> 16) & 0xffff; + number[cur_component] = value & 0xffff; + } + + return TRUE; +} + /* Checks if the characters pointed to by 'ptr' are * a percent encoded data octet. * @@ -427,7 +1158,7 @@ static BOOL check_ipv4address(const WCHAR **ptr, BOOL strict) { * scheme = ALPHA *(ALPHA | NUM | '+' | '-' | '.') as defined by RFC 3896. * NOTE: Windows accepts a number as the first character of a scheme. */ -static BOOL parse_scheme_name(const WCHAR **ptr, parse_data *data) { +static BOOL parse_scheme_name(const WCHAR **ptr, parse_data *data, DWORD extras) { const WCHAR *start = *ptr; data->scheme = NULL; @@ -451,7 +1182,7 @@ static BOOL parse_scheme_name(const WCHAR **ptr, parse_data *data) { return FALSE; /* Schemes must end with a ':' */ - if(**ptr != ':') { + if(**ptr != ':' && !((extras & ALLOW_NULL_TERM_SCHEME) && !**ptr)) { *ptr = start; return FALSE; } @@ -504,7 +1235,7 @@ static BOOL parse_scheme_type(parse_data *data) { * * Returns TRUE if it was able to successfully parse the information. */ -static BOOL parse_scheme(const WCHAR **ptr, parse_data *data, DWORD flags) { +static BOOL parse_scheme(const WCHAR **ptr, parse_data *data, DWORD flags, DWORD extras) { static const WCHAR fileW[] = {'f','i','l','e',0}; static const WCHAR wildcardW[] = {'*',0}; @@ -524,7 +1255,7 @@ static BOOL parse_scheme(const WCHAR **ptr, parse_data *data, DWORD flags) { ptr, data, flags); return FALSE; } - } else if(!parse_scheme_name(ptr, data)) { + } else if(!parse_scheme_name(ptr, data, extras)) { /* No Scheme was found, this means it could be: * a) an implicit Wildcard scheme * b) a relative URI @@ -556,6 +1287,68 @@ static BOOL parse_scheme(const WCHAR **ptr, parse_data *data, DWORD flags) { return TRUE; } +static BOOL parse_username(const WCHAR **ptr, parse_data *data, DWORD flags, DWORD extras) { + data->username = *ptr; + + while(**ptr != ':' && **ptr != '@') { + if(**ptr == '%') { + if(!check_pct_encoded(ptr)) { + if(data->scheme_type != URL_SCHEME_UNKNOWN) { + *ptr = data->username; + data->username = NULL; + return FALSE; + } + } else + continue; + } else if(extras & ALLOW_NULL_TERM_USER_NAME && !**ptr) + break; + else if(is_auth_delim(**ptr, data->scheme_type != URL_SCHEME_UNKNOWN)) { + *ptr = data->username; + data->username = NULL; + return FALSE; + } + + ++(*ptr); + } + + data->username_len = *ptr - data->username; + return TRUE; +} + +static BOOL parse_password(const WCHAR **ptr, parse_data *data, DWORD flags, DWORD extras) { + const WCHAR *start = *ptr; + + if(**ptr != ':') + return TRUE; + + ++(*ptr); + data->password = *ptr; + + while(**ptr != '@') { + if(**ptr == '%') { + if(!check_pct_encoded(ptr)) { + if(data->scheme_type != URL_SCHEME_UNKNOWN) { + *ptr = start; + data->password = NULL; + return FALSE; + } + } else + continue; + } else if(extras & ALLOW_NULL_TERM_PASSWORD && !**ptr) + break; + else if(is_auth_delim(**ptr, data->scheme_type != URL_SCHEME_UNKNOWN)) { + *ptr = start; + data->password = NULL; + return FALSE; + } + + ++(*ptr); + } + + data->password_len = *ptr - data->password; + return TRUE; +} + /* Parses the userinfo part of the URI (if it exists). The userinfo field of * a URI can consist of "username:password@", or just "username@". * @@ -564,7 +1357,7 @@ static BOOL parse_scheme(const WCHAR **ptr, parse_data *data, DWORD flags) { * * NOTES: * 1) If there is more than one ':' in the userinfo part of the URI Windows - * uses the first occurence of ':' to delimit the username and password + * uses the first occurrence of ':' to delimit the username and password * components. * * ex: @@ -576,48 +1369,82 @@ static BOOL parse_scheme(const WCHAR **ptr, parse_data *data, DWORD flags) { * a URI, as long as it's not an authority delimeter character set. */ static void parse_userinfo(const WCHAR **ptr, parse_data *data, DWORD flags) { - data->userinfo = *ptr; - data->userinfo_split = -1; + const WCHAR *start = *ptr; - while(**ptr != '@') { - if(**ptr == ':' && data->userinfo_split == -1) - data->userinfo_split = *ptr - data->userinfo; - else if(**ptr == '%') { - /* If it's a known scheme type, it has to be a valid percent - * encoded value. - */ - if(!check_pct_encoded(ptr)) { - if(data->scheme_type != URL_SCHEME_UNKNOWN) { - *ptr = data->userinfo; - data->userinfo = NULL; - data->userinfo_split = -1; + if(!parse_username(ptr, data, flags, 0)) { + TRACE("(%p %p %x): URI contained no userinfo.\n", ptr, data, flags); + return; + } - TRACE("(%p %p %x): URI contained no userinfo.\n", ptr, data, flags); - return; - } - } else - continue; - } else if(is_auth_delim(**ptr, data->scheme_type != URL_SCHEME_UNKNOWN)) - break; - - ++(*ptr); + if(!parse_password(ptr, data, flags, 0)) { + *ptr = start; + data->username = NULL; + data->username_len = 0; + TRACE("(%p %p %x): URI contained no userinfo.\n", ptr, data, flags); + return; } if(**ptr != '@') { - *ptr = data->userinfo; - data->userinfo = NULL; - data->userinfo_split = -1; + *ptr = start; + data->username = NULL; + data->username_len = 0; + data->password = NULL; + data->password_len = 0; TRACE("(%p %p %x): URI contained no userinfo.\n", ptr, data, flags); return; } - data->userinfo_len = *ptr - data->userinfo; - TRACE("(%p %p %x): Found userinfo=%s userinfo_len=%d split=%d.\n", ptr, data, flags, - debugstr_wn(data->userinfo, data->userinfo_len), data->userinfo_len, data->userinfo_split); + if(data->username) + TRACE("(%p %p %x): Found username %s len=%d.\n", ptr, data, flags, + debugstr_wn(data->username, data->username_len), data->username_len); + + if(data->password) + TRACE("(%p %p %x): Found password %s len=%d.\n", ptr, data, flags, + debugstr_wn(data->password, data->password_len), data->password_len); + ++(*ptr); } +/* Attempts to parse a port from the URI. + * + * NOTES: + * Windows seems to have a cap on what the maximum value + * for a port can be. The max value is USHORT_MAX. + * + * port = *DIGIT + */ +static BOOL parse_port(const WCHAR **ptr, parse_data *data, DWORD flags) { + UINT port = 0; + data->port = *ptr; + + while(!is_auth_delim(**ptr, data->scheme_type != URL_SCHEME_UNKNOWN)) { + if(!is_num(**ptr)) { + *ptr = data->port; + data->port = NULL; + return FALSE; + } + + port = port*10 + (**ptr-'0'); + + if(port > USHORT_MAX) { + *ptr = data->port; + data->port = NULL; + return FALSE; + } + + ++(*ptr); + } + + data->has_port = TRUE; + data->port_value = port; + data->port_len = *ptr - data->port; + + TRACE("(%p %p %x): Found port %s len=%d value=%u\n", ptr, data, flags, + debugstr_wn(data->port, data->port_len), data->port_len, data->port_value); + return TRUE; +} + /* Attempts to parse a IPv4 address from the URI. * * NOTES: @@ -650,7 +1477,15 @@ static BOOL parse_ipv4address(const WCHAR **ptr, parse_data *data, DWORD flags) /* Check if what we found is the only part of the host name (if it isn't * we don't have an IPv4 address). */ - if(!is_auth_delim(**ptr, !is_unknown) && **ptr != ':') { + if(**ptr == ':') { + ++(*ptr); + if(!parse_port(ptr, data, flags)) { + *ptr = data->host; + data->host = NULL; + return FALSE; + } + } else if(!is_auth_delim(**ptr, !is_unknown)) { + /* Found more data which belongs the host, so this isn't an IPv4. */ *ptr = data->host; data->host = NULL; data->has_implicit_ip = FALSE; @@ -659,24 +1494,394 @@ static BOOL parse_ipv4address(const WCHAR **ptr, parse_data *data, DWORD flags) data->host_len = *ptr - data->host; data->host_type = Uri_HOST_IPV4; + TRACE("(%p %p %x): IPv4 address found. host=%s host_len=%d host_type=%d\n", ptr, data, flags, debugstr_wn(data->host, data->host_len), data->host_len, data->host_type); return TRUE; } +/* Attempts to parse the reg-name from the URI. + * + * Because of the way Windows handles ':' this function also + * handles parsing the port. + * + * reg-name = *( unreserved / pct-encoded / sub-delims ) + * + * NOTE: + * Windows allows everything, but, the characters in "auth_delims" and ':' + * to appear in a reg-name, unless it's an unknown scheme type then ':' is + * allowed to appear (even if a valid port isn't after it). + * + * Windows doesn't like host names which start with '[' and end with ']' + * and don't contain a valid IP literal address in between them. + * + * On Windows if an '[' is encountered in the host name the ':' no longer + * counts as a delimiter until you reach the next ']' or an "authority delimeter". + * + * A reg-name CAN be empty. + */ +static BOOL parse_reg_name(const WCHAR **ptr, parse_data *data, DWORD flags, DWORD extras) { + const BOOL has_start_bracket = **ptr == '['; + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + BOOL inside_brackets = has_start_bracket; + BOOL ignore_col = extras & IGNORE_PORT_DELIMITER; + + /* We have to be careful with file schemes. */ + if(data->scheme_type == URL_SCHEME_FILE) { + /* This is because an implicit file scheme could be "C:\\test" and it + * would trick this function into thinking the host is "C", when after + * canonicalization the host would end up being an empty string. A drive + * path can also have a '|' instead of a ':' after the drive letter. + */ + if(is_drive_path(*ptr)) { + /* Regular old drive paths don't have a host type (or host name). */ + data->host_type = Uri_HOST_UNKNOWN; + data->host = *ptr; + data->host_len = 0; + return TRUE; + } else if(is_unc_path(*ptr)) + /* Skip past the "\\" of a UNC path. */ + *ptr += 2; + } + + data->host = *ptr; + + while(!is_auth_delim(**ptr, known_scheme)) { + if(**ptr == ':' && !ignore_col) { + /* We can ignore ':' if were inside brackets.*/ + if(!inside_brackets) { + const WCHAR *tmp = (*ptr)++; + + /* Attempt to parse the port. */ + if(!parse_port(ptr, data, flags)) { + /* Windows expects there to be a valid port for known scheme types. */ + if(data->scheme_type != URL_SCHEME_UNKNOWN) { + *ptr = data->host; + data->host = NULL; + TRACE("(%p %p %x %x): Expected valid port\n", ptr, data, flags, extras); + return FALSE; + } else + /* Windows gives up on trying to parse a port when it + * encounters 1 invalid port. + */ + ignore_col = TRUE; + } else { + data->host_len = tmp - data->host; + break; + } + } + } else if(**ptr == '%' && known_scheme) { + /* Has to be a legit % encoded value. */ + if(!check_pct_encoded(ptr)) { + *ptr = data->host; + data->host = NULL; + return FALSE; + } else + continue; + } else if(**ptr == ']') + inside_brackets = FALSE; + else if(**ptr == '[') + inside_brackets = TRUE; + + ++(*ptr); + } + + if(has_start_bracket) { + /* Make sure the last character of the host wasn't a ']'. */ + if(*(*ptr-1) == ']') { + TRACE("(%p %p %x %x): Expected an IP literal inside of the host\n", + ptr, data, flags, extras); + *ptr = data->host; + data->host = NULL; + return FALSE; + } + } + + /* Don't overwrite our length if we found a port earlier. */ + if(!data->port) + data->host_len = *ptr - data->host; + + /* If the host is empty, then it's an unknown host type. */ + if(data->host_len == 0) + data->host_type = Uri_HOST_UNKNOWN; + else + data->host_type = Uri_HOST_DNS; + + TRACE("(%p %p %x %x): Parsed reg-name. host=%s len=%d\n", ptr, data, flags, extras, + debugstr_wn(data->host, data->host_len), data->host_len); + return TRUE; +} + +/* Attempts to parse an IPv6 address out of the URI. + * + * IPv6address = 6( h16 ":" ) ls32 + * / "::" 5( h16 ":" ) ls32 + * / [ h16 ] "::" 4( h16 ":" ) ls32 + * / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + * / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + * / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + * / [ *4( h16 ":" ) h16 ] "::" ls32 + * / [ *5( h16 ":" ) h16 ] "::" h16 + * / [ *6( h16 ":" ) h16 ] "::" + * + * ls32 = ( h16 ":" h16 ) / IPv4address + * ; least-significant 32 bits of address. + * + * h16 = 1*4HEXDIG + * ; 16 bits of address represented in hexadecimal. + * + * Modeled after google-url's 'DoParseIPv6' function. + */ +static BOOL parse_ipv6address(const WCHAR **ptr, parse_data *data, DWORD flags) { + const WCHAR *start, *cur_start; + ipv6_address ip; + + start = cur_start = *ptr; + memset(&ip, 0, sizeof(ipv6_address)); + + for(;; ++(*ptr)) { + /* Check if we're on the last character of the host. */ + BOOL is_end = (is_auth_delim(**ptr, data->scheme_type != URL_SCHEME_UNKNOWN) + || **ptr == ']'); + + BOOL is_split = (**ptr == ':'); + BOOL is_elision = (is_split && !is_end && *(*ptr+1) == ':'); + + /* Check if we're at the end of a component, or + * if we're at the end of the IPv6 address. + */ + if(is_split || is_end) { + DWORD cur_len = 0; + + cur_len = *ptr - cur_start; + + /* h16 can't have a length > 4. */ + if(cur_len > 4) { + *ptr = start; + + TRACE("(%p %p %x): h16 component to long.\n", + ptr, data, flags); + return FALSE; + } + + if(cur_len == 0) { + /* An h16 component can't have the length of 0 unless + * the elision is at the beginning of the address, or + * at the end of the address. + */ + if(!((*ptr == start && is_elision) || + (is_end && (*ptr-2) == ip.elision))) { + *ptr = start; + TRACE("(%p %p %x): IPv6 component cannot have a length of 0.\n", + ptr, data, flags); + return FALSE; + } + } + + if(cur_len > 0) { + /* An IPv6 address can have no more than 8 h16 components. */ + if(ip.h16_count >= 8) { + *ptr = start; + TRACE("(%p %p %x): Not a IPv6 address, to many h16 components.\n", + ptr, data, flags); + return FALSE; + } + + ip.components[ip.h16_count].str = cur_start; + ip.components[ip.h16_count].len = cur_len; + + TRACE("(%p %p %x): Found h16 component %s, len=%d, h16_count=%d\n", + ptr, data, flags, debugstr_wn(cur_start, cur_len), cur_len, + ip.h16_count); + ++ip.h16_count; + } + } + + if(is_end) + break; + + if(is_elision) { + /* A IPv6 address can only have 1 elision ('::'). */ + if(ip.elision) { + *ptr = start; + + TRACE("(%p %p %x): IPv6 address cannot have 2 elisions.\n", + ptr, data, flags); + return FALSE; + } + + ip.elision = *ptr; + ++(*ptr); + } + + if(is_split) + cur_start = *ptr+1; + else { + if(!check_ipv4address(ptr, TRUE)) { + if(!is_hexdigit(**ptr)) { + /* Not a valid character for an IPv6 address. */ + *ptr = start; + return FALSE; + } + } else { + /* Found an IPv4 address. */ + ip.ipv4 = cur_start; + ip.ipv4_len = *ptr - cur_start; + + TRACE("(%p %p %x): Found an attached IPv4 address %s len=%d.\n", + ptr, data, flags, debugstr_wn(ip.ipv4, ip.ipv4_len), + ip.ipv4_len); + + /* IPv4 addresses can only appear at the end of a IPv6. */ + break; + } + } + } + + compute_ipv6_comps_size(&ip); + + /* Make sure the IPv6 address adds up to 16 bytes. */ + if(ip.components_size + ip.elision_size != 16) { + *ptr = start; + TRACE("(%p %p %x): Invalid IPv6 address, did not add up to 16 bytes.\n", + ptr, data, flags); + return FALSE; + } + + if(ip.elision_size == 2) { + /* For some reason on Windows if an elision that represents + * only 1 h16 component is encountered at the very begin or + * end of an IPv6 address, Windows does not consider it a + * valid IPv6 address. + * + * Ex: [::2:3:4:5:6:7] is not valid, even though the sum + * of all the components == 128bits. + */ + if(ip.elision < ip.components[0].str || + ip.elision > ip.components[ip.h16_count-1].str) { + *ptr = start; + TRACE("(%p %p %x): Invalid IPv6 address. Detected elision of 2 bytes at the beginning or end of the address.\n", + ptr, data, flags); + return FALSE; + } + } + + data->host_type = Uri_HOST_IPV6; + data->has_ipv6 = TRUE; + data->ipv6_address = ip; + + TRACE("(%p %p %x): Found valid IPv6 literal %s len=%d\n", + ptr, data, flags, debugstr_wn(start, *ptr-start), + *ptr-start); + return TRUE; +} + +/* IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) */ +static BOOL parse_ipvfuture(const WCHAR **ptr, parse_data *data, DWORD flags) { + const WCHAR *start = *ptr; + + /* IPvFuture has to start with a 'v' or 'V'. */ + if(**ptr != 'v' && **ptr != 'V') + return FALSE; + + /* Following the v there must be at least 1 hex digit. */ + ++(*ptr); + if(!is_hexdigit(**ptr)) { + *ptr = start; + return FALSE; + } + + ++(*ptr); + while(is_hexdigit(**ptr)) + ++(*ptr); + + /* End of the hexdigit sequence must be a '.' */ + if(**ptr != '.') { + *ptr = start; + return FALSE; + } + + ++(*ptr); + if(!is_unreserved(**ptr) && !is_subdelim(**ptr) && **ptr != ':') { + *ptr = start; + return FALSE; + } + + ++(*ptr); + while(is_unreserved(**ptr) || is_subdelim(**ptr) || **ptr == ':') + ++(*ptr); + + data->host_type = Uri_HOST_UNKNOWN; + + TRACE("(%p %p %x): Parsed IPvFuture address %s len=%d\n", ptr, data, flags, + debugstr_wn(start, *ptr-start), *ptr-start); + + return TRUE; +} + +/* IP-literal = "[" ( IPv6address / IPvFuture ) "]" */ +static BOOL parse_ip_literal(const WCHAR **ptr, parse_data *data, DWORD flags, DWORD extras) { + data->host = *ptr; + + if(**ptr != '[' && !(extras & ALLOW_BRACKETLESS_IP_LITERAL)) { + data->host = NULL; + return FALSE; + } else if(**ptr == '[') + ++(*ptr); + + if(!parse_ipv6address(ptr, data, flags)) { + if(extras & SKIP_IP_FUTURE_CHECK || !parse_ipvfuture(ptr, data, flags)) { + *ptr = data->host; + data->host = NULL; + return FALSE; + } + } + + if(**ptr != ']' && !(extras & ALLOW_BRACKETLESS_IP_LITERAL)) { + *ptr = data->host; + data->host = NULL; + return FALSE; + } else if(!**ptr && extras & ALLOW_BRACKETLESS_IP_LITERAL) { + /* The IP literal didn't contain brackets and was followed by + * a NULL terminator, so no reason to even check the port. + */ + data->host_len = *ptr - data->host; + return TRUE; + } + + ++(*ptr); + if(**ptr == ':') { + ++(*ptr); + /* If a valid port is not found, then let it trickle down to + * parse_reg_name. + */ + if(!parse_port(ptr, data, flags)) { + *ptr = data->host; + data->host = NULL; + return FALSE; + } + } else + data->host_len = *ptr - data->host; + + return TRUE; +} + /* Parses the host information from the URI. * * host = IP-literal / IPv4address / reg-name */ -static BOOL parse_host(const WCHAR **ptr, parse_data *data, DWORD flags) { - if(!parse_ipv4address(ptr, data, flags)) { - WARN("(%p %p %x): Only IPv4 parsing is implemented so far.\n", ptr, data, flags); - data->host_type = Uri_HOST_UNKNOWN; +static BOOL parse_host(const WCHAR **ptr, parse_data *data, DWORD flags, DWORD extras) { + if(!parse_ip_literal(ptr, data, flags, extras)) { + if(!parse_ipv4address(ptr, data, flags)) { + if(!parse_reg_name(ptr, data, flags, extras)) { + TRACE("(%p %p %x %x): Malformed URI, Unknown host type.\n", + ptr, data, flags, extras); + return FALSE; + } + } } - /* TODO parse IP-Literal / reg-name. */ - return TRUE; } @@ -687,12 +1892,126 @@ static BOOL parse_host(const WCHAR **ptr, parse_data *data, DWORD flags) { static BOOL parse_authority(const WCHAR **ptr, parse_data *data, DWORD flags) { parse_userinfo(ptr, data, flags); - if(!parse_host(ptr, data, flags)) + /* Parsing the port will happen during one of the host parsing + * routines (if the URI has a port). + */ + if(!parse_host(ptr, data, flags, 0)) return FALSE; return TRUE; } +/* Attempts to parse the path information of a hierarchical URI. */ +static BOOL parse_path_hierarchical(const WCHAR **ptr, parse_data *data, DWORD flags) { + const WCHAR *start = *ptr; + static const WCHAR slash[] = {'/',0}; + const BOOL is_file = data->scheme_type == URL_SCHEME_FILE; + + if(is_path_delim(**ptr)) { + if(data->scheme_type == URL_SCHEME_WILDCARD) { + /* Wildcard schemes don't get a '/' attached if their path is + * empty. + */ + data->path = NULL; + data->path_len = 0; + } else if(!(flags & Uri_CREATE_NO_CANONICALIZE)) { + /* If the path component is empty, then a '/' is added. */ + data->path = slash; + data->path_len = 1; + } + } else { + while(!is_path_delim(**ptr)) { + if(**ptr == '%' && data->scheme_type != URL_SCHEME_UNKNOWN && !is_file) { + if(!check_pct_encoded(ptr)) { + *ptr = start; + return FALSE; + } else + continue; + } else if(is_forbidden_dos_path_char(**ptr) && is_file && + (flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + /* File schemes with USE_DOS_PATH set aren't allowed to have + * a '<' or '>' or '\"' appear in them. + */ + *ptr = start; + return FALSE; + } else if(**ptr == '\\') { + /* Not allowed to have a backslash if NO_CANONICALIZE is set + * and the scheme is known type (but not a file scheme). + */ + if(flags & Uri_CREATE_NO_CANONICALIZE) { + if(data->scheme_type != URL_SCHEME_FILE && + data->scheme_type != URL_SCHEME_UNKNOWN) { + *ptr = start; + return FALSE; + } + } + } + + ++(*ptr); + } + + /* The only time a URI doesn't have a path is when + * the NO_CANONICALIZE flag is set and the raw URI + * didn't contain one. + */ + if(*ptr == start) { + data->path = NULL; + data->path_len = 0; + } else { + data->path = start; + data->path_len = *ptr - start; + } + } + + if(data->path) + TRACE("(%p %p %x): Parsed path %s len=%d\n", ptr, data, flags, + debugstr_wn(data->path, data->path_len), data->path_len); + else + TRACE("(%p %p %x): The URI contained no path\n", ptr, data, flags); + + return TRUE; +} + +/* Parses the path of a opaque URI (much less strict then the parser + * for a hierarchical URI). + * + * NOTE: + * Windows allows invalid % encoded data to appear in opaque URI paths + * for unknown scheme types. + * + * File schemes with USE_DOS_PATH set aren't allowed to have '<', '>', or '\"' + * appear in them. + */ +static BOOL parse_path_opaque(const WCHAR **ptr, parse_data *data, DWORD flags) { + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + const BOOL is_file = data->scheme_type == URL_SCHEME_FILE; + + data->path = *ptr; + + while(!is_path_delim(**ptr)) { + if(**ptr == '%' && known_scheme) { + if(!check_pct_encoded(ptr)) { + *ptr = data->path; + data->path = NULL; + return FALSE; + } else + continue; + } else if(is_forbidden_dos_path_char(**ptr) && is_file && + (flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + *ptr = data->path; + data->path = NULL; + return FALSE; + } + + ++(*ptr); + } + + data->path_len = *ptr - data->path; + TRACE("(%p %p %x): Parsed opaque URI path %s len=%d\n", ptr, data, flags, + debugstr_wn(data->path, data->path_len), data->path_len); + return TRUE; +} + /* Determines how the URI should be parsed after the scheme information. * * If the scheme is followed, by "//" then, it is treated as an hierarchical URI @@ -717,17 +2036,10 @@ static BOOL parse_authority(const WCHAR **ptr, parse_data *data, DWORD flags) { * (per MSDN documentation). */ static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) { - /* Checks if the authority information needs to be parsed. - * - * Relative URI's aren't hierarchical URI's, but, they could trick - * "check_hierarchical" into thinking it is, so we need to explicitly - * make sure it's not relative. Also, if the URI is an implicit file - * scheme it might not contain a "//", but, it's considered hierarchical - * anyways. Wildcard Schemes are always considered hierarchical - */ - if(data->scheme_type == URL_SCHEME_WILDCARD || - data->scheme_type == URL_SCHEME_FILE || - (!data->is_relative && check_hierarchical(ptr))) { + const WCHAR *start = *ptr; + + /* Checks if the authority information needs to be parsed. */ + if(is_hierarchical_uri(ptr, data)) { /* Only treat it as a hierarchical URI if the scheme_type is known or * the Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES flag is not set. */ @@ -740,8 +2052,12 @@ static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) { if(!parse_authority(ptr, data, flags)) return FALSE; - return TRUE; - } + return parse_path_hierarchical(ptr, data, flags); + } else + /* Reset ptr to it's starting position so opaque path parsing + * begins at the correct location. + */ + *ptr = start; } /* If it reaches here, then the URI will be treated as an opaque @@ -751,7 +2067,87 @@ static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) { TRACE("(%p %p %x): Treating URI as an opaque URI.\n", ptr, data, flags); data->is_opaque = TRUE; - /* TODO: Handle opaque URI's, parse path. */ + if(!parse_path_opaque(ptr, data, flags)) + return FALSE; + + return TRUE; +} + +/* Attempts to parse the query string from the URI. + * + * NOTES: + * If NO_DECODE_EXTRA_INFO flag is set, then invalid percent encoded + * data is allowed appear in the query string. For unknown scheme types + * invalid percent encoded data is allowed to appear reguardless. + */ +static BOOL parse_query(const WCHAR **ptr, parse_data *data, DWORD flags) { + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + + if(**ptr != '?') { + TRACE("(%p %p %x): URI didn't contain a query string.\n", ptr, data, flags); + return TRUE; + } + + data->query = *ptr; + + ++(*ptr); + while(**ptr && **ptr != '#') { + if(**ptr == '%' && known_scheme && + !(flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) { + if(!check_pct_encoded(ptr)) { + *ptr = data->query; + data->query = NULL; + return FALSE; + } else + continue; + } + + ++(*ptr); + } + + data->query_len = *ptr - data->query; + + TRACE("(%p %p %x): Parsed query string %s len=%d\n", ptr, data, flags, + debugstr_wn(data->query, data->query_len), data->query_len); + return TRUE; +} + +/* Attempts to parse the fragment from the URI. + * + * NOTES: + * If NO_DECODE_EXTRA_INFO flag is set, then invalid percent encoded + * data is allowed appear in the query string. For unknown scheme types + * invalid percent encoded data is allowed to appear reguardless. + */ +static BOOL parse_fragment(const WCHAR **ptr, parse_data *data, DWORD flags) { + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + + if(**ptr != '#') { + TRACE("(%p %p %x): URI didn't contain a fragment.\n", ptr, data, flags); + return TRUE; + } + + data->fragment = *ptr; + + ++(*ptr); + while(**ptr) { + if(**ptr == '%' && known_scheme && + !(flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) { + if(!check_pct_encoded(ptr)) { + *ptr = data->fragment; + data->fragment = NULL; + return FALSE; + } else + continue; + } + + ++(*ptr); + } + + data->fragment_len = *ptr - data->fragment; + + TRACE("(%p %p %x): Parsed fragment %s len=%d\n", ptr, data, flags, + debugstr_wn(data->fragment, data->fragment_len), data->fragment_len); return TRUE; } @@ -769,16 +2165,128 @@ static BOOL parse_uri(parse_data *data, DWORD flags) { TRACE("(%p %x): BEGINNING TO PARSE URI %s.\n", data, flags, debugstr_w(data->uri)); - if(!parse_scheme(pptr, data, flags)) + if(!parse_scheme(pptr, data, flags, 0)) return FALSE; if(!parse_hierpart(pptr, data, flags)) return FALSE; + if(!parse_query(pptr, data, flags)) + return FALSE; + + if(!parse_fragment(pptr, data, flags)) + return FALSE; + TRACE("(%p %x): FINISHED PARSING URI.\n", data, flags); return TRUE; } +static BOOL canonicalize_username(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { + const WCHAR *ptr; + + if(!data->username) { + uri->userinfo_start = -1; + return TRUE; + } + + uri->userinfo_start = uri->canon_len; + for(ptr = data->username; ptr < data->username+data->username_len; ++ptr) { + if(*ptr == '%') { + /* Only decode % encoded values for known scheme types. */ + if(data->scheme_type != URL_SCHEME_UNKNOWN) { + /* See if the value really needs decoded. */ + WCHAR val = decode_pct_val(ptr); + if(is_unreserved(val)) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = val; + + ++uri->canon_len; + + /* Move pass the hex characters. */ + ptr += 2; + continue; + } + } + } else if(!is_reserved(*ptr) && !is_unreserved(*ptr) && *ptr != '\\') { + /* Only percent encode forbidden characters if the NO_ENCODE_FORBIDDEN_CHARACTERS flag + * is NOT set. + */ + if(!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS)) { + if(!computeOnly) + pct_encode_val(*ptr, uri->canon_uri + uri->canon_len); + + uri->canon_len += 3; + continue; + } + } + + if(!computeOnly) + /* Nothing special, so just copy the character over. */ + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + + return TRUE; +} + +static BOOL canonicalize_password(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { + const WCHAR *ptr; + + if(!data->password) { + uri->userinfo_split = -1; + return TRUE; + } + + if(uri->userinfo_start == -1) + /* Has a password, but, doesn't have a username. */ + uri->userinfo_start = uri->canon_len; + + uri->userinfo_split = uri->canon_len - uri->userinfo_start; + + /* Add the ':' to the userinfo component. */ + if(!computeOnly) + uri->canon_uri[uri->canon_len] = ':'; + ++uri->canon_len; + + for(ptr = data->password; ptr < data->password+data->password_len; ++ptr) { + if(*ptr == '%') { + /* Only decode % encoded values for known scheme types. */ + if(data->scheme_type != URL_SCHEME_UNKNOWN) { + /* See if the value really needs decoded. */ + WCHAR val = decode_pct_val(ptr); + if(is_unreserved(val)) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = val; + + ++uri->canon_len; + + /* Move pass the hex characters. */ + ptr += 2; + continue; + } + } + } else if(!is_reserved(*ptr) && !is_unreserved(*ptr) && *ptr != '\\') { + /* Only percent encode forbidden characters if the NO_ENCODE_FORBIDDEN_CHARACTERS flag + * is NOT set. + */ + if(!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS)) { + if(!computeOnly) + pct_encode_val(*ptr, uri->canon_uri + uri->canon_len); + + uri->canon_len += 3; + continue; + } + } + + if(!computeOnly) + /* Nothing special, so just copy the character over. */ + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + + return TRUE; +} + /* Canonicalizes the userinfo of the URI represented by the parse_data. * * Canonicalization of the userinfo is a simple process. If there are any percent @@ -788,59 +2296,18 @@ static BOOL parse_uri(parse_data *data, DWORD flags) { * change. */ static BOOL canonicalize_userinfo(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { - DWORD i = 0; - uri->userinfo_start = uri->userinfo_split = -1; uri->userinfo_len = 0; - if(!data->userinfo) + if(!data->username && !data->password) /* URI doesn't have userinfo, so nothing to do here. */ return TRUE; - uri->userinfo_start = uri->canon_len; + if(!canonicalize_username(data, uri, flags, computeOnly)) + return FALSE; - while(i < data->userinfo_len) { - if(data->userinfo[i] == ':' && uri->userinfo_split == -1) - /* Windows only considers the first ':' as the delimiter. */ - uri->userinfo_split = uri->canon_len - uri->userinfo_start; - else if(data->userinfo[i] == '%') { - /* Only decode % encoded values for known scheme types. */ - if(data->scheme_type != URL_SCHEME_UNKNOWN) { - /* See if the value really needs decoded. */ - WCHAR val = decode_pct_val(data->userinfo + i); - if(is_unreserved(val)) { - if(!computeOnly) - uri->canon_uri[uri->canon_len] = val; - - ++uri->canon_len; - - /* Move pass the hex characters. */ - i += 3; - continue; - } - } - } else if(!is_reserved(data->userinfo[i]) && !is_unreserved(data->userinfo[i]) && - data->userinfo[i] != '\\') { - /* Only percent encode forbidden characters if the NO_ENCODE_FORBIDDEN_CHARACTERS flag - * is NOT set. - */ - if(!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS)) { - if(!computeOnly) - pct_encode_val(data->userinfo[i], uri->canon_uri + uri->canon_len); - - uri->canon_len += 3; - ++i; - continue; - } - } - - if(!computeOnly) - /* Nothing special, so just copy the character over. */ - uri->canon_uri[uri->canon_len] = data->userinfo[i]; - - ++uri->canon_len; - ++i; - } + if(!canonicalize_password(data, uri, flags, computeOnly)) + return FALSE; uri->userinfo_len = uri->canon_len - uri->userinfo_start; if(!computeOnly) @@ -851,8 +2318,112 @@ static BOOL canonicalize_userinfo(const parse_data *data, Uri *uri, DWORD flags, /* Now insert the '@' after the userinfo. */ if(!computeOnly) uri->canon_uri[uri->canon_len] = '@'; - ++uri->canon_len; + + return TRUE; +} + +/* Attempts to canonicalize a reg_name. + * + * Things that happen: + * 1) If Uri_CREATE_NO_CANONICALIZE flag is not set, then the reg_name is + * lower cased. Unless it's an unknown scheme type, which case it's + * no lower cased reguardless. + * + * 2) Unreserved % encoded characters are decoded for known + * scheme types. + * + * 3) Forbidden characters are % encoded as long as + * Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS flag is not set and + * it isn't an unknown scheme type. + * + * 4) If it's a file scheme and the host is "localhost" it's removed. + */ +static BOOL canonicalize_reg_name(const parse_data *data, Uri *uri, + DWORD flags, BOOL computeOnly) { + static const WCHAR localhostW[] = + {'l','o','c','a','l','h','o','s','t',0}; + const WCHAR *ptr; + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + + uri->host_start = uri->canon_len; + + if(data->scheme_type == URL_SCHEME_FILE && + data->host_len == lstrlenW(localhostW)) { + if(!StrCmpNIW(data->host, localhostW, data->host_len)) { + uri->host_start = -1; + uri->host_len = 0; + uri->host_type = Uri_HOST_UNKNOWN; + return TRUE; + } + } + + for(ptr = data->host; ptr < data->host+data->host_len; ++ptr) { + if(*ptr == '%' && known_scheme) { + WCHAR val = decode_pct_val(ptr); + if(is_unreserved(val)) { + /* If NO_CANONICALZE is not set, then windows lower cases the + * decoded value. + */ + if(!(flags & Uri_CREATE_NO_CANONICALIZE) && isupperW(val)) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = tolowerW(val); + } else { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = val; + } + ++uri->canon_len; + + /* Skip past the % encoded character. */ + ptr += 2; + continue; + } else { + /* Just copy the % over. */ + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + } else if(*ptr == '\\') { + /* Only unknown scheme types could have made it here with a '\\' in the host name. */ + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } else if(!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS) && + !is_unreserved(*ptr) && !is_reserved(*ptr) && known_scheme) { + if(!computeOnly) { + pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); + + /* The percent encoded value gets lower cased also. */ + if(!(flags & Uri_CREATE_NO_CANONICALIZE)) { + uri->canon_uri[uri->canon_len+1] = tolowerW(uri->canon_uri[uri->canon_len+1]); + uri->canon_uri[uri->canon_len+2] = tolowerW(uri->canon_uri[uri->canon_len+2]); + } + } + + uri->canon_len += 3; + } else { + if(!computeOnly) { + if(!(flags & Uri_CREATE_NO_CANONICALIZE) && known_scheme) + uri->canon_uri[uri->canon_len] = tolowerW(*ptr); + else + uri->canon_uri[uri->canon_len] = *ptr; + } + + ++uri->canon_len; + } + } + + uri->host_len = uri->canon_len - uri->host_start; + + if(!computeOnly) + TRACE("(%p %p %x %d): Canonicalize reg_name=%s len=%d\n", data, uri, flags, + computeOnly, debugstr_wn(uri->canon_uri+uri->host_start, uri->host_len), + uri->host_len); + + if(!computeOnly) + find_domain_name(uri->canon_uri+uri->host_start, uri->host_len, + &(uri->domain_offset)); + return TRUE; } @@ -980,37 +2551,557 @@ static BOOL canonicalize_ipv4address(const parse_data *data, Uri *uri, DWORD fla return TRUE; } +/* Attempts to canonicalize the IPv6 address of the URI. + * + * Multiple things happen during the canonicalization of an IPv6 address: + * 1) Any leading zero's in an h16 component are removed. + * Ex: [0001:0022::] -> [1:22::] + * + * 2) The longest sequence of zero h16 components are compressed + * into a "::" (elision). If there's a tie, the first is choosen. + * + * Ex: [0:0:0:0:1:6:7:8] -> [::1:6:7:8] + * [0:0:0:0:1:2::] -> [::1:2:0:0] + * [0:0:1:2:0:0:7:8] -> [::1:2:0:0:7:8] + * + * 3) If an IPv4 address is attached to the IPv6 address, it's + * also normalized. + * Ex: [::001.002.022.000] -> [::1.2.22.0] + * + * 4) If an elision is present, but, only represents 1 h16 component + * it's expanded. + * + * Ex: [1::2:3:4:5:6:7] -> [1:0:2:3:4:5:6:7] + * + * 5) If the IPv6 address contains an IPv4 address and there exists + * at least 1 non-zero h16 component the IPv4 address is converted + * into two h16 components, otherwise it's normalized and kept as is. + * + * Ex: [::192.200.003.4] -> [::192.200.3.4] + * [ffff::192.200.003.4] -> [ffff::c0c8:3041] + * + * NOTE: + * For unknown scheme types Windows simply copies the address over without any + * changes. + * + * IPv4 address can be included in an elision if all its components are 0's. + */ +static BOOL canonicalize_ipv6address(const parse_data *data, Uri *uri, + DWORD flags, BOOL computeOnly) { + uri->host_start = uri->canon_len; + + if(data->scheme_type == URL_SCHEME_UNKNOWN) { + if(!computeOnly) + memcpy(uri->canon_uri+uri->canon_len, data->host, data->host_len*sizeof(WCHAR)); + uri->canon_len += data->host_len; + } else { + USHORT values[8]; + INT elision_start; + DWORD i, elision_len; + + if(!ipv6_to_number(&(data->ipv6_address), values)) { + TRACE("(%p %p %x %d): Failed to compute numerical value for IPv6 address.\n", + data, uri, flags, computeOnly); + return FALSE; + } + + if(!computeOnly) + uri->canon_uri[uri->canon_len] = '['; + ++uri->canon_len; + + /* Find where the elision should occur (if any). */ + compute_elision_location(&(data->ipv6_address), values, &elision_start, &elision_len); + + TRACE("%p %p %x %d): Elision starts at %d, len=%u\n", data, uri, flags, + computeOnly, elision_start, elision_len); + + for(i = 0; i < 8; ++i) { + BOOL in_elision = (elision_start > -1 && i >= elision_start && + i < elision_start+elision_len); + BOOL do_ipv4 = (i == 6 && data->ipv6_address.ipv4 && !in_elision && + data->ipv6_address.h16_count == 0); + + if(i == elision_start) { + if(!computeOnly) { + uri->canon_uri[uri->canon_len] = ':'; + uri->canon_uri[uri->canon_len+1] = ':'; + } + uri->canon_len += 2; + } + + /* We can ignore the current component if we're in the elision. */ + if(in_elision) + continue; + + /* We only add a ':' if we're not at i == 0, or when we're at + * the very end of elision range since the ':' colon was handled + * earlier. Otherwise we would end up with ":::" after elision. + */ + if(i != 0 && !(elision_start > -1 && i == elision_start+elision_len)) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = ':'; + ++uri->canon_len; + } + + if(do_ipv4) { + UINT val; + DWORD len; + + /* Combine the two parts of the IPv4 address values. */ + val = values[i]; + val <<= 16; + val += values[i+1]; + + if(!computeOnly) + len = ui2ipv4(uri->canon_uri+uri->canon_len, val); + else + len = ui2ipv4(NULL, val); + + uri->canon_len += len; + ++i; + } else { + /* Write a regular h16 component to the URI. */ + + /* Short circuit for the trivial case. */ + if(values[i] == 0) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = '0'; + ++uri->canon_len; + } else { + static const WCHAR formatW[] = {'%','x',0}; + + if(!computeOnly) + uri->canon_len += sprintfW(uri->canon_uri+uri->canon_len, + formatW, values[i]); + else { + WCHAR tmp[5]; + uri->canon_len += sprintfW(tmp, formatW, values[i]); + } + } + } + } + + /* Add the closing ']'. */ + if(!computeOnly) + uri->canon_uri[uri->canon_len] = ']'; + ++uri->canon_len; + } + + uri->host_len = uri->canon_len - uri->host_start; + + if(!computeOnly) + TRACE("(%p %p %x %d): Canonicalized IPv6 address %s, len=%d\n", data, uri, flags, + computeOnly, debugstr_wn(uri->canon_uri+uri->host_start, uri->host_len), + uri->host_len); + + return TRUE; +} + +/* Attempts to canonicalize the host of the URI (if any). */ static BOOL canonicalize_host(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { uri->host_start = -1; uri->host_len = 0; + uri->domain_offset = -1; if(data->host) { switch(data->host_type) { + case Uri_HOST_DNS: + uri->host_type = Uri_HOST_DNS; + if(!canonicalize_reg_name(data, uri, flags, computeOnly)) + return FALSE; + + break; case Uri_HOST_IPV4: uri->host_type = Uri_HOST_IPV4; if(!canonicalize_ipv4address(data, uri, flags, computeOnly)) return FALSE; + break; + case Uri_HOST_IPV6: + if(!canonicalize_ipv6address(data, uri, flags, computeOnly)) + return FALSE; + + uri->host_type = Uri_HOST_IPV6; + break; + case Uri_HOST_UNKNOWN: + if(data->host_len > 0 || data->scheme_type != URL_SCHEME_FILE) { + uri->host_start = uri->canon_len; + + /* Nothing happens to unknown host types. */ + if(!computeOnly) + memcpy(uri->canon_uri+uri->canon_len, data->host, data->host_len*sizeof(WCHAR)); + uri->canon_len += data->host_len; + uri->host_len = data->host_len; + } + + uri->host_type = Uri_HOST_UNKNOWN; break; default: - WARN("(%p %p %x %d): Canonicalization not supported yet\n", data, - uri, flags, computeOnly); + FIXME("(%p %p %x %d): Canonicalization for host type %d not supported.\n", data, + uri, flags, computeOnly, data->host_type); + return FALSE; } } return TRUE; } +static BOOL canonicalize_port(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { + BOOL has_default_port = FALSE; + USHORT default_port = 0; + DWORD i; + + uri->has_port = FALSE; + + /* Check if the scheme has a default port. */ + for(i = 0; i < sizeof(default_ports)/sizeof(default_ports[0]); ++i) { + if(default_ports[i].scheme == data->scheme_type) { + has_default_port = TRUE; + default_port = default_ports[i].port; + break; + } + } + + if(data->port || has_default_port) + uri->has_port = TRUE; + + /* Possible cases: + * 1) Has a port which is the default port. + * 2) Has a port (not the default). + * 3) Doesn't have a port, but, scheme has a default port. + * 4) No port. + */ + if(has_default_port && data->port && data->port_value == default_port) { + /* If it's the default port and this flag isn't set, don't do anything. */ + if(flags & Uri_CREATE_NO_CANONICALIZE) { + /* Copy the original port over. */ + if(!computeOnly) { + uri->canon_uri[uri->canon_len] = ':'; + memcpy(uri->canon_uri+uri->canon_len+1, data->port, data->port_len*sizeof(WCHAR)); + } + uri->canon_len += data->port_len+1; + } + + uri->port = default_port; + } else if(data->port) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = ':'; + ++uri->canon_len; + + if(flags & Uri_CREATE_NO_CANONICALIZE) { + /* Copy the original over without changes. */ + if(!computeOnly) + memcpy(uri->canon_uri+uri->canon_len, data->port, data->port_len*sizeof(WCHAR)); + uri->canon_len += data->port_len; + } else { + const WCHAR formatW[] = {'%','u',0}; + INT len = 0; + if(!computeOnly) + len = sprintfW(uri->canon_uri+uri->canon_len, formatW, data->port_value); + else { + WCHAR tmp[6]; + len = sprintfW(tmp, formatW, data->port_value); + } + uri->canon_len += len; + } + + uri->port = data->port_value; + } else if(has_default_port) + uri->port = default_port; + + return TRUE; +} + /* Canonicalizes the authority of the URI represented by the parse_data. */ static BOOL canonicalize_authority(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { + uri->authority_start = uri->canon_len; + uri->authority_len = 0; + if(!canonicalize_userinfo(data, uri, flags, computeOnly)) return FALSE; if(!canonicalize_host(data, uri, flags, computeOnly)) return FALSE; - /* TODO Canonicalize port information. */ + if(!canonicalize_port(data, uri, flags, computeOnly)) + return FALSE; + if(uri->host_start != -1) + uri->authority_len = uri->canon_len - uri->authority_start; + else + uri->authority_start = -1; + + return TRUE; +} + +/* Attempts to canonicalize the path of a hierarchical URI. + * + * Things that happen: + * 1). Forbidden characters are percent encoded, unless the NO_ENCODE_FORBIDDEN + * flag is set or it's a file URI. Forbidden characters are always encoded + * for file schemes reguardless and forbidden characters are never encoded + * for unknown scheme types. + * + * 2). For known scheme types '\\' are changed to '/'. + * + * 3). Percent encoded, unreserved characters are decoded to their actual values. + * Unless the scheme type is unknown. For file schemes any percent encoded + * character in the unreserved or reserved set is decoded. + * + * 4). For File schemes if the path is starts with a drive letter and doesn't + * start with a '/' then one is appended. + * Ex: file://c:/test.mp3 -> file:///c:/test.mp3 + * + * 5). Dot segments are removed from the path for all scheme types + * unless NO_CANONICALIZE flag is set. Dot segments aren't removed + * for wildcard scheme types. + * + * NOTES: + * file://c:/test%20test -> file:///c:/test%2520test + * file://c:/test%3Etest -> file:///c:/test%253Etest + * file:///c:/test%20test -> file:///c:/test%20test + * file:///c:/test%test -> file:///c:/test%25test + */ +static BOOL canonicalize_path_hierarchical(const parse_data *data, Uri *uri, + DWORD flags, BOOL computeOnly) { + const WCHAR *ptr; + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + const BOOL is_file = data->scheme_type == URL_SCHEME_FILE; + + BOOL escape_pct = FALSE; + + if(!data->path) { + uri->path_start = -1; + uri->path_len = 0; + return TRUE; + } + + uri->path_start = uri->canon_len; + ptr = data->path; + + if(is_file && uri->host_start == -1) { + /* Check if a '/' needs to be appended for the file scheme. */ + if(data->path_len > 1 && is_drive_path(ptr) && !(flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = '/'; + uri->canon_len++; + escape_pct = TRUE; + } else if(*ptr == '/') { + if(!(flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + /* Copy the extra '/' over. */ + if(!computeOnly) + uri->canon_uri[uri->canon_len] = '/'; + ++uri->canon_len; + } + ++ptr; + } + + if(is_drive_path(ptr)) { + if(!computeOnly) { + uri->canon_uri[uri->canon_len] = *ptr; + /* If theres a '|' after the drive letter, convert it to a ':'. */ + uri->canon_uri[uri->canon_len+1] = ':'; + } + ptr += 2; + uri->canon_len += 2; + } + } + + for(; ptr < data->path+data->path_len; ++ptr) { + if(*ptr == '%') { + const WCHAR *tmp = ptr; + WCHAR val; + + /* Check if the % represents a valid encoded char, or if it needs encoded. */ + BOOL force_encode = !check_pct_encoded(&tmp) && is_file; + val = decode_pct_val(ptr); + + if(force_encode || escape_pct) { + /* Escape the percent sign in the file URI. */ + if(!computeOnly) + pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); + uri->canon_len += 3; + } else if((is_unreserved(val) && known_scheme) || + (is_file && (is_unreserved(val) || is_reserved(val)))) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = val; + ++uri->canon_len; + + ptr += 2; + continue; + } else { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + } else if(*ptr == '/' && is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + /* Convert the '/' back to a '\\'. */ + if(!computeOnly) + uri->canon_uri[uri->canon_len] = '\\'; + ++uri->canon_len; + } else if(*ptr == '\\' && known_scheme) { + if(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + /* Don't convert the '\\' to a '/'. */ + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } else { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = '/'; + ++uri->canon_len; + } + } else if(known_scheme && !is_unreserved(*ptr) && !is_reserved(*ptr) && + (!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS) || is_file)) { + if(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + /* Don't escape the character. */ + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } else { + /* Escape the forbidden character. */ + if(!computeOnly) + pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); + uri->canon_len += 3; + } + } else { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + } + + uri->path_len = uri->canon_len - uri->path_start; + + /* Removing the dot segments only happens when it's not in + * computeOnly mode and it's not a wildcard scheme. File schemes + * with USE_DOS_PATH set don't get dot segments removed. + */ + if(!(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) && + data->scheme_type != URL_SCHEME_WILDCARD) { + if(!(flags & Uri_CREATE_NO_CANONICALIZE) && !computeOnly) { + /* Remove the dot segments (if any) and reset everything to the new + * correct length. + */ + DWORD new_len = remove_dot_segments(uri->canon_uri+uri->path_start, uri->path_len); + uri->canon_len -= uri->path_len-new_len; + uri->path_len = new_len; + } + } + + if(!computeOnly) + TRACE("Canonicalized path %s len=%d\n", + debugstr_wn(uri->canon_uri+uri->path_start, uri->path_len), + uri->path_len); + + return TRUE; +} + +/* Attempts to canonicalize the path for an opaque URI. + * + * For known scheme types: + * 1) forbidden characters are percent encoded if + * NO_ENCODE_FORBIDDEN_CHARACTERS isn't set. + * + * 2) Percent encoded, unreserved characters are decoded + * to their actual values, for known scheme types. + * + * 3) '\\' are changed to '/' for known scheme types + * except for mailto schemes. + * + * 4) For file schemes, if USE_DOS_PATH is set all '/' + * are converted to backslashes. + * + * 5) For file schemes, if USE_DOS_PATH isn't set all '\' + * are converted to forward slashes. + */ +static BOOL canonicalize_path_opaque(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { + const WCHAR *ptr; + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + const BOOL is_file = data->scheme_type == URL_SCHEME_FILE; + + if(!data->path) { + uri->path_start = -1; + uri->path_len = 0; + return TRUE; + } + + uri->path_start = uri->canon_len; + + /* Windows doesn't allow a "//" to appear after the scheme + * of a URI, if it's an opaque URI. + */ + if(data->scheme && *(data->path) == '/' && *(data->path+1) == '/') { + /* So it inserts a "/." before the "//" if it exists. */ + if(!computeOnly) { + uri->canon_uri[uri->canon_len] = '/'; + uri->canon_uri[uri->canon_len+1] = '.'; + } + + uri->canon_len += 2; + } + + for(ptr = data->path; ptr < data->path+data->path_len; ++ptr) { + if(*ptr == '%' && known_scheme) { + WCHAR val = decode_pct_val(ptr); + + if(is_unreserved(val)) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = val; + ++uri->canon_len; + + ptr += 2; + continue; + } else { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + } else if(*ptr == '/' && is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = '\\'; + ++uri->canon_len; + } else if(*ptr == '\\' && is_file) { + if(!(flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + /* Convert to a '/'. */ + if(!computeOnly) + uri->canon_uri[uri->canon_len] = '/'; + ++uri->canon_len; + } else { + /* Just copy it over. */ + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + } else if(known_scheme && !is_unreserved(*ptr) && !is_reserved(*ptr) && + !(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS)) { + if(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + /* Forbidden characters aren't percent encoded for file schemes + * with USE_DOS_PATH set. + */ + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } else if(data->scheme_type == URL_SCHEME_MK && *ptr == '\\') { + /* MK URIs don't get '\\' percent encoded. */ + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } else { + if(!computeOnly) + pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); + uri->canon_len += 3; + } + } else { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + } + + uri->path_len = uri->canon_len - uri->path_start; + + TRACE("(%p %p %x %d): Canonicalized opaque URI path %s len=%d\n", data, uri, flags, computeOnly, + debugstr_wn(uri->canon_uri+uri->path_start, uri->path_len), uri->path_len); return TRUE; } @@ -1021,6 +3112,8 @@ static BOOL canonicalize_authority(const parse_data *data, Uri *uri, DWORD flags * URI is opaque it canonicalizes the path of the URI. */ static BOOL canonicalize_hierpart(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { + uri->display_absolute = TRUE; + if(!data->is_opaque) { /* "//" is only added for non-wildcard scheme types. */ if(data->scheme_type != URL_SCHEME_WILDCARD) { @@ -1036,14 +3129,160 @@ static BOOL canonicalize_hierpart(const parse_data *data, Uri *uri, DWORD flags, if(!canonicalize_authority(data, uri, flags, computeOnly)) return FALSE; - /* TODO: Canonicalize the path of the URI. */ + /* TODO: Canonicalize the path of the URI. */ + if(!canonicalize_path_hierarchical(data, uri, flags, computeOnly)) + return FALSE; } else { - /* Opaque URI's don't have userinfo. */ + /* Opaque URI's don't have an authority. */ uri->userinfo_start = uri->userinfo_split = -1; uri->userinfo_len = 0; + uri->host_start = -1; + uri->host_len = 0; + uri->host_type = Uri_HOST_UNKNOWN; + uri->has_port = FALSE; + uri->authority_start = -1; + uri->authority_len = 0; + uri->domain_offset = -1; + + if(is_hierarchical_scheme(data->scheme_type)) { + DWORD i; + + /* Absolute URIs aren't displayed for known scheme types + * which should be hierarchical URIs. + */ + uri->display_absolute = FALSE; + + /* Windows also sets the port for these (if they have one). */ + for(i = 0; i < sizeof(default_ports)/sizeof(default_ports[0]); ++i) { + if(data->scheme_type == default_ports[i].scheme) { + uri->has_port = TRUE; + uri->port = default_ports[i].port; + break; + } + } + } + + if(!canonicalize_path_opaque(data, uri, flags, computeOnly)) + return FALSE; } + if(uri->path_start > -1 && !computeOnly) + /* Finding file extensions happens for both types of URIs. */ + uri->extension_offset = find_file_extension(uri->canon_uri+uri->path_start, uri->path_len); + else + uri->extension_offset = -1; + + return TRUE; +} + +/* Attempts to canonicalize the query string of the URI. + * + * Things that happen: + * 1) For known scheme types forbidden characters + * are percent encoded, unless the NO_DECODE_EXTRA_INFO flag is set + * or NO_ENCODE_FORBIDDEN_CHARACTERS is set. + * + * 2) For known scheme types, percent encoded, unreserved characters + * are decoded as long as the NO_DECODE_EXTRA_INFO flag isn't set. + */ +static BOOL canonicalize_query(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { + const WCHAR *ptr, *end; + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + + if(!data->query) { + uri->query_start = -1; + uri->query_len = 0; + return TRUE; + } + + uri->query_start = uri->canon_len; + + end = data->query+data->query_len; + for(ptr = data->query; ptr < end; ++ptr) { + if(*ptr == '%') { + if(known_scheme && !(flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) { + WCHAR val = decode_pct_val(ptr); + if(is_unreserved(val)) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = val; + ++uri->canon_len; + + ptr += 2; + continue; + } + } + } else if(known_scheme && !is_unreserved(*ptr) && !is_reserved(*ptr)) { + if(!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS) && + !(flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) { + if(!computeOnly) + pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); + uri->canon_len += 3; + continue; + } + } + + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + + uri->query_len = uri->canon_len - uri->query_start; + + if(!computeOnly) + TRACE("(%p %p %x %d): Canonicalized query string %s len=%d\n", data, uri, flags, + computeOnly, debugstr_wn(uri->canon_uri+uri->query_start, uri->query_len), + uri->query_len); + return TRUE; +} + +static BOOL canonicalize_fragment(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { + const WCHAR *ptr, *end; + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + + if(!data->fragment) { + uri->fragment_start = -1; + uri->fragment_len = 0; + return TRUE; + } + + uri->fragment_start = uri->canon_len; + + end = data->fragment + data->fragment_len; + for(ptr = data->fragment; ptr < end; ++ptr) { + if(*ptr == '%') { + if(known_scheme && !(flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) { + WCHAR val = decode_pct_val(ptr); + if(is_unreserved(val)) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = val; + ++uri->canon_len; + + ptr += 2; + continue; + } + } + } else if(known_scheme && !is_unreserved(*ptr) && !is_reserved(*ptr)) { + if(!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS) && + !(flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) { + if(!computeOnly) + pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); + uri->canon_len += 3; + continue; + } + } + + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + + uri->fragment_len = uri->canon_len - uri->fragment_start; + + if(!computeOnly) + TRACE("(%p %p %x %d): Canonicalized fragment %s len=%d\n", data, uri, flags, + computeOnly, debugstr_wn(uri->canon_uri+uri->fragment_start, uri->fragment_len), + uri->fragment_len); return TRUE; } @@ -1109,6 +3348,16 @@ static int compute_canonicalized_length(const parse_data *data, DWORD flags) { return -1; } + if(!canonicalize_query(data, &uri, flags, TRUE)) { + ERR("(%p %x): Failed to compute query string length.\n", data, flags); + return -1; + } + + if(!canonicalize_fragment(data, &uri, flags, TRUE)) { + ERR("(%p %x): Failed to compute fragment length.\n", data, flags); + return -1; + } + TRACE("(%p %x): Finished computing canonicalized URI length. length=%d\n", data, flags, uri.canon_len); return uri.canon_len; @@ -1142,6 +3391,7 @@ static HRESULT canonicalize_uri(const parse_data *data, Uri *uri, DWORD flags) { if(!uri->canon_uri) return E_OUTOFMEMORY; + uri->canon_size = len; if(!canonicalize_scheme(data, uri, flags, FALSE)) { ERR("(%p %p %x): Unable to canonicalize the scheme of the URI.\n", data, uri, flags); heap_free(uri->canon_uri); @@ -1155,15 +3405,513 @@ static HRESULT canonicalize_uri(const parse_data *data, Uri *uri, DWORD flags) { return E_INVALIDARG; } - uri->canon_uri[uri->canon_len] = '\0'; - TRACE("(%p %p %x): finished canonicalizing the URI.\n", data, uri, flags); + if(!canonicalize_query(data, uri, flags, FALSE)) { + ERR("(%p %p %x): Unable to canonicalize query string of the URI.\n", + data, uri, flags); + return E_INVALIDARG; + } + if(!canonicalize_fragment(data, uri, flags, FALSE)) { + ERR("(%p %p %x): Unable to canonicalize fragment of the URI.\n", + data, uri, flags); + return E_INVALIDARG; + } + + /* There's a possibility we didn't use all the space we allocated + * earlier. + */ + if(uri->canon_len < uri->canon_size) { + /* This happens if the URI is hierarchical and dot + * segments were removed from it's path. + */ + WCHAR *tmp = heap_realloc(uri->canon_uri, (uri->canon_len+1)*sizeof(WCHAR)); + if(!tmp) + return E_OUTOFMEMORY; + + uri->canon_uri = tmp; + uri->canon_size = uri->canon_len; + } + + uri->canon_uri[uri->canon_len] = '\0'; + TRACE("(%p %p %x): finished canonicalizing the URI. uri=%s\n", data, uri, flags, debugstr_w(uri->canon_uri)); + + return S_OK; +} + +static HRESULT get_builder_component(LPWSTR *component, DWORD *component_len, + LPCWSTR source, DWORD source_len, + LPCWSTR *output, DWORD *output_len) +{ + if(!output_len) { + if(output) + *output = NULL; + return E_POINTER; + } + + if(!output) { + *output_len = 0; + return E_POINTER; + } + + if(!(*component) && source) { + /* Allocate 'component', and copy the contents from 'source' + * into the new allocation. + */ + *component = heap_alloc((source_len+1)*sizeof(WCHAR)); + if(!(*component)) + return E_OUTOFMEMORY; + + memcpy(*component, source, source_len*sizeof(WCHAR)); + (*component)[source_len] = '\0'; + *component_len = source_len; + } + + *output = *component; + *output_len = *component_len; + return *output ? S_OK : S_FALSE; +} + +/* Allocates 'component' and copies the string from 'new_value' into 'component'. + * If 'prefix' is set and 'new_value' isn't NULL, then it checks if 'new_value' + * starts with 'prefix'. If it doesn't then 'prefix' is prepended to 'component'. + * + * If everything is successful, then will set 'success_flag' in 'flags'. + */ +static HRESULT set_builder_component(LPWSTR *component, DWORD *component_len, LPCWSTR new_value, + WCHAR prefix, DWORD *flags, DWORD success_flag) +{ + heap_free(*component); + + if(!new_value) { + *component = NULL; + *component_len = 0; + } else { + BOOL add_prefix = FALSE; + DWORD len = lstrlenW(new_value); + DWORD pos = 0; + + if(prefix && *new_value != prefix) { + add_prefix = TRUE; + *component = heap_alloc((len+2)*sizeof(WCHAR)); + } else + *component = heap_alloc((len+1)*sizeof(WCHAR)); + + if(!(*component)) + return E_OUTOFMEMORY; + + if(add_prefix) + (*component)[pos++] = prefix; + + memcpy(*component+pos, new_value, (len+1)*sizeof(WCHAR)); + *component_len = len+pos; + } + + *flags |= success_flag; return S_OK; } #define URI(x) ((IUri*) &(x)->lpIUriVtbl) #define URIBUILDER(x) ((IUriBuilder*) &(x)->lpIUriBuilderVtbl) +static void reset_builder(UriBuilder *builder) { + if(builder->uri) + IUri_Release(URI(builder->uri)); + builder->uri = NULL; + + heap_free(builder->fragment); + builder->fragment = NULL; + builder->fragment_len = 0; + + heap_free(builder->host); + builder->host = NULL; + builder->host_len = 0; + + heap_free(builder->password); + builder->password = NULL; + builder->password_len = 0; + + heap_free(builder->path); + builder->path = NULL; + builder->path_len = 0; + + heap_free(builder->query); + builder->query = NULL; + builder->query_len = 0; + + heap_free(builder->scheme); + builder->scheme = NULL; + builder->scheme_len = 0; + + heap_free(builder->username); + builder->username = NULL; + builder->username_len = 0; + + builder->has_port = FALSE; + builder->port = 0; + builder->modified_props = 0; +} + +static HRESULT validate_scheme_name(const UriBuilder *builder, parse_data *data, DWORD flags) { + const WCHAR *component; + const WCHAR *ptr; + const WCHAR **pptr; + DWORD expected_len; + + if(builder->scheme) { + ptr = builder->scheme; + expected_len = builder->scheme_len; + } else if(builder->uri && builder->uri->scheme_start > -1) { + ptr = builder->uri->canon_uri+builder->uri->scheme_start; + expected_len = builder->uri->scheme_len; + } else { + static const WCHAR nullW[] = {0}; + ptr = nullW; + expected_len = 0; + } + + component = ptr; + pptr = &ptr; + if(parse_scheme(pptr, data, flags, ALLOW_NULL_TERM_SCHEME) && + data->scheme_len == expected_len) { + if(data->scheme) + TRACE("(%p %p %x): Found valid scheme component %s len=%d.\n", builder, data, flags, + debugstr_wn(data->scheme, data->scheme_len), data->scheme_len); + } else { + TRACE("(%p %p %x): Invalid scheme component found %s.\n", builder, data, flags, + debugstr_wn(component, expected_len)); + return INET_E_INVALID_URL; + } + + return S_OK; +} + +static HRESULT validate_username(const UriBuilder *builder, parse_data *data, DWORD flags) { + const WCHAR *ptr; + const WCHAR **pptr; + DWORD expected_len; + + if(builder->username) { + ptr = builder->username; + expected_len = builder->username_len; + } else if(!(builder->modified_props & Uri_HAS_USER_NAME) && builder->uri && + builder->uri->userinfo_start > -1 && builder->uri->userinfo_split != 0) { + /* Just use the username from the base Uri. */ + data->username = builder->uri->canon_uri+builder->uri->userinfo_start; + data->username_len = (builder->uri->userinfo_split > -1) ? + builder->uri->userinfo_split : builder->uri->userinfo_len; + ptr = NULL; + } else { + ptr = NULL; + expected_len = 0; + } + + if(ptr) { + const WCHAR *component = ptr; + pptr = &ptr; + if(parse_username(pptr, data, flags, ALLOW_NULL_TERM_USER_NAME) && + data->username_len == expected_len) + TRACE("(%p %p %x): Found valid username component %s len=%d.\n", builder, data, flags, + debugstr_wn(data->username, data->username_len), data->username_len); + else { + TRACE("(%p %p %x): Invalid username component found %s.\n", builder, data, flags, + debugstr_wn(component, expected_len)); + return INET_E_INVALID_URL; + } + } + + return S_OK; +} + +static HRESULT validate_password(const UriBuilder *builder, parse_data *data, DWORD flags) { + const WCHAR *ptr; + const WCHAR **pptr; + DWORD expected_len; + + if(builder->password) { + ptr = builder->password; + expected_len = builder->password_len; + } else if(!(builder->modified_props & Uri_HAS_PASSWORD) && builder->uri && + builder->uri->userinfo_split > -1) { + data->password = builder->uri->canon_uri+builder->uri->userinfo_start+builder->uri->userinfo_split+1; + data->password_len = builder->uri->userinfo_len-builder->uri->userinfo_split-1; + ptr = NULL; + } else { + ptr = NULL; + expected_len = 0; + } + + if(ptr) { + const WCHAR *component = ptr; + pptr = &ptr; + if(parse_password(pptr, data, flags, ALLOW_NULL_TERM_PASSWORD) && + data->password_len == expected_len) + TRACE("(%p %p %x): Found valid password component %s len=%d.\n", builder, data, flags, + debugstr_wn(data->password, data->password_len), data->password_len); + else { + TRACE("(%p %p %x): Invalid password component found %s.\n", builder, data, flags, + debugstr_wn(component, expected_len)); + return INET_E_INVALID_URL; + } + } + + return S_OK; +} + +static HRESULT validate_userinfo(const UriBuilder *builder, parse_data *data, DWORD flags) { + HRESULT hr; + + hr = validate_username(builder, data, flags); + if(FAILED(hr)) + return hr; + + hr = validate_password(builder, data, flags); + if(FAILED(hr)) + return hr; + + return S_OK; +} + +static HRESULT validate_host(const UriBuilder *builder, parse_data *data, DWORD flags) { + const WCHAR *ptr; + const WCHAR **pptr; + DWORD expected_len; + + if(builder->host) { + ptr = builder->host; + expected_len = builder->host_len; + } else if(!(builder->modified_props & Uri_HAS_HOST) && builder->uri && builder->uri->host_start > -1) { + ptr = builder->uri->canon_uri + builder->uri->host_start; + expected_len = builder->uri->host_len; + } else + ptr = NULL; + + if(ptr) { + const WCHAR *component = ptr; + DWORD extras = ALLOW_BRACKETLESS_IP_LITERAL|IGNORE_PORT_DELIMITER|SKIP_IP_FUTURE_CHECK; + pptr = &ptr; + + if(parse_host(pptr, data, flags, extras) && data->host_len == expected_len) + TRACE("(%p %p %x): Found valid host name %s len=%d type=%d.\n", builder, data, flags, + debugstr_wn(data->host, data->host_len), data->host_len, data->host_type); + else { + TRACE("(%p %p %x): Invalid host name found %s.\n", builder, data, flags, + debugstr_wn(component, expected_len)); + return INET_E_INVALID_URL; + } + } + + return S_OK; +} + +static void setup_port(const UriBuilder *builder, parse_data *data, DWORD flags) { + if(builder->modified_props & Uri_HAS_PORT) { + if(builder->has_port) { + data->has_port = TRUE; + data->port_value = builder->port; + } + } else if(builder->uri && builder->uri->has_port) { + data->has_port = TRUE; + data->port_value = builder->uri->port; + } + + if(data->has_port) + TRACE("(%p %p %x): Using %u as port for IUri.\n", builder, data, flags, data->port_value); +} + +static HRESULT validate_path(const UriBuilder *builder, parse_data *data, DWORD flags) { + const WCHAR *ptr = NULL; + const WCHAR **pptr; + DWORD expected_len; + + if(builder->path) { + ptr = builder->path; + expected_len = builder->path_len; + } else if(!(builder->modified_props & Uri_HAS_PATH) && + builder->uri && builder->uri->path_start > -1) { + ptr = builder->uri->canon_uri+builder->uri->path_start; + expected_len = builder->uri->path_len; + } + + if(ptr) { + BOOL valid = FALSE; + const WCHAR *component = ptr; + pptr = &ptr; + + /* How the path is validated depends on what type of + * URI it is. + */ + valid = data->is_opaque ? + parse_path_opaque(pptr, data, flags) : parse_path_hierarchical(pptr, data, flags); + + if(!valid || expected_len != data->path_len) { + TRACE("(%p %p %x): Invalid path componet %s.\n", builder, data, flags, + debugstr_wn(component, expected_len)); + return INET_E_INVALID_URL; + } + + TRACE("(%p %p %x): Valid path component %s len=%d.\n", builder, data, flags, + debugstr_wn(data->path, data->path_len), data->path_len); + } + + return S_OK; +} + +static HRESULT validate_query(const UriBuilder *builder, parse_data *data, DWORD flags) { + const WCHAR *ptr = NULL; + const WCHAR **pptr; + DWORD expected_len; + + if(builder->query) { + ptr = builder->query; + expected_len = builder->query_len; + } else if(!(builder->modified_props & Uri_HAS_QUERY) && builder->uri && + builder->uri->query_start > -1) { + ptr = builder->uri->canon_uri+builder->uri->query_start; + expected_len = builder->uri->query_len; + } + + if(ptr) { + const WCHAR *component = ptr; + pptr = &ptr; + + if(parse_query(pptr, data, flags) && expected_len == data->query_len) + TRACE("(%p %p %x): Valid query component %s len=%d.\n", builder, data, flags, + debugstr_wn(data->query, data->query_len), data->query_len); + else { + TRACE("(%p %p %x): Invalid query component %s.\n", builder, data, flags, + debugstr_wn(component, expected_len)); + return INET_E_INVALID_URL; + } + } + + return S_OK; +} + +static HRESULT validate_fragment(const UriBuilder *builder, parse_data *data, DWORD flags) { + const WCHAR *ptr = NULL; + const WCHAR **pptr; + DWORD expected_len; + + if(builder->fragment) { + ptr = builder->fragment; + expected_len = builder->fragment_len; + } else if(!(builder->modified_props & Uri_HAS_FRAGMENT) && builder->uri && + builder->uri->fragment_start > -1) { + ptr = builder->uri->canon_uri+builder->uri->fragment_start; + expected_len = builder->uri->fragment_len; + } + + if(ptr) { + const WCHAR *component = ptr; + pptr = &ptr; + + if(parse_query(pptr, data, flags) && expected_len == data->fragment_len) + TRACE("(%p %p %x): Valid fragment component %s len=%d.\n", builder, data, flags, + debugstr_wn(data->fragment, data->fragment_len), data->fragment_len); + else { + TRACE("(%p %p %x): Invalid fragment component %s.\n", builder, data, flags, + debugstr_wn(component, expected_len)); + return INET_E_INVALID_URL; + } + } + + return S_OK; +} + +static HRESULT validate_components(const UriBuilder *builder, parse_data *data, DWORD flags) { + HRESULT hr; + + memset(data, 0, sizeof(parse_data)); + + TRACE("(%p %p %x): Beginning to validate builder components.\n", builder, data, flags); + + hr = validate_scheme_name(builder, data, flags); + if(FAILED(hr)) + return hr; + + /* Extra validation for file schemes. */ + if(data->scheme_type == URL_SCHEME_FILE) { + if((builder->password || (builder->uri && builder->uri->userinfo_split > -1)) || + (builder->username || (builder->uri && builder->uri->userinfo_start > -1))) { + TRACE("(%p %p %x): File schemes can't contain a username or password.\n", + builder, data, flags); + return INET_E_INVALID_URL; + } + } + + hr = validate_userinfo(builder, data, flags); + if(FAILED(hr)) + return hr; + + hr = validate_host(builder, data, flags); + if(FAILED(hr)) + return hr; + + /* The URI is opaque if it doesn't have an authority component. */ + data->is_opaque = !data->username && !data->password && !data->host; + + setup_port(builder, data, flags); + + hr = validate_path(builder, data, flags); + if(FAILED(hr)) + return hr; + + hr = validate_query(builder, data, flags); + if(FAILED(hr)) + return hr; + + hr = validate_fragment(builder, data, flags); + if(FAILED(hr)) + return hr; + + TRACE("(%p %p %x): Finished validating builder components.\n", builder, data, flags); + + return S_OK; +} + +static HRESULT build_uri(const UriBuilder *builder, IUri **uri, DWORD create_flags, + DWORD use_orig_flags, DWORD encoding_mask) +{ + HRESULT hr; + parse_data data; + + if(!uri) + return E_POINTER; + + if(encoding_mask && (!builder->uri || builder->modified_props)) { + *uri = NULL; + return E_NOTIMPL; + } + + /* Decide what flags should be used when creating the Uri. */ + if((use_orig_flags & UriBuilder_USE_ORIGINAL_FLAGS) && builder->uri) + create_flags = builder->uri->create_flags; + else { + if(has_invalid_flag_combination(create_flags)) { + *uri = NULL; + return E_INVALIDARG; + } + + /* Set the default flags if they don't cause a conflict. */ + apply_default_flags(&create_flags); + } + + /* Return the base IUri if no changes have been made and the create_flags match. */ + if(builder->uri && !builder->modified_props && builder->uri->create_flags == create_flags) { + *uri = URI(builder->uri); + IUri_AddRef(*uri); + return S_OK; + } + + hr = validate_components(builder, &data, create_flags); + if(FAILED(hr)) { + *uri = NULL; + return hr; + } + + return E_NOTIMPL; +} + #define URI_THIS(iface) DEFINE_THIS(Uri, IUri, iface) static HRESULT WINAPI Uri_QueryInterface(IUri *iface, REFIID riid, void **ppv) @@ -1176,6 +3924,10 @@ static HRESULT WINAPI Uri_QueryInterface(IUri *iface, REFIID riid, void **ppv) }else if(IsEqualGUID(&IID_IUri, riid)) { TRACE("(%p)->(IID_IUri %p)\n", This, ppv); *ppv = URI(This); + }else if(IsEqualGUID(&IID_IUriObj, riid)) { + TRACE("(%p)->(IID_IUriObj %p)\n", This, ppv); + *ppv = This; + return S_OK; }else { TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); *ppv = NULL; @@ -1241,16 +3993,137 @@ static HRESULT WINAPI Uri_GetPropertyBSTR(IUri *iface, Uri_PROPERTY uriProp, BST } switch(uriProp) { - case Uri_PROPERTY_HOST: - if(This->host_start > -1) { - *pbstrProperty = SysAllocStringLen(This->canon_uri+This->host_start, This->host_len); + case Uri_PROPERTY_ABSOLUTE_URI: + if(!This->display_absolute) { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } else { + if(This->scheme_type != URL_SCHEME_UNKNOWN && This->userinfo_start > -1) { + if(This->userinfo_len == 0) { + /* Don't include the '@' after the userinfo component. */ + *pbstrProperty = SysAllocStringLen(NULL, This->canon_len-1); + hres = S_OK; + if(*pbstrProperty) { + /* Copy everything before it. */ + memcpy(*pbstrProperty, This->canon_uri, This->userinfo_start*sizeof(WCHAR)); + + /* And everything after it. */ + memcpy(*pbstrProperty+This->userinfo_start, This->canon_uri+This->userinfo_start+1, + (This->canon_len-This->userinfo_start-1)*sizeof(WCHAR)); + } + } else if(This->userinfo_split == 0 && This->userinfo_len == 1) { + /* Don't include the ":@" */ + *pbstrProperty = SysAllocStringLen(NULL, This->canon_len-2); + hres = S_OK; + if(*pbstrProperty) { + memcpy(*pbstrProperty, This->canon_uri, This->userinfo_start*sizeof(WCHAR)); + memcpy(*pbstrProperty+This->userinfo_start, This->canon_uri+This->userinfo_start+2, + (This->canon_len-This->userinfo_start-2)*sizeof(WCHAR)); + } + } else { + *pbstrProperty = SysAllocString(This->canon_uri); + hres = S_OK; + } + } else { + *pbstrProperty = SysAllocString(This->canon_uri); + hres = S_OK; + } + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; + case Uri_PROPERTY_AUTHORITY: + if(This->authority_start > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->authority_start, This->authority_len); hres = S_OK; } else { - /* Canonicalizing/parsing the host of a URI is only partially - * implemented, so return E_NOTIMPL for now. - */ - FIXME("(%p)->(%d %p %x) Partially implemented\n", This, uriProp, pbstrProperty, dwFlags); - return E_NOTIMPL; + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; + case Uri_PROPERTY_DISPLAY_URI: + /* The Display URI contains everything except for the userinfo for known + * scheme types. + */ + if(This->scheme_type != URL_SCHEME_UNKNOWN && This->userinfo_start > -1) { + *pbstrProperty = SysAllocStringLen(NULL, This->canon_len-This->userinfo_len); + + if(*pbstrProperty) { + /* Copy everything before the userinfo over. */ + memcpy(*pbstrProperty, This->canon_uri, This->userinfo_start*sizeof(WCHAR)); + /* Copy everything after the userinfo over. */ + memcpy(*pbstrProperty+This->userinfo_start, + This->canon_uri+This->userinfo_start+This->userinfo_len+1, + (This->canon_len-(This->userinfo_start+This->userinfo_len+1))*sizeof(WCHAR)); + } + } else + *pbstrProperty = SysAllocString(This->canon_uri); + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + else + hres = S_OK; + + break; + case Uri_PROPERTY_DOMAIN: + if(This->domain_offset > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->host_start+This->domain_offset, + This->host_len-This->domain_offset); + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; + case Uri_PROPERTY_EXTENSION: + if(This->extension_offset > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->path_start+This->extension_offset, + This->path_len-This->extension_offset); + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; + case Uri_PROPERTY_FRAGMENT: + if(This->fragment_start > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->fragment_start, This->fragment_len); + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; + case Uri_PROPERTY_HOST: + if(This->host_start > -1) { + /* The '[' and ']' aren't included for IPv6 addresses. */ + if(This->host_type == Uri_HOST_IPV6) + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->host_start+1, This->host_len-2); + else + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->host_start, This->host_len); + + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; } if(!(*pbstrProperty)) @@ -1271,6 +4144,48 @@ static HRESULT WINAPI Uri_GetPropertyBSTR(IUri *iface, Uri_PROPERTY uriProp, BST if(!(*pbstrProperty)) return E_OUTOFMEMORY; + break; + case Uri_PROPERTY_PATH: + if(This->path_start > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->path_start, This->path_len); + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; + case Uri_PROPERTY_PATH_AND_QUERY: + if(This->path_start > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->path_start, This->path_len+This->query_len); + hres = S_OK; + } else if(This->query_start > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->query_start, This->query_len); + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; + case Uri_PROPERTY_QUERY: + if(This->query_start > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->query_start, This->query_len); + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + break; case Uri_PROPERTY_RAW_URI: *pbstrProperty = SysAllocString(This->raw_uri); @@ -1306,7 +4221,7 @@ static HRESULT WINAPI Uri_GetPropertyBSTR(IUri *iface, Uri_PROPERTY uriProp, BST break; case Uri_PROPERTY_USER_NAME: - if(This->userinfo_start > -1) { + if(This->userinfo_start > -1 && This->userinfo_split != 0) { /* If userinfo_split is set, that means a password exists * so the username is only from userinfo_start to userinfo_split. */ @@ -1354,22 +4269,87 @@ static HRESULT WINAPI Uri_GetPropertyLength(IUri *iface, Uri_PROPERTY uriProp, D } switch(uriProp) { - case Uri_PROPERTY_HOST: - if(This->host_start == -1) { - /* Canonicalizing/parsing the host of a URI is only partially - * implemented, so return E_NOTIMPL for now. - */ - FIXME("(%p)->(%d %p %x) Partially implemented\n", This, uriProp, pcchProperty, dwFlags); - return E_NOTIMPL; + case Uri_PROPERTY_ABSOLUTE_URI: + if(!This->display_absolute) { + *pcchProperty = 0; + hres = S_FALSE; + } else { + if(This->scheme_type != URL_SCHEME_UNKNOWN) { + if(This->userinfo_start > -1 && This->userinfo_len == 0) + /* Don't include the '@' in the length. */ + *pcchProperty = This->canon_len-1; + else if(This->userinfo_start > -1 && This->userinfo_len == 1 && + This->userinfo_split == 0) + /* Don't include the ":@" in the length. */ + *pcchProperty = This->canon_len-2; + else + *pcchProperty = This->canon_len; + } else + *pcchProperty = This->canon_len; + + hres = S_OK; } + break; + case Uri_PROPERTY_AUTHORITY: + *pcchProperty = This->authority_len; + hres = (This->authority_start > -1) ? S_OK : S_FALSE; + break; + case Uri_PROPERTY_DISPLAY_URI: + if(This->scheme_type != URL_SCHEME_UNKNOWN && This->userinfo_start > -1) + *pcchProperty = This->canon_len-This->userinfo_len-1; + else + *pcchProperty = This->canon_len; + + hres = S_OK; + break; + case Uri_PROPERTY_DOMAIN: + if(This->domain_offset > -1) + *pcchProperty = This->host_len - This->domain_offset; + else + *pcchProperty = 0; + + hres = (This->domain_offset > -1) ? S_OK : S_FALSE; + break; + case Uri_PROPERTY_EXTENSION: + if(This->extension_offset > -1) { + *pcchProperty = This->path_len - This->extension_offset; + hres = S_OK; + } else { + *pcchProperty = 0; + hres = S_FALSE; + } + + break; + case Uri_PROPERTY_FRAGMENT: + *pcchProperty = This->fragment_len; + hres = (This->fragment_start > -1) ? S_OK : S_FALSE; + break; + case Uri_PROPERTY_HOST: *pcchProperty = This->host_len; + + /* '[' and ']' aren't included in the length. */ + if(This->host_type == Uri_HOST_IPV6) + *pcchProperty -= 2; + hres = (This->host_start > -1) ? S_OK : S_FALSE; break; case Uri_PROPERTY_PASSWORD: *pcchProperty = (This->userinfo_split > -1) ? This->userinfo_len-This->userinfo_split-1 : 0; hres = (This->userinfo_split > -1) ? S_OK : S_FALSE; break; + case Uri_PROPERTY_PATH: + *pcchProperty = This->path_len; + hres = (This->path_start > -1) ? S_OK : S_FALSE; + break; + case Uri_PROPERTY_PATH_AND_QUERY: + *pcchProperty = This->path_len+This->query_len; + hres = (This->path_start > -1 || This->query_start > -1) ? S_OK : S_FALSE; + break; + case Uri_PROPERTY_QUERY: + *pcchProperty = This->query_len; + hres = (This->query_start > -1) ? S_OK : S_FALSE; + break; case Uri_PROPERTY_RAW_URI: *pcchProperty = SysStringLen(This->raw_uri); hres = S_OK; @@ -1384,7 +4364,10 @@ static HRESULT WINAPI Uri_GetPropertyLength(IUri *iface, Uri_PROPERTY uriProp, D break; case Uri_PROPERTY_USER_NAME: *pcchProperty = (This->userinfo_split > -1) ? This->userinfo_split : This->userinfo_len; - hres = (This->userinfo_start > -1) ? S_OK : S_FALSE; + if(This->userinfo_split == 0) + hres = S_FALSE; + else + hres = (This->userinfo_start > -1) ? S_OK : S_FALSE; break; default: FIXME("(%p)->(%d %p %x)\n", This, uriProp, pcchProperty, dwFlags); @@ -1420,6 +4403,20 @@ static HRESULT WINAPI Uri_GetPropertyDWORD(IUri *iface, Uri_PROPERTY uriProp, DW } switch(uriProp) { + case Uri_PROPERTY_HOST_TYPE: + *pcchProperty = This->host_type; + hres = S_OK; + break; + case Uri_PROPERTY_PORT: + if(!This->has_port) { + *pcchProperty = 0; + hres = S_FALSE; + } else { + *pcchProperty = This->port; + hres = S_OK; + } + + break; case Uri_PROPERTY_SCHEME: *pcchProperty = This->scheme_type; hres = S_OK; @@ -1435,78 +4432,114 @@ static HRESULT WINAPI Uri_GetPropertyDWORD(IUri *iface, Uri_PROPERTY uriProp, DW static HRESULT WINAPI Uri_HasProperty(IUri *iface, Uri_PROPERTY uriProp, BOOL *pfHasProperty) { Uri *This = URI_THIS(iface); - FIXME("(%p)->(%d %p)\n", This, uriProp, pfHasProperty); + TRACE("(%p)->(%d %p)\n", This, uriProp, pfHasProperty); if(!pfHasProperty) return E_INVALIDARG; - return E_NOTIMPL; + switch(uriProp) { + case Uri_PROPERTY_ABSOLUTE_URI: + *pfHasProperty = This->display_absolute; + break; + case Uri_PROPERTY_AUTHORITY: + *pfHasProperty = This->authority_start > -1; + break; + case Uri_PROPERTY_DISPLAY_URI: + *pfHasProperty = TRUE; + break; + case Uri_PROPERTY_DOMAIN: + *pfHasProperty = This->domain_offset > -1; + break; + case Uri_PROPERTY_EXTENSION: + *pfHasProperty = This->extension_offset > -1; + break; + case Uri_PROPERTY_FRAGMENT: + *pfHasProperty = This->fragment_start > -1; + break; + case Uri_PROPERTY_HOST: + *pfHasProperty = This->host_start > -1; + break; + case Uri_PROPERTY_PASSWORD: + *pfHasProperty = This->userinfo_split > -1; + break; + case Uri_PROPERTY_PATH: + *pfHasProperty = This->path_start > -1; + break; + case Uri_PROPERTY_PATH_AND_QUERY: + *pfHasProperty = (This->path_start > -1 || This->query_start > -1); + break; + case Uri_PROPERTY_QUERY: + *pfHasProperty = This->query_start > -1; + break; + case Uri_PROPERTY_RAW_URI: + *pfHasProperty = TRUE; + break; + case Uri_PROPERTY_SCHEME_NAME: + *pfHasProperty = This->scheme_start > -1; + break; + case Uri_PROPERTY_USER_INFO: + *pfHasProperty = This->userinfo_start > -1; + break; + case Uri_PROPERTY_USER_NAME: + if(This->userinfo_split == 0) + *pfHasProperty = FALSE; + else + *pfHasProperty = This->userinfo_start > -1; + break; + case Uri_PROPERTY_HOST_TYPE: + *pfHasProperty = TRUE; + break; + case Uri_PROPERTY_PORT: + *pfHasProperty = This->has_port; + break; + case Uri_PROPERTY_SCHEME: + *pfHasProperty = TRUE; + break; + case Uri_PROPERTY_ZONE: + *pfHasProperty = FALSE; + break; + default: + FIXME("(%p)->(%d %p): Unsupported property type.\n", This, uriProp, pfHasProperty); + return E_NOTIMPL; + } + + return S_OK; } static HRESULT WINAPI Uri_GetAbsoluteUri(IUri *iface, BSTR *pstrAbsoluteUri) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrAbsoluteUri); - - if(!pstrAbsoluteUri) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrAbsoluteUri); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_ABSOLUTE_URI, pstrAbsoluteUri, 0); } static HRESULT WINAPI Uri_GetAuthority(IUri *iface, BSTR *pstrAuthority) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrAuthority); - - if(!pstrAuthority) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrAuthority); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_AUTHORITY, pstrAuthority, 0); } static HRESULT WINAPI Uri_GetDisplayUri(IUri *iface, BSTR *pstrDisplayUri) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrDisplayUri); - - if(!pstrDisplayUri) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrDisplayUri); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_DISPLAY_URI, pstrDisplayUri, 0); } static HRESULT WINAPI Uri_GetDomain(IUri *iface, BSTR *pstrDomain) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrDomain); - - if(!pstrDomain) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrDomain); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_DOMAIN, pstrDomain, 0); } static HRESULT WINAPI Uri_GetExtension(IUri *iface, BSTR *pstrExtension) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrExtension); - - if(!pstrExtension) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrExtension); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_EXTENSION, pstrExtension, 0); } static HRESULT WINAPI Uri_GetFragment(IUri *iface, BSTR *pstrFragment) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrFragment); - - if(!pstrFragment) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrFragment); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_FRAGMENT, pstrFragment, 0); } static HRESULT WINAPI Uri_GetHost(IUri *iface, BSTR *pstrHost) @@ -1523,50 +4556,31 @@ static HRESULT WINAPI Uri_GetPassword(IUri *iface, BSTR *pstrPassword) static HRESULT WINAPI Uri_GetPath(IUri *iface, BSTR *pstrPath) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrPath); - - if(!pstrPath) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrPath); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_PATH, pstrPath, 0); } static HRESULT WINAPI Uri_GetPathAndQuery(IUri *iface, BSTR *pstrPathAndQuery) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrPathAndQuery); - - if(!pstrPathAndQuery) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrPathAndQuery); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_PATH_AND_QUERY, pstrPathAndQuery, 0); } static HRESULT WINAPI Uri_GetQuery(IUri *iface, BSTR *pstrQuery) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrQuery); - - if(!pstrQuery) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrQuery); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_QUERY, pstrQuery, 0); } static HRESULT WINAPI Uri_GetRawUri(IUri *iface, BSTR *pstrRawUri) { - Uri *This = URI_THIS(iface); - TRACE("(%p)->(%p)\n", This, pstrRawUri); - - /* Just forward the call to GetPropertyBSTR. */ + TRACE("(%p)->(%p)\n", iface, pstrRawUri); return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_RAW_URI, pstrRawUri, 0); } static HRESULT WINAPI Uri_GetSchemeName(IUri *iface, BSTR *pstrSchemeName) { - Uri *This = URI_THIS(iface); - TRACE("(%p)->(%p)\n", This, pstrSchemeName); + TRACE("(%p)->(%p)\n", iface, pstrSchemeName); return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_SCHEME_NAME, pstrSchemeName, 0); } @@ -1584,24 +4598,14 @@ static HRESULT WINAPI Uri_GetUserName(IUri *iface, BSTR *pstrUserName) static HRESULT WINAPI Uri_GetHostType(IUri *iface, DWORD *pdwHostType) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pdwHostType); - - if(!pdwHostType) - return E_INVALIDARG; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pdwHostType); + return Uri_GetPropertyDWORD(iface, Uri_PROPERTY_HOST_TYPE, pdwHostType, 0); } static HRESULT WINAPI Uri_GetPort(IUri *iface, DWORD *pdwPort) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pdwPort); - - if(!pdwPort) - return E_INVALIDARG; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pdwPort); + return Uri_GetPropertyDWORD(iface, Uri_PROPERTY_PORT, pdwPort, 0); } static HRESULT WINAPI Uri_GetScheme(IUri *iface, DWORD *pdwScheme) @@ -1613,33 +4617,63 @@ static HRESULT WINAPI Uri_GetScheme(IUri *iface, DWORD *pdwScheme) static HRESULT WINAPI Uri_GetZone(IUri *iface, DWORD *pdwZone) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pdwZone); - - if(!pdwZone) - return E_INVALIDARG; - - /* Microsoft doesn't seem to have this implemented yet... See - * the comment in Uri_GetPropertyDWORD for more about this. - */ - *pdwZone = URLZONE_INVALID; - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pdwZone); + return Uri_GetPropertyDWORD(iface, Uri_PROPERTY_ZONE,pdwZone, 0); } static HRESULT WINAPI Uri_GetProperties(IUri *iface, DWORD *pdwProperties) { Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pdwProperties); + TRACE("(%p)->(%p)\n", This, pdwProperties); if(!pdwProperties) return E_INVALIDARG; - return E_NOTIMPL; + /* All URIs have these. */ + *pdwProperties = Uri_HAS_DISPLAY_URI|Uri_HAS_RAW_URI|Uri_HAS_SCHEME|Uri_HAS_HOST_TYPE; + + if(This->display_absolute) + *pdwProperties |= Uri_HAS_ABSOLUTE_URI; + + if(This->scheme_start > -1) + *pdwProperties |= Uri_HAS_SCHEME_NAME; + + if(This->authority_start > -1) { + *pdwProperties |= Uri_HAS_AUTHORITY; + if(This->userinfo_start > -1) { + *pdwProperties |= Uri_HAS_USER_INFO; + if(This->userinfo_split != 0) + *pdwProperties |= Uri_HAS_USER_NAME; + } + if(This->userinfo_split > -1) + *pdwProperties |= Uri_HAS_PASSWORD; + if(This->host_start > -1) + *pdwProperties |= Uri_HAS_HOST; + if(This->domain_offset > -1) + *pdwProperties |= Uri_HAS_DOMAIN; + } + + if(This->has_port) + *pdwProperties |= Uri_HAS_PORT; + if(This->path_start > -1) + *pdwProperties |= Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY; + if(This->query_start > -1) + *pdwProperties |= Uri_HAS_QUERY|Uri_HAS_PATH_AND_QUERY; + + if(This->extension_offset > -1) + *pdwProperties |= Uri_HAS_EXTENSION; + + if(This->fragment_start > -1) + *pdwProperties |= Uri_HAS_FRAGMENT; + + return S_OK; } static HRESULT WINAPI Uri_IsEqual(IUri *iface, IUri *pUri, BOOL *pfEqual) { Uri *This = URI_THIS(iface); + Uri *other; + TRACE("(%p)->(%p %p)\n", This, pUri, pfEqual); if(!pfEqual) @@ -1652,8 +4686,16 @@ static HRESULT WINAPI Uri_IsEqual(IUri *iface, IUri *pUri, BOOL *pfEqual) return S_OK; } - FIXME("(%p)->(%p %p)\n", This, pUri, pfEqual); - return E_NOTIMPL; + /* Try to convert it to a Uri (allows for a more simple comparison). */ + if((other = get_uri_obj(pUri))) + *pfEqual = are_equal_simple(This, other); + else { + /* Do it the hard way. */ + FIXME("(%p)->(%p %p) No support for unknown IUri's yet.\n", iface, pUri, pfEqual); + return E_NOTIMPL; + } + + return S_OK; } #undef URI_THIS @@ -1691,9 +4733,35 @@ static const IUriVtbl UriVtbl = { /*********************************************************************** * CreateUri (urlmon.@) + * + * Creates a new IUri object using the URI represented by pwzURI. This function + * parses and validates the components of pwzURI and then canonicalizes the + * parsed components. + * + * PARAMS + * pwzURI [I] The URI to parse, validate, and canonicalize. + * dwFlags [I] Flags which can affect how the parsing/canonicalization is performed. + * dwReserved [I] Reserved (not used). + * ppURI [O] The resulting IUri after parsing/canonicalization occurs. + * + * RETURNS + * Success: Returns S_OK. ppURI contains the pointer to the newly allocated IUri. + * Failure: E_INVALIDARG if there's invalid flag combinations in dwFlags, or an + * invalid parameters, or pwzURI doesn't represnt a valid URI. + * E_OUTOFMEMORY if any memory allocation fails. + * + * NOTES + * Default flags: + * Uri_CREATE_CANONICALIZE, Uri_CREATE_DECODE_EXTRA_INFO, Uri_CREATE_CRACK_UNKNOWN_SCHEMES, + * Uri_CREATE_PRE_PROCESS_HTML_URI, Uri_CREATE_NO_IE_SETTINGS. */ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI) { + const DWORD supported_flags = Uri_CREATE_ALLOW_RELATIVE|Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME| + Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME|Uri_CREATE_NO_CANONICALIZE|Uri_CREATE_CANONICALIZE| + Uri_CREATE_DECODE_EXTRA_INFO|Uri_CREATE_NO_DECODE_EXTRA_INFO|Uri_CREATE_CRACK_UNKNOWN_SCHEMES| + Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES|Uri_CREATE_PRE_PROCESS_HTML_URI|Uri_CREATE_NO_PRE_PROCESS_HTML_URI| + Uri_CREATE_NO_IE_SETTINGS|Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS|Uri_CREATE_FILE_USE_DOS_PATH; Uri *ret; HRESULT hr; parse_data data; @@ -1703,11 +4771,21 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU if(!ppURI) return E_INVALIDARG; - if(!pwzURI) { + if(!pwzURI || !*pwzURI) { *ppURI = NULL; return E_INVALIDARG; } + /* Check for invalid flags. */ + if(has_invalid_flag_combination(dwFlags)) { + *ppURI = NULL; + return E_INVALIDARG; + } + + /* Currently unsupported. */ + if(dwFlags & ~supported_flags) + FIXME("Ignoring unsupported flag(s) %x\n", dwFlags & ~supported_flags); + ret = heap_alloc(sizeof(Uri)); if(!ret) return E_OUTOFMEMORY; @@ -1715,8 +4793,15 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU ret->lpIUriVtbl = &UriVtbl; ret->ref = 1; - /* Create a copy of pwzURI and store it as the raw_uri. */ - ret->raw_uri = SysAllocString(pwzURI); + /* Explicitly set the default flags if it doesn't cause a flag conflict. */ + apply_default_flags(&dwFlags); + + /* Pre process the URI, unless told otherwise. */ + if(!(dwFlags & Uri_CREATE_NO_PRE_PROCESS_HTML_URI)) + ret->raw_uri = pre_process_uri(pwzURI); + else + ret->raw_uri = SysAllocString(pwzURI); + if(!ret->raw_uri) { heap_free(ret); return E_OUTOFMEMORY; @@ -1743,10 +4828,86 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU return hr; } + ret->create_flags = dwFlags; + *ppURI = URI(ret); return S_OK; } +/*********************************************************************** + * CreateUriWithFragment (urlmon.@) + * + * Creates a new IUri object. This is almost the same as CreateUri, expect that + * it allows you to explicitly specify a fragment (pwzFragment) for pwzURI. + * + * PARAMS + * pwzURI [I] The URI to parse and perform canonicalization on. + * pwzFragment [I] The explict fragment string which should be added to pwzURI. + * dwFlags [I] The flags which will be passed to CreateUri. + * dwReserved [I] Reserved (not used). + * ppURI [O] The resulting IUri after parsing/canonicalization. + * + * RETURNS + * Success: S_OK. ppURI contains the pointer to the newly allocated IUri. + * Failure: E_INVALIDARG if pwzURI already contains a fragment and pwzFragment + * isn't NULL. Will also return E_INVALIDARG for the same reasons as + * CreateUri will. E_OUTOFMEMORY if any allocations fail. + */ +HRESULT WINAPI CreateUriWithFragment(LPCWSTR pwzURI, LPCWSTR pwzFragment, DWORD dwFlags, + DWORD_PTR dwReserved, IUri **ppURI) +{ + HRESULT hres; + TRACE("(%s %s %x %x %p)\n", debugstr_w(pwzURI), debugstr_w(pwzFragment), dwFlags, (DWORD)dwReserved, ppURI); + + if(!ppURI) + return E_INVALIDARG; + + if(!pwzURI) { + *ppURI = NULL; + return E_INVALIDARG; + } + + /* Check if a fragment should be appended to the URI string. */ + if(pwzFragment) { + WCHAR *uriW; + DWORD uri_len, frag_len; + BOOL add_pound; + + /* Check if the original URI already has a fragment component. */ + if(StrChrW(pwzURI, '#')) { + *ppURI = NULL; + return E_INVALIDARG; + } + + uri_len = lstrlenW(pwzURI); + frag_len = lstrlenW(pwzFragment); + + /* If the fragment doesn't start with a '#', one will be added. */ + add_pound = *pwzFragment != '#'; + + if(add_pound) + uriW = heap_alloc((uri_len+frag_len+2)*sizeof(WCHAR)); + else + uriW = heap_alloc((uri_len+frag_len+1)*sizeof(WCHAR)); + + if(!uriW) + return E_OUTOFMEMORY; + + memcpy(uriW, pwzURI, uri_len*sizeof(WCHAR)); + if(add_pound) + uriW[uri_len++] = '#'; + memcpy(uriW+uri_len, pwzFragment, (frag_len+1)*sizeof(WCHAR)); + + hres = CreateUri(uriW, dwFlags, 0, ppURI); + + heap_free(uriW); + } else + /* A fragment string wasn't specified, so just forward the call. */ + hres = CreateUri(pwzURI, dwFlags, 0, ppURI); + + return hres; +} + #define URIBUILDER_THIS(iface) DEFINE_THIS(UriBuilder, IUriBuilder, iface) static HRESULT WINAPI UriBuilder_QueryInterface(IUriBuilder *iface, REFIID riid, void **ppv) @@ -1786,8 +4947,17 @@ static ULONG WINAPI UriBuilder_Release(IUriBuilder *iface) TRACE("(%p) ref=%d\n", This, ref); - if(!ref) + if(!ref) { + if(This->uri) IUri_Release(URI(This->uri)); + heap_free(This->fragment); + heap_free(This->host); + heap_free(This->password); + heap_free(This->path); + heap_free(This->query); + heap_free(This->scheme); + heap_free(This->username); heap_free(This); + } return ref; } @@ -1798,8 +4968,13 @@ static HRESULT WINAPI UriBuilder_CreateUriSimple(IUriBuilder *iface, IUri **ppIUri) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%d %d %p)\n", This, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); - return E_NOTIMPL; + HRESULT hr; + TRACE("(%p)->(%d %d %p)\n", This, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); + + hr = build_uri(This, ppIUri, 0, UriBuilder_USE_ORIGINAL_FLAGS, dwAllowEncodingPropertyMask); + if(hr == E_NOTIMPL) + FIXME("(%p)->(%d %d %p)\n", This, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); + return hr; } static HRESULT WINAPI UriBuilder_CreateUri(IUriBuilder *iface, @@ -1809,8 +4984,17 @@ static HRESULT WINAPI UriBuilder_CreateUri(IUriBuilder *iface, IUri **ppIUri) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(0x%08x %d %d %p)\n", This, dwCreateFlags, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); - return E_NOTIMPL; + HRESULT hr; + TRACE("(%p)->(0x%08x %d %d %p)\n", This, dwCreateFlags, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); + + if(dwCreateFlags == -1) + hr = build_uri(This, ppIUri, 0, UriBuilder_USE_ORIGINAL_FLAGS, dwAllowEncodingPropertyMask); + else + hr = build_uri(This, ppIUri, dwCreateFlags, 0, dwAllowEncodingPropertyMask); + + if(hr == E_NOTIMPL) + FIXME("(%p)->(0x%08x %d %d %p)\n", This, dwCreateFlags, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); + return hr; } static HRESULT WINAPI UriBuilder_CreateUriWithFlags(IUriBuilder *iface, @@ -1821,149 +5005,317 @@ static HRESULT WINAPI UriBuilder_CreateUriWithFlags(IUriBuilder *iface, IUri **ppIUri) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(0x%08x 0x%08x %d %d %p)\n", This, dwCreateFlags, dwUriBuilderFlags, + HRESULT hr; + TRACE("(%p)->(0x%08x 0x%08x %d %d %p)\n", This, dwCreateFlags, dwUriBuilderFlags, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); - return E_NOTIMPL; + + hr = build_uri(This, ppIUri, dwCreateFlags, dwUriBuilderFlags, dwAllowEncodingPropertyMask); + if(hr == E_NOTIMPL) + FIXME("(%p)->(0x%08x 0x%08x %d %d %p)\n", This, dwCreateFlags, dwUriBuilderFlags, + dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); + return hr; } static HRESULT WINAPI UriBuilder_GetIUri(IUriBuilder *iface, IUri **ppIUri) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%p)\n", This, ppIUri); - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", This, ppIUri); + + if(!ppIUri) + return E_POINTER; + + if(This->uri) { + IUri *uri = URI(This->uri); + IUri_AddRef(uri); + *ppIUri = uri; + } else + *ppIUri = NULL; + + return S_OK; } static HRESULT WINAPI UriBuilder_SetIUri(IUriBuilder *iface, IUri *pIUri) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%p)\n", This, pIUri); - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", This, pIUri); + + if(pIUri) { + Uri *uri; + + if((uri = get_uri_obj(pIUri))) { + /* Only reset the builder if it's Uri isn't the same as + * the Uri passed to the function. + */ + if(This->uri != uri) { + reset_builder(This); + + This->uri = uri; + if(uri->has_port) + This->port = uri->port; + + IUri_AddRef(pIUri); + } + } else { + FIXME("(%p)->(%p) Unknown IUri types not supported yet.\n", This, pIUri); + return E_NOTIMPL; + } + } else if(This->uri) + /* Only reset the builder if it's Uri isn't NULL. */ + reset_builder(This); + + return S_OK; } static HRESULT WINAPI UriBuilder_GetFragment(IUriBuilder *iface, DWORD *pcchFragment, LPCWSTR *ppwzFragment) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%p %p)\n", This, pcchFragment, ppwzFragment); - return E_NOTIMPL; + TRACE("(%p)->(%p %p)\n", This, pcchFragment, ppwzFragment); + + if(!This->uri || This->uri->fragment_start == -1 || This->modified_props & Uri_HAS_FRAGMENT) + return get_builder_component(&This->fragment, &This->fragment_len, NULL, 0, ppwzFragment, pcchFragment); + else + return get_builder_component(&This->fragment, &This->fragment_len, This->uri->canon_uri+This->uri->fragment_start, + This->uri->fragment_len, ppwzFragment, pcchFragment); } static HRESULT WINAPI UriBuilder_GetHost(IUriBuilder *iface, DWORD *pcchHost, LPCWSTR *ppwzHost) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%p %p)\n", This, pcchHost, ppwzHost); - return E_NOTIMPL; + TRACE("(%p)->(%p %p)\n", This, pcchHost, ppwzHost); + + if(!This->uri || This->uri->host_start == -1 || This->modified_props & Uri_HAS_HOST) + return get_builder_component(&This->host, &This->host_len, NULL, 0, ppwzHost, pcchHost); + else { + if(This->uri->host_type == Uri_HOST_IPV6) + /* Don't include the '[' and ']' around the address. */ + return get_builder_component(&This->host, &This->host_len, This->uri->canon_uri+This->uri->host_start+1, + This->uri->host_len-2, ppwzHost, pcchHost); + else + return get_builder_component(&This->host, &This->host_len, This->uri->canon_uri+This->uri->host_start, + This->uri->host_len, ppwzHost, pcchHost); + } } static HRESULT WINAPI UriBuilder_GetPassword(IUriBuilder *iface, DWORD *pcchPassword, LPCWSTR *ppwzPassword) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%p %p)\n", This, pcchPassword, ppwzPassword); - return E_NOTIMPL; + TRACE("(%p)->(%p %p)\n", This, pcchPassword, ppwzPassword); + + if(!This->uri || This->uri->userinfo_split == -1 || This->modified_props & Uri_HAS_PASSWORD) + return get_builder_component(&This->password, &This->password_len, NULL, 0, ppwzPassword, pcchPassword); + else { + const WCHAR *start = This->uri->canon_uri+This->uri->userinfo_start+This->uri->userinfo_split+1; + DWORD len = This->uri->userinfo_len-This->uri->userinfo_split-1; + return get_builder_component(&This->password, &This->password_len, start, len, ppwzPassword, pcchPassword); + } } static HRESULT WINAPI UriBuilder_GetPath(IUriBuilder *iface, DWORD *pcchPath, LPCWSTR *ppwzPath) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%p %p)\n", This, pcchPath, ppwzPath); - return E_NOTIMPL; + TRACE("(%p)->(%p %p)\n", This, pcchPath, ppwzPath); + + if(!This->uri || This->uri->path_start == -1 || This->modified_props & Uri_HAS_PATH) + return get_builder_component(&This->path, &This->path_len, NULL, 0, ppwzPath, pcchPath); + else + return get_builder_component(&This->path, &This->path_len, This->uri->canon_uri+This->uri->path_start, + This->uri->path_len, ppwzPath, pcchPath); } static HRESULT WINAPI UriBuilder_GetPort(IUriBuilder *iface, BOOL *pfHasPort, DWORD *pdwPort) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%p %p)\n", This, pfHasPort, pdwPort); - return E_NOTIMPL; + TRACE("(%p)->(%p %p)\n", This, pfHasPort, pdwPort); + + if(!pfHasPort) { + if(pdwPort) + *pdwPort = 0; + return E_POINTER; + } + + if(!pdwPort) { + *pfHasPort = FALSE; + return E_POINTER; + } + + *pfHasPort = This->has_port; + *pdwPort = This->port; + return S_OK; } static HRESULT WINAPI UriBuilder_GetQuery(IUriBuilder *iface, DWORD *pcchQuery, LPCWSTR *ppwzQuery) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%p %p)\n", This, pcchQuery, ppwzQuery); - return E_NOTIMPL; + TRACE("(%p)->(%p %p)\n", This, pcchQuery, ppwzQuery); + + if(!This->uri || This->uri->query_start == -1 || This->modified_props & Uri_HAS_QUERY) + return get_builder_component(&This->query, &This->query_len, NULL, 0, ppwzQuery, pcchQuery); + else + return get_builder_component(&This->query, &This->query_len, This->uri->canon_uri+This->uri->query_start, + This->uri->query_len, ppwzQuery, pcchQuery); } static HRESULT WINAPI UriBuilder_GetSchemeName(IUriBuilder *iface, DWORD *pcchSchemeName, LPCWSTR *ppwzSchemeName) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%p %p)\n", This, pcchSchemeName, ppwzSchemeName); - return E_NOTIMPL; + TRACE("(%p)->(%p %p)\n", This, pcchSchemeName, ppwzSchemeName); + + if(!This->uri || This->uri->scheme_start == -1 || This->modified_props & Uri_HAS_SCHEME_NAME) + return get_builder_component(&This->scheme, &This->scheme_len, NULL, 0, ppwzSchemeName, pcchSchemeName); + else + return get_builder_component(&This->scheme, &This->scheme_len, This->uri->canon_uri+This->uri->scheme_start, + This->uri->scheme_len, ppwzSchemeName, pcchSchemeName); } static HRESULT WINAPI UriBuilder_GetUserName(IUriBuilder *iface, DWORD *pcchUserName, LPCWSTR *ppwzUserName) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%p %p)\n", This, pcchUserName, ppwzUserName); - return E_NOTIMPL; + TRACE("(%p)->(%p %p)\n", This, pcchUserName, ppwzUserName); + + if(!This->uri || This->uri->userinfo_start == -1 || This->uri->userinfo_split == 0 || + This->modified_props & Uri_HAS_USER_NAME) + return get_builder_component(&This->username, &This->username_len, NULL, 0, ppwzUserName, pcchUserName); + else { + const WCHAR *start = This->uri->canon_uri+This->uri->userinfo_start; + + /* Check if there's a password in the userinfo section. */ + if(This->uri->userinfo_split > -1) + /* Don't include the password. */ + return get_builder_component(&This->username, &This->username_len, start, + This->uri->userinfo_split, ppwzUserName, pcchUserName); + else + return get_builder_component(&This->username, &This->username_len, start, + This->uri->userinfo_len, ppwzUserName, pcchUserName); + } } static HRESULT WINAPI UriBuilder_SetFragment(IUriBuilder *iface, LPCWSTR pwzNewValue) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); - return E_NOTIMPL; + TRACE("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + return set_builder_component(&This->fragment, &This->fragment_len, pwzNewValue, '#', + &This->modified_props, Uri_HAS_FRAGMENT); } static HRESULT WINAPI UriBuilder_SetHost(IUriBuilder *iface, LPCWSTR pwzNewValue) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); - return E_NOTIMPL; + TRACE("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + + /* Host name can't be set to NULL. */ + if(!pwzNewValue) + return E_INVALIDARG; + + return set_builder_component(&This->host, &This->host_len, pwzNewValue, 0, + &This->modified_props, Uri_HAS_HOST); } static HRESULT WINAPI UriBuilder_SetPassword(IUriBuilder *iface, LPCWSTR pwzNewValue) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); - return E_NOTIMPL; + TRACE("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + return set_builder_component(&This->password, &This->password_len, pwzNewValue, 0, + &This->modified_props, Uri_HAS_PASSWORD); } static HRESULT WINAPI UriBuilder_SetPath(IUriBuilder *iface, LPCWSTR pwzNewValue) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); - return E_NOTIMPL; + TRACE("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + return set_builder_component(&This->path, &This->path_len, pwzNewValue, 0, + &This->modified_props, Uri_HAS_PATH); } static HRESULT WINAPI UriBuilder_SetPort(IUriBuilder *iface, BOOL fHasPort, DWORD dwNewValue) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%d %d)\n", This, fHasPort, dwNewValue); - return E_NOTIMPL; + TRACE("(%p)->(%d %d)\n", This, fHasPort, dwNewValue); + + This->has_port = fHasPort; + This->port = dwNewValue; + This->modified_props |= Uri_HAS_PORT; + return S_OK; } static HRESULT WINAPI UriBuilder_SetQuery(IUriBuilder *iface, LPCWSTR pwzNewValue) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); - return E_NOTIMPL; + TRACE("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + return set_builder_component(&This->query, &This->query_len, pwzNewValue, '?', + &This->modified_props, Uri_HAS_QUERY); } static HRESULT WINAPI UriBuilder_SetSchemeName(IUriBuilder *iface, LPCWSTR pwzNewValue) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); - return E_NOTIMPL; + TRACE("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + + /* Only set the scheme name if it's not NULL or empty. */ + if(!pwzNewValue || !*pwzNewValue) + return E_INVALIDARG; + + return set_builder_component(&This->scheme, &This->scheme_len, pwzNewValue, 0, + &This->modified_props, Uri_HAS_SCHEME_NAME); } static HRESULT WINAPI UriBuilder_SetUserName(IUriBuilder *iface, LPCWSTR pwzNewValue) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); - return E_NOTIMPL; + TRACE("(%p)->(%s)\n", This, debugstr_w(pwzNewValue)); + return set_builder_component(&This->username, &This->username_len, pwzNewValue, 0, + &This->modified_props, Uri_HAS_USER_NAME); } static HRESULT WINAPI UriBuilder_RemoveProperties(IUriBuilder *iface, DWORD dwPropertyMask) { + const DWORD accepted_flags = Uri_HAS_AUTHORITY|Uri_HAS_DOMAIN|Uri_HAS_EXTENSION|Uri_HAS_FRAGMENT|Uri_HAS_HOST| + Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_QUERY| + Uri_HAS_USER_INFO|Uri_HAS_USER_NAME; + UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(0x%08x)\n", This, dwPropertyMask); - return E_NOTIMPL; + TRACE("(%p)->(0x%08x)\n", This, dwPropertyMask); + + if(dwPropertyMask & ~accepted_flags) + return E_INVALIDARG; + + if(dwPropertyMask & Uri_HAS_FRAGMENT) + UriBuilder_SetFragment(iface, NULL); + + /* Even though you can't set the host name to NULL or an + * empty string, you can still remove it... for some reason. + */ + if(dwPropertyMask & Uri_HAS_HOST) + set_builder_component(&This->host, &This->host_len, NULL, 0, + &This->modified_props, Uri_HAS_HOST); + + if(dwPropertyMask & Uri_HAS_PASSWORD) + UriBuilder_SetPassword(iface, NULL); + + if(dwPropertyMask & Uri_HAS_PATH) + UriBuilder_SetPath(iface, NULL); + + if(dwPropertyMask & Uri_HAS_PORT) + UriBuilder_SetPort(iface, FALSE, 0); + + if(dwPropertyMask & Uri_HAS_QUERY) + UriBuilder_SetQuery(iface, NULL); + + if(dwPropertyMask & Uri_HAS_USER_NAME) + UriBuilder_SetUserName(iface, NULL); + + return S_OK; } static HRESULT WINAPI UriBuilder_HasBeenModified(IUriBuilder *iface, BOOL *pfModified) { UriBuilder *This = URIBUILDER_THIS(iface); - FIXME("(%p)->(%p)\n", This, pfModified); - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", This, pfModified); + + if(!pfModified) + return E_POINTER; + + *pfModified = This->modified_props > 0; + return S_OK; } #undef URIBUILDER_THIS @@ -2006,13 +5358,36 @@ HRESULT WINAPI CreateIUriBuilder(IUri *pIUri, DWORD dwFlags, DWORD_PTR dwReserve TRACE("(%p %x %x %p)\n", pIUri, dwFlags, (DWORD)dwReserved, ppIUriBuilder); - ret = heap_alloc(sizeof(UriBuilder)); + if(!ppIUriBuilder) + return E_POINTER; + + ret = heap_alloc_zero(sizeof(UriBuilder)); if(!ret) return E_OUTOFMEMORY; ret->lpIUriBuilderVtbl = &UriBuilderVtbl; ret->ref = 1; + if(pIUri) { + Uri *uri; + + if((uri = get_uri_obj(pIUri))) { + IUri_AddRef(pIUri); + ret->uri = uri; + + if(uri->has_port) + /* Windows doesn't set 'has_port' to TRUE in this case. */ + ret->port = uri->port; + + } else { + heap_free(ret); + *ppIUriBuilder = NULL; + FIXME("(%p %x %x %p): Unknown IUri types not supported yet.\n", pIUri, dwFlags, + (DWORD)dwReserved, ppIUriBuilder); + return E_NOTIMPL; + } + } + *ppIUriBuilder = URIBUILDER(ret); return S_OK; } diff --git a/dll/win32/urlmon/urlmon.spec b/dll/win32/urlmon/urlmon.spec index e79850c4f19..61093850d24 100644 --- a/dll/win32/urlmon/urlmon.spec +++ b/dll/win32/urlmon/urlmon.spec @@ -29,6 +29,7 @@ @ stdcall CreateFormatEnumerator(long ptr ptr) @ stdcall CreateIUriBuilder(ptr long long ptr) @ stdcall CreateUri(wstr long long ptr) +@ stdcall CreateUriWithFragment(wstr wstr long long ptr) @ stdcall CreateURLMoniker(ptr wstr ptr) @ stdcall CreateURLMonikerEx(ptr wstr ptr long) @ stdcall -private DllCanUnloadNow() diff --git a/dll/win32/urlmon/urlmon_main.h b/dll/win32/urlmon/urlmon_main.h index 071af8dd73e..3aada09ce60 100644 --- a/dll/win32/urlmon/urlmon_main.h +++ b/dll/win32/urlmon/urlmon_main.h @@ -78,7 +78,7 @@ HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv); HRESULT bind_to_object(IMoniker *mon, LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv); HRESULT create_binding_protocol(LPCWSTR url, BOOL from_urlmon, IInternetProtocol **protocol); -void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink); +void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink, IInternetBindInfo *bind_info); IWinInetInfo *get_wininet_info(IInternetProtocol*); typedef struct ProtocolVtbl ProtocolVtbl; @@ -105,12 +105,12 @@ typedef struct { } Protocol; struct ProtocolVtbl { - HRESULT (*open_request)(Protocol*,LPCWSTR,DWORD,HINTERNET,IInternetBindInfo*); + HRESULT (*open_request)(Protocol*,IUri*,DWORD,HINTERNET,IInternetBindInfo*); HRESULT (*start_downloading)(Protocol*); void (*close_connection)(Protocol*); }; -HRESULT protocol_start(Protocol*,IInternetProtocol*,LPCWSTR,IInternetProtocolSink*,IInternetBindInfo*); +HRESULT protocol_start(Protocol*,IInternetProtocol*,IUri*,IInternetProtocolSink*,IInternetBindInfo*); HRESULT protocol_continue(Protocol*,PROTOCOLDATA*); HRESULT protocol_read(Protocol*,void*,ULONG,ULONG*); HRESULT protocol_lock_request(Protocol*); diff --git a/dll/win32/user32/misc/misc.c b/dll/win32/user32/misc/misc.c index e71c7a3c06f..76aaf462a31 100644 --- a/dll/win32/user32/misc/misc.c +++ b/dll/win32/user32/misc/misc.c @@ -35,17 +35,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(user32); /* FUNCTIONS *****************************************************************/ -/* - * Private calls for CSRSS - */ -VOID -WINAPI -PrivateCsrssManualGuiCheck(LONG Check) -{ - NtUserCallOneParam(Check, ONEPARAM_ROUTINE_CSRSS_GUICHECK); -} - - /* * @implemented */ @@ -315,7 +304,7 @@ GetUser32Handle(HANDLE handle) static const BOOL g_ObjectHeapTypeShared[VALIDATE_TYPE_EVENT + 1] = { FALSE, /* VALIDATE_TYPE_FREE (not used) */ - TRUE, /* VALIDATE_TYPE_WIN FALSE */ + FALSE, /* VALIDATE_TYPE_WIN FALSE */ TRUE, /* VALIDATE_TYPE_MENU FALSE */ TRUE, /* VALIDATE_TYPE_CURSOR */ TRUE, /* VALIDATE_TYPE_MWPOS */ @@ -438,12 +427,6 @@ ValidateCallProc(HANDLE hCallProc) return NULL; } -// HACK HACK HACK! -typedef struct _WNDX -{ - THRDESKHEAD head; - PWND pWnd; -} WNDX, *PWNDX; // // Validate a window handle and return the pointer to the object. @@ -458,24 +441,12 @@ ValidateHwnd(HWND hwnd) /* See if the window is cached */ if (hwnd == ClientInfo->CallbackWnd.hWnd) - return ClientInfo->CallbackWnd.pvWnd; + return ClientInfo->CallbackWnd.pWnd; Wnd = ValidateHandle((HANDLE)hwnd, VALIDATE_TYPE_WIN); if (Wnd != NULL) { -#if 0 return Wnd; -#else - /* HACK HACK HACK! This needs to be done until WINDOW_OBJECT is completely - superseded by the WINDOW structure. We *ASSUME* a pointer to the WINDOW - structure to be at the beginning of the WINDOW_OBJECT structure!!! - - !!! REMOVE AS SOON AS WINDOW_OBJECT NO LONGER EXISTS !!! - */ - - if ( ((PWNDX)Wnd)->pWnd != NULL) - return DesktopPtrToUser( ((PWNDX)Wnd)->pWnd ); -#endif } return NULL; @@ -494,24 +465,12 @@ ValidateHwndNoErr(HWND hwnd) /* See if the window is cached */ if (hwnd == ClientInfo->CallbackWnd.hWnd) - return ClientInfo->CallbackWnd.pvWnd; + return ClientInfo->CallbackWnd.pWnd; Wnd = ValidateHandleNoErr((HANDLE)hwnd, VALIDATE_TYPE_WIN); if (Wnd != NULL) { -#if 0 return Wnd; -#else - /* HACK HACK HACK! This needs to be done until WINDOW_OBJECT is completely - superseded by the WINDOW structure. We *ASSUME* a pointer to the WINDOW - structure to be at the beginning of the WINDOW_OBJECT structure!!! - - !!! REMOVE AS SOON AS WINDOW_OBJECT NO LONGER EXISTS !!! - */ - - if ( ((PWNDX)Wnd)->pWnd != NULL) - return DesktopPtrToUser( ((PWNDX)Wnd)->pWnd ); -#endif } return NULL; diff --git a/dll/win32/user32/misc/stubs.c b/dll/win32/user32/misc/stubs.c index 13697c526d7..354b5d3f31c 100644 --- a/dll/win32/user32/misc/stubs.c +++ b/dll/win32/user32/misc/stubs.c @@ -538,12 +538,11 @@ BOOL WINAPI CliImmSetHotKey(DWORD dwID, UINT uModifiers, UINT uVirtualKey, HKL h } /* - * @unimplemented + * @implemented */ DWORD WINAPI GetMenuIndex(HMENU hMenu, HMENU hSubMenu) { - UNIMPLEMENTED; - return 0; + return NtUserGetMenuIndex(hMenu, hSubMenu); } /* diff --git a/dll/win32/user32/user32.def b/dll/win32/user32/user32.def index becf4c4d905..c65d29d2dd2 100644 --- a/dll/win32/user32/user32.def +++ b/dll/win32/user32/user32.def @@ -731,5 +731,4 @@ EXPORTS wsprintfW wvsprintfA wvsprintfW - PrivateCsrssManualGuiCheck SetProcessDPIAware diff --git a/dll/win32/user32/user32.pspec b/dll/win32/user32/user32.pspec index 8170f9c5f82..603a025bf0d 100644 --- a/dll/win32/user32/user32.pspec +++ b/dll/win32/user32/user32.pspec @@ -748,9 +748,6 @@ @ stdcall wvsprintfA(ptr str ptr) @ stdcall wvsprintfW(ptr wstr ptr) -; ROS specific exports -@ stdcall PrivateCsrssManualGuiCheck(long) - ; Functions exported by Win Vista @ stdcall SetProcessDPIAware() diff --git a/dll/win32/user32/windows/class.c b/dll/win32/user32/windows/class.c index cf45f184e14..d55d29c913a 100644 --- a/dll/win32/user32/windows/class.c +++ b/dll/win32/user32/windows/class.c @@ -32,8 +32,11 @@ GetClassInfoExA( IS_ATOM(lpszClass) ? lpszClass : 0, lpwcx); - //HACKHACK: This is ROS-specific and should go away - lpwcx->cbSize = sizeof(*lpwcx); + if (!lpwcx) + { + SetLastError( ERROR_NOACCESS ); + return FALSE; + } if (hInstance == User32Instance) { @@ -105,8 +108,14 @@ GetClassInfoExW( IS_ATOM(lpszClass) ? lpszClass : 0, lpwcx); - //HACKHACK: This is ROS-specific and should go away - lpwcx->cbSize = sizeof(*lpwcx); + /* From wine, for speed only, ReactOS supports the correct return in + * Win32k. cbSize is ignored. + */ + if (!lpwcx) + { + SetLastError( ERROR_NOACCESS ); + return FALSE; + } if (hInstance == User32Instance) { diff --git a/dll/win32/user32/windows/dialog.c b/dll/win32/user32/windows/dialog.c index 2e812fc5f97..c1a219efcd9 100644 --- a/dll/win32/user32/windows/dialog.c +++ b/dll/win32/user32/windows/dialog.c @@ -270,7 +270,7 @@ static const WORD *DIALOG_GetControl32( const WORD *p, DLG_CONTROL_INFO *info, else { info->className = (LPCWSTR)p; - p += wcslen( info->className ) + 1; + p += strlenW( info->className ) + 1; } if (GET_WORD(p) == 0xffff) /* Is it an integer id? */ @@ -292,7 +292,7 @@ static const WORD *DIALOG_GetControl32( const WORD *p, DLG_CONTROL_INFO *info, { info->windowName = (LPCWSTR)p; info->windowNameFree = FALSE; - p += wcslen( info->windowName ) + 1; + p += strlenW( info->windowName ) + 1; } if (GET_WORD(p)) @@ -431,7 +431,8 @@ static HWND DIALOG_FindMsgDestination( HWND hwndDlg ) if (!IsWindow(hParent)) break; pWnd = ValidateHwnd(hParent); - if (!pWnd) break; + // FIXME: Use pWnd->fnid == FNID_DESKTOP + if (!pWnd || hParent == GetDesktopWindow()) break; if (!(pWnd->state & WNDS_DIALOGWINDOW)) { @@ -473,8 +474,7 @@ static BOOL DIALOG_IsAccelerator( HWND hwnd, HWND hwndDlg, WPARAM wParam ) while (p != NULL && p[1] == '&'); /* and check if it's the one we're looking for */ - /* FIXME: usage of towupper correct? */ - if (p != NULL && towupper( p[1] ) == towupper( wParam ) ) + if (p != NULL && toupperW( p[1] ) == toupperW( wParam ) ) { if ((dlgCode & DLGC_STATIC) || (style & 0x0f) == BS_GROUPBOX ) { @@ -623,7 +623,7 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result ) break; default: result->menuName = (LPCWSTR)p; - p += wcslen( result->menuName ) + 1; + p += strlenW( result->menuName ) + 1; break; } @@ -641,14 +641,14 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result ) break; default: result->className = (LPCWSTR)p; - p += wcslen( result->className ) + 1; + p += strlenW( result->className ) + 1; break; } /* Get the window caption */ result->caption = (LPCWSTR)p; - p += wcslen( result->caption ) + 1; + p += strlenW( result->caption ) + 1; /* Get the font name */ @@ -682,7 +682,7 @@ static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result ) result->italic = LOBYTE(GET_WORD(p)); p++; } result->faceName = (LPCWSTR)p; - p += wcslen( result->faceName ) + 1; + p += strlenW( result->faceName ) + 1; } } @@ -956,7 +956,6 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate, dlgInfo->yBaseUnit = yBaseUnit; dlgInfo->idResult = IDOK; dlgInfo->flags = flags; - /* dlgInfo->hDialogHeap = 0; */ if (template.helpId) SetWindowContextHelpId( hwnd, template.helpId ); @@ -1134,12 +1133,6 @@ static LRESULT DEFDLG_Proc( HWND hwnd, UINT msg, WPARAM wParam, //// ReactOS if ((dlgInfo = (DIALOGINFO *)SetWindowLongPtrW( hwnd, DWLP_ROS_DIALOGINFO, 0 ))) { - /* Free dialog heap (if created) */ - /*if (dlgInfo->hDialogHeap) - { - GlobalUnlock16(dlgInfo->hDialogHeap); - GlobalFree16(dlgInfo->hDialogHeap); - }*/ if (dlgInfo->hUserFont) DeleteObject( dlgInfo->hUserFont ); if (dlgInfo->hMenu) DestroyMenu( dlgInfo->hMenu ); HeapFree( GetProcessHeap(), 0, dlgInfo ); @@ -2327,14 +2320,12 @@ IsDialogMessageW( HWND hDlg, LPMSG lpMsg) { - INT dlgCode = 0; + INT dlgCode = 0; - // FIXME: hooks - if (CallMsgFilterW( lpMsg, MSGF_DIALOGBOX )) return TRUE; - - if ((hDlg != lpMsg->hwnd) && !IsChild( hDlg, lpMsg->hwnd )) return FALSE; + if (CallMsgFilterW( lpMsg, MSGF_DIALOGBOX )) return TRUE; if (hDlg == GetDesktopWindow()) return FALSE; + if ((hDlg != lpMsg->hwnd) && !IsChild( hDlg, lpMsg->hwnd )) return FALSE; hDlg = DIALOG_FindMsgDestination(hDlg); @@ -2380,7 +2371,7 @@ IsDialogMessageW( { INT length; SendMessageW (hwndNext, WM_GETTEXT, maxlen, (LPARAM) buffer); - length = wcslen (buffer); + length = strlenW (buffer); HeapFree (GetProcessHeap(), 0, buffer); SendMessageW (hwndNext, EM_SETSEL, 0, length); } @@ -2425,11 +2416,8 @@ IsDialogMessageW( else if (DC_HASDEFID == HIWORD(dw = SendMessageW (hDlg, DM_GETDEFID, 0, 0))) { HWND hwndDef = GetDlgItem(hDlg, LOWORD(dw)); - if (!hwndDef || !IsWindowEnabled(hwndDef)) - return TRUE; - - SendMessageW( hDlg, WM_COMMAND, MAKEWPARAM( LOWORD(dw), BN_CLICKED ), - (LPARAM)GetDlgItem(hDlg, LOWORD(dw))); + if (hwndDef ? IsWindowEnabled(hwndDef) : LOWORD(dw)==IDOK) + SendMessageW( hDlg, WM_COMMAND, MAKEWPARAM( LOWORD(dw), BN_CLICKED ), (LPARAM)hwndDef); } else { @@ -2442,6 +2430,9 @@ IsDialogMessageW( break; case WM_CHAR: + /* FIXME Under what circumstances does WM_GETDLGCODE get sent? + * It does NOT get sent in the test program I have + */ dlgCode = SendMessageW( lpMsg->hwnd, WM_GETDLGCODE, lpMsg->wParam, (LPARAM)lpMsg ); if (dlgCode & (DLGC_WANTCHARS|DLGC_WANTMESSAGE)) break; if (lpMsg->wParam == '\t' && (dlgCode & DLGC_WANTTAB)) break; @@ -2454,7 +2445,7 @@ IsDialogMessageW( return TRUE; } break; - +//// ReactOS case WM_SYSKEYDOWN: /* If the ALT key is being pressed display the keyboard cues */ if (lpMsg->lParam & (1 << 29)) diff --git a/dll/win32/user32/windows/message.c b/dll/win32/user32/windows/message.c index 5a045b1aade..2c89b7863df 100644 --- a/dll/win32/user32/windows/message.c +++ b/dll/win32/user32/windows/message.c @@ -2624,7 +2624,7 @@ User32CallWindowProcFromKernel(PVOID Arguments, ULONG ArgumentLength) } if (pci->CallbackWnd.hWnd == UMMsg.hwnd) - pWnd = pci->CallbackWnd.pvWnd; + pWnd = pci->CallbackWnd.pWnd; CallbackArgs->Result = IntCallWindowProcW( CallbackArgs->IsAnsiProc, CallbackArgs->Proc, diff --git a/dll/win32/wdmaud.drv/legacy.c b/dll/win32/wdmaud.drv/legacy.c index d569d0ba00c..cce93e8994a 100644 --- a/dll/win32/wdmaud.drv/legacy.c +++ b/dll/win32/wdmaud.drv/legacy.c @@ -282,6 +282,25 @@ WdmAudCloseSoundDeviceByLegacy( /* First stop the stream */ if (DeviceType != MIXER_DEVICE_TYPE) { + DeviceInfo.u.State = KSSTATE_PAUSE; + SyncOverlappedDeviceIoControl(KernelHandle, + IOCTL_SETDEVICE_STATE, + (LPVOID) &DeviceInfo, + sizeof(WDMAUD_DEVICE_INFO), + (LPVOID) &DeviceInfo, + sizeof(WDMAUD_DEVICE_INFO), + NULL); + + DeviceInfo.u.State = KSSTATE_ACQUIRE; + SyncOverlappedDeviceIoControl(KernelHandle, + IOCTL_SETDEVICE_STATE, + (LPVOID) &DeviceInfo, + sizeof(WDMAUD_DEVICE_INFO), + (LPVOID) &DeviceInfo, + sizeof(WDMAUD_DEVICE_INFO), + NULL); + + DeviceInfo.u.State = KSSTATE_STOP; SyncOverlappedDeviceIoControl(KernelHandle, IOCTL_SETDEVICE_STATE, diff --git a/dll/win32/winhttp/CMakeLists.txt b/dll/win32/winhttp/CMakeLists.txt index 7cc6e9eddcf..d668f706efe 100644 --- a/dll/win32/winhttp/CMakeLists.txt +++ b/dll/win32/winhttp/CMakeLists.txt @@ -19,6 +19,6 @@ target_link_libraries(winhttp ${CMAKE_CURRENT_BINARY_DIR}/winhttp.def wine) -add_importlibs(winhttp shlwapi wininet ws2_32 msvcrt kernel32 ntdll) +add_importlibs(winhttp shlwapi wininet ws2_32 msvcrt crypt32 advapi32 kernel32 ntdll) add_dependencies(winhttp winhttp_def) add_livecd_target(winhttp reactos/system32) diff --git a/dll/win32/winhttp/cookie.c b/dll/win32/winhttp/cookie.c index 6c0f8b448e5..af881ea2915 100644 --- a/dll/win32/winhttp/cookie.c +++ b/dll/win32/winhttp/cookie.c @@ -39,7 +39,7 @@ static domain_t *add_domain( session_t *session, WCHAR *name ) list_init( &domain->entry ); list_init( &domain->cookies ); - domain->name = name; + domain->name = strdupW( name ); list_add_tail( &session->cookie_cache, &domain->entry ); TRACE("%s\n", debugstr_w(domain->name)); @@ -120,7 +120,7 @@ static BOOL add_cookie( session_t *session, cookie_t *cookie, WCHAR *domain_name } else if ((old_cookie = find_cookie( domain, path, cookie->name ))) delete_cookie( old_cookie ); - cookie->path = path; + cookie->path = strdupW( path ); list_add_tail( &domain->cookies, &cookie->entry ); TRACE("domain %s path %s <- %s=%s\n", debugstr_w(domain_name), debugstr_w(cookie->path), @@ -230,12 +230,9 @@ BOOL set_cookies( request_t *request, const WCHAR *cookies ) ret = add_cookie( session, cookie, cookie_domain, cookie_path ); end: - if (!ret) - { - free_cookie( cookie ); - heap_free( cookie_domain ); - heap_free( cookie_path ); - } + if (!ret) free_cookie( cookie ); + heap_free( cookie_domain ); + heap_free( cookie_path ); heap_free( buffer ); return ret; } diff --git a/dll/win32/winhttp/inet_ntop.c b/dll/win32/winhttp/inet_ntop.c index f29d46d1625..3ed42ef6bb0 100644 --- a/dll/win32/winhttp/inet_ntop.c +++ b/dll/win32/winhttp/inet_ntop.c @@ -16,8 +16,7 @@ * SOFTWARE. */ -#define ENOSPC 28 -#define EAFNOSUPPORT 52 +#include #ifndef IN6ADDRSZ #define IN6ADDRSZ 16 @@ -64,7 +63,7 @@ inet_ntop(int af, const void *src, char *dst, size_t size) return (inet_ntop6(src, dst, size)); #endif default: - errno = EAFNOSUPPORT; + WSASetLastError(WSAEAFNOSUPPORT); return (NULL); } /* NOTREACHED */ @@ -88,7 +87,7 @@ inet_ntop4(const u_char *src, char *dst, size_t size) char tmp[sizeof "255.255.255.255"]; if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) { - errno = ENOSPC; + WSASetLastError(WSAEINVAL); return (NULL); } strcpy(dst, tmp); @@ -182,7 +181,7 @@ inet_ntop6(const u_char *src, char *dst, size_t size) * Check for overflow, copy, and we're done. */ if ((size_t)(tp - tmp) > size) { - errno = ENOSPC; + WSASetLastError(WSAEINVAL); return (NULL); } strcpy(dst, tmp); diff --git a/dll/win32/winhttp/main.c b/dll/win32/winhttp/main.c index c0ac9cbe51b..b1ce75df4b4 100644 --- a/dll/win32/winhttp/main.c +++ b/dll/win32/winhttp/main.c @@ -42,6 +42,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) DisableThreadLibraryCalls(hInstDLL); break; case DLL_PROCESS_DETACH: + netconn_unload(); break; } return TRUE; @@ -61,7 +62,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) */ HRESULT WINAPI DllCanUnloadNow(void) { - FIXME("()\n"); return S_FALSE; } diff --git a/dll/win32/winhttp/net.c b/dll/win32/winhttp/net.c index 897ccbe3e21..d709c311816 100644 --- a/dll/win32/winhttp/net.c +++ b/dll/win32/winhttp/net.c @@ -38,10 +38,13 @@ #endif #ifdef HAVE_OPENSSL_SSL_H # include +# include #undef FAR #undef DSA #endif +#define NONAMELESSUNION + #include "wine/debug.h" #include "wine/library.h" @@ -58,10 +61,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(winhttp); -#define DEFAULT_SEND_TIMEOUT 30 -#define DEFAULT_RECEIVE_TIMEOUT 30 -#define RESPONSE_TIMEOUT 30 - #ifndef HAVE_GETADDRINFO /* critical section to protect non-reentrant gethostbyname() */ @@ -80,17 +79,35 @@ static CRITICAL_SECTION cs_gethostbyname = { &critsect_debug, -1, 0, 0, 0, 0 }; #include +static CRITICAL_SECTION init_ssl_cs; +static CRITICAL_SECTION_DEBUG init_ssl_cs_debug = +{ + 0, 0, &init_ssl_cs, + { &init_ssl_cs_debug.ProcessLocksList, + &init_ssl_cs_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": init_ssl_cs") } +}; +static CRITICAL_SECTION init_ssl_cs = { &init_ssl_cs_debug, -1, 0, 0, 0, 0 }; + static void *libssl_handle; static void *libcrypto_handle; +#if defined(OPENSSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER> 0x1000000) +static const SSL_METHOD *method; +#else static SSL_METHOD *method; +#endif static SSL_CTX *ctx; +static int hostname_idx; +static int error_idx; +static int conn_idx; #define MAKE_FUNCPTR(f) static typeof(f) * p##f MAKE_FUNCPTR( SSL_library_init ); MAKE_FUNCPTR( SSL_load_error_strings ); MAKE_FUNCPTR( SSLv23_method ); +MAKE_FUNCPTR( SSL_CTX_free ); MAKE_FUNCPTR( SSL_CTX_new ); MAKE_FUNCPTR( SSL_new ); MAKE_FUNCPTR( SSL_free ); @@ -99,21 +116,49 @@ MAKE_FUNCPTR( SSL_connect ); MAKE_FUNCPTR( SSL_shutdown ); MAKE_FUNCPTR( SSL_write ); MAKE_FUNCPTR( SSL_read ); -MAKE_FUNCPTR( SSL_get_verify_result ); +MAKE_FUNCPTR( SSL_get_error ); +MAKE_FUNCPTR( SSL_get_ex_new_index ); +MAKE_FUNCPTR( SSL_get_ex_data ); +MAKE_FUNCPTR( SSL_set_ex_data ); +MAKE_FUNCPTR( SSL_get_ex_data_X509_STORE_CTX_idx ); MAKE_FUNCPTR( SSL_get_peer_certificate ); -MAKE_FUNCPTR( SSL_CTX_get_timeout ); -MAKE_FUNCPTR( SSL_CTX_set_timeout ); MAKE_FUNCPTR( SSL_CTX_set_default_verify_paths ); +MAKE_FUNCPTR( SSL_CTX_set_verify ); +MAKE_FUNCPTR( SSL_get_current_cipher ); +MAKE_FUNCPTR( SSL_CIPHER_get_bits ); -MAKE_FUNCPTR( BIO_new_fp ); +MAKE_FUNCPTR( CRYPTO_num_locks ); +MAKE_FUNCPTR( CRYPTO_set_id_callback ); +MAKE_FUNCPTR( CRYPTO_set_locking_callback ); +MAKE_FUNCPTR( ERR_free_strings ); MAKE_FUNCPTR( ERR_get_error ); MAKE_FUNCPTR( ERR_error_string ); +MAKE_FUNCPTR( X509_STORE_CTX_get_ex_data ); MAKE_FUNCPTR( i2d_X509 ); +MAKE_FUNCPTR( sk_value ); +MAKE_FUNCPTR( sk_num ); #undef MAKE_FUNCPTR +static CRITICAL_SECTION *ssl_locks; +static unsigned int num_ssl_locks; + +static unsigned long ssl_thread_id(void) +{ + return GetCurrentThreadId(); +} + +static void ssl_lock_callback(int mode, int type, const char *file, int line) +{ + if (mode & CRYPTO_LOCK) + EnterCriticalSection( &ssl_locks[type] ); + else + LeaveCriticalSection( &ssl_locks[type] ); +} + #endif /* translate a unix error code into a winsock error code */ +#if 0 static int sock_get_error( int err ) { #if !defined(__MINGW32__) && !defined (_MSC_VER) @@ -179,24 +224,222 @@ static int sock_get_error( int err ) #endif return err; } +#else +#define sock_get_error(x) WSAGetLastError() +#endif + +#ifdef SONAME_LIBSSL +static PCCERT_CONTEXT X509_to_cert_context(X509 *cert) +{ + unsigned char *buffer, *p; + int len; + BOOL malloc = FALSE; + PCCERT_CONTEXT ret; + + p = NULL; + if ((len = pi2d_X509( cert, &p )) < 0) return NULL; + /* + * SSL 0.9.7 and above malloc the buffer if it is null. + * however earlier version do not and so we would need to alloc the buffer. + * + * see the i2d_X509 man page for more details. + */ + if (!p) + { + if (!(buffer = heap_alloc( len ))) return NULL; + p = buffer; + len = pi2d_X509( cert, &p ); + } + else + { + buffer = p; + malloc = TRUE; + } + + ret = CertCreateCertificateContext( X509_ASN_ENCODING, buffer, len ); + + if (malloc) free( buffer ); + else heap_free( buffer ); + + return ret; +} + +static DWORD netconn_verify_cert( PCCERT_CONTEXT cert, HCERTSTORE store, + WCHAR *server, DWORD security_flags ) +{ + BOOL ret; + CERT_CHAIN_PARA chainPara = { sizeof(chainPara), { 0 } }; + PCCERT_CHAIN_CONTEXT chain; + char oid_server_auth[] = szOID_PKIX_KP_SERVER_AUTH; + char *server_auth[] = { oid_server_auth }; + DWORD err = ERROR_SUCCESS; + + TRACE("verifying %s\n", debugstr_w( server )); + chainPara.RequestedUsage.Usage.cUsageIdentifier = 1; + chainPara.RequestedUsage.Usage.rgpszUsageIdentifier = server_auth; + if ((ret = CertGetCertificateChain( NULL, cert, NULL, store, &chainPara, 0, + NULL, &chain ))) + { + if (chain->TrustStatus.dwErrorStatus) + { + static const DWORD supportedErrors = + CERT_TRUST_IS_NOT_TIME_VALID | + CERT_TRUST_IS_UNTRUSTED_ROOT | + CERT_TRUST_IS_NOT_VALID_FOR_USAGE; + + if (chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_NOT_TIME_VALID) + { + if (!(security_flags & SECURITY_FLAG_IGNORE_CERT_DATE_INVALID)) + err = ERROR_WINHTTP_SECURE_CERT_DATE_INVALID; + } + else if (chain->TrustStatus.dwErrorStatus & + CERT_TRUST_IS_UNTRUSTED_ROOT) + { + if (!(security_flags & SECURITY_FLAG_IGNORE_UNKNOWN_CA)) + err = ERROR_WINHTTP_SECURE_INVALID_CA; + } + else if ((chain->TrustStatus.dwErrorStatus & + CERT_TRUST_IS_OFFLINE_REVOCATION) || + (chain->TrustStatus.dwErrorStatus & + CERT_TRUST_REVOCATION_STATUS_UNKNOWN)) + err = ERROR_WINHTTP_SECURE_CERT_REV_FAILED; + else if (chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_REVOKED) + err = ERROR_WINHTTP_SECURE_CERT_REVOKED; + else if (chain->TrustStatus.dwErrorStatus & + CERT_TRUST_IS_NOT_VALID_FOR_USAGE) + { + if (!(security_flags & SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE)) + err = ERROR_WINHTTP_SECURE_CERT_WRONG_USAGE; + } + else if (chain->TrustStatus.dwErrorStatus & ~supportedErrors) + err = ERROR_WINHTTP_SECURE_INVALID_CERT; + } + if (!err) + { + CERT_CHAIN_POLICY_PARA policyPara; + SSL_EXTRA_CERT_CHAIN_POLICY_PARA sslExtraPolicyPara; + CERT_CHAIN_POLICY_STATUS policyStatus; + CERT_CHAIN_CONTEXT chainCopy; + + /* Clear chain->TrustStatus.dwErrorStatus so + * CertVerifyCertificateChainPolicy will verify additional checks + * rather than stopping with an existing, ignored error. + */ + memcpy(&chainCopy, chain, sizeof(chainCopy)); + chainCopy.TrustStatus.dwErrorStatus = 0; + sslExtraPolicyPara.u.cbSize = sizeof(sslExtraPolicyPara); + sslExtraPolicyPara.dwAuthType = AUTHTYPE_SERVER; + sslExtraPolicyPara.pwszServerName = server; + policyPara.cbSize = sizeof(policyPara); + policyPara.dwFlags = 0; + policyPara.pvExtraPolicyPara = &sslExtraPolicyPara; + ret = CertVerifyCertificateChainPolicy( CERT_CHAIN_POLICY_SSL, + &chainCopy, &policyPara, + &policyStatus ); + /* Any error in the policy status indicates that the + * policy couldn't be verified. + */ + if (ret && policyStatus.dwError) + { + if (policyStatus.dwError == CERT_E_CN_NO_MATCH) + { + if (!(security_flags & SECURITY_FLAG_IGNORE_CERT_CN_INVALID)) + err = ERROR_WINHTTP_SECURE_CERT_CN_INVALID; + } + else + err = ERROR_WINHTTP_SECURE_INVALID_CERT; + } + } + CertFreeCertificateChain( chain ); + } + else + err = ERROR_WINHTTP_SECURE_CHANNEL_ERROR; + TRACE("returning %08x\n", err); + return err; +} + +static int netconn_secure_verify( int preverify_ok, X509_STORE_CTX *ctx ) +{ + SSL *ssl; + WCHAR *server; + BOOL ret = FALSE; + netconn_t *conn; + HCERTSTORE store = CertOpenStore( CERT_STORE_PROV_MEMORY, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL ); + + ssl = pX509_STORE_CTX_get_ex_data( ctx, pSSL_get_ex_data_X509_STORE_CTX_idx() ); + server = pSSL_get_ex_data( ssl, hostname_idx ); + conn = pSSL_get_ex_data( ssl, conn_idx ); + if (store) + { + X509 *cert; + int i; + PCCERT_CONTEXT endCert = NULL; + + ret = TRUE; + for (i = 0; ret && i < psk_num((struct stack_st *)ctx->chain); i++) + { + PCCERT_CONTEXT context; + + cert = (X509 *)psk_value((struct stack_st *)ctx->chain, i); + if ((context = X509_to_cert_context( cert ))) + { + if (i == 0) + ret = CertAddCertificateContextToStore( store, context, + CERT_STORE_ADD_ALWAYS, &endCert ); + else + ret = CertAddCertificateContextToStore( store, context, + CERT_STORE_ADD_ALWAYS, NULL ); + CertFreeCertificateContext( context ); + } + } + if (!endCert) ret = FALSE; + if (ret) + { + DWORD_PTR err = netconn_verify_cert( endCert, store, server, + conn->security_flags ); + + if (err) + { + pSSL_set_ex_data( ssl, error_idx, (void *)err ); + ret = FALSE; + } + } + CertFreeCertificateContext( endCert ); + CertCloseStore( store, 0 ); + } + return ret; +} +#endif BOOL netconn_init( netconn_t *conn, BOOL secure ) { +#if defined(SONAME_LIBSSL) && defined(SONAME_LIBCRYPTO) + int i; +#endif + conn->socket = -1; if (!secure) return TRUE; #if defined(SONAME_LIBSSL) && defined(SONAME_LIBCRYPTO) - if (libssl_handle) return TRUE; + EnterCriticalSection( &init_ssl_cs ); + if (libssl_handle) + { + LeaveCriticalSection( &init_ssl_cs ); + return TRUE; + } if (!(libssl_handle = wine_dlopen( SONAME_LIBSSL, RTLD_NOW, NULL, 0 ))) { ERR("Trying to use SSL but couldn't load %s. Expect trouble.\n", SONAME_LIBSSL); set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); + LeaveCriticalSection( &init_ssl_cs ); return FALSE; } if (!(libcrypto_handle = wine_dlopen( SONAME_LIBCRYPTO, RTLD_NOW, NULL, 0 ))) { ERR("Trying to use SSL but couldn't load %s. Expect trouble.\n", SONAME_LIBCRYPTO); set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); + LeaveCriticalSection( &init_ssl_cs ); return FALSE; } #define LOAD_FUNCPTR(x) \ @@ -204,11 +447,13 @@ BOOL netconn_init( netconn_t *conn, BOOL secure ) { \ ERR("Failed to load symbol %s\n", #x); \ set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); \ + LeaveCriticalSection( &init_ssl_cs ); \ return FALSE; \ } LOAD_FUNCPTR( SSL_library_init ); LOAD_FUNCPTR( SSL_load_error_strings ); LOAD_FUNCPTR( SSLv23_method ); + LOAD_FUNCPTR( SSL_CTX_free ); LOAD_FUNCPTR( SSL_CTX_new ); LOAD_FUNCPTR( SSL_new ); LOAD_FUNCPTR( SSL_free ); @@ -217,11 +462,16 @@ BOOL netconn_init( netconn_t *conn, BOOL secure ) LOAD_FUNCPTR( SSL_shutdown ); LOAD_FUNCPTR( SSL_write ); LOAD_FUNCPTR( SSL_read ); - LOAD_FUNCPTR( SSL_get_verify_result ); + LOAD_FUNCPTR( SSL_get_error ); + LOAD_FUNCPTR( SSL_get_ex_new_index ); + LOAD_FUNCPTR( SSL_get_ex_data ); + LOAD_FUNCPTR( SSL_set_ex_data ); + LOAD_FUNCPTR( SSL_get_ex_data_X509_STORE_CTX_idx ); LOAD_FUNCPTR( SSL_get_peer_certificate ); - LOAD_FUNCPTR( SSL_CTX_get_timeout ); - LOAD_FUNCPTR( SSL_CTX_set_timeout ); LOAD_FUNCPTR( SSL_CTX_set_default_verify_paths ); + LOAD_FUNCPTR( SSL_CTX_set_verify ); + LOAD_FUNCPTR( SSL_get_current_cipher ); + LOAD_FUNCPTR( SSL_CIPHER_get_bits ); #undef LOAD_FUNCPTR #define LOAD_FUNCPTR(x) \ @@ -229,19 +479,72 @@ BOOL netconn_init( netconn_t *conn, BOOL secure ) { \ ERR("Failed to load symbol %s\n", #x); \ set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); \ + LeaveCriticalSection( &init_ssl_cs ); \ return FALSE; \ } - LOAD_FUNCPTR( BIO_new_fp ); + LOAD_FUNCPTR( CRYPTO_num_locks ); + LOAD_FUNCPTR( CRYPTO_set_id_callback ); + LOAD_FUNCPTR( CRYPTO_set_locking_callback ); + LOAD_FUNCPTR( ERR_free_strings ); LOAD_FUNCPTR( ERR_get_error ); LOAD_FUNCPTR( ERR_error_string ); + LOAD_FUNCPTR( X509_STORE_CTX_get_ex_data ); LOAD_FUNCPTR( i2d_X509 ); + LOAD_FUNCPTR( sk_value ); + LOAD_FUNCPTR( sk_num ); #undef LOAD_FUNCPTR pSSL_library_init(); pSSL_load_error_strings(); - pBIO_new_fp( stderr, BIO_NOCLOSE ); method = pSSLv23_method(); + ctx = pSSL_CTX_new( method ); + if (!pSSL_CTX_set_default_verify_paths( ctx )) + { + ERR("SSL_CTX_set_default_verify_paths failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); + set_last_error( ERROR_OUTOFMEMORY ); + LeaveCriticalSection( &init_ssl_cs ); + return FALSE; + } + hostname_idx = pSSL_get_ex_new_index( 0, (void *)"hostname index", NULL, NULL, NULL ); + if (hostname_idx == -1) + { + ERR("SSL_get_ex_new_index failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); + set_last_error( ERROR_OUTOFMEMORY ); + LeaveCriticalSection( &init_ssl_cs ); + return FALSE; + } + error_idx = pSSL_get_ex_new_index( 0, (void *)"error index", NULL, NULL, NULL ); + if (error_idx == -1) + { + ERR("SSL_get_ex_new_index failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); + set_last_error( ERROR_OUTOFMEMORY ); + LeaveCriticalSection( &init_ssl_cs ); + return FALSE; + } + conn_idx = pSSL_get_ex_new_index( 0, (void *)"netconn index", NULL, NULL, NULL ); + if (conn_idx == -1) + { + ERR("SSL_get_ex_new_index failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); + set_last_error( ERROR_OUTOFMEMORY ); + LeaveCriticalSection( &init_ssl_cs ); + return FALSE; + } + pSSL_CTX_set_verify( ctx, SSL_VERIFY_PEER, netconn_secure_verify ); + + pCRYPTO_set_id_callback(ssl_thread_id); + num_ssl_locks = pCRYPTO_num_locks(); + ssl_locks = HeapAlloc(GetProcessHeap(), 0, num_ssl_locks * sizeof(CRITICAL_SECTION)); + if (!ssl_locks) + { + set_last_error( ERROR_OUTOFMEMORY ); + LeaveCriticalSection( &init_ssl_cs ); + return FALSE; + } + for (i = 0; i < num_ssl_locks; i++) InitializeCriticalSection( &ssl_locks[i] ); + pCRYPTO_set_locking_callback(ssl_lock_callback); + + LeaveCriticalSection( &init_ssl_cs ); #else WARN("SSL support not compiled in.\n"); set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); @@ -250,6 +553,29 @@ BOOL netconn_init( netconn_t *conn, BOOL secure ) return TRUE; } +void netconn_unload( void ) +{ +#if defined(SONAME_LIBSSL) && defined(SONAME_LIBCRYPTO) + if (libcrypto_handle) + { + pERR_free_strings(); + wine_dlclose( libcrypto_handle, NULL, 0 ); + } + if (libssl_handle) + { + if (ctx) + pSSL_CTX_free( ctx ); + wine_dlclose( libssl_handle, NULL, 0 ); + } + if (ssl_locks) + { + int i; + for (i = 0; i < num_ssl_locks; i++) DeleteCriticalSection( &ssl_locks[i] ); + HeapFree( GetProcessHeap(), 0, ssl_locks ); + } +#endif +} + BOOL netconn_connected( netconn_t *conn ) { return (conn->socket != -1); @@ -295,36 +621,72 @@ BOOL netconn_close( netconn_t *conn ) return TRUE; } -BOOL netconn_connect( netconn_t *conn, const struct sockaddr *sockaddr, unsigned int addr_len ) +BOOL netconn_connect( netconn_t *conn, const struct sockaddr *sockaddr, unsigned int addr_len, int timeout ) { - if (connect( conn->socket, sockaddr, addr_len ) == -1) + BOOL ret = FALSE; + int res = 0, state; + + if (timeout > 0) { - WARN("unable to connect to host (%s)\n", strerror(errno)); - set_last_error( sock_get_error( errno ) ); - return FALSE; + state = 1; + ioctlsocket( conn->socket, FIONBIO, &state ); } - return TRUE; + if (connect( conn->socket, sockaddr, addr_len ) < 0) + { + res = sock_get_error( errno ); + if (res == WSAEWOULDBLOCK || res == WSAEINPROGRESS) + { + fd_set outfd; + struct timeval tv; + + FD_ZERO(&outfd); + FD_SET(conn->socket, &outfd); + + tv.tv_sec = 0; + tv.tv_usec = timeout * 1000; + + if (select( 0, NULL, &outfd, NULL, &tv ) > 0) + ret = TRUE; + else + res = sock_get_error( errno ); + } + } + else + ret = TRUE; + if (timeout > 0) + { + state = 0; + ioctlsocket( conn->socket, FIONBIO, &state ); + } + if (!ret) + { + WARN("unable to connect to host (%d)\n", res); + set_last_error( res ); + } + return ret; } -BOOL netconn_secure_connect( netconn_t *conn ) +BOOL netconn_secure_connect( netconn_t *conn, WCHAR *hostname ) { #ifdef SONAME_LIBSSL - X509 *cert; - long res; - - ctx = pSSL_CTX_new( method ); - if (!pSSL_CTX_set_default_verify_paths( ctx )) - { - ERR("SSL_CTX_set_default_verify_paths failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); - set_last_error( ERROR_OUTOFMEMORY ); - return FALSE; - } if (!(conn->ssl_conn = pSSL_new( ctx ))) { ERR("SSL_new failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); set_last_error( ERROR_OUTOFMEMORY ); goto fail; } + if (!pSSL_set_ex_data( conn->ssl_conn, hostname_idx, hostname )) + { + ERR("SSL_set_ex_data failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); + set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); + goto fail; + } + if (!pSSL_set_ex_data( conn->ssl_conn, conn_idx, conn )) + { + ERR("SSL_set_ex_data failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); + set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); + return FALSE; + } if (!pSSL_set_fd( conn->ssl_conn, conn->socket )) { ERR("SSL_set_fd failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); @@ -333,21 +695,14 @@ BOOL netconn_secure_connect( netconn_t *conn ) } if (pSSL_connect( conn->ssl_conn ) <= 0) { - ERR("SSL_connect failed: %s\n", pERR_error_string( pERR_get_error(), 0 )); - set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); + DWORD err; + + err = (DWORD_PTR)pSSL_get_ex_data( conn->ssl_conn, error_idx ); + if (!err) err = ERROR_WINHTTP_SECURE_CHANNEL_ERROR; + ERR("couldn't verify server certificate (%d)\n", err); + set_last_error( err ); goto fail; } - if (!(cert = pSSL_get_peer_certificate( conn->ssl_conn ))) - { - ERR("No certificate for server: %s\n", pERR_error_string( pERR_get_error(), 0 )); - set_last_error( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ); - goto fail; - } - if ((res = pSSL_get_verify_result( conn->ssl_conn )) != X509_V_OK) - { - /* FIXME: we should set an error and return, but we only print an error at the moment */ - ERR("couldn't verify server certificate (%ld)\n", res); - } TRACE("established SSL connection\n"); conn->secure = TRUE; return TRUE; @@ -387,6 +742,8 @@ BOOL netconn_send( netconn_t *conn, const void *msg, size_t len, int flags, int BOOL netconn_recv( netconn_t *conn, void *buf, size_t len, int flags, int *recvd ) { + int ret; + *recvd = 0; if (!netconn_connected( conn )) return FALSE; if (!len) return TRUE; @@ -425,19 +782,29 @@ BOOL netconn_recv( netconn_t *conn, void *buf, size_t len, int flags, int *recvd /* check if we have enough data from the peek buffer */ if (!(flags & MSG_WAITALL) || (*recvd == len)) return TRUE; } - *recvd += pSSL_read( conn->ssl_conn, (char *)buf + *recvd, len - *recvd ); + ret = pSSL_read( conn->ssl_conn, (char *)buf + *recvd, len - *recvd ); + if (ret < 0) + return FALSE; + + /* check if EOF was received */ + if (!ret && (pSSL_get_error( conn->ssl_conn, ret ) == SSL_ERROR_ZERO_RETURN || + pSSL_get_error( conn->ssl_conn, ret ) == SSL_ERROR_SYSCALL )) + { + netconn_close( conn ); + return TRUE; + } if (flags & MSG_PEEK) /* must copy into buffer */ { - conn->peek_len = *recvd; - if (!*recvd) + conn->peek_len = ret; + if (!ret) { heap_free( conn->peek_msg_mem ); conn->peek_msg_mem = NULL; conn->peek_msg = NULL; } - else memcpy( conn->peek_msg, buf, *recvd ); + else memcpy( conn->peek_msg, buf, ret ); } - if (*recvd < 1 && len) return FALSE; + *recvd = ret; return TRUE; #else return FALSE; @@ -474,7 +841,6 @@ BOOL netconn_query_data_available( netconn_t *conn, DWORD *available ) BOOL netconn_get_next_line( netconn_t *conn, char *buffer, DWORD *buflen ) { - struct timeval tv; fd_set infd; BOOL ret = FALSE; DWORD recvd = 0; @@ -484,11 +850,6 @@ BOOL netconn_get_next_line( netconn_t *conn, char *buffer, DWORD *buflen ) if (conn->secure) { #ifdef SONAME_LIBSSL - long timeout; - - timeout = pSSL_CTX_get_timeout( ctx ); - pSSL_CTX_set_timeout( ctx, DEFAULT_RECEIVE_TIMEOUT ); - while (recvd < *buflen) { int dummy; @@ -504,7 +865,6 @@ BOOL netconn_get_next_line( netconn_t *conn, char *buffer, DWORD *buflen ) } if (buffer[recvd] != '\r') recvd++; } - pSSL_CTX_set_timeout( ctx, timeout ); if (ret) { buffer[recvd++] = 0; @@ -516,16 +876,23 @@ BOOL netconn_get_next_line( netconn_t *conn, char *buffer, DWORD *buflen ) return FALSE; #endif } - + FD_ZERO(&infd); FD_SET(conn->socket, &infd); - tv.tv_sec=RESPONSE_TIMEOUT; - tv.tv_usec=0; + while (recvd < *buflen) { - if (select(conn->socket+1,&infd,NULL,NULL,&tv) > 0) + int res; + struct timeval tv, *ptv; + socklen_t len = sizeof(tv); + + if ((res = getsockopt( conn->socket, SOL_SOCKET, SO_RCVTIMEO, (void*)&tv, &len ) != -1)) + ptv = &tv; + else + ptv = NULL; + + if (select( 0, &infd, NULL, NULL, ptv ) > 0) { - int res; if ((res = recv( conn->socket, &buffer[recvd], 1, 0 )) <= 0) { if (res == -1) set_last_error( sock_get_error( errno ) ); @@ -570,7 +937,7 @@ DWORD netconn_set_timeout( netconn_t *netconn, BOOL send, int value ) return ERROR_SUCCESS; } -BOOL netconn_resolve( WCHAR *hostnameW, INTERNET_PORT port, struct sockaddr_in *sa ) +static DWORD resolve_hostname( WCHAR *hostnameW, INTERNET_PORT port, struct sockaddr *sa, socklen_t *sa_len ) { char *hostname; #ifdef HAVE_GETADDRINFO @@ -578,27 +945,53 @@ BOOL netconn_resolve( WCHAR *hostnameW, INTERNET_PORT port, struct sockaddr_in * int ret; #else struct hostent *he; + struct sockaddr_in *sin = (struct sockaddr_in *)sa; #endif - if (!(hostname = strdupWA( hostnameW ))) return FALSE; + if (!(hostname = strdupWA( hostnameW ))) return ERROR_OUTOFMEMORY; #ifdef HAVE_GETADDRINFO memset( &hints, 0, sizeof(struct addrinfo) ); + /* Prefer IPv4 to IPv6 addresses, since some web servers do not listen on + * their IPv6 addresses even though they have IPv6 addresses in the DNS. + */ hints.ai_family = AF_INET; ret = getaddrinfo( hostname, NULL, &hints, &res ); - heap_free( hostname ); if (ret != 0) { - TRACE("failed to get address of %s (%s)\n", debugstr_w(hostnameW), gai_strerror(ret)); - return FALSE; + TRACE("failed to get IPv4 address of %s (%s), retrying with IPv6\n", debugstr_w(hostnameW), gai_strerror(ret)); + hints.ai_family = AF_INET6; + ret = getaddrinfo( hostname, NULL, &hints, &res ); + if (ret != 0) + { + TRACE("failed to get address of %s (%s)\n", debugstr_w(hostnameW), gai_strerror(ret)); + heap_free( hostname ); + return ERROR_WINHTTP_NAME_NOT_RESOLVED; + } + } + heap_free( hostname ); + if (*sa_len < res->ai_addrlen) + { + WARN("address too small\n"); + freeaddrinfo( res ); + return ERROR_WINHTTP_NAME_NOT_RESOLVED; + } + *sa_len = res->ai_addrlen; + memcpy( sa, res->ai_addr, res->ai_addrlen ); + /* Copy port */ + switch (res->ai_family) + { + case AF_INET: + ((struct sockaddr_in *)sa)->sin_port = htons( port ); + break; + case AF_INET6: + ((struct sockaddr_in6 *)sa)->sin6_port = htons( port ); + break; } - memset( sa, 0, sizeof(struct sockaddr_in) ); - memcpy( &sa->sin_addr, &((struct sockaddr_in *)res->ai_addr)->sin_addr, sizeof(struct in_addr) ); - sa->sin_family = res->ai_family; - sa->sin_port = htons( port ); freeaddrinfo( res ); + return ERROR_SUCCESS; #else EnterCriticalSection( &cs_gethostbyname ); @@ -608,15 +1001,69 @@ BOOL netconn_resolve( WCHAR *hostnameW, INTERNET_PORT port, struct sockaddr_in * { TRACE("failed to get address of %s (%d)\n", debugstr_w(hostnameW), h_errno); LeaveCriticalSection( &cs_gethostbyname ); - return FALSE; + return ERROR_WINHTTP_NAME_NOT_RESOLVED; } + if (*sa_len < sizeof(struct sockaddr_in)) + { + WARN("address too small\n"); + LeaveCriticalSection( &cs_gethostbyname ); + return ERROR_WINHTTP_NAME_NOT_RESOLVED; + } + *sa_len = sizeof(struct sockaddr_in); memset( sa, 0, sizeof(struct sockaddr_in) ); - memcpy( &sa->sin_addr, he->h_addr, he->h_length ); - sa->sin_family = he->h_addrtype; - sa->sin_port = htons( port ); + memcpy( &sin->sin_addr, he->h_addr, he->h_length ); + sin->sin_family = he->h_addrtype; + sin->sin_port = htons( port ); LeaveCriticalSection( &cs_gethostbyname ); + return ERROR_SUCCESS; #endif +} + +struct resolve_args +{ + WCHAR *hostname; + INTERNET_PORT port; + struct sockaddr *sa; + socklen_t *sa_len; +}; + +static DWORD CALLBACK resolve_proc( LPVOID arg ) +{ + struct resolve_args *ra = arg; + return resolve_hostname( ra->hostname, ra->port, ra->sa, ra->sa_len ); +} + +BOOL netconn_resolve( WCHAR *hostname, INTERNET_PORT port, struct sockaddr *sa, socklen_t *sa_len, int timeout ) +{ + DWORD ret; + + if (timeout) + { + DWORD status; + HANDLE thread; + struct resolve_args ra; + + ra.hostname = hostname; + ra.port = port; + ra.sa = sa; + ra.sa_len = sa_len; + + thread = CreateThread( NULL, 0, resolve_proc, &ra, 0, NULL ); + if (!thread) return FALSE; + + status = WaitForSingleObject( thread, timeout ); + if (status == WAIT_OBJECT_0) GetExitCodeThread( thread, &ret ); + else ret = ERROR_WINHTTP_TIMEOUT; + CloseHandle( thread ); + } + else ret = resolve_hostname( hostname, port, sa, sa_len ); + + if (ret) + { + set_last_error( ret ); + return FALSE; + } return TRUE; } @@ -624,41 +1071,29 @@ const void *netconn_get_certificate( netconn_t *conn ) { #ifdef SONAME_LIBSSL X509 *cert; - unsigned char *buffer, *p; - int len; - BOOL malloc = FALSE; const CERT_CONTEXT *ret; if (!conn->secure) return NULL; if (!(cert = pSSL_get_peer_certificate( conn->ssl_conn ))) return NULL; - p = NULL; - if ((len = pi2d_X509( cert, &p )) < 0) return NULL; - /* - * SSL 0.9.7 and above malloc the buffer if it is null. - * however earlier version do not and so we would need to alloc the buffer. - * - * see the i2d_X509 man page for more details. - */ - if (!p) - { - if (!(buffer = heap_alloc( len ))) return NULL; - p = buffer; - len = pi2d_X509( cert, &p ); - } - else - { - buffer = p; - malloc = TRUE; - } - - ret = CertCreateCertificateContext( X509_ASN_ENCODING, buffer, len ); - - if (malloc) free( buffer ); - else heap_free( buffer ); - + ret = X509_to_cert_context( cert ); return ret; #else return NULL; #endif } + +int netconn_get_cipher_strength( netconn_t *conn ) +{ +#ifdef SONAME_LIBSSL + SSL_CIPHER *cipher; + int bits = 0; + + if (!conn->secure) return 0; + if (!(cipher = pSSL_get_current_cipher( conn->ssl_conn ))) return 0; + pSSL_CIPHER_get_bits( cipher, &bits ); + return bits; +#else + return 0; +#endif +} diff --git a/dll/win32/winhttp/request.c b/dll/win32/winhttp/request.c index dd08028ec1a..80a1b572d4d 100644 --- a/dll/win32/winhttp/request.c +++ b/dll/win32/winhttp/request.c @@ -1,5 +1,8 @@ /* + * Copyright 2004 Mike McCormack for CodeWeavers + * Copyright 2006 Rob Shearman for CodeWeavers * Copyright 2008 Hans Leidekker for CodeWeavers + * Copyright 2009 Juan Lang * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,14 +23,10 @@ #include "wine/port.h" #include "wine/debug.h" -#include #include #ifdef HAVE_ARPA_INET_H # include #endif -#ifdef HAVE_SYS_SOCKET_H -# include -#endif #include "windef.h" #include "winbase.h" @@ -414,6 +413,7 @@ BOOL add_request_headers( request_t *request, LPCWSTR headers, DWORD len, DWORD header_t *header; if (len == ~0u) len = strlenW( headers ); + if (!len) return TRUE; if (!(buffer = heap_alloc( (len + 1) * sizeof(WCHAR) ))) return FALSE; strcpyW( buffer, headers ); @@ -477,6 +477,47 @@ BOOL WINAPI WinHttpAddRequestHeaders( HINTERNET hrequest, LPCWSTR headers, DWORD return ret; } +static WCHAR *build_request_path( request_t *request ) +{ + WCHAR *ret; + + if (strcmpiW( request->connect->hostname, request->connect->servername )) + { + static const WCHAR http[] = { 'h','t','t','p',0 }; + static const WCHAR https[] = { 'h','t','t','p','s',0 }; + static const WCHAR fmt[] = { '%','s',':','/','/','%','s',0 }; + LPCWSTR scheme = request->netconn.secure ? https : http; + int len; + + len = strlenW( scheme ) + strlenW( request->connect->hostname ); + /* 3 characters for '://', 1 for NUL. */ + len += 4; + if (request->connect->hostport) + { + /* 1 for ':' between host and port, up to 5 for port */ + len += 6; + } + if (request->path) + len += strlenW( request->path ); + if ((ret = heap_alloc( len * sizeof(WCHAR) ))) + { + sprintfW( ret, fmt, scheme, request->connect->hostname ); + if (request->connect->hostport) + { + static const WCHAR colonFmt[] = { ':','%','d',0 }; + + sprintfW( ret + strlenW( ret ), colonFmt, + request->connect->hostport ); + } + if (request->path) + strcatW( ret, request->path ); + } + } + else + ret = request->path; + return ret; +} + static WCHAR *build_request_string( request_t *request ) { static const WCHAR space[] = {' ',0}; @@ -484,7 +525,7 @@ static WCHAR *build_request_string( request_t *request ) static const WCHAR colon[] = {':',' ',0}; static const WCHAR twocrlf[] = {'\r','\n','\r','\n',0}; - WCHAR *ret; + WCHAR *path, *ret; const WCHAR **headers, **p; unsigned int len, i = 0, j; @@ -492,9 +533,10 @@ static WCHAR *build_request_string( request_t *request ) len = request->num_headers * 4 + 7; if (!(headers = heap_alloc( len * sizeof(LPCWSTR) ))) return NULL; + path = build_request_path( request ); headers[i++] = request->verb; headers[i++] = space; - headers[i++] = request->path; + headers[i++] = path; headers[i++] = space; headers[i++] = request->version; @@ -519,13 +561,13 @@ static WCHAR *build_request_string( request_t *request ) len++; if (!(ret = heap_alloc( len * sizeof(WCHAR) ))) - { - heap_free( headers ); - return NULL; - } + goto out; *ret = 0; for (p = headers; *p; p++) strcatW( ret, *p ); +out: + if (path != request->path) + heap_free( path ); heap_free( headers ); return ret; } @@ -562,12 +604,12 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID if (!(p = headers)) return FALSE; for (len = 0; *p; p++) if (*p != '\r') len++; - if ((len + 1) * sizeof(WCHAR) > *buflen || !buffer) + if (!buffer || (len + 1) * sizeof(WCHAR) > *buflen) { len++; set_last_error( ERROR_INSUFFICIENT_BUFFER ); } - else if (buffer) + else { for (p = headers, q = buffer; *p; p++, q++) { @@ -597,12 +639,12 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID if (!headers) return FALSE; len = strlenW( headers ) * sizeof(WCHAR); - if (len + sizeof(WCHAR) > *buflen || !buffer) + if (!buffer || len + sizeof(WCHAR) > *buflen) { len += sizeof(WCHAR); set_last_error( ERROR_INSUFFICIENT_BUFFER ); } - else if (buffer) + else { memcpy( buffer, headers, len + sizeof(WCHAR) ); TRACE("returning data: %s\n", debugstr_wn(buffer, len / sizeof(WCHAR))); @@ -612,8 +654,39 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID if (request_only) heap_free( headers ); return ret; } + case WINHTTP_QUERY_VERSION: + len = strlenW( request->version ) * sizeof(WCHAR); + if (!buffer || len + sizeof(WCHAR) > *buflen) + { + len += sizeof(WCHAR); + set_last_error( ERROR_INSUFFICIENT_BUFFER ); + } + else + { + strcpyW( buffer, request->version ); + TRACE("returning string: %s\n", debugstr_w(buffer)); + ret = TRUE; + } + *buflen = len; + return ret; + + case WINHTTP_QUERY_STATUS_TEXT: + len = strlenW( request->status_text ) * sizeof(WCHAR); + if (!buffer || len + sizeof(WCHAR) > *buflen) + { + len += sizeof(WCHAR); + set_last_error( ERROR_INSUFFICIENT_BUFFER ); + } + else + { + strcpyW( buffer, request->status_text ); + TRACE("returning string: %s\n", debugstr_w(buffer)); + ret = TRUE; + } + *buflen = len; + return ret; + default: - { if (attr >= sizeof(attribute_table)/sizeof(attribute_table[0]) || !attribute_table[attr]) { FIXME("attribute %u not implemented\n", attr); @@ -621,7 +694,7 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID } TRACE("attribute %s\n", debugstr_w(attribute_table[attr])); header_index = get_header_index( request, attribute_table[attr], requested_index, request_only ); - } + break; } if (header_index >= 0) @@ -636,13 +709,13 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID if (index) *index += 1; if (level & WINHTTP_QUERY_FLAG_NUMBER) { - int *number = buffer; - if (sizeof(int) > *buflen) + if (!buffer || sizeof(int) > *buflen) { set_last_error( ERROR_INSUFFICIENT_BUFFER ); } - else if (number) + else { + int *number = buffer; *number = atoiW( header->value ); TRACE("returning number: %d\n", *number); ret = TRUE; @@ -652,11 +725,11 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID else if (level & WINHTTP_QUERY_FLAG_SYSTEMTIME) { SYSTEMTIME *st = buffer; - if (sizeof(SYSTEMTIME) > *buflen) + if (!buffer || sizeof(SYSTEMTIME) > *buflen) { set_last_error( ERROR_INSUFFICIENT_BUFFER ); } - else if (st && (ret = WinHttpTimeToSystemTime( header->value, st ))) + else if ((ret = WinHttpTimeToSystemTime( header->value, st ))) { TRACE("returning time: %04d/%02d/%02d - %d - %02d:%02d:%02d.%02d\n", st->wYear, st->wMonth, st->wDay, st->wDayOfWeek, @@ -666,21 +739,19 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID } else if (header->value) { - WCHAR *string = buffer; - DWORD len = (strlenW( header->value ) + 1) * sizeof(WCHAR); - if (len > *buflen) + len = strlenW( header->value ) * sizeof(WCHAR); + if (!buffer || len + sizeof(WCHAR) > *buflen) { + len += sizeof(WCHAR); set_last_error( ERROR_INSUFFICIENT_BUFFER ); - *buflen = len; - return FALSE; } - else if (string) + else { - strcpyW( string, header->value ); - TRACE("returning string: %s\n", debugstr_w(string)); + strcpyW( buffer, header->value ); + TRACE("returning string: %s\n", debugstr_w(buffer)); ret = TRUE; } - *buflen = len - sizeof(WCHAR); + *buflen = len; } return ret; } @@ -713,46 +784,198 @@ BOOL WINAPI WinHttpQueryHeaders( HINTERNET hrequest, DWORD level, LPCWSTR name, return ret; } +static LPWSTR concatenate_string_list( LPCWSTR *list, int len ) +{ + LPCWSTR *t; + LPWSTR str; + + for( t = list; *t ; t++ ) + len += strlenW( *t ); + len++; + + str = heap_alloc( len * sizeof(WCHAR) ); + if (!str) return NULL; + *str = 0; + + for( t = list; *t ; t++ ) + strcatW( str, *t ); + + return str; +} + +static LPWSTR build_header_request_string( request_t *request, LPCWSTR verb, + LPCWSTR path, LPCWSTR version ) +{ + static const WCHAR crlf[] = {'\r','\n',0}; + static const WCHAR space[] = { ' ',0 }; + static const WCHAR colon[] = { ':',' ',0 }; + static const WCHAR twocrlf[] = {'\r','\n','\r','\n', 0}; + LPWSTR requestString; + DWORD len, n; + LPCWSTR *req; + UINT i; + LPWSTR p; + + /* allocate space for an array of all the string pointers to be added */ + len = (request->num_headers) * 4 + 10; + req = heap_alloc( len * sizeof(LPCWSTR) ); + if (!req) return NULL; + + /* add the verb, path and HTTP version string */ + n = 0; + req[n++] = verb; + req[n++] = space; + req[n++] = path; + req[n++] = space; + req[n++] = version; + + /* Append custom request headers */ + for (i = 0; i < request->num_headers; i++) + { + if (request->headers[i].is_request) + { + req[n++] = crlf; + req[n++] = request->headers[i].field; + req[n++] = colon; + req[n++] = request->headers[i].value; + + TRACE("Adding custom header %s (%s)\n", + debugstr_w(request->headers[i].field), + debugstr_w(request->headers[i].value)); + } + } + + if( n >= len ) + ERR("oops. buffer overrun\n"); + + req[n] = NULL; + requestString = concatenate_string_list( req, 4 ); + heap_free( req ); + if (!requestString) return NULL; + + /* + * Set (header) termination string for request + * Make sure there's exactly two new lines at the end of the request + */ + p = &requestString[strlenW(requestString)-1]; + while ( (*p == '\n') || (*p == '\r') ) + p--; + strcpyW( p+1, twocrlf ); + + return requestString; +} + +static BOOL read_reply( request_t *request ); + +static BOOL secure_proxy_connect( request_t *request ) +{ + static const WCHAR verbConnect[] = {'C','O','N','N','E','C','T',0}; + static const WCHAR fmt[] = {'%','s',':','%','d',0}; + BOOL ret = FALSE; + LPWSTR path; + connect_t *connect = request->connect; + + path = heap_alloc( (strlenW( connect->hostname ) + 13) * sizeof(WCHAR) ); + if (path) + { + LPWSTR requestString; + + sprintfW( path, fmt, connect->hostname, connect->hostport ); + requestString = build_header_request_string( request, verbConnect, + path, http1_1 ); + heap_free( path ); + if (requestString) + { + LPSTR req_ascii = strdupWA( requestString ); + + heap_free( requestString ); + if (req_ascii) + { + int len = strlen( req_ascii ), bytes_sent; + + ret = netconn_send( &request->netconn, req_ascii, len, 0, &bytes_sent ); + heap_free( req_ascii ); + if (ret) + ret = read_reply( request ); + } + } + } + return ret; +} + +#ifndef INET6_ADDRSTRLEN +#define INET6_ADDRSTRLEN 46 +#endif + static BOOL open_connection( request_t *request ) { connect_t *connect; - char address[32]; + const void *addr; + char address[INET6_ADDRSTRLEN]; WCHAR *addressW; INTERNET_PORT port; + socklen_t slen; if (netconn_connected( &request->netconn )) return TRUE; connect = request->connect; - port = connect->hostport ? connect->hostport : (request->hdr.flags & WINHTTP_FLAG_SECURE ? 443 : 80); + port = connect->serverport ? connect->serverport : (request->hdr.flags & WINHTTP_FLAG_SECURE ? 443 : 80); send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_RESOLVING_NAME, connect->servername, strlenW(connect->servername) + 1 ); - if (!netconn_resolve( connect->servername, port, &connect->sockaddr )) return FALSE; - inet_ntop( connect->sockaddr.sin_family, &connect->sockaddr.sin_addr, address, sizeof(address) ); + slen = sizeof(connect->sockaddr); + if (!netconn_resolve( connect->servername, port, (struct sockaddr *)&connect->sockaddr, &slen, request->resolve_timeout )) return FALSE; + switch (connect->sockaddr.ss_family) + { + case AF_INET: + addr = &((struct sockaddr_in *)&connect->sockaddr)->sin_addr; + break; + case AF_INET6: + addr = &((struct sockaddr_in6 *)&connect->sockaddr)->sin6_addr; + break; + default: + WARN("unsupported address family %d\n", connect->sockaddr.ss_family); + return FALSE; + } + inet_ntop( connect->sockaddr.ss_family, addr, address, sizeof(address) ); addressW = strdupAW( address ); send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_NAME_RESOLVED, addressW, strlenW(addressW) + 1 ); - TRACE("connecting to %s:%u\n", address, ntohs(connect->sockaddr.sin_port)); + TRACE("connecting to %s:%u\n", address, port); send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER, addressW, 0 ); - if (!netconn_create( &request->netconn, connect->sockaddr.sin_family, SOCK_STREAM, 0 )) + if (!netconn_create( &request->netconn, connect->sockaddr.ss_family, SOCK_STREAM, 0 )) { heap_free( addressW ); return FALSE; } - if (!netconn_connect( &request->netconn, (struct sockaddr *)&connect->sockaddr, sizeof(struct sockaddr_in) )) + netconn_set_timeout( &request->netconn, TRUE, request->send_timeout ); + netconn_set_timeout( &request->netconn, FALSE, request->recv_timeout ); + if (!netconn_connect( &request->netconn, (struct sockaddr *)&connect->sockaddr, slen, request->connect_timeout )) { netconn_close( &request->netconn ); heap_free( addressW ); return FALSE; } - if (request->hdr.flags & WINHTTP_FLAG_SECURE && !netconn_secure_connect( &request->netconn )) + if (request->hdr.flags & WINHTTP_FLAG_SECURE) { - netconn_close( &request->netconn ); - heap_free( addressW ); - return FALSE; + if (connect->session->proxy_server && + strcmpiW( connect->hostname, connect->servername )) + { + if (!secure_proxy_connect( request )) + { + heap_free( addressW ); + return FALSE; + } + } + if (!netconn_secure_connect( &request->netconn, connect->servername )) + { + netconn_close( &request->netconn ); + heap_free( addressW ); + return FALSE; + } } send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER, addressW, strlenW(addressW) + 1 ); @@ -847,6 +1070,7 @@ static BOOL send_request( request_t *request, LPCWSTR headers, DWORD headers_len TRACE("full request: %s\n", debugstr_a(req_ascii)); len = strlen(req_ascii); + if (context) request->hdr.context = context; send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_SENDING_REQUEST, NULL, 0 ); ret = netconn_send( &request->netconn, req_ascii, len, 0, &bytes_sent ); @@ -929,6 +1153,282 @@ BOOL WINAPI WinHttpSendRequest( HINTERNET hrequest, LPCWSTR headers, DWORD heade return ret; } +#define ARRAYSIZE(array) (sizeof(array) / sizeof((array)[0])) + +static DWORD auth_scheme_from_header( WCHAR *header ) +{ + static const WCHAR basic[] = {'B','a','s','i','c'}; + static const WCHAR ntlm[] = {'N','T','L','M'}; + static const WCHAR passport[] = {'P','a','s','s','p','o','r','t'}; + static const WCHAR digest[] = {'D','i','g','e','s','t'}; + static const WCHAR negotiate[] = {'N','e','g','o','t','i','a','t','e'}; + + if (!strncmpiW( header, basic, ARRAYSIZE(basic) ) && + (header[ARRAYSIZE(basic)] == ' ' || !header[ARRAYSIZE(basic)])) return WINHTTP_AUTH_SCHEME_BASIC; + + if (!strncmpiW( header, ntlm, ARRAYSIZE(ntlm) ) && + (header[ARRAYSIZE(ntlm)] == ' ' || !header[ARRAYSIZE(ntlm)])) return WINHTTP_AUTH_SCHEME_NTLM; + + if (!strncmpiW( header, passport, ARRAYSIZE(passport) ) && + (header[ARRAYSIZE(passport)] == ' ' || !header[ARRAYSIZE(passport)])) return WINHTTP_AUTH_SCHEME_PASSPORT; + + if (!strncmpiW( header, digest, ARRAYSIZE(digest) ) && + (header[ARRAYSIZE(digest)] == ' ' || !header[ARRAYSIZE(digest)])) return WINHTTP_AUTH_SCHEME_DIGEST; + + if (!strncmpiW( header, negotiate, ARRAYSIZE(negotiate) ) && + (header[ARRAYSIZE(negotiate)] == ' ' || !header[ARRAYSIZE(negotiate)])) return WINHTTP_AUTH_SCHEME_NEGOTIATE; + + return 0; +} + +static BOOL query_auth_schemes( request_t *request, DWORD level, LPDWORD supported, LPDWORD first ) +{ + DWORD index = 0; + BOOL ret = FALSE; + + for (;;) + { + WCHAR *buffer; + DWORD size, scheme; + + size = 0; + query_headers( request, level, NULL, NULL, &size, &index ); + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) break; + + index--; + if (!(buffer = heap_alloc( size ))) return FALSE; + if (!query_headers( request, level, NULL, buffer, &size, &index )) + { + heap_free( buffer ); + return FALSE; + } + scheme = auth_scheme_from_header( buffer ); + if (first && index == 1) *first = scheme; + *supported |= scheme; + + heap_free( buffer ); + ret = TRUE; + } + return ret; +} + +/*********************************************************************** + * WinHttpQueryAuthSchemes (winhttp.@) + */ +BOOL WINAPI WinHttpQueryAuthSchemes( HINTERNET hrequest, LPDWORD supported, LPDWORD first, LPDWORD target ) +{ + BOOL ret = FALSE; + request_t *request; + + TRACE("%p, %p, %p, %p\n", hrequest, supported, first, target); + + if (!(request = (request_t *)grab_object( hrequest ))) + { + set_last_error( ERROR_INVALID_HANDLE ); + return FALSE; + } + if (request->hdr.type != WINHTTP_HANDLE_TYPE_REQUEST) + { + release_object( &request->hdr ); + set_last_error( ERROR_WINHTTP_INCORRECT_HANDLE_TYPE ); + return FALSE; + } + + if (query_auth_schemes( request, WINHTTP_QUERY_WWW_AUTHENTICATE, supported, first )) + { + *target = WINHTTP_AUTH_TARGET_SERVER; + ret = TRUE; + } + else if (query_auth_schemes( request, WINHTTP_QUERY_PROXY_AUTHENTICATE, supported, first )) + { + *target = WINHTTP_AUTH_TARGET_PROXY; + ret = TRUE; + } + + release_object( &request->hdr ); + return ret; +} + +static UINT encode_base64( const char *bin, unsigned int len, WCHAR *base64 ) +{ + UINT n = 0, x; + static const char base64enc[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + while (len > 0) + { + /* first 6 bits, all from bin[0] */ + base64[n++] = base64enc[(bin[0] & 0xfc) >> 2]; + x = (bin[0] & 3) << 4; + + /* next 6 bits, 2 from bin[0] and 4 from bin[1] */ + if (len == 1) + { + base64[n++] = base64enc[x]; + base64[n++] = '='; + base64[n++] = '='; + break; + } + base64[n++] = base64enc[x | ((bin[1] & 0xf0) >> 4)]; + x = (bin[1] & 0x0f) << 2; + + /* next 6 bits 4 from bin[1] and 2 from bin[2] */ + if (len == 2) + { + base64[n++] = base64enc[x]; + base64[n++] = '='; + break; + } + base64[n++] = base64enc[x | ((bin[2] & 0xc0) >> 6)]; + + /* last 6 bits, all from bin [2] */ + base64[n++] = base64enc[bin[2] & 0x3f]; + bin += 3; + len -= 3; + } + base64[n] = 0; + return n; +} + +static BOOL set_credentials( request_t *request, DWORD target, DWORD scheme, LPCWSTR username, LPCWSTR password ) +{ + static const WCHAR basic[] = {'B','a','s','i','c',' ',0}; + const WCHAR *auth_scheme, *auth_target; + WCHAR *auth_header; + DWORD len, auth_data_len; + char *auth_data; + BOOL ret; + + if (!username || !password) + { + set_last_error( ERROR_INVALID_PARAMETER ); + return FALSE; + } + + switch (target) + { + case WINHTTP_AUTH_TARGET_SERVER: auth_target = attr_authorization; break; + case WINHTTP_AUTH_TARGET_PROXY: auth_target = attr_proxy_authorization; break; + default: + WARN("unknown target %x\n", target); + return FALSE; + } + switch (scheme) + { + case WINHTTP_AUTH_SCHEME_BASIC: + { + int userlen = WideCharToMultiByte( CP_UTF8, 0, username, strlenW( username ), NULL, 0, NULL, NULL ); + int passlen = WideCharToMultiByte( CP_UTF8, 0, password, strlenW( password ), NULL, 0, NULL, NULL ); + + TRACE("basic authentication\n"); + + auth_scheme = basic; + auth_data_len = userlen + 1 + passlen; + if (!(auth_data = heap_alloc( auth_data_len ))) return FALSE; + + WideCharToMultiByte( CP_UTF8, 0, username, -1, auth_data, userlen, NULL, NULL ); + auth_data[userlen] = ':'; + WideCharToMultiByte( CP_UTF8, 0, password, -1, auth_data + userlen + 1, passlen, NULL, NULL ); + break; + } + case WINHTTP_AUTH_SCHEME_NTLM: + case WINHTTP_AUTH_SCHEME_PASSPORT: + case WINHTTP_AUTH_SCHEME_DIGEST: + case WINHTTP_AUTH_SCHEME_NEGOTIATE: + FIXME("unimplemented authentication scheme %x\n", scheme); + return FALSE; + default: + WARN("unknown authentication scheme %x\n", scheme); + return FALSE; + } + + len = strlenW( auth_scheme ) + ((auth_data_len + 2) * 4) / 3; + if (!(auth_header = heap_alloc( (len + 1) * sizeof(WCHAR) ))) + { + heap_free( auth_data ); + return FALSE; + } + strcpyW( auth_header, auth_scheme ); + encode_base64( auth_data, auth_data_len, auth_header + strlenW( auth_header ) ); + + ret = process_header( request, auth_target, auth_header, WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE, TRUE ); + + heap_free( auth_data ); + heap_free( auth_header ); + return ret; +} + +/*********************************************************************** + * WinHttpSetCredentials (winhttp.@) + */ +BOOL WINAPI WinHttpSetCredentials( HINTERNET hrequest, DWORD target, DWORD scheme, LPCWSTR username, + LPCWSTR password, LPVOID params ) +{ + BOOL ret; + request_t *request; + + TRACE("%p, %x, 0x%08x, %s, %p, %p\n", hrequest, target, scheme, debugstr_w(username), password, params); + + if (!(request = (request_t *)grab_object( hrequest ))) + { + set_last_error( ERROR_INVALID_HANDLE ); + return FALSE; + } + if (request->hdr.type != WINHTTP_HANDLE_TYPE_REQUEST) + { + release_object( &request->hdr ); + set_last_error( ERROR_WINHTTP_INCORRECT_HANDLE_TYPE ); + return FALSE; + } + + ret = set_credentials( request, target, scheme, username, password ); + + release_object( &request->hdr ); + return ret; +} + +static BOOL handle_authorization( request_t *request, DWORD status ) +{ + DWORD schemes, level, target; + const WCHAR *username, *password; + + switch (status) + { + case 401: + target = WINHTTP_AUTH_TARGET_SERVER; + level = WINHTTP_QUERY_WWW_AUTHENTICATE; + break; + + case 407: + target = WINHTTP_AUTH_TARGET_PROXY; + level = WINHTTP_QUERY_PROXY_AUTHENTICATE; + break; + + default: + WARN("unhandled status %u\n", status); + return FALSE; + } + + if (!query_auth_schemes( request, level, &schemes, NULL )) return FALSE; + + if (target == WINHTTP_AUTH_TARGET_SERVER) + { + username = request->connect->username; + password = request->connect->password; + } + else + { + username = request->connect->session->proxy_username; + password = request->connect->session->proxy_password; + } + + if (schemes & WINHTTP_AUTH_SCHEME_BASIC) + return set_credentials( request, target, WINHTTP_AUTH_SCHEME_BASIC, username, password ); + + FIXME("unsupported authentication scheme\n"); + return FALSE; +} + static void clear_response_headers( request_t *request ) { unsigned int i; @@ -1100,13 +1600,12 @@ static BOOL handle_redirect( request_t *request ) hostname[len] = 0; port = uc.nPort ? uc.nPort : (uc.nScheme == INTERNET_SCHEME_HTTPS ? 443 : 80); - if (strcmpiW( connect->servername, hostname ) || connect->serverport != port) + if (strcmpiW( connect->hostname, hostname ) || connect->serverport != port) { heap_free( connect->hostname ); connect->hostname = hostname; - heap_free( connect->servername ); - connect->servername = strdupW( connect->hostname ); - connect->serverport = connect->hostport = port; + connect->hostport = port; + if (!(ret = set_server_for_hostname( connect, hostname, port ))) goto end; netconn_close( &request->netconn ); if (!(ret = netconn_init( &request->netconn, request->hdr.flags & WINHTTP_FLAG_SECURE ))) goto end; @@ -1349,7 +1848,20 @@ static BOOL receive_response( request_t *request, BOOL async ) ret = send_request( request, NULL, 0, NULL, 0, 0, 0, FALSE ); /* recurse synchronously */ continue; } - if (status == 401) FIXME("authentication not supported\n"); + else if (status == 401 || status == 407) + { + if (request->hdr.disable_flags & WINHTTP_DISABLE_AUTHENTICATION) break; + + drain_content( request ); + if (!handle_authorization( request, status )) + { + ret = TRUE; + break; + } + clear_response_headers( request ); + ret = send_request( request, NULL, 0, NULL, 0, 0, 0, FALSE ); + continue; + } break; } @@ -1620,232 +2132,3 @@ BOOL WINAPI WinHttpWriteData( HINTERNET hrequest, LPCVOID buffer, DWORD to_write release_object( &request->hdr ); return ret; } - -#define ARRAYSIZE(array) (sizeof(array) / sizeof((array)[0])) - -static DWORD auth_scheme_from_header( WCHAR *header ) -{ - static const WCHAR basic[] = {'B','a','s','i','c'}; - static const WCHAR ntlm[] = {'N','T','L','M'}; - static const WCHAR passport[] = {'P','a','s','s','p','o','r','t'}; - static const WCHAR digest[] = {'D','i','g','e','s','t'}; - static const WCHAR negotiate[] = {'N','e','g','o','t','i','a','t','e'}; - - if (!strncmpiW( header, basic, ARRAYSIZE(basic) ) && - (header[ARRAYSIZE(basic)] == ' ' || !header[ARRAYSIZE(basic)])) return WINHTTP_AUTH_SCHEME_BASIC; - - if (!strncmpiW( header, ntlm, ARRAYSIZE(ntlm) ) && - (header[ARRAYSIZE(ntlm)] == ' ' || !header[ARRAYSIZE(ntlm)])) return WINHTTP_AUTH_SCHEME_NTLM; - - if (!strncmpiW( header, passport, ARRAYSIZE(passport) ) && - (header[ARRAYSIZE(passport)] == ' ' || !header[ARRAYSIZE(passport)])) return WINHTTP_AUTH_SCHEME_PASSPORT; - - if (!strncmpiW( header, digest, ARRAYSIZE(digest) ) && - (header[ARRAYSIZE(digest)] == ' ' || !header[ARRAYSIZE(digest)])) return WINHTTP_AUTH_SCHEME_DIGEST; - - if (!strncmpiW( header, negotiate, ARRAYSIZE(negotiate) ) && - (header[ARRAYSIZE(negotiate)] == ' ' || !header[ARRAYSIZE(negotiate)])) return WINHTTP_AUTH_SCHEME_NEGOTIATE; - - return 0; -} - -static BOOL query_auth_schemes( request_t *request, DWORD level, LPDWORD supported, LPDWORD first ) -{ - DWORD index = 0; - BOOL ret = FALSE; - - for (;;) - { - WCHAR *buffer; - DWORD size, scheme; - - size = 0; - query_headers( request, level, NULL, NULL, &size, &index ); - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) break; - - index--; - if (!(buffer = heap_alloc( size ))) return FALSE; - if (!query_headers( request, level, NULL, buffer, &size, &index )) - { - heap_free( buffer ); - return FALSE; - } - scheme = auth_scheme_from_header( buffer ); - if (index == 1) *first = scheme; - *supported |= scheme; - - heap_free( buffer ); - ret = TRUE; - } - return ret; -} - -/*********************************************************************** - * WinHttpQueryAuthSchemes (winhttp.@) - */ -BOOL WINAPI WinHttpQueryAuthSchemes( HINTERNET hrequest, LPDWORD supported, LPDWORD first, LPDWORD target ) -{ - BOOL ret = FALSE; - request_t *request; - - TRACE("%p, %p, %p, %p\n", hrequest, supported, first, target); - - if (!(request = (request_t *)grab_object( hrequest ))) - { - set_last_error( ERROR_INVALID_HANDLE ); - return FALSE; - } - if (request->hdr.type != WINHTTP_HANDLE_TYPE_REQUEST) - { - release_object( &request->hdr ); - set_last_error( ERROR_WINHTTP_INCORRECT_HANDLE_TYPE ); - return FALSE; - } - - if (query_auth_schemes( request, WINHTTP_QUERY_WWW_AUTHENTICATE, supported, first )) - { - *target = WINHTTP_AUTH_TARGET_SERVER; - ret = TRUE; - } - else if (query_auth_schemes( request, WINHTTP_QUERY_PROXY_AUTHENTICATE, supported, first )) - { - *target = WINHTTP_AUTH_TARGET_PROXY; - ret = TRUE; - } - - release_object( &request->hdr ); - return ret; -} - -static UINT encode_base64( const char *bin, unsigned int len, WCHAR *base64 ) -{ - UINT n = 0, x; - static const char base64enc[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - while (len > 0) - { - /* first 6 bits, all from bin[0] */ - base64[n++] = base64enc[(bin[0] & 0xfc) >> 2]; - x = (bin[0] & 3) << 4; - - /* next 6 bits, 2 from bin[0] and 4 from bin[1] */ - if (len == 1) - { - base64[n++] = base64enc[x]; - base64[n++] = '='; - base64[n++] = '='; - break; - } - base64[n++] = base64enc[x | ((bin[1] & 0xf0) >> 4)]; - x = (bin[1] & 0x0f) << 2; - - /* next 6 bits 4 from bin[1] and 2 from bin[2] */ - if (len == 2) - { - base64[n++] = base64enc[x]; - base64[n++] = '='; - break; - } - base64[n++] = base64enc[x | ((bin[2] & 0xc0) >> 6)]; - - /* last 6 bits, all from bin [2] */ - base64[n++] = base64enc[bin[2] & 0x3f]; - bin += 3; - len -= 3; - } - base64[n] = 0; - return n; -} - -static BOOL set_credentials( request_t *request, DWORD target, DWORD scheme, LPCWSTR username, LPCWSTR password ) -{ - static const WCHAR basic[] = {'B','a','s','i','c',' ',0}; - - const WCHAR *auth_scheme, *auth_target; - WCHAR *auth_header; - DWORD len, auth_data_len; - char *auth_data; - BOOL ret; - - switch (target) - { - case WINHTTP_AUTH_TARGET_SERVER: auth_target = attr_authorization; break; - case WINHTTP_AUTH_TARGET_PROXY: auth_target = attr_proxy_authorization; break; - default: - WARN("unknown target %x\n", target); - return FALSE; - } - switch (scheme) - { - case WINHTTP_AUTH_SCHEME_BASIC: - { - int userlen = WideCharToMultiByte( CP_UTF8, 0, username, strlenW( username ), NULL, 0, NULL, NULL ); - int passlen = WideCharToMultiByte( CP_UTF8, 0, password, strlenW( password ), NULL, 0, NULL, NULL ); - - TRACE("basic authentication\n"); - - auth_scheme = basic; - auth_data_len = userlen + 1 + passlen; - if (!(auth_data = heap_alloc( auth_data_len ))) return FALSE; - - WideCharToMultiByte( CP_UTF8, 0, username, -1, auth_data, userlen, NULL, NULL ); - auth_data[userlen] = ':'; - WideCharToMultiByte( CP_UTF8, 0, password, -1, auth_data + userlen + 1, passlen, NULL, NULL ); - break; - } - case WINHTTP_AUTH_SCHEME_NTLM: - case WINHTTP_AUTH_SCHEME_PASSPORT: - case WINHTTP_AUTH_SCHEME_DIGEST: - case WINHTTP_AUTH_SCHEME_NEGOTIATE: - FIXME("unimplemented authentication scheme %x\n", scheme); - return FALSE; - default: - WARN("unknown authentication scheme %x\n", scheme); - return FALSE; - } - - len = strlenW( auth_scheme ) + ((auth_data_len + 2) * 4) / 3; - if (!(auth_header = heap_alloc( (len + 1) * sizeof(WCHAR) ))) - { - heap_free( auth_data ); - return FALSE; - } - strcpyW( auth_header, auth_scheme ); - encode_base64( auth_data, auth_data_len, auth_header + strlenW( auth_header ) ); - - ret = process_header( request, auth_target, auth_header, WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE, TRUE ); - - heap_free( auth_data ); - heap_free( auth_header ); - return ret; -} - -/*********************************************************************** - * WinHttpSetCredentials (winhttp.@) - */ -BOOL WINAPI WinHttpSetCredentials( HINTERNET hrequest, DWORD target, DWORD scheme, LPCWSTR username, - LPCWSTR password, LPVOID params ) -{ - BOOL ret; - request_t *request; - - TRACE("%p, %x, 0x%08x, %s, %p, %p\n", hrequest, target, scheme, debugstr_w(username), password, params); - - if (!(request = (request_t *)grab_object( hrequest ))) - { - set_last_error( ERROR_INVALID_HANDLE ); - return FALSE; - } - if (request->hdr.type != WINHTTP_HANDLE_TYPE_REQUEST) - { - release_object( &request->hdr ); - set_last_error( ERROR_WINHTTP_INCORRECT_HANDLE_TYPE ); - return FALSE; - } - - ret = set_credentials( request, target, scheme, username, password ); - - release_object( &request->hdr ); - return ret; -} diff --git a/dll/win32/winhttp/session.c b/dll/win32/winhttp/session.c index 11c4b4fbf99..d14b854459f 100644 --- a/dll/win32/winhttp/session.c +++ b/dll/win32/winhttp/session.c @@ -21,16 +21,26 @@ #include "wine/debug.h" #include +#include #include "windef.h" #include "winbase.h" #include "winhttp.h" #include "wincrypt.h" +#include "winreg.h" #include "winhttp_private.h" WINE_DEFAULT_DEBUG_CHANNEL(winhttp); +#define DEFAULT_RESOLVE_TIMEOUT 0 +#define DEFAULT_CONNECT_TIMEOUT 20000 +#define DEFAULT_SEND_TIMEOUT 30000 +#define DEFAULT_RECEIVE_TIMEOUT 30000 + +/* FIXME */ +#define CP_UNIXCP CP_ACP + void set_last_error( DWORD error ) { /* FIXME */ @@ -85,6 +95,8 @@ static void session_destroy( object_header_t *hdr ) static BOOL session_query_option( object_header_t *hdr, DWORD option, LPVOID buffer, LPDWORD buflen ) { + session_t *session = (session_t *)hdr; + switch (option) { case WINHTTP_OPTION_REDIRECT_POLICY: @@ -100,6 +112,22 @@ static BOOL session_query_option( object_header_t *hdr, DWORD option, LPVOID buf *buflen = sizeof(DWORD); return TRUE; } + case WINHTTP_OPTION_RESOLVE_TIMEOUT: + *(DWORD *)buffer = session->resolve_timeout; + *buflen = sizeof(DWORD); + return TRUE; + case WINHTTP_OPTION_CONNECT_TIMEOUT: + *(DWORD *)buffer = session->connect_timeout; + *buflen = sizeof(DWORD); + return TRUE; + case WINHTTP_OPTION_SEND_TIMEOUT: + *(DWORD *)buffer = session->send_timeout; + *buflen = sizeof(DWORD); + return TRUE; + case WINHTTP_OPTION_RECEIVE_TIMEOUT: + *(DWORD *)buffer = session->recv_timeout; + *buflen = sizeof(DWORD); + return TRUE; default: FIXME("unimplemented option %u\n", option); set_last_error( ERROR_INVALID_PARAMETER ); @@ -109,6 +137,8 @@ static BOOL session_query_option( object_header_t *hdr, DWORD option, LPVOID buf static BOOL session_set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD buflen ) { + session_t *session = (session_t *)hdr; + switch (option) { case WINHTTP_OPTION_PROXY: @@ -136,6 +166,18 @@ static BOOL session_set_option( object_header_t *hdr, DWORD option, LPVOID buffe case WINHTTP_OPTION_DISABLE_FEATURE: set_last_error( ERROR_WINHTTP_INCORRECT_HANDLE_TYPE ); return FALSE; + case WINHTTP_OPTION_RESOLVE_TIMEOUT: + session->resolve_timeout = *(DWORD *)buffer; + return TRUE; + case WINHTTP_OPTION_CONNECT_TIMEOUT: + session->connect_timeout = *(DWORD *)buffer; + return TRUE; + case WINHTTP_OPTION_SEND_TIMEOUT: + session->send_timeout = *(DWORD *)buffer; + return TRUE; + case WINHTTP_OPTION_RECEIVE_TIMEOUT: + session->recv_timeout = *(DWORD *)buffer; + return TRUE; default: FIXME("unimplemented option %u\n", option); set_last_error( ERROR_INVALID_PARAMETER ); @@ -166,13 +208,39 @@ HINTERNET WINAPI WinHttpOpen( LPCWSTR agent, DWORD access, LPCWSTR proxy, LPCWST session->hdr.vtbl = &session_vtbl; session->hdr.flags = flags; session->hdr.refs = 1; - session->access = access; session->hdr.redirect_policy = WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP; + session->resolve_timeout = DEFAULT_RESOLVE_TIMEOUT; + session->connect_timeout = DEFAULT_CONNECT_TIMEOUT; + session->send_timeout = DEFAULT_SEND_TIMEOUT; + session->recv_timeout = DEFAULT_RECEIVE_TIMEOUT; list_init( &session->cookie_cache ); if (agent && !(session->agent = strdupW( agent ))) goto end; - if (proxy && !(session->proxy_server = strdupW( proxy ))) goto end; - if (bypass && !(session->proxy_bypass = strdupW( bypass ))) goto end; + if (access == WINHTTP_ACCESS_TYPE_DEFAULT_PROXY) + { + WINHTTP_PROXY_INFO info; + + WinHttpGetDefaultProxyConfiguration( &info ); + session->access = info.dwAccessType; + if (info.lpszProxy && !(session->proxy_server = strdupW( info.lpszProxy ))) + { + GlobalFree( (LPWSTR)info.lpszProxy ); + GlobalFree( (LPWSTR)info.lpszProxyBypass ); + goto end; + } + if (info.lpszProxyBypass && !(session->proxy_bypass = strdupW( info.lpszProxyBypass ))) + { + GlobalFree( (LPWSTR)info.lpszProxy ); + GlobalFree( (LPWSTR)info.lpszProxyBypass ); + goto end; + } + } + else if (access == WINHTTP_ACCESS_TYPE_NAMED_PROXY) + { + session->access = access; + if (proxy && !(session->proxy_server = strdupW( proxy ))) goto end; + if (bypass && !(session->proxy_bypass = strdupW( bypass ))) goto end; + } if (!(handle = alloc_handle( &session->hdr ))) goto end; session->hdr.handle = handle; @@ -201,13 +269,199 @@ static void connect_destroy( object_header_t *hdr ) heap_free( connect ); } +static BOOL connect_query_option( object_header_t *hdr, DWORD option, LPVOID buffer, LPDWORD buflen ) +{ + connect_t *connect = (connect_t *)hdr; + + switch (option) + { + case WINHTTP_OPTION_PARENT_HANDLE: + { + if (!buffer || *buflen < sizeof(HINTERNET)) + { + *buflen = sizeof(HINTERNET); + set_last_error( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } + + *(HINTERNET *)buffer = ((object_header_t *)connect->session)->handle; + *buflen = sizeof(HINTERNET); + return TRUE; + } + case WINHTTP_OPTION_RESOLVE_TIMEOUT: + *(DWORD *)buffer = connect->session->resolve_timeout; + *buflen = sizeof(DWORD); + return TRUE; + case WINHTTP_OPTION_CONNECT_TIMEOUT: + *(DWORD *)buffer = connect->session->connect_timeout; + *buflen = sizeof(DWORD); + return TRUE; + case WINHTTP_OPTION_SEND_TIMEOUT: + *(DWORD *)buffer = connect->session->send_timeout; + *buflen = sizeof(DWORD); + return TRUE; + case WINHTTP_OPTION_RECEIVE_TIMEOUT: + *(DWORD *)buffer = connect->session->recv_timeout; + *buflen = sizeof(DWORD); + return TRUE; + default: + FIXME("unimplemented option %u\n", option); + set_last_error( ERROR_INVALID_PARAMETER ); + return FALSE; + } +} + static const object_vtbl_t connect_vtbl = { connect_destroy, - NULL, + connect_query_option, NULL }; +static BOOL domain_matches(LPCWSTR server, LPCWSTR domain) +{ + static const WCHAR localW[] = { '<','l','o','c','a','l','>',0 }; + BOOL ret = FALSE; + + if (!strcmpiW( domain, localW ) && !strchrW( server, '.' )) + ret = TRUE; + else if (*domain == '*') + { + if (domain[1] == '.') + { + LPCWSTR dot; + + /* For a hostname to match a wildcard, the last domain must match + * the wildcard exactly. E.g. if the wildcard is *.a.b, and the + * hostname is www.foo.a.b, it matches, but a.b does not. + */ + dot = strchrW( server, '.' ); + if (dot) + { + int len = strlenW( dot + 1 ); + + if (len > strlenW( domain + 2 )) + { + LPCWSTR ptr; + + /* The server's domain is longer than the wildcard, so it + * could be a subdomain. Compare the last portion of the + * server's domain. + */ + ptr = dot + len + 1 - strlenW( domain + 2 ); + if (!strcmpiW( ptr, domain + 2 )) + { + /* This is only a match if the preceding character is + * a '.', i.e. that it is a matching domain. E.g. + * if domain is '*.b.c' and server is 'www.ab.c' they + * do not match. + */ + ret = *(ptr - 1) == '.'; + } + } + else + ret = !strcmpiW( dot + 1, domain + 2 ); + } + } + } + else + ret = !strcmpiW( server, domain ); + return ret; +} + +/* Matches INTERNET_MAX_HOST_NAME_LENGTH in wininet.h, also RFC 1035 */ +#define MAX_HOST_NAME_LENGTH 256 + +static BOOL should_bypass_proxy(session_t *session, LPCWSTR server) +{ + LPCWSTR ptr; + BOOL ret = FALSE; + + if (!session->proxy_bypass) return FALSE; + ptr = session->proxy_bypass; + do { + LPCWSTR tmp = ptr; + + ptr = strchrW( ptr, ';' ); + if (!ptr) + ptr = strchrW( tmp, ' ' ); + if (ptr) + { + if (ptr - tmp < MAX_HOST_NAME_LENGTH) + { + WCHAR domain[MAX_HOST_NAME_LENGTH]; + + memcpy( domain, tmp, (ptr - tmp) * sizeof(WCHAR) ); + domain[ptr - tmp] = 0; + ret = domain_matches( server, domain ); + } + ptr += 1; + } + else if (*tmp) + ret = domain_matches( server, tmp ); + } while (ptr && !ret); + return ret; +} + +BOOL set_server_for_hostname( connect_t *connect, LPCWSTR server, INTERNET_PORT port ) +{ + session_t *session = connect->session; + BOOL ret = TRUE; + + if (session->proxy_server && !should_bypass_proxy(session, server)) + { + LPCWSTR colon; + + if ((colon = strchrW( session->proxy_server, ':' ))) + { + if (!connect->servername || strncmpiW( connect->servername, + session->proxy_server, colon - session->proxy_server - 1 )) + { + heap_free( connect->servername ); + if (!(connect->servername = heap_alloc( + (colon - session->proxy_server + 1) * sizeof(WCHAR) ))) + { + ret = FALSE; + goto end; + } + memcpy( connect->servername, session->proxy_server, + (colon - session->proxy_server) * sizeof(WCHAR) ); + connect->servername[colon - session->proxy_server] = 0; + if (*(colon + 1)) + connect->serverport = atoiW( colon + 1 ); + else + connect->serverport = INTERNET_DEFAULT_PORT; + } + } + else + { + if (!connect->servername || strcmpiW( connect->servername, + session->proxy_server )) + { + heap_free( connect->servername ); + if (!(connect->servername = strdupW( session->proxy_server ))) + { + ret = FALSE; + goto end; + } + connect->serverport = INTERNET_DEFAULT_PORT; + } + } + } + else if (server) + { + heap_free( connect->servername ); + if (!(connect->servername = strdupW( server ))) + { + ret = FALSE; + goto end; + } + connect->serverport = port; + } +end: + return ret; +} + /*********************************************************************** * WinHttpConnect (winhttp.@) */ @@ -252,11 +506,11 @@ HINTERNET WINAPI WinHttpConnect( HINTERNET hsession, LPCWSTR server, INTERNET_PO connect->session = session; list_add_head( &session->hdr.children, &connect->hdr.entry ); - if (server && !(connect->hostname = strdupW( server ))) goto end; + if (!(connect->hostname = strdupW( server ))) goto end; connect->hostport = port; - if (server && !(connect->servername = strdupW( server ))) goto end; - connect->serverport = port; + if (!set_server_for_hostname( connect, server, port )) + goto end; if (!(hconnect = alloc_handle( &connect->hdr ))) goto end; connect->hdr.handle = hconnect; @@ -296,13 +550,40 @@ static void request_destroy( object_header_t *hdr ) heap_free( request ); } +static void str_to_buffer( WCHAR *buffer, const WCHAR *str, LPDWORD buflen ) +{ + int len = 0; + if (str) len = strlenW( str ); + if (buffer && *buflen > len) + { + memcpy( buffer, str, len * sizeof(WCHAR) ); + buffer[len] = 0; + } + *buflen = len * sizeof(WCHAR); +} + +static WCHAR *blob_to_str( DWORD encoding, CERT_NAME_BLOB *blob ) +{ + WCHAR *ret; + DWORD size, format = CERT_SIMPLE_NAME_STR | CERT_NAME_STR_CRLF_FLAG; + + size = CertNameToStrW( encoding, blob, format, NULL, 0 ); + if ((ret = LocalAlloc( 0, size * sizeof(WCHAR) ))) + CertNameToStrW( encoding, blob, format, ret, size ); + + return ret; +} + static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buffer, LPDWORD buflen ) { + request_t *request = (request_t *)hdr; + switch (option) { case WINHTTP_OPTION_SECURITY_FLAGS: { DWORD flags; + int bits; if (!buffer || *buflen < sizeof(flags)) { @@ -313,6 +594,14 @@ static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buf flags = 0; if (hdr->flags & WINHTTP_FLAG_SECURE) flags |= SECURITY_FLAG_SECURE; + flags |= request->netconn.security_flags; + bits = netconn_get_cipher_strength( &request->netconn ); + if (bits >= 128) + flags |= SECURITY_FLAG_STRENGTH_STRONG; + else if (bits >= 56) + flags |= SECURITY_FLAG_STRENGTH_MEDIUM; + else + flags |= SECURITY_FLAG_STRENGTH_WEAK; *(DWORD *)buffer = flags; *buflen = sizeof(flags); return TRUE; @@ -320,7 +609,6 @@ static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buf case WINHTTP_OPTION_SERVER_CERT_CONTEXT: { const CERT_CONTEXT *cert; - request_t *request = (request_t *)hdr; if (!buffer || *buflen < sizeof(cert)) { @@ -334,6 +622,41 @@ static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buf *buflen = sizeof(cert); return TRUE; } + case WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT: + { + const CERT_CONTEXT *cert; + const CRYPT_OID_INFO *oidInfo; + WINHTTP_CERTIFICATE_INFO *ci = buffer; + + FIXME("partial stub\n"); + + if (!buffer || *buflen < sizeof(*ci)) + { + *buflen = sizeof(*ci); + set_last_error( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } + if (!(cert = netconn_get_certificate( &request->netconn ))) return FALSE; + + ci->ftExpiry = cert->pCertInfo->NotAfter; + ci->ftStart = cert->pCertInfo->NotBefore; + ci->lpszSubjectInfo = blob_to_str( cert->dwCertEncodingType, &cert->pCertInfo->Subject ); + ci->lpszIssuerInfo = blob_to_str( cert->dwCertEncodingType, &cert->pCertInfo->Issuer ); + ci->lpszProtocolName = NULL; + oidInfo = CryptFindOIDInfo( CRYPT_OID_INFO_OID_KEY, + cert->pCertInfo->SignatureAlgorithm.pszObjId, + 0 ); + if (oidInfo) + ci->lpszSignatureAlgName = (LPWSTR)oidInfo->pwszName; + else + ci->lpszSignatureAlgName = NULL; + ci->lpszEncryptionAlgName = NULL; + ci->dwKeySize = netconn_get_cipher_strength( &request->netconn ); + + CertFreeCertificateContext( cert ); + *buflen = sizeof(*ci); + return TRUE; + } case WINHTTP_OPTION_SECURITY_KEY_BITNESS: { if (!buffer || *buflen < sizeof(DWORD)) @@ -343,10 +666,43 @@ static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buf return FALSE; } - *(DWORD *)buffer = 128; /* FIXME */ + *(DWORD *)buffer = netconn_get_cipher_strength( &request->netconn ); *buflen = sizeof(DWORD); return TRUE; } + case WINHTTP_OPTION_RESOLVE_TIMEOUT: + *(DWORD *)buffer = request->resolve_timeout; + *buflen = sizeof(DWORD); + return TRUE; + case WINHTTP_OPTION_CONNECT_TIMEOUT: + *(DWORD *)buffer = request->connect_timeout; + *buflen = sizeof(DWORD); + return TRUE; + case WINHTTP_OPTION_SEND_TIMEOUT: + *(DWORD *)buffer = request->send_timeout; + *buflen = sizeof(DWORD); + return TRUE; + case WINHTTP_OPTION_RECEIVE_TIMEOUT: + *(DWORD *)buffer = request->recv_timeout; + *buflen = sizeof(DWORD); + return TRUE; + + case WINHTTP_OPTION_USERNAME: + str_to_buffer( buffer, request->connect->username, buflen ); + return TRUE; + + case WINHTTP_OPTION_PASSWORD: + str_to_buffer( buffer, request->connect->password, buflen ); + return TRUE; + + case WINHTTP_OPTION_PROXY_USERNAME: + str_to_buffer( buffer, request->connect->session->proxy_username, buflen ); + return TRUE; + + case WINHTTP_OPTION_PROXY_PASSWORD: + str_to_buffer( buffer, request->connect->session->proxy_password, buflen ); + return TRUE; + default: FIXME("unimplemented option %u\n", option); set_last_error( ERROR_INVALID_PARAMETER ); @@ -354,8 +710,23 @@ static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buf } } +static WCHAR *buffer_to_str( WCHAR *buffer, DWORD buflen ) +{ + WCHAR *ret; + if ((ret = heap_alloc( (buflen + 1) * sizeof(WCHAR)))) + { + memcpy( ret, buffer, buflen * sizeof(WCHAR) ); + ret[buflen] = 0; + return ret; + } + set_last_error( ERROR_OUTOFMEMORY ); + return NULL; +} + static BOOL request_set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD buflen ) { + request_t *request = (request_t *)hdr; + switch (option) { case WINHTTP_OPTION_PROXY: @@ -410,6 +781,73 @@ static BOOL request_set_option( object_header_t *hdr, DWORD option, LPVOID buffe hdr->redirect_policy = policy; return TRUE; } + case WINHTTP_OPTION_SECURITY_FLAGS: + { + DWORD flags; + + if (buflen < sizeof(DWORD)) + { + set_last_error( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } + flags = *(DWORD *)buffer; + TRACE("0x%x\n", flags); + if (!(flags & (SECURITY_FLAG_IGNORE_CERT_CN_INVALID | + SECURITY_FLAG_IGNORE_CERT_DATE_INVALID | + SECURITY_FLAG_IGNORE_UNKNOWN_CA | + SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE))) + { + set_last_error( ERROR_INVALID_PARAMETER ); + return FALSE; + } + request->netconn.security_flags = flags; + return TRUE; + } + case WINHTTP_OPTION_RESOLVE_TIMEOUT: + request->resolve_timeout = *(DWORD *)buffer; + return TRUE; + case WINHTTP_OPTION_CONNECT_TIMEOUT: + request->connect_timeout = *(DWORD *)buffer; + return TRUE; + case WINHTTP_OPTION_SEND_TIMEOUT: + request->send_timeout = *(DWORD *)buffer; + return TRUE; + case WINHTTP_OPTION_RECEIVE_TIMEOUT: + request->recv_timeout = *(DWORD *)buffer; + return TRUE; + + case WINHTTP_OPTION_USERNAME: + { + connect_t *connect = request->connect; + + heap_free( connect->username ); + if (!(connect->username = buffer_to_str( buffer, buflen ))) return FALSE; + return TRUE; + } + case WINHTTP_OPTION_PASSWORD: + { + connect_t *connect = request->connect; + + heap_free( connect->password ); + if (!(connect->password = buffer_to_str( buffer, buflen ))) return FALSE; + return TRUE; + } + case WINHTTP_OPTION_PROXY_USERNAME: + { + session_t *session = request->connect->session; + + heap_free( session->proxy_username ); + if (!(session->proxy_username = buffer_to_str( buffer, buflen ))) return FALSE; + return TRUE; + } + case WINHTTP_OPTION_PROXY_PASSWORD: + { + session_t *session = request->connect->session; + + heap_free( session->proxy_password ); + if (!(session->proxy_password = buffer_to_str( buffer, buflen ))) return FALSE; + return TRUE; + } default: FIXME("unimplemented option %u\n", option); set_last_error( ERROR_INVALID_PARAMETER ); @@ -466,6 +904,10 @@ HINTERNET WINAPI WinHttpOpenRequest( HINTERNET hconnect, LPCWSTR verb, LPCWSTR o list_add_head( &connect->hdr.children, &request->hdr.entry ); if (!netconn_init( &request->netconn, request->hdr.flags & WINHTTP_FLAG_SECURE )) goto end; + request->resolve_timeout = connect->session->resolve_timeout; + request->connect_timeout = connect->session->connect_timeout; + request->send_timeout = connect->session->send_timeout; + request->recv_timeout = connect->session->recv_timeout; if (!verb || !verb[0]) verb = getW; if (!(request->verb = strdupW( verb ))) goto end; @@ -648,17 +1090,167 @@ BOOL WINAPI WinHttpDetectAutoProxyConfigUrl( DWORD flags, LPWSTR *url ) return FALSE; } +static const WCHAR Connections[] = { + 'S','o','f','t','w','a','r','e','\\', + 'M','i','c','r','o','s','o','f','t','\\', + 'W','i','n','d','o','w','s','\\', + 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', + 'I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s','\\', + 'C','o','n','n','e','c','t','i','o','n','s',0 }; +static const WCHAR WinHttpSettings[] = { + 'W','i','n','H','t','t','p','S','e','t','t','i','n','g','s',0 }; +static const DWORD WINHTTPSETTINGS_MAGIC = 0x18; +static const DWORD WINHTTP_PROXY_TYPE_DIRECT = 1; +static const DWORD WINHTTP_PROXY_TYPE_PROXY = 2; + +struct winhttp_settings_header +{ + DWORD magic; + DWORD unknown; /* always zero? */ + DWORD flags; /* one of WINHTTP_PROXY_TYPE_* */ +}; + +static inline void copy_char_to_wchar_sz(const BYTE *src, DWORD len, WCHAR *dst) +{ + const BYTE *begin; + + for (begin = src; src - begin < len; src++, dst++) + *dst = *src; + *dst = 0; +} + /*********************************************************************** * WinHttpGetDefaultProxyConfiguration (winhttp.@) */ BOOL WINAPI WinHttpGetDefaultProxyConfiguration( WINHTTP_PROXY_INFO *info ) { - FIXME("%p\n", info); + LONG l; + HKEY key; + BOOL got_from_reg = FALSE, direct = TRUE; + char *envproxy; - info->dwAccessType = WINHTTP_ACCESS_TYPE_NO_PROXY; - info->lpszProxy = NULL; - info->lpszProxyBypass = NULL; + TRACE("%p\n", info); + l = RegOpenKeyExW( HKEY_LOCAL_MACHINE, Connections, 0, KEY_READ, &key ); + if (!l) + { + DWORD type, size = 0; + + l = RegQueryValueExW( key, WinHttpSettings, NULL, &type, NULL, &size ); + if (!l && type == REG_BINARY && + size >= sizeof(struct winhttp_settings_header) + 2 * sizeof(DWORD)) + { + BYTE *buf = heap_alloc( size ); + + if (buf) + { + struct winhttp_settings_header *hdr = + (struct winhttp_settings_header *)buf; + DWORD *len = (DWORD *)(hdr + 1); + + l = RegQueryValueExW( key, WinHttpSettings, NULL, NULL, buf, + &size ); + if (!l && hdr->magic == WINHTTPSETTINGS_MAGIC && + hdr->unknown == 0) + { + if (hdr->flags & WINHTTP_PROXY_TYPE_PROXY) + { + BOOL sane = FALSE; + LPWSTR proxy = NULL; + LPWSTR proxy_bypass = NULL; + + /* Sanity-check length of proxy string */ + if ((BYTE *)len - buf + *len <= size) + { + sane = TRUE; + proxy = GlobalAlloc( 0, (*len + 1) * sizeof(WCHAR) ); + if (proxy) + copy_char_to_wchar_sz( (BYTE *)(len + 1), *len, proxy ); + len = (DWORD *)((BYTE *)(len + 1) + *len); + } + if (sane) + { + /* Sanity-check length of proxy bypass string */ + if ((BYTE *)len - buf + *len <= size) + { + proxy_bypass = GlobalAlloc( 0, (*len + 1) * sizeof(WCHAR) ); + if (proxy_bypass) + copy_char_to_wchar_sz( (BYTE *)(len + 1), *len, proxy_bypass ); + } + else + { + sane = FALSE; + GlobalFree( proxy ); + proxy = NULL; + } + } + info->lpszProxy = proxy; + info->lpszProxyBypass = proxy_bypass; + if (sane) + { + got_from_reg = TRUE; + direct = FALSE; + info->dwAccessType = + WINHTTP_ACCESS_TYPE_NAMED_PROXY; + TRACE("http proxy (from registry) = %s, bypass = %s\n", + debugstr_w(info->lpszProxy), + debugstr_w(info->lpszProxyBypass)); + } + } + } + heap_free( buf ); + } + } + RegCloseKey( key ); + } + if (!got_from_reg && (envproxy = getenv( "http_proxy" ))) + { + char *colon, *http_proxy; + + if ((colon = strchr( envproxy, ':' ))) + { + if (*(colon + 1) == '/' && *(colon + 2) == '/') + { + static const char http[] = "http://"; + + /* It's a scheme, check that it's http */ + if (!strncmp( envproxy, http, strlen( http ) )) + http_proxy = envproxy + strlen( http ); + else + { + WARN("unsupported scheme in $http_proxy: %s\n", envproxy); + http_proxy = NULL; + } + } + else + http_proxy = envproxy; + } + else + http_proxy = envproxy; + if (http_proxy) + { + WCHAR *http_proxyW; + int len; + + len = MultiByteToWideChar( CP_UNIXCP, 0, http_proxy, -1, NULL, 0 ); + if ((http_proxyW = GlobalAlloc( 0, len * sizeof(WCHAR)))) + { + MultiByteToWideChar( CP_UNIXCP, 0, http_proxy, -1, http_proxyW, len ); + direct = FALSE; + info->dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY; + info->lpszProxy = http_proxyW; + info->lpszProxyBypass = NULL; + TRACE("http proxy (from environment) = %s\n", + debugstr_w(info->lpszProxy)); + } + } + } + if (direct) + { + info->dwAccessType = WINHTTP_ACCESS_TYPE_NO_PROXY; + info->lpszProxy = NULL; + info->lpszProxyBypass = NULL; + } return TRUE; } @@ -703,9 +1295,106 @@ BOOL WINAPI WinHttpGetProxyForUrl( HINTERNET hsession, LPCWSTR url, WINHTTP_AUTO */ BOOL WINAPI WinHttpSetDefaultProxyConfiguration( WINHTTP_PROXY_INFO *info ) { - FIXME("%p [%u, %s, %s]\n", info, info->dwAccessType, debugstr_w(info->lpszProxy), - debugstr_w(info->lpszProxyBypass)); - return TRUE; + LONG l; + HKEY key; + BOOL ret = FALSE; + const WCHAR *src; + + TRACE("%p\n", info); + + if (!info) + { + set_last_error( ERROR_INVALID_PARAMETER ); + return FALSE; + } + switch (info->dwAccessType) + { + case WINHTTP_ACCESS_TYPE_NO_PROXY: + break; + case WINHTTP_ACCESS_TYPE_NAMED_PROXY: + if (!info->lpszProxy) + { + set_last_error( ERROR_INVALID_PARAMETER ); + return FALSE; + } + /* Only ASCII characters are allowed */ + for (src = info->lpszProxy; *src; src++) + if (*src > 0x7f) + { + set_last_error( ERROR_INVALID_PARAMETER ); + return FALSE; + } + if (info->lpszProxyBypass) + { + for (src = info->lpszProxyBypass; *src; src++) + if (*src > 0x7f) + { + set_last_error( ERROR_INVALID_PARAMETER ); + return FALSE; + } + } + break; + default: + set_last_error( ERROR_INVALID_PARAMETER ); + return FALSE; + } + + l = RegCreateKeyExW( HKEY_LOCAL_MACHINE, Connections, 0, NULL, 0, + KEY_WRITE, NULL, &key, NULL ); + if (!l) + { + DWORD size = sizeof(struct winhttp_settings_header) + 2 * sizeof(DWORD); + BYTE *buf; + + if (info->dwAccessType == WINHTTP_ACCESS_TYPE_NAMED_PROXY) + { + size += strlenW( info->lpszProxy ); + if (info->lpszProxyBypass) + size += strlenW( info->lpszProxyBypass ); + } + buf = heap_alloc( size ); + if (buf) + { + struct winhttp_settings_header *hdr = + (struct winhttp_settings_header *)buf; + DWORD *len = (DWORD *)(hdr + 1); + + hdr->magic = WINHTTPSETTINGS_MAGIC; + hdr->unknown = 0; + if (info->dwAccessType == WINHTTP_ACCESS_TYPE_NAMED_PROXY) + { + BYTE *dst; + + hdr->flags = WINHTTP_PROXY_TYPE_PROXY; + *len++ = strlenW( info->lpszProxy ); + for (dst = (BYTE *)len, src = info->lpszProxy; *src; + src++, dst++) + *dst = *src; + len = (DWORD *)dst; + if (info->lpszProxyBypass) + { + *len++ = strlenW( info->lpszProxyBypass ); + for (dst = (BYTE *)len, src = info->lpszProxyBypass; *src; + src++, dst++) + *dst = *src; + } + else + *len++ = 0; + } + else + { + hdr->flags = WINHTTP_PROXY_TYPE_DIRECT; + *len++ = 0; + *len++ = 0; + } + l = RegSetValueExW( key, WinHttpSettings, 0, REG_BINARY, buf, size ); + if (!l) + ret = TRUE; + heap_free( buf ); + } + RegCloseKey( key ); + } + return ret; } /*********************************************************************** @@ -737,8 +1426,69 @@ WINHTTP_STATUS_CALLBACK WINAPI WinHttpSetStatusCallback( HINTERNET handle, WINHT */ BOOL WINAPI WinHttpSetTimeouts( HINTERNET handle, int resolve, int connect, int send, int receive ) { - FIXME("%p, %d, %d, %d, %d\n", handle, resolve, connect, send, receive); - return TRUE; + BOOL ret = TRUE; + object_header_t *hdr; + request_t *request; + session_t *session; + + TRACE("%p, %d, %d, %d, %d\n", handle, resolve, connect, send, receive); + + if (resolve < -1 || connect < -1 || send < -1 || receive < -1) + { + set_last_error( ERROR_INVALID_PARAMETER ); + return FALSE; + } + + if (!(hdr = grab_object( handle ))) + { + set_last_error( ERROR_INVALID_HANDLE ); + return FALSE; + } + + switch(hdr->type) + { + case WINHTTP_HANDLE_TYPE_REQUEST: + request = (request_t *)hdr; + request->connect_timeout = connect; + + if (resolve < 0) resolve = 0; + request->resolve_timeout = resolve; + + if (send < 0) send = 0; + request->send_timeout = send; + + if (receive < 0) receive = 0; + request->recv_timeout = receive; + + if (netconn_connected( &request->netconn )) + { + if (netconn_set_timeout( &request->netconn, TRUE, send )) ret = FALSE; + if (netconn_set_timeout( &request->netconn, FALSE, receive )) ret = FALSE; + } + + release_object( &request->hdr ); + break; + + case WINHTTP_HANDLE_TYPE_SESSION: + session = (session_t *)hdr; + session->connect_timeout = connect; + + if (resolve < 0) resolve = 0; + session->resolve_timeout = resolve; + + if (send < 0) send = 0; + session->send_timeout = send; + + if (receive < 0) receive = 0; + session->recv_timeout = receive; + break; + + default: + release_object( hdr ); + set_last_error( ERROR_WINHTTP_INCORRECT_HANDLE_TYPE ); + return FALSE; + } + return ret; } static const WCHAR wkday[7][4] = diff --git a/dll/win32/winhttp/url.c b/dll/win32/winhttp/url.c index 711987ab809..09835b43c91 100644 --- a/dll/win32/winhttp/url.c +++ b/dll/win32/winhttp/url.c @@ -133,7 +133,7 @@ BOOL WINAPI WinHttpCrackUrl( LPCWSTR url, DWORD len, DWORD flags, LPURL_COMPONEN p += 2; if (!p[0]) goto exit; - if ((q = memchrW( p, '@', len - (p - url) ))) + if ((q = memchrW( p, '@', len - (p - url) )) && !(memchrW( p, '/', q - p ))) { if ((r = memchrW( p, ':', q - p ))) { @@ -368,7 +368,7 @@ BOOL WINAPI WinHttpCreateUrl( LPURL_COMPONENTS uc, DWORD flags, LPWSTR url, LPDW TRACE("%p, 0x%08x, %p, %p\n", uc, flags, url, required); - if (!uc || uc->dwStructSize != sizeof(URL_COMPONENTS) || !required) + if (!uc || uc->dwStructSize != sizeof(URL_COMPONENTS) || !required || !url) { set_last_error( ERROR_INVALID_PARAMETER ); return FALSE; @@ -376,7 +376,7 @@ BOOL WINAPI WinHttpCreateUrl( LPURL_COMPONENTS uc, DWORD flags, LPWSTR url, LPDW if (!calc_length( uc, flags, &len )) return FALSE; - if (!url || *required < len) + if (*required < len) { *required = len + 1; set_last_error( ERROR_INSUFFICIENT_BUFFER ); diff --git a/dll/win32/winhttp/winhttp_private.h b/dll/win32/winhttp/winhttp_private.h index 511e124c5a3..5da3ae1d547 100644 --- a/dll/win32/winhttp/winhttp_private.h +++ b/dll/win32/winhttp/winhttp_private.h @@ -27,6 +27,9 @@ #include "wine/unicode.h" #include +#ifdef HAVE_SYS_SOCKET_H +# include +#endif #ifdef HAVE_NETINET_IN_H # include #endif @@ -93,6 +96,10 @@ typedef struct object_header_t hdr; LPWSTR agent; DWORD access; + int resolve_timeout; + int connect_timeout; + int send_timeout; + int recv_timeout; LPWSTR proxy_server; LPWSTR proxy_bypass; LPWSTR proxy_username; @@ -110,7 +117,7 @@ typedef struct LPWSTR password; INTERNET_PORT hostport; INTERNET_PORT serverport; - struct sockaddr_in sockaddr; + struct sockaddr_storage sockaddr; } connect_t; typedef struct @@ -121,6 +128,7 @@ typedef struct char *peek_msg; char *peek_msg_mem; size_t peek_len; + DWORD security_flags; } netconn_t; typedef struct @@ -139,6 +147,10 @@ typedef struct LPWSTR version; LPWSTR raw_headers; netconn_t netconn; + int resolve_timeout; + int connect_timeout; + int send_timeout; + int recv_timeout; LPWSTR status_text; DWORD content_length; /* total number of bytes to be read (per chunk) */ DWORD content_read; /* bytes read so far */ @@ -204,22 +216,26 @@ void send_callback( object_header_t *, DWORD, LPVOID, DWORD ); void close_connection( request_t * ); BOOL netconn_close( netconn_t * ); -BOOL netconn_connect( netconn_t *, const struct sockaddr *, unsigned int ); +BOOL netconn_connect( netconn_t *, const struct sockaddr *, unsigned int, int ); BOOL netconn_connected( netconn_t * ); BOOL netconn_create( netconn_t *, int, int, int ); BOOL netconn_get_next_line( netconn_t *, char *, DWORD * ); BOOL netconn_init( netconn_t *, BOOL ); +void netconn_unload( void ); BOOL netconn_query_data_available( netconn_t *, DWORD * ); BOOL netconn_recv( netconn_t *, void *, size_t, int, int * ); -BOOL netconn_resolve( WCHAR *, INTERNET_PORT, struct sockaddr_in * ); -BOOL netconn_secure_connect( netconn_t * ); +BOOL netconn_resolve( WCHAR *, INTERNET_PORT, struct sockaddr *, socklen_t *, int ); +BOOL netconn_secure_connect( netconn_t *, WCHAR * ); BOOL netconn_send( netconn_t *, const void *, size_t, int, int * ); +DWORD netconn_set_timeout( netconn_t *, BOOL, int ); const void *netconn_get_certificate( netconn_t * ); +int netconn_get_cipher_strength( netconn_t * ); BOOL set_cookies( request_t *, const WCHAR * ); BOOL add_cookie_headers( request_t * ); BOOL add_request_headers( request_t *, LPCWSTR, DWORD, DWORD ); void delete_domain( domain_t * ); +BOOL set_server_for_hostname( connect_t *connect, LPCWSTR server, INTERNET_PORT port ); static inline void *heap_alloc( SIZE_T size ) { diff --git a/dll/win32/winhttp/winhttp_ros.diff b/dll/win32/winhttp/winhttp_ros.diff index 2ea0e936de6..84b874997ad 100644 --- a/dll/win32/winhttp/winhttp_ros.diff +++ b/dll/win32/winhttp/winhttp_ros.diff @@ -1,111 +1,104 @@ ---- net.c Wed Sep 03 14:46:10 2008 -+++ net.c Sun Sep 07 10:54:26 2008 -@@ -59,6 +59,7 @@ - - #define DEFAULT_SEND_TIMEOUT 30 - #define DEFAULT_RECEIVE_TIMEOUT 30 -+#define RESPONSE_TIMEOUT 30 - - #ifndef HAVE_GETADDRINFO - -@@ -110,6 +111,7 @@ - +--- wine-1.3.4/dlls/winhttp/net.c 2010-10-01 14:46:44.000000000 -0400 ++++ dll/win32/winhttp/net.c 2010-10-09 17:04:11.000000000 -0400 +@@ -158,6 +158,7 @@ #endif -+#if 0 /* translate a unix error code into a winsock error code */ ++#if 0 static int sock_get_error( int err ) { -@@ -174,6 +176,9 @@ - } + #if !defined(__MINGW32__) && !defined (_MSC_VER) +@@ -223,6 +224,9 @@ + #endif return err; } +#else +#define sock_get_error(x) WSAGetLastError() +#endif - BOOL netconn_init( netconn_t *conn, BOOL secure ) - { -@@ -282,7 +287,7 @@ - conn->secure = FALSE; - } - #endif -- res = close( conn->socket ); -+ res = closesocket( conn->socket ); - conn->socket = -1; - if (res == -1) - { -@@ -463,7 +468,7 @@ - return TRUE; - } - #ifdef FIONREAD -- if (!(ret = ioctl( conn->socket, FIONREAD, &unread ))) -+ if (!(ret = ioctlsocket( conn->socket, FIONREAD, &unread ))) - { - TRACE("%d bytes of queued, but unread data\n", unread); - *available += unread; -@@ -474,7 +479,8 @@ + #ifdef SONAME_LIBSSL + static PCCERT_CONTEXT X509_to_cert_context(X509 *cert) +@@ -632,11 +636,16 @@ + res = sock_get_error( errno ); + if (res == WSAEWOULDBLOCK || res == WSAEINPROGRESS) + { +- struct pollfd pfd; ++ fd_set outfd; ++ struct timeval tv; ++ ++ FD_ZERO(&outfd); ++ FD_SET(conn->socket, &outfd); + +- pfd.fd = conn->socket; +- pfd.events = POLLOUT; +- if (poll( &pfd, 1, timeout ) > 0) ++ tv.tv_sec = 0; ++ tv.tv_usec = timeout * 1000; ++ ++ if (select( 0, NULL, &outfd, NULL, &tv ) > 0) + ret = TRUE; + else + res = sock_get_error( errno ); +@@ -832,7 +841,7 @@ BOOL netconn_get_next_line( netconn_t *conn, char *buffer, DWORD *buflen ) { - struct pollfd pfd; -+ struct timeval tv; + fd_set infd; BOOL ret = FALSE; DWORD recvd = 0; -@@ -516,11 +522,13 @@ +@@ -867,20 +876,22 @@ + return FALSE; #endif } - +- - pfd.fd = conn->socket; - pfd.events = POLLIN; ++ + FD_ZERO(&infd); + FD_SET(conn->socket, &infd); -+ tv.tv_sec=RESPONSE_TIMEOUT; -+ tv.tv_usec=0; ++ while (recvd < *buflen) { -- if (poll( &pfd, 1, DEFAULT_RECEIVE_TIMEOUT * 1000 ) > 0) -+ if (select(conn->socket+1,&infd,NULL,NULL,&tv) > 0) - { - int res; - if ((res = recv( conn->socket, &buffer[recvd], 1, 0 )) <= 0) ---- request.c Fri Sep 05 17:34:17 2008 -+++ request.c Sun Sep 07 11:29:55 2008 -@@ -20,6 +20,7 @@ - #include "wine/port.h" - #include "wine/debug.h" +- int timeout, res; +- struct timeval tv; ++ int res; ++ struct timeval tv, *ptv; + socklen_t len = sizeof(tv); -+#include - #include - #ifdef HAVE_ARPA_INET_H - # include -@@ -33,6 +34,8 @@ - #include "winhttp.h" + if ((res = getsockopt( conn->socket, SOL_SOCKET, SO_RCVTIMEO, (void*)&tv, &len ) != -1)) +- timeout = tv.tv_sec * 1000 + tv.tv_usec / 1000; ++ ptv = &tv; + else +- timeout = -1; +- if (poll( &pfd, 1, timeout ) > 0) ++ ptv = NULL; ++ ++ if (select( 0, &infd, NULL, NULL, ptv ) > 0) + { + if ((res = recv( conn->socket, &buffer[recvd], 1, 0 )) <= 0) + { +--- wine-1.3.4/dlls/winhttp/session.c 2010-10-01 14:46:44.000000000 -0400 ++++ dll/win32/winhttp/session.c 2010-10-09 17:04:11.000000000 -0400 +@@ -38,6 +38,9 @@ + #define DEFAULT_SEND_TIMEOUT 30000 + #define DEFAULT_RECEIVE_TIMEOUT 30000 + ++/* FIXME */ ++#define CP_UNIXCP CP_ACP ++ + void set_last_error( DWORD error ) + { + /* FIXME */ +--- wine-1.3.4/dlls/winhttp/request.c 2010-10-01 14:46:44.000000000 -0400 ++++ dll/win32/winhttp/request.c 2010-10-09 17:04:11.000000000 -0400 +@@ -34,6 +34,8 @@ #include "winhttp_private.h" -+ -+#include "inet_ntop.c" ++#include "inet_ntop.c" ++ WINE_DEFAULT_DEBUG_CHANNEL(winhttp); ---- winhttp_private.h Thu Sep 04 15:27:29 2008 -+++ winhttp_private.h Sun Sep 07 10:46:54 2008 -@@ -33,8 +33,14 @@ - # include - #endif - #if defined(__MINGW32__) || defined (_MSC_VER) --# include --#endif -+# include "ws2tcpip.h" -+# ifndef MSG_WAITALL -+# define MSG_WAITALL 0 -+# endif -+#else -+# define closesocket close -+# define ioctlsocket ioctl -+#endif /* __MINGW32__ */ - - typedef struct _object_header_t object_header_t; - + static const WCHAR attr_accept[] = {'A','c','c','e','p','t',0}; \ No newline at end of file diff --git a/dll/win32/wininet/cookie.c b/dll/win32/wininet/cookie.c index 75cf049308b..7dfd2a82a8d 100644 --- a/dll/win32/wininet/cookie.c +++ b/dll/win32/wininet/cookie.c @@ -431,7 +431,7 @@ static BOOL set_cookie(LPCWSTR domain, LPCWSTR path, LPCWSTR cookie_name, LPCWST value = data = heap_strdupW(cookie_data); if (!data) { - ERR("could not allocate %zu bytes for the cookie data buffer\n", (strlenW(cookie_data) + 1) * sizeof(WCHAR)); + ERR("could not allocate the cookie data buffer\n"); return FALSE; } @@ -457,7 +457,7 @@ static BOOL set_cookie(LPCWSTR domain, LPCWSTR path, LPCWSTR cookie_name, LPCWST if (value == NULL) { HeapFree(GetProcessHeap(), 0, data); - ERR("could not allocate %zu bytes for the cookie value buffer\n", (ptr - data) * sizeof(WCHAR)); + ERR("could not allocate the cookie value buffer\n"); return FALSE; } strcpyW(value, data); diff --git a/dll/win32/wininet/http.c b/dll/win32/wininet/http.c index d14a52281e7..324f6c5f535 100644 --- a/dll/win32/wininet/http.c +++ b/dll/win32/wininet/http.c @@ -181,7 +181,7 @@ struct gzip_stream_t { BOOL end_of_data; }; -typedef struct _authorizationData +typedef struct _basicAuthorizationData { struct list entry; @@ -189,9 +189,24 @@ typedef struct _authorizationData LPWSTR lpszwRealm; LPSTR lpszAuthorization; UINT AuthorizationLen; +} basicAuthorizationData; + +typedef struct _authorizationData +{ + struct list entry; + + LPWSTR host; + LPWSTR scheme; + LPWSTR domain; + UINT domain_len; + LPWSTR user; + UINT user_len; + LPWSTR password; + UINT password_len; } authorizationData; static struct list basicAuthorizationCache = LIST_INIT(basicAuthorizationCache); +static struct list authorizationCache = LIST_INIT(authorizationCache); static CRITICAL_SECTION authcache_cs; static CRITICAL_SECTION_DEBUG critsect_debug = @@ -572,13 +587,13 @@ static void destroy_authinfo( struct HttpAuthInfo *authinfo ) static UINT retrieve_cached_basic_authorization(LPWSTR host, LPWSTR realm, LPSTR *auth_data) { - authorizationData *ad; + basicAuthorizationData *ad; UINT rc = 0; TRACE("Looking for authorization for %s:%s\n",debugstr_w(host),debugstr_w(realm)); EnterCriticalSection(&authcache_cs); - LIST_FOR_EACH_ENTRY(ad, &basicAuthorizationCache, authorizationData, entry) + LIST_FOR_EACH_ENTRY(ad, &basicAuthorizationCache, basicAuthorizationData, entry) { if (!strcmpiW(host,ad->lpszwHost) && !strcmpW(realm,ad->lpszwRealm)) { @@ -596,14 +611,14 @@ static UINT retrieve_cached_basic_authorization(LPWSTR host, LPWSTR realm, LPSTR static void cache_basic_authorization(LPWSTR host, LPWSTR realm, LPSTR auth_data, UINT auth_data_len) { struct list *cursor; - authorizationData* ad = NULL; + basicAuthorizationData* ad = NULL; TRACE("caching authorization for %s:%s = %s\n",debugstr_w(host),debugstr_w(realm),debugstr_an(auth_data,auth_data_len)); EnterCriticalSection(&authcache_cs); LIST_FOR_EACH(cursor, &basicAuthorizationCache) { - authorizationData *check = LIST_ENTRY(cursor,authorizationData,entry); + basicAuthorizationData *check = LIST_ENTRY(cursor,basicAuthorizationData,entry); if (!strcmpiW(host,check->lpszwHost) && !strcmpW(realm,check->lpszwRealm)) { ad = check; @@ -621,7 +636,7 @@ static void cache_basic_authorization(LPWSTR host, LPWSTR realm, LPSTR auth_data } else { - ad = HeapAlloc(GetProcessHeap(),0,sizeof(authorizationData)); + ad = HeapAlloc(GetProcessHeap(),0,sizeof(basicAuthorizationData)); ad->lpszwHost = heap_strdupW(host); ad->lpszwRealm = heap_strdupW(realm); ad->lpszAuthorization = HeapAlloc(GetProcessHeap(),0,auth_data_len); @@ -633,6 +648,95 @@ static void cache_basic_authorization(LPWSTR host, LPWSTR realm, LPSTR auth_data LeaveCriticalSection(&authcache_cs); } +static BOOL retrieve_cached_authorization(LPWSTR host, LPWSTR scheme, + SEC_WINNT_AUTH_IDENTITY_W *nt_auth_identity) +{ + authorizationData *ad; + + TRACE("Looking for authorization for %s:%s\n", debugstr_w(host), debugstr_w(scheme)); + + EnterCriticalSection(&authcache_cs); + LIST_FOR_EACH_ENTRY(ad, &authorizationCache, authorizationData, entry) { + if(!strcmpiW(host, ad->host) && !strcmpiW(scheme, ad->scheme)) { + TRACE("Authorization found in cache\n"); + + nt_auth_identity->User = heap_strdupW(ad->user); + nt_auth_identity->Password = heap_strdupW(ad->password); + nt_auth_identity->Domain = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*ad->domain_len); + if(!nt_auth_identity->User || !nt_auth_identity->Password || + (!nt_auth_identity->Domain && ad->domain_len)) { + HeapFree(GetProcessHeap(), 0, nt_auth_identity->User); + HeapFree(GetProcessHeap(), 0, nt_auth_identity->Password); + HeapFree(GetProcessHeap(), 0, nt_auth_identity->Domain); + break; + } + + nt_auth_identity->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; + nt_auth_identity->UserLength = ad->user_len; + nt_auth_identity->PasswordLength = ad->password_len; + memcpy(nt_auth_identity->Domain, ad->domain, sizeof(WCHAR)*ad->domain_len); + nt_auth_identity->DomainLength = ad->domain_len; + LeaveCriticalSection(&authcache_cs); + return TRUE; + } + } + LeaveCriticalSection(&authcache_cs); + + return FALSE; +} + +static void cache_authorization(LPWSTR host, LPWSTR scheme, + SEC_WINNT_AUTH_IDENTITY_W *nt_auth_identity) +{ + authorizationData *ad; + BOOL found = FALSE; + + TRACE("Caching authorization for %s:%s\n", debugstr_w(host), debugstr_w(scheme)); + + EnterCriticalSection(&authcache_cs); + LIST_FOR_EACH_ENTRY(ad, &authorizationCache, authorizationData, entry) + if(!strcmpiW(host, ad->host) && !strcmpiW(scheme, ad->scheme)) { + found = TRUE; + break; + } + + if(found) { + HeapFree(GetProcessHeap(), 0, ad->user); + HeapFree(GetProcessHeap(), 0, ad->password); + HeapFree(GetProcessHeap(), 0, ad->domain); + } else { + ad = HeapAlloc(GetProcessHeap(), 0, sizeof(authorizationData)); + if(!ad) { + LeaveCriticalSection(&authcache_cs); + return; + } + + ad->host = heap_strdupW(host); + ad->scheme = heap_strdupW(scheme); + list_add_head(&authorizationCache, &ad->entry); + } + + ad->user = heap_strndupW(nt_auth_identity->User, nt_auth_identity->UserLength); + ad->password = heap_strndupW(nt_auth_identity->Password, nt_auth_identity->PasswordLength); + ad->domain = heap_strndupW(nt_auth_identity->Domain, nt_auth_identity->DomainLength); + ad->user_len = nt_auth_identity->UserLength; + ad->password_len = nt_auth_identity->PasswordLength; + ad->domain_len = nt_auth_identity->DomainLength; + + if(!ad->host || !ad->scheme || !ad->user || !ad->password + || (nt_auth_identity->Domain && !ad->domain)) { + HeapFree(GetProcessHeap(), 0, ad->host); + HeapFree(GetProcessHeap(), 0, ad->scheme); + HeapFree(GetProcessHeap(), 0, ad->user); + HeapFree(GetProcessHeap(), 0, ad->password); + HeapFree(GetProcessHeap(), 0, ad->domain); + list_remove(&ad->entry); + HeapFree(GetProcessHeap(), 0, ad); + } + + LeaveCriticalSection(&authcache_cs); +} + static BOOL HTTP_DoAuthorization( http_request_t *lpwhr, LPCWSTR pszAuthValue, struct HttpAuthInfo **ppAuthInfo, LPWSTR domain_and_username, LPWSTR password, @@ -707,7 +811,11 @@ static BOOL HTTP_DoAuthorization( http_request_t *lpwhr, LPCWSTR pszAuthValue, nt_auth_identity.DomainLength = domain ? user - domain - 1 : 0; nt_auth_identity.Password = password; nt_auth_identity.PasswordLength = strlenW(nt_auth_identity.Password); + + cache_authorization(host, pAuthInfo->scheme, &nt_auth_identity); } + else if(retrieve_cached_authorization(host, pAuthInfo->scheme, &nt_auth_identity)) + pAuthData = &nt_auth_identity; else /* use default credentials */ pAuthData = NULL; @@ -717,6 +825,13 @@ static BOOL HTTP_DoAuthorization( http_request_t *lpwhr, LPCWSTR pszAuthValue, pAuthData, NULL, NULL, &pAuthInfo->cred, &exp); + + if(pAuthData && !domain_and_username) { + HeapFree(GetProcessHeap(), 0, nt_auth_identity.User); + HeapFree(GetProcessHeap(), 0, nt_auth_identity.Domain); + HeapFree(GetProcessHeap(), 0, nt_auth_identity.Password); + } + if (sec_status == SEC_E_OK) { PSecPkgInfoW sec_pkg_info; @@ -1426,6 +1541,20 @@ static DWORD HTTP_ResolveName(http_request_t *lpwhr) return ERROR_SUCCESS; } +static BOOL HTTP_GetRequestURL(http_request_t *req, LPWSTR buf) +{ + LPHTTPHEADERW host_header; + + static const WCHAR formatW[] = {'h','t','t','p',':','/','/','%','s','%','s',0}; + + host_header = HTTP_GetHeader(req, hostW); + if(!host_header) + return FALSE; + + sprintfW(buf, formatW, host_header->lpszValue, req->lpszPath); /* FIXME */ + return TRUE; +} + /*********************************************************************** * HTTPREQ_Destroy (internal) @@ -1440,9 +1569,19 @@ static void HTTPREQ_Destroy(object_header_t *hdr) TRACE("\n"); - if(lpwhr->hCacheFile) + if(lpwhr->hCacheFile) { + WCHAR url[INTERNET_MAX_URL_LENGTH]; + FILETIME ft; + CloseHandle(lpwhr->hCacheFile); + memset(&ft, 0, sizeof(FILETIME)); + if(HTTP_GetRequestURL(lpwhr, url)) { + CommitUrlCacheEntryW(url, lpwhr->lpszCacheFile, ft, ft, + NORMAL_CACHE_ENTRY, NULL, 0, NULL, 0); + } + } + HeapFree(GetProcessHeap(), 0, lpwhr->lpszCacheFile); DeleteCriticalSection( &lpwhr->read_section ); @@ -1493,20 +1632,6 @@ static void HTTPREQ_CloseConnection(object_header_t *hdr) INTERNET_STATUS_CONNECTION_CLOSED, 0, 0); } -static BOOL HTTP_GetRequestURL(http_request_t *req, LPWSTR buf) -{ - LPHTTPHEADERW host_header; - - static const WCHAR formatW[] = {'h','t','t','p',':','/','/','%','s','%','s',0}; - - host_header = HTTP_GetHeader(req, hostW); - if(!host_header) - return FALSE; - - sprintfW(buf, formatW, host_header->lpszValue, req->lpszPath); /* FIXME */ - return TRUE; -} - static BOOL HTTP_KeepAlive(http_request_t *lpwhr) { WCHAR szVersion[10]; @@ -1567,18 +1692,25 @@ static DWORD HTTPREQ_QueryOption(object_header_t *hdr, DWORD option, void *buffe case INTERNET_OPTION_SECURITY_FLAGS: { - http_session_t *lpwhs; - lpwhs = req->lpHttpSession; + DWORD flags; + int bits; if (*size < sizeof(ULONG)) return ERROR_INSUFFICIENT_BUFFER; *size = sizeof(DWORD); - if (lpwhs->hdr.dwFlags & INTERNET_FLAG_SECURE) - *(DWORD*)buffer = SECURITY_FLAG_SECURE; + flags = 0; + if (req->hdr.dwFlags & INTERNET_FLAG_SECURE) + flags |= SECURITY_FLAG_SECURE; + flags |= req->netConnection.security_flags; + bits = NETCON_GetCipherStrength(&req->netConnection); + if (bits >= 128) + flags |= SECURITY_FLAG_STRENGTH_STRONG; + else if (bits >= 56) + flags |= SECURITY_FLAG_STRENGTH_MEDIUM; else - *(DWORD*)buffer = 0; - FIXME("Semi-STUB INTERNET_OPTION_SECURITY_FLAGS: %x\n",*(DWORD*)buffer); + flags |= SECURITY_FLAG_STRENGTH_WEAK; + *(DWORD *)buffer = flags; return ERROR_SUCCESS; } @@ -1696,60 +1828,34 @@ static DWORD HTTPREQ_QueryOption(object_header_t *hdr, DWORD option, void *buffe case INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT: { PCCERT_CONTEXT context; - if(*size < sizeof(INTERNET_CERTIFICATE_INFOW)) { - *size = sizeof(INTERNET_CERTIFICATE_INFOW); + if(*size < sizeof(INTERNET_CERTIFICATE_INFOA)) { + *size = sizeof(INTERNET_CERTIFICATE_INFOA); return ERROR_INSUFFICIENT_BUFFER; } context = (PCCERT_CONTEXT)NETCON_GetCert(&(req->netConnection)); if(context) { - INTERNET_CERTIFICATE_INFOW *info = (INTERNET_CERTIFICATE_INFOW*)buffer; + INTERNET_CERTIFICATE_INFOA *info = (INTERNET_CERTIFICATE_INFOA*)buffer; DWORD len; memset(info, 0, sizeof(INTERNET_CERTIFICATE_INFOW)); info->ftExpiry = context->pCertInfo->NotAfter; info->ftStart = context->pCertInfo->NotBefore; - if(unicode) { - len = CertNameToStrW(context->dwCertEncodingType, - &context->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, NULL, 0); - info->lpszSubjectInfo = LocalAlloc(0, len*sizeof(WCHAR)); - if(info->lpszSubjectInfo) - CertNameToStrW(context->dwCertEncodingType, - &context->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, - info->lpszSubjectInfo, len); - len = CertNameToStrW(context->dwCertEncodingType, - &context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, NULL, 0); - info->lpszIssuerInfo = LocalAlloc(0, len*sizeof(WCHAR)); - if (info->lpszIssuerInfo) - CertNameToStrW(context->dwCertEncodingType, - &context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, - info->lpszIssuerInfo, len); - }else { - INTERNET_CERTIFICATE_INFOA *infoA = (INTERNET_CERTIFICATE_INFOA*)info; - - len = CertNameToStrA(context->dwCertEncodingType, - &context->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, NULL, 0); - infoA->lpszSubjectInfo = LocalAlloc(0, len); - if(infoA->lpszSubjectInfo) - CertNameToStrA(context->dwCertEncodingType, - &context->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, - infoA->lpszSubjectInfo, len); - len = CertNameToStrA(context->dwCertEncodingType, - &context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, NULL, 0); - infoA->lpszIssuerInfo = LocalAlloc(0, len); - if(infoA->lpszIssuerInfo) - CertNameToStrA(context->dwCertEncodingType, - &context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, - infoA->lpszIssuerInfo, len); - } - - /* - * Contrary to MSDN, these do not appear to be set. - * lpszProtocolName - * lpszSignatureAlgName - * lpszEncryptionAlgName - * dwKeySize - */ + len = CertNameToStrA(context->dwCertEncodingType, + &context->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, NULL, 0); + info->lpszSubjectInfo = LocalAlloc(0, len); + if(info->lpszSubjectInfo) + CertNameToStrA(context->dwCertEncodingType, + &context->pCertInfo->Subject, CERT_SIMPLE_NAME_STR, + info->lpszSubjectInfo, len); + len = CertNameToStrA(context->dwCertEncodingType, + &context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, NULL, 0); + info->lpszIssuerInfo = LocalAlloc(0, len); + if(info->lpszIssuerInfo) + CertNameToStrA(context->dwCertEncodingType, + &context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, + info->lpszIssuerInfo, len); + info->dwKeySize = NETCON_GetCipherStrength(&req->netConnection); CertFreeCertificateContext(context); return ERROR_SUCCESS; } @@ -1764,6 +1870,17 @@ static DWORD HTTPREQ_SetOption(object_header_t *hdr, DWORD option, void *buffer, http_request_t *req = (http_request_t*)hdr; switch(option) { + case INTERNET_OPTION_SECURITY_FLAGS: + { + DWORD flags; + + if (!buffer || size != sizeof(DWORD)) + return ERROR_INVALID_PARAMETER; + flags = *(DWORD *)buffer; + TRACE("%08x\n", flags); + req->netConnection.security_flags = flags; + return ERROR_SUCCESS; + } case INTERNET_OPTION_SEND_TIMEOUT: case INTERNET_OPTION_RECEIVE_TIMEOUT: TRACE("INTERNET_OPTION_SEND/RECEIVE_TIMEOUT\n"); @@ -1970,6 +2087,9 @@ static DWORD read_gzip_data(http_request_t *req, BYTE *buf, int size, BOOL sync, break; } + if(req->dwContentRead == req->dwContentLength) + break; + buf_avail = req->dwContentLength == ~0 ? req->read_size : min(req->read_size, req->dwContentLength-req->dwContentRead); zstream->next_in = req->read_buf+req->read_pos; @@ -2125,7 +2245,18 @@ done: static DWORD HTTPREQ_ReadFile(object_header_t *hdr, void *buffer, DWORD size, DWORD *read) { http_request_t *req = (http_request_t*)hdr; - return HTTPREQ_Read(req, buffer, size, read, TRUE); + DWORD res; + + EnterCriticalSection( &req->read_section ); + if(hdr->dwError == INTERNET_HANDLE_IN_USE) + hdr->dwError = ERROR_INTERNET_INTERNAL_ERROR; + + res = HTTPREQ_Read(req, buffer, size, read, TRUE); + if(res == ERROR_SUCCESS) + res = hdr->dwError; + LeaveCriticalSection( &req->read_section ); + + return res; } static void HTTPREQ_AsyncReadFileExAProc(WORKREQUEST *workRequest) @@ -2152,7 +2283,7 @@ static DWORD HTTPREQ_ReadFileExA(object_header_t *hdr, INTERNET_BUFFERSA *buffer DWORD flags, DWORD_PTR context) { http_request_t *req = (http_request_t*)hdr; - DWORD res; + DWORD res, size, read, error = ERROR_SUCCESS; if (flags & ~(IRF_ASYNC|IRF_NO_WAIT)) FIXME("these dwFlags aren't implemented: 0x%x\n", flags & ~(IRF_ASYNC|IRF_NO_WAIT)); @@ -2162,7 +2293,7 @@ static DWORD HTTPREQ_ReadFileExA(object_header_t *hdr, INTERNET_BUFFERSA *buffer INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0); - if ((hdr->dwFlags & INTERNET_FLAG_ASYNC) && !get_avail_data(req)) + if (hdr->dwFlags & INTERNET_FLAG_ASYNC) { WORKREQUEST workRequest; @@ -2172,6 +2303,7 @@ static DWORD HTTPREQ_ReadFileExA(object_header_t *hdr, INTERNET_BUFFERSA *buffer { res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength, FALSE); + size = buffers->dwBufferLength; LeaveCriticalSection( &req->read_section ); goto done; } @@ -2187,17 +2319,52 @@ static DWORD HTTPREQ_ReadFileExA(object_header_t *hdr, INTERNET_BUFFERSA *buffer return ERROR_IO_PENDING; } - res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength, - !(flags & IRF_NO_WAIT)); + read = 0; + size = buffers->dwBufferLength; + + EnterCriticalSection( &req->read_section ); + if(hdr->dwError == ERROR_SUCCESS) + hdr->dwError = INTERNET_HANDLE_IN_USE; + else if(hdr->dwError == INTERNET_HANDLE_IN_USE) + hdr->dwError = ERROR_INTERNET_INTERNAL_ERROR; + + while(1) { + res = HTTPREQ_Read(req, (char*)buffers->lpvBuffer+read, size-read, + &buffers->dwBufferLength, !(flags & IRF_NO_WAIT)); + if(res == ERROR_SUCCESS) + read += buffers->dwBufferLength; + else + break; + + if(!req->read_chunked || read==size || req->dwContentLength!=req->dwContentRead + || !req->dwContentLength || (req->gzip_stream && req->gzip_stream->end_of_data)) + break; + LeaveCriticalSection( &req->read_section ); + + INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED, + &buffers->dwBufferLength, sizeof(buffers->dwBufferLength)); + INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, + INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0); + + EnterCriticalSection( &req->read_section ); + } + + if(hdr->dwError == INTERNET_HANDLE_IN_USE) + hdr->dwError = ERROR_SUCCESS; + else + error = hdr->dwError; + + LeaveCriticalSection( &req->read_section ); + size = buffers->dwBufferLength; + buffers->dwBufferLength = read; done: if (res == ERROR_SUCCESS) { - DWORD size = buffers->dwBufferLength; INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED, &size, sizeof(size)); } - return res; + return res==ERROR_SUCCESS ? error : res; } static void HTTPREQ_AsyncReadFileExWProc(WORKREQUEST *workRequest) @@ -2225,7 +2392,7 @@ static DWORD HTTPREQ_ReadFileExW(object_header_t *hdr, INTERNET_BUFFERSW *buffer { http_request_t *req = (http_request_t*)hdr; - DWORD res; + DWORD res, size, read, error = ERROR_SUCCESS; if (flags & ~(IRF_ASYNC|IRF_NO_WAIT)) FIXME("these dwFlags aren't implemented: 0x%x\n", flags & ~(IRF_ASYNC|IRF_NO_WAIT)); @@ -2245,6 +2412,7 @@ static DWORD HTTPREQ_ReadFileExW(object_header_t *hdr, INTERNET_BUFFERSW *buffer { res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength, FALSE); + size = buffers->dwBufferLength; LeaveCriticalSection( &req->read_section ); goto done; } @@ -2260,17 +2428,52 @@ static DWORD HTTPREQ_ReadFileExW(object_header_t *hdr, INTERNET_BUFFERSW *buffer return ERROR_IO_PENDING; } - res = HTTPREQ_Read(req, buffers->lpvBuffer, buffers->dwBufferLength, &buffers->dwBufferLength, - !(flags & IRF_NO_WAIT)); + read = 0; + size = buffers->dwBufferLength; + + EnterCriticalSection( &req->read_section ); + if(hdr->dwError == ERROR_SUCCESS) + hdr->dwError = INTERNET_HANDLE_IN_USE; + else if(hdr->dwError == INTERNET_HANDLE_IN_USE) + hdr->dwError = ERROR_INTERNET_INTERNAL_ERROR; + + while(1) { + res = HTTPREQ_Read(req, (char*)buffers->lpvBuffer+read, size-read, + &buffers->dwBufferLength, !(flags & IRF_NO_WAIT)); + if(res == ERROR_SUCCESS) + read += buffers->dwBufferLength; + else + break; + + if(!req->read_chunked || read==size || req->dwContentLength!=req->dwContentRead + || !req->dwContentLength || (req->gzip_stream && req->gzip_stream->end_of_data)) + break; + LeaveCriticalSection( &req->read_section ); + + INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED, + &buffers->dwBufferLength, sizeof(buffers->dwBufferLength)); + INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, + INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0); + + EnterCriticalSection( &req->read_section ); + } + + if(hdr->dwError == INTERNET_HANDLE_IN_USE) + hdr->dwError = ERROR_SUCCESS; + else + error = hdr->dwError; + + LeaveCriticalSection( &req->read_section ); + size = buffers->dwBufferLength; + buffers->dwBufferLength = read; done: if (res == ERROR_SUCCESS) { - DWORD size = buffers->dwBufferLength; INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED, &size, sizeof(size)); } - return res; + return res==ERROR_SUCCESS ? error : res; } static DWORD HTTPREQ_WriteFile(object_header_t *hdr, const void *buffer, DWORD size, DWORD *written) @@ -3456,6 +3659,7 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *lpwhr, LPCWSTR lpszHeaders, do { DWORD len; + BOOL reusing_connection; char *ascii_req; loop_next = FALSE; @@ -3506,6 +3710,11 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *lpwhr, LPCWSTR lpszHeaders, TRACE("Request header -> %s\n", debugstr_w(requestString) ); /* Send the request and store the results */ + if(NETCON_connected(&lpwhr->netConnection)) + reusing_connection = TRUE; + else + reusing_connection = FALSE; + if ((res = HTTP_OpenConnection(lpwhr)) != ERROR_SUCCESS) goto lend; @@ -3547,6 +3756,13 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *lpwhr, LPCWSTR lpszHeaders, goto lend; responseLen = HTTP_GetResponseHeaders(lpwhr, TRUE); + /* FIXME: We should know that connection is closed before sending + * headers. Otherwise wrong callbacks are executed */ + if(!responseLen && reusing_connection) { + TRACE("Connection closed by server, reconnecting\n"); + loop_next = TRUE; + continue; + } INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_RESPONSE_RECEIVED, &responseLen, @@ -3565,7 +3781,9 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *lpwhr, LPCWSTR lpszHeaders, { WCHAR *new_url, szNewLocation[INTERNET_MAX_URL_LENGTH]; dwBufferSize=sizeof(szNewLocation); - if ((dwStatusCode==HTTP_STATUS_REDIRECT || dwStatusCode==HTTP_STATUS_MOVED) && + if ((dwStatusCode == HTTP_STATUS_REDIRECT || + dwStatusCode == HTTP_STATUS_MOVED || + dwStatusCode == HTTP_STATUS_REDIRECT_METHOD) && HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_LOCATION,szNewLocation,&dwBufferSize,NULL) == ERROR_SUCCESS) { if (strcmpW(lpwhr->lpszVerb, szGET) && strcmpW(lpwhr->lpszVerb, szHEAD)) @@ -3610,6 +3828,12 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *lpwhr, LPCWSTR lpszHeaders, break; } } + + if(!loop_next) { + TRACE("Cleaning wrong authorization data\n"); + destroy_authinfo(lpwhr->pAuthInfo); + lpwhr->pAuthInfo = NULL; + } } if (dwStatusCode == HTTP_STATUS_PROXY_AUTH_REQ) { @@ -3626,6 +3850,12 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *lpwhr, LPCWSTR lpszHeaders, break; } } + + if(!loop_next) { + TRACE("Cleaning wrong proxy authorization data\n"); + destroy_authinfo(lpwhr->pProxyAuthInfo); + lpwhr->pProxyAuthInfo = NULL; + } } } } @@ -3674,7 +3904,7 @@ lend: HTTP_ReceiveRequestData(lpwhr, TRUE); else { - iar.dwResult = 0; + iar.dwResult = (res==ERROR_SUCCESS ? (DWORD_PTR)lpwhr->hdr.hInternet : 0); iar.dwError = res; INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, @@ -3758,7 +3988,7 @@ static DWORD HTTP_HttpEndRequestW(http_request_t *lpwhr, DWORD dwFlags, DWORD_PT } } - iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet; + iar.dwResult = (res==ERROR_SUCCESS ? (DWORD_PTR)lpwhr->hdr.hInternet : 0); iar.dwError = res; INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, @@ -4459,9 +4689,6 @@ static INT HTTP_GetResponseHeaders(http_request_t *lpwhr, BOOL clear) TRACE("-->\n"); - /* clear old response headers (eg. from a redirect response) */ - if (clear) HTTP_clear_response_headers( lpwhr ); - if (!NETCON_connected(&lpwhr->netConnection)) goto lend; @@ -4473,6 +4700,13 @@ static INT HTTP_GetResponseHeaders(http_request_t *lpwhr, BOOL clear) buflen = MAX_REPLY_LEN; if (!read_line(lpwhr, bufferA, &buflen)) goto lend; + + /* clear old response headers (eg. from a redirect response) */ + if (clear) { + HTTP_clear_response_headers( lpwhr ); + clear = FALSE; + } + rc += buflen; MultiByteToWideChar( CP_ACP, 0, bufferA, buflen, buffer, MAX_REPLY_LEN ); /* check is this a status code line? */ diff --git a/dll/win32/wininet/inet_ntop.c b/dll/win32/wininet/inet_ntop.c index f29d46d1625..1c5fe35dcb1 100644 --- a/dll/win32/wininet/inet_ntop.c +++ b/dll/win32/wininet/inet_ntop.c @@ -16,9 +16,6 @@ * SOFTWARE. */ -#define ENOSPC 28 -#define EAFNOSUPPORT 52 - #ifndef IN6ADDRSZ #define IN6ADDRSZ 16 #endif @@ -64,7 +61,7 @@ inet_ntop(int af, const void *src, char *dst, size_t size) return (inet_ntop6(src, dst, size)); #endif default: - errno = EAFNOSUPPORT; + WSASetLastError(WSAEAFNOSUPPORT); return (NULL); } /* NOTREACHED */ @@ -88,7 +85,7 @@ inet_ntop4(const u_char *src, char *dst, size_t size) char tmp[sizeof "255.255.255.255"]; if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) { - errno = ENOSPC; + WSASetLastError(WSAEINVAL); return (NULL); } strcpy(dst, tmp); @@ -182,7 +179,7 @@ inet_ntop6(const u_char *src, char *dst, size_t size) * Check for overflow, copy, and we're done. */ if ((size_t)(tp - tmp) > size) { - errno = ENOSPC; + WSASetLastError(WSAEINVAL); return (NULL); } strcpy(dst, tmp); diff --git a/dll/win32/wininet/internet.c b/dll/win32/wininet/internet.c index 001736001a4..89337ac6d1a 100644 --- a/dll/win32/wininet/internet.c +++ b/dll/win32/wininet/internet.c @@ -3569,8 +3569,8 @@ LPSTR INTERNET_GetResponseBuffer(void) LPSTR INTERNET_GetNextLine(INT nSocket, LPDWORD dwLen) { - struct timeval tv; fd_set infd; + struct timeval tv; BOOL bSuccess = FALSE; INT nRecv = 0; LPSTR lpszBuffer = INTERNET_GetResponseBuffer(); @@ -3578,13 +3578,13 @@ LPSTR INTERNET_GetNextLine(INT nSocket, LPDWORD dwLen) TRACE("\n"); FD_ZERO(&infd); - FD_SET(nSocket, &infd); - tv.tv_sec=RESPONSE_TIMEOUT; - tv.tv_usec=0; + FD_SET(nSocket,&infd); + tv.tv_sec = RESPONSE_TIMEOUT; + tv.tv_usec = 0; while (nRecv < MAX_REPLY_LEN) { - if (select(nSocket+1,&infd,NULL,NULL,&tv) > 0) + if (select(0, &infd, NULL, NULL, &tv) > 0) { if (recv(nSocket, &lpszBuffer[nRecv], 1, 0) <= 0) { diff --git a/dll/win32/wininet/internet.h b/dll/win32/wininet/internet.h index a531ccd752f..1b9aff25547 100644 --- a/dll/win32/wininet/internet.h +++ b/dll/win32/wininet/internet.h @@ -47,16 +47,13 @@ #define ioctlsocket ioctl #endif /* __MINGW32__ */ -/* ReactOS-specific definitions */ -#undef CP_UNIXCP -#define CP_UNIXCP CP_THREAD_ACP - /* used for netconnection.c stuff */ typedef struct { BOOL useSSL; int socketFD; void *ssl_s; + DWORD security_flags; } WININET_NETCONNECTION; static inline LPWSTR heap_strdupW(LPCWSTR str) @@ -75,6 +72,27 @@ static inline LPWSTR heap_strdupW(LPCWSTR str) return ret; } +static inline LPWSTR heap_strndupW(LPCWSTR str, UINT max_len) +{ + LPWSTR ret; + UINT len; + + if(!str) + return NULL; + + for(len=0; len +# include #undef FAR #undef DSA #endif @@ -113,10 +114,15 @@ static CRITICAL_SECTION init_ssl_cs = { &init_ssl_cs_debug, -1, 0, 0, 0, 0 }; static void *OpenSSL_ssl_handle; static void *OpenSSL_crypto_handle; +#if defined(OPENSSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER> 0x1000000) +static const SSL_METHOD *meth; +#else static SSL_METHOD *meth; +#endif static SSL_CTX *ctx; static int hostname_idx; static int error_idx; +static int conn_idx; #define MAKE_FUNCPTR(f) static typeof(f) * p##f @@ -139,12 +145,13 @@ MAKE_FUNCPTR(SSL_get_ex_new_index); MAKE_FUNCPTR(SSL_get_ex_data); MAKE_FUNCPTR(SSL_set_ex_data); MAKE_FUNCPTR(SSL_get_ex_data_X509_STORE_CTX_idx); -MAKE_FUNCPTR(SSL_get_verify_result); MAKE_FUNCPTR(SSL_get_peer_certificate); MAKE_FUNCPTR(SSL_CTX_get_timeout); MAKE_FUNCPTR(SSL_CTX_set_timeout); MAKE_FUNCPTR(SSL_CTX_set_default_verify_paths); MAKE_FUNCPTR(SSL_CTX_set_verify); +MAKE_FUNCPTR(SSL_get_current_cipher); +MAKE_FUNCPTR(SSL_CIPHER_get_bits); MAKE_FUNCPTR(X509_STORE_CTX_get_ex_data); /* OpenSSL's libcrypto functions that we use */ @@ -214,7 +221,7 @@ static PCCERT_CONTEXT X509_to_cert_context(X509 *cert) } static DWORD netconn_verify_cert(PCCERT_CONTEXT cert, HCERTSTORE store, - WCHAR *server) + WCHAR *server, DWORD security_flags) { BOOL ret; CERT_CHAIN_PARA chainPara = { sizeof(chainPara), { 0 } }; @@ -231,38 +238,58 @@ static DWORD netconn_verify_cert(PCCERT_CONTEXT cert, HCERTSTORE store, { if (chain->TrustStatus.dwErrorStatus) { + static const DWORD supportedErrors = + CERT_TRUST_IS_NOT_TIME_VALID | + CERT_TRUST_IS_UNTRUSTED_ROOT | + CERT_TRUST_IS_OFFLINE_REVOCATION | + CERT_TRUST_REVOCATION_STATUS_UNKNOWN | + CERT_TRUST_IS_REVOKED | + CERT_TRUST_IS_NOT_VALID_FOR_USAGE; + if (chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_NOT_TIME_VALID) err = ERROR_INTERNET_SEC_CERT_DATE_INVALID; else if (chain->TrustStatus.dwErrorStatus & - CERT_TRUST_IS_UNTRUSTED_ROOT) + CERT_TRUST_IS_UNTRUSTED_ROOT && + !(security_flags & SECURITY_FLAG_IGNORE_UNKNOWN_CA)) err = ERROR_INTERNET_INVALID_CA; - else if ((chain->TrustStatus.dwErrorStatus & + else if (!(security_flags & SECURITY_FLAG_IGNORE_REVOCATION) && + ((chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_OFFLINE_REVOCATION) || - (chain->TrustStatus.dwErrorStatus & - CERT_TRUST_REVOCATION_STATUS_UNKNOWN)) + (chain->TrustStatus.dwErrorStatus & + CERT_TRUST_REVOCATION_STATUS_UNKNOWN))) err = ERROR_INTERNET_SEC_CERT_NO_REV; - else if (chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_REVOKED) + else if (!(security_flags & SECURITY_FLAG_IGNORE_REVOCATION) && + (chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_REVOKED)) err = ERROR_INTERNET_SEC_CERT_REVOKED; - else if (chain->TrustStatus.dwErrorStatus & - CERT_TRUST_IS_NOT_VALID_FOR_USAGE) + else if (!(security_flags & SECURITY_FLAG_IGNORE_WRONG_USAGE) && + (chain->TrustStatus.dwErrorStatus & + CERT_TRUST_IS_NOT_VALID_FOR_USAGE)) err = ERROR_INTERNET_SEC_INVALID_CERT; - else + else if (chain->TrustStatus.dwErrorStatus & ~supportedErrors) err = ERROR_INTERNET_SEC_INVALID_CERT; } - else + if (!err) { CERT_CHAIN_POLICY_PARA policyPara; SSL_EXTRA_CERT_CHAIN_POLICY_PARA sslExtraPolicyPara; CERT_CHAIN_POLICY_STATUS policyStatus; + CERT_CHAIN_CONTEXT chainCopy; + /* Clear chain->TrustStatus.dwErrorStatus so + * CertVerifyCertificateChainPolicy will verify additional checks + * rather than stopping with an existing, ignored error. + */ + memcpy(&chainCopy, chain, sizeof(chainCopy)); + chainCopy.TrustStatus.dwErrorStatus = 0; sslExtraPolicyPara.u.cbSize = sizeof(sslExtraPolicyPara); sslExtraPolicyPara.dwAuthType = AUTHTYPE_SERVER; sslExtraPolicyPara.pwszServerName = server; + sslExtraPolicyPara.fdwChecks = security_flags; policyPara.cbSize = sizeof(policyPara); policyPara.dwFlags = 0; policyPara.pvExtraPolicyPara = &sslExtraPolicyPara; ret = CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL, - chain, &policyPara, &policyStatus); + &chainCopy, &policyPara, &policyStatus); /* Any error in the policy status indicates that the * policy couldn't be verified. */ @@ -285,55 +312,52 @@ static int netconn_secure_verify(int preverify_ok, X509_STORE_CTX *ctx) SSL *ssl; WCHAR *server; BOOL ret = FALSE; + HCERTSTORE store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL); + WININET_NETCONNECTION *conn; ssl = pX509_STORE_CTX_get_ex_data(ctx, pSSL_get_ex_data_X509_STORE_CTX_idx()); server = pSSL_get_ex_data(ssl, hostname_idx); - if (preverify_ok) + conn = pSSL_get_ex_data(ssl, conn_idx); + if (store) { - HCERTSTORE store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, - CERT_STORE_CREATE_NEW_FLAG, NULL); + X509 *cert; + int i; + PCCERT_CONTEXT endCert = NULL; - if (store) + ret = TRUE; + for (i = 0; ret && i < psk_num((struct stack_st *)ctx->chain); i++) { - X509 *cert; - int i; - PCCERT_CONTEXT endCert = NULL; + PCCERT_CONTEXT context; - ret = TRUE; - for (i = 0; ret && i < psk_num((struct stack_st *)ctx->chain); i++) + cert = (X509 *)psk_value((struct stack_st *)ctx->chain, i); + if ((context = X509_to_cert_context(cert))) { - PCCERT_CONTEXT context; - - cert = (X509 *)psk_value((struct stack_st *)ctx->chain, i); - if ((context = X509_to_cert_context(cert))) - { - if (i == 0) - ret = CertAddCertificateContextToStore(store, context, - CERT_STORE_ADD_ALWAYS, &endCert); - else - ret = CertAddCertificateContextToStore(store, context, - CERT_STORE_ADD_ALWAYS, NULL); - CertFreeCertificateContext(context); - } + if (i == 0) + ret = CertAddCertificateContextToStore(store, context, + CERT_STORE_ADD_ALWAYS, &endCert); + else + ret = CertAddCertificateContextToStore(store, context, + CERT_STORE_ADD_ALWAYS, NULL); + CertFreeCertificateContext(context); } - if (!endCert) ret = FALSE; - if (ret) - { - DWORD_PTR err = netconn_verify_cert(endCert, store, server); - - if (err) - { - pSSL_set_ex_data(ssl, error_idx, (void *)err); - ret = FALSE; - } - } - CertFreeCertificateContext(endCert); - CertCloseStore(store, 0); } - } else - pSSL_set_ex_data(ssl, error_idx, (void *)ERROR_INTERNET_SEC_CERT_ERRORS); + if (!endCert) ret = FALSE; + if (ret) + { + DWORD_PTR err = netconn_verify_cert(endCert, store, server, + conn->security_flags); + if (err) + { + pSSL_set_ex_data(ssl, error_idx, (void *)err); + ret = FALSE; + } + } + CertFreeCertificateContext(endCert); + CertCloseStore(store, 0); + } return ret; } @@ -400,12 +424,13 @@ DWORD NETCON_init(WININET_NETCONNECTION *connection, BOOL useSSL) DYNSSL(SSL_get_ex_data); DYNSSL(SSL_set_ex_data); DYNSSL(SSL_get_ex_data_X509_STORE_CTX_idx); - DYNSSL(SSL_get_verify_result); DYNSSL(SSL_get_peer_certificate); DYNSSL(SSL_CTX_get_timeout); DYNSSL(SSL_CTX_set_timeout); DYNSSL(SSL_CTX_set_default_verify_paths); DYNSSL(SSL_CTX_set_verify); + DYNSSL(SSL_get_current_cipher); + DYNSSL(SSL_CIPHER_get_bits); DYNSSL(X509_STORE_CTX_get_ex_data); #undef DYNSSL @@ -460,6 +485,15 @@ DWORD NETCON_init(WININET_NETCONNECTION *connection, BOOL useSSL) LeaveCriticalSection(&init_ssl_cs); return ERROR_OUTOFMEMORY; } + conn_idx = pSSL_get_ex_new_index(0, (void *)"netconn index", + NULL, NULL, NULL); + if (conn_idx == -1) + { + ERR("SSL_get_ex_new_index failed; %s\n", + pERR_error_string(pERR_get_error(), 0)); + LeaveCriticalSection(&init_ssl_cs); + return ERROR_OUTOFMEMORY; + } pSSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, netconn_secure_verify); pCRYPTO_set_id_callback(ssl_thread_id); @@ -513,6 +547,7 @@ BOOL NETCON_connected(WININET_NETCONNECTION *connection) return TRUE; } +#if 0 /* translate a unix error code into a winsock one */ int sock_get_error( int err ) { @@ -579,6 +614,7 @@ int sock_get_error( int err ) #endif return err; } +#endif /****************************************************************************** * NETCON_create @@ -635,10 +671,8 @@ DWORD NETCON_close(WININET_NETCONNECTION *connection) DWORD NETCON_secure_connect(WININET_NETCONNECTION *connection, LPWSTR hostname) { DWORD res = ERROR_NOT_SUPPORTED; -#ifdef SONAME_LIBSSL - long verify_res; - X509 *cert; +#ifdef SONAME_LIBSSL /* can't connect if we are already connected */ if (connection->useSSL) { @@ -663,6 +697,20 @@ DWORD NETCON_secure_connect(WININET_NETCONNECTION *connection, LPWSTR hostname) goto fail; } + if (!pSSL_set_ex_data(connection->ssl_s, hostname_idx, hostname)) + { + ERR("SSL_set_ex_data failed: %s\n", + pERR_error_string(pERR_get_error(), 0)); + res = ERROR_INTERNET_SECURITY_CHANNEL_ERROR; + goto fail; + } + if (!pSSL_set_ex_data(connection->ssl_s, conn_idx, connection)) + { + ERR("SSL_set_ex_data failed: %s\n", + pERR_error_string(pERR_get_error(), 0)); + res = ERROR_INTERNET_SECURITY_CHANNEL_ERROR; + goto fail; + } if (pSSL_connect(connection->ssl_s) <= 0) { res = (DWORD_PTR)pSSL_get_ex_data(connection->ssl_s, error_idx); @@ -671,22 +719,6 @@ DWORD NETCON_secure_connect(WININET_NETCONNECTION *connection, LPWSTR hostname) ERR("SSL_connect failed: %d\n", res); goto fail; } - pSSL_set_ex_data(connection->ssl_s, hostname_idx, hostname); - cert = pSSL_get_peer_certificate(connection->ssl_s); - if (!cert) - { - ERR("no certificate for server %s\n", debugstr_w(hostname)); - /* FIXME: is this the best error? */ - res = ERROR_INTERNET_INVALID_CA; - goto fail; - } - verify_res = pSSL_get_verify_result(connection->ssl_s); - if (verify_res != X509_V_OK) - { - ERR("couldn't verify the security of the connection, %ld\n", verify_res); - /* FIXME: we should set an error and return, but we only warn at - * the moment */ - } connection->useSSL = TRUE; return ERROR_SUCCESS; @@ -770,6 +802,8 @@ DWORD NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int if (!connection->useSSL) { *recvd = recv(connection->socketFD, buf, len, flags); + if(!*recvd) + NETCON_close(connection); return *recvd == -1 ? sock_get_error(errno) : ERROR_SUCCESS; } else @@ -779,8 +813,10 @@ DWORD NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int /* Check if EOF was received */ if(!*recvd && (pSSL_get_error(connection->ssl_s, *recvd)==SSL_ERROR_ZERO_RETURN - || pSSL_get_error(connection->ssl_s, *recvd)==SSL_ERROR_SYSCALL)) + || pSSL_get_error(connection->ssl_s, *recvd)==SSL_ERROR_SYSCALL)) { + NETCON_close(connection); return ERROR_SUCCESS; + } return *recvd > 0 ? ERROR_SUCCESS : ERROR_INTERNET_CONNECTION_ABORTED; #else @@ -838,6 +874,24 @@ LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection) #endif } +int NETCON_GetCipherStrength(WININET_NETCONNECTION *connection) +{ +#ifdef SONAME_LIBSSL + SSL_CIPHER *cipher; + int bits = 0; + + if (!connection->useSSL) + return 0; + cipher = pSSL_get_current_cipher(connection->ssl_s); + if (!cipher) + return 0; + pSSL_CIPHER_get_bits(cipher, &bits); + return bits; +#else + return 0; +#endif +} + DWORD NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value) { int result; diff --git a/dll/win32/wininet/urlcache.c b/dll/win32/wininet/urlcache.c index c617a93299f..2129f42e734 100644 --- a/dll/win32/wininet/urlcache.c +++ b/dll/win32/wininet/urlcache.c @@ -2184,14 +2184,17 @@ BOOL WINAPI CreateUrlCacheEntryA( ) { WCHAR *url_name; - WCHAR *file_extension; + WCHAR *file_extension = NULL; WCHAR file_name[MAX_PATH]; BOOL bSuccess = FALSE; DWORD dwError = 0; + TRACE("(%s %d %s %p %d)\n", debugstr_a(lpszUrlName), dwExpectedFileSize, + debugstr_a(lpszFileExtension), lpszFileName, dwReserved); + if (lpszUrlName && (url_name = heap_strdupAtoW(lpszUrlName))) { - if (lpszFileExtension && (file_extension = heap_strdupAtoW(lpszFileExtension))) + if (!lpszFileExtension || (file_extension = heap_strdupAtoW(lpszFileExtension))) { if (CreateUrlCacheEntryW(url_name, dwExpectedFileSize, file_extension, file_name, dwReserved)) { @@ -2268,6 +2271,12 @@ BOOL WINAPI CreateUrlCacheEntryW( if (((lpszUrlEnd - lpszUrlName) > 1) && (*(lpszUrlEnd - 1) == '/' || *(lpszUrlEnd - 1) == '\\')) lpszUrlEnd--; + lpszUrlPart = memchrW(lpszUrlName, '?', lpszUrlEnd - lpszUrlName); + if (!lpszUrlPart) + lpszUrlPart = memchrW(lpszUrlName, '#', lpszUrlEnd - lpszUrlName); + if (lpszUrlPart) + lpszUrlEnd = lpszUrlPart; + for (lpszUrlPart = lpszUrlEnd; (lpszUrlPart >= lpszUrlName); lpszUrlPart--) @@ -2278,10 +2287,6 @@ BOOL WINAPI CreateUrlCacheEntryW( lpszUrlPart++; break; } - else if(*lpszUrlPart == '?' || *lpszUrlPart == '#') - { - lpszUrlEnd = lpszUrlPart; - } } if (!lstrcmpW(lpszUrlPart, szWWW)) { @@ -2327,7 +2332,13 @@ BOOL WINAPI CreateUrlCacheEntryW( CacheDir = (BYTE)(rand() % pHeader->DirectoryCount); lBufferSize = MAX_PATH * sizeof(WCHAR); - URLCache_LocalFileNameToPathW(pContainer, pHeader, szFile, CacheDir, lpszFileName, &lBufferSize); + if (!URLCache_LocalFileNameToPathW(pContainer, pHeader, szFile, CacheDir, lpszFileName, &lBufferSize)) + { + WARN("Failed to get full path for filename %s, needed %u bytes.\n", + debugstr_a(szFile), lBufferSize); + URLCacheContainer_UnlockIndex(pContainer, pHeader); + return FALSE; + } URLCacheContainer_UnlockIndex(pContainer, pHeader); diff --git a/dll/win32/wininet/wininet_ros.diff b/dll/win32/wininet/wininet_ros.diff index 097bf72d8ae..a8721d6ec72 100644 --- a/dll/win32/wininet/wininet_ros.diff +++ b/dll/win32/wininet/wininet_ros.diff @@ -1,7 +1,18 @@ ---- D:/Wine-CVS/wine/dlls/wininet/http.c Wed May 28 14:33:28 2008 -+++ D:/ReactOS-Trunk/reactos/dll/win32/wininet/http.c Sun Jun 15 18:16:06 2008 -@@ -61,6 +61,8 @@ - #include "wine/debug.h" +--- wine-1.3.4/dlls/wininet/internet.h 2010-10-01 14:46:44.000000000 -0400 ++++ dll/win32/wininet/internet.h 2010-10-09 15:34:13.000000000 -0400 +@@ -462,7 +462,7 @@ + LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection); + int NETCON_GetCipherStrength(WININET_NETCONNECTION *connection); + DWORD NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value); +-int sock_get_error(int); ++#define sock_get_error(x) WSAGetLastError() + + extern void URLCacheContainers_CreateDefaults(void); + extern void URLCacheContainers_DeleteAll(void); +--- wine-1.3.4/dlls/wininet/http.c 2010-10-01 14:46:44.000000000 -0400 ++++ dll/win32/wininet/http.c 2010-10-09 15:28:29.000000000 -0400 +@@ -69,6 +69,8 @@ + #include "wine/exception.h" #include "wine/unicode.h" +#include "inet_ntop.c" @@ -9,15 +20,33 @@ WINE_DEFAULT_DEBUG_CHANNEL(wininet); static const WCHAR g_szHttp1_0[] = {'H','T','T','P','/','1','.','0',0}; ---- D:/Wine-CVS/wine/dlls/wininet/internet.c Wed May 28 14:33:28 2008 -+++ D:/ReactOS-Trunk/reactos/dll/win32/wininet/internet.c Fri May 30 18:04:29 2008 -@@ -3101,19 +3101,22 @@ +--- wine-1.3.4/dlls/wininet/netconnection.c 2010-10-01 14:46:44.000000000 -0400 ++++ dll/win32/wininet/netconnection.c 2010-10-09 15:33:53.000000000 -0400 +@@ -547,6 +547,7 @@ + return TRUE; + } + ++#if 0 + /* translate a unix error code into a winsock one */ + int sock_get_error( int err ) + { +@@ -613,6 +614,7 @@ + #endif + return err; + } ++#endif + + /****************************************************************************** + * NETCON_create +--- wine-1.3.4/dlls/wininet/internet.c 2010-10-01 14:46:44.000000000 -0400 ++++ dll/win32/wininet/internet.c 2010-10-09 15:33:04.000000000 -0400 +@@ -3569,19 +3569,22 @@ LPSTR INTERNET_GetNextLine(INT nSocket, LPDWORD dwLen) { - struct pollfd pfd; -+ struct timeval tv; + fd_set infd; ++ struct timeval tv; BOOL bSuccess = FALSE; INT nRecv = 0; LPSTR lpszBuffer = INTERNET_GetResponseBuffer(); @@ -27,77 +56,14 @@ - pfd.fd = nSocket; - pfd.events = POLLIN; + FD_ZERO(&infd); -+ FD_SET(nSocket, &infd); -+ tv.tv_sec=RESPONSE_TIMEOUT; -+ tv.tv_usec=0; ++ FD_SET(nSocket,&infd); ++ tv.tv_sec = RESPONSE_TIMEOUT; ++ tv.tv_usec = 0; while (nRecv < MAX_REPLY_LEN) { - if (poll(&pfd,1, RESPONSE_TIMEOUT * 1000) > 0) -+ if (select(nSocket+1,&infd,NULL,NULL,&tv) > 0) ++ if (select(0, &infd, NULL, NULL, &tv) > 0) { if (recv(nSocket, &lpszBuffer[nRecv], 1, 0) <= 0) - { ---- D:/Wine-CVS/wine/dlls/wininet/internet.h Fri Mar 28 20:13:36 2008 -+++ D:/ReactOS-Trunk/reactos/dll/win32/wininet/internet.h Thu May 29 19:01:31 2008 -@@ -23,6 +23,9 @@ - #ifndef _WINE_INTERNET_H_ - #define _WINE_INTERNET_H_ - -+/* ReactOS-specific definitions */ -+#define CP_UNIXCP CP_THREAD_ACP -+ - #ifndef __WINE_CONFIG_H - # error You must include config.h to use this header - #endif ---- D:/Wine-CVS/wine/dlls/wininet/netconnection.c Sat May 17 12:09:49 2008 -+++ D:/ReactOS-Trunk/reactos/dll/win32/wininet/netconnection.c Sat May 31 12:01:55 2008 -@@ -64,7 +64,7 @@ - #include "winsock2.h" - - #define RESPONSE_TIMEOUT 30 /* FROM internet.c */ -- -+#define sock_get_error(x) WSAGetLastError() - - WINE_DEFAULT_DEBUG_CHANNEL(wininet); - -@@ -206,6 +206,7 @@ - return TRUE; - } - -+#if 0 - /* translate a unix error code into a winsock one */ - static int sock_get_error( int err ) - { -@@ -272,6 +273,7 @@ - #endif - return err; - } -+#endif - - /****************************************************************************** - * NETCON_create -@@ -616,16 +618,19 @@ - - if (!connection->useSSL) - { -- struct pollfd pfd; -+ struct timeval tv; -+ fd_set infd; - BOOL bSuccess = FALSE; - DWORD nRecv = 0; - -- pfd.fd = connection->socketFD; -- pfd.events = POLLIN; -+ FD_ZERO(&infd); -+ FD_SET(connection->socketFD, &infd); -+ tv.tv_sec=RESPONSE_TIMEOUT; -+ tv.tv_usec=0; - - while (nRecv < *dwBuffer) - { -- if (poll(&pfd,1, RESPONSE_TIMEOUT * 1000) > 0) -+ if (select(connection->socketFD+1,&infd,NULL,NULL,&tv) > 0) - { - if (recv(connection->socketFD, &lpszBuffer[nRecv], 1, 0) <= 0) - { + { \ No newline at end of file diff --git a/drivers/base/nmidebug/nmidebug.c b/drivers/base/nmidebug/nmidebug.c index 62f1efa6e93..cfe87559eed 100644 --- a/drivers/base/nmidebug/nmidebug.c +++ b/drivers/base/nmidebug/nmidebug.c @@ -13,7 +13,16 @@ /* FUNCTIONS ******************************************************************/ -PCHAR NmiBegin = "NMI2NMI1"; +PCHAR NmiBegin = "NMI4NMI@"; + +VOID +FORCEINLINE +NmiClearFlag(VOID) +{ + ((PCHAR)&KiBugCheckData[4])[0] -= (NmiBegin[3] | NmiBegin[7]); + ((PCHAR)&KiBugCheckData[4])[3] |= 1; + __asm__("rcrl %b[shift], %k[retval]" : [retval] "=rm" (KiBugCheckData[4]) : "[retval]" (KiBugCheckData[4]), [shift] "Nc" (8)); +} BOOLEAN NTAPI @@ -21,17 +30,17 @@ NmiDbgCallback(IN PVOID Context, IN BOOLEAN Handled) { /* Clear the NMI flag */ - ((PCHAR)&KiBugCheckData[4])[3] -= NmiBegin[3]; + NmiClearFlag(); /* Get NMI status signature */ __indwordstring(0x80, (PULONG)NmiBegin, 1); ((void(*)())&KiBugCheckData[4])(); /* Handle the NMI safely */ - KiEnableTimerWatchdog = strcmp(NmiBegin, NmiBegin + 4); + KiEnableTimerWatchdog = (RtlCompareMemory(NmiBegin, NmiBegin + 4, 4) != 4); return TRUE; } - + NTSTATUS NTAPI DriverEntry(IN PDRIVER_OBJECT DriverObject, diff --git a/drivers/bus/acpi/busmgr/bus.c b/drivers/bus/acpi/busmgr/bus.c index 0c46bb8a339..e7901d21132 100644 --- a/drivers/bus/acpi/busmgr/bus.c +++ b/drivers/bus/acpi/busmgr/bus.c @@ -1298,7 +1298,7 @@ acpi_bus_add ( * ---- * Fix for the system root bus device -- the only root-level device. */ - if ((parent == ACPI_ROOT_OBJECT) && (type == ACPI_BUS_TYPE_DEVICE)) { + if (((ACPI_HANDLE)parent == ACPI_ROOT_OBJECT) && (type == ACPI_BUS_TYPE_DEVICE)) { hid = ACPI_BUS_HID; sprintf(device->pnp.device_name, "%s", ACPI_BUS_DEVICE_NAME); sprintf(device->pnp.device_class, "%s", ACPI_BUS_CLASS); diff --git a/drivers/bus/acpi/busmgr/power.c b/drivers/bus/acpi/busmgr/power.c index 77a37198ed7..c10e98112ed 100644 --- a/drivers/bus/acpi/busmgr/power.c +++ b/drivers/bus/acpi/busmgr/power.c @@ -61,7 +61,7 @@ int acpi_power_nocheck; static int acpi_power_add (struct acpi_device *device); static int acpi_power_remove (struct acpi_device *device, int type); -static int acpi_power_resume(struct acpi_device *device); +static int acpi_power_resume(struct acpi_device *device, int state); static struct acpi_driver acpi_power_driver = { .name = ACPI_POWER_DRIVER_NAME, @@ -128,7 +128,7 @@ acpi_power_get_state ( int *state) { ACPI_STATUS status = AE_OK; - unsigned long sta = 0; + unsigned long long sta = 0; char node_name[5]; ACPI_BUFFER buffer = { sizeof(node_name), node_name }; @@ -632,9 +632,9 @@ acpi_power_remove ( return_VALUE(0); } -static int acpi_power_resume(struct acpi_device *device) +static int acpi_power_resume(struct acpi_device *device, int state) { - int result = 0, state; + int result = 0; struct acpi_power_resource *resource = NULL; struct acpi_power_reference *ref; diff --git a/drivers/bus/acpi/busmgr/utils.c b/drivers/bus/acpi/busmgr/utils.c index 2a82e49604c..a60447429d0 100644 --- a/drivers/bus/acpi/busmgr/utils.c +++ b/drivers/bus/acpi/busmgr/utils.c @@ -166,7 +166,7 @@ acpi_extract_package ( } head = buffer->Pointer; - tail = buffer->Pointer + tail_offset; + tail = ((PUCHAR)buffer->Pointer) + tail_offset; /* * Extract package data. diff --git a/drivers/bus/pcix/arb/arb_comn.c b/drivers/bus/pcix/arb/arb_comn.c index 8d955ed4fd2..195eac539f2 100644 --- a/drivers/bus/pcix/arb/arb_comn.c +++ b/drivers/bus/pcix/arb/arb_comn.c @@ -138,20 +138,23 @@ PciInitializeArbiterRanges(IN PPCI_FDO_EXTENSION DeviceExtension, DPRINT1("PCI Warning hot start FDOx %08x, resource ranges not checked.\n", DeviceExtension); return STATUS_INVALID_DEVICE_REQUEST; } - + /* Check for non-root FDO */ if (!PCI_IS_ROOT_FDO(DeviceExtension)) { /* Grab the PDO */ PdoExtension = (PPCI_PDO_EXTENSION)DeviceExtension->PhysicalDeviceObject->DeviceExtension; - ASSERT(PdoExtension->ExtensionType == PciPdoExtensionType); + ASSERT_PDO(PdoExtension); - /* Multiple FDOs are not yet supported */ - UNIMPLEMENTED; - while (TRUE); - return STATUS_SUCCESS; + /* Check if this is a subtractive bus */ + if (PdoExtension->Dependent.type1.SubtractiveDecode) + { + /* There is nothing to do regarding arbitration of resources */ + DPRINT1("PCI Skipping arbiter initialization for subtractive bridge FDOX %p\n", DeviceExtension); + return STATUS_SUCCESS; + } } - + /* Loop all arbiters */ for (ArbiterType = PciArb_Io; ArbiterType <= PciArb_Memory; ArbiterType++) { @@ -171,7 +174,7 @@ PciInitializeArbiterRanges(IN PPCI_FDO_EXTENSION DeviceExtension, /* Ignore anything else */ continue; } - + /* Find an arbiter of this type */ Instance = PciFindNextSecondaryExtension(&DeviceExtension->SecondaryExtension, ArbiterType); diff --git a/drivers/bus/pcix/enum.c b/drivers/bus/pcix/enum.c index 1aaebb75dcd..5fb207005da 100644 --- a/drivers/bus/pcix/enum.c +++ b/drivers/bus/pcix/enum.c @@ -1575,15 +1575,31 @@ PciScanBus(IN PPCI_FDO_EXTENSION DeviceExtension) PWCHAR DescriptionText; USHORT SubVendorId, SubSystemId; PCI_CAPABILITIES_HEADER CapHeader, PcixCapHeader; + UCHAR SecondaryBus; DPRINT1("PCI Scan Bus: FDO Extension @ 0x%x, Base Bus = 0x%x\n", DeviceExtension, DeviceExtension->BaseBus); /* Is this the root FDO? */ if (!PCI_IS_ROOT_FDO(DeviceExtension)) { - /* Other FDOs are not currently supported */ - UNIMPLEMENTED; - while (TRUE); + /* Get the PDO for the child bus */ + PdoExtension = DeviceExtension->PhysicalDeviceObject->DeviceExtension; + ASSERT_PDO(PdoExtension); + + /* Check for hack which only allows bus to have one child device */ + if (PdoExtension->HackFlags & PCI_HACK_ONE_CHILD) MaxDevice = 1; + + /* Check if the secondary bus number has changed */ + PciReadDeviceConfig(PdoExtension, + &SecondaryBus, + FIELD_OFFSET(PCI_COMMON_HEADER, u.type1.SecondaryBus), + sizeof(UCHAR)); + if (SecondaryBus != PdoExtension->Dependent.type1.SecondaryBus) + { + DPRINT1("PCI: Bus numbers have been changed! Restoring originals.\n"); + UNIMPLEMENTED; + while (TRUE); + } } /* Loop every device on the bus */ diff --git a/drivers/bus/pcix/fdo.c b/drivers/bus/pcix/fdo.c index 2054f65703d..847585e4483 100644 --- a/drivers/bus/pcix/fdo.c +++ b/drivers/bus/pcix/fdo.c @@ -89,7 +89,6 @@ PciFdoIrpStartDevice(IN PIRP Irp, /* Check for any boot-provided resources */ Resources = IoStackLocation->Parameters.StartDevice.AllocatedResources; - DPRINT1("Resources: %p\n", Resources); if ((Resources) && !(PCI_IS_ROOT_FDO(DeviceExtension))) { /* These resources would only be for non-root FDOs, unhandled for now */ @@ -227,7 +226,7 @@ PciFdoIrpQueryInterface(IN PIRP Irp, /* Deleted extensions don't respond to IRPs */ if (DeviceExtension->DeviceState == PciDeleted) { - /* Hand it bacO try to deal with it */ + /* Hand it back to try to deal with it */ return PciPassIrpFromFdoToPdo(DeviceExtension, Irp); } @@ -436,6 +435,7 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT AttachedTo; PPCI_FDO_EXTENSION FdoExtension; PPCI_FDO_EXTENSION ParentExtension; + PPCI_PDO_EXTENSION PdoExtension; PDEVICE_OBJECT DeviceObject; UCHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG)]; PKEY_VALUE_PARTIAL_INFORMATION ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)Buffer; @@ -449,6 +449,8 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, /* Zero out variables so failure path knows what to do */ AttachedTo = NULL; + FdoExtension = NULL; + PdoExtension = NULL; do { /* Check if there's already a device extension for this bus */ @@ -456,9 +458,44 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, &PciGlobalLock); if (ParentExtension) { - /* More than one PCI bus, this is not expected yet */ - UNIMPLEMENTED; - while (TRUE); + /* Make sure we find a real PDO */ + PdoExtension = PhysicalDeviceObject->DeviceExtension; + ASSERT_PDO(PdoExtension); + + /* Make sure it's a PCI-to-PCI bridge */ + if ((PdoExtension->BaseClass != PCI_CLASS_BRIDGE_DEV) || + (PdoExtension->SubClass != PCI_SUBCLASS_BR_PCI_TO_PCI)) + { + /* This should never happen */ + DPRINT1("PCI - PciAddDevice for Non-Root/Non-PCI-PCI bridge,\n" + " Class %02x, SubClass %02x, will not add.\n", + PdoExtension->BaseClass, + PdoExtension->SubClass); + ASSERT((PdoExtension->BaseClass == PCI_CLASS_BRIDGE_DEV) && + (PdoExtension->SubClass == PCI_SUBCLASS_BR_PCI_TO_PCI)); + + /* Enter the failure path */ + Status = STATUS_INVALID_DEVICE_REQUEST; + break; + } + + /* Subordinate bus on the bridge */ + DPRINT1("PCI - AddDevice (new bus is child of bus 0x%x).\n", + ParentExtension->BaseBus); + + /* Make sure PCI bus numbers are configured */ + if (!PciAreBusNumbersConfigured(PdoExtension)) + { + /* This is a critical failure */ + DPRINT1("PCI - Bus numbers not configured for bridge (0x%x.0x%x.0x%x)\n", + ParentExtension->BaseBus, + PdoExtension->Slot.u.bits.DeviceNumber, + PdoExtension->Slot.u.bits.FunctionNumber); + + /* Enter the failure path */ + Status = STATUS_INVALID_DEVICE_REQUEST; + break; + } } /* Create the FDO for the bus */ @@ -484,11 +521,15 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, ASSERT(AttachedTo != NULL); if (!AttachedTo) break; FdoExtension->AttachedDeviceObject = AttachedTo; + + /* Check if this is a child bus, or the root */ if (ParentExtension) { - /* More than one PCI bus, this is not expected yet */ - UNIMPLEMENTED; - while (TRUE); + /* The child inherits root data */ + FdoExtension->BaseBus = PdoExtension->Dependent.type1.SecondaryBus; + FdoExtension->BusRootFdoExtension = ParentExtension->BusRootFdoExtension; + PdoExtension->BridgeFdoExtension = FdoExtension; + FdoExtension->ParentFdoExtension = ParentExtension; } else { @@ -505,7 +546,9 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, { /* Root PDO in ReactOS does not assign boot resources */ UNIMPLEMENTED; - while (TRUE); +// while (TRUE); + DPRINT1("Encountered during setup\n"); + Descriptor = NULL; } if (Descriptor) @@ -520,15 +563,11 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, if (PciBreakOnDefault) { /* If a second bus is found and there's still no data, crash */ - #if 0 // ros bug? KeBugCheckEx(PCI_BUS_DRIVER_INTERNAL, 0xDEAD0010u, (ULONG_PTR)DeviceObject, 0, 0); - #else - DPRINT1("Windows would crash!\n"); - #endif } /* Warn that a default configuration will be used, and set bus 0 */ @@ -586,12 +625,16 @@ PciAddDevice(IN PDRIVER_OBJECT DriverObject, /* The Bus FDO is now initialized */ DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; - DPRINT1("PCI Root FDO Added: %p %p\n", DeviceObject, FdoExtension); return STATUS_SUCCESS; } while (FALSE); /* This is the failure path */ ASSERT(!NT_SUCCESS(Status)); + + /* Check if the FDO extension exists */ + if (FdoExtension) DPRINT1("Should destroy secondaries\n"); + + /* Delete device objects */ if (AttachedTo) IoDetachDevice(AttachedTo); if (DeviceObject) IoDeleteDevice(DeviceObject); return Status; diff --git a/drivers/bus/pcix/hookhal.c b/drivers/bus/pcix/hookhal.c index 7a36024d11e..902b287fb89 100644 --- a/drivers/bus/pcix/hookhal.c +++ b/drivers/bus/pcix/hookhal.c @@ -27,10 +27,88 @@ PciTranslateBusAddress(IN INTERFACE_TYPE InterfaceType, OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress) { - /* This function is not yet implemented */ + /* FIXME: Broken translation */ UNIMPLEMENTED; - while (TRUE); - return FALSE; + TranslatedAddress->QuadPart = BusAddress.QuadPart; + return TRUE; +} + +PPCI_PDO_EXTENSION +NTAPI +PciFindPdoByLocation(IN ULONG BusNumber, + IN ULONG SlotNumber) +{ + PPCI_FDO_EXTENSION DeviceExtension; + PPCI_PDO_EXTENSION PdoExtension; + PCI_SLOT_NUMBER PciSlot; + PciSlot.u.AsULONG = SlotNumber; + + /* Acquire the global lock */ + KeEnterCriticalRegion(); + KeWaitForSingleObject(&PciGlobalLock, Executive, KernelMode, FALSE, NULL); + + /* Now search for the extension */ + DeviceExtension = (PPCI_FDO_EXTENSION)PciFdoExtensionListHead.Next; + while (DeviceExtension) + { + /* If we found it, break out */ + if (DeviceExtension->BaseBus == BusNumber) break; + + /* Move to the next device */ + DeviceExtension = (PPCI_FDO_EXTENSION)DeviceExtension->List.Next; + } + + /* Release the global lock */ + KeSetEvent(&PciGlobalLock, IO_NO_INCREMENT, FALSE); + KeLeaveCriticalRegion(); + + /* Check if the device extension for the bus was found */ + if (!DeviceExtension) + { + /* It wasn't, bail out */ + DPRINT1("Pci: Could not find PCI bus FDO. Bus Number = 0x%x\n", BusNumber); + return NULL; + } + + /* Acquire this device's lock */ + KeEnterCriticalRegion(); + KeWaitForSingleObject(&DeviceExtension->ChildListLock, + Executive, + KernelMode, + FALSE, + NULL); + + /* Loop every child PDO */ + for (PdoExtension = DeviceExtension->ChildPdoList; + PdoExtension; + PdoExtension = PdoExtension->Next) + { + /* Check if the function number and header data matches */ + if ((PdoExtension->Slot.u.bits.FunctionNumber == PciSlot.u.bits.FunctionNumber) && + (PdoExtension->Slot.u.bits.DeviceNumber == PciSlot.u.bits.DeviceNumber)) + { + /* This is considered to be the same PDO */ + ASSERT(PdoExtension->Slot.u.AsULONG == PciSlot.u.AsULONG); + break; + } + } + + /* Release this device's lock */ + KeSetEvent(&DeviceExtension->ChildListLock, IO_NO_INCREMENT, FALSE); + KeLeaveCriticalRegion(); + + /* Check if we found something */ + if (!PdoExtension) + { + /* Let the debugger know */ + DPRINT1("Pci: Could not find PDO for device @ %x.%x.%x\n", + BusNumber, + PciSlot.u.bits.DeviceNumber, + PciSlot.u.bits.FunctionNumber); + } + + /* If the search found something, this is non-NULL, otherwise it's NULL */ + return PdoExtension; } NTSTATUS @@ -44,10 +122,120 @@ PciAssignSlotResources(IN PUNICODE_STRING RegistryPath, IN ULONG SlotNumber, IN OUT PCM_RESOURCE_LIST *AllocatedResources) { - /* This function is not yet implemented */ - UNIMPLEMENTED; - while (TRUE); - return STATUS_NOT_SUPPORTED; + PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList = NULL; + PCM_RESOURCE_LIST Resources = NULL; + PCI_COMMON_HEADER PciData; + PPCI_PDO_EXTENSION PdoExtension; + NTSTATUS Status; + PDEVICE_OBJECT ExistingDeviceObject; + PAGED_CODE(); + ASSERT(PcipSavedAssignSlotResources); + ASSERT(BusType == PCIBus); + + /* Assume no resources */ + *AllocatedResources = NULL; + + /* Find the PDO for this slot and make sure it exists and is started */ + PdoExtension = PciFindPdoByLocation(BusNumber, SlotNumber); + if (!PdoExtension) return STATUS_DEVICE_DOES_NOT_EXIST; + if (PdoExtension->DeviceState == PciNotStarted) return STATUS_INVALID_OWNER; + + /* Acquire the global lock while we attempt to assign resources */ + KeEnterCriticalRegion(); + KeWaitForSingleObject(&PciGlobalLock, Executive, KernelMode, FALSE, NULL); + do + { + /* Make sure we're not on the PDO for some reason */ + ASSERT(DeviceObject != PdoExtension->PhysicalDeviceObject); + + /* Read the PCI header and cache the routing information */ + PciReadDeviceConfig(PdoExtension, &PciData, 0, PCI_COMMON_HDR_LENGTH); + Status = PciCacheLegacyDeviceRouting(DeviceObject, + BusNumber, + SlotNumber, + PciData.u.type0.InterruptLine, + PciData.u.type0.InterruptPin, + PciData.BaseClass, + PciData.SubClass, + PdoExtension->ParentFdoExtension-> + PhysicalDeviceObject, + PdoExtension, + &ExistingDeviceObject); + if (NT_SUCCESS(Status)) + { + /* Manually build the requirements for this device, and mark it legacy */ + Status = PciBuildRequirementsList(PdoExtension, + &PciData, + &RequirementsList); + PdoExtension->LegacyDriver = TRUE; + if (NT_SUCCESS(Status)) + { + /* Now call the legacy Pnp function to actually assign resources */ + Status = IoAssignResources(RegistryPath, + DriverClassName, + DriverObject, + DeviceObject, + RequirementsList, + &Resources); + if (NT_SUCCESS(Status)) + { + /* Resources are ready, so enable all decodes */ + PdoExtension->CommandEnables |= (PCI_ENABLE_IO_SPACE | + PCI_ENABLE_MEMORY_SPACE | + PCI_ENABLE_BUS_MASTER); + + /* Compute new resource settings based on what PnP assigned */ + PciComputeNewCurrentSettings(PdoExtension, Resources); + + /* Set these new resources on the device */ + Status = PciSetResources(PdoExtension, TRUE, TRUE); + if (NT_SUCCESS(Status)) + { + /* Some work needs to happen here to handle this */ + ASSERT(Resources->Count == 1); + //ASSERT(PartialList->Count > 0); + + UNIMPLEMENTED; + + /* Return the allocated resources, and success */ + *AllocatedResources = Resources; + Resources = NULL; + Status = STATUS_SUCCESS; + } + } + else + { + /* If assignment failed, no resources should exist */ + ASSERT(Resources == NULL); + } + + /* If assignment succeeed, then we are done */ + if (NT_SUCCESS(Status)) break; + } + + /* Otherwise, cache the new routing */ + PciCacheLegacyDeviceRouting(ExistingDeviceObject, + BusNumber, + SlotNumber, + PciData.u.type0.InterruptLine, + PciData.u.type0.InterruptPin, + PciData.BaseClass, + PciData.SubClass, + PdoExtension->ParentFdoExtension-> + PhysicalDeviceObject, + PdoExtension, + NULL); + } + } while (0); + + /* Release the lock */ + KeSetEvent(&PciGlobalLock, 0, 0); + KeLeaveCriticalRegion(); + + /* Free any temporary resource data and return the status */ + if (RequirementsList) ExFreePoolWithTag(RequirementsList, 0); + if (Resources) ExFreePoolWithTag(Resources, 0); + return Status; } VOID @@ -61,7 +249,7 @@ PciHookHal(VOID) PcipSavedTranslateBusAddress = HalPciTranslateBusAddress; /* Take over the HAL's Bus Handler functions */ - HalPciAssignSlotResources = PciAssignSlotResources; +// HalPciAssignSlotResources = PciAssignSlotResources; HalPciTranslateBusAddress = PciTranslateBusAddress; } diff --git a/drivers/bus/pcix/init.c b/drivers/bus/pcix/init.c index 07f226a279b..45e02ae011f 100644 --- a/drivers/bus/pcix/init.c +++ b/drivers/bus/pcix/init.c @@ -641,6 +641,7 @@ PciBuildHackTable(IN HANDLE KeyHandle) Entry->HackFlags = HackFlags; /* Print out for the debugger's sake */ +#ifdef HACK_DEBUG DPRINT1("Adding Hack entry for Vendor:0x%04x Device:0x%04x ", Entry->VendorID, Entry->DeviceID); if (Entry->Flags & PCI_HACK_HAS_SUBSYSTEM_INFO) @@ -649,6 +650,7 @@ PciBuildHackTable(IN HANDLE KeyHandle) if (Entry->Flags & PCI_HACK_HAS_REVISION_INFO) DbgPrint("Revision:0x%02x", Entry->RevisionID); DbgPrint(" = 0x%I64x\n", Entry->HackFlags); +#endif } /* Bail out in case of failure */ @@ -705,6 +707,12 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, UNICODE_STRING OptionString, PciLockString; NTSTATUS Status; DPRINT1("PCI: DriverEntry!\n"); + + /* Setup initial loop variables */ + KeyHandle = NULL; + ParametersKey = NULL; + DebugKey = NULL; + ControlSetKey = NULL; do { /* Remember our object so we can get it to it later */ @@ -735,11 +743,11 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, KEY_QUERY_VALUE, &ParametersKey, &Status); - if (!Result) break; + //if (!Result) break; /* Build the list of all known PCI erratas */ Status = PciBuildHackTable(ParametersKey); - if (!NT_SUCCESS(Status)) break; + //if (!NT_SUCCESS(Status)) break; /* Open the debug key, if it exists */ Result = PciOpenKey(L"Debug", @@ -760,12 +768,12 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, KeInitializeEvent(&PciLegacyDescriptionLock, SynchronizationEvent, TRUE); /* Open the control set key */ - Status = PciOpenKey(L"\\Registry\\Machine\\System\\CurrentControlSet", + Result = PciOpenKey(L"\\Registry\\Machine\\System\\CurrentControlSet", NULL, KEY_QUERY_VALUE, &ControlSetKey, &Status); - if (!NT_SUCCESS(Status)) break; + if (!Result) break; /* Read the command line */ Status = PciGetRegistryValue(L"SystemStartOptions", @@ -852,7 +860,7 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, if (PciRunningDatacenter) DPRINT1("PCI running on datacenter build\n"); /* Check if the system has an ACPI Hardware Watchdog Timer */ - WdTable = PciGetAcpiTable(WDRT_SIGNATURE); + //WdTable = PciGetAcpiTable(WDRT_SIGNATURE); Status = STATUS_SUCCESS; } while (FALSE); diff --git a/drivers/bus/pcix/intrface/routintf.c b/drivers/bus/pcix/intrface/routintf.c index e910b7c47f6..d7b7b458b4d 100644 --- a/drivers/bus/pcix/intrface/routintf.c +++ b/drivers/bus/pcix/intrface/routintf.c @@ -14,6 +14,8 @@ /* GLOBALS ********************************************************************/ +PPCI_LEGACY_DEVICE PciLegacyDeviceHead; + PCI_INTERFACE PciRoutingInterface = { &GUID_INT_ROUTE_INTERFACE_STANDARD, @@ -55,4 +57,92 @@ routeintrf_Constructor(IN PVOID DeviceExtension, while (TRUE); } +NTSTATUS +NTAPI +PciCacheLegacyDeviceRouting(IN PDEVICE_OBJECT DeviceObject, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN UCHAR InterruptLine, + IN UCHAR InterruptPin, + IN UCHAR BaseClass, + IN UCHAR SubClass, + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PPCI_PDO_EXTENSION PdoExtension, + OUT PDEVICE_OBJECT *pFoundDeviceObject) +{ + PPCI_LEGACY_DEVICE *Link; + PPCI_LEGACY_DEVICE LegacyDevice; + PDEVICE_OBJECT FoundDeviceObject; + PAGED_CODE(); + + /* Scan current registered devices */ + LegacyDevice = PciLegacyDeviceHead; + Link = &PciLegacyDeviceHead; + while (LegacyDevice) + { + /* Find a match */ + if ((BusNumber == LegacyDevice->BusNumber) && + (SlotNumber == LegacyDevice->SlotNumber)) + { + /* We already know about this routing */ + break; + } + + /* We know about device already, but for a different location */ + if (LegacyDevice->DeviceObject == DeviceObject) + { + /* Free the existing structure, move to the next one */ + *Link = LegacyDevice->Next; + ExFreePoolWithTag(LegacyDevice, 0); + LegacyDevice = *Link; + } + else + { + /* Keep going */ + Link = &LegacyDevice->Next; + LegacyDevice = LegacyDevice->Next; + } + } + + /* Did we find a match? */ + if (!LegacyDevice) + { + /* Allocate a new cache structure */ + LegacyDevice = ExAllocatePoolWithTag(PagedPool, + sizeof(PCI_LEGACY_DEVICE), + 'PciR'); + if (!LegacyDevice) return STATUS_INSUFFICIENT_RESOURCES; + + /* Save all the data in it */ + RtlZeroMemory(LegacyDevice, sizeof(PCI_LEGACY_DEVICE)); + LegacyDevice->BusNumber = BusNumber; + LegacyDevice->SlotNumber = SlotNumber; + LegacyDevice->InterruptLine = InterruptLine; + LegacyDevice->InterruptPin = InterruptPin; + LegacyDevice->BaseClass = BaseClass; + LegacyDevice->SubClass = SubClass; + LegacyDevice->PhysicalDeviceObject = PhysicalDeviceObject; + LegacyDevice->DeviceObject = DeviceObject; + LegacyDevice->PdoExtension = PdoExtension; + + /* Link it in the list */ + LegacyDevice->Next = PciLegacyDeviceHead; + PciLegacyDeviceHead = LegacyDevice; + } + + /* Check if we found, or created, a matching caching structure */ + FoundDeviceObject = LegacyDevice->DeviceObject; + if (FoundDeviceObject == DeviceObject) + { + /* Return the device object and success */ + if (pFoundDeviceObject) *pFoundDeviceObject = DeviceObject; + return STATUS_SUCCESS; + } + + /* Otherwise, this is a new device object for this location */ + LegacyDevice->DeviceObject = DeviceObject; + if (pFoundDeviceObject) *pFoundDeviceObject = FoundDeviceObject; + return STATUS_SUCCESS; +} + /* EOF */ diff --git a/drivers/bus/pcix/pci.h b/drivers/bus/pcix/pci.h index d1b8f9faec7..c1984da84d6 100644 --- a/drivers/bus/pcix/pci.h +++ b/drivers/bus/pcix/pci.h @@ -514,6 +514,24 @@ typedef struct _PCI_IPI_CONTEXT PVOID Context; } PCI_IPI_CONTEXT, *PPCI_IPI_CONTEXT; +// +// PCI Legacy Device Location Cache +// +typedef struct _PCI_LEGACY_DEVICE +{ + struct _PCI_LEGACY_DEVICE *Next; + PDEVICE_OBJECT DeviceObject; + ULONG BusNumber; + ULONG SlotNumber; + UCHAR InterruptLine; + UCHAR InterruptPin; + UCHAR BaseClass; + UCHAR SubClass; + PDEVICE_OBJECT PhysicalDeviceObject; + ROUTING_TOKEN RoutingToken; + PPCI_PDO_EXTENSION PdoExtension; +} PCI_LEGACY_DEVICE, *PPCI_LEGACY_DEVICE; + // // IRP Dispatch Routines // @@ -1560,6 +1578,14 @@ PciSetResources( IN BOOLEAN SomethingSomethingDarkSide ); +NTSTATUS +NTAPI +PciBuildRequirementsList( + IN PPCI_PDO_EXTENSION PdoExtension, + IN PPCI_COMMON_HEADER PciData, + OUT PIO_RESOURCE_REQUIREMENTS_LIST* Buffer +); + // // Identification Functions // @@ -1734,6 +1760,33 @@ PPBridge_ChangeResourceSettings( IN PPCI_COMMON_HEADER PciData ); +// +// Bus Number Routines +// +BOOLEAN +NTAPI +PciAreBusNumbersConfigured( + IN PPCI_PDO_EXTENSION PdoExtension +); + +// +// Routine Interface +// +NTSTATUS +NTAPI +PciCacheLegacyDeviceRouting( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN UCHAR InterruptLine, + IN UCHAR InterruptPin, + IN UCHAR BaseClass, + IN UCHAR SubClass, + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PPCI_PDO_EXTENSION PdoExtension, + OUT PDEVICE_OBJECT *pFoundDeviceObject +); + // // External Resources // diff --git a/drivers/bus/pcix/pci/busno.c b/drivers/bus/pcix/pci/busno.c index e5a981631c4..6b6316493f3 100644 --- a/drivers/bus/pcix/pci/busno.c +++ b/drivers/bus/pcix/pci/busno.c @@ -16,4 +16,24 @@ /* FUNCTIONS ******************************************************************/ +BOOLEAN +NTAPI +PciAreBusNumbersConfigured(IN PPCI_PDO_EXTENSION PdoExtension) +{ + PAGED_CODE(); + UCHAR PrimaryBus, BaseBus, SecondaryBus, SubordinateBus; + + /* Get all relevant bus number details */ + PrimaryBus = PdoExtension->Dependent.type1.PrimaryBus; + BaseBus = PdoExtension->ParentFdoExtension->BaseBus; + SecondaryBus = PdoExtension->Dependent.type1.SecondaryBus; + SubordinateBus = PdoExtension->Dependent.type1.SubordinateBus; + + /* The primary bus should be the base bus of the parent */ + if ((PrimaryBus != BaseBus) || (SecondaryBus <= PrimaryBus)) return FALSE; + + /* The subordinate should be a higher bus number than the secondary */ + return SubordinateBus >= SecondaryBus; +} + /* EOF */ diff --git a/drivers/bus/pcix/pci/ppbridge.c b/drivers/bus/pcix/pci/ppbridge.c index a6d942a7e61..b7a9356bf25 100644 --- a/drivers/bus/pcix/pci/ppbridge.c +++ b/drivers/bus/pcix/pci/ppbridge.c @@ -680,8 +680,89 @@ NTAPI PPBridge_ChangeResourceSettings(IN PPCI_PDO_EXTENSION PdoExtension, IN PPCI_COMMON_HEADER PciData) { - UNIMPLEMENTED; - while (TRUE); + BOOLEAN IoActive; + PPCI_FDO_EXTENSION FdoExtension; + PPCI_FUNCTION_RESOURCES PciResources; + ULONG i; + + /* Check if I/O Decodes are enabled */ + IoActive = (PciData->u.type1.IOBase & 0xF) == 1; + + /* + * Check for Intel ICH PCI-to-PCI (i82801) bridges (used on the i810, + * i820, i840, i845 Chipsets) that don't have subtractive decode broken. + * If they do have broken subtractive support, or if they are not ICH bridges, + * then check if the bridge supports substractive decode at all. + */ + if ((((PdoExtension->VendorId == 0x8086) && + ((PdoExtension->DeviceId == 0x2418) || + (PdoExtension->DeviceId == 0x2428) || + (PdoExtension->DeviceId == 0x244E) || + (PdoExtension->DeviceId == 0x2448))) && + (!(PdoExtension->HackFlags & PCI_HACK_BROKEN_SUBTRACTIVE_DECODE) || + (PdoExtension->Dependent.type1.SubtractiveDecode == FALSE))) || + (PdoExtension->Dependent.type1.SubtractiveDecode == FALSE)) + { + /* No resources are needed on a subtractive decode bridge */ + PciData->u.type1.MemoryBase = 0xFFFF; + PciData->u.type1.PrefetchBase = 0xFFFF; + PciData->u.type1.IOBase = 0xFF; + PciData->u.type1.IOLimit = 0; + PciData->u.type1.MemoryLimit = 0; + PciData->u.type1.PrefetchLimit = 0; + PciData->u.type1.PrefetchBaseUpper32 = 0; + PciData->u.type1.PrefetchLimitUpper32 = 0; + PciData->u.type1.IOBaseUpper16 = 0; + PciData->u.type1.IOLimitUpper16 = 0; + } + else + { + /* + * Otherwise, get the FDO to read the old PCI configuration header that + * had been saved by the hack in PPBridge_SaveCurrentSettings. + */ + FdoExtension = PdoExtension->ParentFdoExtension; + ASSERT(PdoExtension->Resources == NULL); + + /* Read the PCI header data and use that here */ + PciData->u.type1.IOBase = FdoExtension->PreservedConfig->u.type1.IOBase; + PciData->u.type1.IOLimit = FdoExtension->PreservedConfig->u.type1.IOLimit; + PciData->u.type1.MemoryBase = FdoExtension->PreservedConfig->u.type1.MemoryBase; + PciData->u.type1.MemoryLimit = FdoExtension->PreservedConfig->u.type1.MemoryLimit; + PciData->u.type1.PrefetchBase = FdoExtension->PreservedConfig->u.type1.PrefetchBase; + PciData->u.type1.PrefetchLimit = FdoExtension->PreservedConfig->u.type1.PrefetchLimit; + PciData->u.type1.PrefetchBaseUpper32 = FdoExtension->PreservedConfig->u.type1.PrefetchBaseUpper32; + PciData->u.type1.PrefetchLimitUpper32 = FdoExtension->PreservedConfig->u.type1.PrefetchLimitUpper32; + PciData->u.type1.IOBaseUpper16 = FdoExtension->PreservedConfig->u.type1.IOBaseUpper16; + PciData->u.type1.IOLimitUpper16 = FdoExtension->PreservedConfig->u.type1.IOLimitUpper16; + } + + /* Loop bus resources */ + PciResources = PdoExtension->Resources; + if (PciResources) + { + /* Loop each resource type (the BARs, ROM BAR and Prefetch) */ + for (i = 0; i < 6; i++) + { + UNIMPLEMENTED; + } + } + + /* Copy the bus number data */ + PciData->u.type1.PrimaryBus = PdoExtension->Dependent.type1.PrimaryBus; + PciData->u.type1.SecondaryBus = PdoExtension->Dependent.type1.SecondaryBus; + PciData->u.type1.SubordinateBus = PdoExtension->Dependent.type1.SubordinateBus; + + /* Copy the decode flags */ + if (PdoExtension->Dependent.type1.IsaBitSet) + { + PciData->u.type1.BridgeControl |= PCI_ENABLE_BRIDGE_ISA; + } + + if (PdoExtension->Dependent.type1.VgaBitSet) + { + PciData->u.type1.BridgeControl |= PCI_ENABLE_BRIDGE_VGA; + } } /* EOF */ diff --git a/drivers/bus/pcix/utils.c b/drivers/bus/pcix/utils.c index 24f442ae16d..5948e8a5168 100644 --- a/drivers/bus/pcix/utils.c +++ b/drivers/bus/pcix/utils.c @@ -369,16 +369,16 @@ PciFindParentPciFdoExtension(IN PDEVICE_OBJECT DeviceObject, /* Scan all children PDO, stop when no more PDOs, or found it */ for (FoundExtension = DeviceExtension->ChildPdoList; - FoundExtension && (FoundExtension != SearchExtension); + ((FoundExtension) && (FoundExtension != SearchExtension)); FoundExtension = FoundExtension->Next); - /* If we found it, break out */ - if (FoundExtension) break; - /* Release this device's lock */ KeSetEvent(&DeviceExtension->ChildListLock, IO_NO_INCREMENT, FALSE); KeLeaveCriticalRegion(); + /* If we found it, break out */ + if (FoundExtension) break; + /* Move to the next device */ DeviceExtension = (PPCI_FDO_EXTENSION)DeviceExtension->List.Next; } @@ -611,6 +611,9 @@ PciGetHackFlags(IN USHORT VendorId, ULONGLONG HackFlags; ULONG LastWeight, MatchWeight; ULONG EntryFlags; + + /* ReactOS SetupLDR Hack */ + if (!PciHackTable) return 0; /* Initialize the variables before looping */ LastWeight = 0; diff --git a/drivers/input/i8042prt/mouse.c b/drivers/input/i8042prt/mouse.c index efa73093244..128dd95252c 100644 --- a/drivers/input/i8042prt/mouse.c +++ b/drivers/input/i8042prt/mouse.c @@ -492,7 +492,7 @@ cleanup: { PINTERNAL_I8042_HOOK_MOUSE MouseHook; TRACE_(I8042PRT, "IRP_MJ_INTERNAL_DEVICE_CONTROL / IOCTL_INTERNAL_I8042_HOOK_MOUSE\n"); - if (Stack->Parameters.DeviceIoControl.InputBufferLength < sizeof(CONNECT_DATA)) + if (Stack->Parameters.DeviceIoControl.InputBufferLength < sizeof(INTERNAL_I8042_HOOK_MOUSE)) { Status = STATUS_INVALID_PARAMETER; break; diff --git a/drivers/ksfilter/ks/connectivity.c b/drivers/ksfilter/ks/connectivity.c index b20263af07f..2825221c4d1 100644 --- a/drivers/ksfilter/ks/connectivity.c +++ b/drivers/ksfilter/ks/connectivity.c @@ -330,6 +330,7 @@ KspPinPropertyHandler( NTSTATUS Status = STATUS_NOT_SUPPORTED; ULONG Count; const PKSDATARANGE* DataRanges; + LPGUID Guid; IoStack = IoGetCurrentIrpStackLocation(Irp); Buffer = Irp->UserBuffer; @@ -509,48 +510,77 @@ KspPinPropertyHandler( case KSPROPERTY_PIN_CATEGORY: + if (!Descriptor->Category) + { + /* no pin category */ + return STATUS_NOT_FOUND; + } + + /* check size */ Size = sizeof(GUID); if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) { + /* buffer too small */ Irp->IoStatus.Information = Size; Status = STATUS_BUFFER_TOO_SMALL; break; } - if (Descriptor->Category) - { - RtlMoveMemory(Buffer, Descriptor->Category, sizeof(GUID)); - } + /* copy category guid */ + RtlMoveMemory(Buffer, Descriptor->Category, sizeof(GUID)); + + /* save result */ Status = STATUS_SUCCESS; Irp->IoStatus.Information = Size; break; case KSPROPERTY_PIN_NAME: - if (!Descriptor->Name) + + if (Descriptor->Name) { - Irp->IoStatus.Information = 0; - Status = STATUS_SUCCESS; - break; + /* use pin name */ + Guid = (LPGUID)Descriptor->Name; + } + else + { + /* use pin category as fallback */ + Guid = (LPGUID)Descriptor->Category; } - Status = KspReadMediaCategory((LPGUID)Descriptor->Name, &KeyInfo); + if (!Guid) + { + /* no friendly name available */ + return STATUS_NOT_FOUND; + } + + /* read friendly name category name */ + Status = KspReadMediaCategory(Guid, &KeyInfo); if (!NT_SUCCESS(Status)) { + /* failed to read category */ Irp->IoStatus.Information = 0; break; } + /* store required length */ Irp->IoStatus.Information = KeyInfo->DataLength + sizeof(WCHAR); + /* check if buffer is too small */ if (KeyInfo->DataLength + sizeof(WCHAR) > IoStack->Parameters.DeviceIoControl.OutputBufferLength) { + /* buffer too small */ Status = STATUS_BUFFER_OVERFLOW; FreeItem(KeyInfo); break; } + /* copy result */ RtlMoveMemory(Irp->UserBuffer, &KeyInfo->Data, KeyInfo->DataLength); + + /* null terminate name */ ((LPWSTR)Irp->UserBuffer)[KeyInfo->DataLength / sizeof(WCHAR)] = L'\0'; + + /* free key info */ FreeItem(KeyInfo); break; case KSPROPERTY_PIN_PROPOSEDATAFORMAT: diff --git a/drivers/ksfilter/ks/ksfunc.h b/drivers/ksfilter/ks/ksfunc.h index 636c616bcb2..6a4d85df867 100644 --- a/drivers/ksfilter/ks/ksfunc.h +++ b/drivers/ksfilter/ks/ksfunc.h @@ -186,3 +186,9 @@ KspValidateConnectRequest( IN PVOID Descriptors, IN ULONG DescriptorSize, OUT PKSPIN_CONNECT* Connect); + +NTSTATUS +KspReadMediaCategory( + IN LPGUID Category, + PKEY_VALUE_PARTIAL_INFORMATION *OutInformation); + diff --git a/drivers/ksfilter/ks/topology.c b/drivers/ksfilter/ks/topology.c index e507eb77fab..321f0ba59ed 100644 --- a/drivers/ksfilter/ks/topology.c +++ b/drivers/ksfilter/ks/topology.c @@ -147,17 +147,11 @@ KsTopologyPropertyHandler( IN OUT PVOID Data, IN const KSTOPOLOGY* Topology) { - UNICODE_STRING LocalMachine = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\MediaCategories\\"); - UNICODE_STRING Name = RTL_CONSTANT_STRING(L"Name"); - UNICODE_STRING GuidString; - UNICODE_STRING KeyName; - OBJECT_ATTRIBUTES ObjectAttributes; KSP_NODE * Node; PIO_STACK_LOCATION IoStack; - ULONG Size; NTSTATUS Status; - HANDLE hKey; PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; + LPGUID Guid; IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -184,90 +178,60 @@ KsTopologyPropertyHandler( case KSPROPERTY_TOPOLOGY_NAME: Node = (KSP_NODE*)Property; + /* check for invalid node id */ if (Node->NodeId >= Topology->TopologyNodesCount) { + /* invalid node id */ Irp->IoStatus.Information = 0; Status = STATUS_INVALID_PARAMETER; break; } - Status = RtlStringFromGUID(&Topology->TopologyNodesNames[Node->NodeId], &GuidString); + /* check if there is a name supplied */ + if (!IsEqualGUIDAligned(&Topology->TopologyNodesNames[Node->NodeId], &GUID_NULL)) + { + /* node name has been supplied */ + Guid = (LPGUID)&Topology->TopologyNodesNames[Node->NodeId]; + } + else + { + /* fallback to topology node type */ + Guid = (LPGUID)&Topology->TopologyNodes[Node->NodeId]; + } + + /* read topology node name */ + Status = KspReadMediaCategory(Guid, &KeyInfo); if (!NT_SUCCESS(Status)) { Irp->IoStatus.Information = 0; break; } - KeyName.Length = 0; - KeyName.MaximumLength = LocalMachine.Length + GuidString.Length + sizeof(WCHAR); - KeyName.Buffer = AllocateItem(PagedPool, KeyName.MaximumLength); - if (!KeyName.Buffer) - { - Irp->IoStatus.Information = 0; - Status = STATUS_INSUFFICIENT_RESOURCES; - RtlFreeUnicodeString(&GuidString); - break; - } + /* store result size */ + Irp->IoStatus.Information = KeyInfo->DataLength + sizeof(WCHAR); - RtlAppendUnicodeStringToString(&KeyName, &LocalMachine); - RtlAppendUnicodeStringToString(&KeyName, &GuidString); - - RtlFreeUnicodeString(&GuidString); - - InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, NULL, NULL); - Status = ZwOpenKey(&hKey, GENERIC_READ, &ObjectAttributes); - - FreeItem(KeyName.Buffer); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("ZwOpenKey() failed with status 0x%08lx\n", Status); - Irp->IoStatus.Information = 0; - break; - } - - Status = ZwQueryValueKey(hKey, &Name, KeyValuePartialInformation, NULL, 0, &Size); - if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL) - { - ZwClose(hKey); - Irp->IoStatus.Information = 0; - break; - } - - ASSERT(Size); - KeyInfo = (PKEY_VALUE_PARTIAL_INFORMATION) AllocateItem(NonPagedPool, Size); - if (!KeyInfo) - { - Status = STATUS_NO_MEMORY; - break; - } - - Status = ZwQueryValueKey(hKey, &Name, KeyValuePartialInformation, (PVOID)KeyInfo, Size, &Size); - if (!NT_SUCCESS(Status)) - { - FreeItem(KeyInfo); - ZwClose(hKey); - Irp->IoStatus.Information = 0; - break; - } - - ZwClose(hKey); + /* check for buffer overflow */ if (KeyInfo->DataLength + sizeof(WCHAR) > IoStack->Parameters.DeviceIoControl.OutputBufferLength) { - Irp->IoStatus.Information = KeyInfo->DataLength + sizeof(WCHAR); - Status = STATUS_MORE_ENTRIES; + /* buffer too small */ + Status = STATUS_BUFFER_OVERFLOW; FreeItem(KeyInfo); break; } + /* copy result buffer */ RtlMoveMemory(Irp->UserBuffer, &KeyInfo->Data, KeyInfo->DataLength); + + /* zero terminate it */ ((LPWSTR)Irp->UserBuffer)[KeyInfo->DataLength / sizeof(WCHAR)] = L'\0'; - Irp->IoStatus.Information = KeyInfo->DataLength + sizeof(WCHAR); + + /* free key info */ FreeItem(KeyInfo); + break; default: Irp->IoStatus.Information = 0; - Status = STATUS_NOT_IMPLEMENTED; + Status = STATUS_NOT_FOUND; } diff --git a/drivers/network/ndis/ndis/time.c b/drivers/network/ndis/ndis/time.c index 1f4c2b05573..f1fe891638a 100644 --- a/drivers/network/ndis/ndis/time.c +++ b/drivers/network/ndis/ndis/time.c @@ -145,7 +145,7 @@ NdisMCancelTimer( * - call at IRQL <= DISPATCH_LEVEL */ { - KIRQL OldIrql; + //KIRQL OldIrql; ASSERT_IRQL(DISPATCH_LEVEL); ASSERT(TimerCancelled); @@ -153,6 +153,7 @@ NdisMCancelTimer( *TimerCancelled = KeCancelTimer (&Timer->Timer); +#if 0 if (*TimerCancelled) { KeAcquireSpinLock(&Timer->Miniport->Lock, &OldIrql); @@ -160,6 +161,7 @@ NdisMCancelTimer( if (!DequeueMiniportTimer(Timer)) ASSERT(FALSE); KeReleaseSpinLock(&Timer->Miniport->Lock, OldIrql); } +#endif } VOID NTAPI @@ -170,6 +172,7 @@ MiniTimerDpcFunction(PKDPC Dpc, { PNDIS_MINIPORT_TIMER Timer = DeferredContext; +#if 0 /* Only dequeue if the timer has a period of 0 */ if (!Timer->Timer.Period) { @@ -178,6 +181,7 @@ MiniTimerDpcFunction(PKDPC Dpc, if (!DequeueMiniportTimer(Timer)) ASSERT(FALSE); KeReleaseSpinLockFromDpcLevel(&Timer->Miniport->Lock); } +#endif Timer->MiniportTimerFunction(Dpc, Timer->MiniportTimerContext, @@ -240,14 +244,15 @@ NdisMSetPeriodicTimer( */ { LARGE_INTEGER Timeout; - KIRQL OldIrql; + //KIRQL OldIrql; ASSERT_IRQL(DISPATCH_LEVEL); ASSERT(Timer); /* relative delays are negative, absolute are positive; resolution is 100ns */ Timeout.QuadPart = Int32x32To64(MillisecondsPeriod, -10000); - + +#if 0 /* Lock the miniport block */ KeAcquireSpinLock(&Timer->Miniport->Lock, &OldIrql); @@ -260,6 +265,7 @@ NdisMSetPeriodicTimer( /* Unlock the miniport block */ KeReleaseSpinLock(&Timer->Miniport->Lock, OldIrql); +#endif KeSetTimerEx(&Timer->Timer, Timeout, MillisecondsPeriod, &Timer->Dpc); } @@ -285,7 +291,7 @@ NdisMSetTimer( */ { LARGE_INTEGER Timeout; - KIRQL OldIrql; + //KIRQL OldIrql; ASSERT_IRQL(DISPATCH_LEVEL); ASSERT(Timer); @@ -293,6 +299,7 @@ NdisMSetTimer( /* relative delays are negative, absolute are positive; resolution is 100ns */ Timeout.QuadPart = Int32x32To64(MillisecondsToDelay, -10000); +#if 0 /* Lock the miniport block */ KeAcquireSpinLock(&Timer->Miniport->Lock, &OldIrql); @@ -305,6 +312,7 @@ NdisMSetTimer( /* Unlock the miniport block */ KeReleaseSpinLock(&Timer->Miniport->Lock, OldIrql); +#endif KeSetTimer(&Timer->Timer, Timeout, &Timer->Dpc); } diff --git a/drivers/network/tcpip/include/ip.h b/drivers/network/tcpip/include/ip.h index dc6898d1d8a..9d467e593ea 100644 --- a/drivers/network/tcpip/include/ip.h +++ b/drivers/network/tcpip/include/ip.h @@ -205,7 +205,6 @@ extern LIST_ENTRY InterfaceListHead; extern KSPIN_LOCK InterfaceListLock; extern LIST_ENTRY NetTableListHead; extern KSPIN_LOCK NetTableListLock; -extern BOOLEAN IpWorkItemQueued; PIP_PACKET IPCreatePacket( ULONG Type); @@ -232,7 +231,10 @@ BOOLEAN IPRegisterInterface( VOID IPUnregisterInterface( PIP_INTERFACE IF); -VOID NTAPI IPTimeout( PVOID Context ); +VOID NTAPI IPTimeoutDpcFn(PKDPC Dpc, + PVOID DeferredContext, + PVOID SystemArgument1, + PVOID SystemArgument2); VOID IPDispatchProtocol( PIP_INTERFACE Interface, diff --git a/drivers/network/tcpip/tcpip/main.c b/drivers/network/tcpip/tcpip/main.c index d1ce6c73c1d..ced3628e5d0 100644 --- a/drivers/network/tcpip/tcpip/main.c +++ b/drivers/network/tcpip/tcpip/main.c @@ -24,8 +24,6 @@ UDP_STATISTICS UDPStats; /* Network timers */ KTIMER IPTimer; KDPC IPTimeoutDpc; -KSPIN_LOCK IpWorkLock; -WORK_QUEUE_ITEM IpWorkItem; VOID TiWriteErrorLog( PDRIVER_OBJECT DriverContext, @@ -578,28 +576,6 @@ VOID NTAPI TiUnload( TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); } -VOID NTAPI IPTimeoutDpcFn( - PKDPC Dpc, - PVOID DeferredContext, - PVOID SystemArgument1, - PVOID SystemArgument2) -/* - * FUNCTION: Timeout DPC - * ARGUMENTS: - * Dpc = Pointer to our DPC object - * DeferredContext = Pointer to context information (unused) - * SystemArgument1 = Unused - * SystemArgument2 = Unused - * NOTES: - * This routine is dispatched once in a while to do maintainance jobs - */ -{ - if( !IpWorkItemQueued ) { - ExQueueWorkItem( &IpWorkItem, DelayedWorkQueue ); - IpWorkItemQueued = TRUE; - } -} - NTSTATUS NTAPI DriverEntry( PDRIVER_OBJECT DriverObject, @@ -630,7 +606,6 @@ DriverEntry( /* Initialize our periodic timer and its associated DPC object. When the timer expires, the IPTimeout deferred procedure call (DPC) is queued */ - ExInitializeWorkItem( &IpWorkItem, IPTimeout, NULL ); KeInitializeDpc(&IPTimeoutDpc, IPTimeoutDpcFn, NULL); KeInitializeTimer(&IPTimer); diff --git a/drivers/storage/class/cdrom/cdrom.c b/drivers/storage/class/cdrom/cdrom.c index ef462658d7e..12531ba3a4d 100644 --- a/drivers/storage/class/cdrom/cdrom.c +++ b/drivers/storage/class/cdrom/cdrom.c @@ -955,7 +955,7 @@ Return Value: // deviceExtension->DiskGeometry = - ExAllocatePool(NonPagedPool, sizeof(DISK_GEOMETRY)); + ExAllocatePool(NonPagedPool, sizeof(DISK_GEOMETRY_EX)); if (deviceExtension->DiskGeometry == NULL) { @@ -1006,7 +1006,7 @@ Return Value: // status = ScsiClassReadDriveCapacity(deviceObject); - bps = deviceExtension->DiskGeometry->BytesPerSector; + bps = deviceExtension->DiskGeometry->Geometry.BytesPerSector; if (!NT_SUCCESS(status) || !bps) { @@ -1037,7 +1037,7 @@ Return Value: bps = 1 << lastBit; } - deviceExtension->DiskGeometry->BytesPerSector = bps; + deviceExtension->DiskGeometry->Geometry.BytesPerSector = bps; DebugPrint((2, "CreateCdRomDeviceObject: Calc'd bps = %x\n", bps)); // @@ -2828,12 +2828,12 @@ Return Value: startingOffset.QuadPart = currentIrpStack->Parameters.Read.ByteOffset.QuadPart + transferByteCount; - if (!deviceExtension->DiskGeometry->BytesPerSector) { - deviceExtension->DiskGeometry->BytesPerSector = 2048; + if (!deviceExtension->DiskGeometry->Geometry.BytesPerSector) { + deviceExtension->DiskGeometry->Geometry.BytesPerSector = 2048; } if ((startingOffset.QuadPart > deviceExtension->PartitionLength.QuadPart) || - (transferByteCount & (deviceExtension->DiskGeometry->BytesPerSector - 1))) { + (transferByteCount & (deviceExtension->DiskGeometry->Geometry.BytesPerSector - 1))) { DebugPrint((1,"ScsiCdRomRead: Invalid I/O parameters\n")); DebugPrint((1, "\toffset %x:%x, Length %x:%x\n", @@ -2841,7 +2841,7 @@ Return Value: startingOffset.u.LowPart, deviceExtension->PartitionLength.u.HighPart, deviceExtension->PartitionLength.u.LowPart)); - DebugPrint((1, "\tbps %x\n", deviceExtension->DiskGeometry->BytesPerSector)); + DebugPrint((1, "\tbps %x\n", deviceExtension->DiskGeometry->Geometry.BytesPerSector)); // // Fail request with status of invalid parameters. @@ -3059,11 +3059,11 @@ CdRomDeviceControlCompletion( bps = 1 << lastBit; } - deviceExtension->DiskGeometry->BytesPerSector = bps; + deviceExtension->DiskGeometry->Geometry.BytesPerSector = bps; DebugPrint((2, "CdRomDeviceControlCompletion: Calculated bps %#x\n", - deviceExtension->DiskGeometry->BytesPerSector)); + deviceExtension->DiskGeometry->Geometry.BytesPerSector)); // // Copy last sector in reverse byte order. @@ -3082,7 +3082,7 @@ CdRomDeviceControlCompletion( WHICH_BIT(bps, deviceExtension->SectorShift); DebugPrint((2,"SCSI ScsiClassReadDriveCapacity: Sector size is %d\n", - deviceExtension->DiskGeometry->BytesPerSector)); + deviceExtension->DiskGeometry->Geometry.BytesPerSector)); DebugPrint((2,"SCSI ScsiClassReadDriveCapacity: Number of Sectors is %d\n", lastSector + 1)); @@ -3097,7 +3097,7 @@ CdRomDeviceControlCompletion( // Calculate number of cylinders. // - deviceExtension->DiskGeometry->Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(32 * 64)); + deviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(32 * 64)); deviceExtension->PartitionLength.QuadPart = (deviceExtension->PartitionLength.QuadPart << deviceExtension->SectorShift); @@ -3108,7 +3108,7 @@ CdRomDeviceControlCompletion( // This device supports removable media. // - deviceExtension->DiskGeometry->MediaType = RemovableMedia; + deviceExtension->DiskGeometry->Geometry.MediaType = RemovableMedia; } else { @@ -3116,20 +3116,20 @@ CdRomDeviceControlCompletion( // Assume media type is fixed disk. // - deviceExtension->DiskGeometry->MediaType = FixedMedia; + deviceExtension->DiskGeometry->Geometry.MediaType = FixedMedia; } // // Assume sectors per track are 32; // - deviceExtension->DiskGeometry->SectorsPerTrack = 32; + deviceExtension->DiskGeometry->Geometry.SectorsPerTrack = 32; // // Assume tracks per cylinder (number of heads) is 64. // - deviceExtension->DiskGeometry->TracksPerCylinder = 64; + deviceExtension->DiskGeometry->Geometry.TracksPerCylinder = 64; // // Copy the device extension's geometry info into the user buffer. @@ -6530,7 +6530,7 @@ Return Value: // from = (PFOUR_BYTE) &readCapacityBuffer->BytesPerBlock; - to = (PFOUR_BYTE) &deviceExtension->DiskGeometry->BytesPerSector; + to = (PFOUR_BYTE) &deviceExtension->DiskGeometry->Geometry.BytesPerSector; to->Byte0 = from->Byte3; to->Byte1 = from->Byte2; to->Byte2 = from->Byte1; @@ -6540,7 +6540,7 @@ Return Value: // Using the new BytesPerBlock, calculate and store the SectorShift. // - WHICH_BIT(deviceExtension->DiskGeometry->BytesPerSector, deviceExtension->SectorShift); + WHICH_BIT(deviceExtension->DiskGeometry->Geometry.BytesPerSector, deviceExtension->SectorShift); // // Copy last sector in reverse byte order. @@ -6558,22 +6558,22 @@ Return Value: // Calculate number of cylinders. // - deviceExtension->DiskGeometry->Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(32 * 64)); + deviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(32 * 64)); deviceExtension->PartitionLength.QuadPart = (deviceExtension->PartitionLength.QuadPart << deviceExtension->SectorShift); - deviceExtension->DiskGeometry->MediaType = RemovableMedia; + deviceExtension->DiskGeometry->Geometry.MediaType = RemovableMedia; // // Assume sectors per track are 32; // - deviceExtension->DiskGeometry->SectorsPerTrack = 32; + deviceExtension->DiskGeometry->Geometry.SectorsPerTrack = 32; // // Assume tracks per cylinder (number of heads) is 64. // - deviceExtension->DiskGeometry->TracksPerCylinder = 64; + deviceExtension->DiskGeometry->Geometry.TracksPerCylinder = 64; } else { @@ -6660,11 +6660,11 @@ Return Value: // originalIrp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; - RtlZeroMemory(deviceExtension->DiskGeometry, sizeof(DISK_GEOMETRY)); - deviceExtension->DiskGeometry->BytesPerSector = 2048; + RtlZeroMemory(deviceExtension->DiskGeometry, sizeof(DISK_GEOMETRY_EX)); + deviceExtension->DiskGeometry->Geometry.BytesPerSector = 2048; deviceExtension->SectorShift = 11; deviceExtension->PartitionLength.QuadPart = (LONGLONG)(0x7fffffff); - deviceExtension->DiskGeometry->MediaType = RemovableMedia; + deviceExtension->DiskGeometry->Geometry.MediaType = RemovableMedia; } } else { @@ -6672,11 +6672,11 @@ Return Value: // Set up reasonable defaults // - RtlZeroMemory(deviceExtension->DiskGeometry, sizeof(DISK_GEOMETRY)); - deviceExtension->DiskGeometry->BytesPerSector = 2048; + RtlZeroMemory(deviceExtension->DiskGeometry, sizeof(DISK_GEOMETRY_EX)); + deviceExtension->DiskGeometry->Geometry.BytesPerSector = 2048; deviceExtension->SectorShift = 11; deviceExtension->PartitionLength.QuadPart = (LONGLONG)(0x7fffffff); - deviceExtension->DiskGeometry->MediaType = RemovableMedia; + deviceExtension->DiskGeometry->Geometry.MediaType = RemovableMedia; } } diff --git a/drivers/storage/class/cdrom_new/cdrom.c b/drivers/storage/class/cdrom_new/cdrom.c new file mode 100644 index 00000000000..aaaa8ee9c7d --- /dev/null +++ b/drivers/storage/class/cdrom_new/cdrom.c @@ -0,0 +1,7136 @@ +/*-- + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + cdrom.c + +Abstract: + + The CDROM class driver tranlates IRPs to SRBs with embedded CDBs + and sends them to its devices through the port driver. + +Environment: + + kernel mode only + +Notes: + + SCSI Tape, CDRom and Disk class drivers share common routines + that can be found in the CLASS directory (..\ntos\dd\class). + +Revision History: + +--*/ + +#include "stddef.h" +#include "string.h" + +#include "ntddk.h" +#include "initguid.h" + +#include "ntddcdvd.h" +#include "classpnp.h" + +#include "ntddstor.h" +#include "cdrom.h" + +#ifdef ALLOC_PRAGMA + +#pragma alloc_text(INIT, DriverEntry) + +#pragma alloc_text(PAGE, CdRomUnload) +#pragma alloc_text(PAGE, CdRomAddDevice) +#pragma alloc_text(PAGE, CdRomCreateDeviceObject) +#pragma alloc_text(PAGE, CdRomStartDevice) +#pragma alloc_text(PAGE, ScanForSpecial) +#pragma alloc_text(PAGE, ScanForSpecialHandler) +#pragma alloc_text(PAGE, CdRomRemoveDevice) +#pragma alloc_text(PAGE, CdRomGetDeviceType) +#pragma alloc_text(PAGE, CdRomReadWriteVerification) +#pragma alloc_text(PAGE, CdRomGetDeviceParameter) +#pragma alloc_text(PAGE, CdRomSetDeviceParameter) +#pragma alloc_text(PAGE, CdRomPickDvdRegion) +#pragma alloc_text(PAGE, CdRomIsPlayActive) + +#pragma alloc_text(PAGEHITA, HitachiProcessError) +#pragma alloc_text(PAGEHIT2, HitachiProcessErrorGD2000) + +#pragma alloc_text(PAGETOSH, ToshibaProcessErrorCompletion) +#pragma alloc_text(PAGETOSH, ToshibaProcessError) + +#endif + +#define IS_WRITE_REQUEST(irpStack) \ + (irpStack->MajorFunction == IRP_MJ_WRITE) + +#define IS_READ_WRITE_REQUEST(irpStack) \ +((irpStack->MajorFunction == IRP_MJ_READ) || \ + (irpStack->MajorFunction == IRP_MJ_WRITE) || \ + ((irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL) && \ + (irpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_RAW_READ))) + + + + +NTSTATUS +NTAPI +DriverEntry( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath + ) + +/*++ + +Routine Description: + + This routine initializes the cdrom class driver. + +Arguments: + + DriverObject - Pointer to driver object created by system. + + RegistryPath - Pointer to the name of the services node for this driver. + +Return Value: + + The function value is the final status from the initialization operation. + +--*/ + +{ + CLASS_INIT_DATA InitializationData; + PCDROM_DRIVER_EXTENSION driverExtension; + NTSTATUS status; + + PAGED_CODE(); + + WPP_INIT_TRACING(DriverObject, RegistryPath); + + TraceLog((CdromDebugTrace, + "CDROM.SYS DriverObject %p loading\n", DriverObject)); + + status = IoAllocateDriverObjectExtension(DriverObject, + CDROM_DRIVER_EXTENSION_ID, + sizeof(CDROM_DRIVER_EXTENSION), + &driverExtension); + + if (!NT_SUCCESS(status)) { + TraceLog((CdromDebugWarning, + "DriverEntry !! no DriverObjectExtension %x\n", status)); + return status; + } + + // + // always zero the memory, since we are now reloading the driver. + // + + RtlZeroMemory(driverExtension, sizeof(CDROM_DRIVER_EXTENSION)); + + // + // Zero InitData + // + + RtlZeroMemory (&InitializationData, sizeof(CLASS_INIT_DATA)); + + // + // Set sizes + // + + InitializationData.InitializationDataSize = sizeof(CLASS_INIT_DATA); + + InitializationData.FdoData.DeviceExtensionSize = DEVICE_EXTENSION_SIZE; + + InitializationData.FdoData.DeviceType = FILE_DEVICE_CD_ROM; + InitializationData.FdoData.DeviceCharacteristics = + FILE_REMOVABLE_MEDIA | FILE_DEVICE_SECURE_OPEN; + + // + // Set entry points + // + + InitializationData.FdoData.ClassError = CdRomErrorHandler; + InitializationData.FdoData.ClassInitDevice = CdRomInitDevice; + InitializationData.FdoData.ClassStartDevice = CdRomStartDevice; + InitializationData.FdoData.ClassStopDevice = CdRomStopDevice; + InitializationData.FdoData.ClassRemoveDevice = CdRomRemoveDevice; + + InitializationData.FdoData.ClassReadWriteVerification = CdRomReadWriteVerification; + InitializationData.FdoData.ClassDeviceControl = CdRomDeviceControlDispatch; + + InitializationData.FdoData.ClassPowerDevice = ClassSpinDownPowerHandler; + InitializationData.FdoData.ClassShutdownFlush = CdRomShutdownFlush; + InitializationData.FdoData.ClassCreateClose = NULL; + + InitializationData.ClassStartIo = CdRomStartIo; + InitializationData.ClassAddDevice = CdRomAddDevice; + + InitializationData.ClassTick = CdRomTickHandler; + InitializationData.ClassUnload = CdRomUnload; + + // + // Call the class init routine + // + return ClassInitialize( DriverObject, RegistryPath, &InitializationData); + +} // end DriverEntry() + + +VOID +CdRomUnload( + IN PDRIVER_OBJECT DriverObject + ) +{ + PAGED_CODE(); + UNREFERENCED_PARAMETER(DriverObject); + TraceLog((CdromDebugTrace, + "CDROM.SYS DriverObject %p unloading\n", DriverObject)); + WPP_CLEANUP(DriverObject); + return; +} // end CdRomUnload() + + +NTSTATUS +CdRomAddDevice( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PhysicalDeviceObject + ) + +/*++ + +Routine Description: + + This routine creates and initializes a new FDO for the corresponding + PDO. It may perform property queries on the FDO but cannot do any + media access operations. + +Arguments: + + DriverObject - CDROM class driver object. + + Pdo - the physical device object we are being added to + +Return Value: + + status + +--*/ + +{ + NTSTATUS status; + + PAGED_CODE(); + + // + // Get the address of the count of the number of cdroms already initialized. + // + DbgPrint("add device\n"); + + status = CdRomCreateDeviceObject(DriverObject, + PhysicalDeviceObject); + + // + // Note: this always increments driver extension counter + // it will eventually wrap, and fail additions + // if an existing cdrom has the given number. + // so unlikely that we won't even bother considering + // this case, since the cure is quite likely worse + // than the symptoms. + // + + if(NT_SUCCESS(status)) { + + // + // keep track of the total number of active cdroms in IoGet(), + // as some programs use this to determine when they have found + // all the cdroms in the system. + // + + TraceLog((CdromDebugTrace, "CDROM.SYS Add succeeded\n")); + IoGetConfigurationInformation()->CdRomCount++; + + } else { + + TraceLog((CdromDebugWarning, + "CDROM.SYS Add failed! %x\n", status)); + + } + + return status; +} + + +NTSTATUS +CdRomCreateDeviceObject( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PhysicalDeviceObject + ) + +/*++ + +Routine Description: + + This routine creates an object for the device and then calls the + SCSI port driver for media capacity and sector size. + +Arguments: + + DriverObject - Pointer to driver object created by system. + PortDeviceObject - to connect to SCSI port driver. + DeviceCount - Number of previously installed CDROMs. + PortCapabilities - Pointer to structure returned by SCSI port + driver describing adapter capabilites (and limitations). + LunInfo - Pointer to configuration information for this device. + +Return Value: + + NTSTATUS + +--*/ +{ + UCHAR ntNameBuffer[64]; + STRING ntNameString; + NTSTATUS status; + + PDEVICE_OBJECT lowerDevice = NULL; + PDEVICE_OBJECT deviceObject = NULL; + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = NULL; + PCDROM_DATA cdData = NULL; + PCDROM_DRIVER_EXTENSION driverExtension = NULL; + ULONG deviceNumber; + + CCHAR dosNameBuffer[64]; + CCHAR deviceNameBuffer[64]; + STRING deviceNameString; + STRING dosString; + UNICODE_STRING dosUnicodeString; + UNICODE_STRING unicodeString; + + PAGED_CODE(); + + // + // Claim the device. Note that any errors after this + // will goto the generic handler, where the device will + // be released. + // + + lowerDevice = IoGetAttachedDeviceReference(PhysicalDeviceObject); + + status = ClassClaimDevice(lowerDevice, FALSE); + + if(!NT_SUCCESS(status)) { + + // + // Someone already had this device - we're in trouble + // + + ObDereferenceObject(lowerDevice); + return status; + } + + // + // Create device object for this device by first getting a unique name + // for the device and then creating it. + // + + driverExtension = IoGetDriverObjectExtension(DriverObject, + CDROM_DRIVER_EXTENSION_ID); + ASSERT(driverExtension != NULL); + + // + // InterlockedCdRomCounter is biased by 1. + // + + deviceNumber = InterlockedIncrement(&driverExtension->InterlockedCdRomCounter) - 1; + sprintf(ntNameBuffer, "\\Device\\CdRom%d", deviceNumber); + + + status = ClassCreateDeviceObject(DriverObject, + ntNameBuffer, + PhysicalDeviceObject, + TRUE, + &deviceObject); + + if (!NT_SUCCESS(status)) { + TraceLog((CdromDebugWarning, + "CreateCdRomDeviceObjects: Can not create device %s\n", + ntNameBuffer)); + + goto CreateCdRomDeviceObjectExit; + } + + // + // Indicate that IRPs should include MDLs. + // + + SET_FLAG(deviceObject->Flags, DO_DIRECT_IO); + + fdoExtension = deviceObject->DeviceExtension; + + // + // Back pointer to device object. + // + + fdoExtension->CommonExtension.DeviceObject = deviceObject; + + // + // This is the physical device. + // + + fdoExtension->CommonExtension.PartitionZeroExtension = fdoExtension; + + // + // Initialize lock count to zero. The lock count is used to + // disable the ejection mechanism when media is mounted. + // + + fdoExtension->LockCount = 0; + + // + // Save system cdrom number + // + + fdoExtension->DeviceNumber = deviceNumber; + + // + // Set the alignment requirements for the device based on the + // host adapter requirements + // + + if (lowerDevice->AlignmentRequirement > deviceObject->AlignmentRequirement) { + deviceObject->AlignmentRequirement = lowerDevice->AlignmentRequirement; + } + + // + // Save the device descriptors + // + + fdoExtension->AdapterDescriptor = NULL; + + fdoExtension->DeviceDescriptor = NULL; + + // + // Clear the SrbFlags and disable synchronous transfers + // + + fdoExtension->SrbFlags = SRB_FLAGS_DISABLE_SYNCH_TRANSFER; + + // + // Finally, attach to the PDO + // + + fdoExtension->LowerPdo = PhysicalDeviceObject; + + fdoExtension->CommonExtension.LowerDeviceObject = + IoAttachDeviceToDeviceStack(deviceObject, PhysicalDeviceObject); + + if(fdoExtension->CommonExtension.LowerDeviceObject == NULL) { + + // + // Uh - oh, we couldn't attach + // cleanup and return + // + + status = STATUS_UNSUCCESSFUL; + goto CreateCdRomDeviceObjectExit; + } + + // + // CdRom uses an extra stack location for synchronizing it's start io + // routine + // + + deviceObject->StackSize++; + + // + // cdData is used a few times below + // + + cdData = fdoExtension->CommonExtension.DriverData; + + // + // For NTMS to be able to easily determine drives-drv. letter matches. + // + + status = CdRomCreateWellKnownName( deviceObject ); + + if (!NT_SUCCESS(status)) { + TraceLog((CdromDebugWarning, + "CdromCreateDeviceObjects: unable to create symbolic " + "link for device %wZ\n", &fdoExtension->CommonExtension.DeviceName)); + TraceLog((CdromDebugWarning, + "CdromCreateDeviceObjects: (non-fatal error)\n")); + } + + ClassUpdateInformationInRegistry(deviceObject, "CdRom", + fdoExtension->DeviceNumber, NULL, 0); + + // + // from above IoGetAttachedDeviceReference + // + + ObDereferenceObject(lowerDevice); + + // + // need to init timerlist here in case a remove occurs + // without a start, since we check the list is empty on remove. + // + + cdData->DelayedRetryIrp = NULL; + cdData->DelayedRetryInterval = 0; + + // + // need this to be initialized for RPC Phase 1 drives (rpc0) + // + + KeInitializeMutex(&cdData->Rpc0RegionMutex, 0); + + // + // The device is initialized properly - mark it as such. + // + + CLEAR_FLAG(deviceObject->Flags, DO_DEVICE_INITIALIZING); + + return(STATUS_SUCCESS); + +CreateCdRomDeviceObjectExit: + + // + // Release the device since an error occured. + // + + // ClassClaimDevice(PortDeviceObject, + // LunInfo, + // TRUE, + // NULL); + + // + // from above IoGetAttachedDeviceReference + // + + ObDereferenceObject(lowerDevice); + + if (deviceObject != NULL) { + IoDeleteDevice(deviceObject); + } + + return status; + +} // end CreateCdRomDeviceObject() + + +NTSTATUS +CdRomInitDevice( + IN PDEVICE_OBJECT Fdo + ) + +/*++ + +Routine Description: + + This routine will complete the cd-rom initialization. This includes + allocating sense info buffers and srb s-lists, reading drive capacity + and setting up Media Change Notification (autorun). + + This routine will not clean up allocate resources if it fails - that + is left for device stop/removal + +Arguments: + + Fdo - a pointer to the functional device object for this device + +Return Value: + + status + +--*/ + +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + PCLASS_DRIVER_EXTENSION driverExtension = ClassGetDriverExtension( + Fdo->DriverObject); + + PVOID senseData = NULL; + + ULONG timeOut; + PCDROM_DATA cddata; + + BOOLEAN changerDevice; + BOOLEAN isMmcDevice = FALSE; + + ULONG bps; + ULONG lastBit; + + + NTSTATUS status; + + PAGED_CODE(); + + // + // Build the lookaside list for srb's for the physical disk. Should only + // need a couple. + // + + ClassInitializeSrbLookasideList(&(fdoExtension->CommonExtension), + CDROM_SRB_LIST_SIZE); + + // + // Allocate request sense buffer. + // + + senseData = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + SENSE_BUFFER_SIZE, + CDROM_TAG_SENSE_INFO); + + if (senseData == NULL) { + + // + // The buffer cannot be allocated. + // + + status = STATUS_INSUFFICIENT_RESOURCES; + goto CdRomInitDeviceExit; + } + + // + // Set the sense data pointer in the device extension. + // + + fdoExtension->SenseData = senseData; + + // + // CDROMs are not partitionable so starting offset is 0. + // + + commonExtension->StartingOffset.LowPart = 0; + commonExtension->StartingOffset.HighPart = 0; + + // + // Set timeout value in seconds. + // + + timeOut = ClassQueryTimeOutRegistryValue(Fdo); + if (timeOut) { + fdoExtension->TimeOutValue = timeOut; + } else { + fdoExtension->TimeOutValue = SCSI_CDROM_TIMEOUT; + } + + cddata = (PCDROM_DATA)(commonExtension->DriverData); + + // + // Set up media change support defaults. + // + + KeInitializeSpinLock(&cddata->DelayedRetrySpinLock); + + cddata->DelayedRetryIrp = NULL; + cddata->DelayedRetryInterval = 0; + cddata->Mmc.WriteAllowed = FALSE; + + // + // Scan for controllers that require special processing. + // + + ScanForSpecial(Fdo); + + // + // Determine if the drive is MMC-Capable + // + + CdRomIsDeviceMmcDevice(Fdo, &isMmcDevice); + + if (!isMmcDevice) { + + SET_FLAG(Fdo->Characteristics, FILE_READ_ONLY_DEVICE); + + } else { + + // + // the drive supports at least a subset of MMC commands + // (and therefore supports READ_CD, etc...) + // + + cddata->Mmc.IsMmc = TRUE; + + // + // allocate a buffer for all the capabilities and such + // + + status = CdRomAllocateMmcResources(Fdo); + if (!NT_SUCCESS(status)) { + goto CdRomInitDeviceExit; + } + + +#if 0 + // + // determine all the various media types from the profiles feature + // + { + PFEATURE_DATA_PROFILE_LIST profileHeader; + ULONG mediaTypes = 0; + ULONG i; + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugError, + "Checking all profiles for media types supported.\n" + )); + + profileHeader = CdRomFindFeaturePage(cddata->Mmc.CapabilitiesBuffer, + cddata->Mmc.CapabilitiesBufferSize, + FeatureProfileList); + if (profileHeader == NULL) { + + // + // if profiles don't exist, there is something seriously + // wrong with this command -- it's either not a cdrom or + // one that hasn't implemented the spec correctly. exit + // now while we have the chance to do so safely. + // + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugError, + "CdromDevice supports GET_CONFIGURATION, but " + "doesn't provide profiles for PDO %p!\n", + fdoExtension->LowerPdo)); + status = STATUS_DEVICE_CONFIGURATION_ERROR; + goto CdRomInitDeviceExit; + + } + + for (i = 0; i < MAX_CDROM_MEDIA_TYPES; i++) { + + BOOLEAN profileFound; + CdRomFindProfileInProfiles(profileHeader, + MediaProfileMatch[i].Profile, + &profileFound); + if (profileFound) { + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugError, + "CdromInit -> Found Profile %x => Media %x " + "(%x total)\n", + MediaProfileMatch[i].Profile, + MediaProfileMatch[i].Media, + mediaTypes + 1 + )); + + cddata->Mmc.MediaProfileMatches[mediaTypes] = + MediaProfileMatch[i]; + mediaTypes++; + + } + + } + + if (mediaTypes == 0) { + + // + // if profiles don't exist, there is something seriously + // wrong with this command -- it's either not a cdrom or + // one that hasn't implemented the spec correctly. exit + // now while we have the chance to do so safely. + // + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugError, + "CdromDevice supports GET_CONFIGURATION, but " + "doesn't support any of the standard profiles " + "for PDO %p!\n", fdoExtension->LowerPdo)); + status = STATUS_DEVICE_CONFIGURATION_ERROR; + goto CdRomInitDeviceExit; + + } + + cddata->Mmc.MediaTypes = mediaTypes; + + + } +#endif // media checks, and all failure paths due to bad firmware. + + // + // if the drive supports target defect management and sector-addressable + // writes, then we should allow writes to the media. + // + + if (CdRomFindFeaturePage(cddata->Mmc.CapabilitiesBuffer, + cddata->Mmc.CapabilitiesBufferSize, + FeatureDefectManagement) && + CdRomFindFeaturePage(cddata->Mmc.CapabilitiesBuffer, + cddata->Mmc.CapabilitiesBufferSize, + FeatureRandomWritable)) { + + // + // the drive is target defect managed, and supports random writes + // on sector-aligment. allow writes to occur by setting the error + // handler to point to a private media change detection handler. + // + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "Found a WRITE capable device: %p\n", Fdo)); + + // + // the write specific pages have been found -- + // set the error handler and set it to require an update! + // + + cddata->Mmc.UpdateState = CdromMmcUpdateRequired; + cddata->ErrorHandler = CdRomMmcErrorHandler; + + } + + // + // ISSUE-2000/4/4-henrygab - mmc-compliant compliant drives should + // be initialized based upon reported + // capabilities, such as CSS, Analogue Audio, + // READ_CD capabilities, and (possibly) even + // drive capacity information. + // + + TraceLog((CdromDebugWarning, + "Defaulting to READ_CD because device %p is MMC compliant\n", + Fdo)); + SET_FLAG(fdoExtension->DeviceFlags, DEV_SAFE_START_UNIT); + SET_FLAG(cddata->XAFlags, XA_USE_READ_CD); + + } + + + // + // Set the default geometry for the cdrom to match what NT 4 used. + // Classpnp will use these values to compute the cylinder count rather + // than using it's NT 5.0 defaults. + // + + fdoExtension->DiskGeometry.TracksPerCylinder = 0x40; + fdoExtension->DiskGeometry.SectorsPerTrack = 0x20; + + // + // Do READ CAPACITY. This SCSI command returns the last sector address + // on the device and the bytes per sector. These are used to calculate + // the drive capacity in bytes. + // + // NOTE: This should be change to send the Srb synchronously, then + // call CdRomInterpretReadCapacity() to properly setup the defaults. + // + + status = ClassReadDriveCapacity(Fdo); + + bps = fdoExtension->DiskGeometry.BytesPerSector; + + if (!NT_SUCCESS(status) || !bps) { + + TraceLog((CdromDebugWarning, + "CdRomStartDevice: Can't read capacity for device %wZ\n", + &(fdoExtension->CommonExtension.DeviceName))); + + // + // Set disk geometry to default values (per ISO 9660). + // + + bps = 2048; + fdoExtension->SectorShift = 11; + commonExtension->PartitionLength.QuadPart = (LONGLONG)(0x7fffffff); + + } else { + + // + // Insure that bytes per sector is a power of 2 + // This corrects a problem with the HP 4020i CDR where it + // returns an incorrect number for bytes per sector. + // + + lastBit = (ULONG) -1; + while (bps) { + lastBit++; + bps = bps >> 1; + } + + bps = 1 << lastBit; + } + fdoExtension->DiskGeometry.BytesPerSector = bps; + TraceLog((CdromDebugTrace, "CdRomInitDevice: Calc'd bps = %x\n", bps)); + + + ClassInitializeMediaChangeDetection(fdoExtension, "CdRom"); + + + // + // test for audio read capabilities + // + + TraceLog((CdromDebugWarning, + "Detecting XA_READ capabilities\n")); + + if (CdRomGetDeviceType(Fdo) == FILE_DEVICE_DVD) { + + TraceLog((CdromDebugWarning, + "CdRomInitDevice: DVD Devices require START_UNIT\n")); + + + // + // all DVD devices must support the READ_CD command + // + + TraceLog((CdromDebugWarning, + "CdRomDetermineRawReadCapabilities: DVD devices " + "support READ_CD command for FDO %p\n", Fdo)); + SET_FLAG(fdoExtension->DeviceFlags, DEV_SAFE_START_UNIT); + SET_FLAG(cddata->XAFlags, XA_USE_READ_CD); + + + status = STATUS_SUCCESS; + + } else if ((fdoExtension->DeviceDescriptor->BusType != BusTypeScsi) && + (fdoExtension->DeviceDescriptor->BusType != BusTypeAta) && + (fdoExtension->DeviceDescriptor->BusType != BusTypeAtapi) && + (fdoExtension->DeviceDescriptor->BusType != BusTypeUnknown) + ) { + + // + // devices on the newer busses must support READ_CD command + // + + TraceLog((CdromDebugWarning, + "CdRomDetermineRawReadCapabilities: Devices for newer " + "busses must support READ_CD command for FDO %p, Bus %x\n", + Fdo, fdoExtension->DeviceDescriptor->BusType)); + SET_FLAG(fdoExtension->DeviceFlags, DEV_SAFE_START_UNIT); + SET_FLAG(cddata->XAFlags, XA_USE_READ_CD); + + } + + // + // now clear all our READ_CD flags if the drive should have supported + // it, but we are not sure it actually does. we still won't query + // the drive more than one time if it supports the command. + // + + if (TEST_FLAG(cddata->HackFlags, CDROM_HACK_FORCE_READ_CD_DETECTION)) { + + TraceLog((CdromDebugWarning, + "Forcing detection of READ_CD for FDO %p because " + "testing showed some firmware did not properly support it\n", + Fdo)); + CLEAR_FLAG(cddata->XAFlags, XA_USE_READ_CD); + + } + + + // + // read our READ_CD support in the registry if it was seeded. + // + { + ULONG readCdSupported = 0; + + ClassGetDeviceParameter(fdoExtension, + CDROM_SUBKEY_NAME, + CDROM_READ_CD_NAME, + &readCdSupported + ); + + if (readCdSupported != 0) { + + TraceLog((CdromDebugWarning, + "Defaulting to READ_CD because previously detected " + "that the device supports it for Fdo %p.\n", + Fdo + )); + SET_FLAG(cddata->XAFlags, XA_USE_READ_CD); + + } + + } + + + // + // backwards-compatible hackish attempt to determine if the drive + // supports any method of reading digital audio from the disc. + // + + if (!TEST_FLAG(cddata->XAFlags, XA_USE_READ_CD)) { + + SCSI_REQUEST_BLOCK srb; + PCDB cdb; + ULONG length; + PUCHAR buffer = NULL; + ULONG count; + + // + // ISSUE-2000/07/05-henrygab - use the mode page to determine + // READ_CD support, then fall back on the below + // (unreliable?) hack. + // + + // + // Build the MODE SENSE CDB. The data returned will be kept in the + // device extension and used to set block size. + // + + length = max(sizeof(ERROR_RECOVERY_DATA),sizeof(ERROR_RECOVERY_DATA10)); + + buffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + length, + CDROM_TAG_MODE_DATA); + + if (!buffer) { + TraceLog((CdromDebugWarning, + "CdRomDetermineRawReadCapabilities: cannot allocate " + "buffer, so leaving for FDO %p\n", Fdo)); + status = STATUS_INSUFFICIENT_RESOURCES; + goto CdRomInitDeviceExit; + } + + for (count = 0; count < 2; count++) { + + if (count == 0) { + length = sizeof(ERROR_RECOVERY_DATA); + } else { + length = sizeof(ERROR_RECOVERY_DATA10); + } + + RtlZeroMemory(buffer, length); + RtlZeroMemory(&srb, sizeof(SCSI_REQUEST_BLOCK)); + cdb = (PCDB)srb.Cdb; + + srb.TimeOutValue = fdoExtension->TimeOutValue; + + if (count == 0) { + srb.CdbLength = 6; + cdb->MODE_SENSE.OperationCode = SCSIOP_MODE_SENSE; + cdb->MODE_SENSE.PageCode = 0x1; + // note: not setting DBD in order to get the block descriptor! + cdb->MODE_SENSE.AllocationLength = (UCHAR)length; + } else { + srb.CdbLength = 10; + cdb->MODE_SENSE10.OperationCode = SCSIOP_MODE_SENSE10; + cdb->MODE_SENSE10.PageCode = 0x1; + // note: not setting DBD in order to get the block descriptor! + cdb->MODE_SENSE10.AllocationLength[0] = (UCHAR)(length >> 8); + cdb->MODE_SENSE10.AllocationLength[1] = (UCHAR)(length & 0xFF); + } + + status = ClassSendSrbSynchronous(Fdo, + &srb, + buffer, + length, + FALSE); + + + if (NT_SUCCESS(status) || (status == STATUS_DATA_OVERRUN)) { + + // + // STATUS_DATA_OVERRUN means it's a newer drive with more info + // to tell us, so it's probably able to support READ_CD + // + + RtlZeroMemory(cdb, CDB12GENERIC_LENGTH); + + srb.CdbLength = 12; + cdb->READ_CD.OperationCode = SCSIOP_READ_CD; + + status = ClassSendSrbSynchronous(Fdo, + &srb, + NULL, + 0, + FALSE); + + if (NT_SUCCESS(status) || + (status == STATUS_NO_MEDIA_IN_DEVICE) || + (status == STATUS_NONEXISTENT_SECTOR) || + (status == STATUS_UNRECOGNIZED_MEDIA) + ) { + + // + // READ_CD works + // + + TraceLog((CdromDebugWarning, + "CdRomDetermineRawReadCapabilities: Using " + "READ_CD for FDO %p due to status %x\n", + Fdo, + status)); + SET_FLAG(cddata->XAFlags, XA_USE_READ_CD); + + // + // ignore errors in saving this info + // + + ClassSetDeviceParameter(fdoExtension, + CDROM_SUBKEY_NAME, + CDROM_READ_CD_NAME, + 1 + ); + + + break; // out of the for loop + + } + + TraceLog((CdromDebugWarning, + "CdRomDetermineRawReadCapabilities: Using " + "%s-byte mode switching for FDO %p due to status " + "%x returned for READ_CD\n", + ((count == 0) ? "6" : "10"), Fdo, status)); + + if (count == 0) { + SET_FLAG(cddata->XAFlags, XA_USE_6_BYTE); + RtlCopyMemory(&cddata->Header, + buffer, + sizeof(ERROR_RECOVERY_DATA)); + cddata->Header.ModeDataLength = 0; + } else { + SET_FLAG(cddata->XAFlags, XA_USE_10_BYTE); + RtlCopyMemory(&cddata->Header10, + buffer, + sizeof(ERROR_RECOVERY_DATA10)); + cddata->Header10.ModeDataLength[0] = 0; + cddata->Header10.ModeDataLength[1] = 0; + } + break; // out of for loop + + } + TraceLog((CdromDebugWarning, + "FDO %p failed %x byte mode sense, status %x\n", + Fdo, + ((count == 0) ? 6 : 10), + status + )); + + // + // mode sense failed + // + + } // end of for loop to try 6 and 10-byte mode sense + + if (count == 2) { + + // + // nothing worked. we probably cannot support digital + // audio extraction from this drive + // + + TraceLog((CdromDebugWarning, + "CdRomDetermineRawReadCapabilities: FDO %p " + "cannot support READ_CD\n", Fdo)); + CLEAR_FLAG(cddata->XAFlags, XA_PLEXTOR_CDDA); + CLEAR_FLAG(cddata->XAFlags, XA_NEC_CDDA); + SET_FLAG(cddata->XAFlags, XA_NOT_SUPPORTED); + + } // end of count == 2 + + // + // free our resources + // + + ExFreePool(buffer); + + // + // set a successful status + // (in case someone later checks this) + // + + status = STATUS_SUCCESS; + + } + + // + // Register interfaces for this device. + // + + { + UNICODE_STRING interfaceName; + + RtlInitUnicodeString(&interfaceName, NULL); + + status = IoRegisterDeviceInterface(fdoExtension->LowerPdo, + (LPGUID) &CdRomClassGuid, + NULL, + &interfaceName); + + if(NT_SUCCESS(status)) { + + cddata->CdromInterfaceString = interfaceName; + + status = IoSetDeviceInterfaceState( + &interfaceName, + TRUE); + + if(!NT_SUCCESS(status)) { + + TraceLog((CdromDebugWarning, + "CdromInitDevice: Unable to register cdrom " + "DCA for fdo %p [%lx]\n", + Fdo, status)); + } + } + } + + return(STATUS_SUCCESS); + +CdRomInitDeviceExit: + + CdRomDeAllocateMmcResources(Fdo); + RtlZeroMemory(&(cddata->Mmc), sizeof(CDROM_MMC_EXTENSION)); + + return status; + +} + + +NTSTATUS +CdRomStartDevice( + IN PDEVICE_OBJECT Fdo + ) +/*++ + +Routine Description: + + This routine starts the timer for the cdrom + +Arguments: + + Fdo - a pointer to the functional device object for this device + +Return Value: + + status + +--*/ + +{ + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + PCDROM_DATA cddata = (PCDROM_DATA)(commonExtension->DriverData); + PDVD_COPY_PROTECT_KEY copyProtectKey; + PDVD_RPC_KEY rpcKey; + IO_STATUS_BLOCK ioStatus; + ULONG bufferLen; + + // CdRomCreateWellKnownName(Fdo); + + // + // if we have a DVD-ROM + // if we have a rpc0 device + // fake a rpc2 device + // if device does not have a dvd region set + // select a dvd region for the user + // + + cddata->DvdRpc0Device = FALSE; + + // + // since StartIo() will call IoStartNextPacket() on error, allowing + // StartIo() to be non-recursive prevents stack overflow bugchecks in + // severe error cases (such as fault-injection in the verifier). + // + // the only difference is that the thread context may be different + // in StartIo() than in the caller of IoStartNextPacket(). + // + + IoSetStartIoAttributes(Fdo, TRUE, TRUE); + + // + // check to see if we have a DVD device + // + + if (CdRomGetDeviceType(Fdo) != FILE_DEVICE_DVD) { + return STATUS_SUCCESS; + } + + // + // we got a DVD drive. + // now, figure out if we have a RPC0 device + // + + bufferLen = DVD_RPC_KEY_LENGTH; + copyProtectKey = + (PDVD_COPY_PROTECT_KEY)ExAllocatePoolWithTag(PagedPool, + bufferLen, + DVD_TAG_RPC2_CHECK); + + if (copyProtectKey == NULL) { + return STATUS_INSUFFICIENT_RESOURCES; + } + + // + // get the device region + // + RtlZeroMemory (copyProtectKey, bufferLen); + copyProtectKey->KeyLength = DVD_RPC_KEY_LENGTH; + copyProtectKey->KeyType = DvdGetRpcKey; + + // + // Build a request for READ_KEY + // + ClassSendDeviceIoControlSynchronous( + IOCTL_DVD_READ_KEY, + Fdo, + copyProtectKey, + DVD_RPC_KEY_LENGTH, + DVD_RPC_KEY_LENGTH, + FALSE, + &ioStatus + ); + + if (!NT_SUCCESS(ioStatus.Status)) { + + // + // we have a rpc0 device + // + // NOTE: THIS MODIFIES THE BEHAVIOR OF THE IOCTL + // + + cddata->DvdRpc0Device = TRUE; + + TraceLog((CdromDebugWarning, + "CdromStartDevice (%p): RPC Phase 1 drive detected\n", + Fdo)); + + // + // note: we could force this chosen now, but it's better to reduce + // the number of code paths that could be taken. always delay to + // increase the percentage code coverage. + // + + TraceLog((CdromDebugWarning, + "CdromStartDevice (%p): Delay DVD Region Selection\n", + Fdo)); + + cddata->Rpc0SystemRegion = 0xff; + cddata->Rpc0SystemRegionResetCount = DVD_MAX_REGION_RESET_COUNT; + cddata->PickDvdRegion = 1; + cddata->Rpc0RetryRegistryCallback = 1; + ExFreePool(copyProtectKey); + return STATUS_SUCCESS; + + } else { + + rpcKey = (PDVD_RPC_KEY) copyProtectKey->KeyData; + + // + // TypeCode of zero means that no region has been set. + // + + if (rpcKey->TypeCode == 0) { + TraceLog((CdromDebugWarning, + "CdromStartDevice (%p): must choose DVD region\n", + Fdo)); + cddata->PickDvdRegion = 1; + CdRomPickDvdRegion(Fdo); + } + } + + ExFreePool (copyProtectKey); + + return STATUS_SUCCESS; +} + + +NTSTATUS +CdRomStopDevice( + IN PDEVICE_OBJECT DeviceObject, + IN UCHAR Type + ) +{ + return STATUS_SUCCESS; +} + + +VOID +CdRomStartIo( + IN PDEVICE_OBJECT Fdo, + IN PIRP Irp + ) +{ + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + + PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(Irp); + PIO_STACK_LOCATION nextIrpStack = IoGetNextIrpStackLocation(Irp); + PIO_STACK_LOCATION irpStack; + + PIRP irp2 = NULL; + + ULONG transferPages; + ULONG transferByteCount = currentIrpStack->Parameters.Read.Length; + LARGE_INTEGER startingOffset = currentIrpStack->Parameters.Read.ByteOffset; + PCDROM_DATA cdData; + PSCSI_REQUEST_BLOCK srb = NULL; + PCDB cdb; + PUCHAR senseBuffer = NULL; + PVOID dataBuffer; + NTSTATUS status; + BOOLEAN use6Byte; + + // + // Mark IRP with status pending. + // + + IoMarkIrpPending(Irp); + + cdData = (PCDROM_DATA)(fdoExtension->CommonExtension.DriverData); + use6Byte = TEST_FLAG(cdData->XAFlags, XA_USE_6_BYTE); + + // + // if this test is true, then we will exit the routine within this + // code block, queueing the irp for later completion. + // + + if ((cdData->Mmc.IsMmc) && + (cdData->Mmc.UpdateState != CdromMmcUpdateComplete) + ) { + + USHORT queueDepth; + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdRomStartIo: [%p] Device needs to update capabilities\n", + Irp)); + ASSERT(cdData->Mmc.IsMmc); + ASSERT(cdData->Mmc.CapabilitiesIrp != NULL); + ASSERT(cdData->Mmc.CapabilitiesIrp != Irp); + + // + // NOTE - REF #0002 + // + // the state was either UpdateRequired (which means we will + // have to start the work item) or UpdateStarted (which means + // we have already started the work item at least once -- may + // transparently change to UpdateComplete). + // + // if it's update required, we just queue it, change to UpdateStarted, + // start the workitem, and start the next packet. + // + // else, we must queue the item and check the queue depth. if the + // queue depth is equal to 1, that means the worker item from the + // previous attempt has already de-queued the items, so we should + // call this routine again (retry) as an optimization rather than + // re-add it this irp to the queue. since this is tail recursion, + // it won't take much/any stack to do this. + // + // NOTE: This presumes the following items are true: + // + // we only add to the list from CdRomStartIo(), which is serialized. + // we only set to UpdateStarted from CdRomStartIo(), and only if + // the state was UpdateRequired. + // we only set to UpdateRequired from CdRomMmcErrorHandler(), and + // only if the state was UpdateComplete. + // we only set to UpdateComplete from the workitem, and assert the + // state was UpdateStarted. + // we flush the entire queue in one atomic operation in the workitem, + // except in the special case described above when we dequeue + // the request immediately. + // + // order of operations is vitally important: queue, then test the depth + // this will prevent lost irps. + // + + ExInterlockedPushEntrySList(&(cdData->Mmc.DelayedIrps), + (PSINGLE_LIST_ENTRY)&(Irp->Tail.Overlay.DriverContext[0]), + &(cdData->Mmc.DelayedLock)); + + queueDepth = ExQueryDepthSList(&(cdData->Mmc.DelayedIrps)); + if (queueDepth == 1) { + + if (cdData->Mmc.UpdateState == CdromMmcUpdateRequired) { + LONG oldState; + + // + // should free any old partition list info that + // we've previously saved away and then start the WorkItem + // + + oldState = InterlockedExchange(&cdData->Mmc.UpdateState, + CdromMmcUpdateStarted); + ASSERT(oldState == CdromMmcUpdateRequired); + + IoQueueWorkItem(cdData->Mmc.CapabilitiesWorkItem, + CdRomUpdateMmcDriveCapabilities, + DelayedWorkQueue, + NULL); + + } else { + + // + // they *just* finished updating, so we should flush the list + // back onto the StartIo queue and start the next packet. + // + + CdRompFlushDelayedList(Fdo, &(cdData->Mmc), STATUS_SUCCESS, FALSE); + + } + + } + + // + // start the next packet so we don't deadlock.... + // + + IoStartNextPacket(Fdo, FALSE); + return; + + } + + // + // If the flag is set in the device object + // force a verify for READ, WRITE and RAW_READ requests + // Note that ioctls are passed through.... + // + + if (TEST_FLAG(Fdo->Flags, DO_VERIFY_VOLUME) && + IS_READ_WRITE_REQUEST(currentIrpStack)) { + + TraceLog((CdromDebugTrace, + "CdRomStartIo: [%p] Volume needs verified\n", Irp)); + + if (!(currentIrpStack->Flags & SL_OVERRIDE_VERIFY_VOLUME)) { + + if (Irp->Tail.Overlay.Thread) { + IoSetHardErrorOrVerifyDevice(Irp, Fdo); + } + + Irp->IoStatus.Status = STATUS_VERIFY_REQUIRED; + + TraceLog((CdromDebugTrace, + "CdRomStartIo: [%p] Calling UpdateCapcity - " + "ioctl event = %p\n", + Irp, + nextIrpStack->Parameters.Others.Argument1 + )); + + // + // our device control dispatch routine stores an event in the next + // stack location to signal when startio has completed. We need to + // pass this in so that the update capacity completion routine can + // set it rather than completing the Irp. + // + + status = CdRomUpdateCapacity(fdoExtension, + Irp, + nextIrpStack->Parameters.Others.Argument1 + ); + + TraceLog((CdromDebugTrace, + "CdRomStartIo: [%p] UpdateCapacity returned %lx\n", + Irp, status)); + return; + } + } + + // + // fail writes if they are not allowed... + // + + if ((currentIrpStack->MajorFunction == IRP_MJ_WRITE) && + !(cdData->Mmc.WriteAllowed)) { + + TraceLog((CdromDebugError, + "CdRomStartIo: [%p] Device %p failing write request\n", + Irp, Fdo)); + + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + if (currentIrpStack->MajorFunction == IRP_MJ_READ || + currentIrpStack->MajorFunction == IRP_MJ_WRITE ) { + + ULONG maximumTransferLength = fdoExtension->AdapterDescriptor->MaximumTransferLength; + + // + // Add partition byte offset to make starting byte relative to + // beginning of disk. + // + + currentIrpStack->Parameters.Read.ByteOffset.QuadPart += + (fdoExtension->CommonExtension.StartingOffset.QuadPart); + + // + // Calculate number of pages in this transfer. + // + + transferPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(Irp->MdlAddress), + currentIrpStack->Parameters.Read.Length); + + // + // Check if request length is greater than the maximum number of + // bytes that the hardware can transfer. + // + + if (cdData->RawAccess) { + + // + // a writable device must be MMC compliant, which supports + // READ_CD commands. + // + + ASSERT(currentIrpStack->MajorFunction != IRP_MJ_WRITE); + + ASSERT(!TEST_FLAG(cdData->XAFlags, XA_USE_READ_CD)); + + // + // Fire off a mode select to switch back to cooked sectors. + // + + irp2 = IoAllocateIrp((CCHAR)(Fdo->StackSize+1), FALSE); + + if (!irp2) { + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + srb = ExAllocatePoolWithTag(NonPagedPool, + sizeof(SCSI_REQUEST_BLOCK), + CDROM_TAG_SRB); + if (!srb) { + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + RtlZeroMemory(srb, sizeof(SCSI_REQUEST_BLOCK)); + + cdb = (PCDB)srb->Cdb; + + // + // Allocate sense buffer. + // + + senseBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + SENSE_BUFFER_SIZE, + CDROM_TAG_SENSE_INFO); + + if (!senseBuffer) { + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + // + // Set up the irp. + // + + IoSetNextIrpStackLocation(irp2); + irp2->IoStatus.Status = STATUS_SUCCESS; + irp2->IoStatus.Information = 0; + irp2->Flags = 0; + irp2->UserBuffer = NULL; + + // + // Save the device object and irp in a private stack location. + // + + irpStack = IoGetCurrentIrpStackLocation(irp2); + irpStack->DeviceObject = Fdo; + irpStack->Parameters.Others.Argument2 = (PVOID) Irp; + + // + // The retry count will be in the real Irp, as the retry logic will + // recreate our private irp. + // + + if (!(nextIrpStack->Parameters.Others.Argument1)) { + + // + // Only jam this in if it doesn't exist. The completion routines can + // call StartIo directly in the case of retries and resetting it will + // cause infinite loops. + // + + nextIrpStack->Parameters.Others.Argument1 = (PVOID) MAXIMUM_RETRIES; + } + + // + // Construct the IRP stack for the lower level driver. + // + + irpStack = IoGetNextIrpStackLocation(irp2); + irpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + irpStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_SCSI_EXECUTE_IN; + irpStack->Parameters.Scsi.Srb = srb; + + srb->Length = SCSI_REQUEST_BLOCK_SIZE; + srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + srb->SrbStatus = srb->ScsiStatus = 0; + srb->NextSrb = 0; + srb->OriginalRequest = irp2; + srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; + srb->SenseInfoBuffer = senseBuffer; + + transferByteCount = (use6Byte) ? sizeof(ERROR_RECOVERY_DATA) : sizeof(ERROR_RECOVERY_DATA10); + + dataBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + transferByteCount, + CDROM_TAG_RAW); + + if (!dataBuffer) { + ExFreePool(senseBuffer); + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + + } + + irp2->MdlAddress = IoAllocateMdl(dataBuffer, + transferByteCount, + FALSE, + FALSE, + (PIRP) NULL); + + if (!irp2->MdlAddress) { + ExFreePool(senseBuffer); + ExFreePool(srb); + ExFreePool(dataBuffer); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + // + // Prepare the MDL + // + + MmBuildMdlForNonPagedPool(irp2->MdlAddress); + + srb->DataBuffer = dataBuffer; + + // + // Set the new block size in the descriptor. + // + + if (use6Byte) { + cdData->BlockDescriptor.BlockLength[0] = (UCHAR)(COOKED_SECTOR_SIZE >> 16) & 0xFF; + cdData->BlockDescriptor.BlockLength[1] = (UCHAR)(COOKED_SECTOR_SIZE >> 8) & 0xFF; + cdData->BlockDescriptor.BlockLength[2] = (UCHAR)(COOKED_SECTOR_SIZE & 0xFF); + } else { + cdData->BlockDescriptor10.BlockLength[0] = (UCHAR)(COOKED_SECTOR_SIZE >> 16) & 0xFF; + cdData->BlockDescriptor10.BlockLength[1] = (UCHAR)(COOKED_SECTOR_SIZE >> 8) & 0xFF; + cdData->BlockDescriptor10.BlockLength[2] = (UCHAR)(COOKED_SECTOR_SIZE & 0xFF); + } + + // + // Move error page into dataBuffer. + // + + RtlCopyMemory(srb->DataBuffer, &cdData->Header, transferByteCount); + + // + // Build and send a mode select to switch into raw mode. + // + + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_OUT); + srb->DataTransferLength = transferByteCount; + srb->TimeOutValue = fdoExtension->TimeOutValue * 2; + + if (use6Byte) { + srb->CdbLength = 6; + cdb->MODE_SELECT.OperationCode = SCSIOP_MODE_SELECT; + cdb->MODE_SELECT.PFBit = 1; + cdb->MODE_SELECT.ParameterListLength = (UCHAR)transferByteCount; + } else { + srb->CdbLength = 10; + cdb->MODE_SELECT10.OperationCode = SCSIOP_MODE_SELECT10; + cdb->MODE_SELECT10.PFBit = 1; + cdb->MODE_SELECT10.ParameterListLength[0] = (UCHAR)(transferByteCount >> 8); + cdb->MODE_SELECT10.ParameterListLength[1] = (UCHAR)(transferByteCount & 0xFF); + } + + // + // Update completion routine. + // + + IoSetCompletionRoutine(irp2, + CdRomSwitchModeCompletion, + srb, + TRUE, + TRUE, + TRUE); + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + } + + + // + // Request needs to be split. Completion of each portion of the + // request will fire off the next portion. The final request will + // signal Io to send a new request. + // + + transferPages = + fdoExtension->AdapterDescriptor->MaximumPhysicalPages - 1; + + if(maximumTransferLength > (transferPages << PAGE_SHIFT)) { + maximumTransferLength = transferPages << PAGE_SHIFT; + } + + // + // Check that the maximum transfer size is not zero + // + + if(maximumTransferLength == 0) { + maximumTransferLength = PAGE_SIZE; + } + + ClassSplitRequest(Fdo, Irp, maximumTransferLength); + return; + + } else if (currentIrpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL) { + + // + // Allocate an irp, srb and associated structures. + // + + irp2 = IoAllocateIrp((CCHAR)(Fdo->StackSize+1), + FALSE); + + if (!irp2) { + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + srb = ExAllocatePoolWithTag(NonPagedPool, + sizeof(SCSI_REQUEST_BLOCK), + CDROM_TAG_SRB); + if (!srb) { + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + RtlZeroMemory(srb, sizeof(SCSI_REQUEST_BLOCK)); + + cdb = (PCDB)srb->Cdb; + + // + // Allocate sense buffer. + // + + senseBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + SENSE_BUFFER_SIZE, + CDROM_TAG_SENSE_INFO); + + if (!senseBuffer) { + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + RtlZeroMemory(senseBuffer, SENSE_BUFFER_SIZE); + + // + // Set up the irp. + // + + IoSetNextIrpStackLocation(irp2); + irp2->IoStatus.Status = STATUS_SUCCESS; + irp2->IoStatus.Information = 0; + irp2->Flags = 0; + irp2->UserBuffer = NULL; + + // + // Save the device object and irp in a private stack location. + // + + irpStack = IoGetCurrentIrpStackLocation(irp2); + irpStack->DeviceObject = Fdo; + irpStack->Parameters.Others.Argument2 = (PVOID) Irp; + + // + // The retry count will be in the real Irp, as the retry logic will + // recreate our private irp. + // + + if (!(nextIrpStack->Parameters.Others.Argument1)) { + + // + // Only jam this in if it doesn't exist. The completion routines can + // call StartIo directly in the case of retries and resetting it will + // cause infinite loops. + // + + nextIrpStack->Parameters.Others.Argument1 = (PVOID) MAXIMUM_RETRIES; + } + + // + // keep track of the new irp as Argument3 + // + + nextIrpStack->Parameters.Others.Argument3 = irp2; + + + // + // Construct the IRP stack for the lower level driver. + // + + irpStack = IoGetNextIrpStackLocation(irp2); + irpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + irpStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_SCSI_EXECUTE_IN; + irpStack->Parameters.Scsi.Srb = srb; + + IoSetCompletionRoutine(irp2, + CdRomDeviceControlCompletion, + srb, + TRUE, + TRUE, + TRUE); + // + // Setup those fields that are generic to all requests. + // + + srb->Length = SCSI_REQUEST_BLOCK_SIZE; + srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + srb->SrbStatus = srb->ScsiStatus = 0; + srb->NextSrb = 0; + srb->OriginalRequest = irp2; + srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; + srb->SenseInfoBuffer = senseBuffer; + + switch (currentIrpStack->Parameters.DeviceIoControl.IoControlCode) { + + + case IOCTL_CDROM_RAW_READ: { + + // + // Determine whether the drive is currently in raw or cooked mode, + // and which command to use to read the data. + // + + if (!TEST_FLAG(cdData->XAFlags, XA_USE_READ_CD)) { + + PRAW_READ_INFO rawReadInfo = + (PRAW_READ_INFO)currentIrpStack->Parameters.DeviceIoControl.Type3InputBuffer; + ULONG maximumTransferLength; + ULONG transferPages; + + if (cdData->RawAccess) { + + ULONG startingSector; + UCHAR min, sec, frame; + + // + // Free the recently allocated irp, as we don't need it. + // + + IoFreeIrp(irp2); + + cdb = (PCDB)srb->Cdb; + RtlZeroMemory(cdb, CDB12GENERIC_LENGTH); + + // + // Calculate starting offset. + // + + startingSector = (ULONG)(rawReadInfo->DiskOffset.QuadPart >> fdoExtension->SectorShift); + transferByteCount = rawReadInfo->SectorCount * RAW_SECTOR_SIZE; + maximumTransferLength = fdoExtension->AdapterDescriptor->MaximumTransferLength; + transferPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(Irp->MdlAddress), + transferByteCount); + + // + // Determine if request is within limits imposed by miniport. + // + if (transferByteCount > maximumTransferLength || + transferPages > fdoExtension->AdapterDescriptor->MaximumPhysicalPages) { + + // + // The claim is that this won't happen, and is backed up by + // ActiveMovie usage, which does unbuffered XA reads of 0x18000, yet + // we get only 4 sector requests. + // + + ExFreePool(senseBuffer); + ExFreePool(srb); + + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + + } + + srb->OriginalRequest = Irp; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + srb->DataTransferLength = transferByteCount; + srb->TimeOutValue = fdoExtension->TimeOutValue; + srb->CdbLength = 10; + srb->DataBuffer = MmGetMdlVirtualAddress(Irp->MdlAddress); + + if (rawReadInfo->TrackMode == CDDA) { + if (TEST_FLAG(cdData->XAFlags, XA_PLEXTOR_CDDA)) { + + srb->CdbLength = 12; + + cdb->PLXTR_READ_CDDA.LogicalBlockByte3 = (UCHAR) (startingSector & 0xFF); + cdb->PLXTR_READ_CDDA.LogicalBlockByte2 = (UCHAR) ((startingSector >> 8) & 0xFF); + cdb->PLXTR_READ_CDDA.LogicalBlockByte1 = (UCHAR) ((startingSector >> 16) & 0xFF); + cdb->PLXTR_READ_CDDA.LogicalBlockByte0 = (UCHAR) ((startingSector >> 24) & 0xFF); + + cdb->PLXTR_READ_CDDA.TransferBlockByte3 = (UCHAR) (rawReadInfo->SectorCount & 0xFF); + cdb->PLXTR_READ_CDDA.TransferBlockByte2 = (UCHAR) (rawReadInfo->SectorCount >> 8); + cdb->PLXTR_READ_CDDA.TransferBlockByte1 = 0; + cdb->PLXTR_READ_CDDA.TransferBlockByte0 = 0; + + cdb->PLXTR_READ_CDDA.SubCode = 0; + cdb->PLXTR_READ_CDDA.OperationCode = 0xD8; + + } else if (TEST_FLAG(cdData->XAFlags, XA_NEC_CDDA)) { + + cdb->NEC_READ_CDDA.LogicalBlockByte3 = (UCHAR) (startingSector & 0xFF); + cdb->NEC_READ_CDDA.LogicalBlockByte2 = (UCHAR) ((startingSector >> 8) & 0xFF); + cdb->NEC_READ_CDDA.LogicalBlockByte1 = (UCHAR) ((startingSector >> 16) & 0xFF); + cdb->NEC_READ_CDDA.LogicalBlockByte0 = (UCHAR) ((startingSector >> 24) & 0xFF); + + cdb->NEC_READ_CDDA.TransferBlockByte1 = (UCHAR) (rawReadInfo->SectorCount & 0xFF); + cdb->NEC_READ_CDDA.TransferBlockByte0 = (UCHAR) (rawReadInfo->SectorCount >> 8); + + cdb->NEC_READ_CDDA.OperationCode = 0xD4; + } + } else { + + cdb->CDB10.TransferBlocksMsb = (UCHAR) (rawReadInfo->SectorCount >> 8); + cdb->CDB10.TransferBlocksLsb = (UCHAR) (rawReadInfo->SectorCount & 0xFF); + + cdb->CDB10.LogicalBlockByte3 = (UCHAR) (startingSector & 0xFF); + cdb->CDB10.LogicalBlockByte2 = (UCHAR) ((startingSector >> 8) & 0xFF); + cdb->CDB10.LogicalBlockByte1 = (UCHAR) ((startingSector >> 16) & 0xFF); + cdb->CDB10.LogicalBlockByte0 = (UCHAR) ((startingSector >> 24) & 0xFF); + + cdb->CDB10.OperationCode = SCSIOP_READ; + } + + srb->SrbStatus = srb->ScsiStatus = 0; + + nextIrpStack->MajorFunction = IRP_MJ_SCSI; + nextIrpStack->Parameters.Scsi.Srb = srb; + + // HACKHACK - REF #0001 + + // + // Set up IoCompletion routine address. + // + + IoSetCompletionRoutine(Irp, + CdRomXACompletion, + srb, + TRUE, + TRUE, + TRUE); + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, Irp); + return; + + } else { + + transferByteCount = (use6Byte) ? sizeof(ERROR_RECOVERY_DATA) : sizeof(ERROR_RECOVERY_DATA10); + dataBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + transferByteCount, + CDROM_TAG_RAW ); + if (!dataBuffer) { + ExFreePool(senseBuffer); + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + + } + + irp2->MdlAddress = IoAllocateMdl(dataBuffer, + transferByteCount, + FALSE, + FALSE, + (PIRP) NULL); + + if (!irp2->MdlAddress) { + ExFreePool(senseBuffer); + ExFreePool(srb); + ExFreePool(dataBuffer); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + // + // Prepare the MDL + // + + MmBuildMdlForNonPagedPool(irp2->MdlAddress); + + srb->DataBuffer = dataBuffer; + + // + // Set the new block size in the descriptor. + // This will set the block read size to RAW_SECTOR_SIZE + // TODO: Set density code, based on operation + // + + if (use6Byte) { + cdData->BlockDescriptor.BlockLength[0] = (UCHAR)(RAW_SECTOR_SIZE >> 16) & 0xFF; + cdData->BlockDescriptor.BlockLength[1] = (UCHAR)(RAW_SECTOR_SIZE >> 8) & 0xFF; + cdData->BlockDescriptor.BlockLength[2] = (UCHAR)(RAW_SECTOR_SIZE & 0xFF); + cdData->BlockDescriptor.DensityCode = 0; + } else { + cdData->BlockDescriptor10.BlockLength[0] = (UCHAR)(RAW_SECTOR_SIZE >> 16) & 0xFF; + cdData->BlockDescriptor10.BlockLength[1] = (UCHAR)(RAW_SECTOR_SIZE >> 8) & 0xFF; + cdData->BlockDescriptor10.BlockLength[2] = (UCHAR)(RAW_SECTOR_SIZE & 0xFF); + cdData->BlockDescriptor10.DensityCode = 0; + } + + // + // Move error page into dataBuffer. + // + + RtlCopyMemory(srb->DataBuffer, &cdData->Header, transferByteCount); + + + // + // Build and send a mode select to switch into raw mode. + // + + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_OUT); + srb->DataTransferLength = transferByteCount; + srb->TimeOutValue = fdoExtension->TimeOutValue * 2; + + if (use6Byte) { + srb->CdbLength = 6; + cdb->MODE_SELECT.OperationCode = SCSIOP_MODE_SELECT; + cdb->MODE_SELECT.PFBit = 1; + cdb->MODE_SELECT.ParameterListLength = (UCHAR)transferByteCount; + } else { + + srb->CdbLength = 10; + cdb->MODE_SELECT10.OperationCode = SCSIOP_MODE_SELECT10; + cdb->MODE_SELECT10.PFBit = 1; + cdb->MODE_SELECT10.ParameterListLength[0] = (UCHAR)(transferByteCount >> 8); + cdb->MODE_SELECT10.ParameterListLength[1] = (UCHAR)(transferByteCount & 0xFF); + } + + // + // Update completion routine. + // + + IoSetCompletionRoutine(irp2, + CdRomSwitchModeCompletion, + srb, + TRUE, + TRUE, + TRUE); + + } + + } else { + + PRAW_READ_INFO rawReadInfo = + (PRAW_READ_INFO)currentIrpStack->Parameters.DeviceIoControl.Type3InputBuffer; + ULONG startingSector; + + // + // Free the recently allocated irp, as we don't need it. + // + + IoFreeIrp(irp2); + + cdb = (PCDB)srb->Cdb; + RtlZeroMemory(cdb, CDB12GENERIC_LENGTH); + + + // + // Calculate starting offset. + // + + startingSector = (ULONG)(rawReadInfo->DiskOffset.QuadPart >> fdoExtension->SectorShift); + transferByteCount = rawReadInfo->SectorCount * RAW_SECTOR_SIZE; + + srb->OriginalRequest = Irp; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + srb->DataTransferLength = transferByteCount; + srb->TimeOutValue = fdoExtension->TimeOutValue; + srb->DataBuffer = MmGetMdlVirtualAddress(Irp->MdlAddress); + srb->CdbLength = 12; + srb->SrbStatus = srb->ScsiStatus = 0; + + // + // Fill in CDB fields. + // + + cdb = (PCDB)srb->Cdb; + + + cdb->READ_CD.TransferBlocks[2] = (UCHAR) (rawReadInfo->SectorCount & 0xFF); + cdb->READ_CD.TransferBlocks[1] = (UCHAR) (rawReadInfo->SectorCount >> 8 ); + cdb->READ_CD.TransferBlocks[0] = (UCHAR) (rawReadInfo->SectorCount >> 16); + + + cdb->READ_CD.StartingLBA[3] = (UCHAR) (startingSector & 0xFF); + cdb->READ_CD.StartingLBA[2] = (UCHAR) ((startingSector >> 8)); + cdb->READ_CD.StartingLBA[1] = (UCHAR) ((startingSector >> 16)); + cdb->READ_CD.StartingLBA[0] = (UCHAR) ((startingSector >> 24)); + + // + // Setup cdb depending upon the sector type we want. + // + + switch (rawReadInfo->TrackMode) { + case CDDA: + + cdb->READ_CD.ExpectedSectorType = CD_DA_SECTOR; + cdb->READ_CD.IncludeUserData = 1; + cdb->READ_CD.HeaderCode = 3; + cdb->READ_CD.IncludeSyncData = 1; + break; + + case YellowMode2: + + cdb->READ_CD.ExpectedSectorType = YELLOW_MODE2_SECTOR; + cdb->READ_CD.IncludeUserData = 1; + cdb->READ_CD.HeaderCode = 1; + cdb->READ_CD.IncludeSyncData = 1; + break; + + case XAForm2: + + cdb->READ_CD.ExpectedSectorType = FORM2_MODE2_SECTOR; + cdb->READ_CD.IncludeUserData = 1; + cdb->READ_CD.HeaderCode = 3; + cdb->READ_CD.IncludeSyncData = 1; + break; + + default: + ExFreePool(senseBuffer); + ExFreePool(srb); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + cdb->READ_CD.OperationCode = SCSIOP_READ_CD; + + nextIrpStack->MajorFunction = IRP_MJ_SCSI; + nextIrpStack->Parameters.Scsi.Srb = srb; + + // HACKHACK - REF #0001 + + // + // Set up IoCompletion routine address. + // + + IoSetCompletionRoutine(Irp, + CdRomXACompletion, + srb, + TRUE, + TRUE, + TRUE); + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, Irp); + return; + + } + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + } + + // + // the _EX version does the same thing on the front end + // + + case IOCTL_DISK_GET_LENGTH_INFO: + case IOCTL_DISK_GET_DRIVE_GEOMETRY_EX: + case IOCTL_DISK_GET_DRIVE_GEOMETRY: + case IOCTL_CDROM_GET_DRIVE_GEOMETRY_EX: + case IOCTL_CDROM_GET_DRIVE_GEOMETRY: { + + // + // Issue ReadCapacity to update device extension + // with information for current media. + // + + TraceLog((CdromDebugError, + "CdRomStartIo: Get drive geometry/length " + "info (%p)\n", Irp)); + + // + // setup remaining srb and cdb parameters. + // + + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + srb->DataTransferLength = sizeof(READ_CAPACITY_DATA); + srb->CdbLength = 10; + srb->TimeOutValue = fdoExtension->TimeOutValue; + + dataBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + sizeof(READ_CAPACITY_DATA), + CDROM_TAG_READ_CAP); + if (!dataBuffer) { + ExFreePool(senseBuffer); + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + + } + + irp2->MdlAddress = IoAllocateMdl(dataBuffer, + sizeof(READ_CAPACITY_DATA), + FALSE, + FALSE, + (PIRP) NULL); + + if (!irp2->MdlAddress) { + ExFreePool(senseBuffer); + ExFreePool(srb); + ExFreePool(dataBuffer); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + // + // Prepare the MDL + // + + MmBuildMdlForNonPagedPool(irp2->MdlAddress); + + srb->DataBuffer = dataBuffer; + cdb->CDB10.OperationCode = SCSIOP_READ_CAPACITY; + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + } + + case IOCTL_CDROM_GET_CONFIGURATION: { + + PGET_CONFIGURATION_IOCTL_INPUT inputBuffer; + + TraceLog((CdromDebugError, + "CdRomStartIo: Get configuration (%p)\n", Irp)); + + if (!cdData->Mmc.IsMmc) { + ExFreePool(senseBuffer); + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + transferByteCount = currentIrpStack->Parameters.DeviceIoControl.OutputBufferLength; + + dataBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + transferByteCount, + CDROM_TAG_GET_CONFIG); + if (!dataBuffer) { + ExFreePool(senseBuffer); + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + irp2->MdlAddress = IoAllocateMdl(dataBuffer, + transferByteCount, + FALSE, + FALSE, + (PIRP) NULL); + if (!irp2->MdlAddress) { + ExFreePool(dataBuffer); + ExFreePool(senseBuffer); + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + MmBuildMdlForNonPagedPool(irp2->MdlAddress); + + // + // setup remaining srb and cdb parameters + // + + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + srb->DataTransferLength = transferByteCount; + srb->CdbLength = 10; + srb->TimeOutValue = fdoExtension->TimeOutValue; + srb->DataBuffer = dataBuffer; + + cdb->GET_CONFIGURATION.OperationCode = SCSIOP_GET_CONFIGURATION; + cdb->GET_CONFIGURATION.AllocationLength[0] = (UCHAR)(transferByteCount >> 8); + cdb->GET_CONFIGURATION.AllocationLength[1] = (UCHAR)(transferByteCount & 0xff); + + inputBuffer = (PGET_CONFIGURATION_IOCTL_INPUT)Irp->AssociatedIrp.SystemBuffer; + cdb->GET_CONFIGURATION.StartingFeature[0] = (UCHAR)(inputBuffer->Feature >> 8); + cdb->GET_CONFIGURATION.StartingFeature[1] = (UCHAR)(inputBuffer->Feature & 0xff); + cdb->GET_CONFIGURATION.RequestType = (UCHAR)(inputBuffer->RequestType); + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + } + + case IOCTL_DISK_VERIFY: { + + PVERIFY_INFORMATION verifyInfo = Irp->AssociatedIrp.SystemBuffer; + LARGE_INTEGER byteOffset; + ULONG sectorOffset; + USHORT sectorCount; + + if (!cdData->Mmc.WriteAllowed) { + ExFreePool(senseBuffer); + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_MEDIA_WRITE_PROTECTED; + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + // + // Verify sectors + // + + srb->CdbLength = 10; + + cdb->CDB10.OperationCode = SCSIOP_VERIFY; + + // + // Add disk offset to starting sector. + // + + byteOffset.QuadPart = commonExtension->StartingOffset.QuadPart + + verifyInfo->StartingOffset.QuadPart; + + // + // Convert byte offset to sector offset. + // + + sectorOffset = (ULONG)(byteOffset.QuadPart >> fdoExtension->SectorShift); + + // + // Convert ULONG byte count to USHORT sector count. + // + + sectorCount = (USHORT)(verifyInfo->Length >> fdoExtension->SectorShift); + + // + // Move little endian values into CDB in big endian format. + // + + cdb->CDB10.LogicalBlockByte0 = ((PFOUR_BYTE)§orOffset)->Byte3; + cdb->CDB10.LogicalBlockByte1 = ((PFOUR_BYTE)§orOffset)->Byte2; + cdb->CDB10.LogicalBlockByte2 = ((PFOUR_BYTE)§orOffset)->Byte1; + cdb->CDB10.LogicalBlockByte3 = ((PFOUR_BYTE)§orOffset)->Byte0; + + cdb->CDB10.TransferBlocksMsb = ((PFOUR_BYTE)§orCount)->Byte1; + cdb->CDB10.TransferBlocksLsb = ((PFOUR_BYTE)§orCount)->Byte0; + + // + // The verify command is used by the NT FORMAT utility and + // requests are sent down for 5% of the volume size. The + // request timeout value is calculated based on the number of + // sectors verified. + // + + srb->TimeOutValue = ((sectorCount + 0x7F) >> 7) * + fdoExtension->TimeOutValue; + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + } + + case IOCTL_STORAGE_CHECK_VERIFY: + case IOCTL_DISK_CHECK_VERIFY: + case IOCTL_CDROM_CHECK_VERIFY: { + + // + // Since a test unit ready is about to be performed, reset the + // timer value to decrease the opportunities for it to race with + // this code. + // + + ClassResetMediaChangeTimer(fdoExtension); + + // + // Set up the SRB/CDB + // + + srb->CdbLength = 6; + cdb->CDB6GENERIC.OperationCode = SCSIOP_TEST_UNIT_READY; + srb->TimeOutValue = fdoExtension->TimeOutValue * 2; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_NO_DATA_TRANSFER); + + + TraceLog((CdromDebugTrace, + "CdRomStartIo: [%p] Sending CHECK_VERIFY irp %p\n", + Irp, irp2)); + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + } + + case IOCTL_DVD_READ_STRUCTURE: { + + CdRomDeviceControlDvdReadStructure(Fdo, Irp, irp2, srb); + return; + + } + + case IOCTL_DVD_END_SESSION: { + CdRomDeviceControlDvdEndSession(Fdo, Irp, irp2, srb); + return; + } + + case IOCTL_DVD_START_SESSION: + case IOCTL_DVD_READ_KEY: { + + CdRomDeviceControlDvdStartSessionReadKey(Fdo, Irp, irp2, srb); + return; + + } + + + case IOCTL_DVD_SEND_KEY: + case IOCTL_DVD_SEND_KEY2: { + + CdRomDeviceControlDvdSendKey (Fdo, Irp, irp2, srb); + return; + + + } + + case IOCTL_CDROM_READ_TOC_EX: { + + PCDROM_READ_TOC_EX inputBuffer = Irp->AssociatedIrp.SystemBuffer; + + transferByteCount = currentIrpStack->Parameters.Read.Length; + + dataBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + transferByteCount, + CDROM_TAG_TOC); + if (!dataBuffer) { + ExFreePool(senseBuffer); + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + + } + + irp2->MdlAddress = IoAllocateMdl(dataBuffer, + transferByteCount, + FALSE, + FALSE, + (PIRP) NULL); + + if (!irp2->MdlAddress) { + ExFreePool(senseBuffer); + ExFreePool(srb); + ExFreePool(dataBuffer); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + // + // setup the request per user request + // do validity checking in devctl dispatch, not here + // + + cdb->READ_TOC.OperationCode = SCSIOP_READ_TOC; + cdb->READ_TOC.Msf = inputBuffer->Msf; + cdb->READ_TOC.Format2 = inputBuffer->Format; + cdb->READ_TOC.StartingTrack = inputBuffer->SessionTrack; + cdb->READ_TOC.AllocationLength[0] = (UCHAR)(transferByteCount >> 8); + cdb->READ_TOC.AllocationLength[1] = (UCHAR)(transferByteCount & 0xff); + + // + // Prepare the MDL + // + + MmBuildMdlForNonPagedPool(irp2->MdlAddress); + + // + // do the standard stuff.... + // + + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + srb->DataTransferLength = transferByteCount; + srb->CdbLength = 10; + srb->TimeOutValue = fdoExtension->TimeOutValue; + srb->DataBuffer = dataBuffer; + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + } + + case IOCTL_CDROM_GET_LAST_SESSION: + case IOCTL_CDROM_READ_TOC: { + + if (currentIrpStack->Parameters.DeviceIoControl.IoControlCode == + IOCTL_CDROM_GET_LAST_SESSION) { + + // + // Set format to return first and last session numbers. + // + + cdb->READ_TOC.Format = CDROM_READ_TOC_EX_FORMAT_SESSION; + + } else { + + // + // Use MSF addressing + // + + cdb->READ_TOC.Msf = 1; + + } + + + transferByteCount = + currentIrpStack->Parameters.Read.Length > + sizeof(CDROM_TOC) ? sizeof(CDROM_TOC): + currentIrpStack->Parameters.Read.Length; + + // + // Set size of TOC structure. + // + + cdb->READ_TOC.AllocationLength[0] = (UCHAR) (transferByteCount >> 8); + cdb->READ_TOC.AllocationLength[1] = (UCHAR) (transferByteCount & 0xFF); + + // + // setup remaining srb and cdb parameters. + // + + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + srb->DataTransferLength = transferByteCount; + srb->CdbLength = 10; + srb->TimeOutValue = fdoExtension->TimeOutValue; + + dataBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + transferByteCount, + CDROM_TAG_TOC); + if (!dataBuffer) { + ExFreePool(senseBuffer); + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + + } + + irp2->MdlAddress = IoAllocateMdl(dataBuffer, + transferByteCount, + FALSE, + FALSE, + (PIRP) NULL); + + if (!irp2->MdlAddress) { + ExFreePool(senseBuffer); + ExFreePool(srb); + ExFreePool(dataBuffer); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + // + // Prepare the MDL + // + + MmBuildMdlForNonPagedPool(irp2->MdlAddress); + + srb->DataBuffer = dataBuffer; + cdb->READ_TOC.OperationCode = SCSIOP_READ_TOC; + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + + } + + case IOCTL_CDROM_PLAY_AUDIO_MSF: { + + PCDROM_PLAY_AUDIO_MSF inputBuffer = Irp->AssociatedIrp.SystemBuffer; + + // + // Set up the SRB/CDB + // + + srb->CdbLength = 10; + cdb->PLAY_AUDIO_MSF.OperationCode = SCSIOP_PLAY_AUDIO_MSF; + + cdb->PLAY_AUDIO_MSF.StartingM = inputBuffer->StartingM; + cdb->PLAY_AUDIO_MSF.StartingS = inputBuffer->StartingS; + cdb->PLAY_AUDIO_MSF.StartingF = inputBuffer->StartingF; + + cdb->PLAY_AUDIO_MSF.EndingM = inputBuffer->EndingM; + cdb->PLAY_AUDIO_MSF.EndingS = inputBuffer->EndingS; + cdb->PLAY_AUDIO_MSF.EndingF = inputBuffer->EndingF; + + srb->TimeOutValue = fdoExtension->TimeOutValue; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_NO_DATA_TRANSFER); + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + + } + + case IOCTL_CDROM_READ_Q_CHANNEL: { + + PSUB_Q_CHANNEL_DATA userChannelData = + Irp->AssociatedIrp.SystemBuffer; + PCDROM_SUB_Q_DATA_FORMAT inputBuffer = + Irp->AssociatedIrp.SystemBuffer; + + // + // Allocate buffer for subq channel information. + // + + dataBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + sizeof(SUB_Q_CHANNEL_DATA), + CDROM_TAG_SUB_Q); + + if (!dataBuffer) { + ExFreePool(senseBuffer); + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + + } + + irp2->MdlAddress = IoAllocateMdl(dataBuffer, + sizeof(SUB_Q_CHANNEL_DATA), + FALSE, + FALSE, + (PIRP) NULL); + + if (!irp2->MdlAddress) { + ExFreePool(senseBuffer); + ExFreePool(srb); + ExFreePool(dataBuffer); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + // + // Prepare the MDL + // + + MmBuildMdlForNonPagedPool(irp2->MdlAddress); + + srb->DataBuffer = dataBuffer; + + // + // Always logical unit 0, but only use MSF addressing + // for IOCTL_CDROM_CURRENT_POSITION + // + + if (inputBuffer->Format==IOCTL_CDROM_CURRENT_POSITION) + cdb->SUBCHANNEL.Msf = CDB_USE_MSF; + + // + // Return subchannel data + // + + cdb->SUBCHANNEL.SubQ = CDB_SUBCHANNEL_BLOCK; + + // + // Specify format of informatin to return + // + + cdb->SUBCHANNEL.Format = inputBuffer->Format; + + // + // Specify which track to access (only used by Track ISRC reads) + // + + if (inputBuffer->Format==IOCTL_CDROM_TRACK_ISRC) { + cdb->SUBCHANNEL.TrackNumber = inputBuffer->Track; + } + + // + // Set size of channel data -- however, this is dependent on + // what information we are requesting (which Format) + // + + switch( inputBuffer->Format ) { + + case IOCTL_CDROM_CURRENT_POSITION: + transferByteCount = sizeof(SUB_Q_CURRENT_POSITION); + break; + + case IOCTL_CDROM_MEDIA_CATALOG: + transferByteCount = sizeof(SUB_Q_MEDIA_CATALOG_NUMBER); + break; + + case IOCTL_CDROM_TRACK_ISRC: + transferByteCount = sizeof(SUB_Q_TRACK_ISRC); + break; + } + + cdb->SUBCHANNEL.AllocationLength[0] = (UCHAR) (transferByteCount >> 8); + cdb->SUBCHANNEL.AllocationLength[1] = (UCHAR) (transferByteCount & 0xFF); + cdb->SUBCHANNEL.OperationCode = SCSIOP_READ_SUB_CHANNEL; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + srb->DataTransferLength = transferByteCount; + srb->CdbLength = 10; + srb->TimeOutValue = fdoExtension->TimeOutValue; + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + + } + + case IOCTL_CDROM_PAUSE_AUDIO: { + + cdb->PAUSE_RESUME.OperationCode = SCSIOP_PAUSE_RESUME; + cdb->PAUSE_RESUME.Action = CDB_AUDIO_PAUSE; + + srb->CdbLength = 10; + srb->TimeOutValue = fdoExtension->TimeOutValue; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_NO_DATA_TRANSFER); + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + } + + case IOCTL_CDROM_RESUME_AUDIO: { + + cdb->PAUSE_RESUME.OperationCode = SCSIOP_PAUSE_RESUME; + cdb->PAUSE_RESUME.Action = CDB_AUDIO_RESUME; + + srb->CdbLength = 10; + srb->TimeOutValue = fdoExtension->TimeOutValue; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_NO_DATA_TRANSFER); + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + } + + case IOCTL_CDROM_SEEK_AUDIO_MSF: { + + PCDROM_SEEK_AUDIO_MSF inputBuffer = Irp->AssociatedIrp.SystemBuffer; + ULONG logicalBlockAddress; + + logicalBlockAddress = MSF_TO_LBA(inputBuffer->M, inputBuffer->S, inputBuffer->F); + + cdb->SEEK.OperationCode = SCSIOP_SEEK; + cdb->SEEK.LogicalBlockAddress[0] = ((PFOUR_BYTE)&logicalBlockAddress)->Byte3; + cdb->SEEK.LogicalBlockAddress[1] = ((PFOUR_BYTE)&logicalBlockAddress)->Byte2; + cdb->SEEK.LogicalBlockAddress[2] = ((PFOUR_BYTE)&logicalBlockAddress)->Byte1; + cdb->SEEK.LogicalBlockAddress[3] = ((PFOUR_BYTE)&logicalBlockAddress)->Byte0; + + srb->CdbLength = 10; + srb->TimeOutValue = fdoExtension->TimeOutValue; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_NO_DATA_TRANSFER); + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + + } + + case IOCTL_CDROM_STOP_AUDIO: { + + cdb->START_STOP.OperationCode = SCSIOP_START_STOP_UNIT; + cdb->START_STOP.Immediate = 1; + cdb->START_STOP.Start = 0; + cdb->START_STOP.LoadEject = 0; + + srb->CdbLength = 6; + srb->TimeOutValue = fdoExtension->TimeOutValue; + + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_NO_DATA_TRANSFER); + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + } + + case IOCTL_CDROM_GET_CONTROL: { + + PAUDIO_OUTPUT audioOutput; + PCDROM_AUDIO_CONTROL audioControl = Irp->AssociatedIrp.SystemBuffer; + + // + // Allocate buffer for volume control information. + // + + dataBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + MODE_DATA_SIZE, + CDROM_TAG_VOLUME); + + if (!dataBuffer) { + ExFreePool(senseBuffer); + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + + } + + irp2->MdlAddress = IoAllocateMdl(dataBuffer, + MODE_DATA_SIZE, + FALSE, + FALSE, + (PIRP) NULL); + + if (!irp2->MdlAddress) { + ExFreePool(senseBuffer); + ExFreePool(srb); + ExFreePool(dataBuffer); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + // + // Prepare the MDL + // + + MmBuildMdlForNonPagedPool(irp2->MdlAddress); + srb->DataBuffer = dataBuffer; + + RtlZeroMemory(dataBuffer, MODE_DATA_SIZE); + + // + // Setup for either 6 or 10 byte CDBs. + // + + if (use6Byte) { + + cdb->MODE_SENSE.OperationCode = SCSIOP_MODE_SENSE; + cdb->MODE_SENSE.PageCode = CDROM_AUDIO_CONTROL_PAGE; + cdb->MODE_SENSE.AllocationLength = MODE_DATA_SIZE; + + // + // Disable block descriptors. + // + + cdb->MODE_SENSE.Dbd = TRUE; + + srb->CdbLength = 6; + } else { + + cdb->MODE_SENSE10.OperationCode = SCSIOP_MODE_SENSE10; + cdb->MODE_SENSE10.PageCode = CDROM_AUDIO_CONTROL_PAGE; + cdb->MODE_SENSE10.AllocationLength[0] = (UCHAR)(MODE_DATA_SIZE >> 8); + cdb->MODE_SENSE10.AllocationLength[1] = (UCHAR)(MODE_DATA_SIZE & 0xFF); + + // + // Disable block descriptors. + // + + cdb->MODE_SENSE10.Dbd = TRUE; + + srb->CdbLength = 10; + } + + srb->TimeOutValue = fdoExtension->TimeOutValue; + srb->DataTransferLength = MODE_DATA_SIZE; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + + } + + case IOCTL_CDROM_GET_VOLUME: + case IOCTL_CDROM_SET_VOLUME: { + + dataBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + MODE_DATA_SIZE, + CDROM_TAG_VOLUME); + + if (!dataBuffer) { + ExFreePool(senseBuffer); + ExFreePool(srb); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + irp2->MdlAddress = IoAllocateMdl(dataBuffer, + MODE_DATA_SIZE, + FALSE, + FALSE, + (PIRP) NULL); + + if (!irp2->MdlAddress) { + ExFreePool(senseBuffer); + ExFreePool(srb); + ExFreePool(dataBuffer); + IoFreeIrp(irp2); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(Irp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + // + // Prepare the MDL + // + + MmBuildMdlForNonPagedPool(irp2->MdlAddress); + srb->DataBuffer = dataBuffer; + + RtlZeroMemory(dataBuffer, MODE_DATA_SIZE); + + + if (use6Byte) { + + cdb->MODE_SENSE.OperationCode = SCSIOP_MODE_SENSE; + cdb->MODE_SENSE.PageCode = CDROM_AUDIO_CONTROL_PAGE; + cdb->MODE_SENSE.AllocationLength = MODE_DATA_SIZE; + + srb->CdbLength = 6; + + } else { + + cdb->MODE_SENSE10.OperationCode = SCSIOP_MODE_SENSE10; + cdb->MODE_SENSE10.PageCode = CDROM_AUDIO_CONTROL_PAGE; + cdb->MODE_SENSE10.AllocationLength[0] = (UCHAR)(MODE_DATA_SIZE >> 8); + cdb->MODE_SENSE10.AllocationLength[1] = (UCHAR)(MODE_DATA_SIZE & 0xFF); + + srb->CdbLength = 10; + } + + srb->TimeOutValue = fdoExtension->TimeOutValue; + srb->DataTransferLength = MODE_DATA_SIZE; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + + if (currentIrpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_SET_VOLUME) { + + // + // Setup a different completion routine as the mode sense data is needed in order + // to send the mode select. + // + + IoSetCompletionRoutine(irp2, + CdRomSetVolumeIntermediateCompletion, + srb, + TRUE, + TRUE, + TRUE); + + } + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + + } + + case IOCTL_STORAGE_SET_READ_AHEAD: { + + PSTORAGE_SET_READ_AHEAD readAhead = Irp->AssociatedIrp.SystemBuffer; + + ULONG blockAddress; + PFOUR_BYTE fourByte = (PFOUR_BYTE) &blockAddress; + + // + // setup the SRB for a set readahead command + // + + cdb->SET_READ_AHEAD.OperationCode = SCSIOP_SET_READ_AHEAD; + + blockAddress = (ULONG) (readAhead->TriggerAddress.QuadPart >> + fdoExtension->SectorShift); + + cdb->SET_READ_AHEAD.TriggerLBA[0] = fourByte->Byte3; + cdb->SET_READ_AHEAD.TriggerLBA[1] = fourByte->Byte2; + cdb->SET_READ_AHEAD.TriggerLBA[2] = fourByte->Byte1; + cdb->SET_READ_AHEAD.TriggerLBA[3] = fourByte->Byte0; + + blockAddress = (ULONG) (readAhead->TargetAddress.QuadPart >> + fdoExtension->SectorShift); + + cdb->SET_READ_AHEAD.ReadAheadLBA[0] = fourByte->Byte3; + cdb->SET_READ_AHEAD.ReadAheadLBA[1] = fourByte->Byte2; + cdb->SET_READ_AHEAD.ReadAheadLBA[2] = fourByte->Byte1; + cdb->SET_READ_AHEAD.ReadAheadLBA[3] = fourByte->Byte0; + + srb->CdbLength = 12; + srb->TimeOutValue = fdoExtension->TimeOutValue; + + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_NO_DATA_TRANSFER); + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp2); + return; + } + + case IOCTL_DISK_GET_DRIVE_LAYOUT: + case IOCTL_DISK_GET_DRIVE_LAYOUT_EX: + case IOCTL_DISK_GET_PARTITION_INFO: + case IOCTL_DISK_GET_PARTITION_INFO_EX: { + + ASSERT(irp2); + ASSERT(senseBuffer); + ASSERT(srb); + + ExFreePool(srb); + ExFreePool(senseBuffer); + IoFreeIrp(irp2); + + // + // NOTE: should probably update the media's capacity first... + // + + CdromFakePartitionInfo(commonExtension, Irp); + return; + } + + case IOCTL_DISK_IS_WRITABLE: { + + TraceLog((CdromDebugWarning, + "CdRomStartIo: DiskIsWritable (%p) - returning %s\n", + Irp, (cdData->Mmc.WriteAllowed ? "TRUE" : "false"))); + + ASSERT(irp2); + ASSERT(senseBuffer); + ASSERT(srb); + + ExFreePool(srb); + ExFreePool(senseBuffer); + IoFreeIrp(irp2); + + Irp->IoStatus.Information = 0; + if (cdData->Mmc.WriteAllowed) { + Irp->IoStatus.Status = STATUS_SUCCESS; + } else { + Irp->IoStatus.Status = STATUS_MEDIA_WRITE_PROTECTED; + } + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, Irp); + return; + } + + default: { + + UCHAR uniqueAddress; + + // + // Just complete the request - CdRomClassIoctlCompletion will take + // care of it for us + // + // NOTE: THIS IS A SYNCHRONIZATION METHOD!!! + // + + // + // Acquire a new copy of the lock so that ClassCompleteRequest + // doesn't get confused when we complete the other request while + // holding the lock. + // + + // + // NOTE: CdRomDeviceControlDispatch/CdRomDeviceControlCompletion + // wait for the event and eventually calls + // IoStartNextPacket() + // + + ASSERT(irp2); + ASSERT(senseBuffer); + ASSERT(srb); + + ExFreePool(srb); + ExFreePool(senseBuffer); + IoFreeIrp(irp2); + + + + ClassAcquireRemoveLock(Fdo, (PIRP)&uniqueAddress); + ClassReleaseRemoveLock(Fdo, Irp); + ClassCompleteRequest(Fdo, Irp, IO_NO_INCREMENT); + ClassReleaseRemoveLock(Fdo, (PIRP)&uniqueAddress); + return; + } + + } // end switch() + } else if (currentIrpStack->MajorFunction == IRP_MJ_SHUTDOWN || + currentIrpStack->MajorFunction == IRP_MJ_FLUSH_BUFFERS) { + + currentIrpStack->Parameters.Others.Argument1 = 0; + Irp->IoStatus.Status = STATUS_SUCCESS; + CdRomShutdownFlushCompletion(Fdo, NULL, Irp); + return; + + } + + // + // If a read or an unhandled IRP_MJ_XX, end up here. The unhandled IRP_MJ's + // are expected and composed of AutoRun Irps, at present. + // + + IoCallDriver(commonExtension->LowerDeviceObject, Irp); + return; +} + + +NTSTATUS +CdRomReadWriteVerification( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) + +/*++ + +Routine Description: + + This is the entry called by the I/O system for read requests. + It builds the SRB and sends it to the port driver. + +Arguments: + + DeviceObject - the system object for the device. + Irp - IRP involved. + +Return Value: + + NT Status + +--*/ + +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + + PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(Irp); + ULONG transferByteCount = currentIrpStack->Parameters.Read.Length; + LARGE_INTEGER startingOffset = currentIrpStack->Parameters.Read.ByteOffset; + + PCDROM_DATA cdData = (PCDROM_DATA)(commonExtension->DriverData); + + SCSI_REQUEST_BLOCK srb; + PCDB cdb = (PCDB)srb.Cdb; + NTSTATUS status; + + PAGED_CODE(); + + // + // note: we are no longer failing write commands immediately + // they are now failed in StartIo based upon media ability + // + + // + // If the cd is playing music then reject this request. + // + + if (PLAY_ACTIVE(fdoExtension)) { + Irp->IoStatus.Status = STATUS_DEVICE_BUSY; + return STATUS_DEVICE_BUSY; + } + + // + // Verify parameters of this request. + // Check that ending sector is on disc and + // that number of bytes to transfer is a multiple of + // the sector size. + // + + startingOffset.QuadPart = currentIrpStack->Parameters.Read.ByteOffset.QuadPart + + transferByteCount; + + if (!fdoExtension->DiskGeometry.BytesPerSector) { + fdoExtension->DiskGeometry.BytesPerSector = 2048; + } + + if ((startingOffset.QuadPart > commonExtension->PartitionLength.QuadPart) || + (transferByteCount & fdoExtension->DiskGeometry.BytesPerSector - 1)) { + + // + // Fail request with status of invalid parameters. + // + + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + + return STATUS_INVALID_PARAMETER; + } + + + return STATUS_SUCCESS; + +} // end CdRomReadWriteVerification() + + +NTSTATUS +CdRomSwitchModeCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PCDROM_DATA cdData = (PCDROM_DATA)(commonExtension->DriverData); + BOOLEAN use6Byte = TEST_FLAG(cdData->XAFlags, XA_USE_6_BYTE); + PIO_STACK_LOCATION realIrpStack; + PIO_STACK_LOCATION realIrpNextStack; + PSCSI_REQUEST_BLOCK srb = Context; + PIRP realIrp = NULL; + NTSTATUS status; + BOOLEAN retry; + + // + // Extract the 'real' irp from the irpstack. + // + + realIrp = (PIRP) irpStack->Parameters.Others.Argument2; + realIrpStack = IoGetCurrentIrpStackLocation(realIrp); + realIrpNextStack = IoGetNextIrpStackLocation(realIrp); + + // + // Check SRB status for success of completing request. + // + + if (SRB_STATUS(srb->SrbStatus) != SRB_STATUS_SUCCESS) { + + ULONG retryInterval; + + TraceLog((CdromDebugTrace, + "CdRomSetVolumeIntermediateCompletion: Irp %p, Srb %p, Real Irp %p\n", + Irp, + srb, + realIrp)); + + // + // Release the queue if it is frozen. + // + + if (srb->SrbStatus & SRB_STATUS_QUEUE_FROZEN) { + ClassReleaseQueue(DeviceObject); + } + + + retry = ClassInterpretSenseInfo(DeviceObject, + srb, + irpStack->MajorFunction, + irpStack->Parameters.DeviceIoControl.IoControlCode, + MAXIMUM_RETRIES - ((ULONG)(ULONG_PTR)realIrpNextStack->Parameters.Others.Argument1), + &status, + &retryInterval); + + // + // If the status is verified required and the this request + // should bypass verify required then retry the request. + // + + if (realIrpStack->Flags & SL_OVERRIDE_VERIFY_VOLUME && + status == STATUS_VERIFY_REQUIRED) { + + status = STATUS_IO_DEVICE_ERROR; + retry = TRUE; + } + + if (retry && realIrpNextStack->Parameters.Others.Argument1--) { + + if (((ULONG)(ULONG_PTR)realIrpNextStack->Parameters.Others.Argument1)) { + + // + // Retry request. + // + + TraceLog((CdromDebugWarning, + "Retry request %p - Calling StartIo\n", Irp)); + + + ExFreePool(srb->SenseInfoBuffer); + ExFreePool(srb->DataBuffer); + ExFreePool(srb); + if (Irp->MdlAddress) { + IoFreeMdl(Irp->MdlAddress); + } + + IoFreeIrp(Irp); + + // + // Call StartIo directly since IoStartNextPacket hasn't been called, + // the serialisation is still intact. + // + + CdRomRetryRequest(fdoExtension, + realIrp, + retryInterval, + FALSE); + + return STATUS_MORE_PROCESSING_REQUIRED; + + } + + // + // Exhausted retries. Fall through and complete the request with the appropriate status. + // + } + } else { + + // + // Set status for successful request. + // + + status = STATUS_SUCCESS; + + } + + if (NT_SUCCESS(status)) { + + ULONG sectorSize, startingSector, transferByteCount; + PCDB cdb; + + // + // Update device ext. to show which mode we are currently using. + // + + sectorSize = cdData->BlockDescriptor.BlockLength[0] << 16; + sectorSize |= (cdData->BlockDescriptor.BlockLength[1] << 8); + sectorSize |= (cdData->BlockDescriptor.BlockLength[2]); + + cdData->RawAccess = (sectorSize == RAW_SECTOR_SIZE) ? TRUE : FALSE; + + // + // Free the old data buffer, mdl. + // reuse the SenseInfoBuffer and Srb + // + + ExFreePool(srb->DataBuffer); + IoFreeMdl(Irp->MdlAddress); + IoFreeIrp(Irp); + + // + // rebuild the srb. + // + + cdb = (PCDB)srb->Cdb; + RtlZeroMemory(cdb, CDB12GENERIC_LENGTH); + + + if (cdData->RawAccess) { + + PRAW_READ_INFO rawReadInfo = + (PRAW_READ_INFO)realIrpStack->Parameters.DeviceIoControl.Type3InputBuffer; + + ULONG maximumTransferLength; + ULONG transferPages; + UCHAR min, sec, frame; + + // + // Calculate starting offset. + // + + startingSector = (ULONG)(rawReadInfo->DiskOffset.QuadPart >> fdoExtension->SectorShift); + transferByteCount = rawReadInfo->SectorCount * RAW_SECTOR_SIZE; + maximumTransferLength = fdoExtension->AdapterDescriptor->MaximumTransferLength; + transferPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(realIrp->MdlAddress), + transferByteCount); + + // + // Determine if request is within limits imposed by miniport. + // If the request is larger than the miniport's capabilities, split it. + // + + if (transferByteCount > maximumTransferLength || + transferPages > fdoExtension->AdapterDescriptor->MaximumPhysicalPages) { + + + ExFreePool(srb->SenseInfoBuffer); + ExFreePool(srb); + realIrp->IoStatus.Information = 0; + realIrp->IoStatus.Status = STATUS_INVALID_PARAMETER; + + BAIL_OUT(realIrp); + CdRomCompleteIrpAndStartNextPacketSafely(DeviceObject, realIrp); + return STATUS_MORE_PROCESSING_REQUIRED; + } + + srb->OriginalRequest = realIrp; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + + srb->DataTransferLength = transferByteCount; + srb->TimeOutValue = fdoExtension->TimeOutValue; + srb->CdbLength = 10; + srb->DataBuffer = MmGetMdlVirtualAddress(realIrp->MdlAddress); + + if (rawReadInfo->TrackMode == CDDA) { + if (TEST_FLAG(cdData->XAFlags, XA_PLEXTOR_CDDA)) { + + srb->CdbLength = 12; + + cdb->PLXTR_READ_CDDA.LogicalBlockByte3 = (UCHAR) (startingSector & 0xFF); + cdb->PLXTR_READ_CDDA.LogicalBlockByte2 = (UCHAR) ((startingSector >> 8) & 0xFF); + cdb->PLXTR_READ_CDDA.LogicalBlockByte1 = (UCHAR) ((startingSector >> 16) & 0xFF); + cdb->PLXTR_READ_CDDA.LogicalBlockByte0 = (UCHAR) ((startingSector >> 24) & 0xFF); + + cdb->PLXTR_READ_CDDA.TransferBlockByte3 = (UCHAR) (rawReadInfo->SectorCount & 0xFF); + cdb->PLXTR_READ_CDDA.TransferBlockByte2 = (UCHAR) (rawReadInfo->SectorCount >> 8); + cdb->PLXTR_READ_CDDA.TransferBlockByte1 = 0; + cdb->PLXTR_READ_CDDA.TransferBlockByte0 = 0; + + cdb->PLXTR_READ_CDDA.SubCode = 0; + cdb->PLXTR_READ_CDDA.OperationCode = 0xD8; + + } else if (TEST_FLAG(cdData->XAFlags, XA_NEC_CDDA)) { + + cdb->NEC_READ_CDDA.LogicalBlockByte3 = (UCHAR) (startingSector & 0xFF); + cdb->NEC_READ_CDDA.LogicalBlockByte2 = (UCHAR) ((startingSector >> 8) & 0xFF); + cdb->NEC_READ_CDDA.LogicalBlockByte1 = (UCHAR) ((startingSector >> 16) & 0xFF); + cdb->NEC_READ_CDDA.LogicalBlockByte0 = (UCHAR) ((startingSector >> 24) & 0xFF); + + cdb->NEC_READ_CDDA.TransferBlockByte1 = (UCHAR) (rawReadInfo->SectorCount & 0xFF); + cdb->NEC_READ_CDDA.TransferBlockByte0 = (UCHAR) (rawReadInfo->SectorCount >> 8); + + cdb->NEC_READ_CDDA.OperationCode = 0xD4; + } + } else { + cdb->CDB10.TransferBlocksMsb = (UCHAR) (rawReadInfo->SectorCount >> 8); + cdb->CDB10.TransferBlocksLsb = (UCHAR) (rawReadInfo->SectorCount & 0xFF); + + cdb->CDB10.LogicalBlockByte3 = (UCHAR) (startingSector & 0xFF); + cdb->CDB10.LogicalBlockByte2 = (UCHAR) ((startingSector >> 8) & 0xFF); + cdb->CDB10.LogicalBlockByte1 = (UCHAR) ((startingSector >> 16) & 0xFF); + cdb->CDB10.LogicalBlockByte0 = (UCHAR) ((startingSector >> 24) & 0xFF); + + cdb->CDB10.OperationCode = SCSIOP_READ; + } + + srb->SrbStatus = srb->ScsiStatus = 0; + + + irpStack = IoGetNextIrpStackLocation(realIrp); + irpStack->MajorFunction = IRP_MJ_SCSI; + irpStack->Parameters.Scsi.Srb = srb; + + if (!(irpStack->Parameters.Others.Argument1)) { + + // + // Only jam this in if it doesn't exist. The completion routines can + // call StartIo directly in the case of retries and resetting it will + // cause infinite loops. + // + + irpStack->Parameters.Others.Argument1 = (PVOID) MAXIMUM_RETRIES; + } + + // + // Set up IoCompletion routine address. + // + + IoSetCompletionRoutine(realIrp, + CdRomXACompletion, + srb, + TRUE, + TRUE, + TRUE); + } else { + + PSTORAGE_ADAPTER_DESCRIPTOR adapterDescriptor; + ULONG maximumTransferLength; + ULONG transferPages; + + // + // a writable device must be MMC compliant, which supports + // READ_CD commands, so writes and mode switching should + // never occur on the same device. + // + + ASSERT(realIrpStack->MajorFunction != IRP_MJ_WRITE); + + // + // free the SRB and SenseInfoBuffer since they aren't used + // by either ClassBuildRequest() nor ClassSplitRequest(). + // + + ExFreePool(srb->SenseInfoBuffer); + ExFreePool(srb); + + // + // Back to cooked sectors. Build and send a normal read. + // The real work for setting offsets was done in startio. + // + + adapterDescriptor = + commonExtension->PartitionZeroExtension->AdapterDescriptor; + maximumTransferLength = adapterDescriptor->MaximumTransferLength; + transferPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES( + MmGetMdlVirtualAddress(realIrp->MdlAddress), + realIrpStack->Parameters.Read.Length); + + if ((realIrpStack->Parameters.Read.Length > maximumTransferLength) || + (transferPages > adapterDescriptor->MaximumPhysicalPages)) { + + ULONG maxPages = adapterDescriptor->MaximumPhysicalPages; + + if (maxPages != 0) { + maxPages --; // to account for page boundaries + } + + TraceLog((CdromDebugTrace, + "CdromSwitchModeCompletion: Request greater than " + " maximum\n")); + TraceLog((CdromDebugTrace, + "CdromSwitchModeCompletion: Maximum is %lx\n", + maximumTransferLength)); + TraceLog((CdromDebugTrace, + "CdromSwitchModeCompletion: Byte count is %lx\n", + realIrpStack->Parameters.Read.Length)); + + // + // Check that the maximum transfer length fits within + // the maximum number of pages the device can handle. + // + + if (maximumTransferLength > maxPages << PAGE_SHIFT) { + maximumTransferLength = maxPages << PAGE_SHIFT; + } + + // + // Check that maximum transfer size is not zero + // + + if (maximumTransferLength == 0) { + maximumTransferLength = PAGE_SIZE; + } + + // + // Request needs to be split. Completion of each portion + // of the request will fire off the next portion. The final + // request will signal Io to send a new request. + // + + ClassSplitRequest(DeviceObject, realIrp, maximumTransferLength); + return STATUS_MORE_PROCESSING_REQUIRED; + + } else { + + // + // Build SRB and CDB for this IRP. + // + + ClassBuildRequest(DeviceObject, realIrp); + + } + } + + // + // Call the port driver. + // + + IoCallDriver(commonExtension->LowerDeviceObject, realIrp); + + return STATUS_MORE_PROCESSING_REQUIRED; + } + + // + // Update device Extension flags to indicate that XA isn't supported. + // + + TraceLog((CdromDebugWarning, + "Device Cannot Support CDDA (but tested positive) " + "Now Clearing CDDA flags for FDO %p\n", DeviceObject)); + SET_FLAG(cdData->XAFlags, XA_NOT_SUPPORTED); + CLEAR_FLAG(cdData->XAFlags, XA_PLEXTOR_CDDA); + CLEAR_FLAG(cdData->XAFlags, XA_NEC_CDDA); + + // + // Deallocate srb and sense buffer. + // + + if (srb) { + if (srb->DataBuffer) { + ExFreePool(srb->DataBuffer); + } + if (srb->SenseInfoBuffer) { + ExFreePool(srb->SenseInfoBuffer); + } + ExFreePool(srb); + } + + if (Irp->PendingReturned) { + IoMarkIrpPending(Irp); + } + + if (realIrp->PendingReturned) { + IoMarkIrpPending(realIrp); + } + + if (Irp->MdlAddress) { + IoFreeMdl(Irp->MdlAddress); + } + + IoFreeIrp(Irp); + + // + // Set status in completing IRP. + // + + realIrp->IoStatus.Status = status; + + // + // Set the hard error if necessary. + // + + if (!NT_SUCCESS(status) && IoIsErrorUserInduced(status)) { + + // + // Store DeviceObject for filesystem, and clear + // in IoStatus.Information field. + // + + if (realIrp->Tail.Overlay.Thread) { + IoSetHardErrorOrVerifyDevice(realIrp, DeviceObject); + } + realIrp->IoStatus.Information = 0; + } + + CdRomCompleteIrpAndStartNextPacketSafely(DeviceObject, realIrp); + + return STATUS_MORE_PROCESSING_REQUIRED; +} + + +VOID +ScanForSpecialHandler( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + ULONG_PTR HackFlags + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension; + PCDROM_DATA cdData; + + PAGED_CODE(); + + CLEAR_FLAG(HackFlags, CDROM_HACK_INVALID_FLAGS); + + commonExtension = &(FdoExtension->CommonExtension); + cdData = (PCDROM_DATA)(commonExtension->DriverData); + cdData->HackFlags = HackFlags; + + return; +} + +VOID +ScanForSpecial( + PDEVICE_OBJECT DeviceObject + ) + +/*++ + +Routine Description: + + This function checks to see if an SCSI logical unit requires an special + initialization or error processing. + +Arguments: + + DeviceObject - Supplies the device object to be tested. + + InquiryData - Supplies the inquiry data returned by the device of interest. + + PortCapabilities - Supplies the capabilities of the device object. + +Return Value: + + None. + +--*/ + +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + PCOMMON_DEVICE_EXTENSION commonExtension; + PCDROM_DATA cdData; + + PAGED_CODE(); + + fdoExtension = DeviceObject->DeviceExtension; + commonExtension = DeviceObject->DeviceExtension; + cdData = (PCDROM_DATA)(commonExtension->DriverData); + + + // + // set our hack flags + // + + ClassScanForSpecial(fdoExtension, CdromHackItems, ScanForSpecialHandler); + + // + // All CDRom's can ignore the queue lock failure for power operations + // and do not require handling the SpinUp case (unknown result of sending + // a cdrom a START_UNIT command -- may eject disks?) + // + // We send the stop command mostly to stop outstanding asynch operations + // (like audio playback) from running when the system is powered off. + // Because of this and the unlikely chance that a PLAY command will be + // sent in the window between the STOP and the time the machine powers down + // we don't require queue locks. This is important because without them + // classpnp's power routines will send the START_STOP_UNIT command to the + // device whether or not it supports locking (atapi does not support locking + // and if we requested them we would end up not stopping audio on atapi + // devices). + // + + SET_FLAG(fdoExtension->ScanForSpecialFlags, CLASS_SPECIAL_DISABLE_SPIN_UP); + SET_FLAG(fdoExtension->ScanForSpecialFlags, CLASS_SPECIAL_NO_QUEUE_LOCK); + + if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_HITACHI_1750) + && ( fdoExtension->AdapterDescriptor->AdapterUsesPio ) + ) { + + // + // Read-ahead must be disabled in order to get this cdrom drive + // to work on scsi adapters that use PIO. + // + + + TraceLog((CdromDebugWarning, + "CdRom ScanForSpecial: Found Hitachi CDR-1750S.\n")); + + // + // Setup an error handler to reinitialize the cd rom after it is reset. + // + + cdData->ErrorHandler = HitachiProcessError; + + // + // Lock down the hitachi error processing code. + // + + MmLockPagableCodeSection(HitachiProcessError); + SET_FLAG(cdData->HackFlags, CDROM_HACK_LOCKED_PAGES); + + + } else if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_TOSHIBA_SD_W1101)) { + + TraceLog((CdromDebugError, + "CdRom ScanForSpecial: Found Toshiba SD-W1101 DVD-RAM " + "-- This drive will *NOT* support DVD-ROM playback.\n")); + + } else if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_HITACHI_GD_2000)) { + + TraceLog((CdromDebugWarning, + "CdRom ScanForSpecial: Found Hitachi GD-2000\n")); + + // + // Setup an error handler to spin up the drive when it idles out + // since it seems to like to fail to spin itself back up on its + // own for a REPORT_KEY command. It may also lose the AGIDs that + // it has given, which will result in DVD playback failures. + // This routine will just do what it can... + // + + cdData->ErrorHandler = HitachiProcessErrorGD2000; + + // + // this drive may require START_UNIT commands to spin + // the drive up when it's spun itself down. + // + + SET_FLAG(fdoExtension->DeviceFlags, DEV_SAFE_START_UNIT); + + // + // Lock down the hitachi error processing code. + // + + MmLockPagableCodeSection(HitachiProcessErrorGD2000); + SET_FLAG(cdData->HackFlags, CDROM_HACK_LOCKED_PAGES); + + } else if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_FUJITSU_FMCD_10x)) { + + // + // When Read command is issued to FMCD-101 or FMCD-102 and there is a music + // cd in it. It takes longer time than SCSI_CDROM_TIMEOUT before returning + // error status. + // + + fdoExtension->TimeOutValue = 20; + + } else if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_DEC_RRD)) { + + PMODE_PARM_READ_WRITE_DATA modeParameters; + SCSI_REQUEST_BLOCK srb; + PCDB cdb; + NTSTATUS status; + + + TraceLog((CdromDebugWarning, + "CdRom ScanForSpecial: Found DEC RRD.\n")); + + cdData->IsDecRrd = TRUE; + + // + // Setup an error handler to reinitialize the cd rom after it is reset? + // + //commonExtension->DevInfo->ClassError = DecRrdProcessError; + + // + // Found a DEC RRD cd-rom. These devices do not pass MS HCT + // multi-media tests because the DEC firmware modifieds the block + // from the PC-standard 2K to 512. Change the block transfer size + // back to the PC-standard 2K by using a mode select command. + // + + modeParameters = ExAllocatePoolWithTag(NonPagedPool, + sizeof(MODE_PARM_READ_WRITE_DATA), + CDROM_TAG_MODE_DATA + ); + if (modeParameters == NULL) { + return; + } + + RtlZeroMemory(modeParameters, sizeof(MODE_PARM_READ_WRITE_DATA)); + RtlZeroMemory(&srb, sizeof(SCSI_REQUEST_BLOCK)); + + // + // Set the block length to 2K. + // + + modeParameters->ParameterListHeader.BlockDescriptorLength = + sizeof(MODE_PARAMETER_BLOCK); + + // + // Set block length to 2K (0x0800) in Parameter Block. + // + + modeParameters->ParameterListBlock.BlockLength[0] = 0x00; //MSB + modeParameters->ParameterListBlock.BlockLength[1] = 0x08; + modeParameters->ParameterListBlock.BlockLength[2] = 0x00; //LSB + + // + // Build the mode select CDB. + // + + srb.CdbLength = 6; + srb.TimeOutValue = fdoExtension->TimeOutValue; + + cdb = (PCDB)srb.Cdb; + cdb->MODE_SELECT.PFBit = 1; + cdb->MODE_SELECT.OperationCode = SCSIOP_MODE_SELECT; + cdb->MODE_SELECT.ParameterListLength = HITACHI_MODE_DATA_SIZE; + + // + // Send the request to the device. + // + + status = ClassSendSrbSynchronous(DeviceObject, + &srb, + modeParameters, + sizeof(MODE_PARM_READ_WRITE_DATA), + TRUE); + + if (!NT_SUCCESS(status)) { + TraceLog((CdromDebugWarning, + "CdRom ScanForSpecial: Setting DEC RRD to 2K block" + "size failed [%x]\n", status)); + } + ExFreePool(modeParameters); + + } else if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_TOSHIBA_XM_3xx)) { + + SCSI_REQUEST_BLOCK srb; + PCDB cdb; + ULONG length; + PUCHAR buffer; + NTSTATUS status; + + // + // Set the density code and the error handler. + // + + length = (sizeof(MODE_READ_RECOVERY_PAGE) + MODE_BLOCK_DESC_LENGTH + MODE_HEADER_LENGTH); + + RtlZeroMemory(&srb, sizeof(SCSI_REQUEST_BLOCK)); + + // + // Build the MODE SENSE CDB. + // + + srb.CdbLength = 6; + cdb = (PCDB)srb.Cdb; + + // + // Set timeout value from device extension. + // + + srb.TimeOutValue = fdoExtension->TimeOutValue; + + cdb->MODE_SENSE.OperationCode = SCSIOP_MODE_SENSE; + cdb->MODE_SENSE.PageCode = 0x1; + // NOTE: purposely not setting DBD because it is what is needed. + cdb->MODE_SENSE.AllocationLength = (UCHAR)length; + + buffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + (sizeof(MODE_READ_RECOVERY_PAGE) + MODE_BLOCK_DESC_LENGTH + MODE_HEADER_LENGTH), + CDROM_TAG_MODE_DATA); + if (!buffer) { + return; + } + + status = ClassSendSrbSynchronous(DeviceObject, + &srb, + buffer, + length, + FALSE); + + ((PERROR_RECOVERY_DATA)buffer)->BlockDescriptor.DensityCode = 0x83; + ((PERROR_RECOVERY_DATA)buffer)->Header.ModeDataLength = 0x0; + + RtlCopyMemory(&cdData->Header, buffer, sizeof(ERROR_RECOVERY_DATA)); + + RtlZeroMemory(&srb, sizeof(SCSI_REQUEST_BLOCK)); + + // + // Build the MODE SENSE CDB. + // + + srb.CdbLength = 6; + cdb = (PCDB)srb.Cdb; + + // + // Set timeout value from device extension. + // + + srb.TimeOutValue = fdoExtension->TimeOutValue; + + cdb->MODE_SELECT.OperationCode = SCSIOP_MODE_SELECT; + cdb->MODE_SELECT.PFBit = 1; + cdb->MODE_SELECT.ParameterListLength = (UCHAR)length; + + status = ClassSendSrbSynchronous(DeviceObject, + &srb, + buffer, + length, + TRUE); + + if (!NT_SUCCESS(status)) { + TraceLog((CdromDebugWarning, + "Cdrom.ScanForSpecial: Setting density code on Toshiba failed [%x]\n", + status)); + } + + cdData->ErrorHandler = ToshibaProcessError; + + // + // Lock down the toshiba error section. + // + + MmLockPagableCodeSection(ToshibaProcessError); + SET_FLAG(cdData->HackFlags, CDROM_HACK_LOCKED_PAGES); + + ExFreePool(buffer); + + } + + // + // Determine special CD-DA requirements. + // + + if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_READ_CD_SUPPORTED)) { + + SET_FLAG(cdData->XAFlags, XA_USE_READ_CD); + + } else if (!TEST_FLAG(cdData->XAFlags, XA_USE_READ_CD)) { + + if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_PLEXTOR_CDDA)) { + SET_FLAG(cdData->XAFlags, XA_PLEXTOR_CDDA); + } else if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_NEC_CDDA)) { + SET_FLAG(cdData->XAFlags, XA_NEC_CDDA); + } + + } + + if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_LOCKED_PAGES)) { + KdPrintEx((DPFLTR_SYSTEM_ID, DPFLTR_ERROR_LEVEL, + "Locking pages for error handler\n")); + } + + + return; +} + + +VOID +HitachiProcessErrorGD2000( + PDEVICE_OBJECT Fdo, + PSCSI_REQUEST_BLOCK OriginalSrb, + NTSTATUS *Status, + BOOLEAN *Retry + ) +/*++ + +Routine Description: + + This routine checks the type of error. If the error suggests that the + drive has spun down and cannot reinitialize itself, send a + START_UNIT or READ to the device. This will force the drive to spin + up. This drive also loses the AGIDs it has granted when it spins down, + which may result in playback failure the first time around. + +Arguments: + + DeviceObject - Supplies a pointer to the device object. + + Srb - Supplies a pointer to the failing Srb. + + Status - return the final status for this command? + + Retry - return if the command should be retried. + +Return Value: + + None. + +--*/ +{ + PSENSE_DATA senseBuffer = OriginalSrb->SenseInfoBuffer; + + UNREFERENCED_PARAMETER(Status); + UNREFERENCED_PARAMETER(Retry); + + if (!TEST_FLAG(OriginalSrb->SrbStatus, SRB_STATUS_AUTOSENSE_VALID)) { + return; + } + + if (((senseBuffer->SenseKey & 0xf) == SCSI_SENSE_HARDWARE_ERROR) && + (senseBuffer->AdditionalSenseCode == 0x44)) { + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + PIRP irp; + PIO_STACK_LOCATION irpStack; + PCOMPLETION_CONTEXT context; + PSCSI_REQUEST_BLOCK newSrb; + PCDB cdb; + + TraceLog((CdromDebugWarning, + "HitachiProcessErrorGD2000 (%p) => Internal Target " + "Failure Detected -- spinning up drive\n", Fdo)); + + // + // the request should be retried because the device isn't ready + // + + *Retry = TRUE; + *Status = STATUS_DEVICE_NOT_READY; + + // + // send a START_STOP unit to spin up the drive + // NOTE: this temporarily violates the StartIo serialization + // mechanism, but the completion routine on this will NOT + // call StartNextPacket(), so it's a temporary disruption + // of the serialization only. + // + + ClassSendStartUnit(Fdo); + + } + + return; +} + + +VOID +HitachiProcessError( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + NTSTATUS *Status, + BOOLEAN *Retry + ) +/*++ + +Routine Description: + + This routine checks the type of error. If the error indicates CD-ROM the + CD-ROM needs to be reinitialized then a Mode sense command is sent to the + device. This command disables read-ahead for the device. + +Arguments: + + DeviceObject - Supplies a pointer to the device object. + + Srb - Supplies a pointer to the failing Srb. + + Status - Not used. + + Retry - Not used. + +Return Value: + + None. + +--*/ + +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PSENSE_DATA senseBuffer = Srb->SenseInfoBuffer; + LARGE_INTEGER largeInt; + PUCHAR modePage; + PIO_STACK_LOCATION irpStack; + PIRP irp; + PSCSI_REQUEST_BLOCK srb; + PCOMPLETION_CONTEXT context; + PCDB cdb; + ULONG_PTR alignment; + + UNREFERENCED_PARAMETER(Status); + UNREFERENCED_PARAMETER(Retry); + + largeInt.QuadPart = (LONGLONG) 1; + + // + // Check the status. The initialization command only needs to be sent + // if UNIT ATTENTION is returned. + // + + if (!(Srb->SrbStatus & SRB_STATUS_AUTOSENSE_VALID)) { + + // + // The drive does not require reinitialization. + // + + return; + } + + // + // Found an HITACHI cd-rom that does not work with PIO + // adapters when read-ahead is enabled. Read-ahead is disabled by + // a mode select command. The mode select page code is zero and the + // length is 6 bytes. All of the other bytes should be zero. + // + + if ((senseBuffer->SenseKey & 0xf) == SCSI_SENSE_UNIT_ATTENTION) { + + TraceLog((CdromDebugWarning, + "HitachiProcessError: Reinitializing the CD-ROM.\n")); + + // + // Send the special mode select command to disable read-ahead + // on the CD-ROM reader. + // + + alignment = DeviceObject->AlignmentRequirement ? + DeviceObject->AlignmentRequirement : 1; + + context = ExAllocatePoolWithTag( + NonPagedPool, + sizeof(COMPLETION_CONTEXT) + HITACHI_MODE_DATA_SIZE + (ULONG)alignment, + CDROM_TAG_HITACHI_ERROR + ); + + if (context == NULL) { + + // + // If there is not enough memory to fulfill this request, + // simply return. A subsequent retry will fail and another + // chance to start the unit. + // + + return; + } + + context->DeviceObject = DeviceObject; + srb = &context->Srb; + + RtlZeroMemory(srb, SCSI_REQUEST_BLOCK_SIZE); + + // + // Write length to SRB. + // + + srb->Length = SCSI_REQUEST_BLOCK_SIZE; + + // + // Set up SCSI bus address. + // + + srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + srb->TimeOutValue = fdoExtension->TimeOutValue; + + // + // Set the transfer length. + // + + srb->DataTransferLength = HITACHI_MODE_DATA_SIZE; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_OUT); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_AUTOSENSE); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + + // + // The data buffer must be aligned. + // + + srb->DataBuffer = (PVOID) (((ULONG_PTR) (context + 1) + (alignment - 1)) & + ~(alignment - 1)); + + + // + // Build the HITACHI read-ahead mode select CDB. + // + + srb->CdbLength = 6; + cdb = (PCDB)srb->Cdb; + cdb->MODE_SENSE.LogicalUnitNumber = srb->Lun; + cdb->MODE_SENSE.OperationCode = SCSIOP_MODE_SELECT; + cdb->MODE_SENSE.AllocationLength = HITACHI_MODE_DATA_SIZE; + + // + // Initialize the mode sense data. + // + + modePage = srb->DataBuffer; + + RtlZeroMemory(modePage, HITACHI_MODE_DATA_SIZE); + + // + // Set the page length field to 6. + // + + modePage[5] = 6; + + // + // Build the asynchronous request to be sent to the port driver. + // + + irp = IoBuildAsynchronousFsdRequest(IRP_MJ_WRITE, + DeviceObject, + srb->DataBuffer, + srb->DataTransferLength, + &largeInt, + NULL); + + if (irp == NULL) { + + // + // If there is not enough memory to fulfill this request, + // simply return. A subsequent retry will fail and another + // chance to start the unit. + // + + ExFreePool(context); + return; + } + + ClassAcquireRemoveLock(DeviceObject, irp); + + IoSetCompletionRoutine(irp, + (PIO_COMPLETION_ROUTINE)ClassAsynchronousCompletion, + context, + TRUE, + TRUE, + TRUE); + + irpStack = IoGetNextIrpStackLocation(irp); + + irpStack->MajorFunction = IRP_MJ_SCSI; + + srb->OriginalRequest = irp; + + // + // Save SRB address in next stack for port driver. + // + + irpStack->Parameters.Scsi.Srb = (PVOID)srb; + + // + // Set up IRP Address. + // + + (VOID)IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp); + + } +} + + +NTSTATUS +ToshibaProcessErrorCompletion( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID Context + ) + +/*++ + +Routine Description: + + Completion routine for the ClassError routine to handle older Toshiba units + that require setting the density code. + +Arguments: + + DeviceObject - Supplies a pointer to the device object. + + Irp - Pointer to irp created to set the density code. + + Context - Supplies a pointer to the Mode Select Srb. + + +Return Value: + + STATUS_MORE_PROCESSING_REQUIRED + +--*/ + +{ + + PSCSI_REQUEST_BLOCK srb = Context; + + // + // Free all of the allocations. + // + + ClassReleaseRemoveLock(DeviceObject, Irp); + + ExFreePool(srb->DataBuffer); + ExFreePool(srb); + IoFreeMdl(Irp->MdlAddress); + IoFreeIrp(Irp); + + // + // Indicate the I/O system should stop processing the Irp completion. + // + + return STATUS_MORE_PROCESSING_REQUIRED; +} + + +VOID +ToshibaProcessError( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + NTSTATUS *Status, + BOOLEAN *Retry + ) + +/*++ + +Routine Description: + + This routine checks the type of error. If the error indicates a unit attention, + the density code needs to be set via a Mode select command. + +Arguments: + + DeviceObject - Supplies a pointer to the device object. + + Srb - Supplies a pointer to the failing Srb. + + Status - Not used. + + Retry - Not used. + +Return Value: + + None. + +--*/ + +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + + PCDROM_DATA cdData = (PCDROM_DATA)(commonExtension->DriverData); + PSENSE_DATA senseBuffer = Srb->SenseInfoBuffer; + PIO_STACK_LOCATION irpStack; + PIRP irp; + PSCSI_REQUEST_BLOCK srb; + ULONG length; + PCDB cdb; + PUCHAR dataBuffer; + + + if (!(Srb->SrbStatus & SRB_STATUS_AUTOSENSE_VALID)) { + return; + } + + // + // The Toshiba's require the density code to be set on power up and media changes. + // + + if ((senseBuffer->SenseKey & 0xf) == SCSI_SENSE_UNIT_ATTENTION) { + + + irp = IoAllocateIrp((CCHAR)(DeviceObject->StackSize+1), + FALSE); + + if (!irp) { + return; + } + + srb = ExAllocatePoolWithTag(NonPagedPool, + sizeof(SCSI_REQUEST_BLOCK), + CDROM_TAG_TOSHIBA_ERROR); + if (!srb) { + IoFreeIrp(irp); + return; + } + + + length = sizeof(ERROR_RECOVERY_DATA); + dataBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + length, + CDROM_TAG_TOSHIBA_ERROR); + if (!dataBuffer) { + ExFreePool(srb); + IoFreeIrp(irp); + return; + } + + irp->MdlAddress = IoAllocateMdl(dataBuffer, + length, + FALSE, + FALSE, + (PIRP) NULL); + + if (!irp->MdlAddress) { + ExFreePool(srb); + ExFreePool(dataBuffer); + IoFreeIrp(irp); + return; + } + + // + // Prepare the MDL + // + + MmBuildMdlForNonPagedPool(irp->MdlAddress); + + RtlZeroMemory(srb, sizeof(SCSI_REQUEST_BLOCK)); + + srb->DataBuffer = dataBuffer; + cdb = (PCDB)srb->Cdb; + + // + // Set up the irp. + // + + IoSetNextIrpStackLocation(irp); + irp->IoStatus.Status = STATUS_SUCCESS; + irp->IoStatus.Information = 0; + irp->Flags = 0; + irp->UserBuffer = NULL; + + // + // Save the device object and irp in a private stack location. + // + + irpStack = IoGetCurrentIrpStackLocation(irp); + irpStack->DeviceObject = DeviceObject; + + // + // Construct the IRP stack for the lower level driver. + // + + irpStack = IoGetNextIrpStackLocation(irp); + irpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + irpStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_SCSI_EXECUTE_OUT; + irpStack->Parameters.Scsi.Srb = srb; + + IoSetCompletionRoutine(irp, + ToshibaProcessErrorCompletion, + srb, + TRUE, + TRUE, + TRUE); + + ClassAcquireRemoveLock(DeviceObject, irp); + + srb->Length = SCSI_REQUEST_BLOCK_SIZE; + srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + srb->SrbStatus = srb->ScsiStatus = 0; + srb->NextSrb = 0; + srb->OriginalRequest = irp; + srb->SenseInfoBufferLength = 0; + + // + // Set the transfer length. + // + + srb->DataTransferLength = length; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_OUT); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_AUTOSENSE); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_NO_QUEUE_FREEZE); + + + srb->CdbLength = 6; + cdb->MODE_SELECT.OperationCode = SCSIOP_MODE_SELECT; + cdb->MODE_SELECT.PFBit = 1; + cdb->MODE_SELECT.ParameterListLength = (UCHAR)length; + + // + // Copy the Mode page into the databuffer. + // + + RtlCopyMemory(srb->DataBuffer, &cdData->Header, length); + + // + // Set the density code. + // + + ((PERROR_RECOVERY_DATA)srb->DataBuffer)->BlockDescriptor.DensityCode = 0x83; + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp); + } +} + + +BOOLEAN +CdRomIsPlayActive( + IN PDEVICE_OBJECT DeviceObject + ) + +/*++ + +Routine Description: + + This routine determines if the cd is currently playing music. + +Arguments: + + DeviceObject - Device object to test. + +Return Value: + + TRUE if the device is playing music. + +--*/ +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + IO_STATUS_BLOCK ioStatus; + PSUB_Q_CURRENT_POSITION currentBuffer; + + PAGED_CODE(); + + // + // if we don't think it is playing audio, don't bother checking. + // + + if (!PLAY_ACTIVE(fdoExtension)) { + return(FALSE); + } + + currentBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + sizeof(SUB_Q_CURRENT_POSITION), + CDROM_TAG_PLAY_ACTIVE); + + if (currentBuffer == NULL) { + return(FALSE); + } + + ((PCDROM_SUB_Q_DATA_FORMAT) currentBuffer)->Format = IOCTL_CDROM_CURRENT_POSITION; + ((PCDROM_SUB_Q_DATA_FORMAT) currentBuffer)->Track = 0; + + // + // Build the synchronous request to be sent to ourself + // to perform the request. + // + + ClassSendDeviceIoControlSynchronous( + IOCTL_CDROM_READ_Q_CHANNEL, + DeviceObject, + currentBuffer, + sizeof(CDROM_SUB_Q_DATA_FORMAT), + sizeof(SUB_Q_CURRENT_POSITION), + FALSE, + &ioStatus); + + if (!NT_SUCCESS(ioStatus.Status)) { + ExFreePool(currentBuffer); + return FALSE; + } + + // + // should update the playactive flag here. + // + + if (currentBuffer->Header.AudioStatus == AUDIO_STATUS_IN_PROGRESS) { + PLAY_ACTIVE(fdoExtension) = TRUE; + } else { + PLAY_ACTIVE(fdoExtension) = FALSE; + } + + ExFreePool(currentBuffer); + + return(PLAY_ACTIVE(fdoExtension)); + +} + + +VOID +CdRomTickHandler( + IN PDEVICE_OBJECT DeviceObject + ) + +/*++ + +Routine Description: + + This routine handles the once per second timer provided by the + Io subsystem. It is used to do delayed retries for cdroms. + +Arguments: + + DeviceObject - what to check. + +Return Value: + + None. + +--*/ + +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + + ULONG isRemoved; + + KIRQL oldIrql; + + PIRP irp; + PIRP heldIrpList; + PIRP nextIrp; + PLIST_ENTRY listEntry; + PCDROM_DATA cddata; + PIO_STACK_LOCATION irpStack; + UCHAR uniqueAddress; + + isRemoved = ClassAcquireRemoveLock(DeviceObject, (PIRP) &uniqueAddress); + + // + // We stop the timer before deleting the device. It's safe to keep going + // if the flag value is REMOVE_PENDING because the removal thread will be + // blocked trying to stop the timer. + // + + ASSERT(isRemoved != REMOVE_COMPLETE); + + // + // This routine is reasonably safe even if the device object has a pending + // remove + + cddata = commonExtension->DriverData; + + // + // Since cdrom is completely synchronized there can never be more than one + // irp delayed for retry at any time. + // + + KeAcquireSpinLock(&(cddata->DelayedRetrySpinLock), &oldIrql); + + if(cddata->DelayedRetryIrp != NULL) { + + PIRP irp = cddata->DelayedRetryIrp; + + // + // If we've got a delayed retry at this point then there had beter + // be an interval for it. + // + + ASSERT(cddata->DelayedRetryInterval != 0); + cddata->DelayedRetryInterval--; + + if(isRemoved) { + + // + // This device is removed - flush the timer queue + // + + cddata->DelayedRetryIrp = NULL; + cddata->DelayedRetryInterval = 0; + + KeReleaseSpinLock(&(cddata->DelayedRetrySpinLock), oldIrql); + + ClassReleaseRemoveLock(DeviceObject, irp); + ClassCompleteRequest(DeviceObject, irp, IO_CD_ROM_INCREMENT); + + } else if (cddata->DelayedRetryInterval == 0) { + + // + // Submit this IRP to the lower driver. This IRP does not + // need to be remembered here. It will be handled again when + // it completes. + // + + cddata->DelayedRetryIrp = NULL; + + KeReleaseSpinLock(&(cddata->DelayedRetrySpinLock), oldIrql); + + TraceLog((CdromDebugWarning, + "CdRomTickHandler: Reissuing request %p (thread = %p)\n", + irp, + irp->Tail.Overlay.Thread)); + + // + // feed this to the appropriate port driver + // + + CdRomRerunRequest(fdoExtension, irp, cddata->DelayedRetryResend); + } else { + KeReleaseSpinLock(&(cddata->DelayedRetrySpinLock), oldIrql); + } + } else { + KeReleaseSpinLock(&(cddata->DelayedRetrySpinLock), oldIrql); + } + + ClassReleaseRemoveLock(DeviceObject, (PIRP) &uniqueAddress); +} + + +NTSTATUS +CdRomUpdateGeometryCompletion( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID Context + ) + +/*++ + +Routine Description: + + This routine andles the completion of the test unit ready irps + used to determine if the media has changed. If the media has + changed, this code signals the named event to wake up other + system services that react to media change (aka AutoPlay). + +Arguments: + + DeviceObject - the object for the completion + Irp - the IRP being completed + Context - the SRB from the IRP + +Return Value: + + NTSTATUS + +--*/ + +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + PCOMMON_DEVICE_EXTENSION commonExtension; + + PSCSI_REQUEST_BLOCK srb = (PSCSI_REQUEST_BLOCK) Context; + PREAD_CAPACITY_DATA readCapacityBuffer; + PIO_STACK_LOCATION irpStack; + NTSTATUS status; + BOOLEAN retry; + ULONG retryCount; + ULONG lastSector; + PIRP originalIrp; + PCDROM_DATA cddata; + UCHAR uniqueAddress; + + // + // Get items saved in the private IRP stack location. + // + + irpStack = IoGetCurrentIrpStackLocation(Irp); + retryCount = (ULONG)(ULONG_PTR) irpStack->Parameters.Others.Argument1; + originalIrp = (PIRP) irpStack->Parameters.Others.Argument2; + + if (!DeviceObject) { + DeviceObject = irpStack->DeviceObject; + } + ASSERT(DeviceObject); + + fdoExtension = DeviceObject->DeviceExtension; + commonExtension = DeviceObject->DeviceExtension; + cddata = commonExtension->DriverData; + readCapacityBuffer = srb->DataBuffer; + + if ((NT_SUCCESS(Irp->IoStatus.Status)) && (SRB_STATUS(srb->SrbStatus) == SRB_STATUS_SUCCESS)) { + + CdRomInterpretReadCapacity(DeviceObject, readCapacityBuffer); + + } else { + + ULONG retryInterval; + + TraceLog((CdromDebugWarning, + "CdRomUpdateGeometryCompletion: [%p] unsuccessful " + "completion of buddy-irp %p (status - %lx)\n", + originalIrp, Irp, Irp->IoStatus.Status)); + + if (srb->SrbStatus & SRB_STATUS_QUEUE_FROZEN) { + ClassReleaseQueue(DeviceObject); + } + + retry = ClassInterpretSenseInfo(DeviceObject, + srb, + IRP_MJ_SCSI, + 0, + retryCount, + &status, + &retryInterval); + if (retry) { + retryCount--; + if ((retryCount) && (commonExtension->IsRemoved == NO_REMOVE)) { + PCDB cdb; + + TraceLog((CdromDebugWarning, + "CdRomUpdateGeometryCompletion: [%p] Retrying " + "request %p .. thread is %p\n", + originalIrp, Irp, Irp->Tail.Overlay.Thread)); + + // + // set up a one shot timer to get this process started over + // + + irpStack->Parameters.Others.Argument1 = ULongToPtr( retryCount ); + irpStack->Parameters.Others.Argument2 = (PVOID) originalIrp; + irpStack->Parameters.Others.Argument3 = (PVOID) 2; + + // + // Setup the IRP to be submitted again in the timer routine. + // + + irpStack = IoGetNextIrpStackLocation(Irp); + irpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + irpStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_SCSI_EXECUTE_IN; + irpStack->Parameters.Scsi.Srb = srb; + IoSetCompletionRoutine(Irp, + CdRomUpdateGeometryCompletion, + srb, + TRUE, + TRUE, + TRUE); + + // + // Set up the SRB for read capacity. + // + + srb->CdbLength = 10; + srb->TimeOutValue = fdoExtension->TimeOutValue; + srb->SrbStatus = srb->ScsiStatus = 0; + srb->NextSrb = 0; + srb->Length = SCSI_REQUEST_BLOCK_SIZE; + srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + srb->DataTransferLength = sizeof(READ_CAPACITY_DATA); + + // + // Set up the CDB + // + + cdb = (PCDB) &srb->Cdb[0]; + cdb->CDB10.OperationCode = SCSIOP_READ_CAPACITY; + + // + // Requests queued onto this list will be sent to the + // lower level driver during CdRomTickHandler + // + + CdRomRetryRequest(fdoExtension, Irp, retryInterval, TRUE); + + return STATUS_MORE_PROCESSING_REQUIRED; + } + + if (commonExtension->IsRemoved != NO_REMOVE) { + + // + // We cannot retry the request. Fail it. + // + + originalIrp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST; + + } else { + + // + // This has been bounced for a number of times. Error the + // original request. + // + + originalIrp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + RtlZeroMemory(&(fdoExtension->DiskGeometry), + sizeof(DISK_GEOMETRY)); + fdoExtension->DiskGeometry.BytesPerSector = 2048; + fdoExtension->SectorShift = 11; + commonExtension->PartitionLength.QuadPart = + (LONGLONG)(0x7fffffff); + fdoExtension->DiskGeometry.MediaType = RemovableMedia; + } + } else { + + // + // Set up reasonable defaults + // + + RtlZeroMemory(&(fdoExtension->DiskGeometry), + sizeof(DISK_GEOMETRY)); + fdoExtension->DiskGeometry.BytesPerSector = 2048; + fdoExtension->SectorShift = 11; + commonExtension->PartitionLength.QuadPart = (LONGLONG)(0x7fffffff); + fdoExtension->DiskGeometry.MediaType = RemovableMedia; + } + } + + // + // Free resources held. + // + + ExFreePool(srb->SenseInfoBuffer); + ExFreePool(srb->DataBuffer); + ExFreePool(srb); + if (Irp->MdlAddress) { + IoFreeMdl(Irp->MdlAddress); + } + IoFreeIrp(Irp); + Irp = NULL; + + if (originalIrp->Tail.Overlay.Thread) { + + TraceLog((CdromDebugTrace, + "CdRomUpdateGeometryCompletion: [%p] completing " + "original IRP\n", originalIrp)); + + } else { + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugError, + "CdRomUpdateGeometryCompletion: completing irp %p which has " + "no thread\n", originalIrp)); + + } + + { + // NOTE: should the original irp be sent down to the device object? + // it probably should if the SL_OVERRIDER_VERIFY_VOLUME flag + // is set! + KIRQL oldIrql; + PIO_STACK_LOCATION realIrpStack; + + realIrpStack = IoGetCurrentIrpStackLocation(originalIrp); + oldIrql = KeRaiseIrqlToDpcLevel(); + + if (TEST_FLAG(realIrpStack->Flags, SL_OVERRIDE_VERIFY_VOLUME)) { + CdRomStartIo(DeviceObject, originalIrp); + } else { + originalIrp->IoStatus.Status = STATUS_VERIFY_REQUIRED; + originalIrp->IoStatus.Information = 0; + CdRomCompleteIrpAndStartNextPacketSafely(DeviceObject, originalIrp); + } + KeLowerIrql(oldIrql); + } + + return STATUS_MORE_PROCESSING_REQUIRED; +} + + +NTSTATUS +CdRomUpdateCapacity( + IN PFUNCTIONAL_DEVICE_EXTENSION DeviceExtension, + IN PIRP IrpToComplete, + IN OPTIONAL PKEVENT IoctlEvent + ) + +/*++ + +Routine Description: + + This routine updates the capacity of the disk as recorded in the device extension. + It also completes the IRP given with STATUS_VERIFY_REQUIRED. This routine is called + when a media change has occurred and it is necessary to determine the capacity of the + new media prior to the next access. + +Arguments: + + DeviceExtension - the device to update + IrpToComplete - the request that needs to be completed when done. + +Return Value: + + NTSTATUS + +--*/ + +{ + PCOMMON_DEVICE_EXTENSION commonExtension = (PCOMMON_DEVICE_EXTENSION) DeviceExtension; + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = (PFUNCTIONAL_DEVICE_EXTENSION) DeviceExtension; + + PCDB cdb; + PIRP irp; + PSCSI_REQUEST_BLOCK srb; + PREAD_CAPACITY_DATA capacityBuffer; + PIO_STACK_LOCATION irpStack; + PUCHAR senseBuffer; + NTSTATUS status; + + irp = IoAllocateIrp((CCHAR)(commonExtension->DeviceObject->StackSize+1), + FALSE); + + if (irp) { + + srb = ExAllocatePoolWithTag(NonPagedPool, + sizeof(SCSI_REQUEST_BLOCK), + CDROM_TAG_UPDATE_CAP); + if (srb) { + capacityBuffer = ExAllocatePoolWithTag( + NonPagedPoolCacheAligned, + sizeof(READ_CAPACITY_DATA), + CDROM_TAG_UPDATE_CAP); + + if (capacityBuffer) { + + + senseBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + SENSE_BUFFER_SIZE, + CDROM_TAG_UPDATE_CAP); + + if (senseBuffer) { + + irp->MdlAddress = IoAllocateMdl(capacityBuffer, + sizeof(READ_CAPACITY_DATA), + FALSE, + FALSE, + (PIRP) NULL); + + if (irp->MdlAddress) { + + // + // Have all resources. Set up the IRP to send for the capacity. + // + + IoSetNextIrpStackLocation(irp); + irp->IoStatus.Status = STATUS_SUCCESS; + irp->IoStatus.Information = 0; + irp->Flags = 0; + irp->UserBuffer = NULL; + + // + // Save the device object and retry count in a private stack location. + // + + irpStack = IoGetCurrentIrpStackLocation(irp); + irpStack->DeviceObject = commonExtension->DeviceObject; + irpStack->Parameters.Others.Argument1 = (PVOID) MAXIMUM_RETRIES; + irpStack->Parameters.Others.Argument2 = (PVOID) IrpToComplete; + + // + // Construct the IRP stack for the lower level driver. + // + + irpStack = IoGetNextIrpStackLocation(irp); + irpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + irpStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_SCSI_EXECUTE_IN; + irpStack->Parameters.Scsi.Srb = srb; + IoSetCompletionRoutine(irp, + CdRomUpdateGeometryCompletion, + srb, + TRUE, + TRUE, + TRUE); + // + // Prepare the MDL + // + + MmBuildMdlForNonPagedPool(irp->MdlAddress); + + + // + // Set up the SRB for read capacity. + // + + RtlZeroMemory(srb, sizeof(SCSI_REQUEST_BLOCK)); + RtlZeroMemory(senseBuffer, SENSE_BUFFER_SIZE); + srb->CdbLength = 10; + srb->TimeOutValue = DeviceExtension->TimeOutValue; + srb->SrbStatus = srb->ScsiStatus = 0; + srb->NextSrb = 0; + srb->Length = SCSI_REQUEST_BLOCK_SIZE; + srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + srb->SrbFlags = DeviceExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + srb->DataBuffer = capacityBuffer; + srb->DataTransferLength = sizeof(READ_CAPACITY_DATA); + srb->OriginalRequest = irp; + srb->SenseInfoBuffer = senseBuffer; + srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; + + // + // Set up the CDB + // + + cdb = (PCDB) &srb->Cdb[0]; + cdb->CDB10.OperationCode = SCSIOP_READ_CAPACITY; + + // + // Set the return value in the IRP that will be completed + // upon completion of the read capacity. + // + + IrpToComplete->IoStatus.Status = STATUS_IO_DEVICE_ERROR; + IoMarkIrpPending(IrpToComplete); + + IoCallDriver(commonExtension->LowerDeviceObject, irp); + + // + // status is not checked because the completion routine for this + // IRP will always get called and it will free the resources. + // + + return STATUS_PENDING; + + } else { + ExFreePool(senseBuffer); + ExFreePool(capacityBuffer); + ExFreePool(srb); + IoFreeIrp(irp); + } + } else { + ExFreePool(capacityBuffer); + ExFreePool(srb); + IoFreeIrp(irp); + } + } else { + ExFreePool(srb); + IoFreeIrp(irp); + } + } else { + IoFreeIrp(irp); + } + } + + // + // complete the original irp with a failure. + // ISSUE-2000/07/05-henrygab - find a way to avoid failure. + // + + RtlZeroMemory(&(fdoExtension->DiskGeometry), + sizeof(DISK_GEOMETRY)); + fdoExtension->DiskGeometry.BytesPerSector = 2048; + fdoExtension->SectorShift = 11; + commonExtension->PartitionLength.QuadPart = + (LONGLONG)(0x7fffffff); + fdoExtension->DiskGeometry.MediaType = RemovableMedia; + + IrpToComplete->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + IrpToComplete->IoStatus.Information = 0; + + BAIL_OUT(IrpToComplete); + CdRomCompleteIrpAndStartNextPacketSafely(commonExtension->DeviceObject, + IrpToComplete); + return STATUS_INSUFFICIENT_RESOURCES; +} + + +NTSTATUS +CdRomRemoveDevice( + IN PDEVICE_OBJECT DeviceObject, + IN UCHAR Type + ) + +/*++ + +Routine Description: + + This routine is responsible for releasing any resources in use by the + cdrom driver and shutting down it's timer routine. This routine is called + when all outstanding requests have been completed and the device has + disappeared - no requests may be issued to the lower drivers. + +Arguments: + + DeviceObject - the device object being removed + +Return Value: + + none - this routine may not fail + +--*/ + +{ + PFUNCTIONAL_DEVICE_EXTENSION deviceExtension = + DeviceObject->DeviceExtension; + + PCDROM_DATA cdData = deviceExtension->CommonExtension.DriverData; + + PAGED_CODE(); + + if((Type == IRP_MN_QUERY_REMOVE_DEVICE) || + (Type == IRP_MN_CANCEL_REMOVE_DEVICE)) { + return STATUS_SUCCESS; + } + + if(cdData->DelayedRetryIrp != NULL) { + cdData->DelayedRetryInterval = 1; + CdRomTickHandler(DeviceObject); + } + + CdRomDeAllocateMmcResources(DeviceObject); + + if (deviceExtension->DeviceDescriptor) { + ExFreePool(deviceExtension->DeviceDescriptor); + deviceExtension->DeviceDescriptor = NULL; + } + + if (deviceExtension->AdapterDescriptor) { + ExFreePool(deviceExtension->AdapterDescriptor); + deviceExtension->AdapterDescriptor = NULL; + } + + if (deviceExtension->SenseData) { + ExFreePool(deviceExtension->SenseData); + deviceExtension->SenseData = NULL; + } + + ClassDeleteSrbLookasideList(&deviceExtension->CommonExtension); + + if(cdData->CdromInterfaceString.Buffer != NULL) { + IoSetDeviceInterfaceState( + &(cdData->CdromInterfaceString), + FALSE); + RtlFreeUnicodeString(&(cdData->CdromInterfaceString)); + RtlInitUnicodeString(&(cdData->CdromInterfaceString), NULL); + } + + if(cdData->VolumeInterfaceString.Buffer != NULL) { + IoSetDeviceInterfaceState( + &(cdData->VolumeInterfaceString), + FALSE); + RtlFreeUnicodeString(&(cdData->VolumeInterfaceString)); + RtlInitUnicodeString(&(cdData->VolumeInterfaceString), NULL); + } + + CdRomDeleteWellKnownName(DeviceObject); + + ASSERT(cdData->DelayedRetryIrp == NULL); + + if(Type == IRP_MN_REMOVE_DEVICE) { + + if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_LOCKED_PAGES)) { + + // + // unlock locked pages by locking (to get Mm pointer) + // and then unlocking twice. + // + + PVOID locked; + + if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_HITACHI_1750)) { + + locked = MmLockPagableCodeSection(HitachiProcessError); + + } else if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_HITACHI_GD_2000)) { + + locked = MmLockPagableCodeSection(HitachiProcessErrorGD2000); + + } else if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_TOSHIBA_XM_3xx )) { + + locked = MmLockPagableCodeSection(ToshibaProcessError); + + } else { + + // this is a problem! + // workaround by locking this twice, once for us and + // once for the non-existant locker from ScanForSpecial + ASSERT(!"hack flags show locked section, but none exists?"); + locked = MmLockPagableCodeSection(CdRomRemoveDevice); + locked = MmLockPagableCodeSection(CdRomRemoveDevice); + + + } + + MmUnlockPagableImageSection(locked); + MmUnlockPagableImageSection(locked); + + } + + // + // keep the system-wide count accurate, as + // programs use this info to know when they + // have found all the cdroms in a system. + // + + TraceLog((CdromDebugTrace, + "CDROM.SYS Remove device\n")); + IoGetConfigurationInformation()->CdRomCount--; + } + + // + // so long, and thanks for all the fish! + // + + return STATUS_SUCCESS; +} + + +DEVICE_TYPE +CdRomGetDeviceType( + IN PDEVICE_OBJECT DeviceObject + ) +/*++ + +Routine Description: + + This routine figures out the real device type + by checking CDVD_CAPABILITIES_PAGE + +Arguments: + + DeviceObject - + +Return Value: + + FILE_DEVICE_CD_ROM or FILE_DEVICE_DVD + + +--*/ +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + PCDROM_DATA cdromExtension; + ULONG bufLength; + SCSI_REQUEST_BLOCK srb; + PCDB cdb; + PMODE_PARAMETER_HEADER10 modePageHeader; + PCDVD_CAPABILITIES_PAGE capPage; + ULONG capPageOffset; + DEVICE_TYPE deviceType; + NTSTATUS status; + BOOLEAN use6Byte; + + PAGED_CODE(); + + // + // NOTE: don't cache this until understand how it affects GetMediaTypes() + // + + // + // default device type + // + + deviceType = FILE_DEVICE_CD_ROM; + + fdoExtension = DeviceObject->DeviceExtension; + + cdromExtension = fdoExtension->CommonExtension.DriverData; + + use6Byte = TEST_FLAG(cdromExtension->XAFlags, XA_USE_6_BYTE); + + RtlZeroMemory(&srb, sizeof(srb)); + cdb = (PCDB)srb.Cdb; + + // + // Build the MODE SENSE CDB. The data returned will be kept in the + // device extension and used to set block size. + // + if (use6Byte) { + + bufLength = sizeof(CDVD_CAPABILITIES_PAGE) + + sizeof(MODE_PARAMETER_HEADER); + + capPageOffset = sizeof(MODE_PARAMETER_HEADER); + + cdb->MODE_SENSE.OperationCode = SCSIOP_MODE_SENSE; + cdb->MODE_SENSE.Dbd = 1; + cdb->MODE_SENSE.PageCode = MODE_PAGE_CAPABILITIES; + cdb->MODE_SENSE.AllocationLength = (UCHAR)bufLength; + srb.CdbLength = 6; + } else { + + bufLength = sizeof(CDVD_CAPABILITIES_PAGE) + + sizeof(MODE_PARAMETER_HEADER10); + + capPageOffset = sizeof(MODE_PARAMETER_HEADER10); + + cdb->MODE_SENSE10.OperationCode = SCSIOP_MODE_SENSE10; + cdb->MODE_SENSE10.Dbd = 1; + cdb->MODE_SENSE10.PageCode = MODE_PAGE_CAPABILITIES; + cdb->MODE_SENSE10.AllocationLength[0] = (UCHAR)(bufLength >> 8); + cdb->MODE_SENSE10.AllocationLength[1] = (UCHAR)(bufLength >> 0); + srb.CdbLength = 10; + } + + // + // Set timeout value from device extension. + // + srb.TimeOutValue = fdoExtension->TimeOutValue; + + modePageHeader = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + bufLength, + CDROM_TAG_MODE_DATA); + if (modePageHeader) { + + RtlZeroMemory(modePageHeader, bufLength); + + status = ClassSendSrbSynchronous( + DeviceObject, + &srb, + modePageHeader, + bufLength, + FALSE); + + if (NT_SUCCESS(status) || + (status == STATUS_DATA_OVERRUN) || + (status == STATUS_BUFFER_OVERFLOW) + ) { + + capPage = (PCDVD_CAPABILITIES_PAGE) (((PUCHAR) modePageHeader) + capPageOffset); + + if ((capPage->PageCode == MODE_PAGE_CAPABILITIES) && + (capPage->DVDROMRead || capPage->DVDRRead || + capPage->DVDRAMRead || capPage->DVDRWrite || + capPage->DVDRAMWrite)) { + + deviceType = FILE_DEVICE_DVD; + } + } + ExFreePool (modePageHeader); + } + + return deviceType; +} + + +NTSTATUS +CdRomCreateWellKnownName( + IN PDEVICE_OBJECT DeviceObject + ) +/*++ + +Routine Description: + + This routine creates a symbolic link to the cdrom device object + under \dosdevices. The number of the cdrom device does not neccessarily + match between \dosdevices and \device, but usually will be the same. + + Saves the buffer + +Arguments: + + DeviceObject - + +Return Value: + + NTSTATUS + +--*/ +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PCDROM_DATA cdromData = commonExtension->DriverData; + + UNICODE_STRING unicodeLinkName; + WCHAR wideLinkName[64]; + PWCHAR savedName; + + LONG cdromNumber = fdoExtension->DeviceNumber; + + NTSTATUS status; + + // + // if already linked, assert then return + // + + if (cdromData->WellKnownName.Buffer != NULL) { + + TraceLog((CdromDebugError, + "CdRomCreateWellKnownName: link already exists %p\n", + cdromData->WellKnownName.Buffer)); + ASSERT(FALSE); + return STATUS_UNSUCCESSFUL; + + } + + // + // find an unused CdRomNN to link to + // + + do { + + swprintf(wideLinkName, L"\\DosDevices\\CdRom%d", cdromNumber); + RtlInitUnicodeString(&unicodeLinkName, wideLinkName); + status = IoCreateSymbolicLink(&unicodeLinkName, + &(commonExtension->DeviceName)); + + cdromNumber++; + + } while((status == STATUS_OBJECT_NAME_COLLISION) || + (status == STATUS_OBJECT_NAME_EXISTS)); + + if (!NT_SUCCESS(status)) { + + TraceLog((CdromDebugWarning, + "CdRomCreateWellKnownName: Error %lx linking %wZ to " + "device %wZ\n", + status, + &unicodeLinkName, + &(commonExtension->DeviceName))); + return status; + + } + + TraceLog((CdromDebugWarning, + "CdRomCreateWellKnownName: successfully linked %wZ " + "to device %wZ\n", + &unicodeLinkName, + &(commonExtension->DeviceName))); + + // + // Save away the symbolic link name in the driver data block. We need + // it so we can delete the link when the device is removed. + // + + savedName = ExAllocatePoolWithTag(PagedPool, + unicodeLinkName.MaximumLength, + CDROM_TAG_STRINGS); + + if (savedName == NULL) { + IoDeleteSymbolicLink(&unicodeLinkName); + return STATUS_INSUFFICIENT_RESOURCES; + } + + RtlCopyMemory(savedName, + unicodeLinkName.Buffer, + unicodeLinkName.MaximumLength); + + RtlInitUnicodeString(&(cdromData->WellKnownName), savedName); + + // + // the name was saved and the link created + // + + return STATUS_SUCCESS; +} + + +VOID +CdRomDeleteWellKnownName( + IN PDEVICE_OBJECT DeviceObject + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PCDROM_DATA cdromData = commonExtension->DriverData; + + if(cdromData->WellKnownName.Buffer != NULL) { + + IoDeleteSymbolicLink(&(cdromData->WellKnownName)); + ExFreePool(cdromData->WellKnownName.Buffer); + cdromData->WellKnownName.Buffer = NULL; + cdromData->WellKnownName.Length = 0; + cdromData->WellKnownName.MaximumLength = 0; + + } + return; +} + + +NTSTATUS +CdRomGetDeviceParameter ( + IN PDEVICE_OBJECT Fdo, + IN PWSTR ParameterName, + IN OUT PULONG ParameterValue + ) +/*++ + +Routine Description: + + retrieve a devnode registry parameter + +Arguments: + + DeviceObject - Cdrom Device Object + + ParameterName - parameter name to look up + + ParameterValuse - default parameter value + +Return Value: + + NT Status + +--*/ +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + NTSTATUS status; + HANDLE deviceParameterHandle; + RTL_QUERY_REGISTRY_TABLE queryTable[2]; + ULONG defaultParameterValue; + + PAGED_CODE(); + + // + // open the given parameter + // + status = IoOpenDeviceRegistryKey(fdoExtension->LowerPdo, + PLUGPLAY_REGKEY_DRIVER, + KEY_READ, + &deviceParameterHandle); + + if(NT_SUCCESS(status)) { + + RtlZeroMemory(queryTable, sizeof(queryTable)); + + defaultParameterValue = *ParameterValue; + + queryTable->Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; + queryTable->Name = ParameterName; + queryTable->EntryContext = ParameterValue; + queryTable->DefaultType = REG_NONE; + queryTable->DefaultData = NULL; + queryTable->DefaultLength = 0; + + status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE, + (PWSTR) deviceParameterHandle, + queryTable, + NULL, + NULL); + if (!NT_SUCCESS(status)) { + + *ParameterValue = defaultParameterValue; + } + + // + // close what we open + // + ZwClose(deviceParameterHandle); + } + + return status; + +} // CdRomGetDeviceParameter + + +NTSTATUS +CdRomSetDeviceParameter ( + IN PDEVICE_OBJECT Fdo, + IN PWSTR ParameterName, + IN ULONG ParameterValue + ) +/*++ + +Routine Description: + + save a devnode registry parameter + +Arguments: + + DeviceObject - Cdrom Device Object + + ParameterName - parameter name + + ParameterValuse - parameter value + +Return Value: + + NT Status + +--*/ +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + NTSTATUS status; + HANDLE deviceParameterHandle; + + PAGED_CODE(); + + // + // open the given parameter + // + status = IoOpenDeviceRegistryKey(fdoExtension->LowerPdo, + PLUGPLAY_REGKEY_DRIVER, + KEY_READ | KEY_WRITE, + &deviceParameterHandle); + + if(NT_SUCCESS(status)) { + + status = RtlWriteRegistryValue( + RTL_REGISTRY_HANDLE, + (PWSTR) deviceParameterHandle, + ParameterName, + REG_DWORD, + &ParameterValue, + sizeof (ParameterValue)); + + // + // close what we open + // + ZwClose(deviceParameterHandle); + } + + return status; + +} // CdromSetDeviceParameter + + +VOID +CdRomPickDvdRegion( + IN PDEVICE_OBJECT Fdo + ) +/*++ + +Routine Description: + + pick a default dvd region + +Arguments: + + DeviceObject - Cdrom Device Object + +Return Value: + + NT Status + +--*/ +{ + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + PCDROM_DATA cddata = (PCDROM_DATA)(commonExtension->DriverData); + + // + // these five pointers all point to dvdReadStructure or part of + // its data, so don't deallocate them more than once! + // + + PDVD_READ_STRUCTURE dvdReadStructure; + PDVD_COPY_PROTECT_KEY copyProtectKey; + PDVD_COPYRIGHT_DESCRIPTOR dvdCopyRight; + PDVD_RPC_KEY rpcKey; + PDVD_SET_RPC_KEY dvdRpcKey; + + IO_STATUS_BLOCK ioStatus; + ULONG bufferLen; + UCHAR mediaRegion; + ULONG pickDvdRegion; + ULONG defaultDvdRegion; + ULONG dvdRegion; + + PAGED_CODE(); + + if ((pickDvdRegion = InterlockedExchange(&cddata->PickDvdRegion, 0)) == 0) { + + // + // it was non-zero, so either another thread will do this, or + // we no longer need to pick a region + // + + return; + } + + // + // short-circuit if license agreement violated + // + + if (cddata->DvdRpc0LicenseFailure) { + TraceLog((CdromDebugWarning, + "DVD License failure. Refusing to pick a region\n")); + InterlockedExchange(&cddata->PickDvdRegion, 0); + return; + } + + + ULONG a, b; + + a = max(sizeof(DVD_DESCRIPTOR_HEADER) + + sizeof(DVD_COPYRIGHT_DESCRIPTOR), + sizeof(DVD_READ_STRUCTURE) + ); + b = max(DVD_RPC_KEY_LENGTH, + DVD_SET_RPC_KEY_LENGTH + ); + bufferLen = max(a, b); + + dvdReadStructure = (PDVD_READ_STRUCTURE) + ExAllocatePoolWithTag(PagedPool, bufferLen, DVD_TAG_DVD_REGION); + + if (dvdReadStructure == NULL) { + InterlockedExchange(&cddata->PickDvdRegion, pickDvdRegion); + return; + } + + if (cddata->DvdRpc0Device && cddata->Rpc0RetryRegistryCallback) { + + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion (%p): now retrying RPC0 callback\n", + Fdo)); + + // + // get the registry settings again + // + + ioStatus.Status = CdRomGetRpc0Settings(Fdo); + + if (ioStatus.Status == STATUS_LICENSE_VIOLATION) { + + // + // if this is the returned error, then + // the routine should have set this! + // + + ASSERT(cddata->DvdRpc0LicenseFailure); + cddata->DvdRpc0LicenseFailure = 1; + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion (%p): " + "setting to fail all dvd ioctls due to CSS licensing " + "failure.\n", Fdo)); + + pickDvdRegion = 0; + goto getout; + + } + + // + // get the device region, again + // + + copyProtectKey = (PDVD_COPY_PROTECT_KEY)dvdReadStructure; + RtlZeroMemory(copyProtectKey, bufferLen); + copyProtectKey->KeyLength = DVD_RPC_KEY_LENGTH; + copyProtectKey->KeyType = DvdGetRpcKey; + + // + // Build a request for READ_KEY + // + + ClassSendDeviceIoControlSynchronous( + IOCTL_DVD_READ_KEY, + Fdo, + copyProtectKey, + DVD_RPC_KEY_LENGTH, + DVD_RPC_KEY_LENGTH, + FALSE, + &ioStatus); + + if (!NT_SUCCESS(ioStatus.Status)) { + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion: Unable to get " + "device RPC data (%x)\n", ioStatus.Status)); + pickDvdRegion = 0; + goto getout; + } + + // + // now that we have gotten the device's RPC data, + // we have set the device extension to usable data. + // no need to call back into this section of code again + // + + cddata->Rpc0RetryRegistryCallback = 0; + + + rpcKey = (PDVD_RPC_KEY) copyProtectKey->KeyData; + + // + // TypeCode of zero means that no region has been set. + // + + if (rpcKey->TypeCode != 0) { + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion (%p): DVD Region already " + "chosen\n", Fdo)); + pickDvdRegion = 0; + goto getout; + } + + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion (%p): must choose initial DVD " + " Region\n", Fdo)); + } + + + + copyProtectKey = (PDVD_COPY_PROTECT_KEY) dvdReadStructure; + + dvdCopyRight = (PDVD_COPYRIGHT_DESCRIPTOR) + ((PDVD_DESCRIPTOR_HEADER) dvdReadStructure)->Data; + + // + // get the media region + // + + RtlZeroMemory (dvdReadStructure, bufferLen); + dvdReadStructure->Format = DvdCopyrightDescriptor; + + // + // Build and send a request for READ_KEY + // + + TraceLog((CdromDebugTrace, + "CdRomPickDvdRegion (%p): Getting Copyright Descriptor\n", + Fdo)); + + ClassSendDeviceIoControlSynchronous( + IOCTL_DVD_READ_STRUCTURE, + Fdo, + dvdReadStructure, + sizeof(DVD_READ_STRUCTURE), + sizeof (DVD_DESCRIPTOR_HEADER) + + sizeof(DVD_COPYRIGHT_DESCRIPTOR), + FALSE, + &ioStatus + ); + TraceLog((CdromDebugTrace, + "CdRomPickDvdRegion (%p): Got Copyright Descriptor %x\n", + Fdo, ioStatus.Status)); + + if ((NT_SUCCESS(ioStatus.Status)) && + (dvdCopyRight->CopyrightProtectionType == 0x01) + ) { + + // + // keep the media region bitmap around + // a 1 means ok to play + // + + if (dvdCopyRight->RegionManagementInformation == 0xff) { + TraceLog((CdromDebugError, + "CdRomPickDvdRegion (%p): RegionManagementInformation " + "is set to dis-allow playback for all regions. This is " + "most likely a poorly authored disc. defaulting to all " + "region disc for purpose of choosing initial region\n", + Fdo)); + dvdCopyRight->RegionManagementInformation = 0; + } + + + mediaRegion = ~dvdCopyRight->RegionManagementInformation; + + } else { + + // + // could be media, can't set the device region + // + + if (!cddata->DvdRpc0Device) { + + // + // can't automatically pick a default region on a rpc2 drive + // without media, so just exit + // + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion (%p): failed to auto-choose " + "a region due to status %x getting copyright " + "descriptor\n", Fdo, ioStatus.Status)); + goto getout; + + } else { + + // + // for an RPC0 drive, we can try to pick a region for + // the drive + // + + mediaRegion = 0x0; + } + + } + + // + // get the device region + // + + RtlZeroMemory (copyProtectKey, bufferLen); + copyProtectKey->KeyLength = DVD_RPC_KEY_LENGTH; + copyProtectKey->KeyType = DvdGetRpcKey; + + // + // Build and send a request for READ_KEY for RPC key + // + + TraceLog((CdromDebugTrace, + "CdRomPickDvdRegion (%p): Getting RpcKey\n", + Fdo)); + ClassSendDeviceIoControlSynchronous( + IOCTL_DVD_READ_KEY, + Fdo, + copyProtectKey, + DVD_RPC_KEY_LENGTH, + DVD_RPC_KEY_LENGTH, + FALSE, + &ioStatus + ); + TraceLog((CdromDebugTrace, + "CdRomPickDvdRegion (%p): Got RpcKey %x\n", + Fdo, ioStatus.Status)); + + if (!NT_SUCCESS(ioStatus.Status)) { + + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion (%p): failed to get RpcKey from " + "a DVD Device\n", Fdo)); + goto getout; + + } + + // + // so we now have what we can get for the media region and the + // drive region. we will not set a region if the drive has one + // set already (mask is not all 1's), nor will we set a region + // if there are no more user resets available. + // + + rpcKey = (PDVD_RPC_KEY) copyProtectKey->KeyData; + + + if (rpcKey->RegionMask != 0xff) { + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion (%p): not picking a region since " + "it is already chosen\n", Fdo)); + goto getout; + } + + if (rpcKey->UserResetsAvailable <= 1) { + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion (%p): not picking a region since " + "only one change remains\n", Fdo)); + goto getout; + } + + defaultDvdRegion = 0; + + // + // the proppage dvd class installer sets + // this key based upon the system locale + // + + CdRomGetDeviceParameter ( + Fdo, + DVD_DEFAULT_REGION, + &defaultDvdRegion + ); + + if (defaultDvdRegion > DVD_MAX_REGION) { + + // + // the registry has a bogus default + // + + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion (%p): registry has a bogus default " + "region value of %x\n", Fdo, defaultDvdRegion)); + defaultDvdRegion = 0; + + } + + // + // if defaultDvdRegion == 0, it means no default. + // + + // + // we will select the initial dvd region for the user + // + + if ((defaultDvdRegion != 0) && + (mediaRegion & + (1 << (defaultDvdRegion - 1)) + ) + ) { + + // + // first choice: + // the media has region that matches + // the default dvd region. + // + + dvdRegion = (1 << (defaultDvdRegion - 1)); + + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion (%p): Choice #1: media matches " + "drive's default, chose region %x\n", Fdo, dvdRegion)); + + + } else if (mediaRegion) { + + // + // second choice: + // pick the lowest region number + // from the media + // + + UCHAR mask; + + mask = 1; + dvdRegion = 0; + while (mediaRegion && !dvdRegion) { + + // + // pick the lowest bit + // + dvdRegion = mediaRegion & mask; + mask <<= 1; + } + + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion (%p): Choice #2: choosing lowest " + "media region %x\n", Fdo, dvdRegion)); + + } else if (defaultDvdRegion) { + + // + // third choice: + // default dvd region from the dvd class installer + // + + dvdRegion = (1 << (defaultDvdRegion - 1)); + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion (%p): Choice #3: using default " + "region for this install %x\n", Fdo, dvdRegion)); + + } else { + + // + // unable to pick one for the user -- this should rarely + // happen, since the proppage dvd class installer sets + // the key based upon the system locale + // + TraceLog((CdromDebugWarning, + "CdRomPickDvdRegion (%p): Choice #4: failed to choose " + "a media region\n", Fdo)); + goto getout; + + } + + // + // now that we've chosen a region, set the region by sending the + // appropriate request to the drive + // + + RtlZeroMemory (copyProtectKey, bufferLen); + copyProtectKey->KeyLength = DVD_SET_RPC_KEY_LENGTH; + copyProtectKey->KeyType = DvdSetRpcKey; + dvdRpcKey = (PDVD_SET_RPC_KEY) copyProtectKey->KeyData; + dvdRpcKey->PreferredDriveRegionCode = (UCHAR) ~dvdRegion; + + // + // Build and send request for SEND_KEY + // + TraceLog((CdromDebugTrace, + "CdRomPickDvdRegion (%p): Sending new Rpc Key to region %x\n", + Fdo, dvdRegion)); + + ClassSendDeviceIoControlSynchronous( + IOCTL_DVD_SEND_KEY2, + Fdo, + copyProtectKey, + DVD_SET_RPC_KEY_LENGTH, + 0, + FALSE, + &ioStatus); + TraceLog((CdromDebugTrace, + "CdRomPickDvdRegion (%p): Sent new Rpc Key %x\n", + Fdo, ioStatus.Status)); + + if (!NT_SUCCESS(ioStatus.Status)) { + DebugPrint ((1, "CdRomPickDvdRegion (%p): unable to set dvd initial " + " region code (%p)\n", Fdo, ioStatus.Status)); + } else { + DebugPrint ((1, "CdRomPickDvdRegion (%p): Successfully set dvd " + "initial region\n", Fdo)); + pickDvdRegion = 0; + } + +getout: + if (dvdReadStructure) { + ExFreePool (dvdReadStructure); + } + + // + // update the new PickDvdRegion value + // + + InterlockedExchange(&cddata->PickDvdRegion, pickDvdRegion); + + return; +} + + +NTSTATUS +CdRomRetryRequest( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PIRP Irp, + IN ULONG Delay, + IN BOOLEAN ResendIrp + ) +{ + PCDROM_DATA cdData; + KIRQL oldIrql; + + if(Delay == 0) { + return CdRomRerunRequest(FdoExtension, Irp, ResendIrp); + } + + cdData = FdoExtension->CommonExtension.DriverData; + + KeAcquireSpinLock(&(cdData->DelayedRetrySpinLock), &oldIrql); + + ASSERT(cdData->DelayedRetryIrp == NULL); + ASSERT(cdData->DelayedRetryInterval == 0); + + cdData->DelayedRetryIrp = Irp; + cdData->DelayedRetryInterval = Delay; + cdData->DelayedRetryResend = ResendIrp; + + KeReleaseSpinLock(&(cdData->DelayedRetrySpinLock), oldIrql); + + return STATUS_PENDING; +} + + +NTSTATUS +CdRomRerunRequest( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN OPTIONAL PIRP Irp, + IN BOOLEAN ResendIrp + ) +{ + if(ResendIrp) { + return IoCallDriver(FdoExtension->CommonExtension.LowerDeviceObject, + Irp); + } else { + KIRQL oldIrql; + + oldIrql = KeRaiseIrqlToDpcLevel(); + CdRomStartIo(FdoExtension->DeviceObject, Irp); + KeLowerIrql(oldIrql); + return STATUS_MORE_PROCESSING_REQUIRED; + } +} + + +/*++ + +Routine Description: + + This routine just checks for media change sense/asc/ascq and + also for other events, such as bus resets. this is used to + determine if the device behaviour has changed, to allow for + read and write operations to be allowed and/or disallowed. + +Arguments: + + ISSUE-2000/3/30-henrygab - not fully doc'd + +Return Value: + + NTSTATUS + +--*/ +NTSTATUS +CdRomMmcErrorHandler( + IN PDEVICE_OBJECT Fdo, + IN PSCSI_REQUEST_BLOCK Srb, + OUT PNTSTATUS Status, + OUT PBOOLEAN Retry + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + BOOLEAN queryCapabilities = FALSE; + + if (TEST_FLAG(Srb->SrbStatus, SRB_STATUS_AUTOSENSE_VALID)) { + + PCDROM_DATA cddata = (PCDROM_DATA)commonExtension->DriverData; + PSENSE_DATA senseBuffer = Srb->SenseInfoBuffer; + + // + // the following sense keys could indicate a change in + // capabilities. + // + + // + // we used to expect this to be serialized, and only hit from our + // own routine. we now allow some requests to continue during our + // processing of the capabilities update in order to allow + // IoReadPartitionTable() to succeed. + // + + switch (senseBuffer->SenseKey & 0xf) { + + case SCSI_SENSE_NOT_READY: { + if (senseBuffer->AdditionalSenseCode == + SCSI_ADSENSE_NO_MEDIA_IN_DEVICE) { + + if (cddata->Mmc.WriteAllowed) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromErrorHandler: media removed, writes will be " + "failed until new media detected\n")); + } + + // NOTE - REF #0002 + cddata->Mmc.WriteAllowed = FALSE; + } else + if ((senseBuffer->AdditionalSenseCode == SCSI_ADSENSE_LUN_NOT_READY) && + (senseBuffer->AdditionalSenseCodeQualifier == + SCSI_SENSEQ_BECOMING_READY)) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromErrorHandler: media becoming ready, " + "SHOULD notify shell of change time by sending " + "GESN request immediately!\n")); + } + break; + } // end SCSI_SENSE_NOT_READY + + case SCSI_SENSE_UNIT_ATTENTION: { + switch (senseBuffer->AdditionalSenseCode) { + case SCSI_ADSENSE_MEDIUM_CHANGED: { + + // + // always update if the medium may have changed + // + + // NOTE - REF #0002 + cddata->Mmc.WriteAllowed = FALSE; + InterlockedCompareExchange(&(cddata->Mmc.UpdateState), + CdromMmcUpdateRequired, + CdromMmcUpdateComplete); + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromErrorHandler: media change detected, need to " + "update drive capabilities\n")); + break; + + } // end SCSI_ADSENSE_MEDIUM_CHANGED + + case SCSI_ADSENSE_BUS_RESET: { + + // NOTE - REF #0002 + cddata->Mmc.WriteAllowed = FALSE; + InterlockedCompareExchange(&(cddata->Mmc.UpdateState), + CdromMmcUpdateRequired, + CdromMmcUpdateComplete); + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromErrorHandler: bus reset detected, need to " + "update drive capabilities\n")); + break; + + } // end SCSI_ADSENSE_BUS_RESET + + case SCSI_ADSENSE_OPERATOR_REQUEST: { + + BOOLEAN b = FALSE; + + switch (senseBuffer->AdditionalSenseCodeQualifier) { + case SCSI_SENSEQ_MEDIUM_REMOVAL: { + + // + // eject notification currently handled by classpnp + // + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromErrorHandler: Eject requested by user\n")); + *Retry = TRUE; + *Status = STATUS_DEVICE_BUSY; + break; + } + + case SCSI_SENSEQ_WRITE_PROTECT_DISABLE: + b = TRUE; + case SCSI_SENSEQ_WRITE_PROTECT_ENABLE: { + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromErrorHandler: Write protect %s requested " + "by user\n", + (b ? "disable" : "enable"))); + *Retry = TRUE; + *Status = STATUS_DEVICE_BUSY; + // NOTE - REF #0002 + cddata->Mmc.WriteAllowed = FALSE; + InterlockedCompareExchange(&(cddata->Mmc.UpdateState), + CdromMmcUpdateRequired, + CdromMmcUpdateComplete); + + } + + } // end of AdditionalSenseCodeQualifier switch + + + break; + + } // end SCSI_ADSENSE_OPERATOR_REQUEST + + default: { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromErrorHandler: Unit attention %02x/%02x\n", + senseBuffer->AdditionalSenseCode, + senseBuffer->AdditionalSenseCodeQualifier)); + break; + } + + } // end of AdditionSenseCode switch + break; + + } // end SCSI_SENSE_UNIT_ATTENTION + + case SCSI_SENSE_ILLEGAL_REQUEST: { + if (senseBuffer->AdditionalSenseCode == + SCSI_ADSENSE_WRITE_PROTECT) { + + if (cddata->Mmc.WriteAllowed) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromErrorHandler: media was writable, but " + "failed request with WRITE_PROTECT error...\n")); + } + // NOTE - REF #0002 + // do not update all the capabilities just because + // we can't write to the disc. + cddata->Mmc.WriteAllowed = FALSE; + } + break; + } // end SCSI_SENSE_ILLEGAL_REQUEST + + } // end of SenseKey switch + + } // end of SRB_STATUS_AUTOSENSE_VALID + + return STATUS_SUCCESS; +} + +/*++ + +Routine Description: + + This routine checks for a device-specific error handler + and calls it if it exists. This allows multiple drives + that require their own error handler to co-exist. + +--*/ +VOID +CdRomErrorHandler( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + NTSTATUS *Status, + BOOLEAN *Retry + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PCDROM_DATA cddata = (PCDROM_DATA)commonExtension->DriverData; + PSENSE_DATA sense = Srb->SenseInfoBuffer; + + if ((Srb->SenseInfoBufferLength >= + RTL_SIZEOF_THROUGH_FIELD(SENSE_DATA,AdditionalSenseCodeQualifier)) && + TEST_FLAG(Srb->SrbStatus, SRB_STATUS_AUTOSENSE_VALID)) { + + // + // Many non-WHQL certified drives (mostly CD-RW) return + // 2/4/0 when they have no media instead of the obvious + // choice of: + // + // SCSI_SENSE_NOT_READY/SCSI_ADSENSE_NO_MEDIA_IN_DEVICE + // + // These drives should not pass WHQL certification due + // to this discrepency. + // + // However, we have to retry on 2/4/0 (Not ready, LUN not ready, + // no info) and also 3/2/0 (no seek complete). + // + // These conditions occur when the shell tries to examine an + // injected CD (e.g. for autoplay) before the CD is spun up. + // + // The drive should be returning an ASCQ of SCSI_SENSEQ_BECOMING_READY + // (0x01) in order to comply with WHQL standards. + // + // The default retry timeout of one second is acceptable to balance + // these discrepencies. don't modify the status, though.... + // + + if (((sense->SenseKey & 0xf) == SCSI_SENSE_NOT_READY) && + (sense->AdditionalSenseCode == SCSI_ADSENSE_LUN_NOT_READY) && + (sense->AdditionalSenseCodeQualifier == SCSI_SENSEQ_CAUSE_NOT_REPORTABLE) + ) { + + *Retry = TRUE; + + } else if (((sense->SenseKey & 0xf) == SCSI_SENSE_MEDIUM_ERROR) && + (sense->AdditionalSenseCode == 0x2) && + (sense->AdditionalSenseCodeQualifier == 0x0) + ) { + + *Retry = TRUE; + + } else if ((sense->AdditionalSenseCode == 0x57) && + (sense->AdditionalSenseCodeQualifier == 0x00) + ) { + + // + // UNABLE_TO_RECOVER_TABLE_OF_CONTENTS + // the Matshita CR-585 returns this for all read commands + // on blank CD-R and CD-RW media, and we need to handle + // this for READ_CD detection ability. + // + + *Retry = FALSE; + *Status = STATUS_UNRECOGNIZED_MEDIA; + + } + + } + + // + // tail recursion in both cases takes no stack + // + + if (cddata->ErrorHandler) { + cddata->ErrorHandler(DeviceObject, Srb, Status, Retry); + } + return; +} + + +/*++ + +Routine Description: + + This routine is called for a shutdown and flush IRPs. + These are sent by the system before it actually shuts + down or when the file system does a flush. + +Arguments: + + DriverObject - Pointer to device object to being shutdown by system. + + Irp - IRP involved. + +Return Value: + + NT Status + +--*/ +NTSTATUS +CdRomShutdownFlush( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + return STATUS_PENDING; + +} + +/*++ + +Routine Description: + + This routine is called for intermediate work a shutdown or + flush IRPs would need to do. We just want to free our resources + and return STATUS_MORE_PROCESSING_REQUIRED. + +Arguments: + + DeviceObject - NULL? + + Irp - IRP to free + + Context - NULL + +Return Value: + + NT Status + +--*/ +NTSTATUS +CdRomShutdownFlushCompletion( + IN PDEVICE_OBJECT Fdo, + IN PIRP NewIrp, + IN PIRP OriginalIrp + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PIO_STACK_LOCATION originalIrpStack; + ULONG_PTR iteration; + NTSTATUS status = STATUS_SUCCESS; + + ASSERT(OriginalIrp); + + originalIrpStack = IoGetCurrentIrpStackLocation(OriginalIrp); + + // + // always use a new irp so we can call + // CdRomCompleteIrpAndStartNextPacketSafely() from this routine. + // + + if (NewIrp != NULL) { + status = NewIrp->IoStatus.Status; + IoFreeIrp(NewIrp); + NewIrp = NULL; + } + + if (!NT_SUCCESS(status)) { + BAIL_OUT(OriginalIrp); + goto SafeExit; + } + + // + // the current irpstack saves the counter which states + // what part of the multi-part shutdown or flush we are in. + // + + iteration = (ULONG_PTR)originalIrpStack->Parameters.Others.Argument1; + iteration++; + originalIrpStack->Parameters.Others.Argument1 = (PVOID)iteration; + + switch (iteration) { + case 2: + if (originalIrpStack->MajorFunction != IRP_MJ_SHUTDOWN) { + // + // then we don't want to send the unlock command + // the incrementing of the state was done above. + // return the completion routine's result. + // + return CdRomShutdownFlushCompletion(Fdo, NULL, OriginalIrp); + } + // else fall through.... + + case 1: { + + PIRP newIrp = NULL; + PSCSI_REQUEST_BLOCK newSrb = NULL; + PCDB newCdb = NULL; + PIO_STACK_LOCATION newIrpStack = NULL; + ULONG isRemoved; + + newIrp = IoAllocateIrp((CCHAR)(Fdo->StackSize+1), FALSE); + if (newIrp == NULL) { + BAIL_OUT(OriginalIrp); + status = STATUS_INSUFFICIENT_RESOURCES; + goto SafeExit; + } + newSrb = ExAllocatePoolWithTag(NonPagedPool, + sizeof(SCSI_REQUEST_BLOCK), + CDROM_TAG_SRB); + if (newSrb == NULL) { + IoFreeIrp(newIrp); + BAIL_OUT(OriginalIrp); + status = STATUS_INSUFFICIENT_RESOURCES; + goto SafeExit; + } + + // + // ClassIoComplete will free the SRB, but we need a routine + // that will free the irp. then just call ClassSendAsync, + // and don't care about the return value, since the completion + // routine will be called anyways. + // + + IoSetNextIrpStackLocation(newIrp); + newIrpStack = IoGetCurrentIrpStackLocation(newIrp); + newIrpStack->DeviceObject = Fdo; + IoSetCompletionRoutine(newIrp, + CdRomShutdownFlushCompletion, + OriginalIrp, + TRUE, TRUE, TRUE); + IoSetNextIrpStackLocation(newIrp); + newIrpStack = IoGetCurrentIrpStackLocation(newIrp); + newIrpStack->DeviceObject = Fdo; + + // + // setup the request + // + + RtlZeroMemory(newSrb, sizeof(SCSI_REQUEST_BLOCK)); + newCdb = (PCDB)(newSrb->Cdb); + + newSrb->QueueTag = SP_UNTAGGED; + newSrb->QueueAction = SRB_SIMPLE_TAG_REQUEST; + newSrb->Function = SRB_FUNCTION_EXECUTE_SCSI; + + // + // tell classpnp not to call StartNextPacket() + // + + newSrb->SrbFlags = SRB_FLAGS_DONT_START_NEXT_PACKET; + + if (iteration == 1) { + + // + // first synchronize the cache + // + + newSrb->TimeOutValue = fdoExtension->TimeOutValue * 4; + newSrb->CdbLength = 10; + newCdb->SYNCHRONIZE_CACHE10.OperationCode = SCSIOP_SYNCHRONIZE_CACHE; + + } else if (iteration == 2) { + + // + // then unlock the medium + // + + ASSERT( originalIrpStack->MajorFunction == IRP_MJ_SHUTDOWN ); + + newSrb->TimeOutValue = fdoExtension->TimeOutValue; + newSrb->CdbLength = 6; + newCdb->MEDIA_REMOVAL.OperationCode = SCSIOP_MEDIUM_REMOVAL; + newCdb->MEDIA_REMOVAL.Prevent = FALSE; + + } + + + isRemoved = ClassAcquireRemoveLock(Fdo, newIrp); + if (isRemoved) { + IoFreeIrp(newIrp); + ExFreePool(newSrb); + ClassReleaseRemoveLock(Fdo, newIrp); + BAIL_OUT(OriginalIrp); + status = STATUS_DEVICE_DOES_NOT_EXIST; + goto SafeExit; + } + ClassSendSrbAsynchronous(Fdo, newSrb, newIrp, NULL, 0, FALSE); + break; + } + + case 3: { + + PSCSI_REQUEST_BLOCK srb; + PIO_STACK_LOCATION nextIrpStack = IoGetNextIrpStackLocation(OriginalIrp); + + // + // forward this request to the device appropriately, + // don't use this completion routine anymore... + // + + srb = ExAllocatePoolWithTag(NonPagedPool, + sizeof(SCSI_REQUEST_BLOCK), + CDROM_TAG_SRB); + if (srb == NULL) { + BAIL_OUT(OriginalIrp); + status = STATUS_INSUFFICIENT_RESOURCES; + goto SafeExit; + } + + RtlZeroMemory(srb, SCSI_REQUEST_BLOCK_SIZE); + srb->Length = SCSI_REQUEST_BLOCK_SIZE; + srb->TimeOutValue = fdoExtension->TimeOutValue * 4; + srb->QueueTag = SP_UNTAGGED; + srb->QueueAction = SRB_SIMPLE_TAG_REQUEST; + srb->SrbFlags = fdoExtension->SrbFlags; + srb->CdbLength = 0; + srb->OriginalRequest = OriginalIrp; + + if (originalIrpStack->MajorFunction == IRP_MJ_SHUTDOWN) { + srb->Function = SRB_FUNCTION_SHUTDOWN; + } else { + srb->Function = SRB_FUNCTION_FLUSH; + } + + // + // Set up IoCompletion routine address. + // + + IoSetCompletionRoutine(OriginalIrp, + ClassIoComplete, + srb, + TRUE, TRUE, TRUE); + + // + // Set the retry count to zero. + // + + originalIrpStack->Parameters.Others.Argument4 = (PVOID) 0; + + // + // Get next stack location and set major function code. + // + + nextIrpStack->MajorFunction = IRP_MJ_SCSI; + + // + // Set up SRB for execute scsi request. + // Save SRB address in next stack for port driver. + // + + nextIrpStack->Parameters.Scsi.Srb = srb; + + // + // Call the port driver to process the request. + // + + IoCallDriver(commonExtension->LowerDeviceObject, OriginalIrp); + + break; + + } + default: { + ASSERT(FALSE); + break; + } + + } // end switch + + status = STATUS_SUCCESS; + +SafeExit: + + if (!NT_SUCCESS(status)) { + OriginalIrp->IoStatus.Status = status; + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, OriginalIrp); + } + + // + // always return STATUS_MORE_PROCESSING_REQUIRED, so noone else tries + // to access the new irp that we free'd.... + // + + return STATUS_MORE_PROCESSING_REQUIRED; + +} // end CdromShutdownFlush() + + +VOID +CdromFakePartitionInfo( + IN PCOMMON_DEVICE_EXTENSION CommonExtension, + IN PIRP Irp + ) +{ + PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(Irp); + ULONG ioctl = currentIrpStack->Parameters.DeviceIoControl.IoControlCode; + PVOID systemBuffer = Irp->AssociatedIrp.SystemBuffer; + + ASSERT(systemBuffer); + + if ((ioctl != IOCTL_DISK_GET_DRIVE_LAYOUT) && + (ioctl != IOCTL_DISK_GET_DRIVE_LAYOUT_EX) && + (ioctl != IOCTL_DISK_GET_PARTITION_INFO) && + (ioctl != IOCTL_DISK_GET_PARTITION_INFO_EX)) { + TraceLog((CdromDebugError, + "CdromFakePartitionInfo: unhandled ioctl %x\n", ioctl)); + Irp->IoStatus.Status = STATUS_INTERNAL_ERROR; + Irp->IoStatus.Information = 0; + CdRomCompleteIrpAndStartNextPacketSafely(CommonExtension->DeviceObject, + Irp); + return; + } + + // + // nothing to fail from this point on, so set the size appropriately + // and set irp's status to success. + // + + TraceLog((CdromDebugWarning, + "CdromFakePartitionInfo: incoming ioctl %x\n", ioctl)); + + + Irp->IoStatus.Status = STATUS_SUCCESS; + switch (ioctl) { + case IOCTL_DISK_GET_DRIVE_LAYOUT: + Irp->IoStatus.Information = FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION, + PartitionEntry[1]); + RtlZeroMemory(systemBuffer, FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION, + PartitionEntry[1])); + break; + case IOCTL_DISK_GET_DRIVE_LAYOUT_EX: + Irp->IoStatus.Information = FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION_EX, + PartitionEntry[1]); + RtlZeroMemory(systemBuffer, FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION_EX, + PartitionEntry[1])); + break; + case IOCTL_DISK_GET_PARTITION_INFO: + Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION); + RtlZeroMemory(systemBuffer, sizeof(PARTITION_INFORMATION)); + break; + case IOCTL_DISK_GET_PARTITION_INFO_EX: + Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION_EX); + RtlZeroMemory(systemBuffer, sizeof(PARTITION_INFORMATION_EX)); + break; + default: + ASSERT(!"Invalid ioctl should not have reached this point\n"); + break; + } + + // + // if we are getting the drive layout, then we need to start by + // adding some of the non-partition stuff that says we have + // exactly one partition available. + // + + + if (ioctl == IOCTL_DISK_GET_DRIVE_LAYOUT) { + + PDRIVE_LAYOUT_INFORMATION layout; + layout = (PDRIVE_LAYOUT_INFORMATION)systemBuffer; + layout->PartitionCount = 1; + layout->Signature = 1; + systemBuffer = (PVOID)(layout->PartitionEntry); + ioctl = IOCTL_DISK_GET_PARTITION_INFO; + + } else if (ioctl == IOCTL_DISK_GET_DRIVE_LAYOUT_EX) { + + PDRIVE_LAYOUT_INFORMATION_EX layoutEx; + layoutEx = (PDRIVE_LAYOUT_INFORMATION_EX)systemBuffer; + layoutEx->PartitionStyle = PARTITION_STYLE_MBR; + layoutEx->PartitionCount = 1; + layoutEx->Mbr.Signature = 1; + systemBuffer = (PVOID)(layoutEx->PartitionEntry); + ioctl = IOCTL_DISK_GET_PARTITION_INFO_EX; + + } + + // + // NOTE: the local var 'ioctl' is now modified to either EX or + // non-EX version. the local var 'systemBuffer' is now pointing + // to the partition information structure. + // + + if (ioctl == IOCTL_DISK_GET_PARTITION_INFO) { + + PPARTITION_INFORMATION partitionInfo; + partitionInfo = (PPARTITION_INFORMATION)systemBuffer; + partitionInfo->RewritePartition = FALSE; + partitionInfo->RecognizedPartition = TRUE; + partitionInfo->PartitionType = PARTITION_FAT32; + partitionInfo->BootIndicator = FALSE; + partitionInfo->HiddenSectors = 0; + partitionInfo->StartingOffset.QuadPart = 0; + partitionInfo->PartitionLength = CommonExtension->PartitionLength; + partitionInfo->PartitionNumber = 0; + + } else { + + PPARTITION_INFORMATION_EX partitionInfo; + partitionInfo = (PPARTITION_INFORMATION_EX)systemBuffer; + partitionInfo->PartitionStyle = PARTITION_STYLE_MBR; + partitionInfo->RewritePartition = FALSE; + partitionInfo->Mbr.RecognizedPartition = TRUE; + partitionInfo->Mbr.PartitionType = PARTITION_FAT32; + partitionInfo->Mbr.BootIndicator = FALSE; + partitionInfo->Mbr.HiddenSectors = 0; + partitionInfo->StartingOffset.QuadPart = 0; + partitionInfo->PartitionLength = CommonExtension->PartitionLength; + partitionInfo->PartitionNumber = 0; + + } + TraceLog((CdromDebugWarning, + "CdromFakePartitionInfo: finishing ioctl %x\n", + currentIrpStack->Parameters.DeviceIoControl.IoControlCode)); + + // + // complete the irp + // + + CdRomCompleteIrpAndStartNextPacketSafely(CommonExtension->DeviceObject, + Irp); + return; + +} + + diff --git a/drivers/storage/class/cdrom_new/cdrom.h b/drivers/storage/class/cdrom_new/cdrom.h new file mode 100644 index 00000000000..7b1a865dcf3 --- /dev/null +++ b/drivers/storage/class/cdrom_new/cdrom.h @@ -0,0 +1,823 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + cdromp.h + +Abstract: + + Private header file for cdrom.sys. This contains private + structure and function declarations as well as constant + values which do not need to be exported. + +Author: + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + +#ifndef __CDROMP_H__ +#define __CDROMP_H__ + +#include "ntddmmc.h" +#include "trace.h" + +extern CLASSPNP_SCAN_FOR_SPECIAL_INFO CdromHackItems[]; + +typedef enum { + CdromDebugError = 0, // always printed + CdromDebugWarning = 1, // set bit 0x00000001 in nt!kd_cdrom_mask + CdromDebugTrace = 2, // set bit 0x00000002 in nt!kd_cdrom_mask + CdromDebugInfo = 3, // set bit 0x00000004 in nt!kd_cdrom_mask +#if 0 + CdromDebug = z, // set bit 0x00000000 in nt!kd_cdrom_mask + CdromDebug = z, // set bit 0x00000000 in nt!kd_cdrom_mask + CdromDebug = z, // set bit 0x00000000 in nt!kd_cdrom_mask + CdromDebug = z, // set bit 0x00000000 in nt!kd_cdrom_mask +#endif + CdromDebugFeatures = 32 // set bit 0x80000000 in nt!kd_cdrom_mask +}; + +#define CDROM_GET_CONFIGURATION_TIMEOUT (0x4) + +#define CDROM_HACK_DEC_RRD (0x00000001) +#define CDROM_HACK_FUJITSU_FMCD_10x (0x00000002) +#define CDROM_HACK_HITACHI_1750 (0x00000004) +#define CDROM_HACK_HITACHI_GD_2000 (0x00000008) +#define CDROM_HACK_TOSHIBA_SD_W1101 (0x00000010) +#define CDROM_HACK_TOSHIBA_XM_3xx (0x00000020) +#define CDROM_HACK_NEC_CDDA (0x00000040) +#define CDROM_HACK_PLEXTOR_CDDA (0x00000080) +#define CDROM_HACK_BAD_GET_CONFIG_SUPPORT (0x00000100) +#define CDROM_HACK_FORCE_READ_CD_DETECTION (0x00000200) +#define CDROM_HACK_READ_CD_SUPPORTED (0x00000400) +#define CDROM_HACK_LOCKED_PAGES (0x80000000) // not a valid flag to save + +#define CDROM_HACK_VALID_FLAGS (0x000007ff) +#define CDROM_HACK_INVALID_FLAGS (~CDROM_HACK_VALID_FLAGS) + + +typedef struct _XA_CONTEXT { + + // + // Pointer to the device object. + // + + PDEVICE_OBJECT DeviceObject; + + // + // Pointer to the original request when + // a mode select must be sent. + // + + PIRP OriginalRequest; + + // + // Pointer to the mode select srb. + // + + PSCSI_REQUEST_BLOCK Srb; +} XA_CONTEXT, *PXA_CONTEXT; + +typedef struct _ERROR_RECOVERY_DATA { + MODE_PARAMETER_HEADER Header; + MODE_PARAMETER_BLOCK BlockDescriptor; + MODE_READ_RECOVERY_PAGE ReadRecoveryPage; +} ERROR_RECOVERY_DATA, *PERROR_RECOVERY_DATA; + +typedef struct _ERROR_RECOVERY_DATA10 { + MODE_PARAMETER_HEADER10 Header10; + MODE_PARAMETER_BLOCK BlockDescriptor10; + MODE_READ_RECOVERY_PAGE ReadRecoveryPage10; +} ERROR_RECOVERY_DATA10, *PERROR_RECOVERY_DATA10; + +// +// CdRom specific addition to device extension. +// + +typedef struct _CDROM_DRIVER_EXTENSION { + ULONG InterlockedCdRomCounter; + PVOID Reserved[3]; +} CDROM_DRIVER_EXTENSION, *PCDROM_DRIVER_EXTENSION; + +#define CdromMmcUpdateComplete 0 +#define CdromMmcUpdateRequired 1 +#define CdromMmcUpdateStarted 2 + +typedef struct _CDROM_MMC_EXTENSION { + + ULONG IsMmc; // allow quick checks + ULONG WriteAllowed; + + LONG UpdateState; + + SLIST_HEADER DelayedIrps; // irps delayed due to + KSPIN_LOCK DelayedLock; // lock for delayed irps + + PIO_WORKITEM CapabilitiesWorkItem; + PIRP CapabilitiesIrp; + PMDL CapabilitiesMdl; + PGET_CONFIGURATION_HEADER CapabilitiesBuffer; + ULONG CapabilitiesBufferSize; + KEVENT CapabilitiesEvent; + SCSI_REQUEST_BLOCK CapabilitiesSrb; + +} CDROM_MMC_EXTENSION, *PCDROM_MMC_EXTENSION; + + +#define CDROM_DRIVER_EXTENSION_ID CdRomAddDevice + +typedef struct _CDROM_DATA { + + // + // Pointer to the cdrom driver extension + // + + PCDROM_DRIVER_EXTENSION DriverExtension; + + + // + // These bits allow detection of when to requery the + // drive's capabilities. + // + + CDROM_MMC_EXTENSION Mmc; + + // + // hack flags for ScanForSpecial routines + // + + ULONG_PTR HackFlags; + + // + // the error handling routines need to be per-device, + // not per-driver.... + // + + PCLASS_ERROR ErrorHandler; + + // + // Indicates whether an audio play operation + // is currently being performed. + // Only thing this does is prevent reads and + // toc requests while playing audio. + // + + BOOLEAN PlayActive; + + // + // Indicates whether the blocksize used for user data + // is 2048 or 2352. + // + + BOOLEAN RawAccess; + + // + // Indicates that this is a DEC RRD cdrom. + // This drive requires software to fix responses + // from the faulty firmware + // + + BOOLEAN IsDecRrd; + + // + // This points to an irp which needs to be delayed for a bit before a + // retry can be attempted. The interval counter is set by the deferring + // routine and will be decremented to zero in the tick handler. Once + // the counter goes to zero the irp will be issued again. + // DelayedRetryResend controls whether the irp is resent to the lower + // driver (TRUE) or reissued into the startio routine (FALSE) + // + + BOOLEAN DelayedRetryResend; + + PIRP DelayedRetryIrp; + + ULONG DelayedRetryInterval; + + KSPIN_LOCK DelayedRetrySpinLock; + + // + // indicate we need to pick a default dvd region + // for the user if we can + // + + ULONG PickDvdRegion; + + // + // The interface strings registered for this device. + // + + UNICODE_STRING CdromInterfaceString; + UNICODE_STRING VolumeInterfaceString; + + // + // The well known name link for this device. + // + + UNICODE_STRING WellKnownName; + + // + // Indicates whether 6 or 10 bytes mode sense/select + // should be used + // + + ULONG XAFlags; + + // + // keep track of what type of DVD device we are + // + + BOOLEAN DvdRpc0Device; + BOOLEAN DvdRpc0LicenseFailure; + UCHAR Rpc0SystemRegion; // bitmask, one means prevent play + UCHAR Rpc0SystemRegionResetCount; + + ULONG Rpc0RetryRegistryCallback; // one until initial region choosen + + KMUTEX Rpc0RegionMutex; + + // + // Storage for the error recovery page. This is used + // as an easy method to switch block sizes. + // + // NOTE - doubly unnamed structs just aren't very clean looking code - this + // should get cleaned up at some point in the future. + // + + union { + ERROR_RECOVERY_DATA; + ERROR_RECOVERY_DATA10; + }; + +} CDROM_DATA, *PCDROM_DATA; + +#define DEVICE_EXTENSION_SIZE sizeof(FUNCTIONAL_DEVICE_EXTENSION) + sizeof(CDROM_DATA) +#define SCSI_CDROM_TIMEOUT 10 +#define SCSI_CHANGER_BONUS_TIMEOUT 10 +#define HITACHI_MODE_DATA_SIZE 12 +#define MODE_DATA_SIZE 64 +#define RAW_SECTOR_SIZE 2352 +#define COOKED_SECTOR_SIZE 2048 +#define CDROM_SRB_LIST_SIZE 4 + +#define PLAY_ACTIVE(x) (((PCDROM_DATA)(x->CommonExtension.DriverData))->PlayActive) + +#define MSF_TO_LBA(Minutes,Seconds,Frames) \ + (ULONG)((60 * 75 * (Minutes)) + (75 * (Seconds)) + ((Frames) - 150)) + +#define LBA_TO_MSF(Lba,Minutes,Seconds,Frames) \ +{ \ + (Minutes) = (UCHAR)(Lba / (60 * 75)); \ + (Seconds) = (UCHAR)((Lba % (60 * 75)) / 75); \ + (Frames) = (UCHAR)((Lba % (60 * 75)) % 75); \ +} + +#define DEC_TO_BCD(x) (((x / 10) << 4) + (x % 10)) + +// +// Define flags for XA, CDDA, and Mode Select/Sense +// + +#define XA_USE_6_BYTE 0x01 +#define XA_USE_10_BYTE 0x02 + +#define XA_NOT_SUPPORTED 0x10 +#define XA_USE_READ_CD 0x20 +#define XA_PLEXTOR_CDDA 0x40 +#define XA_NEC_CDDA 0x80 + +// +// Sector types for READ_CD +// + +#define ANY_SECTOR 0 +#define CD_DA_SECTOR 1 +#define YELLOW_MODE1_SECTOR 2 +#define YELLOW_MODE2_SECTOR 3 +#define FORM2_MODE1_SECTOR 4 +#define FORM2_MODE2_SECTOR 5 + +#define MAX_COPY_PROTECT_AGID 4 + +#ifdef ExAllocatePool +#undef ExAllocatePool +#define ExAllocatePool #assert(FALSE) +#endif + +#define CDROM_TAG_GET_CONFIG 'cCcS' // "ScCc" - ioctl GET_CONFIGURATION +#define CDROM_TAG_DC_EVENT 'ECcS' // "ScCE" - device control synch event +#define CDROM_TAG_FEATURE 'FCcS' // "ScCF" - allocated by CdRomGetConfiguration(), free'd by caller +#define CDROM_TAG_DISK_GEOM 'GCcS' // "ScCG" - disk geometry buffer +#define CDROM_TAG_HITACHI_ERROR 'HCcS' // "ScCH" - hitachi error buffer +#define CDROM_TAG_SENSE_INFO 'ICcS' // "ScCI" - sense info buffers +#define CDROM_TAG_POWER_IRP 'iCcS' // "ScCi" - irp for power request +#define CDROM_TAG_SRB 'SCcS' // "ScCS" - srb allocation +#define CDROM_TAG_STRINGS 'sCcS' // "ScCs" - assorted string data +#define CDROM_TAG_MODE_DATA 'MCcS' // "ScCM" - mode data buffer +#define CDROM_TAG_READ_CAP 'PCcS' // "ScCP" - read capacity buffer +#define CDROM_TAG_PLAY_ACTIVE 'pCcS' // "ScCp" - play active checks +#define CDROM_TAG_SUB_Q 'QCcS' // "ScCQ" - read sub q buffer +#define CDROM_TAG_RAW 'RCcS' // "ScCR" - raw mode read buffer +#define CDROM_TAG_TOC 'TCcS' // "ScCT" - read toc buffer +#define CDROM_TAG_TOSHIBA_ERROR 'tCcS' // "ScCt" - toshiba error buffer +#define CDROM_TAG_DEC_ERROR 'dCcS' // "ScCt" - DEC error buffer +#define CDROM_TAG_UPDATE_CAP 'UCcS' // "ScCU" - update capacity path +#define CDROM_TAG_VOLUME 'VCcS' // "ScCV" - volume control buffer +#define CDROM_TAG_VOLUME_INT 'vCcS' // "ScCv" - volume control buffer + +#define DVD_TAG_READ_STRUCTURE 'SVcS' // "ScVS" - used for dvd structure reads +#define DVD_TAG_READ_KEY 'kVcS' // "ScVk" - read buffer for dvd key +#define DVD_TAG_SEND_KEY 'KVcS' // "ScVK" - write buffer for dvd key +#define DVD_TAG_RPC2_CHECK 'sVcS' // "ScVs" - read buffer for dvd/rpc2 check +#define DVD_TAG_DVD_REGION 'tVcS' // "ScVt" - read buffer for rpc2 check +#define DVD_TAG_SECURITY 'XVcS' // "ScVX" - security descriptor + + +#define CDROM_SUBKEY_NAME (L"CdRom") // store new settings here +#define CDROM_READ_CD_NAME (L"ReadCD") // READ_CD support previously detected +#define CDROM_NON_MMC_DRIVE_NAME (L"NonMmc") // MMC commands hang +// +// DVD Registry Value Names for RPC0 Device +// +#define DVD_DEFAULT_REGION (L"DefaultDvdRegion") // this is init. by the dvd class installer +#define DVD_CURRENT_REGION (L"DvdR") +#define DVD_REGION_RESET_COUNT (L"DvdRCnt") +#define DVD_MAX_REGION_RESET_COUNT 2 +#define DVD_MAX_REGION 8 + + + +#define BAIL_OUT(Irp) \ + DebugPrint((2, "Cdrom: [%p] Bailing with status " \ + " %lx at line %x file %s\n", \ + (Irp), (Irp)->IoStatus.Status, \ + __LINE__, __FILE__)) + + +/*++ + +Routine Description: + + This routine grabs an extra remove lock using a local variable + for a unique tag. It then completes the irp in question, and + the just-acquired removelock guarantees that it is still safe + to call IoStartNextPacket(). When that finishes, we release + the newly acquired RemoveLock and return. + +Arguments: + + DeviceObject - the device object for the StartIo queue + Irp - the request we are completing + +Return Value: + + None + +Notes: + + This is implemented as an inline function to allow the compiler + to optimize this as either a function call or as actual inline code. + + This routine will not work with IoXxxRemoveLock() calls, as the + behavior is different. ClassXxxRemoveLock() calls succeed until + the remove has completed, while IoXxxRemoveLock() calls fail as + soon as the call to IoReleaseRemoveLockAndWait() has been called. + The Class version allows this routine to work in a safe manner. + + replaces the following two lines: + IoStartNextPacket(DeviceObject, FALSE); + ClassReleaseRemoveLock(DeviceObject, Irp); + and raises irql as needed to call IoStartNextPacket() + +--*/ +static inline +VOID +CdRomCompleteIrpAndStartNextPacketSafely( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + UCHAR uniqueAddress; + KIRQL oldIrql = KeGetCurrentIrql(); + + ClassAcquireRemoveLock(DeviceObject, (PIRP)&uniqueAddress); + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_CD_ROM_INCREMENT); + + if (oldIrql > DISPATCH_LEVEL) { + ASSERT(!"Cannot call IoStartNextPacket at raised IRQL!"); + } else if (oldIrql < DISPATCH_LEVEL) { + KeRaiseIrqlToDpcLevel(); + } else { // (oldIrql == DISPATCH_LEVEL) + NOTHING; + } + + IoStartNextPacket(DeviceObject, FALSE); + + if (oldIrql > DISPATCH_LEVEL) { + ASSERT(!"Cannot call IoStartNextPacket at raised IRQL!"); + } else if (oldIrql < DISPATCH_LEVEL) { + KeLowerIrql(oldIrql); + } else { // (oldIrql == DISPATCH_LEVEL) + NOTHING; + } + + ClassReleaseRemoveLock(DeviceObject, (PIRP)&uniqueAddress); + + + return; +} + +VOID +CdRomDeviceControlDvdReadStructure( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP OriginalIrp, + IN PIRP NewIrp, + IN PSCSI_REQUEST_BLOCK Srb + ); + +VOID +CdRomDeviceControlDvdEndSession( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP OriginalIrp, + IN PIRP NewIrp, + IN PSCSI_REQUEST_BLOCK Srb + ); + +VOID +CdRomDeviceControlDvdStartSessionReadKey( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP OriginalIrp, + IN PIRP NewIrp, + IN PSCSI_REQUEST_BLOCK Srb + ); + +VOID +CdRomDeviceControlDvdSendKey( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP OriginalIrp, + IN PIRP NewIrp, + IN PSCSI_REQUEST_BLOCK Srb + ); + + + +NTSTATUS +DriverEntry( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath + ); + +VOID +CdRomUnload( + IN PDRIVER_OBJECT DriverObject + ); + +NTSTATUS +CdRomAddDevice( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT Pdo + ); + +NTSTATUS +CdRomOpenClose( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +CdRomReadWriteVerification( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +CdRomSwitchMode( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN PIRP OriginalRequest + ); + +NTSTATUS +CdRomDeviceControlDispatch( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +CdRomDeviceControlCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ); + +NTSTATUS +CdRomSetVolumeIntermediateCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ); + +NTSTATUS +CdRomSwitchModeCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ); + +NTSTATUS +CdRomXACompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ); + +NTSTATUS +CdRomClassIoctlCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ); + +VOID +CdRomStartIo( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +VOID +CdRomTickHandler( + IN PDEVICE_OBJECT DeviceObject + ); + +NTSTATUS +CdRomUpdateCapacity( + IN PFUNCTIONAL_DEVICE_EXTENSION DeviceExtension, + IN PIRP IrpToComplete, + IN OPTIONAL PKEVENT IoctlEvent + ); + +NTSTATUS +CdRomCreateDeviceObject( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT Pdo + ); + +VOID +ScanForSpecialHandler( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + ULONG_PTR HackFlags + ); + +VOID +ScanForSpecial( + PDEVICE_OBJECT DeviceObject + ); + +BOOLEAN +CdRomIsPlayActive( + IN PDEVICE_OBJECT DeviceObject + ); + +VOID +CdRomErrorHandler( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + NTSTATUS *Status, + BOOLEAN *Retry + ); + +VOID +HitachiProcessErrorGD2000( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + NTSTATUS *Status, + BOOLEAN *Retry + ); + +VOID +HitachiProcessError( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + NTSTATUS *Status, + BOOLEAN *Retry + ); + +VOID +ToshibaProcessError( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + NTSTATUS *Status, + BOOLEAN *Retry + ); + +NTSTATUS +ToshibaProcessErrorCompletion( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID Context + ); + +VOID +CdRomCreateNamedEvent( + IN PFUNCTIONAL_DEVICE_EXTENSION DeviceExtension, + IN ULONG DeviceNumber + ); + +NTSTATUS +CdRomInitDevice( + IN PDEVICE_OBJECT Fdo + ); + +NTSTATUS +CdRomStartDevice( + IN PDEVICE_OBJECT Fdo + ); + +NTSTATUS +CdRomStopDevice( + IN PDEVICE_OBJECT DeviceObject, + IN UCHAR Type + ); + +NTSTATUS +CdRomRemoveDevice( + IN PDEVICE_OBJECT DeviceObject, + IN UCHAR Type + ); + +NTSTATUS +CdRomDvdEndAllSessionsCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ); + +NTSTATUS +CdRomDvdReadDiskKeyCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ); + +DEVICE_TYPE +CdRomGetDeviceType( + IN PDEVICE_OBJECT DeviceObject + ); + +NTSTATUS +CdRomCreateWellKnownName( + IN PDEVICE_OBJECT DeviceObject + ); + +VOID +CdRomDeleteWellKnownName( + IN PDEVICE_OBJECT DeviceObject + ); + +NTSTATUS +CdRomGetDeviceParameter ( + IN PDEVICE_OBJECT DeviceObject, + IN PWSTR ParameterName, + IN OUT PULONG ParameterValue + ); + +NTSTATUS +CdRomSetDeviceParameter ( + IN PDEVICE_OBJECT DeviceObject, + IN PWSTR ParameterName, + IN ULONG ParameterValue + ); + +VOID +CdRomPickDvdRegion ( + IN PDEVICE_OBJECT Fdo +); + +NTSTATUS +CdRomRetryRequest( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PIRP Irp, + IN ULONG Delay, + IN BOOLEAN ResendIrp + ); + +NTSTATUS +CdRomRerunRequest( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN OPTIONAL PIRP Irp, + IN BOOLEAN ResendIrp + ); + +NTSTATUS +CdRomGetRpc0Settings( + IN PDEVICE_OBJECT Fdo + ); + +NTSTATUS +CdRomSetRpc0Settings( + IN PDEVICE_OBJECT Fdo, + IN UCHAR NewRegion + ); + +NTSTATUS +CdRomShutdownFlush( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +//////////////////////////////////////////////////////////////////////////////// + +VOID +CdRomIsDeviceMmcDevice( + IN PDEVICE_OBJECT Fdo, + OUT PBOOLEAN IsMmc + ); + +NTSTATUS +CdRomMmcErrorHandler( + IN PDEVICE_OBJECT Fdo, + IN PSCSI_REQUEST_BLOCK Srb, + OUT PNTSTATUS Status, + OUT PBOOLEAN Retry + ); + +PVOID +CdRomFindFeaturePage( + IN PGET_CONFIGURATION_HEADER FeatureBuffer, + IN ULONG Length, + IN FEATURE_NUMBER Feature + ); + +NTSTATUS +CdRomGetConfiguration( + IN PDEVICE_OBJECT Fdo, + OUT PGET_CONFIGURATION_HEADER *Buffer, + OUT PULONG BytesReturned, + IN FEATURE_NUMBER StartingFeature, + IN ULONG RequestedType + ); + +VOID +CdRomUpdateMmcDriveCapabilities( + IN PDEVICE_OBJECT Fdo, + IN PVOID Context // RESERVED == NULL + ); + +VOID +CdRomFindProfileInProfiles( + IN PFEATURE_DATA_PROFILE_LIST ProfileHeader, + IN FEATURE_PROFILE_TYPE ProfileToFind, + OUT PBOOLEAN Exists + ); + +NTSTATUS +CdRomAllocateMmcResources( + IN PDEVICE_OBJECT Fdo + ); + +VOID +CdRomDeAllocateMmcResources( + IN PDEVICE_OBJECT Fdo + ); + +VOID +CdromFakePartitionInfo( + IN PCOMMON_DEVICE_EXTENSION CommonExtension, + IN PIRP Irp + ); + +VOID +CdRomInterpretReadCapacity( + IN PDEVICE_OBJECT Fdo, + IN PREAD_CAPACITY_DATA ReadCapacityBuffer + ); + +NTSTATUS +CdRomShutdownFlushCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PIRP Context + ); + +VOID +CdRompFlushDelayedList( + IN PDEVICE_OBJECT Fdo, + IN PCDROM_MMC_EXTENSION MmcData, + IN NTSTATUS Status, + IN BOOLEAN CalledFromWorkItem + ); + +#endif // __CDROMP_H__ + + diff --git a/drivers/storage/class/cdrom_new/cdrom.inf b/drivers/storage/class/cdrom_new/cdrom.inf new file mode 100644 index 00000000000..0cf7858e0d3 --- /dev/null +++ b/drivers/storage/class/cdrom_new/cdrom.inf @@ -0,0 +1,344 @@ +; +; cdrom.inf -- INF file for installing CDROM drives +; +; Copyright (c) 1993-1997, Microsoft Corporation + +[Version] +Signature="$WINDOWS NT$" +Class=CDROM +ClassGuid={4D36E965-E325-11CE-BFC1-08002BE10318} +Provider=%DDK_SAMPLE% +DriverVer=03/15/2001,5.1.2462.0 +CatalogFile=ddk_sample.cat + +[cdaudio_copyfiles] +cdaudio.sys + +[changer_copyfiles] +changer.sys + +[cdrom_copyfiles] +cdrom.sys +redbook.sys + +[storprop_copyfiles] +storprop.dll + +[DestinationDirs] +cdrom_copyfiles = 12 +cdaudio_copyfiles = 12 +changer_copyfiles = 12 +storprop_copyfiles = 11 + +[Manufacturer] +%ATAPI_CHGR% = atapi_chgr +%CHINON% = chinon_cdrom +%DENON% = denon_cdrom +%FUJITSU% = fujitsu_cdrom +%HITACHI% = hitachi_cdrom +%HP% = hp_cdrom +%MITSUMI% = mitsumi_cdrom +%NEC% = nec_cdrom +%OTI% = oti_cdrom +%PIONEER% = pioneer_cdrom +%WEARNES% = wearnes_cdrom +%GenManufacturer% = cdrom_device + +[atapi_chgr] +%NecChanger_devdesc% = changer_install,IDE\CdRomNEC_CD-ROM_DRIVE:251____________________ +%NecChanger_devdesc% = changer_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:251 +%NecChanger_devdesc% = changer_install,IDE\CdRomNEC_CD-ROM_DRIVE:253____________________ +%NecChanger_devdesc% = changer_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:253 +%NecChanger_devdesc% = changer_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:252 +%AlpsChanger_devdesc% = changer_install,IDE\CdRomALPS_DC544______________________________ +%TorisanChanger_devdesc% = changer_install,IDE\CdRomTORiSAN_CD-ROM_CDR-C3G__________________ +%TorisanChanger_devdesc% = changer_install,SCSI\CdRomTORiSAN_CD-ROM_CDR-C3G__ +%TorisanChanger_devdesc% = changer_install,IDE\CdRomTORiSAN_CD-ROM_CDR_C36__________________ +%PanasonicChanger_devdesc% = changer_install,IDE\CdRomMATSHITA_RD-DRC001-M____________________ +%PanasonicChanger_devdesc% = changer_install,IDE\CdRomMATSHITA_RD-DRC002-S____________________ +%PanasonicChanger_devdesc% = changer_install,SCSI\CdRomNAKAMICHMJ-5.16_________ + +[fujitsu_cdrom] +%fujitsu_devdesc% = cdaudio_install,SCSI\CdRomFUJITSU_ + +[chinon_cdrom] +%chinon_devdesc% = cdaudio_install,SCSI\CdRomCHINON__ + +[denon_cdrom] +%denon_devdesc% = cdaudio_install,SCSI\CdRomDENON___ + +[hp_cdrom] +%hp_devdesc% = cdaudio_install,SCSI\CdRomHP______C4324/C4325_____ + +[hitachi_cdrom] +%hitachi_devdesc% = cdaudio_install,SCSI\CdRomHITACHI_CDR-3650/1650S__ +%hitachi_devdesc% = cdaudio_install,SCSI\CdRomHITACHI_CDR-1750S_______ + +[mitsumi_cdrom] +%Mitsumi_cdrom_devdesc% = mitsumi_install,IDE\CdRomMITSUMI_CD-ROM________!A________________ + +[nec_cdrom] +%NecMultispin_devdesc% = cdaudio_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:38_ +%NecOem_devdesc% = cdaudio_install,SCSI\CdRomNEC_____CD-ROM_DRIVE_4_M +%NecIntersect_devdesc% = cdaudio_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:80_ +%NecIntersect_devdesc% = cdaudio_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:82_ +%NecIntersect_devdesc% = cdaudio_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:83_ +%NecIntersect_devdesc% = cdaudio_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:84_ +%NecMultispin_devdesc% = cdaudio_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:841 +%NecOem_devdesc% = cdaudio_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:400 +%NecOem_devdesc% = cdaudio_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:401 +%NecOem_devdesc% = cdaudio_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:500 +%NecOem_devdesc% = cdaudio_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:501 +%NecOem_devdesc% = cdaudio_install,SCSI\CdRomNEC_____CD-ROM_DRIVE:900 + +[oti_cdrom] +%oti_devdesc% = cdaudio_install,IDE\CdRomOTI_DOLPHIN_8001_IDE____________________ + +[pioneer_cdrom] +%pioneer_devdesc% = cdaudio_install,SCSI\CdRomPIONEER_CD-ROM_DRM-600__ +%pioneer_devdesc% = cdaudio_install,SCSI\CdRomPIONEER_CD-ROM_DRM-600x_ + +[wearnes_cdrom] +%wearnes_devdesc% = cdaudio_install,IDE\CdRomWEARNES_ + + +[cdrom_device] +;; +;; if none of the above matched, then only cdrom.sys is required for this drive +;; +%gencdrom_devdesc% = cdrom_install,SCSI\WormPIONEER_CD-WO_DR-R504X__ +%gencdrom_devdesc% = cdrom_install,SCSI\WormSONY____CD-R___CDU920S__ +%gencdrom_devdesc% = cdrom_install,SCSI\WormSONY____CD-R___CDU948S__ +%gencdrom_devdesc% = cdrom_install,GenCdRom + +;; +;; Use to add filter drivers for the device +;; + +[cdaudio_addreg] +HKR,,"UpperFilters",0x00010008,"cdaudio" + +[changer_addreg] +HKR,,"UpperFilters",0x00010008,"changer" + +[mitsumi_addreg] +HKR,,"FriendlyName",,%Mitsumi_Generic_FriendlyName% + +;; +;; more addreg sections +;; + +[dvd_property_provider_AddReg] +HKR,,EnumPropPages32,,"storprop.dll,DvdPropPageProvider" + +[autorun_addreg] +;; +;; The AutoRunAlwaysDisable key is only for use when the hardware cannot +;; accepts TEST_UNIT_READY commands. Disabling 'AutoRun' or including +;; devices in this list will prevent removable media services from being +;; able to properly handle these devices. +;; +HKLM,"System\CurrentControlSet\Services\cdrom","AutoRun",0x00010003,1 +HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable",\ + 0x00010000,\ + "NEC MBR-7 ", \ + "NEC MBR-7.4 ", \ + "PIONEER CHANGR DRM-1804X", \ + "PIONEER CD-ROM DRM-6324X", \ + "PIONEER CD-ROM DRM-624X ", \ + "TORiSAN CD-ROM CDR_C36" + +;; +;; Use to disable synchronous transfers to this device. Sync transfers will +;; always be turned off by default in this INF for any cdrom-type device +;; +[nosync_addreg] +HKR,,"DefaultRequestFlags",0x00010001,8 + +;; +;; Installation section for cdaudio. Sets cdrom as the service and adds +;; cdaudio as an upper filter +;; + +[cdaudio_install] +CopyFiles=cdaudio_copyfiles,cdrom_copyfiles,storprop_copyfiles +AddReg=dvd_property_provider_AddReg + +[cdaudio_install.HW] +AddReg=nosync_addreg,cdaudio_addreg + +[cdaudio_install.Services] +AddService=cdrom,0x00000002,cdrom_ServiceInstallSection +AddService=cdaudio,,cdaudio_ServiceInstallSection +AddService=redbook,,redbook_ServiceInstallSection,redbook_InstallEventLogSection + +;; +;; Installation section for changer +;; + +[changer_install] +CopyFiles=changer_copyfiles,cdrom_copyfiles,storprop_copyfiles +AddReg=dvd_property_provider_AddReg + +[changer_install.HW] +AddReg=changer_addreg + +[changer_install.Services] +AddService=cdrom,0x00000002,cdrom_ServiceInstallSection +AddService=changer,,changer_ServiceInstallSection +AddService=redbook,,redbook_ServiceInstallSection,redbook_InstallEventLogSection + +;; +;; Installation section for mitsumi. +;; + +[mitsumi_install] +CopyFiles=cdrom_copyfiles,storprop_copyfiles +AddReg=dvd_property_provider_AddReg + +[mitsumi_install.HW] +AddReg=nosync_addreg,mitsumi_addreg + +[mitsumi_install.Services] +AddService=cdrom,0x00000002,cdrom_ServiceInstallSection +AddService=redbook,,redbook_ServiceInstallSection,redbook_InstallEventLogSection + +;; +;; Installation section for generic cdrom. +;; + +[cdrom_install] +CopyFiles=cdrom_copyfiles,storprop_copyfiles +AddReg=dvd_property_provider_AddReg + +[cdrom_install.HW] +AddReg=nosync_addreg + +[cdrom_install.Services] +AddService=cdrom,0x00000002,cdrom_ServiceInstallSection +AddService=redbook,,redbook_ServiceInstallSection,redbook_InstallEventLogSection + +;; +;; Service install sections for cdrom and cdaudio +;; + +[cdrom_ServiceInstallSection] +DisplayName = %cdrom_ServiceDesc% +ServiceType = 1 +StartType = 1 +ErrorControl = 1 +ServiceBinary = %12%\cdrom.sys +LoadOrderGroup = SCSI CDROM Class +AddReg=autorun_addreg + +[cdaudio_ServiceInstallSection] +DisplayName = %cdaudio_ServiceDesc% +ServiceType = 1 +StartType = 1 +ErrorControl = 1 +ServiceBinary = %12%\cdaudio.sys +LoadOrderGroup = Pnp Filter + +[changer_ServiceInstallSection] +DisplayName = %changer_ServiceDesc% +ServiceType = 1 +StartType = 1 +ErrorControl = 1 +ServiceBinary = %12%\changer.sys +LoadOrderGroup = Pnp Filter + +[redbook_ServiceInstallSection] +DisplayName = %redbook_ServiceDesc% +ServiceType = 1 +StartType = 1 +ErrorControl = 1 +ServiceBinary = %12%\redbook.sys +LoadOrderGroup = Pnp Filter + +[redbook_InstallEventLogSection] +AddReg = redbook_EventLog_addreg + +[redbook_EventLog_addreg] +HKR,,"EventMessageFile",0x00020000,"%%SystemRoot%%\System32\IoLogMsg.dll;%%SystemRoot%%\System32\drivers\redbook.sys" +HKR,,"TypesSupported",0x00010001,7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Strings] +DDK_SAMPLE="DDK Sample Provider" +CDClassName = "DVD/CD-ROM drives" + +;; Manufacturer specific strings +ATAPI_CHGR = "Atapi 2.5 Changer Devices" +CHINON = "Chinon" +DENON = "Denon" +FUJITSU = "Fujitsu" +HITACHI = "Hitachi" +HP = "Hewlett Packard" +MITSUMI = "Mitsumi" +NEC = "NEC" +OTI = "OTI" +PIONEER = "Pioneer" +WEARNES = "Wearnes" +GenManufacturer = "(Standard CD-ROM drives)" + +;; Descriptions for enumerated brands and models +AlpsChanger_devdesc = "Alps CD-ROM Changer" +chinon_devdesc = "Chinon CD-ROM Drive" +denon_devdesc = "Denon CD-ROM Drive" +fujitsu_devdesc = "Fujitsu CD-ROM Drive" +hp_devdesc = "Hewlett Packard CD-ROM Drive" +hitachi_devdesc = "Hitachi CD-ROM Drive" +Mitsumi_cdrom_devdesc = "Mitsumi CD-ROM Drive" +NecChanger_devdesc = "NEC CD-ROM Changer" +NecIntersect_devdesc = "NEC Intersect CD-ROM Drive" +NecMultispin_devdesc = "NEC Multispin CD-ROM Drive" +NecOem_devdesc = "NEC CD-ROM Drive" +oti_devdesc = "OTI CD-ROM Drive" +PanasonicChanger_devdesc = "Panasonic CD-ROM Changer" +pioneer_devdesc = "Pioneer CD-ROM Drive" +TorisanChanger_devdesc = "Torisan CD-ROM Changer" +wearnes_devdesc = "Wearnes CD-ROM Drive" +gencdrom_devdesc = "CD-ROM Drive" + +;; Mitsumi Friendly name explictly listed +Mitsumi_Generic_FriendlyName = "Mitsumi CD-ROM Drive" + +;; Service descriptions +cdrom_ServiceDesc = "CD-ROM Driver" +cdaudio_ServiceDesc = "CD-Audio Filter Driver" +changer_ServiceDesc = "CD-Changer Filter Driver" +redbook_ServiceDesc = "Digital CD Audio Playback Filter Driver" + + diff --git a/drivers/storage/class/cdrom_new/cdrom_new.rbuild b/drivers/storage/class/cdrom_new/cdrom_new.rbuild new file mode 100644 index 00000000000..3969aedb585 --- /dev/null +++ b/drivers/storage/class/cdrom_new/cdrom_new.rbuild @@ -0,0 +1,20 @@ + + + + + ntoskrnl + hal + classpnp + ../inc + + -mrtd + -fno-builtin + -w + + cdrom.c + data.c + ioctl.c + mmc.c + scsicdrm.rc + sec.c + diff --git a/drivers/storage/class/cdrom_new/data.c b/drivers/storage/class/cdrom_new/data.c new file mode 100644 index 00000000000..02d4239bf95 --- /dev/null +++ b/drivers/storage/class/cdrom_new/data.c @@ -0,0 +1,99 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + +Abstract: + + +Environment: + + +Notes: + +Revision History: + +--*/ + +#include "ntddk.h" +#include "classpnp.h" +#include "trace.h" + +#ifdef ALLOC_DATA_PRAGMA +#pragma data_seg("PAGE") +#endif + +/* + +#define CDROM_HACK_DEC_RRD (0x00000001) +#define CDROM_HACK_FUJITSU_FMCD_10x (0x00000002) +#define CDROM_HACK_HITACHI_1750 (0x00000004) +#define CDROM_HACK_HITACHI_GD_2000 (0x00000008) +#define CDROM_HACK_TOSHIBA_SD_W1101 (0x00000010) +#define CDROM_HACK_TOSHIBA_XM_3xx (0x00000020) +#define CDROM_HACK_NEC_CDDA (0x00000040) +#define CDROM_HACK_PLEXTOR_CDDA (0x00000080) +#define CDROM_HACK_BAD_GET_CONFIG_SUPPORT (0x00000100) +#define CDROM_HACK_FORCE_READ_CD_DETECTION (0x00000200) +#define CDROM_HACK_READ_CD_SUPPORTED (0x00000400) + +*/ + +CLASSPNP_SCAN_FOR_SPECIAL_INFO CdromHackItems[] = { + // digital put out drives using 512 byte block sizes, + // and needed us to send a mode page to set the sector + // size back to 2048. + { "DEC" , "RRD" , NULL, 0x0001 }, + // these fujitsu drives take longer than ten seconds to + // timeout commands when audio discs are placed in them + { "FUJITSU" , "FMCD-101" , NULL, 0x0002 }, + { "FUJITSU" , "FMCD-102" , NULL, 0x0002 }, + // these hitachi drives don't work properly in PIO mode + { "HITACHI ", "CDR-1750S" , NULL, 0x0004 }, + { "HITACHI ", "CDR-3650/1650S" , NULL, 0x0004 }, + // this particular gem doesn't automatcially spin up + // on some media access commands. + { "" , "HITACHI GD-2000" , NULL, 0x0008 }, + { "" , "HITACHI DVD-ROM GD-2000" , NULL, 0x0008 }, + // this particular drive doesn't support DVD playback. + // just print an error message in CHK builds. + { "TOSHIBA ", "SD-W1101 DVD-RAM" , NULL, 0x0010 }, + // not sure what this device's issue was. seems to + // require mode selects at various times. + { "TOSHIBA ", "CD-ROM XM-3" , NULL, 0x0020 }, + // NEC defined a "READ_CD" type command before there was + // a standard, so fall back on this as an option. + { "NEC" , "" , NULL, 0x0040 }, + // plextor defined a "READ_CD" type command before there was + // a standard, so fall back on this as an option. + { "PLEXTOR ", "" , NULL, 0x0080 }, + // this drive times out and sometimes disappears from the bus + // when send GET_CONFIGURATION commands. don't send them. + { "" , "LG DVD-ROM DRD-840B" , NULL, 0x0100 }, + { "" , "SAMSUNG DVD-ROM SD-608" , NULL, 0x0300 }, + // these drives should have supported READ_CD, but at least + // some firmware revisions did not. force READ_CD detection. + { "" , "SAMSUNG DVD-ROM SD-" , NULL, 0x2000 }, + // the mitsumi drive below doesn't follow the block-only spec, + // and we end up hanging when sending it commands it doesn't + // understand. this causes complications later, also. + { "MITSUMI ", "CR-4802TE " , NULL, 0x0100 }, + // some drives return various funky errors (such as 3/2/0 NO_SEEK_COMPLETE) + // during the detection of READ_CD support, resulting in iffy detection. + // since they probably don't support mode switching, which is really old + // legacy stuff anyways, the ability to read digitally is lost when + // these drives return unexpected error codes. note: MMC compliant drives + // are presumed to support READ_CD, as are DVD drives, and anything + // connected to a bus type other than IDE or SCSI, and therefore don't + // need to be here. + { "YAMAHA ", "CRW8424S " , NULL, 0x0400 }, + // and finally, a place to finish the list. :) + { NULL , NULL , NULL, 0x0000 } +}; + +#ifdef ALLOC_DATA_PRAGMA +#pragma data_seg() +#endif + diff --git a/drivers/storage/class/cdrom_new/ioctl.c b/drivers/storage/class/cdrom_new/ioctl.c new file mode 100644 index 00000000000..446828e5294 --- /dev/null +++ b/drivers/storage/class/cdrom_new/ioctl.c @@ -0,0 +1,4054 @@ +/*-- + +Copyright (C) Microsoft Corporation, 1999 - 1999 + +Module Name: + + ioctl.c + +Abstract: + + The CDROM class driver tranlates IRPs to SRBs with embedded CDBs + and sends them to its devices through the port driver. + +Environment: + + kernel mode only + +Notes: + + SCSI Tape, CDRom and Disk class drivers share common routines + that can be found in the CLASS directory (..\ntos\dd\class). + +Revision History: + +--*/ + +#include "stddef.h" +#include "string.h" + +#include "ntddk.h" + +#include "ntddcdvd.h" +#include "classpnp.h" + +#include "initguid.h" +#include "ntddstor.h" +#include "cdrom.h" + + +#if DBG + PUCHAR READ_DVD_STRUCTURE_FORMAT_STRINGS[DvdMaxDescriptor+1] = { + "Physical", + "Copyright", + "DiskKey", + "BCA", + "Manufacturer", + "Unknown" + }; +#endif // DBG + +#define DEFAULT_CDROM_SECTORS_PER_TRACK 32 +#define DEFAULT_TRACKS_PER_CYLINDER 64 + + + +NTSTATUS +CdRomDeviceControlDispatch( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +/*++ + +Routine Description: + + This is the NT device control handler for CDROMs. + +Arguments: + + DeviceObject - for this CDROM + + Irp - IO Request packet + +Return Value: + + NTSTATUS + +--*/ +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PIO_STACK_LOCATION nextStack; + PCDROM_DATA cdData = (PCDROM_DATA)(commonExtension->DriverData); + + BOOLEAN use6Byte = TEST_FLAG(cdData->XAFlags, XA_USE_6_BYTE); + SCSI_REQUEST_BLOCK srb; + PCDB cdb = (PCDB)srb.Cdb; + PVOID outputBuffer; + ULONG bytesTransferred = 0; + NTSTATUS status; + NTSTATUS status2; + KIRQL irql; + + ULONG ioctlCode; + ULONG baseCode; + ULONG functionCode; + +RetryControl: + + // + // Zero the SRB on stack. + // + + RtlZeroMemory(&srb, sizeof(SCSI_REQUEST_BLOCK)); + + Irp->IoStatus.Information = 0; + + // + // if this is a class driver ioctl then we need to change the base code + // to IOCTL_CDROM_BASE so that the switch statement can handle it. + // + // WARNING - currently the scsi class ioctl function codes are between + // 0x200 & 0x300. this routine depends on that fact + // + + ioctlCode = irpStack->Parameters.DeviceIoControl.IoControlCode; + baseCode = ioctlCode >> 16; + functionCode = (ioctlCode & (~0xffffc003)) >> 2; + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Ioctl Code = %lx, Base Code = %lx," + " Function Code = %lx\n", + ioctlCode, + baseCode, + functionCode + )); + + if((functionCode >= 0x200) && (functionCode <= 0x300)) { + + ioctlCode = (ioctlCode & 0x0000ffff) | CTL_CODE(IOCTL_CDROM_BASE, 0, 0, 0); + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Class Code - new ioctl code is %lx\n", + ioctlCode)); + + irpStack->Parameters.DeviceIoControl.IoControlCode = ioctlCode; + + } + + switch (ioctlCode) { + + case IOCTL_STORAGE_GET_MEDIA_TYPES_EX: { + + PGET_MEDIA_TYPES mediaTypes = Irp->AssociatedIrp.SystemBuffer; + PDEVICE_MEDIA_INFO mediaInfo = &mediaTypes->MediaInfo[0]; + ULONG sizeNeeded; + + sizeNeeded = sizeof(GET_MEDIA_TYPES); + + // + // IsMmc is static... + // + + if (cdData->Mmc.IsMmc) { + sizeNeeded += sizeof(DEVICE_MEDIA_INFO) * 1; // return two media types + } + + // + // Ensure that buffer is large enough. + // + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeNeeded) { + + // + // Buffer too small. + // + + Irp->IoStatus.Information = sizeNeeded; + status = STATUS_BUFFER_TOO_SMALL; + break; + } + + RtlZeroMemory(Irp->AssociatedIrp.SystemBuffer, sizeNeeded); + + // + // ISSUE-2000/5/11-henrygab - need to update GET_MEDIA_TYPES_EX + // + + mediaTypes->DeviceType = CdRomGetDeviceType(DeviceObject); + + mediaTypes->MediaInfoCount = 1; + mediaInfo->DeviceSpecific.RemovableDiskInfo.MediaType = CD_ROM; + mediaInfo->DeviceSpecific.RemovableDiskInfo.NumberMediaSides = 1; + mediaInfo->DeviceSpecific.RemovableDiskInfo.MediaCharacteristics = MEDIA_READ_ONLY; + mediaInfo->DeviceSpecific.RemovableDiskInfo.Cylinders.QuadPart = fdoExtension->DiskGeometry.Cylinders.QuadPart; + mediaInfo->DeviceSpecific.RemovableDiskInfo.TracksPerCylinder = fdoExtension->DiskGeometry.TracksPerCylinder; + mediaInfo->DeviceSpecific.RemovableDiskInfo.SectorsPerTrack = fdoExtension->DiskGeometry.SectorsPerTrack; + mediaInfo->DeviceSpecific.RemovableDiskInfo.BytesPerSector = fdoExtension->DiskGeometry.BytesPerSector; + + if (cdData->Mmc.IsMmc) { + + // + // also report a removable disk + // + mediaTypes->MediaInfoCount += 1; + + mediaInfo++; + mediaInfo->DeviceSpecific.RemovableDiskInfo.MediaType = RemovableMedia; + mediaInfo->DeviceSpecific.RemovableDiskInfo.NumberMediaSides = 1; + mediaInfo->DeviceSpecific.RemovableDiskInfo.MediaCharacteristics = MEDIA_READ_WRITE; + mediaInfo->DeviceSpecific.RemovableDiskInfo.Cylinders.QuadPart = fdoExtension->DiskGeometry.Cylinders.QuadPart; + mediaInfo->DeviceSpecific.RemovableDiskInfo.TracksPerCylinder = fdoExtension->DiskGeometry.TracksPerCylinder; + mediaInfo->DeviceSpecific.RemovableDiskInfo.SectorsPerTrack = fdoExtension->DiskGeometry.SectorsPerTrack; + mediaInfo->DeviceSpecific.RemovableDiskInfo.BytesPerSector = fdoExtension->DiskGeometry.BytesPerSector; + mediaInfo--; + + } + + // + // Status will either be success, if media is present, or no media. + // It would be optimal to base from density code and medium type, but not all devices + // have values for these fields. + // + + // + // Send a TUR to determine if media is present. + // + + srb.CdbLength = 6; + cdb = (PCDB)srb.Cdb; + cdb->CDB6GENERIC.OperationCode = SCSIOP_TEST_UNIT_READY; + + // + // Set timeout value. + // + + srb.TimeOutValue = fdoExtension->TimeOutValue; + + status = ClassSendSrbSynchronous(DeviceObject, + &srb, + NULL, + 0, + FALSE); + + + TraceLog((CdromDebugWarning, + "CdRomDeviceControl: GET_MEDIA_TYPES status of TUR - %lx\n", + status)); + + if (NT_SUCCESS(status)) { + + // + // set the disk's media as current if we can write to it. + // + + if (cdData->Mmc.IsMmc && cdData->Mmc.WriteAllowed) { + + mediaInfo++; + SET_FLAG(mediaInfo->DeviceSpecific.RemovableDiskInfo.MediaCharacteristics, + MEDIA_CURRENTLY_MOUNTED); + mediaInfo--; + + + } else { + + SET_FLAG(mediaInfo->DeviceSpecific.RemovableDiskInfo.MediaCharacteristics, + MEDIA_CURRENTLY_MOUNTED); + + } + + } + + Irp->IoStatus.Information = sizeNeeded; + status = STATUS_SUCCESS; + break; + } + + + case IOCTL_CDROM_RAW_READ: { + + LARGE_INTEGER startingOffset; + ULONGLONG transferBytes; + ULONGLONG endOffset; + ULONGLONG mdlBytes; + ULONG startingSector; + PRAW_READ_INFO rawReadInfo = (PRAW_READ_INFO)irpStack->Parameters.DeviceIoControl.Type3InputBuffer; + + // + // Ensure that XA reads are supported. + // + + if (TEST_FLAG(cdData->XAFlags, XA_NOT_SUPPORTED)) { + TraceLog((CdromDebugWarning, + "CdRomDeviceControl: XA Reads not supported. Flags (%x)\n", + cdData->XAFlags)); + status = STATUS_INVALID_DEVICE_REQUEST; + break; + } + + // + // Check that ending sector is on disc and buffers are there and of + // correct size. + // + + if (rawReadInfo == NULL) { + + // + // Called from user space. Save the userbuffer in the + // Type3InputBuffer so we can reduce the number of code paths. + // + + irpStack->Parameters.DeviceIoControl.Type3InputBuffer = + Irp->AssociatedIrp.SystemBuffer; + + // + // Called from user space. Validate the buffers. + // + + rawReadInfo = (PRAW_READ_INFO)irpStack->Parameters.DeviceIoControl.Type3InputBuffer; + + if (rawReadInfo == NULL) { + + TraceLog((CdromDebugWarning, + "CdRomDeviceControl: Invalid I/O parameters for " + "XA Read (No extent info\n")); + status = STATUS_INVALID_PARAMETER; + break; + + } + + if (irpStack->Parameters.DeviceIoControl.InputBufferLength != + sizeof(RAW_READ_INFO)) { + + TraceLog((CdromDebugWarning, + "CdRomDeviceControl: Invalid I/O parameters for " + "XA Read (Invalid info buffer\n")); + status = STATUS_INVALID_PARAMETER; + break; + + } + } + + // + // if they don't request any data, just fail the request + // + + if (rawReadInfo->SectorCount == 0) { + + status = STATUS_INVALID_PARAMETER; + break; + + } + + startingOffset.QuadPart = rawReadInfo->DiskOffset.QuadPart; + startingSector = (ULONG)(rawReadInfo->DiskOffset.QuadPart >> + fdoExtension->SectorShift); + transferBytes = (ULONGLONG)rawReadInfo->SectorCount * RAW_SECTOR_SIZE; + + endOffset = (ULONGLONG)rawReadInfo->SectorCount * COOKED_SECTOR_SIZE; + endOffset += startingOffset.QuadPart; + + // + // check for overflows.... + // + + if (transferBytes < (ULONGLONG)(rawReadInfo->SectorCount)) { + TraceLog((CdromDebugWarning, + "CdRomDeviceControl: Invalid I/O parameters for XA " + "Read (TransferBytes Overflow)\n")); + status = STATUS_INVALID_PARAMETER; + break; + } + if (endOffset < (ULONGLONG)startingOffset.QuadPart) { + TraceLog((CdromDebugWarning, + "CdRomDeviceControl: Invalid I/O parameters for XA " + "Read (EndingOffset Overflow)\n")); + status = STATUS_INVALID_PARAMETER; + break; + } + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + transferBytes) { + TraceLog((CdromDebugWarning, + "CdRomDeviceControl: Invalid I/O parameters for XA " + "Read (Bad buffer size)\n")); + status = STATUS_INVALID_PARAMETER; + break; + } + if (endOffset > (ULONGLONG)commonExtension->PartitionLength.QuadPart) { + TraceLog((CdromDebugWarning, + "CdRomDeviceControl: Invalid I/O parameters for XA " + "Read (Request Out of Bounds)\n")); + status = STATUS_INVALID_PARAMETER; + break; + } + + // + // cannot validate the MdlAddress, since it is not included in any + // other location per the DDK and file system calls. + // + + // + // validate the mdl describes at least the number of bytes + // requested from us. + // + + mdlBytes = (ULONGLONG)MmGetMdlByteCount(Irp->MdlAddress); + if (mdlBytes < transferBytes) { + TraceLog((CdromDebugWarning, + "CdRomDeviceControl: Invalid MDL %s, Irp %p\n", + "size (5)", Irp)); + status = STATUS_INVALID_PARAMETER; + break; + } + + // + // HACKHACK - REF #0001 + // The retry count will be in this irp's IRP_MN function, + // as the new irp was freed, and we therefore cannot use + // this irp's next stack location for this function. + // This may be a good location to store this info for + // when we remove RAW_READ (mode switching), as we will + // no longer have the nextIrpStackLocation to play with + // when that occurs + // + // once XA_READ is removed, then this hack can also be + // removed. + // + irpStack->MinorFunction = MAXIMUM_RETRIES; // HACKHACK - REF #0001 + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_DISK_GET_DRIVE_GEOMETRY_EX: + case IOCTL_CDROM_GET_DRIVE_GEOMETRY_EX: { + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Get drive geometryEx\n")); + if ( irpStack->Parameters.DeviceIoControl.OutputBufferLength < + FIELD_OFFSET(DISK_GEOMETRY_EX, Data)) { + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = FIELD_OFFSET(DISK_GEOMETRY_EX, Data); + break; + } + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + return STATUS_PENDING; + } + + case IOCTL_DISK_GET_DRIVE_GEOMETRY: + case IOCTL_CDROM_GET_DRIVE_GEOMETRY: { + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Get drive geometry\n")); + + if ( irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof( DISK_GEOMETRY ) ) { + + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(DISK_GEOMETRY); + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_CDROM_READ_TOC_EX: { + + PCDROM_READ_TOC_EX inputBuffer; + + if (CdRomIsPlayActive(DeviceObject)) { + status = STATUS_DEVICE_BUSY; + break; + } + + if (irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(CDROM_READ_TOC_EX)) { + status = STATUS_INFO_LENGTH_MISMATCH; + break; + } + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + MINIMUM_CDROM_READ_TOC_EX_SIZE) { + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = MINIMUM_CDROM_READ_TOC_EX_SIZE; + break; + } + + if (irpStack->Parameters.Read.Length > ((USHORT)-1)) { + status = STATUS_INVALID_PARAMETER; + break; + } + + inputBuffer = Irp->AssociatedIrp.SystemBuffer; + + if ((inputBuffer->Reserved1 != 0) || + (inputBuffer->Reserved2 != 0) || + (inputBuffer->Reserved3 != 0)) { + status = STATUS_INVALID_PARAMETER; + break; + } + + // + // NOTE: when adding new formats, ensure that first two bytes + // specify the amount of additional data available. + // + + if ((inputBuffer->Format == CDROM_READ_TOC_EX_FORMAT_TOC ) || + (inputBuffer->Format == CDROM_READ_TOC_EX_FORMAT_FULL_TOC) || + (inputBuffer->Format == CDROM_READ_TOC_EX_FORMAT_CDTEXT )) { + + // SessionTrack field is used + + } else + if ((inputBuffer->Format == CDROM_READ_TOC_EX_FORMAT_SESSION) || + (inputBuffer->Format == CDROM_READ_TOC_EX_FORMAT_PMA) || + (inputBuffer->Format == CDROM_READ_TOC_EX_FORMAT_ATIP)) { + + // SessionTrack field is reserved + + if (inputBuffer->SessionTrack != 0) { + status = STATUS_INVALID_PARAMETER; + break; + } + + } else { + status = STATUS_INVALID_PARAMETER; + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + return STATUS_PENDING; + } + + case IOCTL_CDROM_GET_LAST_SESSION: { + + // + // If the cd is playing music then reject this request. + // + + if (CdRomIsPlayActive(DeviceObject)) { + status = STATUS_DEVICE_BUSY; + break; + } + + // + // Make sure the caller is requesting enough data to make this worth + // our while. + // + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(CDROM_TOC_SESSION_DATA)) { + + // + // they didn't request the entire TOC -- use _EX version + // for partial transfers and such. + // + + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(CDROM_TOC_SESSION_DATA); + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_CDROM_READ_TOC: { + + // + // If the cd is playing music then reject this request. + // + + if (CdRomIsPlayActive(DeviceObject)) { + status = STATUS_DEVICE_BUSY; + break; + } + + // + // Make sure the caller is requesting enough data to make this worth + // our while. + // + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(CDROM_TOC)) { + + // + // they didn't request the entire TOC -- use _EX version + // for partial transfers and such. + // + + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(CDROM_TOC); + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_CDROM_PLAY_AUDIO_MSF: { + + // + // Play Audio MSF + // + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Play audio MSF\n")); + + if (irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(CDROM_PLAY_AUDIO_MSF)) { + + // + // Indicate unsuccessful status. + // + + status = STATUS_INFO_LENGTH_MISMATCH; + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_CDROM_SEEK_AUDIO_MSF: { + + + // + // Seek Audio MSF + // + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Seek audio MSF\n")); + + if (irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(CDROM_SEEK_AUDIO_MSF)) { + + // + // Indicate unsuccessful status. + // + + status = STATUS_INFO_LENGTH_MISMATCH; + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + return STATUS_PENDING; + + } + + case IOCTL_CDROM_PAUSE_AUDIO: { + + // + // Pause audio + // + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Pause audio\n")); + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + + break; + } + + case IOCTL_CDROM_RESUME_AUDIO: { + + // + // Resume audio + // + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Resume audio\n")); + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_CDROM_READ_Q_CHANNEL: { + + PCDROM_SUB_Q_DATA_FORMAT inputBuffer = + Irp->AssociatedIrp.SystemBuffer; + + if(irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(CDROM_SUB_Q_DATA_FORMAT)) { + + status = STATUS_INFO_LENGTH_MISMATCH; + break; + } + + // + // check for all valid types of request + // + + if (inputBuffer->Format != IOCTL_CDROM_CURRENT_POSITION && + inputBuffer->Format != IOCTL_CDROM_MEDIA_CATALOG && + inputBuffer->Format != IOCTL_CDROM_TRACK_ISRC ) { + status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_CDROM_GET_CONTROL: { + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Get audio control\n")); + + // + // Verify user buffer is large enough for the data. + // + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(CDROM_AUDIO_CONTROL)) { + + // + // Indicate unsuccessful status and no data transferred. + // + + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(CDROM_AUDIO_CONTROL); + break; + + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_CDROM_GET_VOLUME: { + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Get volume control\n")); + + // + // Verify user buffer is large enough for data. + // + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(VOLUME_CONTROL)) { + + // + // Indicate unsuccessful status and no data transferred. + // + + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(VOLUME_CONTROL); + break; + + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_CDROM_SET_VOLUME: { + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Set volume control\n")); + + if (irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(VOLUME_CONTROL)) { + + // + // Indicate unsuccessful status. + // + + status = STATUS_INFO_LENGTH_MISMATCH; + break; + + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_CDROM_STOP_AUDIO: { + + // + // Stop play. + // + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Stop audio\n")); + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_STORAGE_CHECK_VERIFY: + case IOCTL_DISK_CHECK_VERIFY: + case IOCTL_CDROM_CHECK_VERIFY: { + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: [%p] Check Verify\n", Irp)); + + if((irpStack->Parameters.DeviceIoControl.OutputBufferLength) && + (irpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG))) { + + TraceLog((CdromDebugWarning, + "CdRomDeviceControl: Check Verify: media count " + "buffer too small\n")); + + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(ULONG); + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_DVD_READ_STRUCTURE: { + + TraceLog((CdromDebugTrace, + "DvdDeviceControl: [%p] IOCTL_DVD_READ_STRUCTURE\n", Irp)); + + if (cdData->DvdRpc0Device && cdData->DvdRpc0LicenseFailure) { + TraceLog((CdromDebugWarning, + "DvdDeviceControl: License Failure\n")); + status = STATUS_COPY_PROTECTION_FAILURE; + break; + } + + if (cdData->DvdRpc0Device && cdData->Rpc0RetryRegistryCallback) { + // + // if currently in-progress, this will just return. + // prevents looping by doing that interlockedExchange() + // + TraceLog((CdromDebugWarning, + "DvdDeviceControl: PickRegion() from " + "READ_STRUCTURE\n")); + CdRomPickDvdRegion(DeviceObject); + } + + + if(irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(DVD_READ_STRUCTURE)) { + + TraceLog((CdromDebugWarning, + "DvdDeviceControl - READ_STRUCTURE: input buffer " + "length too small (was %d should be %d)\n", + irpStack->Parameters.DeviceIoControl.InputBufferLength, + sizeof(DVD_READ_STRUCTURE))); + status = STATUS_INVALID_PARAMETER; + break; + } + + if(irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(READ_DVD_STRUCTURES_HEADER)) { + + TraceLog((CdromDebugWarning, + "DvdDeviceControl - READ_STRUCTURE: output buffer " + "cannot hold header information\n")); + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(READ_DVD_STRUCTURES_HEADER); + break; + } + + if(irpStack->Parameters.DeviceIoControl.OutputBufferLength > + MAXUSHORT) { + + // + // key length must fit in two bytes + // + TraceLog((CdromDebugWarning, + "DvdDeviceControl - READ_STRUCTURE: output buffer " + "too large\n")); + status = STATUS_INVALID_PARAMETER; + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_DVD_START_SESSION: { + + TraceLog((CdromDebugTrace, + "DvdDeviceControl: [%p] IOCTL_DVD_START_SESSION\n", Irp)); + + if (cdData->DvdRpc0Device && cdData->DvdRpc0LicenseFailure) { + TraceLog((CdromDebugWarning, + "DvdDeviceControl: License Failure\n")); + status = STATUS_COPY_PROTECTION_FAILURE; + break; + } + + if(irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(DVD_SESSION_ID)) { + + TraceLog((CdromDebugWarning, + "DvdDeviceControl: DVD_START_SESSION - output " + "buffer too small\n")); + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(DVD_SESSION_ID); + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_DVD_SEND_KEY: + case IOCTL_DVD_SEND_KEY2: { + + PDVD_COPY_PROTECT_KEY key = Irp->AssociatedIrp.SystemBuffer; + ULONG keyLength; + + TraceLog((CdromDebugTrace, + "DvdDeviceControl: [%p] IOCTL_DVD_SEND_KEY\n", Irp)); + + if (cdData->DvdRpc0Device && cdData->DvdRpc0LicenseFailure) { + TraceLog((CdromDebugWarning, + "DvdDeviceControl: License Failure\n")); + status = STATUS_COPY_PROTECTION_FAILURE; + break; + } + + if((irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(DVD_COPY_PROTECT_KEY)) || + (irpStack->Parameters.DeviceIoControl.InputBufferLength != + key->KeyLength)) { + + // + // Key is too small to have a header or the key length doesn't + // match the input buffer length. Key must be invalid + // + + TraceLog((CdromDebugWarning, + "DvdDeviceControl: [%p] IOCTL_DVD_SEND_KEY - " + "key is too small or does not match KeyLength\n", + Irp)); + status = STATUS_INVALID_PARAMETER; + break; + } + + // + // allow only certain key type (non-destructive) to go through + // IOCTL_DVD_SEND_KEY (which only requires READ access to the device + // + if (ioctlCode == IOCTL_DVD_SEND_KEY) { + + if ((key->KeyType != DvdChallengeKey) && + (key->KeyType != DvdBusKey2) && + (key->KeyType != DvdInvalidateAGID)) { + + status = STATUS_INVALID_PARAMETER; + break; + } + } + + if (cdData->DvdRpc0Device) { + + if (key->KeyType == DvdSetRpcKey) { + + PDVD_SET_RPC_KEY rpcKey = (PDVD_SET_RPC_KEY) key->KeyData; + + if (irpStack->Parameters.DeviceIoControl.InputBufferLength < + DVD_SET_RPC_KEY_LENGTH) { + + status = STATUS_INVALID_PARAMETER; + break; + } + + // + // we have a request to set region code + // on a RPC0 device which doesn't support + // region coding. + // + // we have to fake it. + // + + KeWaitForMutexObject( + &cdData->Rpc0RegionMutex, + UserRequest, + KernelMode, + FALSE, + NULL + ); + + if (cdData->DvdRpc0Device && cdData->Rpc0RetryRegistryCallback) { + // + // if currently in-progress, this will just return. + // prevents looping by doing that interlockedExchange() + // + TraceLog((CdromDebugWarning, + "DvdDeviceControl: PickRegion() from " + "SEND_KEY\n")); + CdRomPickDvdRegion(DeviceObject); + } + + if (cdData->Rpc0SystemRegion == rpcKey->PreferredDriveRegionCode) { + + // + // nothing to change + // + TraceLog((CdromDebugWarning, + "DvdDeviceControl (%p) => not changing " + "regions -- requesting current region\n", + DeviceObject)); + status = STATUS_SUCCESS; + + } else if (cdData->Rpc0SystemRegionResetCount == 0) { + + // + // not allowed to change it again + // + + TraceLog((CdromDebugWarning, + "DvdDeviceControl (%p) => no more region " + "changes are allowed for this device\n", + DeviceObject)); + status = STATUS_CSS_RESETS_EXHAUSTED; + + } else { + + ULONG i; + UCHAR mask; + ULONG bufferLen; + PDVD_READ_STRUCTURE dvdReadStructure; + PDVD_COPYRIGHT_DESCRIPTOR dvdCopyRight; + IO_STATUS_BLOCK ioStatus; + UCHAR mediaRegionData; + + mask = ~rpcKey->PreferredDriveRegionCode; + + if (CountOfSetBitsUChar(mask) != 1) { + + status = STATUS_INVALID_DEVICE_REQUEST; + break; + } + + // + // this test will always be TRUE except during initial + // automatic selection of the first region. + // + + if (cdData->Rpc0SystemRegion != 0xff) { + + // + // make sure we have a media in the drive with the same + // region code if the drive is already has a region set + // + + TraceLog((CdromDebugTrace, + "DvdDeviceControl (%p) => Checking " + "media region\n", + DeviceObject)); + + bufferLen = max(sizeof(DVD_DESCRIPTOR_HEADER) + + sizeof(DVD_COPYRIGHT_DESCRIPTOR), + sizeof(DVD_READ_STRUCTURE) + ); + + dvdReadStructure = (PDVD_READ_STRUCTURE) + ExAllocatePoolWithTag(PagedPool, + bufferLen, + DVD_TAG_RPC2_CHECK); + + if (dvdReadStructure == NULL) { + status = STATUS_INSUFFICIENT_RESOURCES; + KeReleaseMutex(&cdData->Rpc0RegionMutex,FALSE); + break; + } + + dvdCopyRight = (PDVD_COPYRIGHT_DESCRIPTOR) + ((PDVD_DESCRIPTOR_HEADER) dvdReadStructure)->Data; + + // + // check to see if we have a DVD device + // + + RtlZeroMemory (dvdReadStructure, bufferLen); + dvdReadStructure->Format = DvdCopyrightDescriptor; + + // + // Build a request for READ_KEY + // + ClassSendDeviceIoControlSynchronous( + IOCTL_DVD_READ_STRUCTURE, + DeviceObject, + dvdReadStructure, + sizeof(DVD_READ_STRUCTURE), + sizeof(DVD_DESCRIPTOR_HEADER) + + sizeof(DVD_COPYRIGHT_DESCRIPTOR), + FALSE, + &ioStatus); + + // + // this is just to prevent bugs from creeping in + // if status is not set later in development + // + + status = ioStatus.Status; + + // + // handle errors + // + + if (!NT_SUCCESS(status)) { + KeReleaseMutex(&cdData->Rpc0RegionMutex,FALSE); + ExFreePool(dvdReadStructure); + status = STATUS_INVALID_DEVICE_REQUEST; + break; + } + + // + // save the mediaRegionData before freeing the + // allocated memory + // + + mediaRegionData = + dvdCopyRight->RegionManagementInformation; + ExFreePool(dvdReadStructure); + + TraceLog((CdromDebugWarning, + "DvdDeviceControl (%p) => new mask is %x" + " MediaRegionData is %x\n", DeviceObject, + rpcKey->PreferredDriveRegionCode, + mediaRegionData)); + + // + // the media region must match the requested region + // for RPC0 drives for initial region selection + // + + if (((UCHAR)~(mediaRegionData | rpcKey->PreferredDriveRegionCode)) == 0) { + KeReleaseMutex(&cdData->Rpc0RegionMutex,FALSE); + status = STATUS_CSS_REGION_MISMATCH; + break; + } + + } + + // + // now try to set the region + // + + TraceLog((CdromDebugTrace, + "DvdDeviceControl (%p) => Soft-Setting " + "region of RPC1 device to %x\n", + DeviceObject, + rpcKey->PreferredDriveRegionCode + )); + + status = CdRomSetRpc0Settings(DeviceObject, + rpcKey->PreferredDriveRegionCode); + + if (!NT_SUCCESS(status)) { + TraceLog((CdromDebugWarning, + "DvdDeviceControl (%p) => Could not " + "set region code (%x)\n", + DeviceObject, status + )); + } else { + + TraceLog((CdromDebugTrace, + "DvdDeviceControl (%p) => New region set " + " for RPC1 drive\n", DeviceObject)); + + // + // if it worked, our extension is already updated. + // release the mutex + // + + DebugPrint ((4, "DvdDeviceControl (%p) => DVD current " + "region bitmap 0x%x\n", DeviceObject, + cdData->Rpc0SystemRegion)); + DebugPrint ((4, "DvdDeviceControl (%p) => DVD region " + " reset Count 0x%x\n", DeviceObject, + cdData->Rpc0SystemRegionResetCount)); + } + + } + + KeReleaseMutex(&cdData->Rpc0RegionMutex,FALSE); + break; + } // end of key->KeyType == DvdSetRpcKey + } // end of Rpc0Device hacks + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + return STATUS_PENDING; + break; + } + + case IOCTL_DVD_READ_KEY: { + + PDVD_COPY_PROTECT_KEY keyParameters = Irp->AssociatedIrp.SystemBuffer; + ULONG keyLength; + + TraceLog((CdromDebugTrace, + "DvdDeviceControl: [%p] IOCTL_DVD_READ_KEY\n", Irp)); + + if (cdData->DvdRpc0Device && cdData->DvdRpc0LicenseFailure) { + TraceLog((CdromDebugWarning, + "DvdDeviceControl: License Failure\n")); + status = STATUS_COPY_PROTECTION_FAILURE; + break; + } + + if (cdData->DvdRpc0Device && cdData->Rpc0RetryRegistryCallback) { + TraceLog((CdromDebugWarning, + "DvdDeviceControl: PickRegion() from READ_KEY\n")); + CdRomPickDvdRegion(DeviceObject); + } + + + if(irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(DVD_COPY_PROTECT_KEY)) { + + TraceLog((CdromDebugWarning, + "DvdDeviceControl: EstablishDriveKey - challenge " + "key buffer too small\n")); + + status = STATUS_INVALID_PARAMETER; + break; + + } + + + switch(keyParameters->KeyType) { + + case DvdChallengeKey: + keyLength = DVD_CHALLENGE_KEY_LENGTH; + break; + + case DvdBusKey1: + case DvdBusKey2: + + keyLength = DVD_BUS_KEY_LENGTH; + break; + + case DvdTitleKey: + keyLength = DVD_TITLE_KEY_LENGTH; + break; + + case DvdAsf: + keyLength = DVD_ASF_LENGTH; + break; + + case DvdDiskKey: + keyLength = DVD_DISK_KEY_LENGTH; + break; + + case DvdGetRpcKey: + keyLength = DVD_RPC_KEY_LENGTH; + break; + + default: + keyLength = sizeof(DVD_COPY_PROTECT_KEY); + break; + } + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + keyLength) { + + TraceLog((CdromDebugWarning, + "DvdDeviceControl: EstablishDriveKey - output " + "buffer too small\n")); + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = keyLength; + break; + } + + if (keyParameters->KeyType == DvdGetRpcKey) { + + CdRomPickDvdRegion(DeviceObject); + } + + if ((keyParameters->KeyType == DvdGetRpcKey) && + (cdData->DvdRpc0Device)) { + + PDVD_RPC_KEY rpcKey; + rpcKey = (PDVD_RPC_KEY)keyParameters->KeyData; + RtlZeroMemory (rpcKey, sizeof (*rpcKey)); + + KeWaitForMutexObject( + &cdData->Rpc0RegionMutex, + UserRequest, + KernelMode, + FALSE, + NULL + ); + + // + // make up the data + // + rpcKey->UserResetsAvailable = cdData->Rpc0SystemRegionResetCount; + rpcKey->ManufacturerResetsAvailable = 0; + if (cdData->Rpc0SystemRegion == 0xff) { + rpcKey->TypeCode = 0; + } else { + rpcKey->TypeCode = 1; + } + rpcKey->RegionMask = (UCHAR) cdData->Rpc0SystemRegion; + rpcKey->RpcScheme = 1; + + KeReleaseMutex( + &cdData->Rpc0RegionMutex, + FALSE + ); + + Irp->IoStatus.Information = DVD_RPC_KEY_LENGTH; + status = STATUS_SUCCESS; + break; + + } else if (keyParameters->KeyType == DvdDiskKey) { + + PDVD_COPY_PROTECT_KEY keyHeader; + PDVD_READ_STRUCTURE readStructureRequest; + + // + // Special case - build a request to get the dvd structure + // so we can get the disk key. + // + + // + // save the key header so we can restore the interesting + // parts later + // + + keyHeader = ExAllocatePoolWithTag(NonPagedPool, + sizeof(DVD_COPY_PROTECT_KEY), + DVD_TAG_READ_KEY); + + if(keyHeader == NULL) { + + // + // Can't save the context so return an error + // + + TraceLog((CdromDebugWarning, + "DvdDeviceControl - READ_KEY: unable to " + "allocate context\n")); + status = STATUS_INSUFFICIENT_RESOURCES; + break; + } + + RtlCopyMemory(keyHeader, + Irp->AssociatedIrp.SystemBuffer, + sizeof(DVD_COPY_PROTECT_KEY)); + + IoCopyCurrentIrpStackLocationToNext(Irp); + + nextStack = IoGetNextIrpStackLocation(Irp); + + nextStack->Parameters.DeviceIoControl.IoControlCode = + IOCTL_DVD_READ_STRUCTURE; + + readStructureRequest = Irp->AssociatedIrp.SystemBuffer; + readStructureRequest->Format = DvdDiskKeyDescriptor; + readStructureRequest->BlockByteOffset.QuadPart = 0; + readStructureRequest->LayerNumber = 0; + readStructureRequest->SessionId = keyHeader->SessionId; + + nextStack->Parameters.DeviceIoControl.InputBufferLength = + sizeof(DVD_READ_STRUCTURE); + + nextStack->Parameters.DeviceIoControl.OutputBufferLength = + sizeof(READ_DVD_STRUCTURES_HEADER) + sizeof(DVD_DISK_KEY_DESCRIPTOR); + + IoSetCompletionRoutine(Irp, + CdRomDvdReadDiskKeyCompletion, + (PVOID) keyHeader, + TRUE, + TRUE, + TRUE); + + { + UCHAR uniqueAddress; + ClassAcquireRemoveLock(DeviceObject, (PIRP)&uniqueAddress); + ClassReleaseRemoveLock(DeviceObject, Irp); + + IoMarkIrpPending(Irp); + IoCallDriver(commonExtension->DeviceObject, Irp); + status = STATUS_PENDING; + + ClassReleaseRemoveLock(DeviceObject, (PIRP)&uniqueAddress); + } + + return STATUS_PENDING; + + } else { + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + } + return STATUS_PENDING; + } + + case IOCTL_DVD_END_SESSION: { + + PDVD_SESSION_ID sessionId = Irp->AssociatedIrp.SystemBuffer; + + TraceLog((CdromDebugTrace, + "DvdDeviceControl: [%p] END_SESSION\n", Irp)); + + if (cdData->DvdRpc0Device && cdData->DvdRpc0LicenseFailure) { + TraceLog((CdromDebugWarning, + "DvdDeviceControl: License Failure\n")); + status = STATUS_COPY_PROTECTION_FAILURE; + break; + } + + if(irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(DVD_SESSION_ID)) { + + TraceLog((CdromDebugWarning, + "DvdDeviceControl: EndSession - input buffer too " + "small\n")); + status = STATUS_INVALID_PARAMETER; + break; + } + + IoMarkIrpPending(Irp); + + if(*sessionId == DVD_END_ALL_SESSIONS) { + + status = CdRomDvdEndAllSessionsCompletion(DeviceObject, Irp, NULL); + + if(status == STATUS_SUCCESS) { + + // + // Just complete the request - it was never issued to the + // lower device + // + + break; + + } else { + + return STATUS_PENDING; + + } + } + + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_DVD_GET_REGION: { + + PDVD_COPY_PROTECT_KEY copyProtectKey; + ULONG keyLength; + IO_STATUS_BLOCK ioStatus; + PDVD_DESCRIPTOR_HEADER dvdHeader; + PDVD_COPYRIGHT_DESCRIPTOR copyRightDescriptor; + PDVD_REGION dvdRegion; + PDVD_READ_STRUCTURE readStructure; + PDVD_RPC_KEY rpcKey; + + TraceLog((CdromDebugTrace, + "DvdDeviceControl: [%p] IOCTL_DVD_GET_REGION\n", Irp)); + + if (cdData->DvdRpc0Device && cdData->DvdRpc0LicenseFailure) { + TraceLog((CdromDebugWarning, + "DvdDeviceControl: License Failure\n")); + status = STATUS_COPY_PROTECTION_FAILURE; + break; + } + + if(irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(DVD_REGION)) { + + TraceLog((CdromDebugWarning, + "DvdDeviceControl: output buffer DVD_REGION too small\n")); + status = STATUS_INVALID_PARAMETER; + break; + } + + // + // figure out how much data buffer we need + // + + keyLength = max(sizeof(DVD_DESCRIPTOR_HEADER) + + sizeof(DVD_COPYRIGHT_DESCRIPTOR), + sizeof(DVD_READ_STRUCTURE) + ); + keyLength = max(keyLength, + DVD_RPC_KEY_LENGTH + ); + + // + // round the size to nearest ULONGLONG -- why? + // + + keyLength += sizeof(ULONGLONG) - (keyLength & (sizeof(ULONGLONG) - 1)); + + readStructure = ExAllocatePoolWithTag(NonPagedPool, + keyLength, + DVD_TAG_READ_KEY); + if (readStructure == NULL) { + status = STATUS_INSUFFICIENT_RESOURCES; + break; + } + + RtlZeroMemory (readStructure, keyLength); + readStructure->Format = DvdCopyrightDescriptor; + + // + // Build a request for READ_STRUCTURE + // + + ClassSendDeviceIoControlSynchronous( + IOCTL_DVD_READ_STRUCTURE, + DeviceObject, + readStructure, + keyLength, + sizeof(DVD_DESCRIPTOR_HEADER) + + sizeof(DVD_COPYRIGHT_DESCRIPTOR), + FALSE, + &ioStatus); + + status = ioStatus.Status; + + if (!NT_SUCCESS(status)) { + TraceLog((CdromDebugWarning, + "CdRomDvdGetRegion => read structure failed %x\n", + status)); + ExFreePool(readStructure); + break; + } + + // + // we got the copyright descriptor, so now get the region if possible + // + + dvdHeader = (PDVD_DESCRIPTOR_HEADER) readStructure; + copyRightDescriptor = (PDVD_COPYRIGHT_DESCRIPTOR) dvdHeader->Data; + + // + // the original irp's systembuffer has a copy of the info that + // should be passed down in the request + // + + dvdRegion = Irp->AssociatedIrp.SystemBuffer; + + dvdRegion->CopySystem = copyRightDescriptor->CopyrightProtectionType; + dvdRegion->RegionData = copyRightDescriptor->RegionManagementInformation; + + // + // now reuse the buffer to request the copy protection info + // + + copyProtectKey = (PDVD_COPY_PROTECT_KEY) readStructure; + RtlZeroMemory (copyProtectKey, DVD_RPC_KEY_LENGTH); + copyProtectKey->KeyLength = DVD_RPC_KEY_LENGTH; + copyProtectKey->KeyType = DvdGetRpcKey; + + // + // send a request for READ_KEY + // + + ClassSendDeviceIoControlSynchronous( + IOCTL_DVD_READ_KEY, + DeviceObject, + copyProtectKey, + DVD_RPC_KEY_LENGTH, + DVD_RPC_KEY_LENGTH, + FALSE, + &ioStatus); + status = ioStatus.Status; + + if (!NT_SUCCESS(status)) { + TraceLog((CdromDebugWarning, + "CdRomDvdGetRegion => read key failed %x\n", + status)); + ExFreePool(readStructure); + break; + } + + // + // the request succeeded. if a supported scheme is returned, + // then return the information to the caller + // + + rpcKey = (PDVD_RPC_KEY) copyProtectKey->KeyData; + + if (rpcKey->RpcScheme == 1) { + + if (rpcKey->TypeCode) { + + dvdRegion->SystemRegion = ~rpcKey->RegionMask; + dvdRegion->ResetCount = rpcKey->UserResetsAvailable; + + } else { + + // + // the drive has not been set for any region + // + + dvdRegion->SystemRegion = 0; + dvdRegion->ResetCount = rpcKey->UserResetsAvailable; + } + Irp->IoStatus.Information = sizeof(DVD_REGION); + + } else { + + TraceLog((CdromDebugWarning, + "CdRomDvdGetRegion => rpcKey->RpcScheme != 1\n")); + status = STATUS_INVALID_DEVICE_REQUEST; + } + + ExFreePool(readStructure); + break; + } + + + case IOCTL_STORAGE_SET_READ_AHEAD: { + + if(irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(STORAGE_SET_READ_AHEAD)) { + + TraceLog((CdromDebugWarning, + "DvdDeviceControl: SetReadAhead buffer too small\n")); + status = STATUS_INVALID_PARAMETER; + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + } + + case IOCTL_DISK_IS_WRITABLE: { + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + return STATUS_PENDING; + + } + + case IOCTL_DISK_GET_DRIVE_LAYOUT: { + + ULONG size; + + // + // we always fake zero or one partitions, and one partition + // structure is included in DRIVE_LAYOUT_INFORMATION + // + + size = FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION, PartitionEntry[1]); + + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Get drive layout\n")); + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < size) { + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = size; + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + return STATUS_PENDING; + + + } + case IOCTL_DISK_GET_DRIVE_LAYOUT_EX: { + + ULONG size; + + // + // we always fake zero or one partitions, and one partition + // structure is included in DRIVE_LAYOUT_INFORMATION_EX + // + + size = FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION_EX, PartitionEntry[1]); + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Get drive layout ex\n")); + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < size) { + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = size; + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + return STATUS_PENDING; + + } + + + case IOCTL_DISK_GET_PARTITION_INFO: { + + // + // Check that the buffer is large enough. + // + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(PARTITION_INFORMATION)) { + + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION); + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + return STATUS_PENDING; + + } + case IOCTL_DISK_GET_PARTITION_INFO_EX: { + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(PARTITION_INFORMATION_EX)) { + + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION_EX); + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + return STATUS_PENDING; + } + + case IOCTL_DISK_VERIFY: { + + TraceLog((CdromDebugTrace, + "IOCTL_DISK_VERIFY to device %p through irp %p\n", + DeviceObject, Irp)); + + // + // Validate buffer length. + // + + if (irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(VERIFY_INFORMATION)) { + + status = STATUS_INFO_LENGTH_MISMATCH; + break; + } + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + return STATUS_PENDING; + } + + case IOCTL_DISK_GET_LENGTH_INFO: { + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(GET_LENGTH_INFORMATION)) { + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(GET_LENGTH_INFORMATION); + break; + } + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + return STATUS_PENDING; + } + + case IOCTL_CDROM_GET_CONFIGURATION: { + + PGET_CONFIGURATION_IOCTL_INPUT inputBuffer; + + TraceLog((CdromDebugTrace, + "IOCTL_CDROM_GET_CONFIGURATION to via irp %p\n", Irp)); + + // + // Validate buffer length. + // + + if (irpStack->Parameters.DeviceIoControl.InputBufferLength != + sizeof(GET_CONFIGURATION_IOCTL_INPUT)) { + status = STATUS_INFO_LENGTH_MISMATCH; + break; + } + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(GET_CONFIGURATION_HEADER)) { + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(GET_CONFIGURATION_HEADER); + break; + } + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength > 0xffff) { + // output buffer is too large + status = STATUS_INVALID_BUFFER_SIZE; + break; + } + + // + // also verify the arguments are reasonable. + // + + inputBuffer = Irp->AssociatedIrp.SystemBuffer; + if (inputBuffer->Feature > 0xffff) { + status = STATUS_INVALID_PARAMETER; + break; + } + if ((inputBuffer->RequestType != SCSI_GET_CONFIGURATION_REQUEST_TYPE_ONE) && + (inputBuffer->RequestType != SCSI_GET_CONFIGURATION_REQUEST_TYPE_CURRENT) && + (inputBuffer->RequestType != SCSI_GET_CONFIGURATION_REQUEST_TYPE_ALL)) { + status = STATUS_INVALID_PARAMETER; + break; + } + if (inputBuffer->Reserved[0] || inputBuffer->Reserved[1]) { + status = STATUS_INVALID_PARAMETER; + break; + } + + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + return STATUS_PENDING; + + } + + default: { + + BOOLEAN synchronize = (KeGetCurrentIrql() == PASSIVE_LEVEL); + PKEVENT deviceControlEvent; + + // + // If the ioctl has come in at passive level then we will synchronize + // with our start-io routine when sending the ioctl. If the ioctl + // has come in at a higher interrupt level and it was not handled + // above then it's unlikely to be a request for the class DLL - however + // we'll still use it's common code to forward the request through. + // + + if (synchronize) { + + deviceControlEvent = ExAllocatePoolWithTag(NonPagedPool, + sizeof(KEVENT), + CDROM_TAG_DC_EVENT); + + if (deviceControlEvent == NULL) { + + // + // must complete this irp unsuccessful here + // + status = STATUS_INSUFFICIENT_RESOURCES; + break; + + } else { + + PIO_STACK_LOCATION currentStack; + + KeInitializeEvent(deviceControlEvent, NotificationEvent, FALSE); + + currentStack = IoGetCurrentIrpStackLocation(Irp); + nextStack = IoGetNextIrpStackLocation(Irp); + + // + // Copy the stack down a notch + // + + IoCopyCurrentIrpStackLocationToNext(Irp); + + IoSetCompletionRoutine( + Irp, + CdRomClassIoctlCompletion, + deviceControlEvent, + TRUE, + TRUE, + TRUE + ); + + IoSetNextIrpStackLocation(Irp); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + // + // Override volume verifies on this stack location so that we + // will be forced through the synchronization. Once this + // location goes away we get the old value back + // + + SET_FLAG(nextStack->Flags, SL_OVERRIDE_VERIFY_VOLUME); + + IoStartPacket(DeviceObject, Irp, NULL, NULL); + + // + // Wait for CdRomClassIoctlCompletion to set the event. This + // ensures serialization remains intact for these unhandled device + // controls. + // + + KeWaitForSingleObject( + deviceControlEvent, + Executive, + KernelMode, + FALSE, + NULL); + + ExFreePool(deviceControlEvent); + + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: irp %p synchronized\n", Irp)); + + status = Irp->IoStatus.Status; + } + + } else { + status = STATUS_SUCCESS; + } + + // + // If an error occured then propagate that back up - we are no longer + // guaranteed synchronization and the upper layers will have to + // retry. + // + // If no error occured, call down to the class driver directly + // then start up the next request. + // + + if (NT_SUCCESS(status)) { + + UCHAR uniqueAddress; + + // + // The class device control routine will release the remove + // lock for this Irp. We need to make sure we have one + // available so that it's safe to call IoStartNextPacket + // + + if(synchronize) { + + ClassAcquireRemoveLock(DeviceObject, (PIRP)&uniqueAddress); + + } + + status = ClassDeviceControl(DeviceObject, Irp); + + if(synchronize) { + KeRaiseIrql(DISPATCH_LEVEL, &irql); + IoStartNextPacket(DeviceObject, FALSE); + KeLowerIrql(irql); + ClassReleaseRemoveLock(DeviceObject, (PIRP)&uniqueAddress); + } + return status; + + } + + // + // an error occurred (either STATUS_INSUFFICIENT_RESOURCES from + // attempting to synchronize or StartIo() error'd this one + // out), so we need to finish the irp, which is + // done at the end of this routine. + // + break; + + } // end default case + + } // end switch() + + if (status == STATUS_VERIFY_REQUIRED) { + + // + // If the status is verified required and this request + // should bypass verify required then retry the request. + // + + if (irpStack->Flags & SL_OVERRIDE_VERIFY_VOLUME) { + + status = STATUS_IO_DEVICE_ERROR; + goto RetryControl; + + } + } + + if (IoIsErrorUserInduced(status)) { + + if (Irp->Tail.Overlay.Thread) { + IoSetHardErrorOrVerifyDevice(Irp, DeviceObject); + } + + } + + // + // Update IRP with completion status. + // + + Irp->IoStatus.Status = status; + + // + // Complete the request. + // + + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_DISK_INCREMENT); + TraceLog((CdromDebugTrace, + "CdRomDeviceControl: Status is %lx\n", status)); + return status; + +} // end CdRomDeviceControl() + + +NTSTATUS +CdRomClassIoctlCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ) +/*++ + +Routine Description: + + This routine signals the event used by CdRomDeviceControl to synchronize + class driver (and lower level driver) ioctls with cdrom's startio routine. + The irp completion is short-circuited so that CdRomDeviceControlDispatch + can reissue it once it wakes up. + +Arguments: + + DeviceObject - the device object + Irp - the request we are synchronizing + Context - a PKEVENT that we need to signal + +Return Value: + + NTSTATUS + +--*/ +{ + PKEVENT syncEvent = (PKEVENT) Context; + + TraceLog((CdromDebugTrace, + "CdRomClassIoctlCompletion: setting event for irp %p\n", Irp)); + + // + // We released the lock when we completed this request. Reacquire it. + // + + ClassAcquireRemoveLock(DeviceObject, Irp); + + KeSetEvent(syncEvent, IO_DISK_INCREMENT, FALSE); + + return STATUS_MORE_PROCESSING_REQUIRED; +} + + +NTSTATUS +CdRomDeviceControlCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + + PCDROM_DATA cdData = (PCDROM_DATA)(commonExtension->DriverData); + BOOLEAN use6Byte = TEST_FLAG(cdData->XAFlags, XA_USE_6_BYTE); + + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PIO_STACK_LOCATION realIrpStack; + PIO_STACK_LOCATION realIrpNextStack; + + PSCSI_REQUEST_BLOCK srb = Context; + + PIRP realIrp = NULL; + + NTSTATUS status; + BOOLEAN retry; + + // + // Extract the 'real' irp from the irpstack. + // + + realIrp = (PIRP) irpStack->Parameters.Others.Argument2; + realIrpStack = IoGetCurrentIrpStackLocation(realIrp); + realIrpNextStack = IoGetNextIrpStackLocation(realIrp); + + // + // check that we've really got the correct irp + // + + ASSERT(realIrpNextStack->Parameters.Others.Argument3 == Irp); + + // + // Check SRB status for success of completing request. + // + + if (SRB_STATUS(srb->SrbStatus) != SRB_STATUS_SUCCESS) { + + ULONG retryInterval; + + TraceLog((CdromDebugTrace, + "CdRomDeviceControlCompletion: Irp %p, Srb %p Real Irp %p Status %lx\n", + Irp, + srb, + realIrp, + srb->SrbStatus)); + + // + // Release the queue if it is frozen. + // + + if (srb->SrbStatus & SRB_STATUS_QUEUE_FROZEN) { + TraceLog((CdromDebugTrace, + "CdRomDeviceControlCompletion: Releasing Queue\n")); + ClassReleaseQueue(DeviceObject); + } + + + retry = ClassInterpretSenseInfo(DeviceObject, + srb, + irpStack->MajorFunction, + irpStack->Parameters.DeviceIoControl.IoControlCode, + MAXIMUM_RETRIES - ((ULONG)(ULONG_PTR)realIrpNextStack->Parameters.Others.Argument1), + &status, + &retryInterval); + + TraceLog((CdromDebugTrace, + "CdRomDeviceControlCompletion: IRP will %sbe retried\n", + (retry ? "" : "not "))); + + // + // Some of the Device Controls need special cases on non-Success status's. + // + + if (realIrpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL) { + if ((realIrpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_GET_LAST_SESSION) || + (realIrpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_READ_TOC) || + (realIrpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_READ_TOC_EX) || + (realIrpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_GET_CONTROL) || + (realIrpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_GET_VOLUME)) { + + if (status == STATUS_DATA_OVERRUN) { + status = STATUS_SUCCESS; + retry = FALSE; + } + } + + if (realIrpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_READ_Q_CHANNEL) { + PLAY_ACTIVE(fdoExtension) = FALSE; + } + } + + // + // If the status is verified required and the this request + // should bypass verify required then retry the request. + // + + if (realIrpStack->Flags & SL_OVERRIDE_VERIFY_VOLUME && + status == STATUS_VERIFY_REQUIRED) { + + // note: status gets overwritten here + status = STATUS_IO_DEVICE_ERROR; + retry = TRUE; + + if (((realIrpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL) || + (realIrpStack->MajorFunction == IRP_MJ_INTERNAL_DEVICE_CONTROL) + ) && + ((realIrpStack->Parameters.DeviceIoControl.IoControlCode == + IOCTL_CDROM_CHECK_VERIFY) || + (realIrpStack->Parameters.DeviceIoControl.IoControlCode == + IOCTL_STORAGE_CHECK_VERIFY) || + (realIrpStack->Parameters.DeviceIoControl.IoControlCode == + IOCTL_STORAGE_CHECK_VERIFY2) || + (realIrpStack->Parameters.DeviceIoControl.IoControlCode == + IOCTL_DISK_CHECK_VERIFY) + ) + ) { + + // + // Update the geometry information, as the media could have + // changed. The completion routine for this will complete + // the real irp and start the next packet. + // + + if (srb) { + if (srb->SenseInfoBuffer) { + ExFreePool(srb->SenseInfoBuffer); + } + if (srb->DataBuffer) { + ExFreePool(srb->DataBuffer); + } + ExFreePool(srb); + srb = NULL; + } + + if (Irp->MdlAddress) { + IoFreeMdl(Irp->MdlAddress); + Irp->MdlAddress = NULL; + } + + IoFreeIrp(Irp); + Irp = NULL; + + status = CdRomUpdateCapacity(fdoExtension, realIrp, NULL); + TraceLog((CdromDebugTrace, + "CdRomDeviceControlCompletion: [%p] " + "CdRomUpdateCapacity completed with status %lx\n", + realIrp, status)); + + // + // needed to update the capacity. + // the irp's already handed off to CdRomUpdateCapacity(). + // we've already free'd the current irp. + // nothing left to do in this code path. + // + + return STATUS_MORE_PROCESSING_REQUIRED; + + } // end of ioctls to update capacity + + } + + if (retry && realIrpNextStack->Parameters.Others.Argument1--) { + + if (((ULONG)(ULONG_PTR)realIrpNextStack->Parameters.Others.Argument1)) { + + // + // Retry request. + // + + TraceLog((CdromDebugWarning, + "Retry request %p - Calling StartIo\n", Irp)); + + + ExFreePool(srb->SenseInfoBuffer); + if (srb->DataBuffer) { + ExFreePool(srb->DataBuffer); + } + ExFreePool(srb); + if (Irp->MdlAddress) { + IoFreeMdl(Irp->MdlAddress); + } + + realIrpNextStack->Parameters.Others.Argument3 = (PVOID)-1; + IoFreeIrp(Irp); + + CdRomRetryRequest(fdoExtension, realIrp, retryInterval, FALSE); + return STATUS_MORE_PROCESSING_REQUIRED; + } + + // + // Exhausted retries. Fall through and complete the request with + // the appropriate status. + // + + } + } else { + + // + // Set status for successful request. + // + + status = STATUS_SUCCESS; + + } + + + if (NT_SUCCESS(status)) { + + BOOLEAN b = FALSE; + + + switch (realIrpStack->Parameters.DeviceIoControl.IoControlCode) { + + case IOCTL_CDROM_GET_CONFIGURATION: { + RtlMoveMemory(realIrp->AssociatedIrp.SystemBuffer, + srb->DataBuffer, + srb->DataTransferLength); + realIrp->IoStatus.Information = srb->DataTransferLength; + break; + } + + case IOCTL_DISK_GET_LENGTH_INFO: { + + PGET_LENGTH_INFORMATION lengthInfo; + + CdRomInterpretReadCapacity(DeviceObject, + (PREAD_CAPACITY_DATA)srb->DataBuffer); + + lengthInfo = (PGET_LENGTH_INFORMATION)realIrp->AssociatedIrp.SystemBuffer; + lengthInfo->Length = commonExtension->PartitionLength; + realIrp->IoStatus.Information = sizeof(GET_LENGTH_INFORMATION); + status = STATUS_SUCCESS; + break; + } + + case IOCTL_DISK_GET_DRIVE_GEOMETRY_EX: + case IOCTL_CDROM_GET_DRIVE_GEOMETRY_EX: { + + PDISK_GEOMETRY_EX geometryEx; + + CdRomInterpretReadCapacity(DeviceObject, + (PREAD_CAPACITY_DATA)srb->DataBuffer); + + geometryEx = (PDISK_GEOMETRY_EX)(realIrp->AssociatedIrp.SystemBuffer); + geometryEx->DiskSize = commonExtension->PartitionLength; + geometryEx->Geometry = fdoExtension->DiskGeometry; + realIrp->IoStatus.Information = + FIELD_OFFSET(DISK_GEOMETRY_EX, Data); + break; + } + + case IOCTL_DISK_GET_DRIVE_GEOMETRY: + case IOCTL_CDROM_GET_DRIVE_GEOMETRY: { + + PDISK_GEOMETRY geometry; + + CdRomInterpretReadCapacity(DeviceObject, + (PREAD_CAPACITY_DATA)srb->DataBuffer); + + geometry = (PDISK_GEOMETRY)(realIrp->AssociatedIrp.SystemBuffer); + *geometry = fdoExtension->DiskGeometry; + realIrp->IoStatus.Information = sizeof(DISK_GEOMETRY); + break; + } + + case IOCTL_DISK_VERIFY: { + // + // nothing to do but return the status... + // + break; + } + + case IOCTL_DISK_CHECK_VERIFY: + case IOCTL_STORAGE_CHECK_VERIFY: + case IOCTL_CDROM_CHECK_VERIFY: { + + if((realIrpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_CHECK_VERIFY) && + (realIrpStack->Parameters.DeviceIoControl.OutputBufferLength)) { + + *((PULONG)realIrp->AssociatedIrp.SystemBuffer) = + commonExtension->PartitionZeroExtension->MediaChangeCount; + + realIrp->IoStatus.Information = sizeof(ULONG); + } else { + realIrp->IoStatus.Information = 0; + } + + TraceLog((CdromDebugTrace, + "CdRomDeviceControlCompletion: [%p] completing " + "CHECK_VERIFY buddy irp %p\n", realIrp, Irp)); + break; + } + + case IOCTL_CDROM_READ_TOC_EX: { + + if (srb->DataTransferLength < MINIMUM_CDROM_READ_TOC_EX_SIZE) { + status = STATUS_INVALID_DEVICE_REQUEST; + break; + } + + // + // Copy the returned info into the user buffer. + // + + RtlMoveMemory(realIrp->AssociatedIrp.SystemBuffer, + srb->DataBuffer, + srb->DataTransferLength); + + // + // update information field. + // + + realIrp->IoStatus.Information = srb->DataTransferLength; + break; + } + + + case IOCTL_CDROM_GET_LAST_SESSION: + case IOCTL_CDROM_READ_TOC: { + + // + // Copy the returned info into the user buffer. + // + + RtlMoveMemory(realIrp->AssociatedIrp.SystemBuffer, + srb->DataBuffer, + srb->DataTransferLength); + + // + // update information field. + // + + realIrp->IoStatus.Information = srb->DataTransferLength; + break; + } + + case IOCTL_DVD_READ_STRUCTURE: { + + DVD_STRUCTURE_FORMAT format = ((PDVD_READ_STRUCTURE) realIrp->AssociatedIrp.SystemBuffer)->Format; + + PDVD_DESCRIPTOR_HEADER header = realIrp->AssociatedIrp.SystemBuffer; + + FOUR_BYTE fourByte; + PTWO_BYTE twoByte; + UCHAR tmp; + + TraceLog((CdromDebugTrace, + "DvdDeviceControlCompletion - IOCTL_DVD_READ_STRUCTURE: completing irp %p (buddy %p)\n", + Irp, + realIrp)); + + TraceLog((CdromDebugTrace, + "DvdDCCompletion - READ_STRUCTURE: descriptor format of %d\n", format)); + + RtlMoveMemory(header, + srb->DataBuffer, + srb->DataTransferLength); + + // + // Cook the data. There are a number of fields that really + // should be byte-swapped for the caller. + // + + TraceLog((CdromDebugInfo, + "DvdDCCompletion - READ_STRUCTURE:\n" + "\tHeader at %p\n" + "\tDvdDCCompletion - READ_STRUCTURE: data at %p\n" + "\tDataBuffer was at %p\n" + "\tDataTransferLength was %lx\n", + header, + header->Data, + srb->DataBuffer, + srb->DataTransferLength)); + + // + // First the fields in the header + // + + TraceLog((CdromDebugInfo, "READ_STRUCTURE: header->Length %lx -> ", + header->Length)); + REVERSE_SHORT(&header->Length); + TraceLog((CdromDebugInfo, "%lx\n", header->Length)); + + // + // Now the fields in the descriptor + // + + if(format == DvdPhysicalDescriptor) { + + PDVD_LAYER_DESCRIPTOR layer = (PDVD_LAYER_DESCRIPTOR) &(header->Data[0]); + + TraceLog((CdromDebugInfo, "READ_STRUCTURE: StartingDataSector %lx -> ", + layer->StartingDataSector)); + REVERSE_LONG(&(layer->StartingDataSector)); + TraceLog((CdromDebugInfo, "%lx\n", layer->StartingDataSector)); + + TraceLog((CdromDebugInfo, "READ_STRUCTURE: EndDataSector %lx -> ", + layer->EndDataSector)); + REVERSE_LONG(&(layer->EndDataSector)); + TraceLog((CdromDebugInfo, "%lx\n", layer->EndDataSector)); + + TraceLog((CdromDebugInfo, "READ_STRUCTURE: EndLayerZeroSector %lx -> ", + layer->EndLayerZeroSector)); + REVERSE_LONG(&(layer->EndLayerZeroSector)); + TraceLog((CdromDebugInfo, "%lx\n", layer->EndLayerZeroSector)); + } + + TraceLog((CdromDebugTrace, "Status is %lx\n", Irp->IoStatus.Status)); + TraceLog((CdromDebugTrace, "DvdDeviceControlCompletion - " + "IOCTL_DVD_READ_STRUCTURE: data transfer length of %d\n", + srb->DataTransferLength)); + + realIrp->IoStatus.Information = srb->DataTransferLength; + break; + } + + case IOCTL_DVD_READ_KEY: { + + PDVD_COPY_PROTECT_KEY copyProtectKey = realIrp->AssociatedIrp.SystemBuffer; + + PCDVD_KEY_HEADER keyHeader = srb->DataBuffer; + ULONG dataLength; + + ULONG transferLength = + srb->DataTransferLength - + FIELD_OFFSET(CDVD_KEY_HEADER, Data); + + // + // Adjust the data length to ignore the two reserved bytes in the + // header. + // + + dataLength = (keyHeader->DataLength[0] << 8) + + keyHeader->DataLength[1]; + dataLength -= 2; + + // + // take the minimum of the transferred length and the + // length as specified in the header. + // + + if(dataLength < transferLength) { + transferLength = dataLength; + } + + TraceLog((CdromDebugTrace, + "DvdDeviceControlCompletion: [%p] - READ_KEY with " + "transfer length of (%d or %d) bytes\n", + Irp, + dataLength, + srb->DataTransferLength - 2)); + + // + // Copy the key data into the return buffer + // + if(copyProtectKey->KeyType == DvdTitleKey) { + + RtlMoveMemory(copyProtectKey->KeyData, + keyHeader->Data + 1, + transferLength - 1); + copyProtectKey->KeyData[transferLength - 1] = 0; + + // + // If this is a title key then we need to copy the CGMS flags + // as well. + // + copyProtectKey->KeyFlags = *(keyHeader->Data); + + } else { + + RtlMoveMemory(copyProtectKey->KeyData, + keyHeader->Data, + transferLength); + } + + copyProtectKey->KeyLength = sizeof(DVD_COPY_PROTECT_KEY); + copyProtectKey->KeyLength += transferLength; + + realIrp->IoStatus.Information = copyProtectKey->KeyLength; + break; + } + + case IOCTL_DVD_START_SESSION: { + + PDVD_SESSION_ID sessionId = realIrp->AssociatedIrp.SystemBuffer; + + PCDVD_KEY_HEADER keyHeader = srb->DataBuffer; + PCDVD_REPORT_AGID_DATA keyData = (PCDVD_REPORT_AGID_DATA) keyHeader->Data; + + *sessionId = keyData->AGID; + + realIrp->IoStatus.Information = sizeof(DVD_SESSION_ID); + + break; + } + + case IOCTL_DVD_END_SESSION: + case IOCTL_DVD_SEND_KEY: + case IOCTL_DVD_SEND_KEY2: + + // + // nothing to return + // + realIrp->IoStatus.Information = 0; + break; + + case IOCTL_CDROM_PLAY_AUDIO_MSF: + + PLAY_ACTIVE(fdoExtension) = TRUE; + + break; + + case IOCTL_CDROM_READ_Q_CHANNEL: { + + PSUB_Q_CHANNEL_DATA userChannelData = realIrp->AssociatedIrp.SystemBuffer; + PCDROM_SUB_Q_DATA_FORMAT inputBuffer = realIrp->AssociatedIrp.SystemBuffer; + PSUB_Q_CHANNEL_DATA subQPtr = srb->DataBuffer; + +#if DBG + switch( inputBuffer->Format ) { + + case IOCTL_CDROM_CURRENT_POSITION: + TraceLog((CdromDebugTrace,"CdRomDeviceControlCompletion: Audio Status is %u\n", subQPtr->CurrentPosition.Header.AudioStatus )); + TraceLog((CdromDebugTrace,"CdRomDeviceControlCompletion: ADR = 0x%x\n", subQPtr->CurrentPosition.ADR )); + TraceLog((CdromDebugTrace,"CdRomDeviceControlCompletion: Control = 0x%x\n", subQPtr->CurrentPosition.Control )); + TraceLog((CdromDebugTrace,"CdRomDeviceControlCompletion: Track = %u\n", subQPtr->CurrentPosition.TrackNumber )); + TraceLog((CdromDebugTrace,"CdRomDeviceControlCompletion: Index = %u\n", subQPtr->CurrentPosition.IndexNumber )); + TraceLog((CdromDebugTrace,"CdRomDeviceControlCompletion: Absolute Address = %x\n", *((PULONG)subQPtr->CurrentPosition.AbsoluteAddress) )); + TraceLog((CdromDebugTrace,"CdRomDeviceControlCompletion: Relative Address = %x\n", *((PULONG)subQPtr->CurrentPosition.TrackRelativeAddress) )); + break; + + case IOCTL_CDROM_MEDIA_CATALOG: + TraceLog((CdromDebugTrace,"CdRomDeviceControlCompletion: Audio Status is %u\n", subQPtr->MediaCatalog.Header.AudioStatus )); + TraceLog((CdromDebugTrace,"CdRomDeviceControlCompletion: Mcval is %u\n", subQPtr->MediaCatalog.Mcval )); + break; + + case IOCTL_CDROM_TRACK_ISRC: + TraceLog((CdromDebugTrace,"CdRomDeviceControlCompletion: Audio Status is %u\n", subQPtr->TrackIsrc.Header.AudioStatus )); + TraceLog((CdromDebugTrace,"CdRomDeviceControlCompletion: Tcval is %u\n", subQPtr->TrackIsrc.Tcval )); + break; + + } +#endif + + // + // Update the play active status. + // + + if (subQPtr->CurrentPosition.Header.AudioStatus == AUDIO_STATUS_IN_PROGRESS) { + + PLAY_ACTIVE(fdoExtension) = TRUE; + + } else { + + PLAY_ACTIVE(fdoExtension) = FALSE; + + } + + // + // Check if output buffer is large enough to contain + // the data. + // + + if (realIrpStack->Parameters.DeviceIoControl.OutputBufferLength < + srb->DataTransferLength) { + + srb->DataTransferLength = + realIrpStack->Parameters.DeviceIoControl.OutputBufferLength; + } + + // + // Copy our buffer into users. + // + + RtlMoveMemory(userChannelData, + subQPtr, + srb->DataTransferLength); + + realIrp->IoStatus.Information = srb->DataTransferLength; + break; + } + + case IOCTL_CDROM_PAUSE_AUDIO: + + PLAY_ACTIVE(fdoExtension) = FALSE; + realIrp->IoStatus.Information = 0; + break; + + case IOCTL_CDROM_RESUME_AUDIO: + + realIrp->IoStatus.Information = 0; + break; + + case IOCTL_CDROM_SEEK_AUDIO_MSF: + + realIrp->IoStatus.Information = 0; + break; + + case IOCTL_CDROM_STOP_AUDIO: + + PLAY_ACTIVE(fdoExtension) = FALSE; + realIrp->IoStatus.Information = 0; + break; + + case IOCTL_CDROM_GET_CONTROL: { + + PCDROM_AUDIO_CONTROL audioControl = srb->DataBuffer; + PAUDIO_OUTPUT audioOutput; + ULONG bytesTransferred; + + audioOutput = ClassFindModePage((PCHAR)audioControl, + srb->DataTransferLength, + CDROM_AUDIO_CONTROL_PAGE, + use6Byte); + // + // Verify the page is as big as expected. + // + + bytesTransferred = (ULONG)((PCHAR) audioOutput - (PCHAR) audioControl) + + sizeof(AUDIO_OUTPUT); + + if (audioOutput != NULL && + srb->DataTransferLength >= bytesTransferred) { + + audioControl->LbaFormat = audioOutput->LbaFormat; + + audioControl->LogicalBlocksPerSecond = + (audioOutput->LogicalBlocksPerSecond[0] << (UCHAR)8) | + audioOutput->LogicalBlocksPerSecond[1]; + + realIrp->IoStatus.Information = sizeof(CDROM_AUDIO_CONTROL); + + } else { + realIrp->IoStatus.Information = 0; + status = STATUS_INVALID_DEVICE_REQUEST; + } + break; + } + + case IOCTL_CDROM_GET_VOLUME: { + + PAUDIO_OUTPUT audioOutput; + PVOLUME_CONTROL volumeControl = srb->DataBuffer; + ULONG i; + ULONG bytesTransferred; + + audioOutput = ClassFindModePage((PCHAR)volumeControl, + srb->DataTransferLength, + CDROM_AUDIO_CONTROL_PAGE, + use6Byte); + + // + // Verify the page is as big as expected. + // + + bytesTransferred = (ULONG)((PCHAR) audioOutput - (PCHAR) volumeControl) + + sizeof(AUDIO_OUTPUT); + + if (audioOutput != NULL && + srb->DataTransferLength >= bytesTransferred) { + + for (i=0; i<4; i++) { + volumeControl->PortVolume[i] = + audioOutput->PortOutput[i].Volume; + } + + // + // Set bytes transferred in IRP. + // + + realIrp->IoStatus.Information = sizeof(VOLUME_CONTROL); + + } else { + realIrp->IoStatus.Information = 0; + status = STATUS_INVALID_DEVICE_REQUEST; + } + + break; + } + + case IOCTL_CDROM_SET_VOLUME: + + realIrp->IoStatus.Information = 0; + break; + + default: + + ASSERT(FALSE); + realIrp->IoStatus.Information = 0; + status = STATUS_INVALID_DEVICE_REQUEST; + + } // end switch() + } + + // + // Deallocate srb and sense buffer. + // + + if (srb) { + if (srb->DataBuffer) { + ExFreePool(srb->DataBuffer); + } + if (srb->SenseInfoBuffer) { + ExFreePool(srb->SenseInfoBuffer); + } + ExFreePool(srb); + } + + if (realIrp->PendingReturned) { + IoMarkIrpPending(realIrp); + } + + if (Irp->MdlAddress) { + IoFreeMdl(Irp->MdlAddress); + } + + IoFreeIrp(Irp); + + // + // Set status in completing IRP. + // + + realIrp->IoStatus.Status = status; + + // + // Set the hard error if necessary. + // + + if (!NT_SUCCESS(status) && IoIsErrorUserInduced(status)) { + + // + // Store DeviceObject for filesystem, and clear + // in IoStatus.Information field. + // + + TraceLog((CdromDebugWarning, + "CdRomDeviceCompletion - Setting Hard Error on realIrp %p\n", + realIrp)); + if (realIrp->Tail.Overlay.Thread) { + IoSetHardErrorOrVerifyDevice(realIrp, DeviceObject); + } + + realIrp->IoStatus.Information = 0; + } + + // + // note: must complete the realIrp, as the completed irp (above) + // was self-allocated. + // + + CdRomCompleteIrpAndStartNextPacketSafely(DeviceObject, realIrp); + return STATUS_MORE_PROCESSING_REQUIRED; +} + + +NTSTATUS +CdRomSetVolumeIntermediateCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PCDROM_DATA cdData = (PCDROM_DATA)(commonExtension->DriverData); + BOOLEAN use6Byte = TEST_FLAG(cdData->XAFlags, XA_USE_6_BYTE); + PIO_STACK_LOCATION realIrpStack; + PIO_STACK_LOCATION realIrpNextStack; + PSCSI_REQUEST_BLOCK srb = Context; + PIRP realIrp = NULL; + NTSTATUS status; + BOOLEAN retry; + + // + // Extract the 'real' irp from the irpstack. + // + + realIrp = (PIRP) irpStack->Parameters.Others.Argument2; + realIrpStack = IoGetCurrentIrpStackLocation(realIrp); + realIrpNextStack = IoGetNextIrpStackLocation(realIrp); + + // + // Check SRB status for success of completing request. + // + + if (SRB_STATUS(srb->SrbStatus) != SRB_STATUS_SUCCESS) { + + ULONG retryInterval; + + TraceLog((CdromDebugTrace, + "CdRomSetVolumeIntermediateCompletion: Irp %p, Srb %p, Real Irp %p\n", + Irp, + srb, + realIrp)); + + // + // Release the queue if it is frozen. + // + + if (srb->SrbStatus & SRB_STATUS_QUEUE_FROZEN) { + ClassReleaseQueue(DeviceObject); + } + + + retry = ClassInterpretSenseInfo(DeviceObject, + srb, + irpStack->MajorFunction, + irpStack->Parameters.DeviceIoControl.IoControlCode, + MAXIMUM_RETRIES - ((ULONG)(ULONG_PTR)realIrpNextStack->Parameters.Others.Argument1), + &status, + &retryInterval); + + if (status == STATUS_DATA_OVERRUN) { + status = STATUS_SUCCESS; + retry = FALSE; + } + + // + // If the status is verified required and the this request + // should bypass verify required then retry the request. + // + + if (realIrpStack->Flags & SL_OVERRIDE_VERIFY_VOLUME && + status == STATUS_VERIFY_REQUIRED) { + + status = STATUS_IO_DEVICE_ERROR; + retry = TRUE; + } + + if (retry && realIrpNextStack->Parameters.Others.Argument1--) { + + if (((ULONG)(ULONG_PTR)realIrpNextStack->Parameters.Others.Argument1)) { + + // + // Retry request. + // + + TraceLog((CdromDebugWarning, + "Retry request %p - Calling StartIo\n", Irp)); + + + ExFreePool(srb->SenseInfoBuffer); + ExFreePool(srb->DataBuffer); + ExFreePool(srb); + if (Irp->MdlAddress) { + IoFreeMdl(Irp->MdlAddress); + } + + IoFreeIrp(Irp); + + CdRomRetryRequest(deviceExtension, + realIrp, + retryInterval, + FALSE); + + return STATUS_MORE_PROCESSING_REQUIRED; + + } + + // + // Exhausted retries. Fall through and complete the request with the appropriate status. + // + + } + } else { + + // + // Set status for successful request. + // + + status = STATUS_SUCCESS; + + } + + if (NT_SUCCESS(status)) { + + PAUDIO_OUTPUT audioInput = NULL; + PAUDIO_OUTPUT audioOutput; + PVOLUME_CONTROL volumeControl = realIrp->AssociatedIrp.SystemBuffer; + ULONG i,bytesTransferred,headerLength; + PVOID dataBuffer; + PCDB cdb; + + audioInput = ClassFindModePage((PCHAR)srb->DataBuffer, + srb->DataTransferLength, + CDROM_AUDIO_CONTROL_PAGE, + use6Byte); + + // + // Check to make sure the mode sense data is valid before we go on + // + + if(audioInput == NULL) { + + TraceLog((CdromDebugWarning, + "Mode Sense Page %d not found\n", + CDROM_AUDIO_CONTROL_PAGE)); + + realIrp->IoStatus.Information = 0; + realIrp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; + goto SafeExit; + } + + if (use6Byte) { + headerLength = sizeof(MODE_PARAMETER_HEADER); + } else { + headerLength = sizeof(MODE_PARAMETER_HEADER10); + } + + bytesTransferred = sizeof(AUDIO_OUTPUT) + headerLength; + + // + // Allocate a new buffer for the mode select. + // + + dataBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + bytesTransferred, + CDROM_TAG_VOLUME_INT); + + if (!dataBuffer) { + realIrp->IoStatus.Information = 0; + realIrp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + goto SafeExit; + } + + RtlZeroMemory(dataBuffer, bytesTransferred); + + // + // Rebuild the data buffer to include the user requested values. + // + + audioOutput = (PAUDIO_OUTPUT) ((PCHAR) dataBuffer + headerLength); + + for (i=0; i<4; i++) { + audioOutput->PortOutput[i].Volume = + volumeControl->PortVolume[i]; + audioOutput->PortOutput[i].ChannelSelection = + audioInput->PortOutput[i].ChannelSelection; + } + + audioOutput->CodePage = CDROM_AUDIO_CONTROL_PAGE; + audioOutput->ParameterLength = sizeof(AUDIO_OUTPUT) - 2; + audioOutput->Immediate = MODE_SELECT_IMMEDIATE; + + // + // Free the old data buffer, mdl. + // + + IoFreeMdl(Irp->MdlAddress); + Irp->MdlAddress = NULL; + ExFreePool(srb->DataBuffer); + + // + // set the data buffer to new allocation, so it can be + // freed in the exit path + // + + srb->DataBuffer = dataBuffer; + + // + // rebuild the srb. + // + + cdb = (PCDB)srb->Cdb; + RtlZeroMemory(cdb, CDB12GENERIC_LENGTH); + + srb->SrbStatus = srb->ScsiStatus = 0; + srb->SrbFlags = deviceExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_OUT); + srb->DataTransferLength = bytesTransferred; + + if (use6Byte) { + + cdb->MODE_SELECT.OperationCode = SCSIOP_MODE_SELECT; + cdb->MODE_SELECT.ParameterListLength = (UCHAR) bytesTransferred; + cdb->MODE_SELECT.PFBit = 1; + srb->CdbLength = 6; + } else { + + cdb->MODE_SELECT10.OperationCode = SCSIOP_MODE_SELECT10; + cdb->MODE_SELECT10.ParameterListLength[0] = (UCHAR) (bytesTransferred >> 8); + cdb->MODE_SELECT10.ParameterListLength[1] = (UCHAR) (bytesTransferred & 0xFF); + cdb->MODE_SELECT10.PFBit = 1; + srb->CdbLength = 10; + } + + // + // Prepare the MDL + // + + Irp->MdlAddress = IoAllocateMdl(dataBuffer, + bytesTransferred, + FALSE, + FALSE, + (PIRP) NULL); + + if (!Irp->MdlAddress) { + realIrp->IoStatus.Information = 0; + realIrp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + goto SafeExit; + } + + MmBuildMdlForNonPagedPool(Irp->MdlAddress); + + irpStack = IoGetNextIrpStackLocation(Irp); + irpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + irpStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_SCSI_EXECUTE_IN; + irpStack->Parameters.Scsi.Srb = srb; + + // + // reset the irp completion. + // + + IoSetCompletionRoutine(Irp, + CdRomDeviceControlCompletion, + srb, + TRUE, + TRUE, + TRUE); + // + // Call the port driver. + // + + IoCallDriver(commonExtension->LowerDeviceObject, Irp); + + return STATUS_MORE_PROCESSING_REQUIRED; + } + +SafeExit: + + // + // Deallocate srb and sense buffer. + // + + if (srb) { + if (srb->DataBuffer) { + ExFreePool(srb->DataBuffer); + } + if (srb->SenseInfoBuffer) { + ExFreePool(srb->SenseInfoBuffer); + } + ExFreePool(srb); + } + + if (Irp->PendingReturned) { + IoMarkIrpPending(Irp); + } + + if (realIrp->PendingReturned) { + IoMarkIrpPending(realIrp); + } + + if (Irp->MdlAddress) { + IoFreeMdl(Irp->MdlAddress); + } + + IoFreeIrp(Irp); + + // + // Set status in completing IRP. + // + + realIrp->IoStatus.Status = status; + + // + // Set the hard error if necessary. + // + + if (!NT_SUCCESS(status) && IoIsErrorUserInduced(status)) { + + // + // Store DeviceObject for filesystem, and clear + // in IoStatus.Information field. + // + + if (realIrp->Tail.Overlay.Thread) { + IoSetHardErrorOrVerifyDevice(realIrp, DeviceObject); + } + realIrp->IoStatus.Information = 0; + } + + CdRomCompleteIrpAndStartNextPacketSafely(DeviceObject, realIrp); + return STATUS_MORE_PROCESSING_REQUIRED; +} + +NTSTATUS +CdRomDvdEndAllSessionsCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ) + +/*++ + +Routine Description: + + This routine will setup the next stack location to issue an end session + to the device. It will increment the session id in the system buffer + and issue an END_SESSION for that AGID if the AGID is valid. + + When the new AGID is > 3 this routine will complete the request. + +Arguments: + + DeviceObject - the device object for this drive + + Irp - the request + + Context - done + +Return Value: + + STATUS_MORE_PROCESSING_REQUIRED if there is another AGID to clear + status otherwise. + +--*/ + +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + + PIO_STACK_LOCATION nextIrpStack = IoGetNextIrpStackLocation(Irp); + + PDVD_SESSION_ID sessionId = Irp->AssociatedIrp.SystemBuffer; + + NTSTATUS status; + + if(++(*sessionId) > MAX_COPY_PROTECT_AGID) { + + // + // We're done here - just return success and let the io system + // continue to complete it. + // + + return STATUS_SUCCESS; + + } + + IoCopyCurrentIrpStackLocationToNext(Irp); + + IoSetCompletionRoutine(Irp, + CdRomDvdEndAllSessionsCompletion, + NULL, + TRUE, + FALSE, + FALSE); + + IoMarkIrpPending(Irp); + + IoCallDriver(fdoExtension->CommonExtension.DeviceObject, Irp); + + // + // At this point we have to assume the irp may have already been + // completed. Ignore the returned status and return. + // + + return STATUS_MORE_PROCESSING_REQUIRED; +} + +NTSTATUS +CdRomDvdReadDiskKeyCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ) + +/*++ + +Routine Description: + + This routine handles the completion of a request to obtain the disk + key from the dvd media. It will transform the raw 2K of key data into + a DVD_COPY_PROTECT_KEY structure and copy back the saved key parameters + from the context pointer before returning. + +Arguments: + + DeviceObject - + + Irp - + + Context - a DVD_COPY_PROTECT_KEY pointer which contains the key + parameters handed down by the caller. + +Return Value: + + STATUS_SUCCESS; + +--*/ + +{ + PDVD_COPY_PROTECT_KEY savedKey = Context; + + PREAD_DVD_STRUCTURES_HEADER rawKey = Irp->AssociatedIrp.SystemBuffer; + PDVD_COPY_PROTECT_KEY outputKey = Irp->AssociatedIrp.SystemBuffer; + + if (NT_SUCCESS(Irp->IoStatus.Status)) { + + // + // Shift the data down to its new position. + // + + RtlMoveMemory(outputKey->KeyData, + rawKey->Data, + sizeof(DVD_DISK_KEY_DESCRIPTOR)); + + RtlCopyMemory(outputKey, + savedKey, + sizeof(DVD_COPY_PROTECT_KEY)); + + outputKey->KeyLength = DVD_DISK_KEY_LENGTH; + + Irp->IoStatus.Information = DVD_DISK_KEY_LENGTH; + + } else { + + TraceLog((CdromDebugWarning, + "DiskKey Failed with status %x, %p (%x) bytes\n", + Irp->IoStatus.Status, + (PVOID)Irp->IoStatus.Information, + ((rawKey->Length[0] << 16) | rawKey->Length[1]) + )); + + } + + // + // release the context block + // + + ExFreePool(Context); + + return STATUS_SUCCESS; +} + +NTSTATUS +CdRomXACompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ) + +/*++ + +Routine Description: + + This routine executes when the port driver has completed a request. + It looks at the SRB status in the completing SRB and if not success + it checks for valid request sense buffer information. If valid, the + info is used to update status with more precise message of type of + error. This routine deallocates the SRB. + +Arguments: + + DeviceObject - Supplies the device object which represents the logical + unit. + + Irp - Supplies the Irp which has completed. + + Context - Supplies a pointer to the SRB. + +Return Value: + + NT status + +--*/ + +{ + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PSCSI_REQUEST_BLOCK srb = Context; + PFUNCTIONAL_DEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension; + NTSTATUS status; + BOOLEAN retry; + + // + // Check SRB status for success of completing request. + // + + if (SRB_STATUS(srb->SrbStatus) != SRB_STATUS_SUCCESS) { + + ULONG retryInterval; + + TraceLog((CdromDebugTrace, "CdromXAComplete: IRP %p SRB %p Status %x\n", + Irp, srb, srb->SrbStatus)); + + // + // Release the queue if it is frozen. + // + + if (srb->SrbStatus & SRB_STATUS_QUEUE_FROZEN) { + ClassReleaseQueue(DeviceObject); + } + + retry = ClassInterpretSenseInfo( + DeviceObject, + srb, + irpStack->MajorFunction, + irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL ? irpStack->Parameters.DeviceIoControl.IoControlCode : 0, + MAXIMUM_RETRIES - irpStack->MinorFunction, // HACKHACK - REF #0001 + &status, + &retryInterval); + + // + // If the status is verified required and the this request + // should bypass verify required then retry the request. + // + + if (irpStack->Flags & SL_OVERRIDE_VERIFY_VOLUME && + status == STATUS_VERIFY_REQUIRED) { + + status = STATUS_IO_DEVICE_ERROR; + retry = TRUE; + } + + if (retry) { + + if (irpStack->MinorFunction != 0) { // HACKHACK - REF #0001 + + irpStack->MinorFunction--; // HACKHACK - REF #0001 + + // + // Retry request. + // + + TraceLog((CdromDebugWarning, + "CdRomXACompletion: Retry request %p (%x) - " + "Calling StartIo\n", Irp, irpStack->MinorFunction)); + + + ExFreePool(srb->SenseInfoBuffer); + ExFreePool(srb); + + // + // Call StartIo directly since IoStartNextPacket hasn't been called, + // the serialisation is still intact. + // + + CdRomRetryRequest(deviceExtension, + Irp, + retryInterval, + FALSE); + + return STATUS_MORE_PROCESSING_REQUIRED; + + } + + // + // Exhausted retries, fall through and complete the request + // with the appropriate status + // + + TraceLog((CdromDebugWarning, + "CdRomXACompletion: Retries exhausted for irp %p\n", + Irp)); + + } + + } else { + + // + // Set status for successful request. + // + + status = STATUS_SUCCESS; + + } // end if (SRB_STATUS(srb->SrbStatus) ... + + // + // Return SRB to nonpaged pool. + // + + ExFreePool(srb->SenseInfoBuffer); + ExFreePool(srb); + + // + // Set status in completing IRP. + // + + Irp->IoStatus.Status = status; + + // + // Set the hard error if necessary. + // + + if (!NT_SUCCESS(status) && + IoIsErrorUserInduced(status) && + Irp->Tail.Overlay.Thread != NULL ) { + + // + // Store DeviceObject for filesystem, and clear + // in IoStatus.Information field. + // + + IoSetHardErrorOrVerifyDevice(Irp, DeviceObject); + Irp->IoStatus.Information = 0; + } + + // + // If pending has be returned for this irp then mark the current stack as + // pending. + // + + if (Irp->PendingReturned) { + IoMarkIrpPending(Irp); + } + + { + KIRQL oldIrql = KeRaiseIrqlToDpcLevel(); + IoStartNextPacket(DeviceObject, FALSE); + KeLowerIrql(oldIrql); + } + ClassReleaseRemoveLock(DeviceObject, Irp); + + return status; +} + + +VOID +CdRomDeviceControlDvdReadStructure( + IN PDEVICE_OBJECT Fdo, + IN PIRP OriginalIrp, + IN PIRP NewIrp, + IN PSCSI_REQUEST_BLOCK Srb + ) +{ + PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(OriginalIrp); + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCDB cdb = (PCDB)Srb->Cdb; + PVOID dataBuffer; + + PDVD_READ_STRUCTURE request; + USHORT dataLength; + ULONG blockNumber; + PFOUR_BYTE fourByte; + + dataLength = + (USHORT)currentIrpStack->Parameters.DeviceIoControl.OutputBufferLength; + + request = OriginalIrp->AssociatedIrp.SystemBuffer; + blockNumber = + (ULONG)(request->BlockByteOffset.QuadPart >> fdoExtension->SectorShift); + fourByte = (PFOUR_BYTE) &blockNumber; + + Srb->CdbLength = 12; + Srb->TimeOutValue = fdoExtension->TimeOutValue; + Srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_DATA_IN); + + cdb->READ_DVD_STRUCTURE.OperationCode = SCSIOP_READ_DVD_STRUCTURE; + cdb->READ_DVD_STRUCTURE.RMDBlockNumber[0] = fourByte->Byte3; + cdb->READ_DVD_STRUCTURE.RMDBlockNumber[1] = fourByte->Byte2; + cdb->READ_DVD_STRUCTURE.RMDBlockNumber[2] = fourByte->Byte1; + cdb->READ_DVD_STRUCTURE.RMDBlockNumber[3] = fourByte->Byte0; + cdb->READ_DVD_STRUCTURE.LayerNumber = request->LayerNumber; + cdb->READ_DVD_STRUCTURE.Format = (UCHAR)request->Format; + +#if DBG + { + if ((UCHAR)request->Format > DvdMaxDescriptor) { + TraceLog((CdromDebugWarning, + "READ_DVD_STRUCTURE format %x = %s (%x bytes)\n", + (UCHAR)request->Format, + READ_DVD_STRUCTURE_FORMAT_STRINGS[DvdMaxDescriptor], + dataLength + )); + } else { + TraceLog((CdromDebugWarning, + "READ_DVD_STRUCTURE format %x = %s (%x bytes)\n", + (UCHAR)request->Format, + READ_DVD_STRUCTURE_FORMAT_STRINGS[(UCHAR)request->Format], + dataLength + )); + } + } +#endif // DBG + + if (request->Format == DvdDiskKeyDescriptor) { + + cdb->READ_DVD_STRUCTURE.AGID = (UCHAR) request->SessionId; + + } + + cdb->READ_DVD_STRUCTURE.AllocationLength[0] = (UCHAR)(dataLength >> 8); + cdb->READ_DVD_STRUCTURE.AllocationLength[1] = (UCHAR)(dataLength & 0xff); + Srb->DataTransferLength = dataLength; + + + + dataBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + dataLength, + DVD_TAG_READ_STRUCTURE); + + if (!dataBuffer) { + ExFreePool(Srb->SenseInfoBuffer); + ExFreePool(Srb); + IoFreeIrp(NewIrp); + OriginalIrp->IoStatus.Information = 0; + OriginalIrp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(OriginalIrp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, OriginalIrp); + return; + } + RtlZeroMemory(dataBuffer, dataLength); + + NewIrp->MdlAddress = IoAllocateMdl(dataBuffer, + currentIrpStack->Parameters.Read.Length, + FALSE, + FALSE, + (PIRP) NULL); + + if (NewIrp->MdlAddress == NULL) { + ExFreePool(dataBuffer); + ExFreePool(Srb->SenseInfoBuffer); + ExFreePool(Srb); + IoFreeIrp(NewIrp); + OriginalIrp->IoStatus.Information = 0; + OriginalIrp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + BAIL_OUT(OriginalIrp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, OriginalIrp); + return; + } + + // + // Prepare the MDL + // + + MmBuildMdlForNonPagedPool(NewIrp->MdlAddress); + + Srb->DataBuffer = dataBuffer; + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, NewIrp); + + return; +} + + +VOID +CdRomDeviceControlDvdEndSession( + IN PDEVICE_OBJECT Fdo, + IN PIRP OriginalIrp, + IN PIRP NewIrp, + IN PSCSI_REQUEST_BLOCK Srb + ) +{ + PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(OriginalIrp); + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCDB cdb = (PCDB)Srb->Cdb; + + PDVD_SESSION_ID sessionId = OriginalIrp->AssociatedIrp.SystemBuffer; + + Srb->CdbLength = 12; + Srb->TimeOutValue = fdoExtension->TimeOutValue; + Srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_NO_DATA_TRANSFER); + + cdb->SEND_KEY.OperationCode = SCSIOP_SEND_KEY; + cdb->SEND_KEY.AGID = (UCHAR) (*sessionId); + cdb->SEND_KEY.KeyFormat = DVD_INVALIDATE_AGID; + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, NewIrp); + return; + +} + + +VOID +CdRomDeviceControlDvdStartSessionReadKey( + IN PDEVICE_OBJECT Fdo, + IN PIRP OriginalIrp, + IN PIRP NewIrp, + IN PSCSI_REQUEST_BLOCK Srb + ) +{ + PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(OriginalIrp); + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCDB cdb = (PCDB)Srb->Cdb; + NTSTATUS status; + + PDVD_COPY_PROTECT_KEY keyParameters; + PCDVD_KEY_HEADER keyBuffer = NULL; + + ULONG keyLength; + + ULONG allocationLength; + PFOUR_BYTE fourByte; + + // + // Both of these use REPORT_KEY commands. + // Determine the size of the input buffer + // + + if(currentIrpStack->Parameters.DeviceIoControl.IoControlCode == + IOCTL_DVD_READ_KEY) { + + keyParameters = OriginalIrp->AssociatedIrp.SystemBuffer; + + keyLength = sizeof(CDVD_KEY_HEADER) + + (currentIrpStack->Parameters.DeviceIoControl.OutputBufferLength - + sizeof(DVD_COPY_PROTECT_KEY)); + } else { + + keyParameters = NULL; + keyLength = sizeof(CDVD_KEY_HEADER) + + sizeof(CDVD_REPORT_AGID_DATA); + } + + TRY { + + keyBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + keyLength, + DVD_TAG_READ_KEY); + + if(keyBuffer == NULL) { + + TraceLog((CdromDebugWarning, + "IOCTL_DVD_READ_KEY - couldn't allocate " + "%d byte buffer for key\n", + keyLength)); + status = STATUS_INSUFFICIENT_RESOURCES; + LEAVE; + } + + + NewIrp->MdlAddress = IoAllocateMdl(keyBuffer, + keyLength, + FALSE, + FALSE, + (PIRP) NULL); + + if(NewIrp->MdlAddress == NULL) { + + TraceLog((CdromDebugWarning, + "IOCTL_DVD_READ_KEY - couldn't create mdl\n")); + status = STATUS_INSUFFICIENT_RESOURCES; + LEAVE; + } + + MmBuildMdlForNonPagedPool(NewIrp->MdlAddress); + + Srb->DataBuffer = keyBuffer; + Srb->CdbLength = 12; + + cdb->REPORT_KEY.OperationCode = SCSIOP_REPORT_KEY; + + allocationLength = keyLength; + fourByte = (PFOUR_BYTE) &allocationLength; + cdb->REPORT_KEY.AllocationLength[0] = fourByte->Byte1; + cdb->REPORT_KEY.AllocationLength[1] = fourByte->Byte0; + + Srb->DataTransferLength = keyLength; + + // + // set the specific parameters.... + // + + if(currentIrpStack->Parameters.DeviceIoControl.IoControlCode == + IOCTL_DVD_READ_KEY) { + + if(keyParameters->KeyType == DvdTitleKey) { + + ULONG logicalBlockAddress; + + logicalBlockAddress = (ULONG) + (keyParameters->Parameters.TitleOffset.QuadPart >> + fdoExtension->SectorShift); + + fourByte = (PFOUR_BYTE) &(logicalBlockAddress); + + cdb->REPORT_KEY.LogicalBlockAddress[0] = fourByte->Byte3; + cdb->REPORT_KEY.LogicalBlockAddress[1] = fourByte->Byte2; + cdb->REPORT_KEY.LogicalBlockAddress[2] = fourByte->Byte1; + cdb->REPORT_KEY.LogicalBlockAddress[3] = fourByte->Byte0; + } + + cdb->REPORT_KEY.KeyFormat = (UCHAR)keyParameters->KeyType; + cdb->REPORT_KEY.AGID = (UCHAR) keyParameters->SessionId; + TraceLog((CdromDebugWarning, + "CdRomDvdReadKey => sending irp %p for irp %p (%s)\n", + NewIrp, OriginalIrp, "READ_KEY")); + + } else { + + cdb->REPORT_KEY.KeyFormat = DVD_REPORT_AGID; + cdb->REPORT_KEY.AGID = 0; + TraceLog((CdromDebugWarning, + "CdRomDvdReadKey => sending irp %p for irp %p (%s)\n", + NewIrp, OriginalIrp, "START_SESSION")); + } + + Srb->TimeOutValue = fdoExtension->TimeOutValue; + Srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_DATA_IN); + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, NewIrp); + + status = STATUS_SUCCESS; + + } FINALLY { + + if (!NT_SUCCESS(status)) { + + // + // An error occured during setup - free resources and + // complete this request. + // + if (NewIrp->MdlAddress != NULL) { + IoFreeMdl(NewIrp->MdlAddress); + } + + if (keyBuffer != NULL) { + ExFreePool(keyBuffer); + } + ExFreePool(Srb->SenseInfoBuffer); + ExFreePool(Srb); + IoFreeIrp(NewIrp); + + OriginalIrp->IoStatus.Information = 0; + OriginalIrp->IoStatus.Status = status; + + BAIL_OUT(OriginalIrp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, OriginalIrp); + + } // end !NT_SUCCESS + } + return; +} + + +VOID +CdRomDeviceControlDvdSendKey( + IN PDEVICE_OBJECT Fdo, + IN PIRP OriginalIrp, + IN PIRP NewIrp, + IN PSCSI_REQUEST_BLOCK Srb + ) +{ + PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(OriginalIrp); + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCDB cdb = (PCDB)Srb->Cdb; + + PDVD_COPY_PROTECT_KEY key; + PCDVD_KEY_HEADER keyBuffer = NULL; + + NTSTATUS status; + ULONG keyLength; + PFOUR_BYTE fourByte; + + key = OriginalIrp->AssociatedIrp.SystemBuffer; + keyLength = (key->KeyLength - sizeof(DVD_COPY_PROTECT_KEY)) + + sizeof(CDVD_KEY_HEADER); + + TRY { + + keyBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + keyLength, + DVD_TAG_SEND_KEY); + + if(keyBuffer == NULL) { + + TraceLog((CdromDebugWarning, + "IOCTL_DVD_SEND_KEY - couldn't allocate " + "%d byte buffer for key\n", + keyLength)); + status = STATUS_INSUFFICIENT_RESOURCES; + LEAVE; + } + + RtlZeroMemory(keyBuffer, keyLength); + + // + // keylength is decremented here by two because the + // datalength does not include the header, which is two + // bytes. keylength is immediately incremented later + // by the same amount. + // + + keyLength -= 2; + fourByte = (PFOUR_BYTE) &keyLength; + keyBuffer->DataLength[0] = fourByte->Byte1; + keyBuffer->DataLength[1] = fourByte->Byte0; + keyLength += 2; + + // + // copy the user's buffer to our own allocated buffer + // + + RtlMoveMemory(keyBuffer->Data, + key->KeyData, + key->KeyLength - sizeof(DVD_COPY_PROTECT_KEY)); + + + NewIrp->MdlAddress = IoAllocateMdl(keyBuffer, + keyLength, + FALSE, + FALSE, + (PIRP) NULL); + + if(NewIrp->MdlAddress == NULL) { + TraceLog((CdromDebugWarning, + "IOCTL_DVD_SEND_KEY - couldn't create mdl\n")); + status = STATUS_INSUFFICIENT_RESOURCES; + LEAVE; + } + + + MmBuildMdlForNonPagedPool(NewIrp->MdlAddress); + + Srb->CdbLength = 12; + Srb->DataBuffer = keyBuffer; + Srb->DataTransferLength = keyLength; + + Srb->TimeOutValue = fdoExtension->TimeOutValue; + Srb->SrbFlags = fdoExtension->SrbFlags; + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_DATA_OUT); + + cdb->REPORT_KEY.OperationCode = SCSIOP_SEND_KEY; + + fourByte = (PFOUR_BYTE) &keyLength; + + cdb->SEND_KEY.ParameterListLength[0] = fourByte->Byte1; + cdb->SEND_KEY.ParameterListLength[1] = fourByte->Byte0; + cdb->SEND_KEY.KeyFormat = (UCHAR)key->KeyType; + cdb->SEND_KEY.AGID = (UCHAR) key->SessionId; + + if (key->KeyType == DvdSetRpcKey) { + TraceLog((CdromDebugWarning, + "IOCTL_DVD_SEND_KEY - Setting RPC2 drive region\n")); + } else { + TraceLog((CdromDebugWarning, + "IOCTL_DVD_SEND_KEY - key type %x\n", key->KeyType)); + } + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, NewIrp); + + status = STATUS_SUCCESS; + + } FINALLY { + + if (!NT_SUCCESS(status)) { + + // + // An error occured during setup - free resources and + // complete this request. + // + + if (NewIrp->MdlAddress != NULL) { + IoFreeMdl(NewIrp->MdlAddress); + } + + if (keyBuffer != NULL) { + ExFreePool(keyBuffer); + } + + ExFreePool(Srb->SenseInfoBuffer); + ExFreePool(Srb); + IoFreeIrp(NewIrp); + + OriginalIrp->IoStatus.Information = 0; + OriginalIrp->IoStatus.Status = status; + + BAIL_OUT(OriginalIrp); + CdRomCompleteIrpAndStartNextPacketSafely(Fdo, OriginalIrp); + + } + } + + return; +} + + +VOID +CdRomInterpretReadCapacity( + IN PDEVICE_OBJECT Fdo, + IN PREAD_CAPACITY_DATA ReadCapacityBuffer + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + ULONG lastSector; + ULONG bps; + ULONG lastBit; + ULONG tmp; + + ASSERT(ReadCapacityBuffer); + ASSERT(commonExtension->IsFdo); + + TraceLog((CdromDebugError, + "CdRomInterpretReadCapacity: Entering\n")); + + // + // Swizzle bytes from Read Capacity and translate into + // the necessary geometry information in the device extension. + // + + tmp = ReadCapacityBuffer->BytesPerBlock; + ((PFOUR_BYTE)&bps)->Byte0 = ((PFOUR_BYTE)&tmp)->Byte3; + ((PFOUR_BYTE)&bps)->Byte1 = ((PFOUR_BYTE)&tmp)->Byte2; + ((PFOUR_BYTE)&bps)->Byte2 = ((PFOUR_BYTE)&tmp)->Byte1; + ((PFOUR_BYTE)&bps)->Byte3 = ((PFOUR_BYTE)&tmp)->Byte0; + + // + // Insure that bps is a power of 2. + // This corrects a problem with the HP 4020i CDR where it + // returns an incorrect number for bytes per sector. + // + + if (!bps) { + bps = 2048; + } else { + lastBit = (ULONG) -1; + while (bps) { + lastBit++; + bps = bps >> 1; + } + bps = 1 << lastBit; + } + + fdoExtension->DiskGeometry.BytesPerSector = bps; + + TraceLog((CdromDebugTrace, "CdRomInterpretReadCapacity: Calculated bps %#x\n", + fdoExtension->DiskGeometry.BytesPerSector)); + + // + // Copy last sector in reverse byte order. + // + + tmp = ReadCapacityBuffer->LogicalBlockAddress; + ((PFOUR_BYTE)&lastSector)->Byte0 = ((PFOUR_BYTE)&tmp)->Byte3; + ((PFOUR_BYTE)&lastSector)->Byte1 = ((PFOUR_BYTE)&tmp)->Byte2; + ((PFOUR_BYTE)&lastSector)->Byte2 = ((PFOUR_BYTE)&tmp)->Byte1; + ((PFOUR_BYTE)&lastSector)->Byte3 = ((PFOUR_BYTE)&tmp)->Byte0; + + // + // Calculate sector to byte shift. + // + + WHICH_BIT(bps, fdoExtension->SectorShift); + + TraceLog((CdromDebugTrace,"CdRomInterpretReadCapacity: Sector size is %d\n", + fdoExtension->DiskGeometry.BytesPerSector)); + + TraceLog((CdromDebugTrace,"CdRomInterpretReadCapacity: Number of Sectors is %d\n", + lastSector + 1)); + + // + // Calculate media capacity in bytes. + // + + commonExtension->PartitionLength.QuadPart = (LONGLONG)(lastSector + 1); + + // + // we've defaulted to 32/64 forever. don't want to change this now... + // + + fdoExtension->DiskGeometry.TracksPerCylinder = 0x40; + fdoExtension->DiskGeometry.SectorsPerTrack = 0x20; + + // + // Calculate number of cylinders. + // + + fdoExtension->DiskGeometry.Cylinders.QuadPart = (LONGLONG)((lastSector + 1) / (32 * 64)); + + commonExtension->PartitionLength.QuadPart = + (commonExtension->PartitionLength.QuadPart << fdoExtension->SectorShift); + + + ASSERT(TEST_FLAG(Fdo->Characteristics, FILE_REMOVABLE_MEDIA)); + + // + // This device supports removable media. + // + + fdoExtension->DiskGeometry.MediaType = RemovableMedia; + + return; +} + + diff --git a/drivers/storage/class/cdrom_new/mmc.c b/drivers/storage/class/cdrom_new/mmc.c new file mode 100644 index 00000000000..15319bb6c68 --- /dev/null +++ b/drivers/storage/class/cdrom_new/mmc.c @@ -0,0 +1,1422 @@ +/*-- + +Copyright (C) Microsoft Corporation, 2000 + +Module Name: + + mmc.c + +Abstract: + + This file is used to extend cdrom.sys to detect and use mmc-compatible + drives' capabilities more wisely. + +Environment: + + kernel mode only + +Notes: + + SCSI Tape, CDRom and Disk class drivers share common routines + that can be found in the CLASS directory (..\ntos\dd\class). + +Revision History: + +--*/ + +#include "ntddk.h" +#include "classpnp.h" +#include "cdrom.h" + + + +NTSTATUS +CdRomGetConfiguration( + IN PDEVICE_OBJECT Fdo, + OUT PGET_CONFIGURATION_HEADER *Buffer, + OUT PULONG BytesReturned, + IN FEATURE_NUMBER StartingFeature, + IN ULONG RequestedType + ); +VOID +CdRompPrintAllFeaturePages( + IN PGET_CONFIGURATION_HEADER Buffer, + IN ULONG Usable + ); +NTSTATUS +CdRomUpdateMmcDriveCapabilitiesCompletion( + IN PDEVICE_OBJECT Unused, + IN PIRP Irp, + IN PDEVICE_OBJECT Fdo + ); +VOID +CdRomPrepareUpdateCapabilitiesIrp( + PDEVICE_OBJECT Fdo + ); + +/*++ + + NOT DOCUMENTED YET - may be called at up to DISPATCH_LEVEL + if memory is non-paged + PRESUMES ALL DATA IS ACCESSIBLE based on FeatureBuffer + +--*/ +VOID +CdRomFindProfileInProfiles( + IN PFEATURE_DATA_PROFILE_LIST ProfileHeader, + IN FEATURE_PROFILE_TYPE ProfileToFind, + OUT PBOOLEAN Found + ) +{ + PFEATURE_DATA_PROFILE_LIST_EX profile; + ULONG numberOfProfiles; + ULONG i; + + ASSERT((ProfileHeader->Header.AdditionalLength % 4) == 0); + + *Found = FALSE; + + numberOfProfiles = ProfileHeader->Header.AdditionalLength / 4; + profile = ProfileHeader->Profiles; // zero-sized array + + for (i = 0; i < numberOfProfiles; i++) { + + FEATURE_PROFILE_TYPE currentProfile; + + currentProfile = + (profile->ProfileNumber[0] << 8) | + (profile->ProfileNumber[1] & 0xff); + + if (currentProfile == ProfileToFind) { + + *Found = TRUE; + + } + + profile++; + } + return; + +} + + +/*++ + + NOT DOCUMENTED YET - may be called at up to DISPATCH_LEVEL + if memory is non-paged + +--*/ +PVOID +CdRomFindFeaturePage( + IN PGET_CONFIGURATION_HEADER FeatureBuffer, + IN ULONG Length, + IN FEATURE_NUMBER Feature + ) +{ + PUCHAR buffer; + PUCHAR limit; + + if (Length < sizeof(GET_CONFIGURATION_HEADER) + sizeof(FEATURE_HEADER)) { + return NULL; + } + + // + // set limit to point to first illegal address + // + + limit = (PUCHAR)FeatureBuffer; + limit += Length; + + // + // set buffer to point to first page + // + + buffer = FeatureBuffer->Data; + + // + // loop through each page until we find the requested one, or + // until it's not safe to access the entire feature header + // (if equal, have exactly enough for the feature header) + // + while (buffer + sizeof(FEATURE_HEADER) <= limit) { + + PFEATURE_HEADER header = (PFEATURE_HEADER)buffer; + FEATURE_NUMBER thisFeature; + + thisFeature = + (header->FeatureCode[0] << 8) | + (header->FeatureCode[1]); + + if (thisFeature == Feature) { + + PUCHAR temp; + + // + // if don't have enough memory to safely access all the feature + // information, return NULL + // + temp = buffer; + temp += sizeof(FEATURE_HEADER); + temp += header->AdditionalLength; + + if (temp > limit) { + + // + // this means the transfer was cut-off, an insufficiently + // small buffer was given, or other arbitrary error. since + // it's not safe to view the amount of data (even though + // the header is safe) in this feature, pretend it wasn't + // transferred at all... + // + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "Feature %x exists, but not safe to access all its " + "data. returning NULL\n", Feature)); + return NULL; + } else { + return buffer; + } + } + + if (header->AdditionalLength % 4) { + ASSERT(!"Feature page AdditionalLength field must be integral multiple of 4!\n"); + return NULL; + } + + buffer += sizeof(FEATURE_HEADER); + buffer += header->AdditionalLength; + + } + return NULL; +} + +/*++ + +Private so we can later expose to someone wanting to use a preallocated buffer + +--*/ +NTSTATUS +CdRompGetConfiguration( + IN PDEVICE_OBJECT Fdo, + IN PGET_CONFIGURATION_HEADER Buffer, + IN ULONG BufferSize, + OUT PULONG ValidBytes, + IN FEATURE_NUMBER StartingFeature, + IN ULONG RequestedType + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + PCDROM_DATA cdData; + SCSI_REQUEST_BLOCK srb; + PCDB cdb; + ULONG_PTR returned; + NTSTATUS status; + + PAGED_CODE(); + ASSERT(Buffer); + ASSERT(ValidBytes); + + *ValidBytes = 0; + returned = 0; + + RtlZeroMemory(&srb, sizeof(SCSI_REQUEST_BLOCK)); + RtlZeroMemory(Buffer, BufferSize); + + fdoExtension = Fdo->DeviceExtension; + cdData = (PCDROM_DATA)(fdoExtension->CommonExtension.DriverData); + + if (TEST_FLAG(cdData->HackFlags, CDROM_HACK_BAD_GET_CONFIG_SUPPORT)) { + return STATUS_INVALID_DEVICE_REQUEST; + } + + srb.TimeOutValue = CDROM_GET_CONFIGURATION_TIMEOUT; + srb.CdbLength = 10; + + cdb = (PCDB)srb.Cdb; + cdb->GET_CONFIGURATION.OperationCode = SCSIOP_GET_CONFIGURATION; + cdb->GET_CONFIGURATION.RequestType = (UCHAR)RequestedType; + cdb->GET_CONFIGURATION.StartingFeature[0] = (UCHAR)(StartingFeature >> 8); + cdb->GET_CONFIGURATION.StartingFeature[1] = (UCHAR)(StartingFeature & 0xff); + cdb->GET_CONFIGURATION.AllocationLength[0] = (UCHAR)(BufferSize >> 8); + cdb->GET_CONFIGURATION.AllocationLength[1] = (UCHAR)(BufferSize & 0xff); + + status = ClassSendSrbSynchronous(Fdo, &srb, Buffer, + BufferSize, FALSE); + returned = srb.DataTransferLength; + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: Status was %x\n", status)); + + if (NT_SUCCESS(status) || status == STATUS_BUFFER_OVERFLOW) { + + // + // if returned more than can be stored in a ULONG, return false + // + + if (returned > (ULONG)(-1)) { + return STATUS_UNSUCCESSFUL; + } + ASSERT(returned <= BufferSize); + *ValidBytes = (ULONG)returned; + return STATUS_SUCCESS; + + } else { + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: failed %x\n", status)); + return status; + + } + ASSERT(FALSE); + return STATUS_UNSUCCESSFUL; +} + +/*++ + + Allocates buffer with configuration info, returns STATUS_SUCCESS + or an error if one occurred + + NOTE: does not handle case where more than 65000 bytes are returned, + which requires multiple calls with different starting feature + numbers. + +--*/ +NTSTATUS +CdRomGetConfiguration( + IN PDEVICE_OBJECT Fdo, + OUT PGET_CONFIGURATION_HEADER *Buffer, + OUT PULONG BytesReturned, + IN FEATURE_NUMBER StartingFeature, + IN ULONG RequestedType + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + GET_CONFIGURATION_HEADER header; // eight bytes, not a lot + PGET_CONFIGURATION_HEADER buffer; + ULONG returned; + ULONG size; + ULONG i; + NTSTATUS status; + + PAGED_CODE(); + + + fdoExtension = Fdo->DeviceExtension; + *Buffer = NULL; + *BytesReturned = 0; + + buffer = NULL; + returned = 0; + + // + // send the first request down to just get the header + // + + status = CdRompGetConfiguration(Fdo, &header, sizeof(header), + &returned, StartingFeature, RequestedType); + + if (!NT_SUCCESS(status)) { + return status; + } + + // + // now try again, using information returned to allocate + // just enough memory + // + + size = header.DataLength[0] << 24 | + header.DataLength[1] << 16 | + header.DataLength[2] << 8 | + header.DataLength[3] << 0 ; + + + for (i = 0; i < 4; i++) { + + // + // the datalength field is the size *following* + // itself, so adjust accordingly + // + + size += 4*sizeof(UCHAR); + + // + // make sure the size is reasonable + // + + if (size <= sizeof(FEATURE_HEADER)) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: drive reports only %x bytes?\n", + size)); + return STATUS_UNSUCCESSFUL; + } + + // + // allocate the memory + // + + buffer = (PGET_CONFIGURATION_HEADER) + ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + size, + CDROM_TAG_FEATURE); + + if (buffer == NULL) { + return STATUS_INSUFFICIENT_RESOURCES; + } + + // + // send the first request down to just get the header + // + + status = CdRompGetConfiguration(Fdo, buffer, size, &returned, + StartingFeature, RequestedType); + + if (!NT_SUCCESS(status)) { + ExFreePool(buffer); + return status; + } + + if (returned > size) { + ExFreePool(buffer); + return STATUS_INTERNAL_ERROR; + } + + returned = buffer->DataLength[0] << 24 | + buffer->DataLength[1] << 16 | + buffer->DataLength[2] << 8 | + buffer->DataLength[3] << 0 ; + returned += 4*sizeof(UCHAR); + + if (returned <= size) { + *Buffer = buffer; + *BytesReturned = size; // amount of 'safe' memory + return STATUS_SUCCESS; + } + + // + // else retry using the new size.... + // + + size = returned; + ExFreePool(buffer); + buffer = NULL; + + } + + // + // it failed after a number of attempts, so just fail. + // + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdRomGetConfiguration: Failed %d attempts to get all feature " + "information\n", i)); + return STATUS_IO_DEVICE_ERROR; +} + +VOID +CdRomIsDeviceMmcDevice( + IN PDEVICE_OBJECT Fdo, + OUT PBOOLEAN IsMmc + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + PCDROM_DATA cdData = commonExtension->DriverData; + GET_CONFIGURATION_HEADER localHeader; + NTSTATUS status; + ULONG usable; + ULONG size; + ULONG previouslyFailed; + + PAGED_CODE(); + ASSERT( commonExtension->IsFdo ); + + *IsMmc = FALSE; + + // + // read the registry in case the drive failed previously, + // and a timeout is occurring. + // + + previouslyFailed = FALSE; + ClassGetDeviceParameter(fdoExtension, + CDROM_SUBKEY_NAME, + CDROM_NON_MMC_DRIVE_NAME, + &previouslyFailed + ); + + if (previouslyFailed) { + SET_FLAG(cdData->HackFlags, CDROM_HACK_BAD_GET_CONFIG_SUPPORT); + } + + // + // check for the following profiles: + // + // ProfileList + // + + status = CdRompGetConfiguration(Fdo, + &localHeader, + sizeof(localHeader), + &usable, + FeatureProfileList, + SCSI_GET_CONFIGURATION_REQUEST_TYPE_ALL); + + if (status == STATUS_INVALID_DEVICE_REQUEST || + status == STATUS_NO_MEDIA_IN_DEVICE || + status == STATUS_IO_DEVICE_ERROR || + status == STATUS_IO_TIMEOUT) { + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "GetConfiguration Failed (%x), device %p not mmc-compliant\n", + status, Fdo + )); + previouslyFailed = TRUE; + ClassSetDeviceParameter(fdoExtension, + CDROM_SUBKEY_NAME, + CDROM_NON_MMC_DRIVE_NAME, + previouslyFailed + ); + return; + + } else if (!NT_SUCCESS(status)) { + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugError, + "GetConfiguration Failed, status %x -- defaulting to -ROM\n", + status)); + return; + + } else if (usable < sizeof(GET_CONFIGURATION_HEADER)) { + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "GetConfiguration Failed, returned only %x bytes!\n", usable)); + previouslyFailed = TRUE; + ClassSetDeviceParameter(fdoExtension, + CDROM_SUBKEY_NAME, + CDROM_NON_MMC_DRIVE_NAME, + previouslyFailed + ); + return; + + } + + size = (localHeader.DataLength[0] << 24) | + (localHeader.DataLength[1] << 16) | + (localHeader.DataLength[2] << 8) | + (localHeader.DataLength[3] << 0); + + if(size <= 4) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "GetConfiguration Failed, claims MMC support but doesn't " + "correctly return config length!\n")); + return; + } + + size += 4; // sizeof the datalength fields + +#if DBG + { + PGET_CONFIGURATION_HEADER dbgBuffer; + NTSTATUS dbgStatus; + + dbgBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + (SIZE_T)size, + CDROM_TAG_FEATURE); + if (dbgBuffer != NULL) { + RtlZeroMemory(dbgBuffer, size); + + dbgStatus = CdRompGetConfiguration(Fdo, dbgBuffer, size, + &size, FeatureProfileList, + SCSI_GET_CONFIGURATION_REQUEST_TYPE_ALL); + + if (NT_SUCCESS(dbgStatus)) { + CdRompPrintAllFeaturePages(dbgBuffer, usable); + } + ExFreePool(dbgBuffer); + } + } +#endif // DBG + + *IsMmc = TRUE; + return; +} + +VOID +CdRompPrintAllFeaturePages( + IN PGET_CONFIGURATION_HEADER Buffer, + IN ULONG Usable + ) +{ + PFEATURE_HEADER header; + +//////////////////////////////////////////////////////////////////////////////// +// items expected to ALWAYS be current +//////////////////////////////////////////////////////////////////////////////// + header = CdRomFindFeaturePage(Buffer, Usable, FeatureProfileList); + if (header != NULL) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: CurrentProfile %x " + "with %x bytes of data at %p\n", + Buffer->CurrentProfile[0] << 8 | + Buffer->CurrentProfile[1], + Usable, Buffer)); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureCore); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "CORE Features" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureMorphing); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Morphing" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureMultiRead); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Multi-Read" + )); + } + header = CdRomFindFeaturePage(Buffer, Usable, FeatureRemovableMedium); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Removable Medium" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureTimeout); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Timeouts" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeaturePowerManagement); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Power Management" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureEmbeddedChanger); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Embedded Changer" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureLogicalUnitSerialNumber); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "LUN Serial Number" + )); + } + + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureMicrocodeUpgrade); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Microcode Update" + )); + } + +//////////////////////////////////////////////////////////////////////////////// +// items expected not to always be current +//////////////////////////////////////////////////////////////////////////////// + header = CdRomFindFeaturePage(Buffer, Usable, FeatureCDAudioAnalogPlay); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Analogue CD Audio Operations" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureCdRead); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "reading from CD-ROM/R/RW" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureCdMastering); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "CD Recording (Mastering)" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureCdTrackAtOnce); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "CD Recording (Track At Once)" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureDvdCSS); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "DVD CSS" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureDvdRead); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "DVD Structure Reads" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureDvdRecordableWrite); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "DVD Recording (Mastering)" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureDiscControlBlocks); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "DVD Disc Control Blocks" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureFormattable); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Formatting" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureRandomReadable); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Random Reads" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureRandomWritable); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Random Writes" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureRestrictedOverwrite); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Restricted Overwrites." + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureWriteOnce); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Write Once Media" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureSectorErasable); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Sector Erasable Media" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureIncrementalStreamingWritable); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Incremental Streaming Writing" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureRealTimeStreaming); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "Real-time Streaming Reads" + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureSMART); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "S.M.A.R.T." + )); + } + + header = CdRomFindFeaturePage(Buffer, Usable, FeatureDefectManagement); + if (header) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdromGetConfiguration: %s %s\n", + (header->Current ? + "Currently supports" : "Is able to support"), + "defect management" + )); + } + return; +} + +NTSTATUS +CdRomUpdateMmcDriveCapabilitiesCompletion( + IN PDEVICE_OBJECT Unused, + IN PIRP Irp, + IN PDEVICE_OBJECT Fdo + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + PCDROM_DATA cdData = fdoExtension->CommonExtension.DriverData; + PCDROM_MMC_EXTENSION mmcData = &(cdData->Mmc); + PSCSI_REQUEST_BLOCK srb = &(mmcData->CapabilitiesSrb); + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + NTSTATUS status = STATUS_UNSUCCESSFUL; + PIRP delayedIrp; + + // completion routine should retry as neccessary. + // when success, clear the flag to allow startio to proceed. + // else fail original request when retries are exhausted. + + ASSERT(mmcData->CapabilitiesIrp == Irp); + + // for now, if succeeded, just print the new pages. + + if (SRB_STATUS(srb->SrbStatus) != SRB_STATUS_SUCCESS) { + + // + // ISSUE-2000/4/20-henrygab - should we try to reallocate if size + // available became larger than what we + // originally allocated? otherwise, it + // is possible (not probable) that we + // would miss the feature. can check + // that by finding out what the last + // feature is in the current group. + // + + BOOLEAN retry; + ULONG retryInterval; + + // + // Release the queue if it is frozen. + // + + if (srb->SrbStatus & SRB_STATUS_QUEUE_FROZEN) { + ClassReleaseQueue(Fdo); + } + + retry = ClassInterpretSenseInfo( + Fdo, + srb, + irpStack->MajorFunction, + 0, + MAXIMUM_RETRIES - ((ULONG)(ULONG_PTR)irpStack->Parameters.Others.Argument4), + &status, + &retryInterval); + + // + // DATA_OVERRUN is not an error in this case.... + // + + if (status == STATUS_DATA_OVERRUN) { + status = STATUS_SUCCESS; + } + + // + // override verify_volume based on original irp's settings + // + + if (TEST_FLAG(irpStack->Flags, SL_OVERRIDE_VERIFY_VOLUME) && + status == STATUS_VERIFY_REQUIRED) { + status = STATUS_IO_DEVICE_ERROR; + retry = TRUE; + } + + if (retry && irpStack->Parameters.Others.Argument4--) { + + LARGE_INTEGER delay; + delay.QuadPart = retryInterval; + delay.QuadPart *= (LONGLONG)1000 * 1000 * 10; + + // + // retry the request + // + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugError, + "Not using ClassRetryRequest Yet\n")); + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "Retry update capabilities %p\n", Irp)); + CdRomPrepareUpdateCapabilitiesIrp(Fdo); + + CdRomRetryRequest(fdoExtension, Irp, retryInterval, TRUE); + + // + // ClassRetryRequest(Fdo, Irp, delay); + // + + return STATUS_MORE_PROCESSING_REQUIRED; + + } + + } else { + + status = STATUS_SUCCESS; + + } + + Irp->IoStatus.Status = status; + + KeSetEvent(&mmcData->CapabilitiesEvent, IO_CD_ROM_INCREMENT, FALSE); + + + return STATUS_MORE_PROCESSING_REQUIRED; +} + + +VOID +CdRomPrepareUpdateCapabilitiesIrp( + PDEVICE_OBJECT Fdo + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + PCDROM_DATA cdData = fdoExtension->CommonExtension.DriverData; + PCDROM_MMC_EXTENSION mmcData = &(cdData->Mmc); + PIO_STACK_LOCATION nextStack; + PSCSI_REQUEST_BLOCK srb; + PCDB cdb; + ULONG bufferSize; + PIRP irp; + + ASSERT(mmcData->UpdateState); + ASSERT(ExQueryDepthSList(&(mmcData->DelayedIrps)) != 0); + ASSERT(mmcData->CapabilitiesIrp != NULL); + ASSERT(mmcData->CapabilitiesMdl != NULL); + ASSERT(mmcData->CapabilitiesBuffer); + ASSERT(mmcData->CapabilitiesBufferSize != 0); + ASSERT(fdoExtension->SenseData); + + // + // do *NOT* call IoReuseIrp(), since it would zero out our + // current irp stack location, which we really don't want + // to happen. it would also set the current irp stack location + // to one greater than currently exists (to give max irp usage), + // but we don't want that either, since we use the top irp stack. + // + // IoReuseIrp(mmcData->CapabilitiesIrp, STATUS_UNSUCCESSFUL); + // + + irp = mmcData->CapabilitiesIrp; + srb = &(mmcData->CapabilitiesSrb); + cdb = (PCDB)(srb->Cdb); + bufferSize = mmcData->CapabilitiesBufferSize; + + // + // zero stuff out + // + + RtlZeroMemory(srb, sizeof(SCSI_REQUEST_BLOCK)); + RtlZeroMemory(fdoExtension->SenseData, sizeof(SENSE_DATA)); + RtlZeroMemory(mmcData->CapabilitiesBuffer, bufferSize); + + // + // setup the srb + // + + srb->TimeOutValue = CDROM_GET_CONFIGURATION_TIMEOUT; + srb->Length = SCSI_REQUEST_BLOCK_SIZE; + srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; + srb->SenseInfoBuffer = fdoExtension->SenseData; + srb->DataBuffer = mmcData->CapabilitiesBuffer; + srb->QueueAction = SRB_SIMPLE_TAG_REQUEST; + srb->DataTransferLength = mmcData->CapabilitiesBufferSize; + srb->ScsiStatus = 0; + srb->SrbStatus = 0; + srb->NextSrb = NULL; + srb->OriginalRequest = irp; + srb->SrbFlags = fdoExtension->SrbFlags; + srb->CdbLength = 10; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + SET_FLAG(srb->SrbFlags, SRB_FLAGS_NO_QUEUE_FREEZE); + + // + // setup the cdb + // + + cdb->GET_CONFIGURATION.OperationCode = SCSIOP_GET_CONFIGURATION; + cdb->GET_CONFIGURATION.RequestType = SCSI_GET_CONFIGURATION_REQUEST_TYPE_CURRENT; + cdb->GET_CONFIGURATION.StartingFeature[0] = 0; + cdb->GET_CONFIGURATION.StartingFeature[1] = 0; + cdb->GET_CONFIGURATION.AllocationLength[0] = (UCHAR)(bufferSize >> 8); + cdb->GET_CONFIGURATION.AllocationLength[1] = (UCHAR)(bufferSize & 0xff); + + // + // setup the irp + // + + nextStack = IoGetNextIrpStackLocation(irp); + nextStack->MajorFunction = IRP_MJ_SCSI; + nextStack->Parameters.Scsi.Srb = srb; + irp->MdlAddress = mmcData->CapabilitiesMdl; + irp->AssociatedIrp.SystemBuffer = mmcData->CapabilitiesBuffer; + IoSetCompletionRoutine(irp, CdRomUpdateMmcDriveCapabilitiesCompletion, Fdo, + TRUE, TRUE, TRUE); + + return; + +} + +VOID +CdRomUpdateMmcDriveCapabilities( + IN PDEVICE_OBJECT Fdo, + IN PVOID Context + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + PCDROM_DATA cdData = fdoExtension->CommonExtension.DriverData; + PCDROM_MMC_EXTENSION mmcData = &(cdData->Mmc); + PIO_STACK_LOCATION thisStack = IoGetCurrentIrpStackLocation(mmcData->CapabilitiesIrp); + PSCSI_REQUEST_BLOCK srb = &(mmcData->CapabilitiesSrb); + NTSTATUS status; + + + ASSERT(Context == NULL); + + // + // NOTE: a remove lock is unneccessary, since the delayed irp + // will have said lock held for itself, preventing a remove. + // + CdRomPrepareUpdateCapabilitiesIrp(Fdo); + + ASSERT(thisStack->Parameters.Others.Argument1 == Fdo); + ASSERT(thisStack->Parameters.Others.Argument2 == mmcData->CapabilitiesBuffer); + ASSERT(thisStack->Parameters.Others.Argument3 == &(mmcData->CapabilitiesSrb)); + + mmcData->WriteAllowed = FALSE; // default to read-only + + // + // set max retries, and also allow volume verify override based on + // original (delayed) irp + // + + thisStack->Parameters.Others.Argument4 = (PVOID)MAXIMUM_RETRIES; + + // + // send to self... note that SL_OVERRIDE_VERIFY_VOLUME is not required, + // as this is IRP_MJ_INTERNAL_DEVICE_CONTROL + // + + IoCallDriver(commonExtension->LowerDeviceObject, mmcData->CapabilitiesIrp); + + KeWaitForSingleObject(&mmcData->CapabilitiesEvent, + Executive, KernelMode, FALSE, NULL); + + status = mmcData->CapabilitiesIrp->IoStatus.Status; + + if (!NT_SUCCESS(status)) { + + goto FinishDriveUpdate; + + } + + // + // we've updated the feature set, so update whether or not reads and writes + // are allowed or not. + // + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdRomUpdateMmc => Succeeded " + "--------------------" + "--------------------\n")); + + /*++ + + NOTE: It is important to only use srb->DataTransferLength worth + of data at this point, since the bufferSize is what is + *available* to use, not what was *actually* used. + + --*/ + +#if DBG + CdRompPrintAllFeaturePages(mmcData->CapabilitiesBuffer, + srb->DataTransferLength); +#endif // DBG + + // + // update whether or not writes are allowed. this is currently defined + // as requiring TargetDefectManagement and RandomWritable features + // + { + PFEATURE_HEADER defectHeader; + PFEATURE_HEADER writableHeader; + + defectHeader = CdRomFindFeaturePage(mmcData->CapabilitiesBuffer, + srb->DataTransferLength, + FeatureDefectManagement); + writableHeader = CdRomFindFeaturePage(mmcData->CapabilitiesBuffer, + srb->DataTransferLength, + FeatureRandomWritable); + + if ((defectHeader != NULL) && (writableHeader != NULL) && + (defectHeader->Current) && (writableHeader->Current)) { + + // + // this should be the *ONLY* place writes are set to allowed + // + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdRomUpdateMmc => Writes *allowed*\n")); + mmcData->WriteAllowed = TRUE; + + } else { + + if (defectHeader == NULL) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdRomUpdateMmc => No writes - %s = %s\n", + "defect management", "DNE")); + } else { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdRomUpdateMmc => No writes - %s = %s\n", + "defect management", "Not Current")); + } + if (writableHeader == NULL) { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdRomUpdateMmc => No writes - %s = %s\n", + "sector writable", "DNE")); + } else { + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdRomUpdateMmc => No writes - %s = %s\n", + "sector writable", "Not Current")); + } + } // end of feature checking + } // end of check for writability + + // + // update the cached partition table information + // + // NOTE: THIS WILL CURRENTLY CAUSE A DEADLOCK! + // + // ISSUE-2000/06/20-henrygab - partition support not implemented + // IoReadPartitionTable must be done + // at PASSIVE level, requiring a thread + // or worker item or other such method. + // +#if 0 + status = IoReadPartitionTable(Fdo, 1 << fdoExtension->SectorShift, + TRUE, &mmcData->PartitionList); + if (!NT_SUCCESS(status)) { + + goto FinishDriveUpdate; + + } +#endif + + status = STATUS_SUCCESS; + +FinishDriveUpdate: + + CdRompFlushDelayedList(Fdo, mmcData, status, TRUE); + + return; +} + + +VOID +CdRompFlushDelayedList( + IN PDEVICE_OBJECT Fdo, + IN PCDROM_MMC_EXTENSION MmcData, + IN NTSTATUS Status, + IN BOOLEAN CalledFromWorkItem + ) +{ + PSINGLE_LIST_ENTRY list; + PIRP irp; + + // NOTE - REF #0002 + // + // need to set the new state first to prevent deadlocks. + // this is only done from the workitem, to prevent any + // edge cases where we'd "lose" the UpdateRequired + // + // then, must ignore the state, since it's not guaranteed to + // be the same any longer. the only thing left is to handle + // all the delayed irps by flushing the queue and sending them + // back onto the StartIo queue for the device. + // + + if (CalledFromWorkItem) { + + LONG oldState; + LONG newState; + + if (NT_SUCCESS(Status)) { + newState = CdromMmcUpdateComplete; + } else { + newState = CdromMmcUpdateRequired; + } + + oldState = InterlockedCompareExchange(&MmcData->UpdateState, + newState, + CdromMmcUpdateStarted); + ASSERT(oldState == CdromMmcUpdateStarted); + + } else { + + // + // just flushing the queue if not called from the workitem, + // and we don't want to ever fail the queue in those cases. + // + + ASSERT(NT_SUCCESS(Status)); + + } + + list = ExInterlockedFlushSList(&MmcData->DelayedIrps); + + // if this assert fires, it means that we have started + // a workitem when the previous workitem took the delayed + // irp. if this happens, then the logic in HACKHACK #0002 + // is either flawed or the rules set within are not being + // followed. this would require investigation. + + ASSERT(list != NULL); + + // + // now either succeed or fail all the delayed irps, according + // to the update status. + // + + while (list != NULL) { + + irp = (PIRP)( ((PUCHAR)list) - + FIELD_OFFSET(IRP, Tail.Overlay.DriverContext[0]) + ); + list = list->Next; + irp->Tail.Overlay.DriverContext[0] = 0; + irp->Tail.Overlay.DriverContext[1] = 0; + irp->Tail.Overlay.DriverContext[2] = 0; + irp->Tail.Overlay.DriverContext[3] = 0; + + if (NT_SUCCESS(Status)) { + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdRomUpdateMmc => Re-sending delayed irp %p\n", + irp)); + IoStartPacket(Fdo, irp, NULL, NULL); + + } else { + + KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures, + "CdRomUpdateMmc => Failing delayed irp %p with " + " status %x\n", irp, Status)); + irp->IoStatus.Information = 0; + irp->IoStatus.Status = Status; + ClassReleaseRemoveLock(Fdo, irp); + IoCompleteRequest(irp, IO_CD_ROM_INCREMENT); + + } + + } // while (list) + + return; + +} + +VOID +CdRomDeAllocateMmcResources( + IN PDEVICE_OBJECT Fdo + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + PCDROM_DATA cddata = commonExtension->DriverData; + PCDROM_MMC_EXTENSION mmcData = &cddata->Mmc; + NTSTATUS status; + + if (mmcData->CapabilitiesWorkItem) { + IoFreeWorkItem(mmcData->CapabilitiesWorkItem); + mmcData->CapabilitiesWorkItem = NULL; + } + if (mmcData->CapabilitiesIrp) { + IoFreeIrp(mmcData->CapabilitiesIrp); + mmcData->CapabilitiesIrp = NULL; + } + if (mmcData->CapabilitiesMdl) { + IoFreeMdl(mmcData->CapabilitiesMdl); + mmcData->CapabilitiesMdl = NULL; + } + if (mmcData->CapabilitiesBuffer) { + ExFreePool(mmcData->CapabilitiesBuffer); + mmcData->CapabilitiesBuffer = NULL; + } + mmcData->CapabilitiesBuffer = 0; + mmcData->IsMmc = FALSE; + mmcData->WriteAllowed = FALSE; + + return; +} + +NTSTATUS +CdRomAllocateMmcResources( + IN PDEVICE_OBJECT Fdo + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + PCDROM_DATA cddata = commonExtension->DriverData; + PCDROM_MMC_EXTENSION mmcData = &cddata->Mmc; + PIO_STACK_LOCATION irpStack; + NTSTATUS status; + + ASSERT(mmcData->CapabilitiesWorkItem == NULL); + ASSERT(mmcData->CapabilitiesIrp == NULL); + ASSERT(mmcData->CapabilitiesMdl == NULL); + ASSERT(mmcData->CapabilitiesBuffer == NULL); + ASSERT(mmcData->CapabilitiesBufferSize == 0); + + status = CdRomGetConfiguration(Fdo, + &mmcData->CapabilitiesBuffer, + &mmcData->CapabilitiesBufferSize, + FeatureProfileList, + SCSI_GET_CONFIGURATION_REQUEST_TYPE_ALL); + if (!NT_SUCCESS(status)) { + ASSERT(mmcData->CapabilitiesBuffer == NULL); + ASSERT(mmcData->CapabilitiesBufferSize == 0); + return status; + } + ASSERT(mmcData->CapabilitiesBuffer != NULL); + ASSERT(mmcData->CapabilitiesBufferSize != 0); + + mmcData->CapabilitiesMdl = IoAllocateMdl(mmcData->CapabilitiesBuffer, + mmcData->CapabilitiesBufferSize, + FALSE, FALSE, NULL); + if (mmcData->CapabilitiesMdl == NULL) { + ExFreePool(mmcData->CapabilitiesBuffer); + mmcData->CapabilitiesBufferSize = 0; + return STATUS_INSUFFICIENT_RESOURCES; + } + + + mmcData->CapabilitiesIrp = IoAllocateIrp(Fdo->StackSize + 2, FALSE); + if (mmcData->CapabilitiesIrp == NULL) { + IoFreeMdl(mmcData->CapabilitiesMdl); + ExFreePool(mmcData->CapabilitiesBuffer); + mmcData->CapabilitiesBufferSize = 0; + return STATUS_INSUFFICIENT_RESOURCES; + } + + mmcData->CapabilitiesWorkItem = IoAllocateWorkItem(Fdo); + if (mmcData->CapabilitiesWorkItem == NULL) { + IoFreeIrp(mmcData->CapabilitiesIrp); + IoFreeMdl(mmcData->CapabilitiesMdl); + ExFreePool(mmcData->CapabilitiesBuffer); + mmcData->CapabilitiesBufferSize = 0; + return STATUS_INSUFFICIENT_RESOURCES; + } + + // + // everything has been allocated, so now prepare it all.... + // + + MmBuildMdlForNonPagedPool(mmcData->CapabilitiesMdl); + ExInitializeSListHead(&mmcData->DelayedIrps); + KeInitializeSpinLock(&mmcData->DelayedLock); + + // + // use the extra stack for internal bookkeeping + // + IoSetNextIrpStackLocation(mmcData->CapabilitiesIrp); + irpStack = IoGetCurrentIrpStackLocation(mmcData->CapabilitiesIrp); + irpStack->Parameters.Others.Argument1 = Fdo; + irpStack->Parameters.Others.Argument2 = mmcData->CapabilitiesBuffer; + irpStack->Parameters.Others.Argument3 = &(mmcData->CapabilitiesSrb); + // arg 4 is the retry count + + // + // set the completion event to FALSE for now + // + + KeInitializeEvent(&mmcData->CapabilitiesEvent, + SynchronizationEvent, FALSE); + return STATUS_SUCCESS; + +} + diff --git a/drivers/storage/class/cdrom_new/scsicdrm.rc b/drivers/storage/class/cdrom_new/scsicdrm.rc new file mode 100644 index 00000000000..cac5f53da93 --- /dev/null +++ b/drivers/storage/class/cdrom_new/scsicdrm.rc @@ -0,0 +1,23 @@ +//+------------------------------------------------------------------------- +// +// Microsoft Windows +// +// Copyright (C) Microsoft Corporation, 1996 - 1999 +// +// File: scsicdrm.rc +// +//-------------------------------------------------------------------------- + +#include + +#include + +#define VER_FILETYPE VFT_DRV +#define VER_FILESUBTYPE VFT2_DRV_SYSTEM +#define VER_FILEDESCRIPTION_STR "SCSI CD-ROM Driver" +#define VER_INTERNALNAME_STR "cdrom.sys" +#define VER_ORIGINALFILENAME_STR "cdrom.sys" +#define VER_LANGNEUTRAL + +#include "common.ver" + diff --git a/drivers/storage/class/cdrom_new/sec.c b/drivers/storage/class/cdrom_new/sec.c new file mode 100644 index 00000000000..60b70768954 --- /dev/null +++ b/drivers/storage/class/cdrom_new/sec.c @@ -0,0 +1,38 @@ +/*-- + +Copyright (C) Microsoft Corporation, 1999 + +--*/ + + +#include "sec.h" + + +NTSTATUS +CdRomGetRpc0Settings( + IN PDEVICE_OBJECT Fdo + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + PCDROM_DATA cddata = (PCDROM_DATA)(commonExtension->DriverData); + + cddata->Rpc0SystemRegion = (UCHAR)(~1); // region one + cddata->Rpc0SystemRegionResetCount = 0; // no resets + + return STATUS_SUCCESS; +} + + +NTSTATUS +CdRomSetRpc0Settings( + IN PDEVICE_OBJECT Fdo, + IN UCHAR NewRegion + ) +{ + return STATUS_SUCCESS; +} + + + + + diff --git a/drivers/storage/class/cdrom_new/sec.h b/drivers/storage/class/cdrom_new/sec.h new file mode 100644 index 00000000000..ce8b6272dba --- /dev/null +++ b/drivers/storage/class/cdrom_new/sec.h @@ -0,0 +1,11 @@ +/*-- + +Copyright (C) Microsoft Corporation, 1999 + +--*/ + + +#include "ntddk.h" +#include "classpnp.h" +#include "cdrom.h" + diff --git a/drivers/storage/class/cdrom_new/trace.h b/drivers/storage/class/cdrom_new/trace.h new file mode 100644 index 00000000000..2db702cf3f1 --- /dev/null +++ b/drivers/storage/class/cdrom_new/trace.h @@ -0,0 +1,53 @@ +/* + + WPP_DEFINE_CONTROL_GUID specifies the GUID used for this filter. + *** REPLACE THE GUID WITH YOUR OWN UNIQUE ID *** + WPP_DEFINE_BIT allows setting debug bit masks to selectively print. + + everything else can revert to the default? + +*/ + + +#define TraceLogger(x, ...) DbgPrint(__VA_ARGS__) +#define TraceLog(x) TraceLogger x +#define WPP_INIT_TRACING(x, y) +#define WPP_CLEANUP(x) + +#define WPP_CONTROL_GUIDS \ + WPP_DEFINE_CONTROL_GUID(Cdrom,(58db8e03,0537,45cb,b29b,597f6cbebbfd), \ + WPP_DEFINE_BIT(CdromDebugError) /* bit 0 = 0x00000001 */ \ + WPP_DEFINE_BIT(CdromDebugWarning) /* bit 1 = 0x00000002 */ \ + WPP_DEFINE_BIT(CdromDebugTrace) /* bit 2 = 0x00000004 */ \ + WPP_DEFINE_BIT(CdromDebugInfo) /* bit 3 = 0x00000008 */ \ + WPP_DEFINE_BIT(FilterDebugD04) /* bit 4 = 0x00000010 */ \ + WPP_DEFINE_BIT(FilterDebugD05) /* bit 5 = 0x00000020 */ \ + WPP_DEFINE_BIT(FilterDebugD06) /* bit 6 = 0x00000040 */ \ + WPP_DEFINE_BIT(FilterDebugD07) /* bit 7 = 0x00000080 */ \ + WPP_DEFINE_BIT(FilterDebugD08) /* bit 8 = 0x00000100 */ \ + WPP_DEFINE_BIT(FilterDebugD09) /* bit 9 = 0x00000200 */ \ + WPP_DEFINE_BIT(FilterDebugD10) /* bit 10 = 0x00000400 */ \ + WPP_DEFINE_BIT(FilterDebugD11) /* bit 11 = 0x00000800 */ \ + WPP_DEFINE_BIT(FilterDebugD12) /* bit 12 = 0x00001000 */ \ + WPP_DEFINE_BIT(FilterDebugD13) /* bit 13 = 0x00002000 */ \ + WPP_DEFINE_BIT(FilterDebugD14) /* bit 14 = 0x00004000 */ \ + WPP_DEFINE_BIT(FilterDebugD15) /* bit 15 = 0x00008000 */ \ + WPP_DEFINE_BIT(FilterDebugD16) /* bit 16 = 0x00000000 */ \ + WPP_DEFINE_BIT(FilterDebugD17) /* bit 17 = 0x00000000 */ \ + WPP_DEFINE_BIT(FilterDebugD18) /* bit 18 = 0x00000000 */ \ + WPP_DEFINE_BIT(FilterDebugD19) /* bit 19 = 0x00000000 */ \ + WPP_DEFINE_BIT(FilterDebugD20) /* bit 20 = 0x00000000 */ \ + WPP_DEFINE_BIT(FilterDebugD21) /* bit 21 = 0x00000000 */ \ + WPP_DEFINE_BIT(FilterDebugD22) /* bit 22 = 0x00000000 */ \ + WPP_DEFINE_BIT(FilterDebugD23) /* bit 23 = 0x00000000 */ \ + WPP_DEFINE_BIT(FilterDebugD24) /* bit 24 = 0x00000000 */ \ + WPP_DEFINE_BIT(FilterDebugD25) /* bit 25 = 0x00000000 */ \ + WPP_DEFINE_BIT(FilterDebugD26) /* bit 26 = 0x00000000 */ \ + WPP_DEFINE_BIT(FilterDebugD27) /* bit 27 = 0x00000000 */ \ + WPP_DEFINE_BIT(FilterDebugD28) /* bit 28 = 0x00000000 */ \ + WPP_DEFINE_BIT(FilterDebugD29) /* bit 29 = 0x00000000 */ \ + WPP_DEFINE_BIT(CdromSecError) /* bit 30 = 0x00000000 */ \ + WPP_DEFINE_BIT(CdromSecInfo) /* bit 31 = 0x00000000 */ \ + ) + + diff --git a/drivers/storage/class/class2/class2.c b/drivers/storage/class/class2/class2.c index cb8d1f7108c..befd6656010 100644 --- a/drivers/storage/class/class2/class2.c +++ b/drivers/storage/class/class2/class2.c @@ -748,16 +748,16 @@ Retry: // in reverse byte order. // - ((PFOUR_BYTE)&deviceExtension->DiskGeometry->BytesPerSector)->Byte0 = + ((PFOUR_BYTE)&deviceExtension->DiskGeometry->Geometry.BytesPerSector)->Byte0 = ((PFOUR_BYTE)&readCapacityBuffer->BytesPerBlock)->Byte3; - ((PFOUR_BYTE)&deviceExtension->DiskGeometry->BytesPerSector)->Byte1 = + ((PFOUR_BYTE)&deviceExtension->DiskGeometry->Geometry.BytesPerSector)->Byte1 = ((PFOUR_BYTE)&readCapacityBuffer->BytesPerBlock)->Byte2; - ((PFOUR_BYTE)&deviceExtension->DiskGeometry->BytesPerSector)->Byte2 = + ((PFOUR_BYTE)&deviceExtension->DiskGeometry->Geometry.BytesPerSector)->Byte2 = ((PFOUR_BYTE)&readCapacityBuffer->BytesPerBlock)->Byte1; - ((PFOUR_BYTE)&deviceExtension->DiskGeometry->BytesPerSector)->Byte3 = + ((PFOUR_BYTE)&deviceExtension->DiskGeometry->Geometry.BytesPerSector)->Byte3 = ((PFOUR_BYTE)&readCapacityBuffer->BytesPerBlock)->Byte0; // @@ -780,10 +780,10 @@ Retry: // Calculate sector to byte shift. // - WHICH_BIT(deviceExtension->DiskGeometry->BytesPerSector, deviceExtension->SectorShift); + WHICH_BIT(deviceExtension->DiskGeometry->Geometry.BytesPerSector, deviceExtension->SectorShift); DebugPrint((2,"SCSI ScsiClassReadDriveCapacity: Sector size is %d\n", - deviceExtension->DiskGeometry->BytesPerSector)); + deviceExtension->DiskGeometry->Geometry.BytesPerSector)); DebugPrint((2,"SCSI ScsiClassReadDriveCapacity: Number of Sectors is %d\n", lastSector + 1)); @@ -798,7 +798,7 @@ Retry: // Calculate number of cylinders. // - deviceExtension->DiskGeometry->Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(32 * 64)); + deviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(32 * 64)); deviceExtension->PartitionLength.QuadPart = (deviceExtension->PartitionLength.QuadPart << deviceExtension->SectorShift); @@ -809,7 +809,7 @@ Retry: // This device supports removable media. // - deviceExtension->DiskGeometry->MediaType = RemovableMedia; + deviceExtension->DiskGeometry->Geometry.MediaType = RemovableMedia; } else { @@ -817,20 +817,20 @@ Retry: // Assume media type is fixed disk. // - deviceExtension->DiskGeometry->MediaType = FixedMedia; + deviceExtension->DiskGeometry->Geometry.MediaType = FixedMedia; } // // Assume sectors per track are 32; // - deviceExtension->DiskGeometry->SectorsPerTrack = 32; + deviceExtension->DiskGeometry->Geometry.SectorsPerTrack = 32; // // Assume tracks per cylinder (number of heads) is 64. // - deviceExtension->DiskGeometry->TracksPerCylinder = 64; + deviceExtension->DiskGeometry->Geometry.TracksPerCylinder = 64; } if (status == STATUS_VERIFY_REQUIRED) { @@ -860,8 +860,8 @@ Retry: // except for the bytes per sector and sector shift. // - RtlZeroMemory(deviceExtension->DiskGeometry, sizeof(DISK_GEOMETRY)); - deviceExtension->DiskGeometry->BytesPerSector = 512; + RtlZeroMemory(deviceExtension->DiskGeometry, sizeof(DISK_GEOMETRY_EX)); + deviceExtension->DiskGeometry->Geometry.BytesPerSector = 512; deviceExtension->SectorShift = 9; deviceExtension->PartitionLength.QuadPart = (LONGLONG) 0; @@ -871,7 +871,7 @@ Retry: // This device supports removable media. // - deviceExtension->DiskGeometry->MediaType = RemovableMedia; + deviceExtension->DiskGeometry->Geometry.MediaType = RemovableMedia; } else { @@ -879,7 +879,7 @@ Retry: // Assume media type is fixed disk. // - deviceExtension->DiskGeometry->MediaType = FixedMedia; + deviceExtension->DiskGeometry->Geometry.MediaType = FixedMedia; } } @@ -2752,7 +2752,7 @@ Return Value: errorLogEntry->DeviceOffset.QuadPart = (LONGLONG) badSector; errorLogEntry->DeviceOffset = RtlExtendedIntegerMultiply( errorLogEntry->DeviceOffset, - deviceExtension->DiskGeometry->BytesPerSector); + deviceExtension->DiskGeometry->Geometry.BytesPerSector); } errorLogEntry->ErrorCode = logStatus; diff --git a/drivers/storage/class/disk/disk.c b/drivers/storage/class/disk/disk.c index 895b2eb8c55..a7085c43631 100644 --- a/drivers/storage/class/disk/disk.c +++ b/drivers/storage/class/disk/disk.c @@ -652,7 +652,7 @@ Return Value: NTSTATUS status; PDEVICE_OBJECT deviceObject = NULL; PDEVICE_OBJECT physicalDevice; - PDISK_GEOMETRY diskGeometry = NULL; + PDISK_GEOMETRY_EX diskGeometry = NULL; PDEVICE_EXTENSION deviceExtension = NULL; PDEVICE_EXTENSION physicalDeviceExtension; UCHAR pathId = LunInfo->PathId; @@ -880,7 +880,7 @@ Return Value: // Allocate buffer for drive geometry. // - diskGeometry = ExAllocatePool(NonPagedPool, sizeof(DISK_GEOMETRY)); + diskGeometry = ExAllocatePool(NonPagedPool, sizeof(DISK_GEOMETRY_EX)); if (diskGeometry == NULL) { @@ -1065,7 +1065,7 @@ CreatePartitionDeviceObjects( ULONG partitionNumber = 0; NTSTATUS status; PDEVICE_OBJECT deviceObject = NULL; - PDISK_GEOMETRY diskGeometry = NULL; + PDISK_GEOMETRY_EX diskGeometry = NULL; PDRIVE_LAYOUT_INFORMATION partitionList = NULL; PDEVICE_EXTENSION deviceExtension; PDEVICE_EXTENSION physicalDeviceExtension; @@ -1087,7 +1087,7 @@ CreatePartitionDeviceObjects( physicalDeviceExtension = PhysicalDeviceObject->DeviceExtension; diskGeometry = physicalDeviceExtension->DiskGeometry; - bytesPerSector = diskGeometry->BytesPerSector; + bytesPerSector = diskGeometry->Geometry.BytesPerSector; // // Make sure sector size is not zero. @@ -1099,7 +1099,7 @@ CreatePartitionDeviceObjects( // Default sector size for disk is 512. // - bytesPerSector = diskGeometry->BytesPerSector = 512; + bytesPerSector = diskGeometry->Geometry.BytesPerSector = 512; } sectorShift = physicalDeviceExtension->SectorShift; @@ -1118,7 +1118,7 @@ CreatePartitionDeviceObjects( // HalExamineMBR(PhysicalDeviceObject, - physicalDeviceExtension->DiskGeometry->BytesPerSector, + physicalDeviceExtension->DiskGeometry->Geometry.BytesPerSector, (ULONG)0x54, (PVOID)&dmSkew); @@ -1149,7 +1149,7 @@ CreatePartitionDeviceObjects( // status = IoReadPartitionTable(PhysicalDeviceObject, - physicalDeviceExtension->DiskGeometry->BytesPerSector, + physicalDeviceExtension->DiskGeometry->Geometry.BytesPerSector, TRUE, (PVOID)&partitionList); @@ -1432,7 +1432,7 @@ CreatePartitionDeviceObjects( // deviceExtension->TimeOutValue = physicalDeviceExtension->TimeOutValue; - deviceExtension->DiskGeometry->BytesPerSector = bytesPerSector; + deviceExtension->DiskGeometry->Geometry.BytesPerSector = bytesPerSector; deviceExtension->SectorShift = sectorShift; deviceExtension->DeviceObject = deviceObject; deviceExtension->DeviceFlags |= physicalDeviceExtension->DeviceFlags; @@ -1512,7 +1512,7 @@ Return Value: transferByteCount); if ((startingOffset.QuadPart > deviceExtension->PartitionLength.QuadPart) || - (transferByteCount & (deviceExtension->DiskGeometry->BytesPerSector - 1))) { + (transferByteCount & (deviceExtension->DiskGeometry->Geometry.BytesPerSector - 1))) { // // This error maybe caused by the fact that the drive is not ready. @@ -2014,6 +2014,7 @@ Return Value: } case IOCTL_DISK_GET_DRIVE_GEOMETRY: + case IOCTL_DISK_GET_DRIVE_GEOMETRY_EX: { PDEVICE_EXTENSION physicalDeviceExtension; @@ -2021,8 +2022,12 @@ Return Value: BOOLEAN removable = FALSE; BOOLEAN listInitialized = FALSE; - if ( irpStack->Parameters.DeviceIoControl.OutputBufferLength < - sizeof( DISK_GEOMETRY ) ) { + if ((irpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_DISK_GET_DRIVE_GEOMETRY && + irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(DISK_GEOMETRY)) || + (irpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_DISK_GET_DRIVE_GEOMETRY_EX && + irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(DISK_GEOMETRY_EX))) { status = STATUS_INFO_LENGTH_MISMATCH; break; @@ -2083,10 +2088,15 @@ Return Value: RtlMoveMemory(Irp->AssociatedIrp.SystemBuffer, deviceExtension->DiskGeometry, - sizeof(DISK_GEOMETRY)); + (irpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_DISK_GET_DRIVE_GEOMETRY) ? + sizeof(DISK_GEOMETRY) : + sizeof(DISK_GEOMETRY_EX)); status = STATUS_SUCCESS; - Irp->IoStatus.Information = sizeof(DISK_GEOMETRY); + Irp->IoStatus.Information = + (irpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_DISK_GET_DRIVE_GEOMETRY) ? + sizeof(DISK_GEOMETRY) : + sizeof(DISK_GEOMETRY_EX); } break; @@ -2252,6 +2262,88 @@ Return Value: break; + case IOCTL_DISK_GET_PARTITION_INFO_EX: + + // + // Return the information about the partition specified by the device + // object. Note that no information is ever returned about the size + // or partition type of the physical disk, as this doesn't make any + // sense. + // + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(PARTITION_INFORMATION_EX)) { + + status = STATUS_INFO_LENGTH_MISMATCH; + + } + else if (diskData->PartitionNumber == 0) { + + // + // Paritition zero is not a partition so this is not a + // reasonable request. + // + + status = STATUS_INVALID_DEVICE_REQUEST; + + } + else { + + PPARTITION_INFORMATION_EX outputBuffer; + + // + // Update the geometry in case it has changed. + // + + status = UpdateRemovableGeometry (DeviceObject, Irp); + + if (!NT_SUCCESS(status)) { + + // + // Note the drive is not ready. + // + + diskData->DriveNotReady = TRUE; + break; + } + + // + // Note the drive is now ready. + // + + diskData->DriveNotReady = FALSE; + + if (diskData->PartitionType == 0 && (diskData->PartitionNumber > 0)) { + + status = STATUS_INVALID_DEVICE_REQUEST; + break; + } + + outputBuffer = + (PPARTITION_INFORMATION_EX)Irp->AssociatedIrp.SystemBuffer; + + // + // FIXME: hack of the year, assume that partition is MBR + // Thing that can obviously be wrong... + // + + outputBuffer->PartitionStyle = PARTITION_STYLE_MBR; + outputBuffer->Mbr.PartitionType = diskData->PartitionType; + outputBuffer->StartingOffset = deviceExtension->StartingOffset; + outputBuffer->PartitionLength.QuadPart = deviceExtension->PartitionLength.QuadPart; + outputBuffer->Mbr.HiddenSectors = diskData->HiddenSectors; + outputBuffer->PartitionNumber = diskData->PartitionNumber; + outputBuffer->Mbr.BootIndicator = diskData->BootIndicator; + outputBuffer->RewritePartition = FALSE; + outputBuffer->Mbr.RecognizedPartition = + IsRecognizedPartition(diskData->PartitionType); + + status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION_EX); + } + + break; + case IOCTL_DISK_SET_PARTITION_INFO: if (diskData->PartitionNumber == 0) { @@ -2285,7 +2377,7 @@ Return Value: status = IoSetPartitionInformation( deviceExtension->PhysicalDevice, - deviceExtension->DiskGeometry->BytesPerSector, + deviceExtension->DiskGeometry->Geometry.BytesPerSector, diskData->PartitionOrdinal, inputBuffer->PartitionType); @@ -2323,7 +2415,7 @@ Return Value: // status = IoReadPartitionTable(deviceExtension->PhysicalDevice, - deviceExtension->DiskGeometry->BytesPerSector, + deviceExtension->DiskGeometry->Geometry.BytesPerSector, FALSE, &partitionList); @@ -2504,9 +2596,9 @@ Return Value: status = IoWritePartitionTable( deviceExtension->DeviceObject, - deviceExtension->DiskGeometry->BytesPerSector, - deviceExtension->DiskGeometry->SectorsPerTrack, - deviceExtension->DiskGeometry->TracksPerCylinder, + deviceExtension->DiskGeometry->Geometry.BytesPerSector, + deviceExtension->DiskGeometry->Geometry.SectorsPerTrack, + deviceExtension->DiskGeometry->Geometry.TracksPerCylinder, partitionList); } @@ -3455,7 +3547,7 @@ Return Value: // Get sector size. // - sectorSize = DeviceExtension->DiskGeometry->BytesPerSector; + sectorSize = DeviceExtension->DiskGeometry->Geometry.BytesPerSector; // // Make sure sector size is at least 512 bytes. @@ -4102,9 +4194,11 @@ diskMatched: // Update the actual geometry information. // - DeviceExtension->DiskGeometry->SectorsPerTrack = sectorsPerTrack; - DeviceExtension->DiskGeometry->TracksPerCylinder = tracksPerCylinder; - DeviceExtension->DiskGeometry->Cylinders.QuadPart = (LONGLONG)cylinders; + DeviceExtension->DiskGeometry->Geometry.SectorsPerTrack = sectorsPerTrack; + DeviceExtension->DiskGeometry->Geometry.TracksPerCylinder = tracksPerCylinder; + DeviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (LONGLONG)cylinders; + DeviceExtension->DiskGeometry->DiskSize.QuadPart = cylinders * tracksPerCylinder * sectorsPerTrack * + DeviceExtension->DiskGeometry->Geometry.BytesPerSector; DebugPrint((3, "SCSIDISK: UpdateGeometry: BIOS spt %x, #heads %x, #cylinders %x\n", @@ -4119,7 +4213,7 @@ diskMatched: if (!DeviceExtension->DMActive) { HalExamineMBR(DeviceExtension->DeviceObject, - DeviceExtension->DiskGeometry->BytesPerSector, + DeviceExtension->DiskGeometry->Geometry.BytesPerSector, (ULONG)0x55, &tmpPtr ); @@ -4155,18 +4249,19 @@ diskMatched: cylinders -= 1; - DeviceExtension->DiskGeometry->Cylinders.QuadPart = cylinders + 1; - DeviceExtension->DiskGeometry->TracksPerCylinder = tracksPerCylinder + 1; + DeviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = cylinders + 1; + DeviceExtension->DiskGeometry->Geometry.TracksPerCylinder = tracksPerCylinder + 1; DeviceExtension->PartitionLength.QuadPart = - DeviceExtension->DiskGeometry->Cylinders.QuadPart * - DeviceExtension->DiskGeometry->SectorsPerTrack * - DeviceExtension->DiskGeometry->BytesPerSector * - DeviceExtension->DiskGeometry->TracksPerCylinder; + DeviceExtension->DiskGeometry->DiskSize.QuadPart = + DeviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart * + DeviceExtension->DiskGeometry->Geometry.SectorsPerTrack * + DeviceExtension->DiskGeometry->Geometry.BytesPerSector * + DeviceExtension->DiskGeometry->Geometry.TracksPerCylinder; if (DeviceExtension->DMActive) { - DeviceExtension->DMByteSkew = DeviceExtension->DMSkew * DeviceExtension->DiskGeometry->BytesPerSector; + DeviceExtension->DMByteSkew = DeviceExtension->DMSkew * DeviceExtension->DiskGeometry->Geometry.BytesPerSector; } @@ -4250,7 +4345,7 @@ Return Value: // status = IoReadPartitionTable(deviceExtension->PhysicalDevice, - deviceExtension->DiskGeometry->BytesPerSector, + deviceExtension->DiskGeometry->Geometry.BytesPerSector, TRUE, &partitionList); diff --git a/drivers/storage/class/include/class2.h b/drivers/storage/class/include/class2.h index efd55a7f94d..48aa271c2e8 100644 --- a/drivers/storage/class/include/class2.h +++ b/drivers/storage/class/include/class2.h @@ -112,7 +112,7 @@ typedef struct _DEVICE_EXTENSION PCLASS_CREATE_CLOSE ClassCreateClose; PDRIVER_STARTIO ClassStartIo; PIO_SCSI_CAPABILITIES PortCapabilities; - PDISK_GEOMETRY DiskGeometry; + PDISK_GEOMETRY_EX DiskGeometry; PDEVICE_OBJECT PhysicalDevice; PSENSE_DATA SenseData; ULONG TimeOutValue; diff --git a/drivers/storage/classpnp/autorun.c b/drivers/storage/classpnp/autorun.c new file mode 100644 index 00000000000..0d2f36d4a52 --- /dev/null +++ b/drivers/storage/classpnp/autorun.c @@ -0,0 +1,3611 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + autorun.c + +Abstract: + + Code for support of media change detection in the class driver + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + +#include "classp.h" +#include "debug.h" + +#define GESN_TIMEOUT_VALUE (0x4) +#define GESN_BUFFER_SIZE (0x8) +#define MAXIMUM_IMMEDIATE_MCN_RETRIES (0x20) +#define MCN_REG_SUBKEY_NAME (L"MediaChangeNotification") +#define MCN_REG_AUTORUN_DISABLE_INSTANCE_NAME (L"AlwaysDisableMCN") +#define MCN_REG_AUTORUN_ENABLE_INSTANCE_NAME (L"AlwaysEnableMCN") + +GUID StoragePredictFailureEventGuid = WMI_STORAGE_PREDICT_FAILURE_EVENT_GUID; + +// +// Only send polling irp when device is fully powered up and a +// power down irp is not in progress. +// +// NOTE: This helps close a window in time where a polling irp could cause +// a drive to spin up right after it has powered down. The problem is +// that SCSIPORT, ATAPI and SBP2 will be in the process of powering +// down (which may take a few seconds), but won't know that. It would +// then get a polling irp which will be put into its queue since it +// the disk isn't powered down yet. Once the disk is powered down it +// will find the polling irp in the queue and then power up the +// device to do the poll. They do not want to check if the polling +// irp has the SRB_NO_KEEP_AWAKE flag here since it is in a critical +// path and would slow down all I/Os. A better way to fix this +// would be to serialize the polling and power down irps so that +// only one of them is sent to the device at a time. +// +#define ClasspCanSendPollingIrp(fdoExtension) \ + ((fdoExtension->DevicePowerState == PowerDeviceD0) && \ + (! fdoExtension->PowerDownInProgress) ) + +BOOLEAN +ClasspIsMediaChangeDisabledDueToHardwareLimitation( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PUNICODE_STRING RegistryPath + ); + +NTSTATUS +ClasspMediaChangeDeviceInstanceOverride( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + OUT PBOOLEAN Enabled + ); + +BOOLEAN +ClasspIsMediaChangeDisabledForClass( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PUNICODE_STRING RegistryPath + ); + +VOID +ClasspSetMediaChangeStateEx( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN MEDIA_CHANGE_DETECTION_STATE NewState, + IN BOOLEAN Wait, + IN BOOLEAN KnownStateChange // can ignore oldstate == unknown + ); + +NTSTATUS +ClasspMediaChangeRegistryCallBack( + IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext + ); + +VOID +ClasspSendMediaStateIrp( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PMEDIA_CHANGE_DETECTION_INFO Info, + IN ULONG CountDown + ); + +VOID +ClasspFailurePredict( + IN PDEVICE_OBJECT DeviceObject, + IN PFAILURE_PREDICTION_INFO Info + ); + +NTSTATUS +ClasspInitializePolling( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN BOOLEAN AllowDriveToSleep + ); + + +#if ALLOC_PRAGMA + +#pragma alloc_text(PAGE, ClassInitializeMediaChangeDetection) +#pragma alloc_text(PAGE, ClassEnableMediaChangeDetection) +#pragma alloc_text(PAGE, ClassDisableMediaChangeDetection) +#pragma alloc_text(PAGE, ClassCleanupMediaChangeDetection) +#pragma alloc_text(PAGE, ClasspMediaChangeRegistryCallBack) +#pragma alloc_text(PAGE, ClasspInitializePolling) + +#pragma alloc_text(PAGE, ClasspIsMediaChangeDisabledDueToHardwareLimitation) +#pragma alloc_text(PAGE, ClasspMediaChangeDeviceInstanceOverride) +#pragma alloc_text(PAGE, ClasspIsMediaChangeDisabledForClass) + +#pragma alloc_text(PAGE, ClassSetFailurePredictionPoll) +#pragma alloc_text(PAGE, ClasspDisableTimer) +#pragma alloc_text(PAGE, ClasspEnableTimer) + +#endif + +// ISSUE -- make this public? +VOID +ClassSendEjectionNotification( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) +{ + // + // For post-NT5.1 work, need to move EjectSynchronizationEvent + // to be a MUTEX so we can attempt to grab it here and benefit + // from deadlock detection. This will allow checking if the media + // has been locked by programs before broadcasting these events. + // (what's the point of broadcasting if the media is not locked?) + // + // This would currently only be a slight optimization. For post-NT5.1, + // it would allow us to send a single PERSISTENT_PREVENT to MMC devices, + // thereby cleaning up a lot of the ejection code. Then, when the + // ejection request occured, we could see if any locks for the media + // existed. if locked, broadcast. if not, we send the eject irp. + // + + // + // for now, just always broadcast. make this a public routine, + // so class drivers can add special hacks to broadcast this for their + // non-MMC-compliant devices also from sense codes. + // + + DBGTRACE(ClassDebugTrace, ("ClassSendEjectionNotification: media EJECT_REQUEST")); + ClasspSendNotification(FdoExtension, + &GUID_IO_MEDIA_EJECT_REQUEST, + 0, + NULL); + return; +} + + +VOID +ClasspSendNotification( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN const GUID * Guid, + IN ULONG ExtraDataSize, + IN PVOID ExtraData + ) +{ + PTARGET_DEVICE_CUSTOM_NOTIFICATION notification; + ULONG requiredSize; + + requiredSize = + (sizeof(TARGET_DEVICE_CUSTOM_NOTIFICATION) - sizeof(UCHAR)) + + ExtraDataSize; + + if (requiredSize > 0x0000ffff) { + // MAX_USHORT, max total size for these events! + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugWarning, + "Error sending event: size too large! (%x)\n", + requiredSize)); + return; + } + + notification = ExAllocatePoolWithTag(NonPagedPool, + requiredSize, + 'oNcS'); + + // + // if none allocated, exit + // + + if (notification == NULL) { + return; + } + + // + // Prepare and send the request! + // + + RtlZeroMemory(notification, requiredSize); + notification->Version = 1; + notification->Size = (USHORT)(requiredSize); + notification->FileObject = NULL; + notification->NameBufferOffset = -1; + notification->Event = *Guid; + RtlCopyMemory(notification->CustomDataBuffer, ExtraData, ExtraDataSize); + + IoReportTargetDeviceChangeAsynchronous(FdoExtension->LowerPdo, + notification, + NULL, NULL); + + ExFreePool(notification); + notification = NULL; + return; +} + + + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspInterpretGesnData() + +Routine Description: + + This routine will interpret the data returned for a GESN command, and + (if appropriate) set the media change event, and broadcast the + appropriate events to user mode for applications who care. + +Arguments: + + FdoExtension - the device + + DataBuffer - the resulting data from a GESN event. + requires at least EIGHT valid bytes (header == 4, data == 4) + + ResendImmediately - whether or not to immediately resend the request. + this should be FALSE if there was no event, FALSE if the reported + event was of the DEVICE BUSY class, else true. + +Return Value: + + None + +Notes: + + DataBuffer must be at least four bytes of valid data (header == 4 bytes), + and have at least eight bytes of allocated memory (all events == 4 bytes). + + The call to StartNextPacket may occur before this routine is completed. + the operational change notifications are informational in nature, and + while useful, are not neccessary to ensure proper operation. For example, + if the device morphs to no longer supporting WRITE commands, all further + write commands will fail. There exists a small timing window wherein + IOCTL_IS_DISK_WRITABLE may be called and get an incorrect response. If + a device supports software write protect, it is expected that the + application can handle such a case. + + NOTE: perhaps setting the updaterequired byte to one should be done here. + if so, it relies upon the setting of a 32-byte value to be an atomic + operation. unfortunately, there is no simple way to notify a class driver + which wants to know that the device behavior requires updating. + + Not ready events may be sent every second. For example, if we were + to minimize the number of asynchronous notifications, an application may + register just after a large busy time was reported. This would then + prevent the application from knowing the device was busy until some + arbitrarily chosen timeout has occurred. Also, the GESN request would + have to still occur, since it checks for non-busy events (such as user + keybutton presses and media change events) as well. The specification + states that the lower-numered events get reported first, so busy events, + while repeating, will only be reported when all other events have been + cleared from the device. + +--*/ +VOID +ClasspInterpretGesnData( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PNOTIFICATION_EVENT_STATUS_HEADER Header, + IN PBOOLEAN ResendImmediately + ) +{ + PMEDIA_CHANGE_DETECTION_INFO info; + LONG dataLength; + LONG requiredLength; + + info = FdoExtension->MediaChangeDetectionInfo; + + // + // note: don't allocate anything in this routine so that we can + // always just 'return'. + // + + *ResendImmediately = FALSE; + + if (Header->NEA) { + return; + } + if (Header->NotificationClass == NOTIFICATION_NO_CLASS_EVENTS) { + return; + } + + // + // HACKHACK - REF #0001 + // This loop is only taken initially, due to the inability to reliably + // auto-detect drives that report events correctly at boot. When we + // detect this behavior during the normal course of running, we will + // disable the hack, allowing more efficient use of the system. This + // should occur "nearly" instantly, as the drive should have multiple + // events queue'd (ie. power, morphing, media). + // + + if (info->Gesn.HackEventMask) { + + // + // all events use the low four bytes of zero to indicate + // that there was no change in status. + // + + UCHAR thisEvent = Header->ClassEventData[0] & 0xf; + UCHAR lowestSetBit; + UCHAR thisEventBit = (1 << Header->NotificationClass); + + ASSERT(TEST_FLAG(info->Gesn.EventMask, thisEventBit)); + + + // + // some bit magic here... this results in the lowest set bit only + // + + lowestSetBit = info->Gesn.EventMask; + lowestSetBit &= (info->Gesn.EventMask - 1); + lowestSetBit ^= (info->Gesn.EventMask); + + if (thisEventBit != lowestSetBit) { + + // + // HACKHACK - REF #0001 + // the first time we ever see an event set that is not the lowest + // set bit in the request (iow, highest priority), we know that the + // hack is no longer required, as the device is ignoring "no change" + // events when a real event is waiting in the other requested queues. + // + + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "Classpnp => GESN::NONE: Compliant drive found, " + "removing GESN hack (%x, %x)\n", + thisEventBit, info->Gesn.EventMask)); + + info->Gesn.HackEventMask = FALSE; + + } else if (thisEvent == 0) { + + // + // HACKHACK - REF #0001 + // note: this hack prevents poorly implemented firmware from constantly + // returning "No Event". we do this by cycling through the + // supported list of events here. + // + + SET_FLAG(info->Gesn.NoChangeEventMask, thisEventBit); + CLEAR_FLAG(info->Gesn.EventMask, thisEventBit); + + // + // if we have cycled through all supported event types, then + // we need to reset the events we are asking about. else we + // want to resend this request immediately in case there was + // another event pending. + // + + if (info->Gesn.EventMask == 0) { + info->Gesn.EventMask = info->Gesn.NoChangeEventMask; + info->Gesn.NoChangeEventMask = 0; + } else { + *ResendImmediately = TRUE; + } + return; + } + + } // end if (info->Gesn.HackEventMask) + + dataLength = + (Header->EventDataLength[0] << 8) | + (Header->EventDataLength[1] & 0xff); + dataLength -= 2; + requiredLength = 4; // all events are four bytes + + if (dataLength < requiredLength) { + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugWarning, + "Classpnp => GESN returned only %x bytes data for fdo %p\n", + dataLength, FdoExtension->DeviceObject)); + return; + } + if (dataLength != requiredLength) { + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugWarning, + "Classpnp => GESN returned too many (%x) bytes data for fdo %p\n", + dataLength, FdoExtension->DeviceObject)); + dataLength = 4; + } + +/* + ClasspSendNotification(FdoExtension, + &GUID_IO_GENERIC_GESN_EVENT, + sizeof(NOTIFICATION_EVENT_STATUS_HEADER) + dataLength, + Header) +*/ + + switch (Header->NotificationClass) { + + case NOTIFICATION_EXTERNAL_REQUEST_CLASS_EVENTS: { // 0x3 + + PNOTIFICATION_EXTERNAL_STATUS externalInfo = + (PNOTIFICATION_EXTERNAL_STATUS)(Header->ClassEventData); + DEVICE_EVENT_EXTERNAL_REQUEST externalData; + + // + // unfortunately, due to time constraints, we will only notify + // about keys being pressed, and not released. this makes keys + // single-function, but simplifies the code significantly. + // + + if (externalInfo->ExternalEvent != + NOTIFICATION_EXTERNAL_EVENT_BUTTON_DOWN) { + break; + } + + *ResendImmediately = TRUE; + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "Classpnp => GESN::EXTERNAL: Event: %x Status %x Req %x\n", + externalInfo->ExternalEvent, externalInfo->ExternalStatus, + (externalInfo->Request[0] >> 8) | externalInfo->Request[1] + )); + + RtlZeroMemory(&externalData, sizeof(DEVICE_EVENT_EXTERNAL_REQUEST)); + externalData.Version = 1; + externalData.DeviceClass = 0; + externalData.ButtonStatus = externalInfo->ExternalEvent; + externalData.Request = + (externalInfo->Request[0] << 8) | + (externalInfo->Request[1] & 0xff); + KeQuerySystemTime(&(externalData.SystemTime)); + externalData.SystemTime.QuadPart *= (LONGLONG)KeQueryTimeIncrement(); + + DBGTRACE(ClassDebugTrace, ("ClasspInterpretGesnData: media DEVICE_EXTERNAL_REQUEST")); + ClasspSendNotification(FdoExtension, + &GUID_IO_DEVICE_EXTERNAL_REQUEST, + sizeof(DEVICE_EVENT_EXTERNAL_REQUEST), + &externalData); + return; + } + + case NOTIFICATION_MEDIA_STATUS_CLASS_EVENTS: { // 0x4 + + PNOTIFICATION_MEDIA_STATUS mediaInfo = + (PNOTIFICATION_MEDIA_STATUS)(Header->ClassEventData); + + if (mediaInfo->MediaEvent == NOTIFICATION_MEDIA_EVENT_NO_CHANGE) { + break; + } + + *ResendImmediately = TRUE; + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "Classpnp => GESN::MEDIA: Event: %x Status %x\n", + mediaInfo->MediaEvent, mediaInfo->MediaStatus)); + + if ((mediaInfo->MediaEvent == NOTIFICATION_MEDIA_EVENT_NEW_MEDIA) || + (mediaInfo->MediaEvent == NOTIFICATION_MEDIA_EVENT_MEDIA_CHANGE)) { + + + if (TEST_FLAG(FdoExtension->DeviceObject->Characteristics, + FILE_REMOVABLE_MEDIA) && + (ClassGetVpb(FdoExtension->DeviceObject) != NULL) && + (ClassGetVpb(FdoExtension->DeviceObject)->Flags & VPB_MOUNTED) + ) { + + SET_FLAG(FdoExtension->DeviceObject->Flags, DO_VERIFY_VOLUME); + + } + InterlockedIncrement(&FdoExtension->MediaChangeCount); + ClasspSetMediaChangeStateEx(FdoExtension, + MediaPresent, + FALSE, + TRUE); + + } else if (mediaInfo->MediaEvent == NOTIFICATION_MEDIA_EVENT_MEDIA_REMOVAL) { + + ClasspSetMediaChangeStateEx(FdoExtension, + MediaNotPresent, + FALSE, + TRUE); + + } else if (mediaInfo->MediaEvent == NOTIFICATION_MEDIA_EVENT_EJECT_REQUEST) { + + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugError, + "Classpnp => GESN Ejection request received!\n")); + ClassSendEjectionNotification(FdoExtension); + + } + break; + + } + + case NOTIFICATION_DEVICE_BUSY_CLASS_EVENTS: { // lowest priority events... + + PNOTIFICATION_BUSY_STATUS busyInfo = + (PNOTIFICATION_BUSY_STATUS)(Header->ClassEventData); + DEVICE_EVENT_BECOMING_READY busyData; + + // + // NOTE: we never actually need to immediately retry for these + // events: if one exists, the device is busy, and if not, + // we still don't want to retry. + // + + if (busyInfo->DeviceBusyStatus == NOTIFICATION_BUSY_STATUS_NO_EVENT) { + break; + } + + // + // else we want to report the approximated time till it's ready. + // + + RtlZeroMemory(&busyData, sizeof(DEVICE_EVENT_BECOMING_READY)); + busyData.Version = 1; + busyData.Reason = busyInfo->DeviceBusyStatus; + busyData.Estimated100msToReady = (busyInfo->Time[0] << 8) | + (busyInfo->Time[1] & 0xff); + + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "Classpnp => GESN::BUSY: Event: %x Status %x Time %x\n", + busyInfo->DeviceBusyEvent, busyInfo->DeviceBusyStatus, + busyData.Estimated100msToReady + )); + + DBGTRACE(ClassDebugTrace, ("ClasspInterpretGesnData: media BECOMING_READY")); + ClasspSendNotification(FdoExtension, + &GUID_IO_DEVICE_BECOMING_READY, + sizeof(DEVICE_EVENT_BECOMING_READY), + &busyData); + break; + } + + default: { + + break; + + } + + } // end switch on notification class + return; +} + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspInternalSetMediaChangeState() + +Routine Description: + + This routine will (if appropriate) set the media change event for the + device. The event will be set if the media state is changed and + media change events are enabled. Otherwise the media state will be + tracked but the event will not be set. + + This routine will lock out the other media change routines if possible + but if not a media change notification may be lost after the enable has + been completed. + +Arguments: + + FdoExtension - the device + + MediaPresent - indicates whether the device has media inserted into it + (TRUE) or not (FALSE). + +Return Value: + + none + +--*/ +VOID +ClasspInternalSetMediaChangeState( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN MEDIA_CHANGE_DETECTION_STATE NewState, + IN BOOLEAN KnownStateChange // can ignore oldstate == unknown + ) +{ +#if DBG + PUCHAR states[] = {"Unknown", "Present", "Not Present"}; +#endif + MEDIA_CHANGE_DETECTION_STATE oldMediaState; + PMEDIA_CHANGE_DETECTION_INFO info = FdoExtension->MediaChangeDetectionInfo; + ULONG data; + NTSTATUS status; + + ASSERT((NewState >= MediaUnknown) && (NewState <= MediaNotPresent)); + + if(info == NULL) { + return; + } + + oldMediaState = InterlockedExchange( + (PLONG)(&info->MediaChangeDetectionState), + (LONG)NewState); + + if((oldMediaState == MediaUnknown) && (!KnownStateChange)) { + + // + // The media was in an indeterminate state before - don't notify for + // this change. + // + + DebugPrint((ClassDebugMCN, + "ClassSetMediaChangeState: State was unknown - this may " + "not be a change\n")); + return; + + } else if(oldMediaState == NewState) { + + // + // Media is in the same state it was before. + // + + return; + } + + if(info->MediaChangeDetectionDisableCount != 0) { + + DBGTRACE(ClassDebugMCN, + ("ClassSetMediaChangeState: MCN not enabled, state " + "changed from %s to %s\n", + states[oldMediaState], states[NewState])); + return; + + } + + DBGTRACE(ClassDebugMCN, + ("ClassSetMediaChangeState: State change from %s to %s\n", + states[oldMediaState], states[NewState])); + + // + // make the data useful -- it used to always be zero. + // + data = FdoExtension->MediaChangeCount; + + if (NewState == MediaPresent) { + + DBGTRACE(ClassDebugTrace, ("ClasspInternalSetMediaChangeState: media ARRIVAL")); + ClasspSendNotification(FdoExtension, + &GUID_IO_MEDIA_ARRIVAL, + sizeof(ULONG), + &data); + + } + else if (NewState == MediaNotPresent) { + + DBGTRACE(ClassDebugTrace, ("ClasspInternalSetMediaChangeState: media REMOVAL")); + ClasspSendNotification(FdoExtension, + &GUID_IO_MEDIA_REMOVAL, + sizeof(ULONG), + &data); + + } else { + + // + // Don't notify of changed going to unknown. + // + + return; + } + + return; +} // end ClasspInternalSetMediaChangeState() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassSetMediaChangeState() + +Routine Description: + + This routine will (if appropriate) set the media change event for the + device. The event will be set if the media state is changed and + media change events are enabled. Otherwise the media state will be + tracked but the event will not be set. + + This routine will lock out the other media change routines if possible + but if not a media change notification may be lost after the enable has + been completed. + +Arguments: + + FdoExtension - the device + + MediaPresent - indicates whether the device has media inserted into it + (TRUE) or not (FALSE). + + Wait - indicates whether the function should wait until it can acquire + the synchronization lock or not. + +Return Value: + + none + +--*/ +VOID +ClasspSetMediaChangeStateEx( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN MEDIA_CHANGE_DETECTION_STATE NewState, + IN BOOLEAN Wait, + IN BOOLEAN KnownStateChange // can ignore oldstate == unknown + ) +{ + PMEDIA_CHANGE_DETECTION_INFO info = FdoExtension->MediaChangeDetectionInfo; + LARGE_INTEGER zero; + NTSTATUS status; + + DBGTRACE(ClassDebugMCN, ("> ClasspSetMediaChangeStateEx")); + + // + // Reset SMART status on media removal as the old status may not be + // valid when there is no media in the device or when new media is + // inserted. + // + + if (NewState == MediaNotPresent) { + + FdoExtension->FailurePredicted = FALSE; + FdoExtension->FailureReason = 0; + + } + + + zero.QuadPart = 0; + + if(info == NULL) { + return; + } + + status = KeWaitForMutexObject(&info->MediaChangeMutex, + Executive, + KernelMode, + FALSE, + ((Wait == TRUE) ? NULL : &zero)); + + if(status == STATUS_TIMEOUT) { + + // + // Someone else is in the process of setting the media state + // + + DBGWARN(("ClasspSetMediaChangeStateEx - timed out waiting for mutex")); + return; + } + + // + // Change the media present state and signal an event, if applicable + // + + ClasspInternalSetMediaChangeState(FdoExtension, NewState, KnownStateChange); + + KeReleaseMutex(&info->MediaChangeMutex, FALSE); + + DBGTRACE(ClassDebugMCN, ("< ClasspSetMediaChangeStateEx")); + + return; +} // end ClassSetMediaChangeStateEx() +VOID +ClassSetMediaChangeState( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN MEDIA_CHANGE_DETECTION_STATE NewState, + IN BOOLEAN Wait + ) +{ + ClasspSetMediaChangeStateEx(FdoExtension, NewState, Wait, FALSE); + return; +} + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspMediaChangeDetectionCompletion() + +Routine Description: + + This routine handles the completion of the test unit ready irps used to + determine if the media has changed. If the media has changed, this code + signals the named event to wake up other system services that react to + media change (aka AutoPlay). + +Arguments: + + DeviceObject - the object for the completion + Irp - the IRP being completed + Context - the SRB from the IRP + +Return Value: + + NTSTATUS + +--*/ +NTSTATUS +ClasspMediaChangeDetectionCompletion( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PSCSI_REQUEST_BLOCK Srb + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + PCLASS_PRIVATE_FDO_DATA fdoData; + PMEDIA_CHANGE_DETECTION_INFO info; + PIO_STACK_LOCATION nextIrpStack; + NTSTATUS status; + BOOLEAN retryImmediately = FALSE; + + // + // Since the class driver created this request, it's completion routine + // will not get a valid device object handed in. Use the one in the + // irp stack instead + // + + DeviceObject = IoGetCurrentIrpStackLocation(Irp)->DeviceObject; + fdoExtension = DeviceObject->DeviceExtension; + fdoData = fdoExtension->PrivateFdoData; + info = fdoExtension->MediaChangeDetectionInfo; + + ASSERT(info->MediaChangeIrp != NULL); + ASSERT(!TEST_FLAG(Srb->SrbStatus, SRB_STATUS_QUEUE_FROZEN)); + DBGTRACE(ClassDebugMCN, ("> ClasspMediaChangeDetectionCompletion: Device %p completed MCN irp %p.", DeviceObject, Irp)); + + /* + * HACK for IoMega 2GB Jaz drive: + * This drive spins down on its own to preserve the media. + * When spun down, TUR fails with 2/4/0 (SCSI_SENSE_NOT_READY/SCSI_ADSENSE_LUN_NOT_READY/?). + * ClassInterpretSenseInfo would then call ClassSendStartUnit to spin the media up, which defeats the + * purpose of the spindown. + * So in this case, make this into a successful TUR. + * This allows the drive to stay spun down until it is actually accessed again. + * (If the media were actually removed, TUR would fail with 2/3a/0 ). + * This hack only applies to drives with the CAUSE_NOT_REPORTABLE_HACK bit set; this + * is set by disk.sys when HackCauseNotReportableHack is set for the drive in its BadControllers list. + */ + if ((SRB_STATUS(Srb->SrbStatus) != SRB_STATUS_SUCCESS) && + TEST_FLAG(fdoExtension->ScanForSpecialFlags, CLASS_SPECIAL_CAUSE_NOT_REPORTABLE_HACK) && + (Srb->SenseInfoBufferLength >= RTL_SIZEOF_THROUGH_FIELD(SENSE_DATA, AdditionalSenseCode))){ + + PSENSE_DATA senseData = Srb->SenseInfoBuffer; + + if ((senseData->SenseKey == SCSI_SENSE_NOT_READY) && + (senseData->AdditionalSenseCode == SCSI_ADSENSE_LUN_NOT_READY)){ + Srb->SrbStatus = SRB_STATUS_SUCCESS; + } + } + + + // + // use ClassInterpretSenseInfo() to check for media state, and also + // to call ClassError() with correct parameters. + // + status = STATUS_SUCCESS; + if (SRB_STATUS(Srb->SrbStatus) != SRB_STATUS_SUCCESS) { + + DBGTRACE(ClassDebugMCN, ("ClasspMediaChangeDetectionCompletion - failed - srb status=%s, sense=%s/%s/%s.", DBGGETSRBSTATUSSTR(Srb), DBGGETSENSECODESTR(Srb), DBGGETADSENSECODESTR(Srb), DBGGETADSENSEQUALIFIERSTR(Srb))); + + ClassInterpretSenseInfo(DeviceObject, + Srb, + IRP_MJ_SCSI, + 0, + 0, + &status, + NULL); + + } + else { + + fdoData->LoggedTURFailureSinceLastIO = FALSE; + + if (!info->Gesn.Supported) { + + DBGTRACE(ClassDebugMCN, ("ClasspMediaChangeDetectionCompletion - succeeded and GESN NOT supported, setting MediaPresent.")); + + // + // success != media for GESN case + // + + ClassSetMediaChangeState(fdoExtension, MediaPresent, FALSE); + + } + else { + DBGTRACE(ClassDebugMCN, ("ClasspMediaChangeDetectionCompletion - succeeded (GESN supported).")); + } + } + + if (info->Gesn.Supported) { + + if (status == STATUS_DATA_OVERRUN) { + DBGTRACE(ClassDebugMCN, ("ClasspMediaChangeDetectionCompletion - Overrun")); + status = STATUS_SUCCESS; + } + + if (!NT_SUCCESS(status)) { + DBGTRACE(ClassDebugMCN, ("ClasspMediaChangeDetectionCompletion: GESN failed with status %x", status)); + } else { + + // + // for GESN, need to interpret the results of the data. + // this may also require an immediate retry + // + + if (Irp->IoStatus.Information == 8 ) { + ClasspInterpretGesnData(fdoExtension, + (PVOID)info->Gesn.Buffer, + &retryImmediately); + } + + } // end of NT_SUCCESS(status) + + } // end of Info->Gesn.Supported + + // + // free port-allocated sense buffer, if any. + // + + if (PORT_ALLOCATED_SENSE(fdoExtension, Srb)) { + FREE_PORT_ALLOCATED_SENSE_BUFFER(fdoExtension, Srb); + } + + // + // Remember the IRP and SRB for use the next time. + // + + ASSERT(IoGetNextIrpStackLocation(Irp)); + IoGetNextIrpStackLocation(Irp)->Parameters.Scsi.Srb = Srb; + + // + // Reset the MCN timer. + // + + ClassResetMediaChangeTimer(fdoExtension); + + // + // run a sanity check to make sure we're not recursing continuously + // + + if (retryImmediately) { + + info->MediaChangeRetryCount++; + if (info->MediaChangeRetryCount > MAXIMUM_IMMEDIATE_MCN_RETRIES) { + ASSERT(!"Recursing too often in MCN?"); + info->MediaChangeRetryCount = 0; + retryImmediately = FALSE; + } + + } else { + + info->MediaChangeRetryCount = 0; + + } + + + // + // release the remove lock.... + // + + { + UCHAR uniqueValue; + ClassAcquireRemoveLock(DeviceObject, (PIRP)(&uniqueValue)); + ClassReleaseRemoveLock(DeviceObject, Irp); + + + // + // set the irp as not in use + // + { + volatile LONG irpWasInUse; + irpWasInUse = InterlockedCompareExchange(&info->MediaChangeIrpInUse, 0, 1); + #if _MSC_FULL_VER != 13009111 // This compiler always takes the wrong path here. + ASSERT(irpWasInUse); + #endif + } + + // + // now send it again before we release our last remove lock + // + + if (retryImmediately) { + ClasspSendMediaStateIrp(fdoExtension, info, 0); + } + else { + DBGTRACE(ClassDebugMCN, ("ClasspMediaChangeDetectionCompletion - not retrying immediately")); + } + + // + // release the temporary remove lock + // + + ClassReleaseRemoveLock(DeviceObject, (PIRP)(&uniqueValue)); + } + + DBGTRACE(ClassDebugMCN, ("< ClasspMediaChangeDetectionCompletion")); + + return STATUS_MORE_PROCESSING_REQUIRED; +} + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspSendTestUnitIrp() - ISSUE-2000/02/20-henrygab - not documented + +Routine Description: + + This routine + +Arguments: + + DeviceObject - + Irp - + +Return Value: + + +--*/ +PIRP +ClasspPrepareMcnIrp( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PMEDIA_CHANGE_DETECTION_INFO Info, + IN BOOLEAN UseGesn +) +{ + PSCSI_REQUEST_BLOCK srb; + PIO_STACK_LOCATION irpStack; + PIO_STACK_LOCATION nextIrpStack; + NTSTATUS status; + PCDB cdb; + PIRP irp; + PVOID buffer; + + // + // Setup the IRP to perform a test unit ready. + // + + irp = Info->MediaChangeIrp; + + ASSERT(irp); + + if (irp == NULL) { + return NULL; + } + + // + // don't keep sending this if the device is being removed. + // + + status = ClassAcquireRemoveLock(FdoExtension->DeviceObject, irp); + if (status == REMOVE_COMPLETE) { + ASSERT(status != REMOVE_COMPLETE); + return NULL; + } + else if (status == REMOVE_PENDING) { + ClassReleaseRemoveLock(FdoExtension->DeviceObject, irp); + return NULL; + } + else { + ASSERT(status == NO_REMOVE); + } + + irp->IoStatus.Status = STATUS_SUCCESS; + irp->IoStatus.Information = 0; + irp->Flags = 0; + irp->UserBuffer = NULL; + + // + // If the irp is sent down when the volume needs to be + // verified, CdRomUpdateGeometryCompletion won't complete + // it since it's not associated with a thread. Marking + // it to override the verify causes it always be sent + // to the port driver + // + + irpStack = IoGetCurrentIrpStackLocation(irp); + irpStack->Flags |= SL_OVERRIDE_VERIFY_VOLUME; + + nextIrpStack = IoGetNextIrpStackLocation(irp); + nextIrpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + nextIrpStack->Parameters.Scsi.Srb = &(Info->MediaChangeSrb); + + // + // Prepare the SRB for execution. + // + + srb = nextIrpStack->Parameters.Scsi.Srb; + buffer = srb->SenseInfoBuffer; + RtlZeroMemory(srb, sizeof(SCSI_REQUEST_BLOCK)); + RtlZeroMemory(buffer, SENSE_BUFFER_SIZE); + + + srb->QueueTag = SP_UNTAGGED; + srb->QueueAction = SRB_SIMPLE_TAG_REQUEST; + srb->Length = sizeof(SCSI_REQUEST_BLOCK); + srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + srb->SenseInfoBuffer = buffer; + srb->SrbStatus = 0; + srb->ScsiStatus = 0; + srb->OriginalRequest = irp; + srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; + + srb->SrbFlags = FdoExtension->SrbFlags; + SET_FLAG(srb->SrbFlags, Info->SrbFlags); + + srb->TimeOutValue = FdoExtension->TimeOutValue * 2; + + if (srb->TimeOutValue == 0) { + + if (FdoExtension->TimeOutValue == 0) { + + KdPrintEx((DPFLTR_CLASSPNP_ID, DPFLTR_ERROR_LEVEL, + "ClassSendTestUnitIrp: FdoExtension->TimeOutValue " + "is set to zero?! -- resetting to 10\n")); + srb->TimeOutValue = 10 * 2; // reasonable default + + } else { + + KdPrintEx((DPFLTR_CLASSPNP_ID, DPFLTR_ERROR_LEVEL, + "ClassSendTestUnitIrp: Someone set " + "srb->TimeOutValue to zero?! -- resetting to %x\n", + FdoExtension->TimeOutValue * 2)); + srb->TimeOutValue = FdoExtension->TimeOutValue * 2; + + } + + } + + if (!UseGesn) { + + srb->CdbLength = 6; + srb->DataTransferLength = 0; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_NO_DATA_TRANSFER); + nextIrpStack->Parameters.DeviceIoControl.IoControlCode = + IOCTL_SCSI_EXECUTE_NONE; + srb->DataBuffer = NULL; + srb->DataTransferLength = 0; + irp->MdlAddress = NULL; + + cdb = (PCDB) &srb->Cdb[0]; + cdb->CDB6GENERIC.OperationCode = SCSIOP_TEST_UNIT_READY; + + } else { + + ASSERT(Info->Gesn.Buffer); + + srb->TimeOutValue = GESN_TIMEOUT_VALUE; // much shorter timeout for GESN + + srb->CdbLength = 10; + SET_FLAG(srb->SrbFlags, SRB_FLAGS_DATA_IN); + nextIrpStack->Parameters.DeviceIoControl.IoControlCode = + IOCTL_SCSI_EXECUTE_IN; + srb->DataBuffer = Info->Gesn.Buffer; + srb->DataTransferLength = Info->Gesn.BufferSize; + irp->MdlAddress = Info->Gesn.Mdl; + + cdb = (PCDB) &srb->Cdb[0]; + cdb->GET_EVENT_STATUS_NOTIFICATION.OperationCode = + SCSIOP_GET_EVENT_STATUS; + cdb->GET_EVENT_STATUS_NOTIFICATION.Immediate = 1; + cdb->GET_EVENT_STATUS_NOTIFICATION.EventListLength[0] = + (UCHAR)((Info->Gesn.BufferSize) >> 8); + cdb->GET_EVENT_STATUS_NOTIFICATION.EventListLength[1] = + (UCHAR)((Info->Gesn.BufferSize) & 0xff); + cdb->GET_EVENT_STATUS_NOTIFICATION.NotificationClassRequest = + Info->Gesn.EventMask; + + } + + IoSetCompletionRoutine(irp, + ClasspMediaChangeDetectionCompletion, + srb, + TRUE, + TRUE, + TRUE); + + return irp; + +} + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspSendMediaStateIrp() - ISSUE-2000/02/20-henrygab - not documented + +Routine Description: + + This routine + +Arguments: + + DeviceObject - + Irp - + +Return Value: + +--*/ +VOID +ClasspSendMediaStateIrp( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PMEDIA_CHANGE_DETECTION_INFO Info, + IN ULONG CountDown + ) +{ + BOOLEAN requestPending = FALSE; + LONG irpInUse; + LARGE_INTEGER zero; + NTSTATUS status; + + DBGTRACE(ClassDebugMCN, ("> ClasspSendMediaStateIrp")); + + if (((FdoExtension->CommonExtension.CurrentState != IRP_MN_START_DEVICE) || + (FdoExtension->DevicePowerState != PowerDeviceD0) + ) && + (!Info->MediaChangeIrpLost)) { + + // + // the device may be stopped, powered down, or otherwise queueing io, + // so should not timeout the autorun irp (yet) -- set to zero ticks. + // scattered code relies upon this to not prematurely "lose" an + // autoplay irp that was queued. + // + + Info->MediaChangeIrpTimeInUse = 0; + } + + // + // if the irp is not in use, mark it as such. + // + + irpInUse = InterlockedCompareExchange(&Info->MediaChangeIrpInUse, 1, 0); + + if (irpInUse) { + + LONG timeInUse; + + timeInUse = InterlockedIncrement(&Info->MediaChangeIrpTimeInUse); + + DebugPrint((ClassDebugMCN, "ClasspSendMediaStateIrp: irp in use for " + "%x seconds when synchronizing for MCD\n", timeInUse)); + + if (Info->MediaChangeIrpLost == FALSE) { + + if (timeInUse > MEDIA_CHANGE_TIMEOUT_TIME) { + + // + // currently set to five minutes. hard to imagine a drive + // taking that long to spin up. + // + + DebugPrint((ClassDebugError, + "CdRom%d: Media Change Notification has lost " + "it's irp and doesn't know where to find it. " + "Leave it alone and it'll come home dragging " + "it's stack behind it.\n", + FdoExtension->DeviceNumber)); + Info->MediaChangeIrpLost = TRUE; + } + } + + DBGTRACE(ClassDebugMCN, ("< ClasspSendMediaStateIrp - irpInUse")); + return; + + } + + TRY { + + if (Info->MediaChangeDetectionDisableCount != 0) { + DebugPrint((ClassDebugTrace, "ClassCheckMediaState: device %p has " + " detection disabled \n", FdoExtension->DeviceObject)); + LEAVE; + } + + if (FdoExtension->DevicePowerState != PowerDeviceD0) { + + if (TEST_FLAG(Info->SrbFlags, SRB_FLAGS_NO_KEEP_AWAKE)) { + DebugPrint((ClassDebugMCN, + "ClassCheckMediaState: device %p is powered " + "down and flags are set to let it sleep\n", + FdoExtension->DeviceObject)); + ClassResetMediaChangeTimer(FdoExtension); + LEAVE; + } + + // + // NOTE: we don't increment the time in use until our power state + // changes above. this way, we won't "lose" the autoplay irp. + // it's up to the lower driver to determine if powering up is a + // good idea. + // + + DebugPrint((ClassDebugMCN, + "ClassCheckMediaState: device %p needs to powerup " + "to handle this io (may take a few extra seconds).\n", + FdoExtension->DeviceObject)); + + } + + Info->MediaChangeIrpTimeInUse = 0; + Info->MediaChangeIrpLost = FALSE; + + if (CountDown == 0) { + + PIRP irp; + + DebugPrint((ClassDebugTrace, + "ClassCheckMediaState: timer expired\n")); + + if (Info->MediaChangeDetectionDisableCount != 0) { + DebugPrint((ClassDebugTrace, + "ClassCheckMediaState: detection disabled\n")); + LEAVE; + } + + // + // Prepare the IRP for the test unit ready + // + + irp = ClasspPrepareMcnIrp(FdoExtension, + Info, + Info->Gesn.Supported); + + // + // Issue the request. + // + + DebugPrint((ClassDebugTrace, + "ClasspSendMediaStateIrp: Device %p getting TUR " + " irp %p\n", FdoExtension->DeviceObject, irp)); + + if (irp == NULL) { + LEAVE; + } + + + // + // note: if we send it to the class dispatch routines, there is + // a timing window here (since they grab the remove lock) + // where we'd be removed. ELIMINATE the window by grabbing + // the lock ourselves above and sending it to the lower + // device object directly or to the device's StartIo + // routine (which doesn't acquire the lock). + // + + requestPending = TRUE; + + DBGTRACE(ClassDebugMCN, (" ClasspSendMediaStateIrp - calling IoCallDriver.")); + IoCallDriver(FdoExtension->CommonExtension.LowerDeviceObject, irp); + } + + } FINALLY { + + if(requestPending == FALSE) { + irpInUse = InterlockedCompareExchange(&Info->MediaChangeIrpInUse, 0, 1); + #if _MSC_FULL_VER != 13009111 // This compiler always takes the wrong path here. + ASSERT(irpInUse); + #endif + } + + } + + DBGTRACE(ClassDebugMCN, ("< ClasspSendMediaStateIrp")); + + return; +} // end ClasspSendMediaStateIrp() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassCheckMediaState() + +Routine Description: + + This routine is called by the class driver to test for a media change + condition and/or poll for disk failure prediction. It should be called + from the class driver's IO timer routine once per second. + +Arguments: + + FdoExtension - the device extension + +Return Value: + + none + +--*/ +VOID +ClassCheckMediaState( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) +{ + PMEDIA_CHANGE_DETECTION_INFO info = FdoExtension->MediaChangeDetectionInfo; + LONG countDown; + + if(info == NULL) { + DebugPrint((ClassDebugTrace, + "ClassCheckMediaState: detection not enabled\n")); + return; + } + + // + // Media change support is active and the IRP is waiting. Decrement the + // timer. There is no MP protection on the timer counter. This code + // is the only code that will manipulate the timer counter and only one + // instance of it should be running at any given time. + // + + countDown = InterlockedDecrement(&(info->MediaChangeCountDown)); + + // + // Try to acquire the media change event. If we can't do it immediately + // then bail out and assume the caller will try again later. + // + ClasspSendMediaStateIrp(FdoExtension, + info, + countDown); + + return; +} // end ClassCheckMediaState() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassResetMediaChangeTimer() + +Routine Description: + + Resets the media change count down timer to the default number of seconds. + +Arguments: + + FdoExtension - the device to reset the timer for + +Return Value: + + None + +--*/ +VOID +ClassResetMediaChangeTimer( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) +{ + PMEDIA_CHANGE_DETECTION_INFO info = FdoExtension->MediaChangeDetectionInfo; + + if(info != NULL) { + InterlockedExchange(&(info->MediaChangeCountDown), + MEDIA_CHANGE_DEFAULT_TIME); + } + return; +} // end ClassResetMediaChangeTimer() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspInitializePolling() - ISSUE-2000/02/20-henrygab - not documented + +Routine Description: + + This routine + +Arguments: + + DeviceObject - + Irp - + +Return Value: + +--*/ +NTSTATUS +ClasspInitializePolling( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN BOOLEAN AllowDriveToSleep + ) +{ + PDEVICE_OBJECT fdo = FdoExtension->DeviceObject; + PCLASS_PRIVATE_FDO_DATA fdoData = FdoExtension->PrivateFdoData; + + ULONG size; + PMEDIA_CHANGE_DETECTION_INFO info; + PIRP irp; + + PAGED_CODE(); + + if (FdoExtension->MediaChangeDetectionInfo != NULL) { + return STATUS_SUCCESS; + } + + info = ExAllocatePoolWithTag(NonPagedPool, + sizeof(MEDIA_CHANGE_DETECTION_INFO), + CLASS_TAG_MEDIA_CHANGE_DETECTION); + + if(info != NULL) { + RtlZeroMemory(info, sizeof(MEDIA_CHANGE_DETECTION_INFO)); + + FdoExtension->KernelModeMcnContext.FileObject = (PVOID)-1; + FdoExtension->KernelModeMcnContext.DeviceObject = (PVOID)-1; + FdoExtension->KernelModeMcnContext.LockCount = 0; + FdoExtension->KernelModeMcnContext.McnDisableCount = 0; + + /* + * Allocate an IRP to carry the Test-Unit-Ready. + * Allocate an extra IRP stack location + * so we can cache our device object in the top location. + */ + irp = IoAllocateIrp((CCHAR)(fdo->StackSize+1), FALSE); + + if (irp != NULL) { + + PVOID buffer; + + buffer = ExAllocatePoolWithTag( + NonPagedPoolCacheAligned, + SENSE_BUFFER_SIZE, + CLASS_TAG_MEDIA_CHANGE_DETECTION); + + if (buffer != NULL) { + PIO_STACK_LOCATION irpStack; + PSCSI_REQUEST_BLOCK srb; + PCDB cdb; + + srb = &(info->MediaChangeSrb); + info->MediaChangeIrp = irp; + info->SenseBuffer = buffer; + + /* + * For the driver that creates an IRP, there is no 'current' stack location. + * Step down one IRP stack location so that the extra top one + * becomes our 'current' one. + */ + IoSetNextIrpStackLocation(irp); + + /* + * Cache our device object in the extra top IRP stack location + * so we have it in our completion routine. + */ + irpStack = IoGetCurrentIrpStackLocation(irp); + irpStack->DeviceObject = fdo; + + /* + * Now start setting up the next IRP stack location for the call like any driver would. + */ + irpStack = IoGetNextIrpStackLocation(irp); + irpStack->Parameters.Scsi.Srb = srb; + info->MediaChangeIrp = irp; + + // + // Initialize the SRB + // + + RtlZeroMemory(srb, sizeof(SCSI_REQUEST_BLOCK)); + + // + // Initialize and set up the sense information buffer + // + + RtlZeroMemory(buffer, SENSE_BUFFER_SIZE); + srb->SenseInfoBuffer = buffer; + srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; + + // + // Set default values for the media change notification + // configuration. + // + + info->MediaChangeCountDown = MEDIA_CHANGE_DEFAULT_TIME; + info->MediaChangeDetectionDisableCount = 0; + + // + // Assume that there is initially no media in the device + // only notify upper layers if there is something there + // + + info->MediaChangeDetectionState = MediaUnknown; + + info->MediaChangeIrpTimeInUse = 0; + info->MediaChangeIrpLost = FALSE; + + // + // setup all extra flags we'll be setting for this irp + // + info->SrbFlags = 0; + if (AllowDriveToSleep) { + SET_FLAG(info->SrbFlags, SRB_FLAGS_NO_KEEP_AWAKE); + } + SET_FLAG(info->SrbFlags, SRB_CLASS_FLAGS_LOW_PRIORITY); + SET_FLAG(info->SrbFlags, SRB_FLAGS_NO_QUEUE_FREEZE); + SET_FLAG(info->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + + KeInitializeMutex(&info->MediaChangeMutex, 0x100); + + // + // It is ok to support media change events on this + // device. + // + + FdoExtension->MediaChangeDetectionInfo = info; + + // + // NOTE: the DeviceType is FILE_DEVICE_CD_ROM even + // when the device supports DVD (no need to + // check for FILE_DEVICE_DVD, as it's not a + // valid check). + // + + if (FdoExtension->DeviceObject->DeviceType == FILE_DEVICE_CD_ROM){ + + NTSTATUS status; + + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "ClasspInitializePolling: Testing for GESN\n")); + status = ClasspInitializeGesn(FdoExtension, info); + if (NT_SUCCESS(status)) { + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "ClasspInitializePolling: GESN available " + "for %p\n", FdoExtension->DeviceObject)); + ASSERT(info->Gesn.Supported ); + ASSERT(info->Gesn.Buffer != NULL); + ASSERT(info->Gesn.BufferSize != 0); + ASSERT(info->Gesn.EventMask != 0); + // must return here, for ASSERTs to be valid. + return STATUS_SUCCESS; + } + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "ClasspInitializePolling: GESN *NOT* available " + "for %p\n", FdoExtension->DeviceObject)); + } + + ASSERT(info->Gesn.Supported == 0); + ASSERT(info->Gesn.Buffer == NULL); + ASSERT(info->Gesn.BufferSize == 0); + ASSERT(info->Gesn.EventMask == 0); + info->Gesn.Supported = 0; // just in case.... + return STATUS_SUCCESS; + } + + IoFreeIrp(irp); + } + + ExFreePool(info); + } + + // + // nothing to free here + // + return STATUS_INSUFFICIENT_RESOURCES; + +} // end ClasspInitializePolling() + +NTSTATUS +ClasspInitializeGesn( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PMEDIA_CHANGE_DETECTION_INFO Info + ) +{ + PNOTIFICATION_EVENT_STATUS_HEADER header; + CLASS_DETECTION_STATE detectionState = ClassDetectionUnknown; + PSTORAGE_ADAPTER_DESCRIPTOR adapterDescriptor; + NTSTATUS status = STATUS_NOT_SUPPORTED; + PIRP irp; + KEVENT event; + BOOLEAN retryImmediately; + ULONG i; + ULONG atapiResets; + + + PAGED_CODE(); + ASSERT(Info == FdoExtension->MediaChangeDetectionInfo); + + // + // read if we already know the abilities of the device + // + + ClassGetDeviceParameter(FdoExtension, + CLASSP_REG_SUBKEY_NAME, + CLASSP_REG_MMC_DETECTION_VALUE_NAME, + (PULONG)&detectionState); + + if (detectionState == ClassDetectionUnsupported) { + goto ExitWithError; + } + + // + // check if the device has a hack flag saying never to try this. + // + + if (TEST_FLAG(FdoExtension->PrivateFdoData->HackFlags, + FDO_HACK_GESN_IS_BAD)) { + + detectionState = ClassDetectionUnsupported; + ClassSetDeviceParameter(FdoExtension, + CLASSP_REG_SUBKEY_NAME, + CLASSP_REG_MMC_DETECTION_VALUE_NAME, + ClassDetectionSupported); + goto ExitWithError; + + } + + + // + // else go through the process since we allocate buffers and + // get all sorts of device settings. + // + + if (Info->Gesn.Buffer == NULL) { + Info->Gesn.Buffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + GESN_BUFFER_SIZE, + '??cS'); + } + if (Info->Gesn.Buffer == NULL) { + status = STATUS_INSUFFICIENT_RESOURCES; + goto ExitWithError; + } + if (Info->Gesn.Mdl != NULL) { + IoFreeMdl(Info->Gesn.Mdl); + } + Info->Gesn.Mdl = IoAllocateMdl(Info->Gesn.Buffer, + GESN_BUFFER_SIZE, + FALSE, FALSE, NULL); + if (Info->Gesn.Mdl == NULL) { + status = STATUS_INSUFFICIENT_RESOURCES; + goto ExitWithError; + } + + MmBuildMdlForNonPagedPool(Info->Gesn.Mdl); + Info->Gesn.BufferSize = GESN_BUFFER_SIZE; + Info->Gesn.EventMask = 0; + + // + // all items are prepared to use GESN (except the event mask, so don't + // optimize this part out!). + // + // now see if it really works. we have to loop through this because + // many SAMSUNG (and one COMPAQ) drives timeout when requesting + // NOT_READY events, even when the IMMEDIATE bit is set. :( + // + // using a drive list is cumbersome, so this might fix the problem. + // + + adapterDescriptor = FdoExtension->AdapterDescriptor; + atapiResets = 0; + retryImmediately = TRUE; + for (i = 0; i < 16 && retryImmediately == TRUE; i++) { + + irp = ClasspPrepareMcnIrp(FdoExtension, Info, TRUE); + if (irp == NULL) { + status = STATUS_INSUFFICIENT_RESOURCES; + goto ExitWithError; + } + + ASSERT(TEST_FLAG(Info->MediaChangeSrb.SrbFlags, SRB_FLAGS_NO_QUEUE_FREEZE)); + + // + // replace the completion routine with a different one this time... + // + + IoSetCompletionRoutine(irp, + ClassSignalCompletion, + &event, + TRUE, TRUE, TRUE); + KeInitializeEvent(&event, SynchronizationEvent, FALSE); + + status = IoCallDriver(FdoExtension->CommonExtension.LowerDeviceObject, irp); + + if (status == STATUS_PENDING) { + status = KeWaitForSingleObject(&event, + Executive, + KernelMode, + FALSE, + NULL); + ASSERT(NT_SUCCESS(status)); + } + ClassReleaseRemoveLock(FdoExtension->DeviceObject, irp); + + if (SRB_STATUS(Info->MediaChangeSrb.SrbStatus) != SRB_STATUS_SUCCESS) { + ClassInterpretSenseInfo(FdoExtension->DeviceObject, + &(Info->MediaChangeSrb), + IRP_MJ_SCSI, + 0, + 0, + &status, + NULL); + } + + if ((adapterDescriptor->BusType == BusTypeAtapi) && + (Info->MediaChangeSrb.SrbStatus == SRB_STATUS_BUS_RESET) + ) { + + // + // ATAPI unfortunately returns SRB_STATUS_BUS_RESET instead + // of SRB_STATUS_TIMEOUT, so we cannot differentiate between + // the two. if we get this status four time consecutively, + // stop trying this command. it is too late to change ATAPI + // at this point, so special-case this here. (07/10/2001) + // NOTE: any value more than 4 may cause the device to be + // marked missing. + // + + atapiResets++; + if (atapiResets >= 4) { + status = STATUS_IO_DEVICE_ERROR; + goto ExitWithError; + } + } + + if (status == STATUS_DATA_OVERRUN) { + status = STATUS_SUCCESS; + } + + if ((status == STATUS_INVALID_DEVICE_REQUEST) || + (status == STATUS_TIMEOUT) || + (status == STATUS_IO_DEVICE_ERROR) || + (status == STATUS_IO_TIMEOUT) + ) { + + // + // with these error codes, we don't ever want to try this command + // again on this device, since it reacts poorly. + // + + ClassSetDeviceParameter(FdoExtension, + CLASSP_REG_SUBKEY_NAME, + CLASSP_REG_MMC_DETECTION_VALUE_NAME, + ClassDetectionUnsupported); + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugWarning, + "Classpnp => GESN test failed %x for fdo %p\n", + status, FdoExtension->DeviceObject)); + goto ExitWithError; + + + } + + if (!NT_SUCCESS(status)) { + + // + // this may be other errors that should not disable GESN + // for all future start_device calls. + // + + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugWarning, + "Classpnp => GESN test failed %x for fdo %p\n", + status, FdoExtension->DeviceObject)); + goto ExitWithError; + } + + if (i == 0) { + + // + // the first time, the request was just retrieving a mask of + // available bits. use this to mask future requests. + // + + header = (PNOTIFICATION_EVENT_STATUS_HEADER)(Info->Gesn.Buffer); + + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "Classpnp => Fdo %p supports event mask %x\n", + FdoExtension->DeviceObject, header->SupportedEventClasses)); + + + if (TEST_FLAG(header->SupportedEventClasses, + NOTIFICATION_MEDIA_STATUS_CLASS_MASK)) { + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "Classpnp => GESN supports MCN\n")); + } + if (TEST_FLAG(header->SupportedEventClasses, + NOTIFICATION_DEVICE_BUSY_CLASS_MASK)) { + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "Classpnp => GESN supports DeviceBusy\n")); + } + Info->Gesn.EventMask = header->SupportedEventClasses; + + // + // realistically, we are only considering the following events: + // EXTERNAL REQUEST - this is being tested for play/stop/etc. + // MEDIA STATUS - autorun and ejection requests. + // DEVICE BUSY - to allow us to predict when media will be ready. + // therefore, we should not bother querying for the other, + // unknown events. clear all but the above flags. + // + + Info->Gesn.EventMask &= + NOTIFICATION_EXTERNAL_REQUEST_CLASS_MASK | + NOTIFICATION_MEDIA_STATUS_CLASS_MASK | + NOTIFICATION_DEVICE_BUSY_CLASS_MASK ; + + + // + // HACKHACK - REF #0001 + // Some devices will *never* report an event if we've also requested + // that it report lower-priority events. this is due to a + // misunderstanding in the specification wherein a "No Change" is + // interpreted to be a real event. what should occur is that the + // device should ignore "No Change" events when multiple event types + // are requested unless there are no other events waiting. this + // greatly reduces the number of requests that the host must send + // to determine if an event has occurred. Since we must work on all + // drives, default to enabling the hack until we find evidence of + // proper firmware. + // + + if (CountOfSetBitsUChar(Info->Gesn.EventMask) == 1) { + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "Classpnp => GESN hack %s for FDO %p\n", + "not required", FdoExtension->DeviceObject)); + } else { + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "Classpnp => GESN hack %s for FDO %p\n", + "enabled", FdoExtension->DeviceObject)); + Info->Gesn.HackEventMask = 1; + } + + } else { + + // + // not the first time looping through, so interpret the results. + // + + ClasspInterpretGesnData(FdoExtension, + (PVOID)Info->Gesn.Buffer, + &retryImmediately); + + } + + } // end loop of GESN requests.... + + // + // we can only use this if it can be relied upon for media changes, + // since we are (by definition) no longer going to be polling via + // a TEST_UNIT_READY irp, and drives will not report UNIT ATTENTION + // for this command (although a filter driver, such as one for burning + // cd's, might still fake those errors). + // + // since we also rely upon NOT_READY events to change the cursor + // into a "wait" cursor, we can't use GESN without NOT_READY support. + // + + if (TEST_FLAG(Info->Gesn.EventMask, + NOTIFICATION_MEDIA_STATUS_CLASS_MASK) && + TEST_FLAG(Info->Gesn.EventMask, + NOTIFICATION_DEVICE_BUSY_CLASS_MASK) + ) { + + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "Classpnp => Enabling GESN support for fdo %p\n", + FdoExtension->DeviceObject)); + Info->Gesn.Supported = TRUE; + + ClassSetDeviceParameter(FdoExtension, + CLASSP_REG_SUBKEY_NAME, + CLASSP_REG_MMC_DETECTION_VALUE_NAME, + ClassDetectionSupported); + + return STATUS_SUCCESS; + + } + + KdPrintEx((DPFLTR_CLASSPNP_ID, ClassDebugMCN, + "Classpnp => GESN available but not enabled for fdo %p\n", + FdoExtension->DeviceObject)); + goto ExitWithError; + + // fall through... + +ExitWithError: + if (Info->Gesn.Mdl) { + IoFreeMdl(Info->Gesn.Mdl); + Info->Gesn.Mdl = NULL; + } + if (Info->Gesn.Buffer) { + ExFreePool(Info->Gesn.Buffer); + Info->Gesn.Buffer = NULL; + } + Info->Gesn.Supported = 0; + Info->Gesn.EventMask = 0; + Info->Gesn.BufferSize = 0; + return STATUS_NOT_SUPPORTED; + +} + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassInitializeTestUnitPolling() + +Routine Description: + + This routine will initialize MCN regardless of the settings stored + in the registry. This should be used with caution, as some devices + react badly to constant io. (i.e. never spin down, continuously cycling + media in changers, ejection of media, etc.) It is highly suggested to + use ClassInitializeMediaChangeDetection() instead. + +Arguments: + + FdoExtension is the device to poll + + AllowDriveToSleep says whether to attempt to allow the drive to sleep + or not. This only affects system-known spin down states, so if a + drive spins itself down, this has no effect until the system spins + it down. + +Return Value: + +--*/ +NTSTATUS +ClassInitializeTestUnitPolling( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN BOOLEAN AllowDriveToSleep + ) +{ + return ClasspInitializePolling(FdoExtension, AllowDriveToSleep); +} // end ClassInitializeTestUnitPolling() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassInitializeMediaChangeDetection() + +Routine Description: + + This routine checks to see if it is safe to initialize MCN (the back end + to autorun) for a given device. It will then check the device-type wide + key "Autorun" in the service key (for legacy reasons), and then look in + the device-specific key to potentially override that setting. + + If MCN is to be enabled, all neccessary structures and memory are + allocated and initialized. + + This routine MUST be called only from the ClassInit() callback. + +Arguments: + + FdoExtension - the device to initialize MCN for, if appropriate + + EventPrefix - unused, legacy argument. Set to zero. + +Return Value: + +--*/ +VOID +ClassInitializeMediaChangeDetection( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PUCHAR EventPrefix + ) +{ + PDEVICE_OBJECT fdo = FdoExtension->DeviceObject; + NTSTATUS status; + + PCLASS_DRIVER_EXTENSION driverExtension = ClassGetDriverExtension( + fdo->DriverObject); + + BOOLEAN disabledForBadHardware; + BOOLEAN disabled; + BOOLEAN instanceOverride; + + PAGED_CODE(); + + // + // NOTE: This assumes that ClassInitializeMediaChangeDetection is always + // called in the context of the ClassInitDevice callback. If called + // after then this check will have already been made and the + // once a second timer will not have been enabled. + // + + disabledForBadHardware = ClasspIsMediaChangeDisabledDueToHardwareLimitation( + FdoExtension, + &(driverExtension->RegistryPath) + ); + + if (disabledForBadHardware) { + DebugPrint((ClassDebugMCN, + "ClassInitializeMCN: Disabled due to hardware" + "limitations for this device")); + return; + } + + // + // autorun should now be enabled by default for all media types. + // + + disabled = ClasspIsMediaChangeDisabledForClass( + FdoExtension, + &(driverExtension->RegistryPath) + ); + + DebugPrint((ClassDebugMCN, + "ClassInitializeMCN: Class MCN is %s\n", + (disabled ? "disabled" : "enabled"))); + + status = ClasspMediaChangeDeviceInstanceOverride( + FdoExtension, + &instanceOverride); // default value + + if (!NT_SUCCESS(status)) { + DebugPrint((ClassDebugMCN, + "ClassInitializeMCN: Instance using default\n")); + } else { + DebugPrint((ClassDebugMCN, + "ClassInitializeMCN: Instance override: %s MCN\n", + (instanceOverride ? "Enabling" : "Disabling"))); + disabled = !instanceOverride; + } + + DebugPrint((ClassDebugMCN, + "ClassInitializeMCN: Instance MCN is %s\n", + (disabled ? "disabled" : "enabled"))); + + if (disabled) { + return; + } + + // + // if the drive is not a CDROM, allow the drive to sleep + // + if (FdoExtension->DeviceObject->DeviceType == FILE_DEVICE_CD_ROM) { + ClasspInitializePolling(FdoExtension, FALSE); + } else { + ClasspInitializePolling(FdoExtension, TRUE); + } + + return; +} // end ClassInitializeMediaChangeDetection() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspMediaChangeDeviceInstanceOverride() + +Routine Description: + + The user can override the global setting to enable or disable Autorun on a + specific cdrom device via the control panel. This routine checks and/or + sets this value. + +Arguments: + + FdoExtension - the device to set/get the value for + Value - the value to use in a set + SetValue - whether to set the value + +Return Value: + + TRUE - Autorun is disabled + FALSE - Autorun is not disabled (Default) + +--*/ +NTSTATUS +ClasspMediaChangeDeviceInstanceOverride( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + OUT PBOOLEAN Enabled + ) +{ + HANDLE deviceParameterHandle; // cdrom instance key + HANDLE driverParameterHandle; // cdrom specific key + RTL_QUERY_REGISTRY_TABLE queryTable[3]; + OBJECT_ATTRIBUTES objectAttributes; + UNICODE_STRING subkeyName; + NTSTATUS status; + ULONG alwaysEnable; + ULONG alwaysDisable; + ULONG i; + + + PAGED_CODE(); + + deviceParameterHandle = NULL; + driverParameterHandle = NULL; + status = STATUS_UNSUCCESSFUL; + alwaysEnable = FALSE; + alwaysDisable = FALSE; + + TRY { + + status = IoOpenDeviceRegistryKey( FdoExtension->LowerPdo, + PLUGPLAY_REGKEY_DEVICE, + KEY_ALL_ACCESS, + &deviceParameterHandle + ); + if (!NT_SUCCESS(status)) { + + // + // this can occur when a new device is added to the system + // this is due to cdrom.sys being an 'essential' driver + // + DebugPrint((ClassDebugMCN, + "ClassMediaChangeDeviceInstanceDisabled: " + "Could not open device registry key [%lx]\n", status)); + LEAVE; + } + + RtlInitUnicodeString(&subkeyName, MCN_REG_SUBKEY_NAME); + InitializeObjectAttributes(&objectAttributes, + &subkeyName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + deviceParameterHandle, + (PSECURITY_DESCRIPTOR) NULL); + + status = ZwCreateKey(&driverParameterHandle, + KEY_READ, + &objectAttributes, + 0, + (PUNICODE_STRING) NULL, + REG_OPTION_NON_VOLATILE, + NULL); + + if (!NT_SUCCESS(status)) { + DebugPrint((ClassDebugMCN, + "ClassMediaChangeDeviceInstanceDisabled: " + "subkey could not be created. %lx\n", status)); + LEAVE; + } + + // + // Default to not changing autorun behavior, based upon setting + // registryValue to zero. + // + + for (i=0;i<2;i++) { + + RtlZeroMemory(&queryTable[0], sizeof(queryTable)); + + queryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; + queryTable[0].DefaultType = REG_DWORD; + queryTable[0].DefaultLength = 0; + + if (i==0) { + queryTable[0].Name = MCN_REG_AUTORUN_DISABLE_INSTANCE_NAME; + queryTable[0].EntryContext = &alwaysDisable; + queryTable[0].DefaultData = &alwaysDisable; + } else { + queryTable[0].Name = MCN_REG_AUTORUN_ENABLE_INSTANCE_NAME; + queryTable[0].EntryContext = &alwaysEnable; + queryTable[0].DefaultData = &alwaysEnable; + } + + // + // don't care if it succeeds, since we set defaults above + // + + RtlQueryRegistryValues(RTL_REGISTRY_HANDLE, + (PWSTR)driverParameterHandle, + queryTable, + NULL, + NULL); + } + + } FINALLY { + + if (driverParameterHandle) ZwClose(driverParameterHandle); + if (deviceParameterHandle) ZwClose(deviceParameterHandle); + + } + + if (alwaysEnable && alwaysDisable) { + + DebugPrint((ClassDebugMCN, + "ClassMediaChangeDeviceInstanceDisabled: %s selected\n", + "Both Enable and Disable set -- DISABLE")); + ASSERT(NT_SUCCESS(status)); + status = STATUS_SUCCESS; + *Enabled = FALSE; + + } else if (alwaysDisable) { + + DebugPrint((ClassDebugMCN, + "ClassMediaChangeDeviceInstanceDisabled: %s selected\n", + "DISABLE")); + ASSERT(NT_SUCCESS(status)); + status = STATUS_SUCCESS; + *Enabled = FALSE; + + } else if (alwaysEnable) { + + DebugPrint((ClassDebugMCN, + "ClassMediaChangeDeviceInstanceDisabled: %s selected\n", + "ENABLE")); + ASSERT(NT_SUCCESS(status)); + status = STATUS_SUCCESS; + *Enabled = TRUE; + + } else { + + DebugPrint((ClassDebugMCN, + "ClassMediaChangeDeviceInstanceDisabled: %s selected\n", + "DEFAULT")); + status = STATUS_UNSUCCESSFUL; + + } + + return status; + +} // end ClasspMediaChangeDeviceInstanceOverride() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspIsMediaChangeDisabledDueToHardwareLimitation() + +Routine Description: + + The key AutoRunAlwaysDisable contains a MULTI_SZ of hardware IDs for + which to never enable MediaChangeNotification. + + The user can override the global setting to enable or disable Autorun on a + specific cdrom device via the control panel. + +Arguments: + + FdoExtension - + RegistryPath - pointer to the unicode string inside + ...\CurrentControlSet\Services\Cdrom + +Return Value: + + TRUE - no autorun. + FALSE - Autorun may be enabled + +--*/ +BOOLEAN +ClasspIsMediaChangeDisabledDueToHardwareLimitation( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PUNICODE_STRING RegistryPath + ) +{ + PSTORAGE_DEVICE_DESCRIPTOR deviceDescriptor = FdoExtension->DeviceDescriptor; + OBJECT_ATTRIBUTES objectAttributes; + HANDLE serviceKey = NULL; + RTL_QUERY_REGISTRY_TABLE parameters[2]; + + UNICODE_STRING deviceUnicodeString; + ANSI_STRING deviceString; + ULONG mediaChangeNotificationDisabled = FALSE; + + NTSTATUS status; + + + PAGED_CODE(); + + // + // open the service key. + // + + InitializeObjectAttributes(&objectAttributes, + RegistryPath, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + status = ZwOpenKey(&serviceKey, + KEY_READ, + &objectAttributes); + + ASSERT(NT_SUCCESS(status)); + + + if(!NT_SUCCESS(status)) { + + // + // always take the safe path. if we can't open the service key, + // disable autorun + // + + return TRUE; + + } + + TRY { + // + // Determine if drive is in a list of those requiring + // autorun to be disabled. this is stored in a REG_MULTI_SZ + // named AutoRunAlwaysDisable. this is required as some autochangers + // must load the disc to reply to ChkVerify request, causing them + // to cycle discs continuously. + // + + PWSTR nullMultiSz; + PUCHAR vendorId; + PUCHAR productId; + PUCHAR revisionId; + ULONG length; + ULONG offset; + + deviceString.Buffer = NULL; + deviceUnicodeString.Buffer = NULL; + + // + // there may be nothing to check against + // + + if ((deviceDescriptor->VendorIdOffset == 0) && + (deviceDescriptor->ProductIdOffset == 0)) { + LEAVE; + } + + length = 0; + + if (deviceDescriptor->VendorIdOffset == 0) { + vendorId = NULL; + } else { + vendorId = (PUCHAR) deviceDescriptor + deviceDescriptor->VendorIdOffset; + length = strlen(vendorId); + } + + if ( deviceDescriptor->ProductIdOffset == 0 ) { + productId = NULL; + } else { + productId = (PUCHAR) deviceDescriptor + deviceDescriptor->ProductIdOffset; + length += strlen(productId); + } + + if ( deviceDescriptor->ProductRevisionOffset == 0 ) { + revisionId = NULL; + } else { + revisionId = (PUCHAR) deviceDescriptor + deviceDescriptor->ProductRevisionOffset; + length += strlen(revisionId); + } + + // + // allocate a buffer for the string + // + + deviceString.Length = (USHORT)( length ); + deviceString.MaximumLength = deviceString.Length + 1; + deviceString.Buffer = (PUCHAR)ExAllocatePoolWithTag( NonPagedPool, + deviceString.MaximumLength, + CLASS_TAG_AUTORUN_DISABLE + ); + if (deviceString.Buffer == NULL) { + DebugPrint((ClassDebugMCN, + "ClassMediaChangeDisabledForHardware: Unable to alloc " + "string buffer\n" )); + LEAVE; + } + + // + // copy strings to the buffer + // + offset = 0; + + if (vendorId != NULL) { + RtlCopyMemory(deviceString.Buffer + offset, + vendorId, + strlen(vendorId)); + offset += strlen(vendorId); + } + + if ( productId != NULL ) { + RtlCopyMemory(deviceString.Buffer + offset, + productId, + strlen(productId)); + offset += strlen(productId); + } + if ( revisionId != NULL ) { + RtlCopyMemory(deviceString.Buffer + offset, + revisionId, + strlen(revisionId)); + offset += strlen(revisionId); + } + + ASSERT(offset == deviceString.Length); + + deviceString.Buffer[deviceString.Length] = '\0'; // Null-terminated + + // + // convert to unicode as registry deals with unicode strings + // + + status = RtlAnsiStringToUnicodeString( &deviceUnicodeString, + &deviceString, + TRUE + ); + if (!NT_SUCCESS(status)) { + DebugPrint((ClassDebugMCN, + "ClassMediaChangeDisabledForHardware: cannot convert " + "to unicode %lx\n", status)); + LEAVE; + } + + // + // query the value, setting valueFound to true if found + // + + RtlZeroMemory(parameters, sizeof(parameters)); + + nullMultiSz = L"\0"; + parameters[0].QueryRoutine = ClasspMediaChangeRegistryCallBack; + parameters[0].Flags = RTL_QUERY_REGISTRY_REQUIRED; + parameters[0].Name = L"AutoRunAlwaysDisable"; + parameters[0].EntryContext = &mediaChangeNotificationDisabled; + parameters[0].DefaultType = REG_MULTI_SZ; + parameters[0].DefaultData = nullMultiSz; + parameters[0].DefaultLength = 0; + + status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE, + serviceKey, + parameters, + &deviceUnicodeString, + NULL); + + if ( !NT_SUCCESS(status) ) { + LEAVE; + } + + } FINALLY { + + if (deviceString.Buffer != NULL) { + ExFreePool( deviceString.Buffer ); + } + if (deviceUnicodeString.Buffer != NULL) { + RtlFreeUnicodeString( &deviceUnicodeString ); + } + + ZwClose(serviceKey); + } + + if (mediaChangeNotificationDisabled) { + DebugPrint((ClassDebugMCN, "ClassMediaChangeDisabledForHardware: " + "Device is on disable list\n")); + return TRUE; + } + return FALSE; + +} // end ClasspIsMediaChangeDisabledDueToHardwareLimitation() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspIsMediaChangeDisabledForClass() + +Routine Description: + + The user must specify that AutoPlay is to run on the platform + by setting the registry value HKEY_LOCAL_MACHINE\System\CurrentControlSet\ + Services\\Autorun:REG_DWORD:1. + + The user can override the global setting to enable or disable Autorun on a + specific cdrom device via the control panel. + +Arguments: + + FdoExtension - + RegistryPath - pointer to the unicode string inside + ...\CurrentControlSet\Services\Cdrom + +Return Value: + + TRUE - Autorun is disabled for this class + FALSE - Autorun is enabled for this class + +--*/ +BOOLEAN +ClasspIsMediaChangeDisabledForClass( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PUNICODE_STRING RegistryPath + ) +{ + PSTORAGE_DEVICE_DESCRIPTOR deviceDescriptor = FdoExtension->DeviceDescriptor; + + OBJECT_ATTRIBUTES objectAttributes; + HANDLE serviceKey = NULL; + HANDLE parametersKey = NULL; + RTL_QUERY_REGISTRY_TABLE parameters[3]; + + UNICODE_STRING paramStr; + UNICODE_STRING deviceUnicodeString; + ANSI_STRING deviceString; + + // + // Default to ENABLING MediaChangeNotification (!) + // + + ULONG mcnRegistryValue = 1; + + NTSTATUS status; + + + PAGED_CODE(); + + // + // open the service key. + // + + InitializeObjectAttributes(&objectAttributes, + RegistryPath, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + status = ZwOpenKey(&serviceKey, + KEY_READ, + &objectAttributes); + + ASSERT(NT_SUCCESS(status)); + + if(!NT_SUCCESS(status)) { + + // + // return the default value, which is the + // inverse of the registry setting default + // since this routine asks if it's disabled + // + + DebugPrint((ClassDebugMCN, "ClassCheckServiceMCN: Defaulting to %s\n", + (mcnRegistryValue ? "Enabled" : "Disabled"))); + return (BOOLEAN)(!mcnRegistryValue); + + } + + RtlZeroMemory(parameters, sizeof(parameters)); + + // + // Open the parameters key (if any) beneath the services key. + // + + RtlInitUnicodeString(¶mStr, L"Parameters"); + + InitializeObjectAttributes(&objectAttributes, + ¶mStr, + OBJ_CASE_INSENSITIVE, + serviceKey, + NULL); + + status = ZwOpenKey(¶metersKey, + KEY_READ, + &objectAttributes); + + if (!NT_SUCCESS(status)) { + parametersKey = NULL; + } + + + + // + // Check for the Autorun value. + // + + parameters[0].Flags = RTL_QUERY_REGISTRY_DIRECT; + parameters[0].Name = L"Autorun"; + parameters[0].EntryContext = &mcnRegistryValue; + parameters[0].DefaultType = REG_DWORD; + parameters[0].DefaultData = &mcnRegistryValue; + parameters[0].DefaultLength = sizeof(ULONG); + + status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE | RTL_REGISTRY_OPTIONAL, + serviceKey, + parameters, + NULL, + NULL); + + DebugPrint((ClassDebugMCN, "ClassCheckServiceMCN: " + "/Autorun flag = %d\n", mcnRegistryValue)); + + if(parametersKey != NULL) { + + status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE | RTL_REGISTRY_OPTIONAL, + parametersKey, + parameters, + NULL, + NULL); + DebugPrint((ClassDebugMCN, "ClassCheckServiceMCN: " + "/Parameters/Autorun flag = %d\n", + mcnRegistryValue)); + ZwClose(parametersKey); + + } + ZwClose(serviceKey); + + DebugPrint((ClassDebugMCN, "ClassCheckServiceMCN: " + "Autoplay for device %p is %s\n", + FdoExtension->DeviceObject, + (mcnRegistryValue ? "on" : "off") + )); + + // + // return if it is _disabled_, which is the + // inverse of the registry setting + // + + return (BOOLEAN)(!mcnRegistryValue); +} // end ClasspIsMediaChangeDisabledForClass() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassEnableMediaChangeDetection() ISSUE-2000/02/20-henrygab - why public? +ClassEnableMediaChangeDetection() ISSUE-2000/02/20-henrygab - not documented + +Routine Description: + + This routine + +Arguments: + + DeviceObject - + Irp - + +Return Value: + +--*/ +VOID +ClassEnableMediaChangeDetection( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) +{ + PMEDIA_CHANGE_DETECTION_INFO info = FdoExtension->MediaChangeDetectionInfo; + LONG oldCount; + + PAGED_CODE(); + + if(info == NULL) { + DebugPrint((ClassDebugMCN, + "ClassEnableMediaChangeDetection: not initialized\n")); + return; + } + + KeWaitForMutexObject(&info->MediaChangeMutex, + UserRequest, + KernelMode, + FALSE, + NULL); + + oldCount = --info->MediaChangeDetectionDisableCount; + + ASSERT(oldCount >= 0); + + DebugPrint((ClassDebugMCN, "ClassEnableMediaChangeDetection: Disable count " + "reduced to %d - ", + info->MediaChangeDetectionDisableCount)); + + if(oldCount == 0) { + + // + // We don't know what state the media is in anymore. + // + + ClasspInternalSetMediaChangeState(FdoExtension, + MediaUnknown, + FALSE + ); + + // + // Reset the MCN timer. + // + + ClassResetMediaChangeTimer(FdoExtension); + + DebugPrint((ClassDebugMCN, "MCD is enabled\n")); + + } else { + + DebugPrint((ClassDebugMCN, "MCD still disabled\n")); + + } + + + // + // Let something else run. + // + + KeReleaseMutex(&info->MediaChangeMutex, FALSE); + + return; +} // end ClassEnableMediaChangeDetection() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassDisableMediaChangeDetection() ISSUE-2000/02/20-henrygab - why public? +ClassDisableMediaChangeDetection() ISSUE-2000/02/20-henrygab - not documented + +Routine Description: + + This routine + +Arguments: + + DeviceObject - + Irp - + +Return Value: + +--*/ +ULONG BreakOnMcnDisable = FALSE; + +VOID +ClassDisableMediaChangeDetection( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) +{ + PMEDIA_CHANGE_DETECTION_INFO info = FdoExtension->MediaChangeDetectionInfo; + + PAGED_CODE(); + + if(info == NULL) { + return; + } + + KeWaitForMutexObject(&info->MediaChangeMutex, + UserRequest, + KernelMode, + FALSE, + NULL); + + info->MediaChangeDetectionDisableCount++; + + DebugPrint((ClassDebugMCN, "ClassDisableMediaChangeDetection: " + "disable count is %d\n", + info->MediaChangeDetectionDisableCount)); + + KeReleaseMutex(&info->MediaChangeMutex, FALSE); + + return; +} // end ClassDisableMediaChangeDetection() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassCleanupMediaChangeDetection() ISSUE-2000/02/20-henrygab - why public?! + +Routine Description: + + This routine will cleanup any resources allocated for MCN. It is called + by classpnp during remove device, and therefore is not typically required + by external drivers. + +Arguments: + +Return Value: + +--*/ +VOID +ClassCleanupMediaChangeDetection( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) +{ + PMEDIA_CHANGE_DETECTION_INFO info = FdoExtension->MediaChangeDetectionInfo; + + PAGED_CODE() + + if(info == NULL) { + return; + } + + FdoExtension->MediaChangeDetectionInfo = NULL; + + if (info->Gesn.Buffer) { + ExFreePool(info->Gesn.Buffer); + } + IoFreeIrp(info->MediaChangeIrp); + ExFreePool(info->SenseBuffer); + ExFreePool(info); + return; +} // end ClassCleanupMediaChangeDetection() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspMcnControl() - ISSUE-2000/02/20-henrygab - not documented + +Routine Description: + + This routine + +Arguments: + + DeviceObject - + Irp - + +Return Value: + +--*/ +NTSTATUS +ClasspMcnControl( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PIRP Irp, + IN PSCSI_REQUEST_BLOCK Srb + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = + (PCOMMON_DEVICE_EXTENSION) FdoExtension; + + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PPREVENT_MEDIA_REMOVAL request = Irp->AssociatedIrp.SystemBuffer; + + PFILE_OBJECT fileObject = irpStack->FileObject; + PFILE_OBJECT_EXTENSION fsContext = NULL; + + NTSTATUS status = STATUS_SUCCESS; + + PAGED_CODE(); + + // + // Check to make sure we have a file object extension to keep track of this + // request. If not we'll fail it before synchronizing. + // + + TRY { + + if(fileObject != NULL) { + fsContext = ClasspGetFsContext(commonExtension, fileObject); + }else if(Irp->RequestorMode == KernelMode) { // && fileObject == NULL + fsContext = &FdoExtension->KernelModeMcnContext; + } + + if (fsContext == NULL) { + + // + // This handle isn't setup correctly. We can't let the + // operation go. + // + + status = STATUS_INVALID_PARAMETER; + LEAVE; + } + + if(request->PreventMediaRemoval) { + + // + // This is a lock command. Reissue the command in case bus or + // device was reset and the lock was cleared. + // + + ClassDisableMediaChangeDetection(FdoExtension); + InterlockedIncrement(&(fsContext->McnDisableCount)); + + } else { + + if(fsContext->McnDisableCount == 0) { + status = STATUS_INVALID_DEVICE_STATE; + LEAVE; + } + + InterlockedDecrement(&(fsContext->McnDisableCount)); + ClassEnableMediaChangeDetection(FdoExtension); + } + + } FINALLY { + + Irp->IoStatus.Status = status; + + if(Srb) { + ExFreePool(Srb); + } + + ClassReleaseRemoveLock(FdoExtension->DeviceObject, Irp); + ClassCompleteRequest(FdoExtension->DeviceObject, + Irp, + IO_NO_INCREMENT); + } + return status; +} // end ClasspMcnControl( + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspMediaChangeRegistryCallBack() + +Routine Description: + + This callback for a registry SZ or MULTI_SZ is called once for each + SZ in the value. It will attempt to match the data with the + UNICODE_STRING passed in as Context, and modify EntryContext if a + match is found. Written for ClasspCheckRegistryForMediaChangeCompletion + +Arguments: + + ValueName - name of the key that was opened + ValueType - type of data stored in the value (REG_SZ for this routine) + ValueData - data in the registry, in this case a wide string + ValueLength - length of the data including the terminating null + Context - unicode string to compare against ValueData + EntryContext - should be initialized to 0, will be set to 1 if match found + +Return Value: + + STATUS_SUCCESS + EntryContext will be 1 if found + +--*/ +NTSTATUS +ClasspMediaChangeRegistryCallBack( + IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext + ) +{ + PULONG valueFound; + PUNICODE_STRING deviceString; + PWSTR keyValue; + + PAGED_CODE(); + UNREFERENCED_PARAMETER(ValueName); + + + // + // if we have already set the value to true, exit + // + + valueFound = EntryContext; + if ((*valueFound) != 0) { + DebugPrint((ClassDebugMCN, "ClasspMcnRegCB: already set to true\n")); + return STATUS_SUCCESS; + } + + if (ValueLength == sizeof(WCHAR)) { + DebugPrint((ClassDebugError, "ClasspMcnRegCB: NULL string should " + "never be passed to registry call-back!\n")); + return STATUS_SUCCESS; + } + + + // + // if the data is not a terminated string, exit + // + + if (ValueType != REG_SZ) { + return STATUS_SUCCESS; + } + + deviceString = Context; + keyValue = ValueData; + ValueLength -= sizeof(WCHAR); // ignore the null character + + // + // do not compare more memory than is in deviceString + // + + if (ValueLength > deviceString->Length) { + ValueLength = deviceString->Length; + } + + // + // if the strings match, disable autorun + // + + if (RtlCompareMemory(deviceString->Buffer, keyValue, ValueLength) == ValueLength) { + DebugPrint((ClassDebugMCN, "ClasspRegMcnCB: Match found\n")); + DebugPrint((ClassDebugMCN, "ClasspRegMcnCB: DeviceString at %p\n", + deviceString->Buffer)); + DebugPrint((ClassDebugMCN, "ClasspRegMcnCB: KeyValue at %p\n", + keyValue)); + (*valueFound) = TRUE; + } + + return STATUS_SUCCESS; +} // end ClasspMediaChangeRegistryCallBack() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspTimerTick() - ISSUE-2000/02/20-henrygab - not documented + +Routine Description: + + This routine + +Arguments: + + DeviceObject - + Irp - + +Return Value: + +--*/ +VOID +ClasspTimerTick( + PDEVICE_OBJECT DeviceObject, + PVOID Context + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + ULONG isRemoved; + + ASSERT(commonExtension->IsFdo); + + // + // Do any media change work + // + isRemoved = ClassAcquireRemoveLock(DeviceObject, (PIRP)ClasspTimerTick); + + // + // We stop the timer before deleting the device. It's safe to keep going + // if the flag value is REMOVE_PENDING because the removal thread will be + // blocked trying to stop the timer. + // + + ASSERT(isRemoved != REMOVE_COMPLETE); + + // + // This routine is reasonably safe even if the device object has a pending + // remove + + if(!isRemoved) { + + PFAILURE_PREDICTION_INFO info = fdoExtension->FailurePredictionInfo; + + // + // Do any media change detection work + // + + if (fdoExtension->MediaChangeDetectionInfo != NULL) { + + ClassCheckMediaState(fdoExtension); + + } + + // + // Do any failure prediction work + // + if ((info != NULL) && (info->Method != FailurePredictionNone)) { + + ULONG countDown; + ULONG active; + + if (ClasspCanSendPollingIrp(fdoExtension)) { + + // + // Synchronization is not required here since the Interlocked + // locked instruction guarantees atomicity. Other code that + // resets CountDown uses InterlockedExchange which is also + // atomic. + // + countDown = InterlockedDecrement(&info->CountDown); + if (countDown == 0) { + + DebugPrint((4, "ClasspTimerTick: Send FP irp for %p\n", + DeviceObject)); + + if(info->WorkQueueItem == NULL) { + + info->WorkQueueItem = + IoAllocateWorkItem(fdoExtension->DeviceObject); + + if(info->WorkQueueItem == NULL) { + + // + // Set the countdown to one minute in the future. + // we'll try again then in the hopes there's more + // free memory. + // + + DebugPrint((1, "ClassTimerTick: Couldn't allocate " + "item - try again in one minute\n")); + InterlockedExchange(&info->CountDown, 60); + + } else { + + // + // Grab the remove lock so that removal will block + // until the work item is done. + // + + ClassAcquireRemoveLock(fdoExtension->DeviceObject, + info->WorkQueueItem); + + IoQueueWorkItem(info->WorkQueueItem, + ClasspFailurePredict, + DelayedWorkQueue, + info); + } + + } else { + + DebugPrint((3, "ClasspTimerTick: Failure " + "Prediction work item is " + "already active for device %p\n", + DeviceObject)); + + } + } // end (countdown == 0) + + } else { + // + // If device is sleeping then just rearm polling timer + DebugPrint((4, "ClassTimerTick, SHHHH!!! device is %p is sleeping\n", + DeviceObject)); + } + + } // end failure prediction polling + + // + // Give driver a chance to do its own specific work + // + + if (commonExtension->DriverExtension->InitData.ClassTick != NULL) { + + commonExtension->DriverExtension->InitData.ClassTick(DeviceObject); + + } // end device specific tick handler + } // end check for removed + + ClassReleaseRemoveLock(DeviceObject, (PIRP)ClasspTimerTick); +} // end ClasspTimerTick() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspEnableTimer() - ISSUE-2000/02/20-henrygab - not documented + +Routine Description: + + This routine + +Arguments: + + DeviceObject - + Irp - + +Return Value: + +--*/ +NTSTATUS +ClasspEnableTimer( + PDEVICE_OBJECT DeviceObject + ) +{ + NTSTATUS status; + + PAGED_CODE(); + + if (DeviceObject->Timer == NULL) { + + status = IoInitializeTimer(DeviceObject, ClasspTimerTick, NULL); + + } else { + + status = STATUS_SUCCESS; + + } + + if (NT_SUCCESS(status)) { + + IoStartTimer(DeviceObject); + DebugPrint((1, "ClasspEnableTimer: Once a second timer enabled " + "for device %p\n", DeviceObject)); + + } + + DebugPrint((1, "ClasspEnableTimer: Device %p, Status %lx " + "initializing timer\n", DeviceObject, status)); + + return status; + +} // end ClasspEnableTimer() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspDisableTimer() - ISSUE-2000/02/20-henrygab - not documented + +Routine Description: + + This routine + +Arguments: + + DeviceObject - + Irp - + +Return Value: + +--*/ +NTSTATUS +ClasspDisableTimer( + PDEVICE_OBJECT DeviceObject + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PMEDIA_CHANGE_DETECTION_INFO mCDInfo = fdoExtension->MediaChangeDetectionInfo; + PFAILURE_PREDICTION_INFO fPInfo = fdoExtension->FailurePredictionInfo; + NTSTATUS status; + + PAGED_CODE(); + + if (DeviceObject->Timer != NULL) { + + // + // we are only going to stop the actual timer in remove device routine. + // it is the responsibility of the code within the timer routine to + // check if the device is removed and not processing io for the final + // call. + // this keeps the code clean and prevents lots of bugs. + // + + + IoStopTimer(DeviceObject); + DebugPrint((3, "ClasspDisableTimer: Once a second timer disabled " + "for device %p\n", DeviceObject)); + + } else { + + DebugPrint((1, "ClasspDisableTimer: Timer never enabled\n")); + + } + + return STATUS_SUCCESS; +} // end ClasspDisableTimer() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspFailurePredict() - ISSUE-2000/02/20-henrygab - not documented + +Routine Description: + + This routine + +Arguments: + + DeviceObject - + Irp - + +Return Value: + +Note: this function can be called (via the workitem callback) after the paging device is shut down, + so it must be PAGE LOCKED. +--*/ +VOID +ClasspFailurePredict( + IN PDEVICE_OBJECT DeviceObject, + IN PFAILURE_PREDICTION_INFO Info + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PIO_WORKITEM workItem; + STORAGE_PREDICT_FAILURE checkFailure; + SCSI_ADDRESS scsiAddress; + + NTSTATUS status; + + ASSERT(Info != NULL); + + DebugPrint((1, "ClasspFailurePredict: Polling for failure\n")); + + // + // Mark the work item as inactive and reset the countdown timer. we + // can't risk freeing the work item until we've released the remove-lock + // though - if we do it might get resused as a tag before we can release + // the lock. + // + + InterlockedExchange(&Info->CountDown, Info->Period); + workItem = InterlockedExchangePointer(&(Info->WorkQueueItem), NULL); + + if (ClasspCanSendPollingIrp(fdoExtension)) { + + KEVENT event; + PDEVICE_OBJECT topOfStack; + PIRP irp = NULL; + IO_STATUS_BLOCK ioStatus; + + KeInitializeEvent(&event, SynchronizationEvent, FALSE); + + topOfStack = IoGetAttachedDeviceReference(DeviceObject); + + // + // Send down irp to see if drive is predicting failure + // + + irp = IoBuildDeviceIoControlRequest( + IOCTL_STORAGE_PREDICT_FAILURE, + topOfStack, + NULL, + 0, + &checkFailure, + sizeof(STORAGE_PREDICT_FAILURE), + FALSE, + &event, + &ioStatus); + + + if (irp != NULL) { + status = IoCallDriver(topOfStack, irp); + if (status == STATUS_PENDING) { + KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); + status = ioStatus.Status; + } + } else { + status = STATUS_INSUFFICIENT_RESOURCES; + } + + if (NT_SUCCESS(status) && (checkFailure.PredictFailure)) { + + checkFailure.PredictFailure = 512; + + // + // Send down irp to get scsi address + // + KeInitializeEvent(&event, SynchronizationEvent, FALSE); + + RtlZeroMemory(&scsiAddress, sizeof(SCSI_ADDRESS)); + irp = IoBuildDeviceIoControlRequest( + IOCTL_SCSI_GET_ADDRESS, + topOfStack, + NULL, + 0, + &scsiAddress, + sizeof(SCSI_ADDRESS), + FALSE, + &event, + &ioStatus); + + if (irp != NULL) { + status = IoCallDriver(topOfStack, irp); + if (status == STATUS_PENDING) { + KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); + status = ioStatus.Status; + } + } + + ClassNotifyFailurePredicted(fdoExtension, + (PUCHAR)&checkFailure, + sizeof(checkFailure), + (BOOLEAN)(fdoExtension->FailurePredicted == FALSE), + 2, + scsiAddress.PathId, + scsiAddress.TargetId, + scsiAddress.Lun); + + fdoExtension->FailurePredicted = TRUE; + + } + + ObDereferenceObject(topOfStack); + } + + ClassReleaseRemoveLock(DeviceObject, (PIRP) workItem); + IoFreeWorkItem(workItem); + return; +} // end ClasspFailurePredict() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassNotifyFailurePredicted() ISSUE-alanwar-2000/02/20 - not documented + +Routine Description: + +Arguments: + +Return Value: + +--*/ +VOID +ClassNotifyFailurePredicted( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + PUCHAR Buffer, + ULONG BufferSize, + BOOLEAN LogError, + ULONG UniqueErrorValue, + UCHAR PathId, + UCHAR TargetId, + UCHAR Lun + ) +{ + PIO_ERROR_LOG_PACKET logEntry; + + DebugPrint((1, "ClasspFailurePredictPollCompletion: Failure predicted for device %p\n", FdoExtension->DeviceObject)); + + // + // Fire off a WMI event + // + ClassWmiFireEvent(FdoExtension->DeviceObject, + &StoragePredictFailureEventGuid, + 0, + BufferSize, + Buffer); + + // + // Log an error into the eventlog + // + + if (LogError) + { + logEntry = IoAllocateErrorLogEntry( + FdoExtension->DeviceObject, + sizeof(IO_ERROR_LOG_PACKET) + (3 * sizeof(ULONG))); + + if (logEntry != NULL) + { + + logEntry->FinalStatus = STATUS_SUCCESS; + logEntry->ErrorCode = IO_WRN_FAILURE_PREDICTED; + logEntry->SequenceNumber = 0; + logEntry->MajorFunctionCode = IRP_MJ_DEVICE_CONTROL; + logEntry->IoControlCode = IOCTL_STORAGE_PREDICT_FAILURE; + logEntry->RetryCount = 0; + logEntry->UniqueErrorValue = UniqueErrorValue; + logEntry->DumpDataSize = 3; + + logEntry->DumpData[0] = PathId; + logEntry->DumpData[1] = TargetId; + logEntry->DumpData[2] = Lun; + + // + // Write the error log packet. + // + + IoWriteErrorLogEntry(logEntry); + } + } +} // end ClassNotifyFailurePredicted() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassSetFailurePredictionPoll() + +Routine Description: + + This routine enables polling for failure prediction, setting the timer + to fire every N seconds as specified by the PollingPeriod. + +Arguments: + + FdoExtension - the device to setup failure prediction for. + + FailurePredictionMethod - specific failure prediction method to use + if set to FailurePredictionNone, will disable failure detection + + PollingPeriod - if 0 then no change to current polling timer + +Return Value: + + NT Status + +--*/ +NTSTATUS +ClassSetFailurePredictionPoll( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + FAILURE_PREDICTION_METHOD FailurePredictionMethod, + ULONG PollingPeriod + ) +{ + PFAILURE_PREDICTION_INFO info; + NTSTATUS status; + DEVICE_POWER_STATE powerState; + + PAGED_CODE(); + + if (FdoExtension->FailurePredictionInfo == NULL) { + + if (FailurePredictionMethod != FailurePredictionNone) { + + info = ExAllocatePoolWithTag(NonPagedPool, + sizeof(FAILURE_PREDICTION_INFO), + CLASS_TAG_FAILURE_PREDICT); + + if (info == NULL) { + + return STATUS_INSUFFICIENT_RESOURCES; + + } + + KeInitializeEvent(&info->Event, SynchronizationEvent, TRUE); + + info->WorkQueueItem = NULL; + info->Period = DEFAULT_FAILURE_PREDICTION_PERIOD; + + } else { + + // + // FaultPrediction has not been previously initialized, nor + // is it being initialized now. No need to do anything. + // + return STATUS_SUCCESS; + + } + + FdoExtension->FailurePredictionInfo = info; + + } else { + + info = FdoExtension->FailurePredictionInfo; + + } + + KeWaitForSingleObject(&info->Event, + UserRequest, + UserMode, + FALSE, + NULL); + + + // + // Reset polling period and counter. Setup failure detection type + // + + if (PollingPeriod != 0) { + + InterlockedExchange(&info->Period, PollingPeriod); + + } + + InterlockedExchange(&info->CountDown, info->Period); + + info->Method = FailurePredictionMethod; + if (FailurePredictionMethod != FailurePredictionNone) { + + status = ClasspEnableTimer(FdoExtension->DeviceObject); + + if (NT_SUCCESS(status)) { + DebugPrint((3, "ClassEnableFailurePredictPoll: Enabled for " + "device %p\n", FdoExtension->DeviceObject)); + } + + } else { + + status = ClasspDisableTimer(FdoExtension->DeviceObject); + DebugPrint((3, "ClassEnableFailurePredictPoll: Disabled for " + "device %p\n", FdoExtension->DeviceObject)); + status = STATUS_SUCCESS; + + } + + KeSetEvent(&info->Event, IO_NO_INCREMENT, FALSE); + + return status; +} // end ClassSetFailurePredictionPoll() + diff --git a/drivers/storage/classpnp/class.c b/drivers/storage/classpnp/class.c new file mode 100644 index 00000000000..0a1c28ea9c5 --- /dev/null +++ b/drivers/storage/classpnp/class.c @@ -0,0 +1,9182 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + class.c + +Abstract: + + SCSI class driver routines + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + +#define CLASS_INIT_GUID 1 +#include "classp.h" +#include "debug.h" + +#ifdef ALLOC_PRAGMA + #pragma alloc_text(INIT, DriverEntry) + #pragma alloc_text(PAGE, ClassAddDevice) + #pragma alloc_text(PAGE, ClassClaimDevice) + #pragma alloc_text(PAGE, ClassCreateDeviceObject) + #pragma alloc_text(PAGE, ClassDispatchPnp) + #pragma alloc_text(PAGE, ClassGetDescriptor) + #pragma alloc_text(PAGE, ClassGetPdoId) + #pragma alloc_text(PAGE, ClassInitialize) + #pragma alloc_text(PAGE, ClassInitializeEx) + #pragma alloc_text(PAGE, ClassInvalidateBusRelations) + #pragma alloc_text(PAGE, ClassMarkChildMissing) + #pragma alloc_text(PAGE, ClassMarkChildrenMissing) + #pragma alloc_text(PAGE, ClassModeSense) + #pragma alloc_text(PAGE, ClassPnpQueryFdoRelations) + #pragma alloc_text(PAGE, ClassPnpStartDevice) + #pragma alloc_text(PAGE, ClassQueryPnpCapabilities) + #pragma alloc_text(PAGE, ClassQueryTimeOutRegistryValue) + #pragma alloc_text(PAGE, ClassRemoveDevice) + #pragma alloc_text(PAGE, ClassRetrieveDeviceRelations) + #pragma alloc_text(PAGE, ClassUpdateInformationInRegistry) + #pragma alloc_text(PAGE, ClassSendDeviceIoControlSynchronous) + #pragma alloc_text(PAGE, ClassUnload) + #pragma alloc_text(PAGE, ClasspAllocateReleaseRequest) + #pragma alloc_text(PAGE, ClasspFreeReleaseRequest) + #pragma alloc_text(PAGE, ClasspInitializeHotplugInfo) + #pragma alloc_text(PAGE, ClasspRegisterMountedDeviceInterface) + #pragma alloc_text(PAGE, ClasspScanForClassHacks) + #pragma alloc_text(PAGE, ClasspScanForSpecialInRegistry) +#endif + +ULONG ClassPnpAllowUnload = TRUE; + + +#define FirstDriveLetter 'C' +#define LastDriveLetter 'Z' + + + +/*++//////////////////////////////////////////////////////////////////////////// + +DriverEntry() + +Routine Description: + + Temporary entry point needed to initialize the class system dll. + It doesn't do anything. + +Arguments: + + DriverObject - Pointer to the driver object created by the system. + +Return Value: + + STATUS_SUCCESS + +--*/ +NTSTATUS +NTAPI +DriverEntry( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath + ) +{ + return STATUS_SUCCESS; +} + + + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassInitialize() + +Routine Description: + + This routine is called by a class driver during its + DriverEntry routine to initialize the driver. + +Arguments: + + Argument1 - Driver Object. + Argument2 - Registry Path. + InitializationData - Device-specific driver's initialization data. + +Return Value: + + A valid return code for a DriverEntry routine. + +--*/ +ULONG +ClassInitialize( + IN PVOID Argument1, + IN PVOID Argument2, + IN PCLASS_INIT_DATA InitializationData + ) +{ + PDRIVER_OBJECT DriverObject = Argument1; + PUNICODE_STRING RegistryPath = Argument2; + + PCLASS_DRIVER_EXTENSION driverExtension; + + NTSTATUS status; + + PAGED_CODE(); + + DebugPrint((3,"\n\nSCSI Class Driver\n")); + + ClasspInitializeDebugGlobals(); + + // + // Validate the length of this structure. This is effectively a + // version check. + // + + if (InitializationData->InitializationDataSize != sizeof(CLASS_INIT_DATA)) { + + // + // This DebugPrint is to help third-party driver writers + // + + DebugPrint((0,"ClassInitialize: Class driver wrong version\n")); + return (ULONG) STATUS_REVISION_MISMATCH; + } + + // + // Check that each required entry is not NULL. Note that Shutdown, Flush and Error + // are not required entry points. + // + + if ((!InitializationData->FdoData.ClassDeviceControl) || + (!((InitializationData->FdoData.ClassReadWriteVerification) || + (InitializationData->ClassStartIo))) || + (!InitializationData->ClassAddDevice) || + (!InitializationData->FdoData.ClassStartDevice)) { + + // + // This DebugPrint is to help third-party driver writers + // + + DebugPrint((0, + "ClassInitialize: Class device-specific driver missing required " + "FDO entry\n")); + + return (ULONG) STATUS_REVISION_MISMATCH; + } + + if ((InitializationData->ClassEnumerateDevice) && + ((!InitializationData->PdoData.ClassDeviceControl) || + (!InitializationData->PdoData.ClassStartDevice) || + (!((InitializationData->PdoData.ClassReadWriteVerification) || + (InitializationData->ClassStartIo))))) { + + // + // This DebugPrint is to help third-party driver writers + // + + DebugPrint((0, "ClassInitialize: Class device-specific missing " + "required PDO entry\n")); + + return (ULONG) STATUS_REVISION_MISMATCH; + } + + if((InitializationData->FdoData.ClassStopDevice == NULL) || + ((InitializationData->ClassEnumerateDevice != NULL) && + (InitializationData->PdoData.ClassStopDevice == NULL))) { + + // + // This DebugPrint is to help third-party driver writers + // + + DebugPrint((0, "ClassInitialize: Class device-specific missing " + "required PDO entry\n")); + ASSERT(FALSE); + return (ULONG) STATUS_REVISION_MISMATCH; + } + + // + // Setup the default power handlers if the class driver didn't provide + // any. + // + + if(InitializationData->FdoData.ClassPowerDevice == NULL) { + InitializationData->FdoData.ClassPowerDevice = ClassMinimalPowerHandler; + } + + if((InitializationData->ClassEnumerateDevice != NULL) && + (InitializationData->PdoData.ClassPowerDevice == NULL)) { + InitializationData->PdoData.ClassPowerDevice = ClassMinimalPowerHandler; + } + + // + // warn that unload is not supported + // + // ISSUE-2000/02/03-peterwie + // We should think about making this a fatal error. + // + + if(InitializationData->ClassUnload == NULL) { + + // + // This DebugPrint is to help third-party driver writers + // + + DebugPrint((0, "ClassInitialize: driver does not support unload %wZ\n", + RegistryPath)); + } + + // + // Create an extension for the driver object + // + + status = IoAllocateDriverObjectExtension(DriverObject, + CLASS_DRIVER_EXTENSION_KEY, + sizeof(CLASS_DRIVER_EXTENSION), + &driverExtension); + + if(NT_SUCCESS(status)) { + + // + // Copy the registry path into the driver extension so we can use it later + // + + driverExtension->RegistryPath.Length = RegistryPath->Length; + driverExtension->RegistryPath.MaximumLength = RegistryPath->MaximumLength; + + driverExtension->RegistryPath.Buffer = + ExAllocatePoolWithTag(PagedPool, + RegistryPath->MaximumLength, + '1CcS'); + + if(driverExtension->RegistryPath.Buffer == NULL) { + + status = STATUS_INSUFFICIENT_RESOURCES; + return status; + } + + RtlCopyUnicodeString( + &(driverExtension->RegistryPath), + RegistryPath); + + // + // Copy the initialization data into the driver extension so we can reuse + // it during our add device routine + // + + RtlCopyMemory( + &(driverExtension->InitData), + InitializationData, + sizeof(CLASS_INIT_DATA)); + + driverExtension->DeviceCount = 0; + + } else if (status == STATUS_OBJECT_NAME_COLLISION) { + + // + // The extension already exists - get a pointer to it + // + + driverExtension = IoGetDriverObjectExtension(DriverObject, + CLASS_DRIVER_EXTENSION_KEY); + + ASSERT(driverExtension != NULL); + + } else { + + DebugPrint((1, "ClassInitialize: Class driver extension could not be " + "allocated %lx\n", status)); + return status; + } + + // + // Update driver object with entry points. + // + + DriverObject->MajorFunction[IRP_MJ_CREATE] = ClassCreateClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = ClassCreateClose; + DriverObject->MajorFunction[IRP_MJ_READ] = ClassReadWrite; + DriverObject->MajorFunction[IRP_MJ_WRITE] = ClassReadWrite; + DriverObject->MajorFunction[IRP_MJ_SCSI] = ClassInternalIoControl; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ClassDeviceControlDispatch; + DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = ClassShutdownFlush; + DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = ClassShutdownFlush; + DriverObject->MajorFunction[IRP_MJ_PNP] = ClassDispatchPnp; + DriverObject->MajorFunction[IRP_MJ_POWER] = ClassDispatchPower; + DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = ClassSystemControl; + + if (InitializationData->ClassStartIo) { + DriverObject->DriverStartIo = ClasspStartIo; + } + + if ((InitializationData->ClassUnload) && (ClassPnpAllowUnload == TRUE)) { + DriverObject->DriverUnload = ClassUnload; + } else { + DriverObject->DriverUnload = NULL; + } + + DriverObject->DriverExtension->AddDevice = ClassAddDevice; + + DbgPrint("Driver is ready to go\n"); + status = STATUS_SUCCESS; + return status; +} // end ClassInitialize() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassInitializeEx() + +Routine Description: + + This routine is allows the caller to do any extra initialization or + setup that is not done in ClassInitialize. The operation is + controlled by the GUID that is passed and the contents of the Data + parameter is dependent upon the GUID. + + This is the list of supported operations: + + Guid - GUID_CLASSPNP_QUERY_REGINFOEX + Data - A PCLASS_QUERY_WMI_REGINFO_EX callback function pointer + + Initialized classpnp to callback a PCLASS_QUERY_WMI_REGINFO_EX + callback instead of a PCLASS_QUERY_WMI_REGINFO callback. The + former callback allows the driver to specify the name of the + mof resource. + +Arguments: + + DriverObject + Guid + Data + +Return Value: + + Status Code + +--*/ +ULONG +ClassInitializeEx( + IN PDRIVER_OBJECT DriverObject, + IN LPGUID Guid, + IN PVOID Data + ) +{ + PCLASS_DRIVER_EXTENSION driverExtension; + + NTSTATUS status; + + PAGED_CODE(); + + driverExtension = IoGetDriverObjectExtension( DriverObject, + CLASS_DRIVER_EXTENSION_KEY + ); + if (IsEqualGUID(Guid, &ClassGuidQueryRegInfoEx)) + { + PCLASS_QUERY_WMI_REGINFO_EX_LIST List; + + // + // Indicate the device supports PCLASS_QUERY_REGINFO_EX + // callback instead of PCLASS_QUERY_REGINFO callback. + // + List = (PCLASS_QUERY_WMI_REGINFO_EX_LIST)Data; + + if (List->Size == sizeof(CLASS_QUERY_WMI_REGINFO_EX_LIST)) + { + driverExtension->ClassFdoQueryWmiRegInfoEx = List->ClassFdoQueryWmiRegInfoEx; + driverExtension->ClassPdoQueryWmiRegInfoEx = List->ClassPdoQueryWmiRegInfoEx; + status = STATUS_SUCCESS; + } else { + status = STATUS_INVALID_PARAMETER; + } + } else { + status = STATUS_NOT_SUPPORTED; + } + + return(status); + +} // end ClassInitializeEx() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassUnload() + +Routine Description: + + called when there are no more references to the driver. this allows + drivers to be updated without rebooting. + +Arguments: + + DriverObject - a pointer to the driver object that is being unloaded + +Status: + +--*/ +VOID +ClassUnload( + IN PDRIVER_OBJECT DriverObject + ) +{ + PCLASS_DRIVER_EXTENSION driverExtension; + NTSTATUS status; + + PAGED_CODE(); + + ASSERT( DriverObject->DeviceObject == NULL ); + + driverExtension = IoGetDriverObjectExtension( DriverObject, + CLASS_DRIVER_EXTENSION_KEY + ); + + ASSERT(driverExtension != NULL); + ASSERT(driverExtension->RegistryPath.Buffer != NULL); + ASSERT(driverExtension->InitData.ClassUnload != NULL); + + DebugPrint((1, "ClassUnload: driver unloading %wZ\n", + &driverExtension->RegistryPath)); + + // + // attempt to process the driver's unload routine first. + // + + driverExtension->InitData.ClassUnload(DriverObject); + + // + // free own allocated resources and return + // + + ExFreePool( driverExtension->RegistryPath.Buffer ); + driverExtension->RegistryPath.Buffer = NULL; + driverExtension->RegistryPath.Length = 0; + driverExtension->RegistryPath.MaximumLength = 0; + + return; +} // end ClassUnload() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassAddDevice() + +Routine Description: + + SCSI class driver add device routine. This is called by pnp when a new + physical device come into being. + + This routine will call out to the class driver to verify that it should + own this device then will create and attach a device object and then hand + it to the driver to initialize and create symbolic links + +Arguments: + + DriverObject - a pointer to the driver object that this is being created for + PhysicalDeviceObject - a pointer to the physical device object + +Status: STATUS_NO_SUCH_DEVICE if the class driver did not want this device + STATUS_SUCCESS if the creation and attachment was successful + status of device creation and initialization + +--*/ +NTSTATUS +ClassAddDevice( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PhysicalDeviceObject + ) +{ + PCLASS_DRIVER_EXTENSION driverExtension = + IoGetDriverObjectExtension(DriverObject, + CLASS_DRIVER_EXTENSION_KEY); + + NTSTATUS status; + + PAGED_CODE(); + + DbgPrint("got a device\n"); + status = driverExtension->InitData.ClassAddDevice(DriverObject, + PhysicalDeviceObject); + return status; +} // end ClassAddDevice() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassDispatchPnp() + +Routine Description: + + Storage class driver pnp routine. This is called by the io system when + a PNP request is sent to the device. + +Arguments: + + DeviceObject - pointer to the device object + + Irp - pointer to the io request packet + +Return Value: + + status + +--*/ +NTSTATUS +ClassDispatchPnp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + BOOLEAN isFdo = commonExtension->IsFdo; + + PCLASS_DRIVER_EXTENSION driverExtension; + PCLASS_INIT_DATA initData; + PCLASS_DEV_INFO devInfo; + + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PIO_STACK_LOCATION nextIrpStack = IoGetNextIrpStackLocation(Irp); + + NTSTATUS status = Irp->IoStatus.Status; + BOOLEAN completeRequest = TRUE; + BOOLEAN lockReleased = FALSE; + + ULONG isRemoved; + + PAGED_CODE(); + + // + // Extract all the useful information out of the driver object + // extension + // + + driverExtension = IoGetDriverObjectExtension(DeviceObject->DriverObject, + CLASS_DRIVER_EXTENSION_KEY); + if (driverExtension){ + + initData = &(driverExtension->InitData); + + if(isFdo) { + devInfo = &(initData->FdoData); + } else { + devInfo = &(initData->PdoData); + } + + isRemoved = ClassAcquireRemoveLock(DeviceObject, Irp); + + DebugPrint((2, "ClassDispatchPnp (%p,%p): minor code %#x for %s %p\n", + DeviceObject, Irp, + irpStack->MinorFunction, + isFdo ? "fdo" : "pdo", + DeviceObject)); + DebugPrint((2, "ClassDispatchPnp (%p,%p): previous %#x, current %#x\n", + DeviceObject, Irp, + commonExtension->PreviousState, + commonExtension->CurrentState)); + + switch(irpStack->MinorFunction) { + + case IRP_MN_START_DEVICE: { + + // + // if this is sent to the FDO we should forward it down the + // attachment chain before we start the FDO. + // + + if (isFdo) { + status = ClassForwardIrpSynchronous(commonExtension, Irp); + } + else { + status = STATUS_SUCCESS; + } + + if (NT_SUCCESS(status)){ + status = Irp->IoStatus.Status = ClassPnpStartDevice(DeviceObject); + } + + break; + } + + + case IRP_MN_QUERY_DEVICE_RELATIONS: { + + DEVICE_RELATION_TYPE type = + irpStack->Parameters.QueryDeviceRelations.Type; + + PDEVICE_RELATIONS deviceRelations = NULL; + + if(!isFdo) { + + if(type == TargetDeviceRelation) { + + // + // Device relations has one entry built in to it's size. + // + + status = STATUS_INSUFFICIENT_RESOURCES; + + deviceRelations = ExAllocatePoolWithTag(PagedPool, + sizeof(DEVICE_RELATIONS), + '2CcS'); + + if(deviceRelations != NULL) { + + RtlZeroMemory(deviceRelations, + sizeof(DEVICE_RELATIONS)); + + Irp->IoStatus.Information = (ULONG_PTR) deviceRelations; + + deviceRelations->Count = 1; + deviceRelations->Objects[0] = DeviceObject; + ObReferenceObject(deviceRelations->Objects[0]); + + status = STATUS_SUCCESS; + } + + } else { + // + // PDO's just complete enumeration requests without altering + // the status. + // + + status = Irp->IoStatus.Status; + } + + break; + + } else if (type == BusRelations) { + + ASSERT(commonExtension->IsInitialized); + + // + // Make sure we support enumeration + // + + if(initData->ClassEnumerateDevice == NULL) { + + // + // Just send the request down to the lower driver. Perhaps + // It can enumerate children. + // + + } else { + + // + // Re-enumerate the device + // + + status = ClassPnpQueryFdoRelations(DeviceObject, Irp); + + if(!NT_SUCCESS(status)) { + completeRequest = TRUE; + break; + } + } + } + + IoCopyCurrentIrpStackLocationToNext(Irp); + ClassReleaseRemoveLock(DeviceObject, Irp); + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + completeRequest = FALSE; + + break; + } + + case IRP_MN_QUERY_ID: { + + BUS_QUERY_ID_TYPE idType = irpStack->Parameters.QueryId.IdType; + UNICODE_STRING unicodeString; + + if(isFdo) { + + // + // FDO's should just forward the query down to the lower + // device objects + // + + IoCopyCurrentIrpStackLocationToNext(Irp); + ClassReleaseRemoveLock(DeviceObject, Irp); + + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + completeRequest = FALSE; + break; + } + + // + // PDO's need to give an answer - this is easy for now + // + + RtlInitUnicodeString(&unicodeString, NULL); + + status = ClassGetPdoId(DeviceObject, + idType, + &unicodeString); + + if(status == STATUS_NOT_IMPLEMENTED) { + // + // The driver doesn't implement this ID (whatever it is). + // Use the status out of the IRP so that we don't mangle a + // response from someone else. + // + + status = Irp->IoStatus.Status; + } else if(NT_SUCCESS(status)) { + Irp->IoStatus.Information = (ULONG_PTR) unicodeString.Buffer; + } else { + Irp->IoStatus.Information = (ULONG_PTR) NULL; + } + + break; + } + + case IRP_MN_QUERY_STOP_DEVICE: + case IRP_MN_QUERY_REMOVE_DEVICE: { + + DebugPrint((2, "ClassDispatchPnp (%p,%p): Processing QUERY_%s irp\n", + DeviceObject, Irp, + ((irpStack->MinorFunction == IRP_MN_QUERY_STOP_DEVICE) ? + "STOP" : "REMOVE"))); + + // + // If this device is in use for some reason (paging, etc...) + // then we need to fail the request. + // + + if(commonExtension->PagingPathCount != 0) { + + DebugPrint((1, "ClassDispatchPnp (%p,%p): device is in paging " + "path and cannot be removed\n", + DeviceObject, Irp)); + status = STATUS_DEVICE_BUSY; + break; + } + + // + // Check with the class driver to see if the query operation + // can succeed. + // + + if(irpStack->MinorFunction == IRP_MN_QUERY_STOP_DEVICE) { + status = devInfo->ClassStopDevice(DeviceObject, + irpStack->MinorFunction); + } else { + status = devInfo->ClassRemoveDevice(DeviceObject, + irpStack->MinorFunction); + } + + if(NT_SUCCESS(status)) { + + // + // ASSERT that we never get two queries in a row, as + // this will severly mess up the state machine + // + ASSERT(commonExtension->CurrentState != irpStack->MinorFunction); + commonExtension->PreviousState = commonExtension->CurrentState; + commonExtension->CurrentState = irpStack->MinorFunction; + + if(isFdo) { + DebugPrint((2, "ClassDispatchPnp (%p,%p): Forwarding QUERY_" + "%s irp\n", DeviceObject, Irp, + ((irpStack->MinorFunction == IRP_MN_QUERY_STOP_DEVICE) ? + "STOP" : "REMOVE"))); + status = ClassForwardIrpSynchronous(commonExtension, Irp); + } + } + DebugPrint((2, "ClassDispatchPnp (%p,%p): Final status == %x\n", + DeviceObject, Irp, status)); + + break; + } + + case IRP_MN_CANCEL_STOP_DEVICE: + case IRP_MN_CANCEL_REMOVE_DEVICE: { + + // + // Check with the class driver to see if the query or cancel + // operation can succeed. + // + + if(irpStack->MinorFunction == IRP_MN_CANCEL_STOP_DEVICE) { + status = devInfo->ClassStopDevice(DeviceObject, + irpStack->MinorFunction); + ASSERTMSG("ClassDispatchPnp !! CANCEL_STOP_DEVICE should " + "never be failed\n", NT_SUCCESS(status)); + } else { + status = devInfo->ClassRemoveDevice(DeviceObject, + irpStack->MinorFunction); + ASSERTMSG("ClassDispatchPnp !! CANCEL_REMOVE_DEVICE should " + "never be failed\n", NT_SUCCESS(status)); + } + + Irp->IoStatus.Status = status; + + // + // We got a CANCEL - roll back to the previous state only + // if the current state is the respective QUERY state. + // + + if(((irpStack->MinorFunction == IRP_MN_CANCEL_STOP_DEVICE) && + (commonExtension->CurrentState == IRP_MN_QUERY_STOP_DEVICE) + ) || + ((irpStack->MinorFunction == IRP_MN_CANCEL_REMOVE_DEVICE) && + (commonExtension->CurrentState == IRP_MN_QUERY_REMOVE_DEVICE) + ) + ) { + + commonExtension->CurrentState = + commonExtension->PreviousState; + commonExtension->PreviousState = 0xff; + + } + + if(isFdo) { + IoCopyCurrentIrpStackLocationToNext(Irp); + ClassReleaseRemoveLock(DeviceObject, Irp); + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + completeRequest = FALSE; + } else { + status = STATUS_SUCCESS; + } + + break; + } + + case IRP_MN_STOP_DEVICE: { + + // + // These all mean nothing to the class driver currently. The + // port driver will handle all queueing when necessary. + // + + DebugPrint((2, "ClassDispatchPnp (%p,%p): got stop request for %s\n", + DeviceObject, Irp, + (isFdo ? "fdo" : "pdo") + )); + + ASSERT(commonExtension->PagingPathCount == 0); + + // + // ISSUE-2000/02/03-peterwie + // if we stop the timer here then it means no class driver can + // do i/o in its ClassStopDevice routine. This is because the + // retry (among other things) is tied into the tick handler + // and disabling retries could cause the class driver to deadlock. + // Currently no class driver we're aware of issues i/o in its + // Stop routine but this is a case we may want to defend ourself + // against. + // + + if (DeviceObject->Timer) { + IoStopTimer(DeviceObject); + } + + status = devInfo->ClassStopDevice(DeviceObject, IRP_MN_STOP_DEVICE); + + ASSERTMSG("ClassDispatchPnp !! STOP_DEVICE should " + "never be failed\n", NT_SUCCESS(status)); + + if(isFdo) { + status = ClassForwardIrpSynchronous(commonExtension, Irp); + } + + if(NT_SUCCESS(status)) { + commonExtension->CurrentState = irpStack->MinorFunction; + commonExtension->PreviousState = 0xff; + } + + break; + } + + case IRP_MN_REMOVE_DEVICE: + case IRP_MN_SURPRISE_REMOVAL: { + + PDEVICE_OBJECT lowerDeviceObject = commonExtension->LowerDeviceObject; + UCHAR removeType = irpStack->MinorFunction; + + if (commonExtension->PagingPathCount != 0) { + DBGTRACE(ClassDebugWarning, ("ClassDispatchPnp (%p,%p): paging device is getting removed!", DeviceObject, Irp)); + } + + // + // Release the lock for this IRP before calling in. + // + ClassReleaseRemoveLock(DeviceObject, Irp); + lockReleased = TRUE; + + /* + * If a timer was started on the device, stop it. + */ + if (DeviceObject->Timer) { + IoStopTimer(DeviceObject); + } + + /* + * "Fire-and-forget" the remove irp to the lower stack. + * Don't touch the irp (or the irp stack!) after this. + */ + if (isFdo) { + IoCopyCurrentIrpStackLocationToNext(Irp); + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + ASSERT(NT_SUCCESS(status)); + completeRequest = FALSE; + } + else { + status = STATUS_SUCCESS; + } + + /* + * Do our own cleanup and call the class driver's remove + * cleanup routine. + * For IRP_MN_REMOVE_DEVICE, this also deletes our device object, + * so don't touch the extension after this. + */ + commonExtension->PreviousState = commonExtension->CurrentState; + commonExtension->CurrentState = removeType; + ClassRemoveDevice(DeviceObject, removeType); + + break; + } + + case IRP_MN_DEVICE_USAGE_NOTIFICATION: { + + switch(irpStack->Parameters.UsageNotification.Type) { + + case DeviceUsageTypePaging: { + + BOOLEAN setPagable; + + if((irpStack->Parameters.UsageNotification.InPath) && + (commonExtension->CurrentState != IRP_MN_START_DEVICE)) { + + // + // Device isn't started. Don't allow adding a + // paging file, but allow a removal of one. + // + + status = STATUS_DEVICE_NOT_READY; + break; + } + + ASSERT(commonExtension->IsInitialized); + + // + // need to synchronize this now... + // + + KeEnterCriticalRegion(); + status = KeWaitForSingleObject(&commonExtension->PathCountEvent, + Executive, KernelMode, + FALSE, NULL); + ASSERT(NT_SUCCESS(status)); + status = STATUS_SUCCESS; + + // + // If the volume is removable we should try to lock it in + // place or unlock it once per paging path count + // + + if (commonExtension->IsFdo){ + status = ClasspEjectionControl( + DeviceObject, + Irp, + InternalMediaLock, + (BOOLEAN)irpStack->Parameters.UsageNotification.InPath); + } + + if (!NT_SUCCESS(status)){ + KeSetEvent(&commonExtension->PathCountEvent, IO_NO_INCREMENT, FALSE); + KeLeaveCriticalRegion(); + break; + } + + // + // if removing last paging device, need to set DO_POWER_PAGABLE + // bit here, and possible re-set it below on failure. + // + + setPagable = FALSE; + + if (!irpStack->Parameters.UsageNotification.InPath && + commonExtension->PagingPathCount == 1 + ) { + + // + // removing last paging file + // must have DO_POWER_PAGABLE bits set, but only + // if noone set the DO_POWER_INRUSH bit + // + + + if (TEST_FLAG(DeviceObject->Flags, DO_POWER_INRUSH)) { + DebugPrint((2, "ClassDispatchPnp (%p,%p): Last " + "paging file removed, but " + "DO_POWER_INRUSH was set, so NOT " + "setting DO_POWER_PAGABLE\n", + DeviceObject, Irp)); + } else { + DebugPrint((2, "ClassDispatchPnp (%p,%p): Last " + "paging file removed, " + "setting DO_POWER_PAGABLE\n", + DeviceObject, Irp)); + SET_FLAG(DeviceObject->Flags, DO_POWER_PAGABLE); + setPagable = TRUE; + } + + } + + // + // forward the irp before finishing handling the + // special cases + // + + status = ClassForwardIrpSynchronous(commonExtension, Irp); + + // + // now deal with the failure and success cases. + // note that we are not allowed to fail the irp + // once it is sent to the lower drivers. + // + + if (NT_SUCCESS(status)) { + + IoAdjustPagingPathCount( + &commonExtension->PagingPathCount, + irpStack->Parameters.UsageNotification.InPath); + + if (irpStack->Parameters.UsageNotification.InPath) { + if (commonExtension->PagingPathCount == 1) { + DebugPrint((2, "ClassDispatchPnp (%p,%p): " + "Clearing PAGABLE bit\n", + DeviceObject, Irp)); + CLEAR_FLAG(DeviceObject->Flags, DO_POWER_PAGABLE); + } + } + + } else { + + // + // cleanup the changes done above + // + + if (setPagable == TRUE) { + DebugPrint((2, "ClassDispatchPnp (%p,%p): Unsetting " + "PAGABLE bit due to irp failure\n", + DeviceObject, Irp)); + CLEAR_FLAG(DeviceObject->Flags, DO_POWER_PAGABLE); + setPagable = FALSE; + } + + // + // relock or unlock the media if needed. + // + + if (commonExtension->IsFdo) { + + ClasspEjectionControl( + DeviceObject, + Irp, + InternalMediaLock, + (BOOLEAN)!irpStack->Parameters.UsageNotification.InPath); + } + } + + // + // set the event so the next one can occur. + // + + KeSetEvent(&commonExtension->PathCountEvent, + IO_NO_INCREMENT, FALSE); + KeLeaveCriticalRegion(); + break; + } + + case DeviceUsageTypeHibernation: { + + IoAdjustPagingPathCount( + &commonExtension->HibernationPathCount, + irpStack->Parameters.UsageNotification.InPath + ); + status = ClassForwardIrpSynchronous(commonExtension, Irp); + if (!NT_SUCCESS(status)) { + IoAdjustPagingPathCount( + &commonExtension->HibernationPathCount, + !irpStack->Parameters.UsageNotification.InPath + ); + } + + break; + } + + case DeviceUsageTypeDumpFile: { + IoAdjustPagingPathCount( + &commonExtension->DumpPathCount, + irpStack->Parameters.UsageNotification.InPath + ); + status = ClassForwardIrpSynchronous(commonExtension, Irp); + if (!NT_SUCCESS(status)) { + IoAdjustPagingPathCount( + &commonExtension->DumpPathCount, + !irpStack->Parameters.UsageNotification.InPath + ); + } + + break; + } + + default: { + status = STATUS_INVALID_PARAMETER; + break; + } + } + break; + } + + case IRP_MN_QUERY_CAPABILITIES: { + + DebugPrint((2, "ClassDispatchPnp (%p,%p): QueryCapabilities\n", + DeviceObject, Irp)); + + if(!isFdo) { + + status = ClassQueryPnpCapabilities( + DeviceObject, + irpStack->Parameters.DeviceCapabilities.Capabilities + ); + + break; + + } else { + + PDEVICE_CAPABILITIES deviceCapabilities; + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + PCLASS_PRIVATE_FDO_DATA fdoData; + + fdoExtension = DeviceObject->DeviceExtension; + fdoData = fdoExtension->PrivateFdoData; + deviceCapabilities = + irpStack->Parameters.DeviceCapabilities.Capabilities; + + // + // forward the irp before handling the special cases + // + + status = ClassForwardIrpSynchronous(commonExtension, Irp); + if (!NT_SUCCESS(status)) { + break; + } + + // + // we generally want to remove the device from the hotplug + // applet, which requires the SR-OK bit to be set. + // only when the user specifies that they are capable of + // safely removing things do we want to clear this bit + // (saved in WriteCacheEnableOverride) + // + // setting of this bit is done either above, or by the + // lower driver. + // + // note: may not be started, so check we have FDO data first. + // + + if (fdoData && + fdoData->HotplugInfo.WriteCacheEnableOverride) { + if (deviceCapabilities->SurpriseRemovalOK) { + DebugPrint((1, "Classpnp: Clearing SR-OK bit in " + "device capabilities due to hotplug " + "device or media\n")); + } + deviceCapabilities->SurpriseRemovalOK = FALSE; + } + break; + + } // end QUERY_CAPABILITIES for FDOs + + ASSERT(FALSE); + break; + + + } // end QUERY_CAPABILITIES + + default: { + + if (isFdo){ + IoCopyCurrentIrpStackLocationToNext(Irp); + + ClassReleaseRemoveLock(DeviceObject, Irp); + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + + completeRequest = FALSE; + } + + break; + } + } + } + else { + ASSERT(driverExtension); + status = STATUS_INTERNAL_ERROR; + } + + if (completeRequest){ + Irp->IoStatus.Status = status; + + if (!lockReleased){ + ClassReleaseRemoveLock(DeviceObject, Irp); + } + + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + + DBGTRACE(ClassDebugTrace, ("ClassDispatchPnp (%p,%p): leaving with previous %#x, current %#x.", DeviceObject, Irp, commonExtension->PreviousState, commonExtension->CurrentState)); + } + else { + /* + * The irp is already completed so don't touch it. + * This may be a remove so don't touch the device extension. + */ + DBGTRACE(ClassDebugTrace, ("ClassDispatchPnp (%p,%p): leaving.", DeviceObject, Irp)); + } + + return status; +} // end ClassDispatchPnp() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassPnpStartDevice() + +Routine Description: + + Storage class driver routine for IRP_MN_START_DEVICE requests. + This routine kicks off any device specific initialization + +Arguments: + + DeviceObject - a pointer to the device object + + Irp - a pointer to the io request packet + +Return Value: + + none + +--*/ +NTSTATUS ClassPnpStartDevice(IN PDEVICE_OBJECT DeviceObject) +{ + PCLASS_DRIVER_EXTENSION driverExtension; + PCLASS_INIT_DATA initData; + + PCLASS_DEV_INFO devInfo; + + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + BOOLEAN isFdo = commonExtension->IsFdo; + + BOOLEAN isMountedDevice = TRUE; + UNICODE_STRING interfaceName; + + BOOLEAN timerStarted; + + NTSTATUS status = STATUS_SUCCESS; + + PAGED_CODE(); + + driverExtension = IoGetDriverObjectExtension(DeviceObject->DriverObject, + CLASS_DRIVER_EXTENSION_KEY); + + initData = &(driverExtension->InitData); + if(isFdo) { + devInfo = &(initData->FdoData); + } else { + devInfo = &(initData->PdoData); + } + + ASSERT(devInfo->ClassInitDevice != NULL); + ASSERT(devInfo->ClassStartDevice != NULL); + + if (!commonExtension->IsInitialized){ + + // + // perform FDO/PDO specific initialization + // + + if (isFdo){ + STORAGE_PROPERTY_ID propertyId; + + // + // allocate a private extension for class data + // + + if (fdoExtension->PrivateFdoData == NULL) { + fdoExtension->PrivateFdoData = + ExAllocatePoolWithTag(NonPagedPool, + sizeof(CLASS_PRIVATE_FDO_DATA), + CLASS_TAG_PRIVATE_DATA + ); + } + + if (fdoExtension->PrivateFdoData == NULL) { + DebugPrint((0, "ClassPnpStartDevice: Cannot allocate for " + "private fdo data\n")); + return STATUS_INSUFFICIENT_RESOURCES; + } + + // + // initialize the struct's various fields. + // + + RtlZeroMemory(fdoExtension->PrivateFdoData, + sizeof(CLASS_PRIVATE_FDO_DATA) + ); + KeInitializeTimer(&fdoExtension->PrivateFdoData->Retry.Timer); + KeInitializeDpc(&fdoExtension->PrivateFdoData->Retry.Dpc, + ClasspRetryRequestDpc, + DeviceObject); + KeInitializeSpinLock(&fdoExtension->PrivateFdoData->Retry.Lock); + fdoExtension->PrivateFdoData->Retry.Granularity = + KeQueryTimeIncrement(); + commonExtension->Reserved4 = (ULONG_PTR)(' GPH'); // debug aid + + // + // NOTE: the old interface allowed the class driver to allocate + // this. this was unsafe for low-memory conditions. allocate one + // unconditionally now, and modify our internal functions to use + // our own exclusively as it is the only safe way to do this. + // + + status = ClasspAllocateReleaseQueueIrp(fdoExtension); + if (!NT_SUCCESS(status)) { + DebugPrint((0, "ClassPnpStartDevice: Cannot allocate the " + "private release queue irp\n")); + return status; + } + + // + // Call port driver to get adapter capabilities. + // + + propertyId = StorageAdapterProperty; + + status = ClassGetDescriptor( + commonExtension->LowerDeviceObject, + &propertyId, + &fdoExtension->AdapterDescriptor); + + if(!NT_SUCCESS(status)) { + + // + // This DebugPrint is to help third-party driver writers + // + + DebugPrint((0, "ClassPnpStartDevice: ClassGetDescriptor " + "[ADAPTER] failed %lx\n", status)); + return status; + } + + // + // Call port driver to get device descriptor. + // + + propertyId = StorageDeviceProperty; + + status = ClassGetDescriptor( + commonExtension->LowerDeviceObject, + &propertyId, + &fdoExtension->DeviceDescriptor); + + if(!NT_SUCCESS(status)) { + + // + // This DebugPrint is to help third-party driver writers + // + + DebugPrint((0, "ClassPnpStartDevice: ClassGetDescriptor " + "[DEVICE] failed %lx\n", status)); + return status; + } + + ClasspScanForSpecialInRegistry(fdoExtension); + ClassScanForSpecial(fdoExtension, + ClassBadItems, + ClasspScanForClassHacks); + + // + // allow perf to be re-enabled after a given number of failed IOs + // require this number to be at least CLASS_PERF_RESTORE_MINIMUM + // + + { + ULONG t = 0; + ClassGetDeviceParameter(fdoExtension, + CLASSP_REG_SUBKEY_NAME, + CLASSP_REG_PERF_RESTORE_VALUE_NAME, + &t); + if (t >= CLASS_PERF_RESTORE_MINIMUM) { + fdoExtension->PrivateFdoData->Perf.ReEnableThreshhold = t; + } + } + + + // + // compatibility comes first. writable cd media will not + // get a SYNCH_CACHE on power down. + // + + if (fdoExtension->DeviceObject->DeviceType != FILE_DEVICE_DISK) { + SET_FLAG(fdoExtension->PrivateFdoData->HackFlags, + FDO_HACK_NO_SYNC_CACHE); + } + + // + // initialize the hotplug information only after the ScanForSpecial + // routines, as it relies upon the hack flags. + // + + status = ClasspInitializeHotplugInfo(fdoExtension); + + if (!NT_SUCCESS(status)) { + DebugPrint((1, "ClassPnpStartDevice: Could not initialize " + "hotplug information %lx\n", status)); + return status; + } + + /* + * Allocate/initialize TRANSFER_PACKETs and related resources. + */ + status = InitializeTransferPackets(DeviceObject); + } + + // + // ISSUE - drivers need to disable write caching on the media + // if hotplug and !useroverride. perhaps we should + // allow registration of a callback to enable/disable + // write cache instead. + // + + if (NT_SUCCESS(status)){ + status = devInfo->ClassInitDevice(DeviceObject); + } + + } + + if (!NT_SUCCESS(status)){ + + // + // Just bail out - the remove that comes down will clean up the + // initialized scraps. + // + + return status; + } else { + commonExtension->IsInitialized = TRUE; + + if (commonExtension->IsFdo) { + fdoExtension->PrivateFdoData->Perf.OriginalSrbFlags = fdoExtension->SrbFlags; + } + + } + + // + // If device requests autorun functionality or a once a second callback + // then enable the once per second timer. + // + // NOTE: This assumes that ClassInitializeMediaChangeDetection is always + // called in the context of the ClassInitDevice callback. If called + // after then this check will have already been made and the + // once a second timer will not have been enabled. + // + if ((isFdo) && + ((initData->ClassTick != NULL) || + (fdoExtension->MediaChangeDetectionInfo != NULL) || + ((fdoExtension->FailurePredictionInfo != NULL) && + (fdoExtension->FailurePredictionInfo->Method != FailurePredictionNone)))) + { + ClasspEnableTimer(DeviceObject); + timerStarted = TRUE; + } else { + timerStarted = FALSE; + } + + // + // NOTE: the timer looks at commonExtension->CurrentState now + // to prevent Media Change Notification code from running + // until the device is started, but allows the device + // specific tick handler to run. therefore it is imperative + // that commonExtension->CurrentState not be updated until + // the device specific startdevice handler has finished. + // + + status = devInfo->ClassStartDevice(DeviceObject); + + if(NT_SUCCESS(status)) { + commonExtension->CurrentState = IRP_MN_START_DEVICE; + + if((isFdo) && (initData->ClassEnumerateDevice != NULL)) { + isMountedDevice = FALSE; + } + + if((DeviceObject->DeviceType != FILE_DEVICE_DISK) && + (DeviceObject->DeviceType != FILE_DEVICE_CD_ROM)) { + + isMountedDevice = FALSE; + } + + + if(isMountedDevice) { + ClasspRegisterMountedDeviceInterface(DeviceObject); + } + + if((commonExtension->IsFdo) && + (devInfo->ClassWmiInfo.GuidRegInfo != NULL)) { + + IoWMIRegistrationControl(DeviceObject, WMIREG_ACTION_REGISTER); + } + } else { + + if (timerStarted) { + ClasspDisableTimer(DeviceObject); + } + } + + return status; +} + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassReadWrite() + +Routine Description: + + This is the system entry point for read and write requests. The + device-specific handler is invoked to perform any validation necessary. + + If the device object is a PDO (partition object) then the request will + simply be adjusted for Partition0 and issued to the lower device driver. + + IF the device object is an FDO (paritition 0 object), the number of bytes + in the request are checked against the maximum byte counts that the adapter + supports and requests are broken up into + smaller sizes if necessary. + +Arguments: + + DeviceObject - a pointer to the device object for this request + + Irp - IO request + +Return Value: + + NT Status + +--*/ +NTSTATUS ClassReadWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PDEVICE_OBJECT lowerDeviceObject = commonExtension->LowerDeviceObject; + PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(Irp); + LARGE_INTEGER startingOffset = currentIrpStack->Parameters.Read.ByteOffset; + ULONG transferByteCount = currentIrpStack->Parameters.Read.Length; + ULONG isRemoved; + NTSTATUS status; + + /* + * Grab the remove lock. If we can't acquire it, bail out. + */ + isRemoved = ClassAcquireRemoveLock(DeviceObject, Irp); + if (isRemoved) { + Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST; + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + status = STATUS_DEVICE_DOES_NOT_EXIST; + } + else if (TEST_FLAG(DeviceObject->Flags, DO_VERIFY_VOLUME) && + (currentIrpStack->MinorFunction != CLASSP_VOLUME_VERIFY_CHECKED) && + !TEST_FLAG(currentIrpStack->Flags, SL_OVERRIDE_VERIFY_VOLUME)){ + + /* + * DO_VERIFY_VOLUME is set for the device object, + * but this request is not itself a verify request. + * So fail this request. + */ + IoSetHardErrorOrVerifyDevice(Irp, DeviceObject); + Irp->IoStatus.Status = STATUS_VERIFY_REQUIRED; + Irp->IoStatus.Information = 0; + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, 0); + status = STATUS_VERIFY_REQUIRED; + } + else { + + /* + * Since we've bypassed the verify-required tests we don't need to repeat + * them with this IRP - in particular we don't want to worry about + * hitting them at the partition 0 level if the request has come through + * a non-zero partition. + */ + currentIrpStack->MinorFunction = CLASSP_VOLUME_VERIFY_CHECKED; + + /* + * Call the miniport driver's pre-pass filter to check if we + * should continue with this transfer. + */ + ASSERT(commonExtension->DevInfo->ClassReadWriteVerification); + status = commonExtension->DevInfo->ClassReadWriteVerification(DeviceObject, Irp); + if (!NT_SUCCESS(status)){ + ASSERT(Irp->IoStatus.Status == status); + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest (DeviceObject, Irp, IO_NO_INCREMENT); + } + else if (status == STATUS_PENDING){ + /* + * ClassReadWriteVerification queued this request. + * So don't touch the irp anymore. + */ + } + else { + + if (transferByteCount == 0) { + /* + * Several parts of the code turn 0 into 0xffffffff, + * so don't process a zero-length request any further. + */ + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + status = STATUS_SUCCESS; + } + else { + /* + * If the driver has its own StartIo routine, call it. + */ + if (commonExtension->DriverExtension->InitData.ClassStartIo) { + IoMarkIrpPending(Irp); + IoStartPacket(DeviceObject, Irp, NULL, NULL); + status = STATUS_PENDING; + } + else { + /* + * The driver does not have its own StartIo routine. + * So process this request ourselves. + */ + + /* + * Add partition byte offset to make starting byte relative to + * beginning of disk. + */ + currentIrpStack->Parameters.Read.ByteOffset.QuadPart += + commonExtension->StartingOffset.QuadPart; + + if (commonExtension->IsFdo){ + + /* + * Add in any skew for the disk manager software. + */ + currentIrpStack->Parameters.Read.ByteOffset.QuadPart += + commonExtension->PartitionZeroExtension->DMByteSkew; + + /* + * Perform the actual transfer(s) on the hardware + * to service this request. + */ + ServiceTransferRequest(DeviceObject, Irp); + status = STATUS_PENDING; + } + else { + /* + * This is a child PDO enumerated for our FDO by e.g. disk.sys + * and owned by e.g. partmgr. Send it down to the next device + * and the same irp will come back to us for the FDO. + */ + IoCopyCurrentIrpStackLocationToNext(Irp); + ClassReleaseRemoveLock(DeviceObject, Irp); + status = IoCallDriver(lowerDeviceObject, Irp); + } + } + } + } + } + + return status; +} + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassReadDriveCapacity() + +Routine Description: + + This routine sends a READ CAPACITY to the requested device, updates + the geometry information in the device object and returns + when it is complete. This routine is synchronous. + + This routine must be called with the remove lock held or some other + assurance that the Fdo will not be removed while processing. + +Arguments: + + DeviceObject - Supplies a pointer to the device object that represents + the device whose capacity is to be read. + +Return Value: + + Status is returned. + +--*/ +NTSTATUS ClassReadDriveCapacity(IN PDEVICE_OBJECT Fdo) +{ + READ_CAPACITY_DATA readCapacityBuffer = {0}; + NTSTATUS status; + PMDL driveCapMdl; + + driveCapMdl = BuildDeviceInputMdl(&readCapacityBuffer, sizeof(READ_CAPACITY_DATA)); + if (driveCapMdl){ + + TRANSFER_PACKET *pkt = DequeueFreeTransferPacket(Fdo, TRUE); + if (pkt){ + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Fdo->DeviceExtension; + KEVENT event; + NTSTATUS pktStatus; + IRP pseudoIrp = {0}; + + /* + * Our engine needs an "original irp" to write the status back to + * and to count down packets (one in this case). + * Just use a pretend irp for this. + */ + pseudoIrp.Tail.Overlay.DriverContext[0] = LongToPtr(1); + pseudoIrp.IoStatus.Status = STATUS_SUCCESS; + pseudoIrp.IoStatus.Information = 0; + pseudoIrp.MdlAddress = driveCapMdl; + + /* + * Set this up as a SYNCHRONOUS transfer, submit it, + * and wait for the packet to complete. The result + * status will be written to the original irp. + */ + KeInitializeEvent(&event, SynchronizationEvent, FALSE); + SetupDriveCapacityTransferPacket( pkt, + &readCapacityBuffer, + sizeof(READ_CAPACITY_DATA), + &event, + &pseudoIrp); + SubmitTransferPacket(pkt); + KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); + + status = pseudoIrp.IoStatus.Status; + + /* + * If we got an UNDERRUN, retry exactly once. + * (The transfer_packet engine didn't retry because the result + * status was success). + */ + if (NT_SUCCESS(status) && + (pseudoIrp.IoStatus.Information < sizeof(READ_CAPACITY_DATA))){ + DBGERR(("ClassReadDriveCapacity: read len (%xh) < %xh, retrying ...", (ULONG)pseudoIrp.IoStatus.Information, sizeof(READ_CAPACITY_DATA))); + + pkt = DequeueFreeTransferPacket(Fdo, TRUE); + if (pkt){ + pseudoIrp.Tail.Overlay.DriverContext[0] = LongToPtr(1); + pseudoIrp.IoStatus.Status = STATUS_SUCCESS; + pseudoIrp.IoStatus.Information = 0; + KeInitializeEvent(&event, SynchronizationEvent, FALSE); + SetupDriveCapacityTransferPacket( pkt, + &readCapacityBuffer, + sizeof(READ_CAPACITY_DATA), + &event, + &pseudoIrp); + SubmitTransferPacket(pkt); + KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); + status = pseudoIrp.IoStatus.Status; + if (pseudoIrp.IoStatus.Information < sizeof(READ_CAPACITY_DATA)){ + status = STATUS_DEVICE_BUSY; + } + } + else { + status = STATUS_INSUFFICIENT_RESOURCES; + } + } + + + if (NT_SUCCESS(status)){ + /* + * The request succeeded. + * Read out and store the drive information. + */ + ULONG cylinderSize; + ULONG bytesPerSector; + ULONG tmp; + ULONG lastSector; + + /* + * Read the bytesPerSector value, + * which is big-endian in the returned buffer. + * Default to the standard 512 bytes. + */ + tmp = readCapacityBuffer.BytesPerBlock; + ((PFOUR_BYTE)&bytesPerSector)->Byte0 = ((PFOUR_BYTE)&tmp)->Byte3; + ((PFOUR_BYTE)&bytesPerSector)->Byte1 = ((PFOUR_BYTE)&tmp)->Byte2; + ((PFOUR_BYTE)&bytesPerSector)->Byte2 = ((PFOUR_BYTE)&tmp)->Byte1; + ((PFOUR_BYTE)&bytesPerSector)->Byte3 = ((PFOUR_BYTE)&tmp)->Byte0; + if (bytesPerSector == 0) { + bytesPerSector = 512; + } + else { + /* + * Clear all but the highest set bit. + * That will give us a bytesPerSector value that is a power of 2. + */ + while (bytesPerSector & (bytesPerSector-1)) { + bytesPerSector &= bytesPerSector-1; + } + } + fdoExt->DiskGeometry.BytesPerSector = bytesPerSector; + + // + // Copy last sector in reverse byte order. + // + + tmp = readCapacityBuffer.LogicalBlockAddress; + ((PFOUR_BYTE)&lastSector)->Byte0 = ((PFOUR_BYTE)&tmp)->Byte3; + ((PFOUR_BYTE)&lastSector)->Byte1 = ((PFOUR_BYTE)&tmp)->Byte2; + ((PFOUR_BYTE)&lastSector)->Byte2 = ((PFOUR_BYTE)&tmp)->Byte1; + ((PFOUR_BYTE)&lastSector)->Byte3 = ((PFOUR_BYTE)&tmp)->Byte0; + + // + // Calculate sector to byte shift. + // + + WHICH_BIT(fdoExt->DiskGeometry.BytesPerSector, fdoExt->SectorShift); + + DebugPrint((2,"SCSI ClassReadDriveCapacity: Sector size is %d\n", + fdoExt->DiskGeometry.BytesPerSector)); + + DebugPrint((2,"SCSI ClassReadDriveCapacity: Number of Sectors is %d\n", + lastSector + 1)); + + if (fdoExt->DMActive){ + DebugPrint((1, "SCSI ClassReadDriveCapacity: reducing number of sectors by %d\n", + fdoExt->DMSkew)); + lastSector -= fdoExt->DMSkew; + } + + /* + * Check to see if we have a geometry we should be using already. + */ + cylinderSize = (fdoExt->DiskGeometry.TracksPerCylinder * + fdoExt->DiskGeometry.SectorsPerTrack); + if (cylinderSize == 0){ + DebugPrint((1, "ClassReadDriveCapacity: resetting H & S geometry " + "values from %#x/%#x to %#x/%#x\n", + fdoExt->DiskGeometry.TracksPerCylinder, + fdoExt->DiskGeometry.SectorsPerTrack, + 0xff, + 0x3f)); + + fdoExt->DiskGeometry.TracksPerCylinder = 0xff; + fdoExt->DiskGeometry.SectorsPerTrack = 0x3f; + + + cylinderSize = (fdoExt->DiskGeometry.TracksPerCylinder * + fdoExt->DiskGeometry.SectorsPerTrack); + } + + // + // Calculate number of cylinders. + // + + fdoExt->DiskGeometry.Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/cylinderSize); + + // + // if there are zero cylinders, then the device lied AND it's + // smaller than 0xff*0x3f (about 16k sectors, usually 8 meg) + // this can fit into a single LONGLONG, so create another usable + // geometry, even if it's unusual looking. This allows small, + // non-standard devices, such as Sony's Memory Stick, to show + // up as having a partition. + // + + if (fdoExt->DiskGeometry.Cylinders.QuadPart == (LONGLONG)0) { + fdoExt->DiskGeometry.SectorsPerTrack = 1; + fdoExt->DiskGeometry.TracksPerCylinder = 1; + fdoExt->DiskGeometry.Cylinders.QuadPart = lastSector; + } + + + // + // Calculate media capacity in bytes. + // + + fdoExt->CommonExtension.PartitionLength.QuadPart = + ((LONGLONG)(lastSector + 1)) << fdoExt->SectorShift; + + /* + * Is this removable or fixed media + */ + if (TEST_FLAG(Fdo->Characteristics, FILE_REMOVABLE_MEDIA)){ + fdoExt->DiskGeometry.MediaType = RemovableMedia; + } + else { + fdoExt->DiskGeometry.MediaType = FixedMedia; + } + } + else { + /* + * The request failed. + */ + + // + // ISSUE - 2000/02/04 - henrygab - non-512-byte sector sizes and failed geometry update + // what happens when the disk's sector size is bigger than + // 512 bytes and we hit this code path? this is untested. + // + // If the read capacity fails, set the geometry to reasonable parameter + // so things don't fail at unexpected places. Zero the geometry + // except for the bytes per sector and sector shift. + // + + /* + * This request can sometimes fail legitimately + * (e.g. when a SCSI device is attached but turned off) + * so this is not necessarily a device/driver bug. + */ + DBGTRACE(ClassDebugWarning, ("ClassReadDriveCapacity on Fdo %xh failed with status %xh.", Fdo, status)); + + /* + * Write in a default disk geometry which we HOPE is right (??). + * BUGBUG !! + */ + RtlZeroMemory(&fdoExt->DiskGeometry, sizeof(DISK_GEOMETRY)); + fdoExt->DiskGeometry.BytesPerSector = 512; + fdoExt->SectorShift = 9; + fdoExt->CommonExtension.PartitionLength.QuadPart = (LONGLONG) 0; + + /* + * Is this removable or fixed media + */ + if (TEST_FLAG(Fdo->Characteristics, FILE_REMOVABLE_MEDIA)){ + fdoExt->DiskGeometry.MediaType = RemovableMedia; + } + else { + fdoExt->DiskGeometry.MediaType = FixedMedia; + } + } + + } + else { + status = STATUS_INSUFFICIENT_RESOURCES; + } + + FreeDeviceInputMdl(driveCapMdl); + } + else { + status = STATUS_INSUFFICIENT_RESOURCES; + } + + return status; +} + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassSendStartUnit() + +Routine Description: + + Send command to SCSI unit to start or power up. + Because this command is issued asynchronounsly, that is, without + waiting on it to complete, the IMMEDIATE flag is not set. This + means that the CDB will not return until the drive has powered up. + This should keep subsequent requests from being submitted to the + device before it has completely spun up. + + This routine is called from the InterpretSense routine, when a + request sense returns data indicating that a drive must be + powered up. + + This routine may also be called from a class driver's error handler, + or anytime a non-critical start device should be sent to the device. + +Arguments: + + Fdo - The functional device object for the stopped device. + +Return Value: + + None. + +--*/ +VOID +ClassSendStartUnit( + IN PDEVICE_OBJECT Fdo + ) +{ + PIO_STACK_LOCATION irpStack; + PIRP irp; + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PSCSI_REQUEST_BLOCK srb; + PCOMPLETION_CONTEXT context; + PCDB cdb; + + // + // Allocate Srb from nonpaged pool. + // + + context = ExAllocatePoolWithTag(NonPagedPool, + sizeof(COMPLETION_CONTEXT), + '6CcS'); + + if(context == NULL) { + + // + // ISSUE-2000/02/03-peterwie + // This code path was inheritted from the NT 4.0 class2.sys driver. + // It needs to be changed to survive low-memory conditions. + // + + KeBugCheck(SCSI_DISK_DRIVER_INTERNAL); + } + + // + // Save the device object in the context for use by the completion + // routine. + // + + context->DeviceObject = Fdo; + srb = &context->Srb; + + // + // Zero out srb. + // + + RtlZeroMemory(srb, sizeof(SCSI_REQUEST_BLOCK)); + + // + // Write length to SRB. + // + + srb->Length = sizeof(SCSI_REQUEST_BLOCK); + + srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + + // + // Set timeout value large enough for drive to spin up. + // + + srb->TimeOutValue = START_UNIT_TIMEOUT; + + // + // Set the transfer length. + // + + srb->SrbFlags = SRB_FLAGS_NO_DATA_TRANSFER | + SRB_FLAGS_DISABLE_AUTOSENSE | + SRB_FLAGS_DISABLE_SYNCH_TRANSFER; + + // + // Build the start unit CDB. + // + + srb->CdbLength = 6; + cdb = (PCDB)srb->Cdb; + + cdb->START_STOP.OperationCode = SCSIOP_START_STOP_UNIT; + cdb->START_STOP.Start = 1; + cdb->START_STOP.Immediate = 0; + cdb->START_STOP.LogicalUnitNumber = srb->Lun; + + // + // Build the asynchronous request to be sent to the port driver. + // Since this routine is called from a DPC the IRP should always be + // available. + // + + irp = IoAllocateIrp(Fdo->StackSize, FALSE); + + if(irp == NULL) { + + // + // ISSUE-2000/02/03-peterwie + // This code path was inheritted from the NT 4.0 class2.sys driver. + // It needs to be changed to survive low-memory conditions. + // + + KeBugCheck(SCSI_DISK_DRIVER_INTERNAL); + + } + + ClassAcquireRemoveLock(Fdo, irp); + + IoSetCompletionRoutine(irp, + (PIO_COMPLETION_ROUTINE)ClassAsynchronousCompletion, + context, + TRUE, + TRUE, + TRUE); + + irpStack = IoGetNextIrpStackLocation(irp); + irpStack->MajorFunction = IRP_MJ_SCSI; + srb->OriginalRequest = irp; + + // + // Store the SRB address in next stack for port driver. + // + + irpStack->Parameters.Scsi.Srb = srb; + + // + // Call the port driver with the IRP. + // + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp); + + return; + +} // end StartUnit() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassAsynchronousCompletion() ISSUE-2000/02/18-henrygab - why public?! + +Routine Description: + + This routine is called when an asynchronous I/O request + which was issused by the class driver completes. Examples of such requests + are release queue or START UNIT. This routine releases the queue if + necessary. It then frees the context and the IRP. + +Arguments: + + DeviceObject - The device object for the logical unit; however since this + is the top stack location the value is NULL. + + Irp - Supplies a pointer to the Irp to be processed. + + Context - Supplies the context to be used to process this request. + +Return Value: + + None. + +--*/ +NTSTATUS +ClassAsynchronousCompletion( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID Context + ) +{ + PCOMPLETION_CONTEXT context = Context; + PSCSI_REQUEST_BLOCK srb; + + if(DeviceObject == NULL) { + + DeviceObject = context->DeviceObject; + } + + srb = &context->Srb; + + // + // If this is an execute srb, then check the return status and make sure. + // the queue is not frozen. + // + + if (srb->Function == SRB_FUNCTION_EXECUTE_SCSI) { + + // + // Check for a frozen queue. + // + + if (srb->SrbStatus & SRB_STATUS_QUEUE_FROZEN) { + + // + // Unfreeze the queue getting the device object from the context. + // + + ClassReleaseQueue(context->DeviceObject); + } + } + + { // free port-allocated sense buffer if we can detect + + if (((PCOMMON_DEVICE_EXTENSION)(DeviceObject->DeviceExtension))->IsFdo) { + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + if (PORT_ALLOCATED_SENSE(fdoExtension, srb)) { + FREE_PORT_ALLOCATED_SENSE_BUFFER(fdoExtension, srb); + } + + } else { + + ASSERT(!TEST_FLAG(srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)); + + } + } + + + // + // Free the context and the Irp. + // + + if (Irp->MdlAddress != NULL) { + MmUnlockPages(Irp->MdlAddress); + IoFreeMdl(Irp->MdlAddress); + + Irp->MdlAddress = NULL; + } + + ClassReleaseRemoveLock(DeviceObject, Irp); + + ExFreePool(context); + IoFreeIrp(Irp); + + // + // Indicate the I/O system should stop processing the Irp completion. + // + + return STATUS_MORE_PROCESSING_REQUIRED; + +} // end ClassAsynchronousCompletion() + + + +VOID ServiceTransferRequest(PDEVICE_OBJECT Fdo, PIRP Irp) +{ + PCOMMON_DEVICE_EXTENSION commonExt = Fdo->DeviceExtension; + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + PSTORAGE_ADAPTER_DESCRIPTOR adapterDesc = commonExt->PartitionZeroExtension->AdapterDescriptor; + PIO_STACK_LOCATION currentSp = IoGetCurrentIrpStackLocation(Irp); + ULONG entireXferLen = currentSp->Parameters.Read.Length; + PUCHAR bufPtr = MmGetMdlVirtualAddress(Irp->MdlAddress); + LARGE_INTEGER targetLocation = currentSp->Parameters.Read.ByteOffset; + PTRANSFER_PACKET pkt; + SINGLE_LIST_ENTRY pktList; + PSINGLE_LIST_ENTRY slistEntry; + ULONG numPackets; + KIRQL oldIrql; + ULONG i; + + /* + * Compute the number of hw xfers we'll have to do. + * Calculate this without allowing for an overflow condition. + */ + ASSERT(fdoData->HwMaxXferLen >= PAGE_SIZE); + numPackets = entireXferLen/fdoData->HwMaxXferLen; + if (entireXferLen % fdoData->HwMaxXferLen){ + numPackets++; + } + + /* + * First get all the TRANSFER_PACKETs that we'll need at once. + * Use our 'simple' slist functions since we don't need interlocked. + */ + SimpleInitSlistHdr(&pktList); + for (i = 0; i < numPackets; i++){ + pkt = DequeueFreeTransferPacket(Fdo, TRUE); + if (pkt){ + SimplePushSlist(&pktList, &pkt->SlistEntry); + } + else { + break; + } + } + + if (i == numPackets){ + /* + * Initialize the original IRP's status to success. + * If any of the packets fail, they will set it to an error status. + * The IoStatus.Information field will be incremented to the + * transfer length as the pieces complete. + */ + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + /* + * Store the number of transfer pieces inside the original IRP. + * It will be used to count down the pieces as they complete. + */ + Irp->Tail.Overlay.DriverContext[0] = LongToPtr(numPackets); + + /* + * We are proceeding with the transfer. + * Mark the client IRP pending since it may complete on a different thread. + */ + IoMarkIrpPending(Irp); + + /* + * Transmit the pieces of the transfer. + */ + while (entireXferLen > 0){ + ULONG thisPieceLen = MIN(fdoData->HwMaxXferLen, entireXferLen); + + /* + * Set up a TRANSFER_PACKET for this piece and send it. + */ + slistEntry = SimplePopSlist(&pktList); + ASSERT(slistEntry); + pkt = CONTAINING_RECORD(slistEntry, TRANSFER_PACKET, SlistEntry); + SetupReadWriteTransferPacket( pkt, + bufPtr, + thisPieceLen, + targetLocation, + Irp); + SubmitTransferPacket(pkt); + + entireXferLen -= thisPieceLen; + bufPtr += thisPieceLen; + targetLocation.QuadPart += thisPieceLen; + } + ASSERT(SimpleIsSlistEmpty(&pktList)); + } + else if (i >= 1){ + /* + * We were unable to get all the TRANSFER_PACKETs we need, + * but we did get at least one. + * That means that we are in extreme low-memory stress. + * We'll try doing this transfer using a single packet. + * The port driver is certainly also in stress, so use one-page + * transfers. + */ + + /* + * Free all but one of the TRANSFER_PACKETs. + */ + while (i-- > 1){ + slistEntry = SimplePopSlist(&pktList); + ASSERT(slistEntry); + pkt = CONTAINING_RECORD(slistEntry, TRANSFER_PACKET, SlistEntry); + EnqueueFreeTransferPacket(Fdo, pkt); + } + + /* + * Get the single TRANSFER_PACKET that we'll be using. + */ + slistEntry = SimplePopSlist(&pktList); + ASSERT(slistEntry); + ASSERT(SimpleIsSlistEmpty(&pktList)); + pkt = CONTAINING_RECORD(slistEntry, TRANSFER_PACKET, SlistEntry); + DBGWARN(("Insufficient packets available in ServiceTransferRequest - entering lowMemRetry with pkt=%xh.", pkt)); + + /* + * Set default status and the number of transfer packets (one) + * inside the original irp. + */ + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + Irp->Tail.Overlay.DriverContext[0] = LongToPtr(1); + + /* + * Mark the client irp pending since it may complete on + * another thread. + */ + IoMarkIrpPending(Irp); + + /* + * Set up the TRANSFER_PACKET for a lowMem transfer and launch. + */ + SetupReadWriteTransferPacket( pkt, + bufPtr, + entireXferLen, + targetLocation, + Irp); + InitLowMemRetry(pkt, bufPtr, entireXferLen, targetLocation); + StepLowMemRetry(pkt); + } + else { + /* + * We were unable to get ANY TRANSFER_PACKETs. + * Defer this client irp until some TRANSFER_PACKETs free up. + */ + DBGWARN(("No packets available in ServiceTransferRequest - deferring transfer (Irp=%xh)...", Irp)); + IoMarkIrpPending(Irp); + EnqueueDeferredClientIrp(fdoData, Irp); + } + +} + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassIoComplete() + +Routine Description: + + This routine executes when the port driver has completed a request. + It looks at the SRB status in the completing SRB and if not success + it checks for valid request sense buffer information. If valid, the + info is used to update status with more precise message of type of + error. This routine deallocates the SRB. + + This routine should only be placed on the stack location for a class + driver FDO. + +Arguments: + + Fdo - Supplies the device object which represents the logical + unit. + + Irp - Supplies the Irp which has completed. + + Context - Supplies a pointer to the SRB. + +Return Value: + + NT status + +--*/ +NTSTATUS +ClassIoComplete( + IN PDEVICE_OBJECT Fdo, + IN PIRP Irp, + IN PVOID Context + ) +{ + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PSCSI_REQUEST_BLOCK srb = Context; + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExtension->PrivateFdoData; + NTSTATUS status; + BOOLEAN retry; + BOOLEAN callStartNextPacket; + + ASSERT(fdoExtension->CommonExtension.IsFdo); + + // + // Check SRB status for success of completing request. + // + + if (SRB_STATUS(srb->SrbStatus) != SRB_STATUS_SUCCESS) { + ULONG retryInterval; + + DebugPrint((2, "ClassIoComplete: IRP %p, SRB %p\n", Irp, srb)); + + // + // Release the queue if it is frozen. + // + + if (srb->SrbStatus & SRB_STATUS_QUEUE_FROZEN) { + ClassReleaseQueue(Fdo); + } + + retry = ClassInterpretSenseInfo( + Fdo, + srb, + irpStack->MajorFunction, + irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL ? + irpStack->Parameters.DeviceIoControl.IoControlCode : + 0, + MAXIMUM_RETRIES - + ((ULONG)(ULONG_PTR)irpStack->Parameters.Others.Argument4), + &status, + &retryInterval); + + // + // If the status is verified required and the this request + // should bypass verify required then retry the request. + // + + if (TEST_FLAG(irpStack->Flags, SL_OVERRIDE_VERIFY_VOLUME) && + status == STATUS_VERIFY_REQUIRED) { + + status = STATUS_IO_DEVICE_ERROR; + retry = TRUE; + } + + if (retry && (irpStack->Parameters.Others.Argument4--)) { + + // + // Retry request. + // + + DebugPrint((1, "Retry request %p\n", Irp)); + + if (PORT_ALLOCATED_SENSE(fdoExtension, srb)) { + FREE_PORT_ALLOCATED_SENSE_BUFFER(fdoExtension, srb); + } + + RetryRequest(Fdo, Irp, srb, FALSE, retryInterval); + return STATUS_MORE_PROCESSING_REQUIRED; + } + + } else { + + // + // Set status for successful request + // + fdoData->LoggedTURFailureSinceLastIO = FALSE; + ClasspPerfIncrementSuccessfulIo(fdoExtension); + status = STATUS_SUCCESS; + } // end if (SRB_STATUS(srb->SrbStatus) == SRB_STATUS_SUCCESS) + + + // + // ensure we have returned some info, and it matches what the + // original request wanted for PAGING operations only + // + + if ((NT_SUCCESS(status)) && TEST_FLAG(Irp->Flags, IRP_PAGING_IO)) { + ASSERT(Irp->IoStatus.Information != 0); + ASSERT(irpStack->Parameters.Read.Length == Irp->IoStatus.Information); + } + + // + // remember if the caller wanted to skip calling IoStartNextPacket. + // for legacy reasons, we cannot call IoStartNextPacket for IoDeviceControl + // calls. this setting only affects device objects with StartIo routines. + // + + callStartNextPacket = !TEST_FLAG(srb->SrbFlags, SRB_FLAGS_DONT_START_NEXT_PACKET); + if (irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL) { + callStartNextPacket = FALSE; + } + + // + // Free the srb + // + + if(!TEST_FLAG(srb->SrbFlags, SRB_CLASS_FLAGS_PERSISTANT)) { + + if (PORT_ALLOCATED_SENSE(fdoExtension, srb)) { + FREE_PORT_ALLOCATED_SENSE_BUFFER(fdoExtension, srb); + } + + if (fdoExtension->CommonExtension.IsSrbLookasideListInitialized){ + ClassFreeOrReuseSrb(fdoExtension, srb); + } + else { + DBGWARN(("ClassIoComplete is freeing an SRB (possibly) on behalf of another driver.")); + ExFreePool(srb); + } + + } else { + + DebugPrint((2, "ClassIoComplete: Not Freeing srb @ %p because " + "SRB_CLASS_FLAGS_PERSISTANT set\n", srb)); + if (PORT_ALLOCATED_SENSE(fdoExtension, srb)) { + DebugPrint((2, "ClassIoComplete: Not Freeing sensebuffer @ %p " + " because SRB_CLASS_FLAGS_PERSISTANT set\n", + srb->SenseInfoBuffer)); + } + + } + + // + // Set status in completing IRP. + // + + Irp->IoStatus.Status = status; + + // + // Set the hard error if necessary. + // + + if (!NT_SUCCESS(status) && + IoIsErrorUserInduced(status) && + (Irp->Tail.Overlay.Thread != NULL) + ) { + + // + // Store DeviceObject for filesystem, and clear + // in IoStatus.Information field. + // + + IoSetHardErrorOrVerifyDevice(Irp, Fdo); + Irp->IoStatus.Information = 0; + } + + // + // If pending has be returned for this irp then mark the current stack as + // pending. + // + + if (Irp->PendingReturned) { + IoMarkIrpPending(Irp); + } + + if (fdoExtension->CommonExtension.DriverExtension->InitData.ClassStartIo) { + if (callStartNextPacket) { + KIRQL oldIrql; + KeRaiseIrql(DISPATCH_LEVEL, &oldIrql); + IoStartNextPacket(Fdo, FALSE); + KeLowerIrql(oldIrql); + } + } + + ClassReleaseRemoveLock(Fdo, Irp); + + return status; + +} // end ClassIoComplete() + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassSendSrbSynchronous() + +Routine Description: + + This routine is called by SCSI device controls to complete an + SRB and send it to the port driver synchronously (ie wait for + completion). The CDB is already completed along with the SRB CDB + size and request timeout value. + +Arguments: + + Fdo - Supplies the functional device object which represents the target. + + Srb - Supplies a partially initialized SRB. The SRB cannot come from zone. + + BufferAddress - Supplies the address of the buffer. + + BufferLength - Supplies the length in bytes of the buffer. + + WriteToDevice - Indicates the data should be transfer to the device. + +Return Value: + + NTSTATUS indicating the final results of the operation. + + If NT_SUCCESS(), then the amount of usable data is contained in the field + Srb->DataTransferLength + +--*/ +NTSTATUS +ClassSendSrbSynchronous( + PDEVICE_OBJECT Fdo, + PSCSI_REQUEST_BLOCK Srb, + PVOID BufferAddress, + ULONG BufferLength, + BOOLEAN WriteToDevice + ) +{ + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExtension->PrivateFdoData; + IO_STATUS_BLOCK ioStatus; + ULONG controlType; + PIRP irp; + PIO_STACK_LOCATION irpStack; + KEVENT event; + PUCHAR senseInfoBuffer; + ULONG retryCount = MAXIMUM_RETRIES; + NTSTATUS status; + BOOLEAN retry; + + // + // NOTE: This code is only pagable because we are not freezing + // the queue. Allowing the queue to be frozen from a pagable + // routine could leave the queue frozen as we try to page in + // the code to unfreeze the queue. The result would be a nice + // case of deadlock. Therefore, since we are unfreezing the + // queue regardless of the result, just set the NO_FREEZE_QUEUE + // flag in the SRB. + // + + ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); + ASSERT(fdoExtension->CommonExtension.IsFdo); + + // + // Write length to SRB. + // + + Srb->Length = sizeof(SCSI_REQUEST_BLOCK); + + // + // Set SCSI bus address. + // + + Srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + + // + // Enable auto request sense. + // + + Srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; + + // + // Sense buffer is in aligned nonpaged pool. + // + // + senseInfoBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + SENSE_BUFFER_SIZE, + '7CcS'); + + if (senseInfoBuffer == NULL) { + + DebugPrint((1, "ClassSendSrbSynchronous: Can't allocate request sense " + "buffer\n")); + return(STATUS_INSUFFICIENT_RESOURCES); + } + + Srb->SenseInfoBuffer = senseInfoBuffer; + Srb->DataBuffer = BufferAddress; + + // + // Start retries here. + // + +retry: + + // + // use fdoextension's flags by default. + // do not move out of loop, as the flag may change due to errors + // sending this command. + // + + Srb->SrbFlags = fdoExtension->SrbFlags; + + if(BufferAddress != NULL) { + if(WriteToDevice) { + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_DATA_OUT); + } else { + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_DATA_IN); + } + } + + // + // Initialize the QueueAction field. + // + + Srb->QueueAction = SRB_SIMPLE_TAG_REQUEST; + + // + // Disable synchronous transfer for these requests. + // Disable freezing the queue, since all we do is unfreeze it anyways. + // + + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_NO_QUEUE_FREEZE); + + // + // Set the event object to the unsignaled state. + // It will be used to signal request completion. + // + + KeInitializeEvent(&event, NotificationEvent, FALSE); + + // + // Build device I/O control request with METHOD_NEITHER data transfer. + // We'll queue a completion routine to cleanup the MDL's and such ourself. + // + + irp = IoAllocateIrp( + (CCHAR) (fdoExtension->CommonExtension.LowerDeviceObject->StackSize + 1), + FALSE); + + if(irp == NULL) { + ExFreePool(senseInfoBuffer); + DebugPrint((1, "ClassSendSrbSynchronous: Can't allocate Irp\n")); + return(STATUS_INSUFFICIENT_RESOURCES); + } + + // + // Get next stack location. + // + + irpStack = IoGetNextIrpStackLocation(irp); + + // + // Set up SRB for execute scsi request. Save SRB address in next stack + // for the port driver. + // + + irpStack->MajorFunction = IRP_MJ_SCSI; + irpStack->Parameters.Scsi.Srb = Srb; + + IoSetCompletionRoutine(irp, + ClasspSendSynchronousCompletion, + Srb, + TRUE, + TRUE, + TRUE); + + irp->UserIosb = &ioStatus; + irp->UserEvent = &event; + + if(BufferAddress) { + // + // Build an MDL for the data buffer and stick it into the irp. The + // completion routine will unlock the pages and free the MDL. + // + + irp->MdlAddress = IoAllocateMdl( BufferAddress, + BufferLength, + FALSE, + FALSE, + irp ); + if (irp->MdlAddress == NULL) { + ExFreePool(senseInfoBuffer); + Srb->SenseInfoBuffer = NULL; + IoFreeIrp( irp ); + DebugPrint((1, "ClassSendSrbSynchronous: Can't allocate MDL\n")); + return STATUS_INSUFFICIENT_RESOURCES; + } + + _SEH2_TRY { + + // + // the io manager unlocks these pages upon completion + // + + MmProbeAndLockPages( irp->MdlAddress, + KernelMode, + (WriteToDevice ? IoReadAccess : + IoWriteAccess)); + + } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { + status = _SEH2_GetExceptionCode(); + + ExFreePool(senseInfoBuffer); + Srb->SenseInfoBuffer = NULL; + IoFreeMdl(irp->MdlAddress); + IoFreeIrp(irp); + + DebugPrint((1, "ClassSendSrbSynchronous: Exception %lx " + "locking buffer\n", status)); + return status; + } _SEH2_END; + } + + // + // Set the transfer length. + // + + Srb->DataTransferLength = BufferLength; + + // + // Zero out status. + // + + Srb->ScsiStatus = Srb->SrbStatus = 0; + Srb->NextSrb = 0; + + // + // Set up IRP Address. + // + + Srb->OriginalRequest = irp; + + // + // Call the port driver with the request and wait for it to complete. + // + + status = IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, irp); + + if (status == STATUS_PENDING) { + KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); + status = ioStatus.Status; + } + + // + // Check that request completed without error. + // + + if (SRB_STATUS(Srb->SrbStatus) != SRB_STATUS_SUCCESS) { + + ULONG retryInterval; + + DBGTRACE(ClassDebugWarning, ("ClassSendSrbSynchronous - srb %ph failed (op=%s srbstat=%s(%xh), irpstat=%xh, sense=%s/%s/%s)", Srb, DBGGETSCSIOPSTR(Srb), DBGGETSRBSTATUSSTR(Srb), (ULONG)Srb->SrbStatus, status, DBGGETSENSECODESTR(Srb), DBGGETADSENSECODESTR(Srb), DBGGETADSENSEQUALIFIERSTR(Srb))); + + // + // assert that the queue is not frozen + // + + ASSERT(!TEST_FLAG(Srb->SrbStatus, SRB_STATUS_QUEUE_FROZEN)); + + // + // Update status and determine if request should be retried. + // + + retry = ClassInterpretSenseInfo(Fdo, + Srb, + IRP_MJ_SCSI, + 0, + MAXIMUM_RETRIES - retryCount, + &status, + &retryInterval); + + + if (retry) { + + if ((status == STATUS_DEVICE_NOT_READY && + ((PSENSE_DATA) senseInfoBuffer)->AdditionalSenseCode == + SCSI_ADSENSE_LUN_NOT_READY) || + (SRB_STATUS(Srb->SrbStatus) == SRB_STATUS_SELECTION_TIMEOUT)) { + + LARGE_INTEGER delay; + + // + // Delay for at least 2 seconds. + // + + if(retryInterval < 2) { + retryInterval = 2; + } + + delay.QuadPart = (LONGLONG)( - 10 * 1000 * (LONGLONG)1000 * retryInterval); + + // + // Stall for a while to let the device become ready + // + + KeDelayExecutionThread(KernelMode, FALSE, &delay); + + } + + // + // If retries are not exhausted then retry this operation. + // + + if (retryCount--) { + + if (PORT_ALLOCATED_SENSE(fdoExtension, Srb)) { + FREE_PORT_ALLOCATED_SENSE_BUFFER(fdoExtension, Srb); + } + + goto retry; + } + } + + } else { + fdoData->LoggedTURFailureSinceLastIO = FALSE; + status = STATUS_SUCCESS; + } + + // + // required even though we allocated our own, since the port driver may + // have allocated one also + // + + if (PORT_ALLOCATED_SENSE(fdoExtension, Srb)) { + FREE_PORT_ALLOCATED_SENSE_BUFFER(fdoExtension, Srb); + } + + Srb->SenseInfoBuffer = NULL; + ExFreePool(senseInfoBuffer); + + return status; +} + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassInterpretSenseInfo() + +Routine Description: + + This routine interprets the data returned from the SCSI + request sense. It determines the status to return in the + IRP and whether this request can be retried. + +Arguments: + + DeviceObject - Supplies the device object associated with this request. + + Srb - Supplies the scsi request block which failed. + + MajorFunctionCode - Supplies the function code to be used for logging. + + IoDeviceCode - Supplies the device code to be used for logging. + + Status - Returns the status for the request. + +Return Value: + + BOOLEAN TRUE: Drivers should retry this request. + FALSE: Drivers should not retry this request. + +--*/ +BOOLEAN +ClassInterpretSenseInfo( + IN PDEVICE_OBJECT Fdo, + IN PSCSI_REQUEST_BLOCK Srb, + IN UCHAR MajorFunctionCode, + IN ULONG IoDeviceCode, + IN ULONG RetryCount, + OUT NTSTATUS *Status, + OUT OPTIONAL ULONG *RetryInterval + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExtension->PrivateFdoData; + + PSENSE_DATA senseBuffer = Srb->SenseInfoBuffer; + + BOOLEAN retry = TRUE; + BOOLEAN logError = FALSE; + BOOLEAN unhandledError = FALSE; + BOOLEAN incrementErrorCount = FALSE; + + ULONG badSector = 0; + ULONG uniqueId = 0; + + NTSTATUS logStatus; + + ULONG readSector; + ULONG index; + + ULONG retryInterval = 0; + KIRQL oldIrql; + + + logStatus = -1; + + if(TEST_FLAG(Srb->SrbFlags, SRB_CLASS_FLAGS_PAGING)) { + + // + // Log anything remotely incorrect about paging i/o + // + + logError = TRUE; + uniqueId = 301; + logStatus = IO_WARNING_PAGING_FAILURE; + } + + // + // Check that request sense buffer is valid. + // + + ASSERT(fdoExtension->CommonExtension.IsFdo); + + + // + // must handle the SRB_STATUS_INTERNAL_ERROR case first, + // as it has all the flags set. + // + + if (SRB_STATUS(Srb->SrbStatus) == SRB_STATUS_INTERNAL_ERROR) { + + DebugPrint((ClassDebugSenseInfo, + "ClassInterpretSenseInfo: Internal Error code is %x\n", + Srb->InternalStatus)); + + retry = FALSE; + *Status = Srb->InternalStatus; + + } else if ((Srb->SrbStatus & SRB_STATUS_AUTOSENSE_VALID) && + (Srb->SenseInfoBufferLength >= + offsetof(SENSE_DATA, CommandSpecificInformation))) { + + // + // Zero the additional sense code and additional sense code qualifier + // if they were not returned by the device. + // + + readSector = senseBuffer->AdditionalSenseLength + + offsetof(SENSE_DATA, AdditionalSenseLength); + + if (readSector > Srb->SenseInfoBufferLength) { + readSector = Srb->SenseInfoBufferLength; + } + + if (readSector <= offsetof(SENSE_DATA, AdditionalSenseCode)) { + senseBuffer->AdditionalSenseCode = 0; + } + + if (readSector <= offsetof(SENSE_DATA, AdditionalSenseCodeQualifier)) { + senseBuffer->AdditionalSenseCodeQualifier = 0; + } + + DebugPrint((ClassDebugSenseInfo, + "ClassInterpretSenseInfo: Error code is %x\n", + senseBuffer->ErrorCode)); + DebugPrint((ClassDebugSenseInfo, + "ClassInterpretSenseInfo: Sense key is %x\n", + senseBuffer->SenseKey)); + DebugPrint((ClassDebugSenseInfo, + "ClassInterpretSenseInfo: Additional sense code is %x\n", + senseBuffer->AdditionalSenseCode)); + DebugPrint((ClassDebugSenseInfo, + "ClassInterpretSenseInfo: Additional sense code qualifier " + "is %x\n", + senseBuffer->AdditionalSenseCodeQualifier)); + + + switch (senseBuffer->SenseKey & 0xf) { + + case SCSI_SENSE_NOT_READY: { + + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Device not ready\n")); + *Status = STATUS_DEVICE_NOT_READY; + + switch (senseBuffer->AdditionalSenseCode) { + + case SCSI_ADSENSE_LUN_NOT_READY: { + + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Lun not ready\n")); + + switch (senseBuffer->AdditionalSenseCodeQualifier) { + + case SCSI_SENSEQ_OPERATION_IN_PROGRESS: { + DEVICE_EVENT_BECOMING_READY notReady; + + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Operation In Progress\n")); + retryInterval = NOT_READY_RETRY_INTERVAL; + + RtlZeroMemory(¬Ready, sizeof(DEVICE_EVENT_BECOMING_READY)); + notReady.Version = 1; + notReady.Reason = 2; + notReady.Estimated100msToReady = retryInterval * 10; + ClasspSendNotification(fdoExtension, + &GUID_IO_DEVICE_BECOMING_READY, + sizeof(DEVICE_EVENT_BECOMING_READY), + ¬Ready); + + break; + } + + case SCSI_SENSEQ_BECOMING_READY: { + DEVICE_EVENT_BECOMING_READY notReady; + + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "In process of becoming ready\n")); + retryInterval = NOT_READY_RETRY_INTERVAL; + + RtlZeroMemory(¬Ready, sizeof(DEVICE_EVENT_BECOMING_READY)); + notReady.Version = 1; + notReady.Reason = 1; + notReady.Estimated100msToReady = retryInterval * 10; + ClasspSendNotification(fdoExtension, + &GUID_IO_DEVICE_BECOMING_READY, + sizeof(DEVICE_EVENT_BECOMING_READY), + ¬Ready); + break; + } + + case SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Long write in progress\n")); + retry = FALSE; + break; + } + + case SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Manual intervention required\n")); + *Status = STATUS_NO_MEDIA_IN_DEVICE; + retry = FALSE; + break; + } + + case SCSI_SENSEQ_FORMAT_IN_PROGRESS: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Format in progress\n")); + retry = FALSE; + break; + } + + case SCSI_SENSEQ_CAUSE_NOT_REPORTABLE: { + + if(!TEST_FLAG(fdoExtension->ScanForSpecialFlags, + CLASS_SPECIAL_CAUSE_NOT_REPORTABLE_HACK)) { + + DebugPrint((ClassDebugSenseInfo, + "ClassInterpretSenseInfo: " + "not ready, cause unknown\n")); + /* + Many non-WHQL certified drives (mostly CD-RW) return + this when they have no media instead of the obvious + choice of: + + SCSI_SENSE_NOT_READY/SCSI_ADSENSE_NO_MEDIA_IN_DEVICE + + These drives should not pass WHQL certification due + to this discrepency. + + */ + retry = FALSE; + break; + + } else { + + // + // Treat this as init command required and fall through. + // + } + } + + case SCSI_SENSEQ_INIT_COMMAND_REQUIRED: + default: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Initializing command required\n")); + + // + // This sense code/additional sense code + // combination may indicate that the device + // needs to be started. Send an start unit if this + // is a disk device. + // + + if(TEST_FLAG(fdoExtension->DeviceFlags, + DEV_SAFE_START_UNIT) && + !TEST_FLAG(Srb->SrbFlags, + SRB_CLASS_FLAGS_LOW_PRIORITY)) { + ClassSendStartUnit(Fdo); + } + break; + } + + + } // end switch (senseBuffer->AdditionalSenseCodeQualifier) + break; + } + + case SCSI_ADSENSE_NO_MEDIA_IN_DEVICE: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "No Media in device.\n")); + *Status = STATUS_NO_MEDIA_IN_DEVICE; + retry = FALSE; + + // + // signal MCN that there isn't any media in the device + // + if (!TEST_FLAG(Fdo->Characteristics, FILE_REMOVABLE_MEDIA)) { + DebugPrint((ClassDebugError, "ClassInterpretSenseInfo: " + "No Media in a non-removable device %p\n", + Fdo)); + } + ClassSetMediaChangeState(fdoExtension, MediaNotPresent, FALSE); + + break; + } + } // end switch (senseBuffer->AdditionalSenseCode) + + break; + } // end SCSI_SENSE_NOT_READY + + case SCSI_SENSE_DATA_PROTECT: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Media write protected\n")); + *Status = STATUS_MEDIA_WRITE_PROTECTED; + retry = FALSE; + break; + } // end SCSI_SENSE_DATA_PROTECT + + case SCSI_SENSE_MEDIUM_ERROR: { + DebugPrint((ClassDebugSenseInfo,"ClassInterpretSenseInfo: " + "Medium Error (bad block)\n")); + *Status = STATUS_DEVICE_DATA_ERROR; + + retry = FALSE; + logError = TRUE; + uniqueId = 256; + logStatus = IO_ERR_BAD_BLOCK; + + // + // Check if this error is due to unknown format + // + if (senseBuffer->AdditionalSenseCode == SCSI_ADSENSE_INVALID_MEDIA){ + + switch (senseBuffer->AdditionalSenseCodeQualifier) { + + case SCSI_SENSEQ_UNKNOWN_FORMAT: { + + *Status = STATUS_UNRECOGNIZED_MEDIA; + + // + // Log error only if this is a paging request + // + if(!TEST_FLAG(Srb->SrbFlags, SRB_CLASS_FLAGS_PAGING)) { + logError = FALSE; + } + break; + } + + case SCSI_SENSEQ_CLEANING_CARTRIDGE_INSTALLED: { + + *Status = STATUS_CLEANER_CARTRIDGE_INSTALLED; + logError = FALSE; + break; + + } + default: { + break; + } + } // end switch AdditionalSenseCodeQualifier + + } // end SCSI_ADSENSE_INVALID_MEDIA + + break; + + } // end SCSI_SENSE_MEDIUM_ERROR + + case SCSI_SENSE_HARDWARE_ERROR: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Hardware error\n")); + *Status = STATUS_IO_DEVICE_ERROR; + logError = TRUE; + uniqueId = 257; + logStatus = IO_ERR_CONTROLLER_ERROR; + break; + } // end SCSI_SENSE_HARDWARE_ERROR + + case SCSI_SENSE_ILLEGAL_REQUEST: { + + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Illegal SCSI request\n")); + *Status = STATUS_INVALID_DEVICE_REQUEST; + retry = FALSE; + + switch (senseBuffer->AdditionalSenseCode) { + + case SCSI_ADSENSE_ILLEGAL_COMMAND: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Illegal command\n")); + break; + } + + case SCSI_ADSENSE_ILLEGAL_BLOCK: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Illegal block address\n")); + *Status = STATUS_NONEXISTENT_SECTOR; + break; + } + + case SCSI_ADSENSE_INVALID_LUN: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Invalid LUN\n")); + *Status = STATUS_NO_SUCH_DEVICE; + break; + } + + case SCSI_ADSENSE_MUSIC_AREA: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Music area\n")); + break; + } + + case SCSI_ADSENSE_DATA_AREA: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Data area\n")); + break; + } + + case SCSI_ADSENSE_VOLUME_OVERFLOW: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Volume overflow\n")); + break; + } + + case SCSI_ADSENSE_COPY_PROTECTION_FAILURE: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Copy protection failure\n")); + + *Status = STATUS_COPY_PROTECTION_FAILURE; + + switch (senseBuffer->AdditionalSenseCodeQualifier) { + case SCSI_SENSEQ_AUTHENTICATION_FAILURE: + DebugPrint((ClassDebugSenseInfo, + "ClassInterpretSenseInfo: " + "Authentication failure\n")); + *Status = STATUS_CSS_AUTHENTICATION_FAILURE; + break; + case SCSI_SENSEQ_KEY_NOT_PRESENT: + DebugPrint((ClassDebugSenseInfo, + "ClassInterpretSenseInfo: " + "Key not present\n")); + *Status = STATUS_CSS_KEY_NOT_PRESENT; + break; + case SCSI_SENSEQ_KEY_NOT_ESTABLISHED: + DebugPrint((ClassDebugSenseInfo, + "ClassInterpretSenseInfo: " + "Key not established\n")); + *Status = STATUS_CSS_KEY_NOT_ESTABLISHED; + break; + case SCSI_SENSEQ_READ_OF_SCRAMBLED_SECTOR_WITHOUT_AUTHENTICATION: + DebugPrint((ClassDebugSenseInfo, + "ClassInterpretSenseInfo: " + "Read of scrambled sector w/o " + "authentication\n")); + *Status = STATUS_CSS_SCRAMBLED_SECTOR; + break; + case SCSI_SENSEQ_MEDIA_CODE_MISMATCHED_TO_LOGICAL_UNIT: + DebugPrint((ClassDebugSenseInfo, + "ClassInterpretSenseInfo: " + "Media region does not logical unit " + "region\n")); + *Status = STATUS_CSS_REGION_MISMATCH; + break; + case SCSI_SENSEQ_LOGICAL_UNIT_RESET_COUNT_ERROR: + DebugPrint((ClassDebugSenseInfo, + "ClassInterpretSenseInfo: " + "Region set error -- region may " + "be permanent\n")); + *Status = STATUS_CSS_RESETS_EXHAUSTED; + break; + } // end switch of ASCQ for COPY_PROTECTION_FAILURE + + break; + } + + + case SCSI_ADSENSE_INVALID_CDB: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Invalid CDB\n")); + + // + // Note: the retry interval is not typically used. + // it is set here only because a ClassErrorHandler + // cannot set the retryInterval, and the error may + // require a few commands to be sent to clear whatever + // caused this condition (i.e. disk clears the write + // cache, requiring at least two commands) + // + // hopefully, this shortcoming can be changed for + // blackcomb. + // + + retryInterval = 3; + break; + } + + } // end switch (senseBuffer->AdditionalSenseCode) + + break; + } // end SCSI_SENSE_ILLEGAL_REQUEST + + case SCSI_SENSE_UNIT_ATTENTION: { + + PVPB vpb; + ULONG count; + + // + // A media change may have occured so increment the change + // count for the physical device + // + + count = InterlockedIncrement(&fdoExtension->MediaChangeCount); + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Media change count for device %d incremented to %#lx\n", + fdoExtension->DeviceNumber, count)); + + + switch (senseBuffer->AdditionalSenseCode) { + case SCSI_ADSENSE_MEDIUM_CHANGED: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Media changed\n")); + + if (!TEST_FLAG(Fdo->Characteristics, FILE_REMOVABLE_MEDIA)) { + DebugPrint((ClassDebugError, "ClassInterpretSenseInfo: " + "Media Changed on non-removable device %p\n", + Fdo)); + } + ClassSetMediaChangeState(fdoExtension, MediaPresent, FALSE); + break; + } + + case SCSI_ADSENSE_BUS_RESET: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Bus reset\n")); + break; + } + + case SCSI_ADSENSE_OPERATOR_REQUEST: { + switch (senseBuffer->AdditionalSenseCodeQualifier) { + + case SCSI_SENSEQ_MEDIUM_REMOVAL: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Ejection request received!\n")); + ClassSendEjectionNotification(fdoExtension); + break; + } + + case SCSI_SENSEQ_WRITE_PROTECT_ENABLE: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Operator selected write permit?! " + "(unsupported!)\n")); + break; + } + + case SCSI_SENSEQ_WRITE_PROTECT_DISABLE: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Operator selected write protect?! " + "(unsupported!)\n")); + break; + } + + } + } + + default: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Unit attention\n")); + break; + } + + } // end switch (senseBuffer->AdditionalSenseCode) + + if (TEST_FLAG(Fdo->Characteristics, FILE_REMOVABLE_MEDIA)) + { + // + // TODO : Is the media lockable? + // + + if ((ClassGetVpb(Fdo) != NULL) && (ClassGetVpb(Fdo)->Flags & VPB_MOUNTED)) + { + // + // Set bit to indicate that media may have changed + // and volume needs verification. + // + + SET_FLAG(Fdo->Flags, DO_VERIFY_VOLUME); + + *Status = STATUS_VERIFY_REQUIRED; + retry = FALSE; + } + } + else + { + *Status = STATUS_IO_DEVICE_ERROR; + } + + break; + + } // end SCSI_SENSE_UNIT_ATTENTION + + case SCSI_SENSE_ABORTED_COMMAND: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Command aborted\n")); + *Status = STATUS_IO_DEVICE_ERROR; + retryInterval = 1; + break; + } // end SCSI_SENSE_ABORTED_COMMAND + + case SCSI_SENSE_BLANK_CHECK: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Media blank check\n")); + retry = FALSE; + *Status = STATUS_NO_DATA_DETECTED; + break; + } // end SCSI_SENSE_BLANK_CHECK + + case SCSI_SENSE_RECOVERED_ERROR: { + + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Recovered error\n")); + *Status = STATUS_SUCCESS; + retry = FALSE; + logError = TRUE; + uniqueId = 258; + + switch(senseBuffer->AdditionalSenseCode) { + case SCSI_ADSENSE_SEEK_ERROR: + case SCSI_ADSENSE_TRACK_ERROR: { + logStatus = IO_ERR_SEEK_ERROR; + break; + } + + case SCSI_ADSENSE_REC_DATA_NOECC: + case SCSI_ADSENSE_REC_DATA_ECC: { + logStatus = IO_RECOVERED_VIA_ECC; + break; + } + + case SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED: { + UCHAR wmiEventData[5]; + + *((PULONG)wmiEventData) = sizeof(UCHAR); + wmiEventData[sizeof(ULONG)] = senseBuffer->AdditionalSenseCodeQualifier; + + // + // Don't log another eventlog if we have already logged once + // NOTE: this should have been interlocked, but the structure + // was publicly defined to use a BOOLEAN (char). Since + // media only reports these errors once per X minutes, + // the potential race condition is nearly non-existant. + // the worst case is duplicate log entries, so ignore. + // + + if (fdoExtension->FailurePredicted == 0) { + logError = TRUE; + } + fdoExtension->FailurePredicted = TRUE; + fdoExtension->FailureReason = senseBuffer->AdditionalSenseCodeQualifier; + logStatus = IO_WRN_FAILURE_PREDICTED; + + ClassNotifyFailurePredicted(fdoExtension, + (PUCHAR)&wmiEventData, + sizeof(wmiEventData), + 0, + 4, + Srb->PathId, + Srb->TargetId, + Srb->Lun); + break; + } + + default: { + logStatus = IO_ERR_CONTROLLER_ERROR; + break; + } + + } // end switch(senseBuffer->AdditionalSenseCode) + + if (senseBuffer->IncorrectLength) { + + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Incorrect length detected.\n")); + *Status = STATUS_INVALID_BLOCK_LENGTH ; + } + + break; + } // end SCSI_SENSE_RECOVERED_ERROR + + case SCSI_SENSE_NO_SENSE: { + + // + // Check other indicators. + // + + if (senseBuffer->IncorrectLength) { + + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Incorrect length detected.\n")); + *Status = STATUS_INVALID_BLOCK_LENGTH ; + retry = FALSE; + + } else { + + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "No specific sense key\n")); + *Status = STATUS_IO_DEVICE_ERROR; + retry = TRUE; + } + + break; + } // end SCSI_SENSE_NO_SENSE + + default: { + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Unrecognized sense code\n")); + *Status = STATUS_IO_DEVICE_ERROR; + break; + } + + } // end switch (senseBuffer->SenseKey & 0xf) + + // + // Try to determine the bad sector from the inquiry data. + // + + if ((((PCDB)Srb->Cdb)->CDB10.OperationCode == SCSIOP_READ || + ((PCDB)Srb->Cdb)->CDB10.OperationCode == SCSIOP_VERIFY || + ((PCDB)Srb->Cdb)->CDB10.OperationCode == SCSIOP_WRITE)) { + + for (index = 0; index < 4; index++) { + badSector = (badSector << 8) | senseBuffer->Information[index]; + } + + readSector = 0; + for (index = 0; index < 4; index++) { + readSector = (readSector << 8) | Srb->Cdb[index+2]; + } + + index = (((PCDB)Srb->Cdb)->CDB10.TransferBlocksMsb << 8) | + ((PCDB)Srb->Cdb)->CDB10.TransferBlocksLsb; + + // + // Make sure the bad sector is within the read sectors. + // + + if (!(badSector >= readSector && badSector < readSector + index)) { + badSector = readSector; + } + } + + } else { + + // + // Request sense buffer not valid. No sense information + // to pinpoint the error. Return general request fail. + // + + DebugPrint((ClassDebugSenseInfo, "ClassInterpretSenseInfo: " + "Request sense info not valid. SrbStatus %2x\n", + SRB_STATUS(Srb->SrbStatus))); + retry = TRUE; + + switch (SRB_STATUS(Srb->SrbStatus)) { + case SRB_STATUS_INVALID_LUN: + case SRB_STATUS_INVALID_TARGET_ID: + case SRB_STATUS_NO_DEVICE: + case SRB_STATUS_NO_HBA: + case SRB_STATUS_INVALID_PATH_ID: { + *Status = STATUS_NO_SUCH_DEVICE; + retry = FALSE; + break; + } + + case SRB_STATUS_COMMAND_TIMEOUT: + case SRB_STATUS_TIMEOUT: { + + // + // Update the error count for the device. + // + + incrementErrorCount = TRUE; + *Status = STATUS_IO_TIMEOUT; + break; + } + + case SRB_STATUS_ABORTED: { + + // + // Update the error count for the device. + // + + incrementErrorCount = TRUE; + *Status = STATUS_IO_TIMEOUT; + retryInterval = 1; + break; + } + + + case SRB_STATUS_SELECTION_TIMEOUT: { + logError = TRUE; + logStatus = IO_ERR_NOT_READY; + uniqueId = 260; + *Status = STATUS_DEVICE_NOT_CONNECTED; + retry = FALSE; + break; + } + + case SRB_STATUS_DATA_OVERRUN: { + *Status = STATUS_DATA_OVERRUN; + retry = FALSE; + break; + } + + case SRB_STATUS_PHASE_SEQUENCE_FAILURE: { + + // + // Update the error count for the device. + // + + incrementErrorCount = TRUE; + *Status = STATUS_IO_DEVICE_ERROR; + + // + // If there was phase sequence error then limit the number of + // retries. + // + + if (RetryCount > 1 ) { + retry = FALSE; + } + + break; + } + + case SRB_STATUS_REQUEST_FLUSHED: { + + // + // If the status needs verification bit is set. Then set + // the status to need verification and no retry; otherwise, + // just retry the request. + // + + if (TEST_FLAG(Fdo->Flags, DO_VERIFY_VOLUME)) { + + *Status = STATUS_VERIFY_REQUIRED; + retry = FALSE; + + } else { + *Status = STATUS_IO_DEVICE_ERROR; + } + + break; + } + + case SRB_STATUS_INVALID_REQUEST: { + *Status = STATUS_INVALID_DEVICE_REQUEST; + retry = FALSE; + break; + } + + case SRB_STATUS_UNEXPECTED_BUS_FREE: + case SRB_STATUS_PARITY_ERROR: + + // + // Update the error count for the device + // and fall through to below + // + + incrementErrorCount = TRUE; + + case SRB_STATUS_BUS_RESET: { + *Status = STATUS_IO_DEVICE_ERROR; + break; + } + + case SRB_STATUS_ERROR: { + + *Status = STATUS_IO_DEVICE_ERROR; + if (Srb->ScsiStatus == 0) { + + // + // This is some strange return code. Update the error + // count for the device. + // + + incrementErrorCount = TRUE; + + } if (Srb->ScsiStatus == SCSISTAT_BUSY) { + + *Status = STATUS_DEVICE_NOT_READY; + + } if (Srb->ScsiStatus == SCSISTAT_RESERVATION_CONFLICT) { + + *Status = STATUS_DEVICE_BUSY; + retry = FALSE; + logError = FALSE; + + } + + break; + } + + default: { + logError = TRUE; + logStatus = IO_ERR_CONTROLLER_ERROR; + uniqueId = 259; + *Status = STATUS_IO_DEVICE_ERROR; + unhandledError = TRUE; + break; + } + + } + + // + // NTRAID #183546 - if we support GESN subtype NOT_READY events, and + // we know from a previous poll when the device will be ready (ETA) + // we should delay the retry more appropriately than just guessing. + // + /* + if (fdoExtension->MediaChangeDetectionInfo && + fdoExtension->MediaChangeDetectionInfo->Gesn.Supported && + TEST_FLAG(fdoExtension->MediaChangeDetectionInfo->Gesn.EventMask, + NOTIFICATION_DEVICE_BUSY_CLASS_MASK) + ) { + // check if Gesn.ReadyTime if greater than current tick count + // if so, delay that long (from 1 to 30 seconds max?) + // else, leave the guess of time alone. + } + */ + + } + + if (incrementErrorCount) { + + // + // if any error count occurred, delay the retry of this io by + // at least one second, if caller supports it. + // + + if (retryInterval == 0) { + retryInterval = 1; + } + ClasspPerfIncrementErrorCount(fdoExtension); + } + + // + // If there is a class specific error handler call it. + // + + if (fdoExtension->CommonExtension.DevInfo->ClassError != NULL) { + + fdoExtension->CommonExtension.DevInfo->ClassError(Fdo, + Srb, + Status, + &retry); + } + + // + // If the caller wants to know the suggested retry interval tell them. + // + + if(ARGUMENT_PRESENT(RetryInterval)) { + *RetryInterval = retryInterval; + } + + + /* + * LOG the error: + * Always log the error in our internal log. + * If logError is set, also log the error in the system log. + */ + { + ULONG totalSize; + ULONG senseBufferSize = 0; + IO_ERROR_LOG_PACKET staticErrLogEntry = {0}; + CLASS_ERROR_LOG_DATA staticErrLogData = {0}; + + // + // Calculate the total size of the error log entry. + // add to totalSize in the order that they are used. + // the advantage to calculating all the sizes here is + // that we don't have to do a bunch of extraneous checks + // later on in this code path. + // + totalSize = sizeof(IO_ERROR_LOG_PACKET) // required + - sizeof(ULONG) // struct includes one ULONG + + sizeof(CLASS_ERROR_LOG_DATA);// struct for ease + + // + // also save any available extra sense data, up to the maximum errlog + // packet size . WMI should be used for real-time analysis. + // the event log should only be used for post-mortem debugging. + // + if (TEST_FLAG(Srb->SrbStatus, SRB_STATUS_AUTOSENSE_VALID)) { + ULONG validSenseBytes; + BOOLEAN validSense; + + // + // make sure we can at least access the AdditionalSenseLength field + // + validSense = RTL_CONTAINS_FIELD(senseBuffer, + Srb->SenseInfoBufferLength, + AdditionalSenseLength); + if (validSense) { + + // + // if extra info exists, copy the maximum amount of available + // sense data that is safe into the the errlog. + // + validSenseBytes = senseBuffer->AdditionalSenseLength + + offsetof(SENSE_DATA, AdditionalSenseLength); + + // + // this is invalid because it causes overflow! + // whoever sent this type of request would cause + // a system crash. + // + ASSERT(validSenseBytes < MAX_ADDITIONAL_SENSE_BYTES); + + // + // set to save the most sense buffer possible + // + senseBufferSize = max(validSenseBytes, sizeof(SENSE_DATA)); + senseBufferSize = min(senseBufferSize, Srb->SenseInfoBufferLength); + } else { + // + // it's smaller than required to read the total number of + // valid bytes, so just use the SenseInfoBufferLength field. + // + senseBufferSize = Srb->SenseInfoBufferLength; + } + + /* + * Bump totalSize by the number of extra senseBuffer bytes + * (beyond the default sense buffer within CLASS_ERROR_LOG_DATA). + * Make sure to never allocate more than ERROR_LOG_MAXIMUM_SIZE. + */ + if (senseBufferSize > sizeof(SENSE_DATA)){ + totalSize += senseBufferSize-sizeof(SENSE_DATA); + if (totalSize > ERROR_LOG_MAXIMUM_SIZE){ + senseBufferSize -= totalSize-ERROR_LOG_MAXIMUM_SIZE; + totalSize = ERROR_LOG_MAXIMUM_SIZE; + } + } + } + + // + // If we've used up all of our retry attempts, set the final status to + // reflect the appropriate result. + // + if (retry && RetryCount < MAXIMUM_RETRIES) { + staticErrLogEntry.FinalStatus = STATUS_SUCCESS; + staticErrLogData.ErrorRetried = TRUE; + } else { + staticErrLogEntry.FinalStatus = *Status; + } + if (TEST_FLAG(Srb->SrbFlags, SRB_CLASS_FLAGS_PAGING)) { + staticErrLogData.ErrorPaging = TRUE; + } + if (unhandledError) { + staticErrLogData.ErrorUnhandled = TRUE; + } + + // + // Calculate the device offset if there is a geometry. + // + staticErrLogEntry.DeviceOffset.QuadPart = (LONGLONG)badSector; + staticErrLogEntry.DeviceOffset.QuadPart *= (LONGLONG)fdoExtension->DiskGeometry.BytesPerSector; + if (logStatus == -1){ + staticErrLogEntry.ErrorCode = STATUS_IO_DEVICE_ERROR; + } else { + staticErrLogEntry.ErrorCode = logStatus; + } + + /* + * The dump data follows the IO_ERROR_LOG_PACKET, + * with the first ULONG of dump data inside the packet. + */ + staticErrLogEntry.DumpDataSize = (USHORT)totalSize - sizeof(IO_ERROR_LOG_PACKET) + sizeof(ULONG); + + staticErrLogEntry.SequenceNumber = 0; + staticErrLogEntry.MajorFunctionCode = MajorFunctionCode; + staticErrLogEntry.IoControlCode = IoDeviceCode; + staticErrLogEntry.RetryCount = (UCHAR) RetryCount; + staticErrLogEntry.UniqueErrorValue = uniqueId; + + KeQueryTickCount(&staticErrLogData.TickCount); + staticErrLogData.PortNumber = (ULONG)-1; + + /* + * Save the entire contents of the SRB. + */ + staticErrLogData.Srb = *Srb; + + /* + * For our private log, save just the default length of the SENSE_DATA. + */ + if (senseBufferSize != 0){ + RtlCopyMemory(&staticErrLogData.SenseData, senseBuffer, min(senseBufferSize, sizeof(SENSE_DATA))); + } + + /* + * Save the error log in our context. + * We only save the default sense buffer length. + */ + KeAcquireSpinLock(&fdoData->SpinLock, &oldIrql); + fdoData->ErrorLogs[fdoData->ErrorLogNextIndex] = staticErrLogData; + fdoData->ErrorLogNextIndex++; + fdoData->ErrorLogNextIndex %= NUM_ERROR_LOG_ENTRIES; + KeReleaseSpinLock(&fdoData->SpinLock, oldIrql); + + /* + * If logError is set, also save this log in the system's error log. + * But make sure we don't log TUR failures over and over + * (e.g. if an external drive was switched off and we're still sending TUR's to it every second). + */ + if ((((PCDB)Srb->Cdb)->CDB10.OperationCode == SCSIOP_TEST_UNIT_READY) && logError){ + if (fdoData->LoggedTURFailureSinceLastIO){ + logError = FALSE; + } + else { + fdoData->LoggedTURFailureSinceLastIO = TRUE; + } + } + if (logError){ + PIO_ERROR_LOG_PACKET errorLogEntry; + PCLASS_ERROR_LOG_DATA errlogData; + + errorLogEntry = (PIO_ERROR_LOG_PACKET)IoAllocateErrorLogEntry(Fdo, (UCHAR)totalSize); + if (errorLogEntry){ + errlogData = (PCLASS_ERROR_LOG_DATA)errorLogEntry->DumpData; + + *errorLogEntry = staticErrLogEntry; + *errlogData = staticErrLogData; + + /* + * For the system log, copy as much of the sense buffer as possible. + */ + if (senseBufferSize != 0) { + RtlCopyMemory(&errlogData->SenseData, senseBuffer, senseBufferSize); + } + + /* + * Write the error log packet to the system error logging thread. + */ + IoWriteErrorLogEntry(errorLogEntry); + } + } + } + + return retry; + +} // end ClassInterpretSenseInfo() + + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassModeSense() + +Routine Description: + + This routine sends a mode sense command to a target ID and returns + when it is complete. + +Arguments: + + Fdo - Supplies the functional device object associated with this request. + + ModeSenseBuffer - Supplies a buffer to store the sense data. + + Length - Supplies the length in bytes of the mode sense buffer. + + PageMode - Supplies the page or pages of mode sense data to be retrived. + +Return Value: + + Length of the transferred data is returned. + +--*/ +ULONG ClassModeSense( IN PDEVICE_OBJECT Fdo, + IN PCHAR ModeSenseBuffer, + IN ULONG Length, + IN UCHAR PageMode) +{ + ULONG lengthTransferred = 0; + PMDL senseBufferMdl; + + PAGED_CODE(); + + senseBufferMdl = BuildDeviceInputMdl(ModeSenseBuffer, Length); + if (senseBufferMdl){ + + TRANSFER_PACKET *pkt = DequeueFreeTransferPacket(Fdo, TRUE); + if (pkt){ + KEVENT event; + NTSTATUS pktStatus; + IRP pseudoIrp = {0}; + + /* + * Store the number of packets servicing the irp (one) + * inside the original IRP. It will be used to counted down + * to zero when the packet completes. + * Initialize the original IRP's status to success. + * If the packet fails, we will set it to the error status. + */ + pseudoIrp.Tail.Overlay.DriverContext[0] = LongToPtr(1); + pseudoIrp.IoStatus.Status = STATUS_SUCCESS; + pseudoIrp.IoStatus.Information = 0; + pseudoIrp.MdlAddress = senseBufferMdl; + + /* + * Set this up as a SYNCHRONOUS transfer, submit it, + * and wait for the packet to complete. The result + * status will be written to the original irp. + */ + ASSERT(Length <= 0x0ff); + KeInitializeEvent(&event, SynchronizationEvent, FALSE); + SetupModeSenseTransferPacket(pkt, &event, ModeSenseBuffer, (UCHAR)Length, PageMode, &pseudoIrp); + SubmitTransferPacket(pkt); + KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); + + if (NT_SUCCESS(pseudoIrp.IoStatus.Status)){ + lengthTransferred = (ULONG)pseudoIrp.IoStatus.Information; + } + else { + /* + * This request can sometimes fail legitimately + * (e.g. when a SCSI device is attached but turned off) + * so this is not necessarily a device/driver bug. + */ + DBGTRACE(ClassDebugWarning, ("ClassModeSense on Fdo %ph failed with status %xh.", Fdo, pseudoIrp.IoStatus.Status)); + } + } + + FreeDeviceInputMdl(senseBufferMdl); + } + + return lengthTransferred; +} + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassFindModePage() + +Routine Description: + + This routine scans through the mode sense data and finds the requested + mode sense page code. + +Arguments: + ModeSenseBuffer - Supplies a pointer to the mode sense data. + + Length - Indicates the length of valid data. + + PageMode - Supplies the page mode to be searched for. + + Use6Byte - Indicates whether 6 or 10 byte mode sense was used. + +Return Value: + + A pointer to the the requested mode page. If the mode page was not found + then NULL is return. + +--*/ +PVOID +ClassFindModePage( + IN PCHAR ModeSenseBuffer, + IN ULONG Length, + IN UCHAR PageMode, + IN BOOLEAN Use6Byte + ) +{ + PUCHAR limit; + ULONG parameterHeaderLength; + PVOID result = NULL; + + limit = ModeSenseBuffer + Length; + parameterHeaderLength = (Use6Byte) ? sizeof(MODE_PARAMETER_HEADER) : sizeof(MODE_PARAMETER_HEADER10); + + if (Length >= parameterHeaderLength) { + + PMODE_PARAMETER_HEADER10 modeParam10; + ULONG blockDescriptorLength; + + /* + * Skip the mode select header and block descriptors. + */ + if (Use6Byte){ + blockDescriptorLength = ((PMODE_PARAMETER_HEADER) ModeSenseBuffer)->BlockDescriptorLength; + } + else { + modeParam10 = (PMODE_PARAMETER_HEADER10) ModeSenseBuffer; + blockDescriptorLength = modeParam10->BlockDescriptorLength[1]; + } + + ModeSenseBuffer += parameterHeaderLength + blockDescriptorLength; + + // + // ModeSenseBuffer now points at pages. Walk the pages looking for the + // requested page until the limit is reached. + // + + while (ModeSenseBuffer + + RTL_SIZEOF_THROUGH_FIELD(MODE_DISCONNECT_PAGE, PageLength) < limit) { + + if (((PMODE_DISCONNECT_PAGE) ModeSenseBuffer)->PageCode == PageMode) { + + /* + * found the mode page. make sure it's safe to touch it all + * before returning the pointer to caller + */ + + if (ModeSenseBuffer + ((PMODE_DISCONNECT_PAGE)ModeSenseBuffer)->PageLength > limit) { + /* + * Return NULL since the page is not safe to access in full + */ + result = NULL; + } + else { + result = ModeSenseBuffer; + } + break; + } + + // + // Advance to the next page which is 4-byte-aligned offset after this page. + // + ModeSenseBuffer += + ((PMODE_DISCONNECT_PAGE) ModeSenseBuffer)->PageLength + + RTL_SIZEOF_THROUGH_FIELD(MODE_DISCONNECT_PAGE, PageLength); + + } + } + + return result; +} // end ClassFindModePage() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassSendSrbAsynchronous() + +Routine Description: + + This routine takes a partially built Srb and an Irp and sends it down to + the port driver. + + This routine must be called with the remove lock held for the specified + Irp. + +Arguments: + + Fdo - Supplies the functional device object for the orginal request. + + Srb - Supplies a paritally build ScsiRequestBlock. In particular, the + CDB and the SRB timeout value must be filled in. The SRB must not be + allocated from zone. + + Irp - Supplies the requesting Irp. + + BufferAddress - Supplies a pointer to the buffer to be transfered. + + BufferLength - Supplies the length of data transfer. + + WriteToDevice - Indicates the data transfer will be from system memory to + device. + +Return Value: + + Returns STATUS_PENDING if the request is dispatched (since the + completion routine may change the irp's status value we cannot simply + return the value of the dispatch) + + or returns a status value to indicate why it failed. + +--*/ +NTSTATUS +ClassSendSrbAsynchronous( + PDEVICE_OBJECT Fdo, + PSCSI_REQUEST_BLOCK Srb, + PIRP Irp, + PVOID BufferAddress, + ULONG BufferLength, + BOOLEAN WriteToDevice + ) +{ + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PIO_STACK_LOCATION irpStack; + + ULONG savedFlags; + + // + // Write length to SRB. + // + + Srb->Length = sizeof(SCSI_REQUEST_BLOCK); + + // + // Set SCSI bus address. + // + + Srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + + // + // This is a violation of the SCSI spec but it is required for + // some targets. + // + + // Srb->Cdb[1] |= deviceExtension->Lun << 5; + + // + // Indicate auto request sense by specifying buffer and size. + // + + Srb->SenseInfoBuffer = fdoExtension->SenseData; + Srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; + Srb->DataBuffer = BufferAddress; + + // + // Save the class driver specific flags away. + // + + savedFlags = Srb->SrbFlags & SRB_FLAGS_CLASS_DRIVER_RESERVED; + + // + // Allow the caller to specify that they do not wish + // IoStartNextPacket() to be called in the completion routine. + // + + SET_FLAG(savedFlags, (Srb->SrbFlags & SRB_FLAGS_DONT_START_NEXT_PACKET)); + + if (BufferAddress != NULL) { + + // + // Build Mdl if necessary. + // + + if (Irp->MdlAddress == NULL) { + + if (IoAllocateMdl(BufferAddress, + BufferLength, + FALSE, + FALSE, + Irp) == NULL) { + + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + + // + // ClassIoComplete() would have free'd the srb + // + + if (PORT_ALLOCATED_SENSE(fdoExtension, Srb)) { + FREE_PORT_ALLOCATED_SENSE_BUFFER(fdoExtension, Srb); + } + ClassFreeOrReuseSrb(fdoExtension, Srb); + ClassReleaseRemoveLock(Fdo, Irp); + ClassCompleteRequest(Fdo, Irp, IO_NO_INCREMENT); + + return STATUS_INSUFFICIENT_RESOURCES; + } + + MmBuildMdlForNonPagedPool(Irp->MdlAddress); + + } else { + + // + // Make sure the buffer requested matches the MDL. + // + + ASSERT(BufferAddress == MmGetMdlVirtualAddress(Irp->MdlAddress)); + } + + // + // Set read flag. + // + + Srb->SrbFlags = WriteToDevice ? SRB_FLAGS_DATA_OUT : SRB_FLAGS_DATA_IN; + + } else { + + // + // Clear flags. + // + + Srb->SrbFlags = SRB_FLAGS_NO_DATA_TRANSFER; + } + + // + // Restore saved flags. + // + + SET_FLAG(Srb->SrbFlags, savedFlags); + + // + // Disable synchronous transfer for these requests. + // + + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + + // + // Set the transfer length. + // + + Srb->DataTransferLength = BufferLength; + + // + // Zero out status. + // + + Srb->ScsiStatus = Srb->SrbStatus = 0; + + Srb->NextSrb = 0; + + // + // Save a few parameters in the current stack location. + // + + irpStack = IoGetCurrentIrpStackLocation(Irp); + + // + // Save retry count in current Irp stack. + // + + irpStack->Parameters.Others.Argument4 = (PVOID)MAXIMUM_RETRIES; + + // + // Set up IoCompletion routine address. + // + + IoSetCompletionRoutine(Irp, ClassIoComplete, Srb, TRUE, TRUE, TRUE); + + // + // Get next stack location and + // set major function code. + // + + irpStack = IoGetNextIrpStackLocation(Irp); + + irpStack->MajorFunction = IRP_MJ_SCSI; + + // + // Save SRB address in next stack for port driver. + // + + irpStack->Parameters.Scsi.Srb = Srb; + + // + // Set up Irp Address. + // + + Srb->OriginalRequest = Irp; + + // + // Call the port driver to process the request. + // + + IoMarkIrpPending(Irp); + + IoCallDriver(fdoExtension->CommonExtension.LowerDeviceObject, Irp); + + return STATUS_PENDING; + +} // end ClassSendSrbAsynchronous() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassDeviceControlDispatch() + +Routine Description: + + The routine is the common class driver device control dispatch entry point. + This routine is invokes the device-specific drivers DeviceControl routine, + (which may call the Class driver's common DeviceControl routine). + +Arguments: + + DeviceObject - Supplies a pointer to the device object for this request. + + Irp - Supplies the Irp making the request. + +Return Value: + + Returns the status returned from the device-specific driver. + +--*/ +NTSTATUS +ClassDeviceControlDispatch( + PDEVICE_OBJECT DeviceObject, + PIRP Irp + ) +{ + + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + ULONG isRemoved; + + isRemoved = ClassAcquireRemoveLock(DeviceObject, Irp); + + if(isRemoved) { + + ClassReleaseRemoveLock(DeviceObject, Irp); + + Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST; + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + return STATUS_DEVICE_DOES_NOT_EXIST; + } + + // + // Call the class specific driver DeviceControl routine. + // If it doesn't handle it, it will call back into ClassDeviceControl. + // + + ASSERT(commonExtension->DevInfo->ClassDeviceControl); + + return commonExtension->DevInfo->ClassDeviceControl(DeviceObject,Irp); +} // end ClassDeviceControlDispatch() + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassDeviceControl() + +Routine Description: + + The routine is the common class driver device control dispatch function. + This routine is called by a class driver when it get an unrecognized + device control request. This routine will perform the correct action for + common requests such as lock media. If the device request is unknown it + passed down to the next level. + + This routine must be called with the remove lock held for the specified + irp. + +Arguments: + + DeviceObject - Supplies a pointer to the device object for this request. + + Irp - Supplies the Irp making the request. + +Return Value: + + Returns back a STATUS_PENDING or a completion status. + +--*/ +NTSTATUS +ClassDeviceControl( + PDEVICE_OBJECT DeviceObject, + PIRP Irp + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PIO_STACK_LOCATION nextStack = NULL; + + ULONG controlCode = irpStack->Parameters.DeviceIoControl.IoControlCode; + + PSCSI_REQUEST_BLOCK srb = NULL; + PCDB cdb = NULL; + + NTSTATUS status; + ULONG modifiedIoControlCode; + + // + // If this is a pass through I/O control, set the minor function code + // and device address and pass it to the port driver. + // + + if ((controlCode == IOCTL_SCSI_PASS_THROUGH) || + (controlCode == IOCTL_SCSI_PASS_THROUGH_DIRECT)) { + + PSCSI_PASS_THROUGH scsiPass; + + // + // Validiate the user buffer. + // + #if defined (_WIN64) + + if (IoIs32bitProcess(Irp)) { + + if (irpStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(SCSI_PASS_THROUGH32)){ + + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + + status = STATUS_INVALID_PARAMETER; + goto SetStatusAndReturn; + } + } + else + #endif + { + if (irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(SCSI_PASS_THROUGH)) { + + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + + status = STATUS_INVALID_PARAMETER; + goto SetStatusAndReturn; + } + } + + IoCopyCurrentIrpStackLocationToNext(Irp); + + nextStack = IoGetNextIrpStackLocation(Irp); + nextStack->MinorFunction = 1; + + ClassReleaseRemoveLock(DeviceObject, Irp); + + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + goto SetStatusAndReturn; + } + + Irp->IoStatus.Information = 0; + + switch (controlCode) { + + case IOCTL_MOUNTDEV_QUERY_UNIQUE_ID: { + + PMOUNTDEV_UNIQUE_ID uniqueId; + + if (!commonExtension->MountedDeviceInterfaceName.Buffer) { + status = STATUS_INVALID_PARAMETER; + break; + } + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(MOUNTDEV_UNIQUE_ID)) { + + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(MOUNTDEV_UNIQUE_ID); + break; + } + + uniqueId = Irp->AssociatedIrp.SystemBuffer; + uniqueId->UniqueIdLength = + commonExtension->MountedDeviceInterfaceName.Length; + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(USHORT) + uniqueId->UniqueIdLength) { + + status = STATUS_BUFFER_OVERFLOW; + Irp->IoStatus.Information = sizeof(MOUNTDEV_UNIQUE_ID); + break; + } + + RtlCopyMemory(uniqueId->UniqueId, + commonExtension->MountedDeviceInterfaceName.Buffer, + uniqueId->UniqueIdLength); + + status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(USHORT) + + uniqueId->UniqueIdLength; + break; + } + + case IOCTL_MOUNTDEV_QUERY_DEVICE_NAME: { + + PMOUNTDEV_NAME name; + + ASSERT(commonExtension->DeviceName.Buffer); + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(MOUNTDEV_NAME)) { + + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(MOUNTDEV_NAME); + break; + } + + name = Irp->AssociatedIrp.SystemBuffer; + name->NameLength = commonExtension->DeviceName.Length; + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(USHORT) + name->NameLength) { + + status = STATUS_BUFFER_OVERFLOW; + Irp->IoStatus.Information = sizeof(MOUNTDEV_NAME); + break; + } + + RtlCopyMemory(name->Name, commonExtension->DeviceName.Buffer, + name->NameLength); + + status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(USHORT) + name->NameLength; + break; + } + + case IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME: { + + PMOUNTDEV_SUGGESTED_LINK_NAME suggestedName; + WCHAR driveLetterNameBuffer[10]; + RTL_QUERY_REGISTRY_TABLE queryTable[2]; + PWSTR valueName; + UNICODE_STRING driveLetterName; + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(MOUNTDEV_SUGGESTED_LINK_NAME)) { + + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(MOUNTDEV_SUGGESTED_LINK_NAME); + break; + } + + valueName = ExAllocatePoolWithTag( + PagedPool, + commonExtension->DeviceName.Length + sizeof(WCHAR), + '8CcS'); + + if (!valueName) { + status = STATUS_INSUFFICIENT_RESOURCES; + break; + } + + RtlCopyMemory(valueName, commonExtension->DeviceName.Buffer, + commonExtension->DeviceName.Length); + valueName[commonExtension->DeviceName.Length/sizeof(WCHAR)] = 0; + + driveLetterName.Buffer = driveLetterNameBuffer; + driveLetterName.MaximumLength = 20; + driveLetterName.Length = 0; + + RtlZeroMemory(queryTable, 2*sizeof(RTL_QUERY_REGISTRY_TABLE)); + queryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | + RTL_QUERY_REGISTRY_DIRECT; + queryTable[0].Name = valueName; + queryTable[0].EntryContext = &driveLetterName; + + status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, + L"\\Registry\\Machine\\System\\DISK", + queryTable, NULL, NULL); + + if (!NT_SUCCESS(status)) { + ExFreePool(valueName); + break; + } + + if (driveLetterName.Length == 4 && + driveLetterName.Buffer[0] == '%' && + driveLetterName.Buffer[1] == ':') { + + driveLetterName.Buffer[0] = 0xFF; + + } else if (driveLetterName.Length != 4 || + driveLetterName.Buffer[0] < FirstDriveLetter || + driveLetterName.Buffer[0] > LastDriveLetter || + driveLetterName.Buffer[1] != ':') { + + status = STATUS_NOT_FOUND; + ExFreePool(valueName); + break; + } + + suggestedName = Irp->AssociatedIrp.SystemBuffer; + suggestedName->UseOnlyIfThereAreNoOtherLinks = TRUE; + suggestedName->NameLength = 28; + + Irp->IoStatus.Information = + FIELD_OFFSET(MOUNTDEV_SUGGESTED_LINK_NAME, Name) + 28; + + if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < + Irp->IoStatus.Information) { + + Irp->IoStatus.Information = + sizeof(MOUNTDEV_SUGGESTED_LINK_NAME); + status = STATUS_BUFFER_OVERFLOW; + ExFreePool(valueName); + break; + } + + RtlDeleteRegistryValue(RTL_REGISTRY_ABSOLUTE, + L"\\Registry\\Machine\\System\\DISK", + valueName); + + ExFreePool(valueName); + + RtlCopyMemory(suggestedName->Name, L"\\DosDevices\\", 24); + suggestedName->Name[12] = driveLetterName.Buffer[0]; + suggestedName->Name[13] = ':'; + + // + // NT_SUCCESS(status) based on RtlQueryRegistryValues + // + status = STATUS_SUCCESS; + + break; + } + + default: + status = STATUS_PENDING; + break; + } + + if (status != STATUS_PENDING) { + ClassReleaseRemoveLock(DeviceObject, Irp); + Irp->IoStatus.Status = status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return status; + } + + if (commonExtension->IsFdo){ + + PULONG_PTR function; + + srb = ExAllocatePoolWithTag(NonPagedPool, + sizeof(SCSI_REQUEST_BLOCK) + + (sizeof(ULONG_PTR) * 2), + '9CcS'); + + if (srb == NULL) { + + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + status = STATUS_INSUFFICIENT_RESOURCES; + goto SetStatusAndReturn; + } + + RtlZeroMemory(srb, sizeof(SCSI_REQUEST_BLOCK)); + + cdb = (PCDB)srb->Cdb; + + // + // Save the function code and the device object in the memory after + // the SRB. + // + + function = (PULONG_PTR) ((PSCSI_REQUEST_BLOCK) (srb + 1)); + *function = (ULONG_PTR) DeviceObject; + function++; + *function = (ULONG_PTR) controlCode; + + } else { + srb = NULL; + } + + // + // Change the device type to storage for the switch statement, but only + // if from a legacy device type + // + + if (((controlCode & 0xffff0000) == (IOCTL_DISK_BASE << 16)) || + ((controlCode & 0xffff0000) == (IOCTL_TAPE_BASE << 16)) || + ((controlCode & 0xffff0000) == (IOCTL_CDROM_BASE << 16)) + ) { + + modifiedIoControlCode = (controlCode & ~0xffff0000); + modifiedIoControlCode |= (IOCTL_STORAGE_BASE << 16); + + } else { + + modifiedIoControlCode = controlCode; + + } + + DBGTRACE(ClassDebugTrace, ("> ioctl %xh (%s)", modifiedIoControlCode, DBGGETIOCTLSTR(modifiedIoControlCode))); + + switch (modifiedIoControlCode) { + + case IOCTL_STORAGE_GET_HOTPLUG_INFO: { + + if (srb) { + ExFreePool(srb); + srb = NULL; + } + + if(irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(STORAGE_HOTPLUG_INFO)) { + + // + // Indicate unsuccessful status and no data transferred. + // + + Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(STORAGE_HOTPLUG_INFO); + + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + status = STATUS_BUFFER_TOO_SMALL; + + } else if(!commonExtension->IsFdo) { + + // + // Just forward this down and return + // + + IoCopyCurrentIrpStackLocationToNext(Irp); + + ClassReleaseRemoveLock(DeviceObject, Irp); + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + + } else { + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + PSTORAGE_HOTPLUG_INFO info; + + fdoExtension = (PFUNCTIONAL_DEVICE_EXTENSION)commonExtension; + info = Irp->AssociatedIrp.SystemBuffer; + + *info = fdoExtension->PrivateFdoData->HotplugInfo; + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(STORAGE_HOTPLUG_INFO); + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + status = STATUS_SUCCESS; + + } + break; + } + + case IOCTL_STORAGE_SET_HOTPLUG_INFO: { + + if (srb) + { + ExFreePool(srb); + srb = NULL; + } + + if (irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(STORAGE_HOTPLUG_INFO)) { + + // + // Indicate unsuccessful status and no data transferred. + // + + Irp->IoStatus.Status = STATUS_INFO_LENGTH_MISMATCH; + + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + status = STATUS_INFO_LENGTH_MISMATCH; + goto SetStatusAndReturn; + + } + + if(!commonExtension->IsFdo) { + + // + // Just forward this down and return + // + + IoCopyCurrentIrpStackLocationToNext(Irp); + + ClassReleaseRemoveLock(DeviceObject, Irp); + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + + } else { + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = (PFUNCTIONAL_DEVICE_EXTENSION)commonExtension; + PSTORAGE_HOTPLUG_INFO info = Irp->AssociatedIrp.SystemBuffer; + + status = STATUS_SUCCESS; + + if (info->Size != fdoExtension->PrivateFdoData->HotplugInfo.Size) + { + status = STATUS_INVALID_PARAMETER_1; + } + + if (info->MediaRemovable != fdoExtension->PrivateFdoData->HotplugInfo.MediaRemovable) + { + status = STATUS_INVALID_PARAMETER_2; + } + + if (info->MediaHotplug != fdoExtension->PrivateFdoData->HotplugInfo.MediaHotplug) + { + status = STATUS_INVALID_PARAMETER_3; + } + + if (info->WriteCacheEnableOverride != fdoExtension->PrivateFdoData->HotplugInfo.WriteCacheEnableOverride) + { + status = STATUS_INVALID_PARAMETER_5; + } + + if (NT_SUCCESS(status)) + { + fdoExtension->PrivateFdoData->HotplugInfo.DeviceHotplug = info->DeviceHotplug; + + // + // Store the user-defined override in the registry + // + + ClassSetDeviceParameter(fdoExtension, + CLASSP_REG_SUBKEY_NAME, + CLASSP_REG_REMOVAL_POLICY_VALUE_NAME, + (info->DeviceHotplug) ? RemovalPolicyExpectSurpriseRemoval : RemovalPolicyExpectOrderlyRemoval); + } + + Irp->IoStatus.Status = status; + + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + } + + break; + } + + case IOCTL_STORAGE_CHECK_VERIFY: + case IOCTL_STORAGE_CHECK_VERIFY2: { + + PIRP irp2 = NULL; + PIO_STACK_LOCATION newStack; + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = NULL; + + DebugPrint((1,"DeviceIoControl: Check verify\n")); + + // + // If a buffer for a media change count was provided, make sure it's + // big enough to hold the result + // + + if(irpStack->Parameters.DeviceIoControl.OutputBufferLength) { + + // + // If the buffer is too small to hold the media change count + // then return an error to the caller + // + + if(irpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(ULONG)) { + + DebugPrint((3,"DeviceIoControl: media count " + "buffer too small\n")); + + Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(ULONG); + + if(srb != NULL) { + ExFreePool(srb); + } + + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + + status = STATUS_BUFFER_TOO_SMALL; + goto SetStatusAndReturn; + + } + } + + if(!commonExtension->IsFdo) { + + // + // If this is a PDO then we should just forward the request down + // + ASSERT(!srb); + + IoCopyCurrentIrpStackLocationToNext(Irp); + + ClassReleaseRemoveLock(DeviceObject, Irp); + + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + + goto SetStatusAndReturn; + + } else { + + fdoExtension = DeviceObject->DeviceExtension; + + } + + if(irpStack->Parameters.DeviceIoControl.OutputBufferLength) { + + // + // The caller has provided a valid buffer. Allocate an additional + // irp and stick the CheckVerify completion routine on it. We will + // then send this down to the port driver instead of the irp the + // caller sent in + // + + DebugPrint((2,"DeviceIoControl: Check verify wants " + "media count\n")); + + // + // Allocate a new irp to send the TestUnitReady to the port driver + // + + irp2 = IoAllocateIrp((CCHAR) (DeviceObject->StackSize + 3), FALSE); + + if(irp2 == NULL) { + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + Irp->IoStatus.Information = 0; + ASSERT(srb); + ExFreePool(srb); + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + status = STATUS_INSUFFICIENT_RESOURCES; + goto SetStatusAndReturn; + + break; + } + + // + // Make sure to acquire the lock for the new irp. + // + + ClassAcquireRemoveLock(DeviceObject, irp2); + + irp2->Tail.Overlay.Thread = Irp->Tail.Overlay.Thread; + IoSetNextIrpStackLocation(irp2); + + // + // Set the top stack location and shove the master Irp into the + // top location + // + + newStack = IoGetCurrentIrpStackLocation(irp2); + newStack->Parameters.Others.Argument1 = Irp; + newStack->DeviceObject = DeviceObject; + + // + // Stick the check verify completion routine onto the stack + // and prepare the irp for the port driver + // + + IoSetCompletionRoutine(irp2, + ClassCheckVerifyComplete, + NULL, + TRUE, + TRUE, + TRUE); + + IoSetNextIrpStackLocation(irp2); + newStack = IoGetCurrentIrpStackLocation(irp2); + newStack->DeviceObject = DeviceObject; + newStack->MajorFunction = irpStack->MajorFunction; + newStack->MinorFunction = irpStack->MinorFunction; + + // + // Mark the master irp as pending - whether the lower level + // driver completes it immediately or not this should allow it + // to go all the way back up. + // + + IoMarkIrpPending(Irp); + + Irp = irp2; + + } + + // + // Test Unit Ready + // + + srb->CdbLength = 6; + cdb->CDB6GENERIC.OperationCode = SCSIOP_TEST_UNIT_READY; + + // + // Set timeout value. + // + + srb->TimeOutValue = fdoExtension->TimeOutValue; + + // + // If this was a CV2 then mark the request as low-priority so we don't + // spin up the drive just to satisfy it. + // + + if(controlCode == IOCTL_STORAGE_CHECK_VERIFY2) { + SET_FLAG(srb->SrbFlags, SRB_CLASS_FLAGS_LOW_PRIORITY); + } + + // + // Since this routine will always hand the request to the + // port driver if there isn't a data transfer to be done + // we don't have to worry about completing the request here + // on an error + // + + // + // This routine uses a completion routine so we don't want to release + // the remove lock until then. + // + + status = ClassSendSrbAsynchronous(DeviceObject, + srb, + Irp, + NULL, + 0, + FALSE); + + break; + } + + case IOCTL_STORAGE_MEDIA_REMOVAL: + case IOCTL_STORAGE_EJECTION_CONTROL: { + + PPREVENT_MEDIA_REMOVAL mediaRemoval = Irp->AssociatedIrp.SystemBuffer; + + DebugPrint((3, "DiskIoControl: ejection control\n")); + + if(srb) { + ExFreePool(srb); + } + + if(irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(PREVENT_MEDIA_REMOVAL)) { + + // + // Indicate unsuccessful status and no data transferred. + // + + Irp->IoStatus.Status = STATUS_INFO_LENGTH_MISMATCH; + + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + status = STATUS_INFO_LENGTH_MISMATCH; + goto SetStatusAndReturn; + } + + if(!commonExtension->IsFdo) { + + // + // Just forward this down and return + // + + IoCopyCurrentIrpStackLocationToNext(Irp); + + ClassReleaseRemoveLock(DeviceObject, Irp); + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + } + else { + + // i don't believe this assertion is valid. this is a request + // from user-mode, so they could request this for any device + // they want? also, we handle it properly. + // ASSERT(TEST_FLAG(DeviceObject->Characteristics, FILE_REMOVABLE_MEDIA)); + status = ClasspEjectionControl( + DeviceObject, + Irp, + ((modifiedIoControlCode == + IOCTL_STORAGE_EJECTION_CONTROL) ? SecureMediaLock : + SimpleMediaLock), + mediaRemoval->PreventMediaRemoval); + + Irp->IoStatus.Status = status; + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + } + + break; + } + + case IOCTL_STORAGE_MCN_CONTROL: { + + DebugPrint((3, "DiskIoControl: MCN control\n")); + + if(irpStack->Parameters.DeviceIoControl.InputBufferLength < + sizeof(PREVENT_MEDIA_REMOVAL)) { + + // + // Indicate unsuccessful status and no data transferred. + // + + Irp->IoStatus.Status = STATUS_INFO_LENGTH_MISMATCH; + Irp->IoStatus.Information = 0; + + if(srb) { + ExFreePool(srb); + } + + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + status = STATUS_INFO_LENGTH_MISMATCH; + goto SetStatusAndReturn; + } + + if(!commonExtension->IsFdo) { + + // + // Just forward this down and return + // + + if(srb) { + ExFreePool(srb); + } + + IoCopyCurrentIrpStackLocationToNext(Irp); + + ClassReleaseRemoveLock(DeviceObject, Irp); + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + + } else { + + // + // Call to the FDO - handle the ejection control. + // + + status = ClasspMcnControl(DeviceObject->DeviceExtension, + Irp, + srb); + } + goto SetStatusAndReturn; + } + + case IOCTL_STORAGE_RESERVE: + case IOCTL_STORAGE_RELEASE: { + + // + // Reserve logical unit. + // + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = NULL; + + if(!commonExtension->IsFdo) { + + IoCopyCurrentIrpStackLocationToNext(Irp); + + ClassReleaseRemoveLock(DeviceObject, Irp); + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + goto SetStatusAndReturn; + } else { + fdoExtension = DeviceObject->DeviceExtension; + } + + srb->CdbLength = 6; + + if(modifiedIoControlCode == IOCTL_STORAGE_RESERVE) { + cdb->CDB6GENERIC.OperationCode = SCSIOP_RESERVE_UNIT; + } else { + cdb->CDB6GENERIC.OperationCode = SCSIOP_RELEASE_UNIT; + } + + // + // Set timeout value. + // + + srb->TimeOutValue = fdoExtension->TimeOutValue; + + status = ClassSendSrbAsynchronous(DeviceObject, + srb, + Irp, + NULL, + 0, + FALSE); + + break; + } + + case IOCTL_STORAGE_EJECT_MEDIA: + case IOCTL_STORAGE_LOAD_MEDIA: + case IOCTL_STORAGE_LOAD_MEDIA2:{ + + // + // Eject media. + // + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = NULL; + + if(!commonExtension->IsFdo) { + + IoCopyCurrentIrpStackLocationToNext(Irp); + + ClassReleaseRemoveLock(DeviceObject, Irp); + + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + goto SetStatusAndReturn; + } else { + fdoExtension = DeviceObject->DeviceExtension; + } + + if(commonExtension->PagingPathCount != 0) { + + DebugPrint((1, "ClassDeviceControl: call to eject paging device - " + "failure\n")); + + status = STATUS_FILES_OPEN; + Irp->IoStatus.Status = status; + + Irp->IoStatus.Information = 0; + + if(srb) { + ExFreePool(srb); + } + + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + goto SetStatusAndReturn; + } + + // + // Synchronize with ejection control and ejection cleanup code as + // well as other eject/load requests. + // + + KeEnterCriticalRegion(); + KeWaitForSingleObject(&(fdoExtension->EjectSynchronizationEvent), + UserRequest, + UserMode, + FALSE, + NULL); + + if(fdoExtension->ProtectedLockCount != 0) { + + DebugPrint((1, "ClassDeviceControl: call to eject protected locked " + "device - failure\n")); + + status = STATUS_DEVICE_BUSY; + Irp->IoStatus.Status = status; + Irp->IoStatus.Information = 0; + + if(srb) { + ExFreePool(srb); + } + + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + + KeSetEvent(&fdoExtension->EjectSynchronizationEvent, + IO_NO_INCREMENT, + FALSE); + KeLeaveCriticalRegion(); + + goto SetStatusAndReturn; + } + + srb->CdbLength = 6; + + cdb->START_STOP.OperationCode = SCSIOP_START_STOP_UNIT; + cdb->START_STOP.LoadEject = 1; + + if(modifiedIoControlCode == IOCTL_STORAGE_EJECT_MEDIA) { + cdb->START_STOP.Start = 0; + } else { + cdb->START_STOP.Start = 1; + } + + // + // Set timeout value. + // + + srb->TimeOutValue = fdoExtension->TimeOutValue; + status = ClassSendSrbAsynchronous(DeviceObject, + srb, + Irp, + NULL, + 0, + FALSE); + + KeSetEvent(&fdoExtension->EjectSynchronizationEvent, IO_NO_INCREMENT, FALSE); + KeLeaveCriticalRegion(); + + break; + } + + case IOCTL_STORAGE_FIND_NEW_DEVICES: { + + if(srb) { + ExFreePool(srb); + } + + if(commonExtension->IsFdo) { + + IoInvalidateDeviceRelations( + ((PFUNCTIONAL_DEVICE_EXTENSION) commonExtension)->LowerPdo, + BusRelations); + + status = STATUS_SUCCESS; + Irp->IoStatus.Status = status; + + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + } + else { + + IoCopyCurrentIrpStackLocationToNext(Irp); + + ClassReleaseRemoveLock(DeviceObject, Irp); + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + } + break; + } + + case IOCTL_STORAGE_GET_DEVICE_NUMBER: { + + if(srb) { + ExFreePool(srb); + } + + if(irpStack->Parameters.DeviceIoControl.OutputBufferLength >= + sizeof(STORAGE_DEVICE_NUMBER)) { + + PSTORAGE_DEVICE_NUMBER deviceNumber = + Irp->AssociatedIrp.SystemBuffer; + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = + commonExtension->PartitionZeroExtension; + + deviceNumber->DeviceType = fdoExtension->CommonExtension.DeviceObject->DeviceType; + deviceNumber->DeviceNumber = fdoExtension->DeviceNumber; + deviceNumber->PartitionNumber = commonExtension->PartitionNumber; + + status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(STORAGE_DEVICE_NUMBER); + + } else { + status = STATUS_BUFFER_TOO_SMALL; + Irp->IoStatus.Information = sizeof(STORAGE_DEVICE_NUMBER); + } + + Irp->IoStatus.Status = status; + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + + break; + } + + default: { + + DebugPrint((4, "IoDeviceControl: Unsupported device IOCTL %x for %p\n", + controlCode, DeviceObject)); + + // + // Pass the device control to the next driver. + // + + if(srb) { + ExFreePool(srb); + } + + // + // Copy the Irp stack parameters to the next stack location. + // + + IoCopyCurrentIrpStackLocationToNext(Irp); + + ClassReleaseRemoveLock(DeviceObject, Irp); + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + break; + } + + } // end switch( ... + +SetStatusAndReturn: + + DBGTRACE(ClassDebugTrace, ("< ioctl %xh (%s): status %xh.", modifiedIoControlCode, DBGGETIOCTLSTR(modifiedIoControlCode), status)); + + return status; +} // end ClassDeviceControl() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassShutdownFlush() + +Routine Description: + + This routine is called for a shutdown and flush IRPs. These are sent by the + system before it actually shuts down or when the file system does a flush. + If it exists, the device-specific driver's routine will be invoked. If there + wasn't one specified, the Irp will be completed with an Invalid device request. + +Arguments: + + DriverObject - Pointer to device object to being shutdown by system. + + Irp - IRP involved. + +Return Value: + + NT Status + +--*/ +NTSTATUS +ClassShutdownFlush( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + + ULONG isRemoved; + + NTSTATUS status; + + isRemoved = ClassAcquireRemoveLock(DeviceObject, Irp); + + if(isRemoved) { + + ClassReleaseRemoveLock(DeviceObject, Irp); + + Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST; + + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + + return STATUS_DEVICE_DOES_NOT_EXIST; + } + + if (commonExtension->DevInfo->ClassShutdownFlush) { + + // + // Call the device-specific driver's routine. + // + + return commonExtension->DevInfo->ClassShutdownFlush(DeviceObject, Irp); + } + + // + // Device-specific driver doesn't support this. + // + + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; + + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + + return STATUS_INVALID_DEVICE_REQUEST; +} // end ClassShutdownFlush() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassCreateDeviceObject() + +Routine Description: + + This routine creates an object for the physical device specified and + sets up the deviceExtension's function pointers for each entry point + in the device-specific driver. + +Arguments: + + DriverObject - Pointer to driver object created by system. + + ObjectNameBuffer - Dir. name of the object to create. + + LowerDeviceObject - Pointer to the lower device object + + IsFdo - should this be an fdo or a pdo + + DeviceObject - Pointer to the device object pointer we will return. + +Return Value: + + NTSTATUS + +--*/ +NTSTATUS +ClassCreateDeviceObject( + IN PDRIVER_OBJECT DriverObject, + IN PCCHAR ObjectNameBuffer, + IN PDEVICE_OBJECT LowerDevice, + IN BOOLEAN IsFdo, + IN OUT PDEVICE_OBJECT *DeviceObject + ) +{ + BOOLEAN isPartitionable; + STRING ntNameString; + UNICODE_STRING ntUnicodeString; + NTSTATUS status, status2; + PDEVICE_OBJECT deviceObject = NULL; + + ULONG characteristics; + + PCLASS_DRIVER_EXTENSION + driverExtension = IoGetDriverObjectExtension(DriverObject, + CLASS_DRIVER_EXTENSION_KEY); + + PCLASS_DEV_INFO devInfo; + + PAGED_CODE(); + + *DeviceObject = NULL; + RtlInitUnicodeString(&ntUnicodeString, NULL); + + DebugPrint((2, "ClassCreateFdo: Create device object\n")); + + ASSERT(LowerDevice); + + // + // Make sure that if we're making PDO's we have an enumeration routine + // + + isPartitionable = (driverExtension->InitData.ClassEnumerateDevice != NULL); + + ASSERT(IsFdo || isPartitionable); + + // + // Grab the correct dev-info structure out of the init data + // + + if(IsFdo) { + devInfo = &(driverExtension->InitData.FdoData); + } else { + devInfo = &(driverExtension->InitData.PdoData); + } + + characteristics = devInfo->DeviceCharacteristics; + + if(ARGUMENT_PRESENT(ObjectNameBuffer)) { + DebugPrint((2, "ClassCreateFdo: Name is %s\n", ObjectNameBuffer)); + + RtlInitString(&ntNameString, ObjectNameBuffer); + + status = RtlAnsiStringToUnicodeString(&ntUnicodeString, &ntNameString, TRUE); + + if (!NT_SUCCESS(status)) { + + DebugPrint((1, + "ClassCreateFdo: Cannot convert string %s\n", + ObjectNameBuffer)); + + ntUnicodeString.Buffer = NULL; + return status; + } + } else { + DebugPrint((2, "ClassCreateFdo: Object will be unnamed\n")); + + if(IsFdo == FALSE) { + + // + // PDO's have to have some sort of name. + // + + SET_FLAG(characteristics, FILE_AUTOGENERATED_DEVICE_NAME); + } + + RtlInitUnicodeString(&ntUnicodeString, NULL); + } + + status = IoCreateDevice(DriverObject, + devInfo->DeviceExtensionSize, + &ntUnicodeString, + devInfo->DeviceType, + devInfo->DeviceCharacteristics, + FALSE, + &deviceObject); + + if (!NT_SUCCESS(status)) { + + DebugPrint((1, "ClassCreateFdo: Can not create device object %lx\n", + status)); + ASSERT(deviceObject == NULL); + + // + // buffer is not used any longer here. + // + + if (ntUnicodeString.Buffer != NULL) { + DebugPrint((1, "ClassCreateFdo: Freeing unicode name buffer\n")); + ExFreePool(ntUnicodeString.Buffer); + RtlInitUnicodeString(&ntUnicodeString, NULL); + } + + } else { + + PCOMMON_DEVICE_EXTENSION commonExtension = deviceObject->DeviceExtension; + + RtlZeroMemory( + deviceObject->DeviceExtension, + devInfo->DeviceExtensionSize); + + // + // Setup version code + // + + commonExtension->Version = 0x03; + + // + // Setup the remove lock and event + // + + commonExtension->IsRemoved = NO_REMOVE; + commonExtension->RemoveLock = 0; + KeInitializeEvent(&commonExtension->RemoveEvent, + SynchronizationEvent, + FALSE); + + #if DBG + KeInitializeSpinLock(&commonExtension->RemoveTrackingSpinlock); + commonExtension->RemoveTrackingList = NULL; + #else + commonExtension->RemoveTrackingSpinlock = (ULONG_PTR) -1; + commonExtension->RemoveTrackingList = (PVOID) -1; + #endif + + // + // Acquire the lock once. This reference will be released when the + // remove IRP has been received. + // + + ClassAcquireRemoveLock(deviceObject, (PIRP) deviceObject); + + // + // Store a pointer to the driver extension so we don't have to do + // lookups to get it. + // + + commonExtension->DriverExtension = driverExtension; + + // + // Fill in entry points + // + + commonExtension->DevInfo = devInfo; + + // + // Initialize some of the common values in the structure + // + + commonExtension->DeviceObject = deviceObject; + + commonExtension->LowerDeviceObject = NULL; + + if(IsFdo) { + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = (PVOID) commonExtension; + + commonExtension->PartitionZeroExtension = deviceObject->DeviceExtension; + + // + // Set the initial device object flags. + // + + SET_FLAG(deviceObject->Flags, DO_POWER_PAGABLE); + + // + // Clear the PDO list + // + + commonExtension->ChildList = NULL; + + commonExtension->DriverData = + ((PFUNCTIONAL_DEVICE_EXTENSION) deviceObject->DeviceExtension + 1); + + if(isPartitionable) { + + commonExtension->PartitionNumber = 0; + } else { + commonExtension->PartitionNumber = (ULONG) (-1L); + } + + fdoExtension->DevicePowerState = PowerDeviceD0; + + KeInitializeEvent(&fdoExtension->EjectSynchronizationEvent, + SynchronizationEvent, + TRUE); + + KeInitializeEvent(&fdoExtension->ChildLock, + SynchronizationEvent, + TRUE); + + status = ClasspAllocateReleaseRequest(deviceObject); + + if(!NT_SUCCESS(status)) { + IoDeleteDevice(deviceObject); + *DeviceObject = NULL; + + if (ntUnicodeString.Buffer != NULL) { + DebugPrint((1, "ClassCreateFdo: Freeing unicode name buffer\n")); + ExFreePool(ntUnicodeString.Buffer); + RtlInitUnicodeString(&ntUnicodeString, NULL); + } + + return status; + } + + } else { + + PPHYSICAL_DEVICE_EXTENSION pdoExtension = + deviceObject->DeviceExtension; + + PFUNCTIONAL_DEVICE_EXTENSION p0Extension = + LowerDevice->DeviceExtension; + + SET_FLAG(deviceObject->Flags, DO_POWER_PAGABLE); + + commonExtension->PartitionZeroExtension = p0Extension; + + // + // Stick this onto the PDO list + // + + ClassAddChild(p0Extension, pdoExtension, TRUE); + + commonExtension->DriverData = (PVOID) (pdoExtension + 1); + + // + // Get the top of stack for the lower device - this allows + // filters to get stuck in between the partitions and the + // physical disk. + // + + commonExtension->LowerDeviceObject = + IoGetAttachedDeviceReference(LowerDevice); + + // + // Pnp will keep a reference to the lower device object long + // after this partition has been deleted. Dereference now so + // we don't have to deal with it later. + // + + ObDereferenceObject(commonExtension->LowerDeviceObject); + } + + KeInitializeEvent(&commonExtension->PathCountEvent, SynchronizationEvent, TRUE); + + commonExtension->IsFdo = IsFdo; + + commonExtension->DeviceName = ntUnicodeString; + + commonExtension->PreviousState = 0xff; + + InitializeDictionary(&(commonExtension->FileObjectDictionary)); + + commonExtension->CurrentState = IRP_MN_STOP_DEVICE; + } + + *DeviceObject = deviceObject; + + return status; +} // end ClassCreateDeviceObject() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassClaimDevice() + +Routine Description: + + This function claims a device in the port driver. The port driver object + is updated with the correct driver object if the device is successfully + claimed. + +Arguments: + + LowerDeviceObject - Supplies the base port device object. + + Release - Indicates the logical unit should be released rather than claimed. + +Return Value: + + Returns a status indicating success or failure of the operation. + +--*/ +NTSTATUS +ClassClaimDevice( + IN PDEVICE_OBJECT LowerDeviceObject, + IN BOOLEAN Release + ) +{ + IO_STATUS_BLOCK ioStatus; + PIRP irp; + PIO_STACK_LOCATION irpStack; + KEVENT event; + NTSTATUS status; + SCSI_REQUEST_BLOCK srb; + + PAGED_CODE(); + + // + // Clear the SRB fields. + // + + RtlZeroMemory(&srb, sizeof(SCSI_REQUEST_BLOCK)); + + // + // Write length to SRB. + // + + srb.Length = sizeof(SCSI_REQUEST_BLOCK); + + srb.Function = Release ? SRB_FUNCTION_RELEASE_DEVICE : + SRB_FUNCTION_CLAIM_DEVICE; + + // + // Set the event object to the unsignaled state. + // It will be used to signal request completion + // + + KeInitializeEvent(&event, SynchronizationEvent, FALSE); + + // + // Build synchronous request with no transfer. + // + + irp = IoBuildDeviceIoControlRequest(IOCTL_SCSI_EXECUTE_NONE, + LowerDeviceObject, + NULL, + 0, + NULL, + 0, + TRUE, + &event, + &ioStatus); + + if (irp == NULL) { + DebugPrint((1, "ClassClaimDevice: Can't allocate Irp\n")); + return STATUS_INSUFFICIENT_RESOURCES; + } + + irpStack = IoGetNextIrpStackLocation(irp); + + // + // Save SRB address in next stack for port driver. + // + + irpStack->Parameters.Scsi.Srb = &srb; + + // + // Set up IRP Address. + // + + srb.OriginalRequest = irp; + + // + // Call the port driver with the request and wait for it to complete. + // + + status = IoCallDriver(LowerDeviceObject, irp); + if (status == STATUS_PENDING) { + + KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); + status = ioStatus.Status; + } + + // + // If this is a release request, then just decrement the reference count + // and return. The status does not matter. + // + + if (Release) { + + // ObDereferenceObject(LowerDeviceObject); + return STATUS_SUCCESS; + } + + if (!NT_SUCCESS(status)) { + return status; + } + + ASSERT(srb.DataBuffer != NULL); + ASSERT(!TEST_FLAG(srb.SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)); + + return status; +} // end ClassClaimDevice() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassInternalIoControl() + +Routine Description: + + This routine passes internal device controls to the port driver. + Internal device controls are used by higher level drivers both for ioctls + and to pass through scsi requests. + + If the IoControlCode does not match any of the handled ioctls and is + a valid system address then the request will be treated as an SRB and + passed down to the lower driver. If the IoControlCode is not a valid + system address the ioctl will be failed. + + Callers must therefore be extremely cautious to pass correct, initialized + values to this function. + +Arguments: + + DeviceObject - Supplies a pointer to the device object for this request. + + Irp - Supplies the Irp making the request. + +Return Value: + + Returns back a STATUS_PENDING or a completion status. + +--*/ +NTSTATUS +ClassInternalIoControl( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PIO_STACK_LOCATION nextStack = IoGetNextIrpStackLocation(Irp); + + ULONG isRemoved; + + PSCSI_REQUEST_BLOCK srb; + + isRemoved = ClassAcquireRemoveLock(DeviceObject, Irp); + + if(isRemoved) { + + Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST; + + ClassReleaseRemoveLock(DeviceObject, Irp); + + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + + return STATUS_DEVICE_DOES_NOT_EXIST; + } + + // + // Get a pointer to the SRB. + // + + srb = irpStack->Parameters.Scsi.Srb; + + // + // Set the parameters in the next stack location. + // + + if(commonExtension->IsFdo) { + nextStack->Parameters.Scsi.Srb = srb; + nextStack->MajorFunction = IRP_MJ_SCSI; + nextStack->MinorFunction = IRP_MN_SCSI_CLASS; + + } else { + + IoCopyCurrentIrpStackLocationToNext(Irp); + } + + ClassReleaseRemoveLock(DeviceObject, Irp); + + return IoCallDriver(commonExtension->LowerDeviceObject, Irp); +} // end ClassInternalIoControl() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassQueryTimeOutRegistryValue() + +Routine Description: + + This routine determines whether a reg key for a user-specified timeout + value exists. This should be called at initialization time. + +Arguments: + + DeviceObject - Pointer to the device object we are retrieving the timeout + value for + +Return Value: + + None, but it sets a new default timeout for a class of devices. + +--*/ +ULONG +ClassQueryTimeOutRegistryValue( + IN PDEVICE_OBJECT DeviceObject + ) +{ + // + // Find the appropriate reg. key + // + + PCLASS_DRIVER_EXTENSION + driverExtension = IoGetDriverObjectExtension(DeviceObject->DriverObject, + CLASS_DRIVER_EXTENSION_KEY); + + PUNICODE_STRING registryPath = &(driverExtension->RegistryPath); + + PRTL_QUERY_REGISTRY_TABLE parameters = NULL; + PWSTR path; + NTSTATUS status; + LONG timeOut = 0; + ULONG zero = 0; + ULONG size; + + PAGED_CODE(); + + if (!registryPath) { + return 0; + } + + parameters = ExAllocatePoolWithTag(NonPagedPool, + sizeof(RTL_QUERY_REGISTRY_TABLE)*2, + '1BcS'); + + if (!parameters) { + return 0; + } + + size = registryPath->MaximumLength + sizeof(WCHAR); + path = ExAllocatePoolWithTag(NonPagedPool, size, '2BcS'); + + if (!path) { + ExFreePool(parameters); + return 0; + } + + RtlZeroMemory(path,size); + RtlCopyMemory(path, registryPath->Buffer, size - sizeof(WCHAR)); + + + // + // Check for the Timeout value. + // + + RtlZeroMemory(parameters, + (sizeof(RTL_QUERY_REGISTRY_TABLE)*2)); + + parameters[0].Flags = RTL_QUERY_REGISTRY_DIRECT; + parameters[0].Name = L"TimeOutValue"; + parameters[0].EntryContext = &timeOut; + parameters[0].DefaultType = REG_DWORD; + parameters[0].DefaultData = &zero; + parameters[0].DefaultLength = sizeof(ULONG); + + status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE | RTL_REGISTRY_OPTIONAL, + path, + parameters, + NULL, + NULL); + + if (!(NT_SUCCESS(status))) { + timeOut = 0; + } + + ExFreePool(parameters); + ExFreePool(path); + + DebugPrint((2, + "ClassQueryTimeOutRegistryValue: Timeout value %d\n", + timeOut)); + + + return timeOut; + +} // end ClassQueryTimeOutRegistryValue() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassCheckVerifyComplete() ISSUE-2000/02/18-henrygab - why public?! + +Routine Description: + + This routine executes when the port driver has completed a check verify + ioctl. It will set the status of the master Irp, copy the media change + count and complete the request. + +Arguments: + + Fdo - Supplies the functional device object which represents the logical unit. + + Irp - Supplies the Irp which has completed. + + Context - NULL + +Return Value: + + NT status + +--*/ +NTSTATUS +ClassCheckVerifyComplete( + IN PDEVICE_OBJECT Fdo, + IN PIRP Irp, + IN PVOID Context + ) +{ + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + + PIRP originalIrp; + + ASSERT_FDO(Fdo); + + originalIrp = irpStack->Parameters.Others.Argument1; + + // + // Copy the media change count and status + // + + *((PULONG) (originalIrp->AssociatedIrp.SystemBuffer)) = + fdoExtension->MediaChangeCount; + + DebugPrint((2, "ClassCheckVerifyComplete - Media change count for" + "device %d is %lx - saved as %lx\n", + fdoExtension->DeviceNumber, + fdoExtension->MediaChangeCount, + *((PULONG) originalIrp->AssociatedIrp.SystemBuffer))); + + originalIrp->IoStatus.Status = Irp->IoStatus.Status; + originalIrp->IoStatus.Information = sizeof(ULONG); + + ClassReleaseRemoveLock(Fdo, originalIrp); + ClassCompleteRequest(Fdo, originalIrp, IO_DISK_INCREMENT); + + IoFreeIrp(Irp); + + return STATUS_MORE_PROCESSING_REQUIRED; + +} // end ClassCheckVerifyComplete() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassGetDescriptor() + +Routine Description: + + This routine will perform a query for the specified property id and will + allocate a non-paged buffer to store the data in. It is the responsibility + of the caller to ensure that this buffer is freed. + + This routine must be run at IRQL_PASSIVE_LEVEL + +Arguments: + + DeviceObject - the device to query + DeviceInfo - a location to store a pointer to the buffer we allocate + +Return Value: + + status + if status is unsuccessful *DeviceInfo will be set to NULL, else the + buffer allocated on behalf of the caller. + +--*/ +NTSTATUS +ClassGetDescriptor( + IN PDEVICE_OBJECT DeviceObject, + IN PSTORAGE_PROPERTY_ID PropertyId, + OUT PSTORAGE_DESCRIPTOR_HEADER *Descriptor + ) +{ + STORAGE_PROPERTY_QUERY query; + IO_STATUS_BLOCK ioStatus; + + PSTORAGE_DESCRIPTOR_HEADER descriptor = NULL; + ULONG length; + + UCHAR pass = 0; + + PAGED_CODE(); + + // + // Set the passed-in descriptor pointer to NULL as default + // + + *Descriptor = NULL; + + + RtlZeroMemory(&query, sizeof(STORAGE_PROPERTY_QUERY)); + query.PropertyId = *PropertyId; + query.QueryType = PropertyStandardQuery; + + // + // On the first pass we just want to get the first few + // bytes of the descriptor so we can read it's size + // + + descriptor = (PVOID)&query; + + ASSERT(sizeof(STORAGE_PROPERTY_QUERY) >= (sizeof(ULONG)*2)); + + ClassSendDeviceIoControlSynchronous( + IOCTL_STORAGE_QUERY_PROPERTY, + DeviceObject, + &query, + sizeof(STORAGE_PROPERTY_QUERY), + sizeof(ULONG) * 2, + FALSE, + &ioStatus + ); + + if(!NT_SUCCESS(ioStatus.Status)) { + + DebugPrint((1, "ClassGetDescriptor: error %lx trying to " + "query properties #1\n", ioStatus.Status)); + return ioStatus.Status; + } + + if (descriptor->Size == 0) { + + // + // This DebugPrint is to help third-party driver writers + // + + DebugPrint((0, "ClassGetDescriptor: size returned was zero?! (status " + "%x\n", ioStatus.Status)); + return STATUS_UNSUCCESSFUL; + + } + + // + // This time we know how much data there is so we can + // allocate a buffer of the correct size + // + + length = descriptor->Size; + + descriptor = ExAllocatePoolWithTag(NonPagedPool, length, '4BcS'); + + if(descriptor == NULL) { + + DebugPrint((1, "ClassGetDescriptor: unable to memory for descriptor " + "(%d bytes)\n", length)); + return STATUS_INSUFFICIENT_RESOURCES; + } + + // + // setup the query again, as it was overwritten above + // + + RtlZeroMemory(&query, sizeof(STORAGE_PROPERTY_QUERY)); + query.PropertyId = *PropertyId; + query.QueryType = PropertyStandardQuery; + + // + // copy the input to the new outputbuffer + // + + RtlCopyMemory(descriptor, + &query, + sizeof(STORAGE_PROPERTY_QUERY) + ); + + ClassSendDeviceIoControlSynchronous( + IOCTL_STORAGE_QUERY_PROPERTY, + DeviceObject, + descriptor, + sizeof(STORAGE_PROPERTY_QUERY), + length, + FALSE, + &ioStatus + ); + + if(!NT_SUCCESS(ioStatus.Status)) { + + DebugPrint((1, "ClassGetDescriptor: error %lx trying to " + "query properties #1\n", ioStatus.Status)); + ExFreePool(descriptor); + return ioStatus.Status; + } + + // + // return the memory we've allocated to the caller + // + + *Descriptor = descriptor; + return ioStatus.Status; +} // end ClassGetDescriptor() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassSignalCompletion() + +Routine Description: + + This completion routine will signal the event given as context and then + return STATUS_MORE_PROCESSING_REQUIRED to stop event completion. It is + the responsibility of the routine waiting on the event to complete the + request and free the event. + +Arguments: + + DeviceObject - a pointer to the device object + + Irp - a pointer to the irp + + Event - a pointer to the event to signal + +Return Value: + + STATUS_MORE_PROCESSING_REQUIRED + +--*/ +NTSTATUS +ClassSignalCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PKEVENT Event + ) +{ + KeSetEvent(Event, IO_NO_INCREMENT, FALSE); + + return STATUS_MORE_PROCESSING_REQUIRED; +} // end ClassSignalCompletion() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassPnpQueryFdoRelations() + +Routine Description: + + This routine will call the driver's enumeration routine to update the + list of PDO's. It will then build a response to the + IRP_MN_QUERY_DEVICE_RELATIONS and place it into the information field in + the irp. + +Arguments: + + Fdo - a pointer to the functional device object we are enumerating + + Irp - a pointer to the enumeration request + +Return Value: + + status + +--*/ +NTSTATUS +ClassPnpQueryFdoRelations( + IN PDEVICE_OBJECT Fdo, + IN PIRP Irp + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCLASS_DRIVER_EXTENSION + driverExtension = IoGetDriverObjectExtension(Fdo->DriverObject, + CLASS_DRIVER_EXTENSION_KEY); + NTSTATUS status; + + PAGED_CODE(); + + // + // If there's already an enumeration in progress then don't start another + // one. + // + + if(InterlockedIncrement(&(fdoExtension->EnumerationInterlock)) == 1) { + status = driverExtension->InitData.ClassEnumerateDevice(Fdo); + } + + Irp->IoStatus.Information = (ULONG_PTR) NULL; + + Irp->IoStatus.Status = ClassRetrieveDeviceRelations( + Fdo, + BusRelations, + (PDEVICE_RELATIONS)&Irp->IoStatus.Information); + InterlockedDecrement(&(fdoExtension->EnumerationInterlock)); + + return Irp->IoStatus.Status; +} // end ClassPnpQueryFdoRelations() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassMarkChildrenMissing() + +Routine Description: + + This routine will call ClassMarkChildMissing() for all children. + It acquires the ChildLock before calling ClassMarkChildMissing(). + +Arguments: + + Fdo - the "bus's" device object, such as the disk FDO for non-removable + disks with multiple partitions. + +Return Value: + + None + +--*/ +VOID +ClassMarkChildrenMissing( + IN PFUNCTIONAL_DEVICE_EXTENSION Fdo + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = &(Fdo->CommonExtension); + PPHYSICAL_DEVICE_EXTENSION nextChild = commonExtension->ChildList; + + PAGED_CODE(); + + ClassAcquireChildLock(Fdo); + + while (nextChild){ + PPHYSICAL_DEVICE_EXTENSION tmpChild; + + /* + * ClassMarkChildMissing will also dequeue the child extension. + * So get the next pointer before calling ClassMarkChildMissing. + */ + tmpChild = nextChild; + nextChild = tmpChild->CommonExtension.ChildList; + ClassMarkChildMissing(tmpChild, FALSE); + } + ClassReleaseChildLock(Fdo); + return; +} // end ClassMarkChildrenMissing() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassMarkChildMissing() + +Routine Description: + + This routine will make an active child "missing." If the device has never + been enumerated then it will be deleted on the spot. If the device has + not been enumerated then it will be marked as missing so that we can + not report it in the next device enumeration. + +Arguments: + + Child - the child device to be marked as missing. + + AcquireChildLock - TRUE if the child lock should be acquired before removing + the missing child. FALSE if the child lock is already + acquired by this thread. + +Return Value: + + returns whether or not the child device object has previously been reported + to PNP. + +--*/ +BOOLEAN +ClassMarkChildMissing( + IN PPHYSICAL_DEVICE_EXTENSION Child, + IN BOOLEAN AcquireChildLock + ) +{ + BOOLEAN returnValue = Child->IsEnumerated; + + PAGED_CODE(); + ASSERT_PDO(Child->DeviceObject); + + Child->IsMissing = TRUE; + + // + // Make sure this child is not in the active list. + // + + ClassRemoveChild(Child->CommonExtension.PartitionZeroExtension, + Child, + AcquireChildLock); + + if(Child->IsEnumerated == FALSE) { + ClassRemoveDevice(Child->DeviceObject, IRP_MN_REMOVE_DEVICE); + } + + return returnValue; +} // end ClassMarkChildMissing() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassRetrieveDeviceRelations() + +Routine Description: + + This routine will allocate a buffer to hold the specified list of + relations. It will then fill in the list with referenced device pointers + and will return the request. + +Arguments: + + Fdo - pointer to the FDO being queried + + RelationType - what type of relations are being queried + + DeviceRelations - a location to store a pointer to the response + +Return Value: + + status + +--*/ +NTSTATUS +ClassRetrieveDeviceRelations( + IN PDEVICE_OBJECT Fdo, + IN DEVICE_RELATION_TYPE RelationType, + OUT PDEVICE_RELATIONS *DeviceRelations + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + + ULONG count = 0; + ULONG i; + + PPHYSICAL_DEVICE_EXTENSION nextChild; + + ULONG relationsSize; + PDEVICE_RELATIONS deviceRelations = NULL; + + NTSTATUS status; + + PAGED_CODE(); + + ClassAcquireChildLock(fdoExtension); + + nextChild = fdoExtension->CommonExtension.ChildList; + + // + // Count the number of PDO's attached to this disk + // + + while(nextChild != NULL) { + PCOMMON_DEVICE_EXTENSION commonExtension; + + commonExtension = &(nextChild->CommonExtension); + + ASSERTMSG("ClassPnp internal error: missing child on active list\n", + (nextChild->IsMissing == FALSE)); + + nextChild = commonExtension->ChildList; + + count++; + }; + + relationsSize = (sizeof(DEVICE_RELATIONS) + + (count * sizeof(PDEVICE_OBJECT))); + + deviceRelations = ExAllocatePoolWithTag(PagedPool, relationsSize, '5BcS'); + + if(deviceRelations == NULL) { + + DebugPrint((1, "ClassRetrieveDeviceRelations: unable to allocate " + "%d bytes for device relations\n", relationsSize)); + + ClassReleaseChildLock(fdoExtension); + + return STATUS_INSUFFICIENT_RESOURCES; + } + + RtlZeroMemory(deviceRelations, relationsSize); + + nextChild = fdoExtension->CommonExtension.ChildList; + i = count - 1; + + while(nextChild != NULL) { + PCOMMON_DEVICE_EXTENSION commonExtension; + + commonExtension = &(nextChild->CommonExtension); + + ASSERTMSG("ClassPnp internal error: missing child on active list\n", + (nextChild->IsMissing == FALSE)); + + deviceRelations->Objects[i--] = nextChild->DeviceObject; + + status = ObReferenceObjectByPointer( + nextChild->DeviceObject, + 0, + NULL, + KernelMode); + ASSERT(NT_SUCCESS(status)); + + nextChild->IsEnumerated = TRUE; + nextChild = commonExtension->ChildList; + } + + ASSERTMSG("Child list has changed: ", i == -1); + + deviceRelations->Count = count; + *DeviceRelations = deviceRelations; + ClassReleaseChildLock(fdoExtension); + return STATUS_SUCCESS; +} // end ClassRetrieveDeviceRelations() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassGetPdoId() + +Routine Description: + + This routine will call into the driver to retrieve a copy of one of it's + id strings. + +Arguments: + + Pdo - a pointer to the pdo being queried + + IdType - which type of id string is being queried + + IdString - an allocated unicode string structure which the driver + can fill in. + +Return Value: + + status + +--*/ +NTSTATUS +ClassGetPdoId( + IN PDEVICE_OBJECT Pdo, + IN BUS_QUERY_ID_TYPE IdType, + IN PUNICODE_STRING IdString + ) +{ + PCLASS_DRIVER_EXTENSION + driverExtension = IoGetDriverObjectExtension(Pdo->DriverObject, + CLASS_DRIVER_EXTENSION_KEY); + + ASSERT_PDO(Pdo); + ASSERT(driverExtension->InitData.ClassQueryId); + + PAGED_CODE(); + + return driverExtension->InitData.ClassQueryId( Pdo, IdType, IdString); +} // end ClassGetPdoId() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassQueryPnpCapabilities() + +Routine Description: + + This routine will call into the class driver to retrieve it's pnp + capabilities. + +Arguments: + + PhysicalDeviceObject - The physical device object to retrieve properties + for. + +Return Value: + + status + +--*/ +NTSTATUS +ClassQueryPnpCapabilities( + IN PDEVICE_OBJECT DeviceObject, + IN PDEVICE_CAPABILITIES Capabilities + ) +{ + PCLASS_DRIVER_EXTENSION driverExtension = + ClassGetDriverExtension(DeviceObject->DriverObject); + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + + PCLASS_QUERY_PNP_CAPABILITIES queryRoutine = NULL; + + PAGED_CODE(); + + ASSERT(DeviceObject); + ASSERT(Capabilities); + + if(commonExtension->IsFdo) { + queryRoutine = driverExtension->InitData.FdoData.ClassQueryPnpCapabilities; + } else { + queryRoutine = driverExtension->InitData.PdoData.ClassQueryPnpCapabilities; + } + + if(queryRoutine) { + return queryRoutine(DeviceObject, + Capabilities); + } else { + return STATUS_NOT_IMPLEMENTED; + } +} // end ClassQueryPnpCapabilities() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassInvalidateBusRelations() + +Routine Description: + + This routine re-enumerates the devices on the "bus". It will call into + the driver's ClassEnumerate routine to update the device objects + immediately. It will then schedule a bus re-enumeration for pnp by calling + IoInvalidateDeviceRelations. + +Arguments: + + Fdo - a pointer to the functional device object for this bus + +Return Value: + + none + +--*/ +VOID +ClassInvalidateBusRelations( + IN PDEVICE_OBJECT Fdo + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PCLASS_DRIVER_EXTENSION + driverExtension = IoGetDriverObjectExtension(Fdo->DriverObject, + CLASS_DRIVER_EXTENSION_KEY); + + NTSTATUS status = STATUS_SUCCESS; + + PAGED_CODE(); + + ASSERT_FDO(Fdo); + ASSERT(driverExtension->InitData.ClassEnumerateDevice != NULL); + + if(InterlockedIncrement(&(fdoExtension->EnumerationInterlock)) == 1) { + status = driverExtension->InitData.ClassEnumerateDevice(Fdo); + } + InterlockedDecrement(&(fdoExtension->EnumerationInterlock)); + + if(!NT_SUCCESS(status)) { + + DebugPrint((1, "ClassInvalidateBusRelations: EnumerateDevice routine " + "returned %lx\n", status)); + } + + IoInvalidateDeviceRelations(fdoExtension->LowerPdo, BusRelations); + + return; +} // end ClassInvalidateBusRelations() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassRemoveDevice() ISSUE-2000/02/18-henrygab - why public?! + +Routine Description: + + This routine is called to handle the "removal" of a device. It will + forward the request downwards if necesssary, call into the driver + to release any necessary resources (memory, events, etc) and then + will delete the device object. + +Arguments: + + DeviceObject - a pointer to the device object being removed + + RemoveType - indicates what type of remove this is (regular or surprise). + +Return Value: + + status + +--*/ +NTSTATUS +ClassRemoveDevice( + IN PDEVICE_OBJECT DeviceObject, + IN UCHAR RemoveType + ) +{ + PCLASS_DRIVER_EXTENSION + driverExtension = IoGetDriverObjectExtension(DeviceObject->DriverObject, + CLASS_DRIVER_EXTENSION_KEY); + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PDEVICE_OBJECT lowerDeviceObject = commonExtension->LowerDeviceObject; + PCLASS_WMI_INFO classWmiInfo; + BOOLEAN proceedWithRemove = TRUE; + NTSTATUS status; + + PAGED_CODE(); + + commonExtension->IsRemoved = REMOVE_PENDING; + + /* + * Deregister from WMI. + */ + classWmiInfo = commonExtension->IsFdo ? + &driverExtension->InitData.FdoData.ClassWmiInfo : + &driverExtension->InitData.PdoData.ClassWmiInfo; + if (classWmiInfo->GuidRegInfo){ + status = IoWMIRegistrationControl(DeviceObject, WMIREG_ACTION_DEREGISTER); + DBGTRACE(ClassDebugInfo, ("ClassRemoveDevice: IoWMIRegistrationControl(%p, WMI_ACTION_DEREGISTER) --> %lx", DeviceObject, status)); + } + + /* + * If we exposed a "shingle" (a named device interface openable by CreateFile) + * then delete it now. + */ + if (commonExtension->MountedDeviceInterfaceName.Buffer){ + IoSetDeviceInterfaceState(&commonExtension->MountedDeviceInterfaceName, FALSE); + RtlFreeUnicodeString(&commonExtension->MountedDeviceInterfaceName); + RtlInitUnicodeString(&commonExtension->MountedDeviceInterfaceName, NULL); + } + + // + // If this is a surprise removal we leave the device around - which means + // we don't have to (or want to) drop the remove lock and wait for pending + // requests to complete. + // + + if (RemoveType == IRP_MN_REMOVE_DEVICE){ + + // + // Release the lock we acquired when the device object was created. + // + + ClassReleaseRemoveLock(DeviceObject, (PIRP) DeviceObject); + + DebugPrint((1, "ClasspRemoveDevice - Reference count is now %d\n", + commonExtension->RemoveLock)); + + KeWaitForSingleObject(&commonExtension->RemoveEvent, + Executive, + KernelMode, + FALSE, + NULL); + + DebugPrint((1, "ClasspRemoveDevice - removing device %p\n", DeviceObject)); + + if(commonExtension->IsFdo) { + + DebugPrint((1, "ClasspRemoveDevice - FDO %p has received a " + "remove request.\n", DeviceObject)); + + } + else { + PPHYSICAL_DEVICE_EXTENSION pdoExtension = DeviceObject->DeviceExtension; + + if (pdoExtension->IsMissing){ + /* + * The child partition PDO is missing, so we are going to go ahead + * and delete it for the remove. + */ + DBGTRACE(ClassDebugWarning, ("ClasspRemoveDevice - PDO %p is missing and will be removed", DeviceObject)); + } + else { + /* + * We got a remove for a child partition PDO which is not actually missing. + * So we will NOT actually delete it. + */ + DBGTRACE(ClassDebugWarning, ("ClasspRemoveDevice - PDO %p still exists and will be removed when it disappears", DeviceObject)); + + // + // Reacquire the remove lock for the next time this comes around. + // + + ClassAcquireRemoveLock(DeviceObject, (PIRP) DeviceObject); + + // + // the device wasn't missing so it's not really been removed. + // + + commonExtension->IsRemoved = NO_REMOVE; + + IoInvalidateDeviceRelations( + commonExtension->PartitionZeroExtension->LowerPdo, + BusRelations); + + proceedWithRemove = FALSE; + } + } + } + + + if (proceedWithRemove){ + + /* + * Call the class driver's remove handler. + * All this is supposed to do is clean up its data and device interfaces. + */ + ASSERT(commonExtension->DevInfo->ClassRemoveDevice); + status = commonExtension->DevInfo->ClassRemoveDevice(DeviceObject, RemoveType); + ASSERT(NT_SUCCESS(status)); + status = STATUS_SUCCESS; + + if (commonExtension->IsFdo){ + PDEVICE_OBJECT pdo; + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + + ClasspDisableTimer(fdoExtension->DeviceObject); + + if (RemoveType == IRP_MN_REMOVE_DEVICE){ + + PPHYSICAL_DEVICE_EXTENSION child; + + // + // Cleanup the media detection resources now that the class driver + // has stopped it's timer (if any) and we can be sure they won't + // call us to do detection again. + // + + ClassCleanupMediaChangeDetection(fdoExtension); + + // + // Cleanup any Failure Prediction stuff + // + if (fdoExtension->FailurePredictionInfo) { + ExFreePool(fdoExtension->FailurePredictionInfo); + fdoExtension->FailurePredictionInfo = NULL; + } + + /* + * Ordinarily all child PDOs will be removed by the time + * that the parent gets the REMOVE_DEVICE. + * However, if a child PDO has been created but has not + * been announced in a QueryDeviceRelations, then it is + * just a private data structure unknown to pnp, and we have + * to delete it ourselves. + */ + ClassAcquireChildLock(fdoExtension); + while (child = ClassRemoveChild(fdoExtension, NULL, FALSE)){ + + // + // Yank the pdo. This routine will unlink the device from the + // pdo list so NextPdo will point to the next one when it's + // complete. + // + child->IsMissing = TRUE; + ClassRemoveDevice(child->DeviceObject, IRP_MN_REMOVE_DEVICE); + } + ClassReleaseChildLock(fdoExtension); + } + else if (RemoveType == IRP_MN_SURPRISE_REMOVAL){ + /* + * This is a surprise-remove on the parent FDO. + * We will mark the child PDOs as missing so that they + * will actually get deleted when they get a REMOVE_DEVICE. + */ + ClassMarkChildrenMissing(fdoExtension); + } + + ClasspFreeReleaseRequest(DeviceObject); + + if (RemoveType == IRP_MN_REMOVE_DEVICE){ + + // + // Free FDO-specific data structs + // + if (fdoExtension->PrivateFdoData){ + + DestroyAllTransferPackets(DeviceObject); + + ExFreePool(fdoExtension->PrivateFdoData); + fdoExtension->PrivateFdoData = NULL; + } + + if (commonExtension->DeviceName.Buffer) { + ExFreePool(commonExtension->DeviceName.Buffer); + RtlInitUnicodeString(&commonExtension->DeviceName, NULL); + } + + if (fdoExtension->AdapterDescriptor) { + ExFreePool(fdoExtension->AdapterDescriptor); + fdoExtension->AdapterDescriptor = NULL; + } + + if (fdoExtension->DeviceDescriptor) { + ExFreePool(fdoExtension->DeviceDescriptor); + fdoExtension->DeviceDescriptor = NULL; + } + + // + // Detach our device object from the stack - there's no reason + // to hold off our cleanup any longer. + // + + IoDetachDevice(lowerDeviceObject); + } + } + else { + /* + * This is a child partition PDO. + * We have already determined that it was previously marked + * as missing. So if this is a REMOVE_DEVICE, we will actually + * delete it. + */ + if (RemoveType == IRP_MN_REMOVE_DEVICE){ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = + commonExtension->PartitionZeroExtension; + PPHYSICAL_DEVICE_EXTENSION pdoExtension = + (PPHYSICAL_DEVICE_EXTENSION) commonExtension; + + // + // See if this device is in the child list (if this was a suprise + // removal it might be) and remove it. + // + + ClassRemoveChild(fdoExtension, pdoExtension, TRUE); + } + } + + commonExtension->PartitionLength.QuadPart = 0; + + if (RemoveType == IRP_MN_REMOVE_DEVICE){ + IoDeleteDevice(DeviceObject); + } + } + + return STATUS_SUCCESS; +} // end ClassRemoveDevice() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassGetDriverExtension() + +Routine Description: + + This routine will return the classpnp's driver extension. + +Arguments: + + DriverObject - the driver object for which to get classpnp's extension + +Return Value: + + Either NULL if none, or a pointer to the driver extension + +--*/ +PCLASS_DRIVER_EXTENSION +ClassGetDriverExtension( + IN PDRIVER_OBJECT DriverObject + ) +{ + return IoGetDriverObjectExtension(DriverObject, CLASS_DRIVER_EXTENSION_KEY); +} // end ClassGetDriverExtension() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspStartIo() + +Routine Description: + + This routine wraps the class driver's start io routine. If the device + is being removed it will complete any requests with + STATUS_DEVICE_DOES_NOT_EXIST and fire up the next packet. + +Arguments: + +Return Value: + + none + +--*/ +VOID +ClasspStartIo( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + + // + // We're already holding the remove lock so just check the variable and + // see what's going on. + // + + if(commonExtension->IsRemoved) { + + Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST; + + ClassAcquireRemoveLock(DeviceObject, (PIRP) ClasspStartIo); + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_DISK_INCREMENT); + IoStartNextPacket(DeviceObject, FALSE); + ClassReleaseRemoveLock(DeviceObject, (PIRP) ClasspStartIo); + return; + } + + commonExtension->DriverExtension->InitData.ClassStartIo( + DeviceObject, + Irp); + + return; +} // ClasspStartIo() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassUpdateInformationInRegistry() + +Routine Description: + + This routine has knowledge about the layout of the device map information + in the registry. It will update this information to include a value + entry specifying the dos device name that is assumed to get assigned + to this NT device name. For more information on this assigning of the + dos device name look in the drive support routine in the hal that assigns + all dos names. + + Since some versions of some device's firmware did not work and some + vendors did not bother to follow the specification, the entire inquiry + information must also be stored in the registry so than someone can + figure out the firmware version. + +Arguments: + + DeviceObject - A pointer to the device object for the tape device. + +Return Value: + + None + +--*/ +VOID +ClassUpdateInformationInRegistry( + IN PDEVICE_OBJECT Fdo, + IN PCHAR DeviceName, + IN ULONG DeviceNumber, + IN PINQUIRYDATA InquiryData, + IN ULONG InquiryDataLength + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + NTSTATUS status; + SCSI_ADDRESS scsiAddress; + OBJECT_ATTRIBUTES objectAttributes; + PUCHAR buffer; + STRING string; + UNICODE_STRING unicodeName; + UNICODE_STRING unicodeRegistryPath; + UNICODE_STRING unicodeData; + HANDLE targetKey; + IO_STATUS_BLOCK ioStatus; + + + PAGED_CODE(); + + ASSERT(DeviceName); + fdoExtension = Fdo->DeviceExtension; + buffer = NULL; + targetKey = NULL; + RtlZeroMemory(&unicodeName, sizeof(UNICODE_STRING)); + RtlZeroMemory(&unicodeData, sizeof(UNICODE_STRING)); + RtlZeroMemory(&unicodeRegistryPath, sizeof(UNICODE_STRING)); + + TRY { + + // + // Issue GET_ADDRESS Ioctl to determine path, target, and lun information. + // + + ClassSendDeviceIoControlSynchronous( + IOCTL_SCSI_GET_ADDRESS, + Fdo, + &scsiAddress, + 0, + sizeof(SCSI_ADDRESS), + FALSE, + &ioStatus + ); + + if (!NT_SUCCESS(ioStatus.Status)) { + + status = ioStatus.Status; + DebugPrint((1, + "UpdateInformationInRegistry: Get Address failed %lx\n", + status)); + LEAVE; + + } else { + + DebugPrint((1, + "GetAddress: Port %x, Path %x, Target %x, Lun %x\n", + scsiAddress.PortNumber, + scsiAddress.PathId, + scsiAddress.TargetId, + scsiAddress.Lun)); + + } + + // + // Allocate a buffer for the reg. spooge. + // + + buffer = ExAllocatePoolWithTag(PagedPool, 1024, '6BcS'); + + if (buffer == NULL) { + + // + // There is not return value for this. Since this is done at + // claim device time (currently only system initialization) getting + // the registry information correct will be the least of the worries. + // + + LEAVE; + } + + sprintf(buffer, + "\\Registry\\Machine\\Hardware\\DeviceMap\\Scsi\\Scsi Port %d\\Scsi Bus %d\\Target Id %d\\Logical Unit Id %d", + scsiAddress.PortNumber, + scsiAddress.PathId, + scsiAddress.TargetId, + scsiAddress.Lun); + + RtlInitString(&string, buffer); + + status = RtlAnsiStringToUnicodeString(&unicodeRegistryPath, + &string, + TRUE); + + if (!NT_SUCCESS(status)) { + LEAVE; + } + + // + // Open the registry key for the scsi information for this + // scsibus, target, lun. + // + + InitializeObjectAttributes(&objectAttributes, + &unicodeRegistryPath, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + status = ZwOpenKey(&targetKey, + KEY_READ | KEY_WRITE, + &objectAttributes); + + if (!NT_SUCCESS(status)) { + LEAVE; + } + + // + // Now construct and attempt to create the registry value + // specifying the device name in the appropriate place in the + // device map. + // + + RtlInitUnicodeString(&unicodeName, L"DeviceName"); + + sprintf(buffer, "%s%d", DeviceName, DeviceNumber); + RtlInitString(&string, buffer); + status = RtlAnsiStringToUnicodeString(&unicodeData, + &string, + TRUE); + if (NT_SUCCESS(status)) { + status = ZwSetValueKey(targetKey, + &unicodeName, + 0, + REG_SZ, + unicodeData.Buffer, + unicodeData.Length); + } + + // + // if they sent in data, update the registry + // + + if (InquiryDataLength) { + + ASSERT(InquiryData); + + RtlInitUnicodeString(&unicodeName, L"InquiryData"); + status = ZwSetValueKey(targetKey, + &unicodeName, + 0, + REG_BINARY, + InquiryData, + InquiryDataLength); + } + + // that's all, except to clean up. + + } FINALLY { + + if (unicodeData.Buffer) { + RtlFreeUnicodeString(&unicodeData); + } + if (unicodeRegistryPath.Buffer) { + RtlFreeUnicodeString(&unicodeRegistryPath); + } + if (targetKey) { + ZwClose(targetKey); + } + if (buffer) { + ExFreePool(buffer); + } + + } + +} // end ClassUpdateInformationInRegistry() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspSendSynchronousCompletion() + +Routine Description: + + This completion routine will set the user event in the irp after + freeing the irp and the associated MDL (if any). + +Arguments: + + DeviceObject - the device object which requested the completion routine + + Irp - the irp being completed + + Context - unused + +Return Value: + + STATUS_MORE_PROCESSING_REQUIRED + +--*/ +NTSTATUS +ClasspSendSynchronousCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ) +{ + DebugPrint((3, "ClasspSendSynchronousCompletion: %p %p %p\n", + DeviceObject, Irp, Context)); + // + // First set the status and information fields in the io status block + // provided by the caller. + // + + *(Irp->UserIosb) = Irp->IoStatus; + + // + // Unlock the pages for the data buffer. + // + + if(Irp->MdlAddress) { + MmUnlockPages(Irp->MdlAddress); + IoFreeMdl(Irp->MdlAddress); + } + + // + // Signal the caller's event. + // + + KeSetEvent(Irp->UserEvent, IO_NO_INCREMENT, FALSE); + + // + // Free the MDL and the IRP. + // + + IoFreeIrp(Irp); + + return STATUS_MORE_PROCESSING_REQUIRED; +} // end ClasspSendSynchronousCompletion() + +/*++ + + ISSUE-2000/02/20-henrygab Not documented ClasspRegisterMountedDeviceInterface + +--*/ +VOID +ClasspRegisterMountedDeviceInterface( + IN PDEVICE_OBJECT DeviceObject + ) +{ + + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + BOOLEAN isFdo = commonExtension->IsFdo; + + PDEVICE_OBJECT pdo; + UNICODE_STRING interfaceName; + + NTSTATUS status; + + if(isFdo) { + + PFUNCTIONAL_DEVICE_EXTENSION functionalExtension; + + functionalExtension = + (PFUNCTIONAL_DEVICE_EXTENSION) commonExtension; + pdo = functionalExtension->LowerPdo; + } else { + pdo = DeviceObject; + } + + status = IoRegisterDeviceInterface( + pdo, + &MOUNTDEV_MOUNTED_DEVICE_GUID, + NULL, + &interfaceName + ); + + if(NT_SUCCESS(status)) { + + // + // Copy the interface name before setting the interface state - the + // name is needed by the components we notify. + // + + commonExtension->MountedDeviceInterfaceName = interfaceName; + status = IoSetDeviceInterfaceState(&interfaceName, TRUE); + + if(!NT_SUCCESS(status)) { + RtlFreeUnicodeString(&interfaceName); + } + } + + if(!NT_SUCCESS(status)) { + RtlInitUnicodeString(&(commonExtension->MountedDeviceInterfaceName), + NULL); + } + return; +} // end ClasspRegisterMountedDeviceInterface() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassSendDeviceIoControlSynchronous() + +Routine Description: + + This routine is based upon IoBuildDeviceIoControlRequest(). It has been + modified to reduce code and memory by not double-buffering the io, using + the same buffer for both input and output, allocating and deallocating + the mdl on behalf of the caller, and waiting for the io to complete. + + This routine also works around the rare cases in which APC's are disabled. + Since IoBuildDeviceIoControl() used APC's to signal completion, this had + led to a number of difficult-to-detect hangs, where the irp was completed, + but the event passed to IoBuild..() was still being waited upon by the + caller. + +Arguments: + + IoControlCode - the IOCTL to send + + TargetDeviceObject - the device object that should handle the ioctl + + Buffer - the input and output buffer, or NULL if no input/output + + InputBufferLength - the number of bytes prepared for the IOCTL in Buffer + + OutputBufferLength - the number of bytes to be filled in upon success + + InternalDeviceIoControl - if TRUE, uses IRP_MJ_INTERNAL_DEVICE_CONTROL + + IoStatus - the status block that contains the results of the operation + +Return Value: + +--*/ +VOID +ClassSendDeviceIoControlSynchronous( + IN ULONG IoControlCode, + IN PDEVICE_OBJECT TargetDeviceObject, + IN OUT PVOID Buffer OPTIONAL, + IN ULONG InputBufferLength, + IN ULONG OutputBufferLength, + IN BOOLEAN InternalDeviceIoControl, + OUT PIO_STATUS_BLOCK IoStatus + ) +{ + PIRP irp; + PIO_STACK_LOCATION irpSp; + ULONG method; + + PAGED_CODE(); + + irp = NULL; + method = IoControlCode & 3; + + + #if DBG // Begin Argument Checking (nop in fre version) + + ASSERT(ARGUMENT_PRESENT(IoStatus)); + + if ((InputBufferLength != 0) || (OutputBufferLength != 0)) { + ASSERT(ARGUMENT_PRESENT(Buffer)); + } + else { + ASSERT(!ARGUMENT_PRESENT(Buffer)); + } + #endif + + // + // Begin by allocating the IRP for this request. Do not charge quota to + // the current process for this IRP. + // + + irp = IoAllocateIrp(TargetDeviceObject->StackSize, FALSE); + if (!irp) { + (*IoStatus).Information = 0; + (*IoStatus).Status = STATUS_INSUFFICIENT_RESOURCES; + return; + } + + // + // Get a pointer to the stack location of the first driver which will be + // invoked. This is where the function codes and the parameters are set. + // + + irpSp = IoGetNextIrpStackLocation(irp); + + // + // Set the major function code based on the type of device I/O control + // function the caller has specified. + // + + if (InternalDeviceIoControl) { + irpSp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; + } else { + irpSp->MajorFunction = IRP_MJ_DEVICE_CONTROL; + } + + // + // Copy the caller's parameters to the service-specific portion of the + // IRP for those parameters that are the same for all four methods. + // + + irpSp->Parameters.DeviceIoControl.OutputBufferLength = OutputBufferLength; + irpSp->Parameters.DeviceIoControl.InputBufferLength = InputBufferLength; + irpSp->Parameters.DeviceIoControl.IoControlCode = IoControlCode; + + // + // Get the method bits from the I/O control code to determine how the + // buffers are to be passed to the driver. + // + + switch (method) { + // case 0 + case METHOD_BUFFERED: { + if ((InputBufferLength != 0) || (OutputBufferLength != 0)) { + + irp->AssociatedIrp.SystemBuffer = + ExAllocatePoolWithTag(NonPagedPoolCacheAligned, + max(InputBufferLength, OutputBufferLength), + CLASS_TAG_DEVICE_CONTROL + ); + + if (irp->AssociatedIrp.SystemBuffer == NULL) { + IoFreeIrp(irp); + (*IoStatus).Information = 0; + (*IoStatus).Status = STATUS_INSUFFICIENT_RESOURCES; + return; + } + + if (InputBufferLength != 0) { + RtlCopyMemory(irp->AssociatedIrp.SystemBuffer, + Buffer, + InputBufferLength); + } + } // end of buffering + + irp->UserBuffer = Buffer; + break; + } + + // case 1, case 2 + case METHOD_IN_DIRECT: + case METHOD_OUT_DIRECT: { + + + if (InputBufferLength != 0) { + irp->AssociatedIrp.SystemBuffer = Buffer; + } + + if (OutputBufferLength != 0) { + + irp->MdlAddress = IoAllocateMdl(Buffer, + OutputBufferLength, + FALSE, FALSE, + (PIRP) NULL); + + if (irp->MdlAddress == NULL) { + IoFreeIrp(irp); + (*IoStatus).Information = 0; + (*IoStatus).Status = STATUS_INSUFFICIENT_RESOURCES; + return; + } + + if (method == METHOD_IN_DIRECT) { + MmProbeAndLockPages(irp->MdlAddress, + KernelMode, + IoReadAccess); + } else if (method == METHOD_OUT_DIRECT) { + MmProbeAndLockPages(irp->MdlAddress, + KernelMode, + IoWriteAccess); + } else { + ASSERT(!"If other methods reach here, code is out of date"); + } + } + break; + } + + // case 3 + case METHOD_NEITHER: { + + ASSERT(!"This routine does not support METHOD_NEITHER ioctls"); + IoStatus->Information = 0; + IoStatus->Status = STATUS_NOT_SUPPORTED; + return; + break; + } + } // end of switch(method) + + irp->Tail.Overlay.Thread = PsGetCurrentThread(); + + // + // send the irp synchronously + // + + ClassSendIrpSynchronous(TargetDeviceObject, irp); + + // + // copy the iostatus block for the caller + // + + *IoStatus = irp->IoStatus; + + // + // free any allocated resources + // + + switch (method) { + case METHOD_BUFFERED: { + + ASSERT(irp->UserBuffer == Buffer); + + // + // first copy the buffered result, if any + // Note that there are no security implications in + // not checking for success since only drivers can + // call into this routine anyways... + // + + if (OutputBufferLength != 0) { + RtlCopyMemory(Buffer, // irp->UserBuffer + irp->AssociatedIrp.SystemBuffer, + OutputBufferLength + ); + } + + // + // then free the memory allocated to buffer the io + // + + if ((InputBufferLength !=0) || (OutputBufferLength != 0)) { + ExFreePool(irp->AssociatedIrp.SystemBuffer); + irp->AssociatedIrp.SystemBuffer = NULL; + } + break; + } + + case METHOD_IN_DIRECT: + case METHOD_OUT_DIRECT: { + + // + // we alloc a mdl if there is an output buffer specified + // free it here after unlocking the pages + // + + if (OutputBufferLength != 0) { + ASSERT(irp->MdlAddress != NULL); + MmUnlockPages(irp->MdlAddress); + IoFreeMdl(irp->MdlAddress); + irp->MdlAddress = (PMDL) NULL; + } + break; + } + + case METHOD_NEITHER: { + ASSERT(!"Code is out of date"); + break; + } + } + + // + // we always have allocated an irp. free it here. + // + + IoFreeIrp(irp); + irp = (PIRP) NULL; + + // + // return the io status block's status to the caller + // + + return; +} // end ClassSendDeviceIoControlSynchronous() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassForwardIrpSynchronous() + +Routine Description: + + Forwards a given irp to the next lower device object. + +Arguments: + + CommonExtension - the common class extension + + Irp - the request to forward down the stack + +Return Value: + +--*/ +NTSTATUS +ClassForwardIrpSynchronous( + IN PCOMMON_DEVICE_EXTENSION CommonExtension, + IN PIRP Irp + ) +{ + IoCopyCurrentIrpStackLocationToNext(Irp); + return ClassSendIrpSynchronous(CommonExtension->LowerDeviceObject, Irp); +} // end ClassForwardIrpSynchronous() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassSendIrpSynchronous() + +Routine Description: + + This routine sends the given irp to the given device object, and waits for + it to complete. On debug versions, will print out a debug message and + optionally assert for "lost" irps based upon classpnp's globals + +Arguments: + + TargetDeviceObject - the device object to handle this irp + + Irp - the request to be sent + +Return Value: + +--*/ +NTSTATUS +ClassSendIrpSynchronous( + IN PDEVICE_OBJECT TargetDeviceObject, + IN PIRP Irp + ) +{ + KEVENT event; + NTSTATUS status; + + ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL); + ASSERT(TargetDeviceObject != NULL); + ASSERT(Irp != NULL); + ASSERT(Irp->StackCount >= TargetDeviceObject->StackSize); + + // + // ISSUE-2000/02/20-henrygab What if APCs are disabled? + // May need to enter critical section before IoCallDriver() + // until the event is hit? + // + + KeInitializeEvent(&event, SynchronizationEvent, FALSE); + IoSetCompletionRoutine(Irp, ClassSignalCompletion, &event, + TRUE, TRUE, TRUE); + + status = IoCallDriver(TargetDeviceObject, Irp); + + if (status == STATUS_PENDING) { + + #if DBG + LARGE_INTEGER timeout; + + timeout.QuadPart = (LONGLONG)(-1 * 10 * 1000 * (LONGLONG)1000 * + ClasspnpGlobals.SecondsToWaitForIrps); + + do { + status = KeWaitForSingleObject(&event, + Executive, + KernelMode, + FALSE, + &timeout); + + + if (status == STATUS_TIMEOUT) { + + // + // This DebugPrint should almost always be investigated by the + // party who sent the irp and/or the current owner of the irp. + // Synchronous Irps should not take this long (currently 30 + // seconds) without good reason. This points to a potentially + // serious problem in the underlying device stack. + // + + DebugPrint((0, "ClassSendIrpSynchronous: (%p) irp %p did not " + "complete within %x seconds\n", + TargetDeviceObject, Irp, + ClasspnpGlobals.SecondsToWaitForIrps + )); + + if (ClasspnpGlobals.BreakOnLostIrps != 0) { + ASSERT(!" - Irp failed to complete within 30 seconds - "); + } + } + + + } while (status==STATUS_TIMEOUT); + #else + KeWaitForSingleObject(&event, + Executive, + KernelMode, + FALSE, + NULL); + #endif + + status = Irp->IoStatus.Status; + } + + return status; +} // end ClassSendIrpSynchronous() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassGetVpb() + +Routine Description: + + This routine returns the current VPB (Volume Parameter Block) for the + given device object. + The Vpb field is only visible in the ntddk.h (not the wdm.h) definition + of DEVICE_OBJECT; hence this exported function. + +Arguments: + + DeviceObject - the device to get the VPB for + +Return Value: + + the VPB, or NULL if none. + +--*/ +PVPB +ClassGetVpb( + IN PDEVICE_OBJECT DeviceObject + ) +{ + return DeviceObject->Vpb; +} // end ClassGetVpb() + +/*++ + + ISSUE-2000/02/20-henrygab Not documented ClasspAllocateReleaseRequest + +--*/ +NTSTATUS +ClasspAllocateReleaseRequest( + IN PDEVICE_OBJECT Fdo + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PIO_STACK_LOCATION irpStack; + + KeInitializeSpinLock(&(fdoExtension->ReleaseQueueSpinLock)); + + fdoExtension->ReleaseQueueNeeded = FALSE; + fdoExtension->ReleaseQueueInProgress = FALSE; + fdoExtension->ReleaseQueueIrpFromPool = FALSE; + + // + // The class driver is responsible for allocating a properly sized irp, + // or ClassReleaseQueue will attempt to do it on the first error. + // + + fdoExtension->ReleaseQueueIrp = NULL; + + // + // Write length to SRB. + // + + fdoExtension->ReleaseQueueSrb.Length = sizeof(SCSI_REQUEST_BLOCK); + + return STATUS_SUCCESS; +} // end ClasspAllocateReleaseRequest() + +/*++ + + ISSUE-2000/02/20-henrygab Not documented ClasspFreeReleaseRequest + +--*/ +VOID +ClasspFreeReleaseRequest( + IN PDEVICE_OBJECT Fdo + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + //KIRQL oldIrql; + + ASSERT(fdoExtension->CommonExtension.IsRemoved != NO_REMOVE); + + // + // free anything the driver allocated + // + + if (fdoExtension->ReleaseQueueIrp) { + if (fdoExtension->ReleaseQueueIrpFromPool) { + ExFreePool(fdoExtension->ReleaseQueueIrp); + } else { + IoFreeIrp(fdoExtension->ReleaseQueueIrp); + } + fdoExtension->ReleaseQueueIrp = NULL; + } + + // + // free anything that we allocated + // + + if ((fdoExtension->PrivateFdoData) && + (fdoExtension->PrivateFdoData->ReleaseQueueIrpAllocated)) { + + ExFreePool(fdoExtension->PrivateFdoData->ReleaseQueueIrp); + fdoExtension->PrivateFdoData->ReleaseQueueIrpAllocated = FALSE; + fdoExtension->PrivateFdoData->ReleaseQueueIrp = NULL; + } + + return; +} // end ClasspFreeReleaseRequest() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassReleaseQueue() + +Routine Description: + + This routine issues an internal device control command + to the port driver to release a frozen queue. The call + is issued asynchronously as ClassReleaseQueue will be invoked + from the IO completion DPC (and will have no context to + wait for a synchronous call to complete). + + This routine must be called with the remove lock held. + +Arguments: + + Fdo - The functional device object for the device with the frozen queue. + +Return Value: + + None. + +--*/ +VOID +ClassReleaseQueue( + IN PDEVICE_OBJECT Fdo + ) +{ + ClasspReleaseQueue(Fdo, NULL); + return; +} // end ClassReleaseQueue() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspAllocateReleaseQueueIrp() + +Routine Description: + + This routine allocates the release queue irp held in classpnp's private + extension. This was added to allow no-memory conditions to be more + survivable. + +Return Value: + + NT_SUCCESS value. + +Notes: + + Does not grab the spinlock. Should only be called from StartDevice() + routine. May be called elsewhere for poorly-behaved drivers that cause + the queue to lockup before the device is started. This should *never* + occur, since it's illegal to send a request to a non-started PDO. This + condition is checked for in ClasspReleaseQueue(). + +--*/ +NTSTATUS +ClasspAllocateReleaseQueueIrp( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) +{ + KIRQL oldIrql; + UCHAR lowerStackSize; + + // + // do an initial check w/o the spinlock + // + + if (FdoExtension->PrivateFdoData->ReleaseQueueIrpAllocated) { + return STATUS_SUCCESS; + } + + + lowerStackSize = FdoExtension->CommonExtension.LowerDeviceObject->StackSize; + + // + // don't allocate one if one is in progress! this means whoever called + // this routine didn't check if one was in progress. + // + + ASSERT(!(FdoExtension->ReleaseQueueInProgress)); + + FdoExtension->PrivateFdoData->ReleaseQueueIrp = + ExAllocatePoolWithTag(NonPagedPool, + IoSizeOfIrp(lowerStackSize), + CLASS_TAG_RELEASE_QUEUE + ); + + if (FdoExtension->PrivateFdoData->ReleaseQueueIrp == NULL) { + DebugPrint((0, "ClassPnpStartDevice: Cannot allocate for " + "release queue irp\n")); + return STATUS_INSUFFICIENT_RESOURCES; + } + IoInitializeIrp(FdoExtension->PrivateFdoData->ReleaseQueueIrp, + IoSizeOfIrp(lowerStackSize), + lowerStackSize); + FdoExtension->PrivateFdoData->ReleaseQueueIrpAllocated = TRUE; + + return STATUS_SUCCESS; +} + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspReleaseQueue() + +Routine Description: + + This routine issues an internal device control command + to the port driver to release a frozen queue. The call + is issued asynchronously as ClassReleaseQueue will be invoked + from the IO completion DPC (and will have no context to + wait for a synchronous call to complete). + + This routine must be called with the remove lock held. + +Arguments: + + Fdo - The functional device object for the device with the frozen queue. + + ReleaseQueueIrp - If this irp is supplied then the test to determine whether + a release queue request is in progress will be ignored. + The irp provided must be the IRP originally allocated + for release queue requests (so this parameter can only + really be provided by the release queue completion + routine.) + +Return Value: + + None. + +--*/ +VOID +ClasspReleaseQueue( + IN PDEVICE_OBJECT Fdo, + IN PIRP ReleaseQueueIrp OPTIONAL + ) +{ + PIO_STACK_LOCATION irpStack; + PIRP irp; + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + PDEVICE_OBJECT lowerDevice; + PSCSI_REQUEST_BLOCK srb; + KIRQL currentIrql; + + lowerDevice = fdoExtension->CommonExtension.LowerDeviceObject; + + // + // we raise irql seperately so we're not swapped out or suspended + // while holding the release queue irp in this routine. this lets + // us release the spin lock before lowering irql. + // + + KeRaiseIrql(DISPATCH_LEVEL, ¤tIrql); + + KeAcquireSpinLockAtDpcLevel(&(fdoExtension->ReleaseQueueSpinLock)); + + // + // make sure that if they passed us an irp, it matches our allocated irp. + // + + ASSERT((ReleaseQueueIrp == NULL) || + (ReleaseQueueIrp == fdoExtension->PrivateFdoData->ReleaseQueueIrp)); + + // + // ASSERT that we've already allocated this. (should not occur) + // try to allocate it anyways, then finally bugcheck if + // there's still no memory... + // + + ASSERT(fdoExtension->PrivateFdoData->ReleaseQueueIrpAllocated); + if (!fdoExtension->PrivateFdoData->ReleaseQueueIrpAllocated) { + ClasspAllocateReleaseQueueIrp(fdoExtension); + } + if (!fdoExtension->PrivateFdoData->ReleaseQueueIrpAllocated) { + KeBugCheckEx(SCSI_DISK_DRIVER_INTERNAL, 0x12, (ULONG_PTR)Fdo, 0x0, 0x0); + } + + if ((fdoExtension->ReleaseQueueInProgress) && (ReleaseQueueIrp == NULL)) { + + // + // Someone is already using the irp - just set the flag to indicate that + // we need to release the queue again. + // + + fdoExtension->ReleaseQueueNeeded = TRUE; + KeReleaseSpinLockFromDpcLevel(&(fdoExtension->ReleaseQueueSpinLock)); + KeLowerIrql(currentIrql); + return; + + } + + // + // Mark that there is a release queue in progress and drop the spinlock. + // + + fdoExtension->ReleaseQueueInProgress = TRUE; + if (ReleaseQueueIrp) { + irp = ReleaseQueueIrp; + } else { + irp = fdoExtension->PrivateFdoData->ReleaseQueueIrp; + } + srb = &(fdoExtension->ReleaseQueueSrb); + + KeReleaseSpinLockFromDpcLevel(&(fdoExtension->ReleaseQueueSpinLock)); + + ASSERT(irp != NULL); + + irpStack = IoGetNextIrpStackLocation(irp); + + irpStack->MajorFunction = IRP_MJ_SCSI; + + srb->OriginalRequest = irp; + + // + // Store the SRB address in next stack for port driver. + // + + irpStack->Parameters.Scsi.Srb = srb; + + // + // If this device is removable then flush the queue. This will also + // release it. + // + + if (TEST_FLAG(Fdo->Characteristics, FILE_REMOVABLE_MEDIA)){ + srb->Function = SRB_FUNCTION_FLUSH_QUEUE; + } + else { + srb->Function = SRB_FUNCTION_RELEASE_QUEUE; + } + + ClassAcquireRemoveLock(Fdo, irp); + + IoSetCompletionRoutine(irp, + ClassReleaseQueueCompletion, + Fdo, + TRUE, + TRUE, + TRUE); + + IoCallDriver(lowerDevice, irp); + + KeLowerIrql(currentIrql); + + return; + +} // end ClassReleaseQueue() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassReleaseQueueCompletion() + +Routine Description: + + This routine is called when an asynchronous I/O request + which was issused by the class driver completes. Examples of such requests + are release queue or START UNIT. This routine releases the queue if + necessary. It then frees the context and the IRP. + +Arguments: + + DeviceObject - The device object for the logical unit; however since this + is the top stack location the value is NULL. + + Irp - Supplies a pointer to the Irp to be processed. + + Context - Supplies the context to be used to process this request. + +Return Value: + + None. + +--*/ +NTSTATUS +ClassReleaseQueueCompletion( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID Context + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + KIRQL oldIrql; + + BOOLEAN releaseQueueNeeded; + + DeviceObject = Context; + + fdoExtension = DeviceObject->DeviceExtension; + + ClassReleaseRemoveLock(DeviceObject, Irp); + + // + // Grab the spinlock and clear the release queue in progress flag so others + // can run. Save (and clear) the state of the release queue needed flag + // so that we can issue a new release queue outside the spinlock. + // + + KeAcquireSpinLock(&(fdoExtension->ReleaseQueueSpinLock), &oldIrql); + + releaseQueueNeeded = fdoExtension->ReleaseQueueNeeded; + + fdoExtension->ReleaseQueueNeeded = FALSE; + fdoExtension->ReleaseQueueInProgress = FALSE; + + KeReleaseSpinLock(&(fdoExtension->ReleaseQueueSpinLock), oldIrql); + + // + // If we need a release queue then issue one now. Another processor may + // have already started one in which case we'll try to issue this one after + // it is done - but we should never recurse more than one deep. + // + + if(releaseQueueNeeded) { + ClasspReleaseQueue(DeviceObject, Irp); + } + + // + // Indicate the I/O system should stop processing the Irp completion. + // + + return STATUS_MORE_PROCESSING_REQUIRED; + +} // ClassAsynchronousCompletion() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassAcquireChildLock() + +Routine Description: + + This routine acquires the lock protecting children PDOs. It may be + acquired recursively by the same thread, but must be release by the + thread once for each acquisition. + +Arguments: + + FdoExtension - the device whose child list is protected. + +Return Value: + + None + +--*/ +VOID +ClassAcquireChildLock( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) +{ + PAGED_CODE(); + + if(FdoExtension->ChildLockOwner != KeGetCurrentThread()) { + KeWaitForSingleObject(&FdoExtension->ChildLock, + Executive, KernelMode, + FALSE, NULL); + + ASSERT(FdoExtension->ChildLockOwner == NULL); + ASSERT(FdoExtension->ChildLockAcquisitionCount == 0); + + FdoExtension->ChildLockOwner = KeGetCurrentThread(); + } else { + ASSERT(FdoExtension->ChildLockAcquisitionCount != 0); + } + + FdoExtension->ChildLockAcquisitionCount++; + return; +} + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassReleaseChildLock() ISSUE-2000/02/18-henrygab - not documented + +Routine Description: + + This routine releases the lock protecting children PDOs. It must be + called once for each time ClassAcquireChildLock was called. + +Arguments: + + FdoExtension - the device whose child list is protected + +Return Value: + + None. + +--*/ +VOID +ClassReleaseChildLock( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) +{ + ASSERT(FdoExtension->ChildLockOwner == KeGetCurrentThread()); + ASSERT(FdoExtension->ChildLockAcquisitionCount != 0); + + FdoExtension->ChildLockAcquisitionCount -= 1; + + if(FdoExtension->ChildLockAcquisitionCount == 0) { + FdoExtension->ChildLockOwner = NULL; + KeSetEvent(&FdoExtension->ChildLock, IO_NO_INCREMENT, FALSE); + } + + return; +} // end ClassReleaseChildLock( + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassAddChild() + +Routine Description: + + This routine will insert a new child into the head of the child list. + +Arguments: + + Parent - the child's parent (contains the head of the list) + Child - the child to be inserted. + AcquireLock - whether the child lock should be acquired (TRUE) or whether + it's already been acquired by or on behalf of the caller + (FALSE). + +Return Value: + + None. + +--*/ +VOID +ClassAddChild( + IN PFUNCTIONAL_DEVICE_EXTENSION Parent, + IN PPHYSICAL_DEVICE_EXTENSION Child, + IN BOOLEAN AcquireLock + ) +{ + if(AcquireLock) { + ClassAcquireChildLock(Parent); + } + + #if DBG + // + // Make sure this child's not already in the list. + // + { + PPHYSICAL_DEVICE_EXTENSION testChild; + + for (testChild = Parent->CommonExtension.ChildList; + testChild != NULL; + testChild = testChild->CommonExtension.ChildList) { + + ASSERT(testChild != Child); + } + } + #endif + + Child->CommonExtension.ChildList = Parent->CommonExtension.ChildList; + Parent->CommonExtension.ChildList = Child; + + if(AcquireLock) { + ClassReleaseChildLock(Parent); + } + return; +} // end ClassAddChild() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassRemoveChild() + +Routine Description: + + This routine will remove a child from the child list. + +Arguments: + + Parent - the parent to be removed from. + + Child - the child to be removed or NULL if the first child should be + removed. + + AcquireLock - whether the child lock should be acquired (TRUE) or whether + it's already been acquired by or on behalf of the caller + (FALSE). + +Return Value: + + A pointer to the child which was removed or NULL if no such child could + be found in the list (or if Child was NULL but the list is empty). + +--*/ +PPHYSICAL_DEVICE_EXTENSION +ClassRemoveChild( + IN PFUNCTIONAL_DEVICE_EXTENSION Parent, + IN PPHYSICAL_DEVICE_EXTENSION Child, + IN BOOLEAN AcquireLock + ) +{ + if(AcquireLock) { + ClassAcquireChildLock(Parent); + } + + TRY { + PCOMMON_DEVICE_EXTENSION previousChild = &Parent->CommonExtension; + + // + // If the list is empty then bail out now. + // + + if(Parent->CommonExtension.ChildList == NULL) { + Child = NULL; + LEAVE; + } + + // + // If the caller specified a child then find the child object before + // it. If none was specified then the FDO is the child object before + // the one we want to remove. + // + + if(Child != NULL) { + + // + // Scan through the child list to find the entry which points to + // this one. + // + + do { + ASSERT(previousChild != &Child->CommonExtension); + + if(previousChild->ChildList == Child) { + break; + } + + previousChild = &previousChild->ChildList->CommonExtension; + } while(previousChild != NULL); + + if(previousChild == NULL) { + Child = NULL; + LEAVE; + } + } + + // + // Save the next child away then unlink it from the list. + // + + Child = previousChild->ChildList; + previousChild->ChildList = Child->CommonExtension.ChildList; + Child->CommonExtension.ChildList = NULL; + + } FINALLY { + if(AcquireLock) { + ClassReleaseChildLock(Parent); + } + } + return Child; +} // end ClassRemoveChild() + + +/*++ + + ISSUE-2000/02/20-henrygab Not documented ClasspRetryRequestDpc + +--*/ +VOID +ClasspRetryRequestDpc( + IN PKDPC Dpc, + IN PDEVICE_OBJECT DeviceObject, + IN PVOID Arg1, + IN PVOID Arg2 + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + PCOMMON_DEVICE_EXTENSION commonExtension; + PCLASS_PRIVATE_FDO_DATA fdoData; + PCLASS_RETRY_INFO retryList; + KIRQL irql; + + + commonExtension = DeviceObject->DeviceExtension; + ASSERT(commonExtension->IsFdo); + fdoExtension = DeviceObject->DeviceExtension; + fdoData = fdoExtension->PrivateFdoData; + + + KeAcquireSpinLock(&fdoData->Retry.Lock, &irql); + { + LARGE_INTEGER now; + KeQueryTickCount(&now); + + // + // if CurrentTick is less than now + // fire another DPC + // else + // retry entire list + // endif + // + + if (now.QuadPart < fdoData->Retry.Tick.QuadPart) { + + ClasspRetryDpcTimer(fdoData); + retryList = NULL; + + } else { + + retryList = fdoData->Retry.ListHead; + fdoData->Retry.ListHead = NULL; + fdoData->Retry.Delta.QuadPart = (LONGLONG)0; + fdoData->Retry.Tick.QuadPart = (LONGLONG)0; + + } + } + KeReleaseSpinLock(&fdoData->Retry.Lock, irql); + + while (retryList != NULL) { + + PIRP irp; + + irp = CONTAINING_RECORD(retryList, IRP, Tail.Overlay.DriverContext[0]); + DebugPrint((ClassDebugDelayedRetry, "ClassRetry: -- %p\n", irp)); + retryList = retryList->Next; + #if DBG + irp->Tail.Overlay.DriverContext[0] = ULongToPtr(0xdddddddd); // invalidate data + irp->Tail.Overlay.DriverContext[1] = ULongToPtr(0xdddddddd); // invalidate data + irp->Tail.Overlay.DriverContext[2] = ULongToPtr(0xdddddddd); // invalidate data + irp->Tail.Overlay.DriverContext[3] = ULongToPtr(0xdddddddd); // invalidate data + #endif + + IoCallDriver(commonExtension->LowerDeviceObject, irp); + + } + return; + +} // end ClasspRetryRequestDpc() + +/*++ + + ISSUE-2000/02/20-henrygab Not documented ClassRetryRequest + +--*/ +VOID +ClassRetryRequest( + IN PDEVICE_OBJECT SelfDeviceObject, + IN PIRP Irp, + IN LARGE_INTEGER TimeDelta100ns // in 100ns units + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + PCLASS_PRIVATE_FDO_DATA fdoData; + PCLASS_RETRY_INFO retryInfo; + PCLASS_RETRY_INFO *previousNext; + LARGE_INTEGER delta; + KIRQL irql; + + // + // this checks we aren't destroying irps + // + ASSERT(sizeof(CLASS_RETRY_INFO) <= (4*sizeof(PVOID))); + + fdoExtension = SelfDeviceObject->DeviceExtension; + fdoData = fdoExtension->PrivateFdoData; + + if (!fdoExtension->CommonExtension.IsFdo) { + + // + // this debug print/assertion should ALWAYS be investigated. + // ClassRetryRequest can currently only be used by FDO's + // + + DebugPrint((ClassDebugError, "ClassRetryRequestEx: LOST IRP %p\n", Irp)); + ASSERT(!"ClassRetryRequestEx Called From PDO? LOST IRP"); + return; + + } + + if (TimeDelta100ns.QuadPart < 0) { + ASSERT(!"ClassRetryRequest - must use positive delay"); + TimeDelta100ns.QuadPart *= -1; + } + + // + // prepare what we can out of the loop + // + + retryInfo = (PCLASS_RETRY_INFO)(&Irp->Tail.Overlay.DriverContext[0]); + RtlZeroMemory(retryInfo, sizeof(CLASS_RETRY_INFO)); + + delta.QuadPart = (TimeDelta100ns.QuadPart / fdoData->Retry.Granularity); + if (TimeDelta100ns.QuadPart % fdoData->Retry.Granularity) { + delta.QuadPart ++; // round up to next tick + } + if (delta.QuadPart == (LONGLONG)0) { + delta.QuadPart = MINIMUM_RETRY_UNITS; + } + + // + // now determine if we should fire another DPC or not + // + + KeAcquireSpinLock(&fdoData->Retry.Lock, &irql); + + // + // always add request to the list + // + + retryInfo->Next = fdoData->Retry.ListHead; + fdoData->Retry.ListHead = retryInfo; + + if (fdoData->Retry.Delta.QuadPart == (LONGLONG)0) { + + DebugPrint((ClassDebugDelayedRetry, "ClassRetry: +++ %p\n", Irp)); + + // + // must be exactly one item on list + // + + ASSERT(fdoData->Retry.ListHead != NULL); + ASSERT(fdoData->Retry.ListHead->Next == NULL); + + // + // if currentDelta is zero, always fire a DPC + // + + KeQueryTickCount(&fdoData->Retry.Tick); + fdoData->Retry.Tick.QuadPart += delta.QuadPart; + fdoData->Retry.Delta.QuadPart = delta.QuadPart; + ClasspRetryDpcTimer(fdoData); + + } else if (delta.QuadPart > fdoData->Retry.Delta.QuadPart) { + + // + // if delta is greater than the list's current delta, + // increase the DPC handling time by difference + // and update the delta to new larger value + // allow the DPC to re-fire itself if needed + // + + DebugPrint((ClassDebugDelayedRetry, "ClassRetry: ++ %p\n", Irp)); + + // + // must be at least two items on list + // + + ASSERT(fdoData->Retry.ListHead != NULL); + ASSERT(fdoData->Retry.ListHead->Next != NULL); + + fdoData->Retry.Tick.QuadPart -= fdoData->Retry.Delta.QuadPart; + fdoData->Retry.Tick.QuadPart += delta.QuadPart; + + fdoData->Retry.Delta.QuadPart = delta.QuadPart; + + } else { + + // + // just inserting it on the list was enough + // + + DebugPrint((ClassDebugDelayedRetry, "ClassRetry: ++ %p\n", Irp)); + + } + + + KeReleaseSpinLock(&fdoData->Retry.Lock, irql); + + +} // end ClassRetryRequest() + +/*++ + + ISSUE-2000/02/20-henrygab Not documented ClasspRetryDpcTimer + +--*/ +VOID +ClasspRetryDpcTimer( + IN PCLASS_PRIVATE_FDO_DATA FdoData + ) +{ + LARGE_INTEGER fire; + + ASSERT(FdoData->Retry.Tick.QuadPart != (LONGLONG)0); + ASSERT(FdoData->Retry.ListHead != NULL); // never fire an empty list + + // + // fire == (CurrentTick - now) * (100ns per tick) + // + // NOTE: Overflow is nearly impossible and is ignored here + // + + KeQueryTickCount(&fire); + fire.QuadPart = FdoData->Retry.Tick.QuadPart - fire.QuadPart; + fire.QuadPart *= FdoData->Retry.Granularity; + + // + // fire is now multiples of 100ns until should fire the timer. + // if timer should already have expired, or would fire too quickly, + // fire it in some arbitrary number of ticks to prevent infinitely + // recursing. + // + + if (fire.QuadPart < MINIMUM_RETRY_UNITS) { + fire.QuadPart = MINIMUM_RETRY_UNITS; + } + + DebugPrint((ClassDebugDelayedRetry, + "ClassRetry: ======= %I64x ticks\n", + fire.QuadPart)); + + // + // must use negative to specify relative time to fire + // + + fire.QuadPart = fire.QuadPart * ((LONGLONG)-1); + + // + // set the timer, since this is the first addition + // + + KeSetTimerEx(&FdoData->Retry.Timer, fire, 0, &FdoData->Retry.Dpc); + + return; +} // end ClasspRetryDpcTimer() + +NTSTATUS +ClasspInitializeHotplugInfo( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) +{ + PCLASS_PRIVATE_FDO_DATA fdoData = FdoExtension->PrivateFdoData; + DEVICE_REMOVAL_POLICY deviceRemovalPolicy; + NTSTATUS status; + ULONG resultLength = 0; + ULONG writeCacheOverride; + + PAGED_CODE(); + + // + // start with some default settings + // + RtlZeroMemory(&(fdoData->HotplugInfo), sizeof(STORAGE_HOTPLUG_INFO)); + + // + // set the size (aka version) + // + + fdoData->HotplugInfo.Size = sizeof(STORAGE_HOTPLUG_INFO); + + // + // set if the device has removable media + // + + if (FdoExtension->DeviceDescriptor->RemovableMedia) { + fdoData->HotplugInfo.MediaRemovable = TRUE; + } else { + fdoData->HotplugInfo.MediaRemovable = FALSE; + } + + // + // this refers to devices which, for reasons not yet understood, + // do not fail PREVENT_MEDIA_REMOVAL requests even though they + // have no way to lock the media into the drive. this allows + // the filesystems to turn off delayed-write caching for these + // devices as well. + // + + if (TEST_FLAG(FdoExtension->PrivateFdoData->HackFlags, + FDO_HACK_CANNOT_LOCK_MEDIA)) { + fdoData->HotplugInfo.MediaHotplug = TRUE; + } else { + fdoData->HotplugInfo.MediaHotplug = FALSE; + } + + + // + // Look into the registry to see if the user has chosen + // to override the default setting for the removal policy + // + + RtlZeroMemory(&deviceRemovalPolicy, sizeof(DEVICE_REMOVAL_POLICY)); + + ClassGetDeviceParameter(FdoExtension, + CLASSP_REG_SUBKEY_NAME, + CLASSP_REG_REMOVAL_POLICY_VALUE_NAME, + (PULONG)&deviceRemovalPolicy); + + if (deviceRemovalPolicy == 0) + { + // + // Query the default removal policy from the kernel + // + + status = IoGetDeviceProperty(FdoExtension->LowerPdo, + DevicePropertyRemovalPolicy, + sizeof(DEVICE_REMOVAL_POLICY), + (PVOID)&deviceRemovalPolicy, + &resultLength); + if (!NT_SUCCESS(status)) + { + return status; + } + + if (resultLength != sizeof(DEVICE_REMOVAL_POLICY)) + { + return STATUS_UNSUCCESSFUL; + } + } + + // + // use this info to set the DeviceHotplug setting + // don't rely on DeviceCapabilities, since it can't properly + // determine device relations, etc. let the kernel figure this + // stuff out instead. + // + + if (deviceRemovalPolicy == RemovalPolicyExpectSurpriseRemoval) { + fdoData->HotplugInfo.DeviceHotplug = TRUE; + } else { + fdoData->HotplugInfo.DeviceHotplug = FALSE; + } + + // + // this refers to the *filesystem* caching, but has to be included + // here since it's a per-device setting. this may change to be + // stored by the system in the future. + // + + writeCacheOverride = FALSE; + ClassGetDeviceParameter(FdoExtension, + CLASSP_REG_SUBKEY_NAME, + CLASSP_REG_WRITE_CACHE_VALUE_NAME, + &writeCacheOverride); + + if (writeCacheOverride) { + fdoData->HotplugInfo.WriteCacheEnableOverride = TRUE; + } else { + fdoData->HotplugInfo.WriteCacheEnableOverride = FALSE; + } + + return STATUS_SUCCESS; +} + +VOID +ClasspScanForClassHacks( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN ULONG_PTR Data + ) +{ + PAGED_CODE(); + + // + // remove invalid flags and save + // + + CLEAR_FLAG(Data, FDO_HACK_INVALID_FLAGS); + SET_FLAG(FdoExtension->PrivateFdoData->HackFlags, Data); + return; +} + +VOID +ClasspScanForSpecialInRegistry( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) +{ + HANDLE deviceParameterHandle; // device instance key + HANDLE classParameterHandle; // classpnp subkey + OBJECT_ATTRIBUTES objectAttributes; + UNICODE_STRING subkeyName; + NTSTATUS status; + + // + // seeded in the ENUM tree by ClassInstaller + // + ULONG deviceHacks; + RTL_QUERY_REGISTRY_TABLE queryTable[2]; // null terminated array + + PAGED_CODE(); + + deviceParameterHandle = NULL; + classParameterHandle = NULL; + deviceHacks = 0; + + status = IoOpenDeviceRegistryKey(FdoExtension->LowerPdo, + PLUGPLAY_REGKEY_DEVICE, + KEY_WRITE, + &deviceParameterHandle + ); + + if (!NT_SUCCESS(status)) { + goto cleanupScanForSpecial; + } + + RtlInitUnicodeString(&subkeyName, CLASSP_REG_SUBKEY_NAME); + InitializeObjectAttributes(&objectAttributes, + &subkeyName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + deviceParameterHandle, + NULL + ); + + status = ZwOpenKey( &classParameterHandle, + KEY_READ, + &objectAttributes + ); + + if (!NT_SUCCESS(status)) { + goto cleanupScanForSpecial; + } + + // + // Zero out the memory + // + + RtlZeroMemory(&queryTable[0], 2*sizeof(RTL_QUERY_REGISTRY_TABLE)); + + // + // Setup the structure to read + // + + queryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; + queryTable[0].Name = CLASSP_REG_HACK_VALUE_NAME; + queryTable[0].EntryContext = &deviceHacks; + queryTable[0].DefaultType = REG_DWORD; + queryTable[0].DefaultData = &deviceHacks; + queryTable[0].DefaultLength = 0; + + // + // read values + // + + status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE, + (PWSTR)classParameterHandle, + &queryTable[0], + NULL, + NULL + ); + if (!NT_SUCCESS(status)) { + goto cleanupScanForSpecial; + } + + // + // remove unknown values and save... + // + + KdPrintEx((DPFLTR_CLASSPNP_ID, DPFLTR_ERROR_LEVEL, + "Classpnp => ScanForSpecial: HackFlags %#08x\n", + deviceHacks)); + + CLEAR_FLAG(deviceHacks, FDO_HACK_INVALID_FLAGS); + SET_FLAG(FdoExtension->PrivateFdoData->HackFlags, deviceHacks); + + +cleanupScanForSpecial: + + if (deviceParameterHandle) { + ZwClose(deviceParameterHandle); + } + + if (classParameterHandle) { + ZwClose(classParameterHandle); + } + + // + // we should modify the system hive to include another key for us to grab + // settings from. in this case: Classpnp\HackFlags + // + // the use of a DWORD value for the HackFlags allows 32 hacks w/o + // significant use of the registry, and also reduces OEM exposure. + // + // definition of bit flags: + // 0x00000001 -- Device succeeds PREVENT_MEDIUM_REMOVAL, but + // cannot actually prevent removal. + // 0x00000002 -- Device hard-hangs or times out for GESN requests. + // 0xfffffffc -- Currently reserved, may be used later. + // + + return; +} + + + + diff --git a/drivers/storage/classpnp/class.def b/drivers/storage/classpnp/class.def new file mode 100644 index 00000000000..f6a2311b642 --- /dev/null +++ b/drivers/storage/classpnp/class.def @@ -0,0 +1,61 @@ +NAME CLASSPNP.SYS + +EXPORTS + ClassInitialize@12 + ClassInitializeEx@12 + ClassGetDescriptor@12 + ClassReadDriveCapacity@4 + ClassReleaseQueue@4 + ClassAsynchronousCompletion@12 + ClassSplitRequest@12 + ClassDeviceControl@8 + ClassIoComplete@12 + ClassIoCompleteAssociated@12 + ClassInterpretSenseInfo@28 + ClassSendDeviceIoControlSynchronous@28 + ClassSendIrpSynchronous@8 + ClassForwardIrpSynchronous@8 + ClassSendSrbSynchronous@20 + ClassSendSrbAsynchronous@24 + ClassBuildRequest@8 + ClassModeSense@16 + ClassFindModePage@16 + ClassClaimDevice@8 + ClassInternalIoControl@8 + ClassCreateDeviceObject@20 + ClassRemoveDevice@8 + ClassInitializeSrbLookasideList@8 + ClassDeleteSrbLookasideList@4 + ClassQueryTimeOutRegistryValue@4 + ClassInvalidateBusRelations@4 + ClassMarkChildrenMissing@4 + ClassMarkChildMissing@8 + ClassDebugPrint + ClassGetDriverExtension@4 + ClassCompleteRequest@12 + ClassReleaseRemoveLock@8 + ClassAcquireRemoveLockEx@16 + ClassUpdateInformationInRegistry@20 + ClassWmiCompleteRequest@20 + ClassWmiFireEvent@20 + ClassGetVpb@4 + ClassSetFailurePredictionPoll@12 + ClassNotifyFailurePredicted@32 + ClassInitializeTestUnitPolling@8 + ClassSignalCompletion@12 + ClassSendStartUnit@4 + ClassSetMediaChangeState@12 + ClassResetMediaChangeTimer@4 + ClassCheckMediaState@4 + ClassInitializeMediaChangeDetection@8 + ClassCleanupMediaChangeDetection@4 + ClassEnableMediaChangeDetection@4 + ClassDisableMediaChangeDetection@4 + ClassSpinDownPowerHandler@8 + ClassStopUnitPowerHandler@8 + ClassAcquireChildLock@4 + ClassReleaseChildLock@4 + ClassScanForSpecial@12 + ClassSetDeviceParameter@16 + ClassGetDeviceParameter@16 + diff --git a/drivers/storage/classpnp/class.rc b/drivers/storage/classpnp/class.rc new file mode 100644 index 00000000000..4ee7e3d9eef --- /dev/null +++ b/drivers/storage/classpnp/class.rc @@ -0,0 +1,23 @@ +//+------------------------------------------------------------------------- +// +// Microsoft Windows +// +// Copyright (C) Microsoft Corporation, 1996 - 1999 +// +// File: class.rc +// +//-------------------------------------------------------------------------- + +#include + +#include + +#define VER_FILETYPE VFT_DRV +#define VER_FILESUBTYPE VFT2_DRV_SYSTEM +#define VER_FILEDESCRIPTION_STR "SCSI Class System Dll" +#define VER_INTERNALNAME_STR "Classpnp.sys" +#define VER_ORIGINALFILENAME_STR "Classpnp.sys" +#define VER_LANGNEUTRAL + +#include "common.ver" + diff --git a/drivers/storage/classpnp/classp.h b/drivers/storage/classpnp/classp.h new file mode 100644 index 00000000000..43dc218a309 --- /dev/null +++ b/drivers/storage/classpnp/classp.h @@ -0,0 +1,907 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + classp.h + +Abstract: + + Private header file for classpnp.sys modules. This contains private + structure and function declarations as well as constant values which do + not need to be exported. + +Author: + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + + +#include +#include +#include + +#include +#include +#include + +#if CLASS_INIT_GUID +#include +#endif + +#include +#include +#include + +extern CLASSPNP_SCAN_FOR_SPECIAL_INFO ClassBadItems[]; + +extern GUID ClassGuidQueryRegInfoEx; + + +#define CLASSP_REG_SUBKEY_NAME (L"Classpnp") + +#define CLASSP_REG_HACK_VALUE_NAME (L"HackMask") +#define CLASSP_REG_MMC_DETECTION_VALUE_NAME (L"MMCDetectionState") +#define CLASSP_REG_WRITE_CACHE_VALUE_NAME (L"WriteCacheEnableOverride") +#define CLASSP_REG_PERF_RESTORE_VALUE_NAME (L"RestorePerfAtCount") +#define CLASSP_REG_REMOVAL_POLICY_VALUE_NAME (L"UserRemovalPolicy") + +#define CLASS_PERF_RESTORE_MINIMUM (0x10) +#define CLASS_ERROR_LEVEL_1 (0x4) +#define CLASS_ERROR_LEVEL_2 (0x8) + +#define FDO_HACK_CANNOT_LOCK_MEDIA (0x00000001) +#define FDO_HACK_GESN_IS_BAD (0x00000002) +#define FDO_HACK_NO_SYNC_CACHE (0x00000004) + +#define FDO_HACK_VALID_FLAGS (0x00000007) +#define FDO_HACK_INVALID_FLAGS (~FDO_HACK_VALID_FLAGS) + +/* + * Lots of retries of synchronized SCSI commands that devices may not + * even support really slows down the system (especially while booting). + * (Even GetDriveCapacity may be failed on purpose if an external disk is powered off). + * If a disk cannot return a small initialization buffer at startup + * in two attempts (with delay interval) then we cannot expect it to return + * data consistently with four retries. + * So don't set the retry counts as high here as for data SRBs. + * + * If we find that these requests are failing consecutively, + * despite the retry interval, on otherwise reliable media, + * then we should either increase the retry interval for + * that failure or (by all means) increase these retry counts as appropriate. + */ +#define NUM_LOCKMEDIAREMOVAL_RETRIES 1 +#define NUM_MODESENSE_RETRIES 1 +#define NUM_DRIVECAPACITY_RETRIES 1 + + +#define CLASS_FILE_OBJECT_EXTENSION_KEY 'eteP' +#define CLASSP_VOLUME_VERIFY_CHECKED 0x34 + +#define CLASS_TAG_PRIVATE_DATA 'CPcS' +#define CLASS_TAG_PRIVATE_DATA_FDO 'FPcS' +#define CLASS_TAG_PRIVATE_DATA_PDO 'PPcS' + +struct _MEDIA_CHANGE_DETECTION_INFO { + + // + // Mutex to synchronize enable/disable requests and media state changes + // + + KMUTEX MediaChangeMutex; + + // + // The current state of the media (present, not present, unknown) + // protected by MediaChangeSynchronizationEvent + // + + MEDIA_CHANGE_DETECTION_STATE MediaChangeDetectionState; + + // + // This is a count of how many time MCD has been disabled. if it is + // set to zero, then we'll poll the device for MCN events with the + // then-current method (ie. TEST UNIT READY or GESN). this is + // protected by MediaChangeMutex + // + + LONG MediaChangeDetectionDisableCount; + + + // + // The timer value to support media change events. This is a countdown + // value used to determine when to poll the device for a media change. + // The max value for the timer is 255 seconds. This is not protected + // by an event -- simply InterlockedExchanged() as needed. + // + + LONG MediaChangeCountDown; + + // + // recent changes allowed instant retries of the MCN irp. Since this + // could cause an infinite loop, keep a count of how many times we've + // retried immediately so that we can catch if the count exceeds an + // arbitrary limit. + // + + LONG MediaChangeRetryCount; + + // + // use GESN if it's available + // + + struct { + BOOLEAN Supported; + BOOLEAN HackEventMask; + UCHAR EventMask; + UCHAR NoChangeEventMask; + PUCHAR Buffer; + PMDL Mdl; + ULONG BufferSize; + } Gesn; + + // + // If this value is one, then the irp is currently in use. + // If this value is zero, then the irp is available. + // Use InterlockedCompareExchange() to set from "available" to "in use". + // ASSERT that InterlockedCompareExchange() showed previous value of + // "in use" when changing back to "available" state. + // This also implicitly protects the MediaChangeSrb and SenseBuffer + // + + LONG MediaChangeIrpInUse; + + // + // Pointer to the irp to be used for media change detection. + // protected by Interlocked MediaChangeIrpInUse + // + + PIRP MediaChangeIrp; + + // + // The srb for the media change detection. + // protected by Interlocked MediaChangeIrpInUse + // + + SCSI_REQUEST_BLOCK MediaChangeSrb; + PUCHAR SenseBuffer; + ULONG SrbFlags; + + // + // Second timer to keep track of how long the media change IRP has been + // in use. If this value exceeds the timeout (#defined) then we should + // print out a message to the user and set the MediaChangeIrpLost flag + // protected by using Interlocked() operations in ClasspSendMediaStateIrp, + // the only routine which should modify this value. + // + + LONG MediaChangeIrpTimeInUse; + + // + // Set by CdRomTickHandler when we determine that the media change irp has + // been lost + // + + BOOLEAN MediaChangeIrpLost; + +}; + +typedef enum { + SimpleMediaLock, + SecureMediaLock, + InternalMediaLock +} MEDIA_LOCK_TYPE, *PMEDIA_LOCK_TYPE; + +typedef struct _FAILURE_PREDICTION_INFO { + FAILURE_PREDICTION_METHOD Method; + ULONG CountDown; // Countdown timer + ULONG Period; // Countdown period + + PIO_WORKITEM WorkQueueItem; + + KEVENT Event; +} FAILURE_PREDICTION_INFO, *PFAILURE_PREDICTION_INFO; + + + +// +// This struct must always fit within four PVOIDs of info, +// as it uses the irp's "PVOID DriverContext[4]" to store +// this info +// +typedef struct _CLASS_RETRY_INFO { + struct _CLASS_RETRY_INFO *Next; +} CLASS_RETRY_INFO, *PCLASS_RETRY_INFO; + + + +typedef struct _CSCAN_LIST { + + // + // The current block which has an outstanding request. + // + + ULONGLONG BlockNumber; + + // + // The list of blocks past the CurrentBlock to which we're going to do + // i/o. This list is maintained in sorted order. + // + + LIST_ENTRY CurrentSweep; + + // + // The list of blocks behind the current block for which we'll have to + // wait until the next scan across the disk. This is kept as a stack, + // the cost of sorting it is taken when it's moved over to be the + // running list. + // + + LIST_ENTRY NextSweep; + +} CSCAN_LIST, *PCSCAN_LIST; + +// +// add to the front of this structure to help prevent illegal +// snooping by other utilities. +// + + + +typedef enum _CLASS_DETECTION_STATE { + ClassDetectionUnknown = 0, + ClassDetectionUnsupported = 1, + ClassDetectionSupported = 2 +} CLASS_DETECTION_STATE, *PCLASS_DETECTION_STATE; + + +typedef struct _CLASS_ERROR_LOG_DATA { + LARGE_INTEGER TickCount; // Offset 0x00 + ULONG PortNumber; // Offset 0x08 + + UCHAR ErrorPaging : 1; // Offset 0x0c + UCHAR ErrorRetried : 1; + UCHAR ErrorUnhandled : 1; + UCHAR ErrorReserved : 5; + + UCHAR Reserved[3]; + + SCSI_REQUEST_BLOCK Srb; // Offset 0x10 + + /* + * We define the SenseData as the default length. + * Since the sense data returned by the port driver may be longer, + * SenseData must be at the end of this structure. + * For our internal error log, we only log the default length. + */ + SENSE_DATA SenseData; // Offset 0x50 for x86 (or 0x68 for ia64) (ULONG32 Alignment required!) +} CLASS_ERROR_LOG_DATA, *PCLASS_ERROR_LOG_DATA; + +#define NUM_ERROR_LOG_ENTRIES 16 + + + +typedef struct _TRANSFER_PACKET { + + LIST_ENTRY AllPktsListEntry; // entry in fdoData's static AllTransferPacketsList + SINGLE_LIST_ENTRY SlistEntry; // for when in free list (use fast slist) + + PIRP Irp; + PDEVICE_OBJECT Fdo; + + /* + * This is the client IRP that this TRANSFER_PACKET is currently + * servicing. + */ + PIRP OriginalIrp; + BOOLEAN CompleteOriginalIrpWhenLastPacketCompletes; + + /* + * Stuff for retrying the transfer. + */ + ULONG NumRetries; + KTIMER RetryTimer; + KDPC RetryTimerDPC; + ULONG RetryIntervalSec; + + /* + * Event for synchronizing the transfer (optional). + * (Note that we can't have the event in the packet itself because + * by the time a thread waits on an event the packet may have + * been completed and re-issued. + */ + PKEVENT SyncEventPtr; + + /* + * Stuff for retrying during extreme low-memory stress + * (when we retry 1 page at a time). + */ + BOOLEAN InLowMemRetry; + PUCHAR LowMemRetry_remainingBufPtr; + ULONG LowMemRetry_remainingBufLen; + LARGE_INTEGER LowMemRetry_nextChunkTargetLocation; + + /* + * Fields used for cancelling the packet. + */ + // BOOLEAN Cancelled; + // KEVENT CancelledEvent; + + /* + * We keep the buffer and length values here as well + * as in the SRB because some miniports return + * the transferred length in SRB.DataTransferLength, + * and if the SRB failed we need that value again for the retry. + * We don't trust the lower stack to preserve any of these values in the SRB. + */ + PUCHAR BufPtrCopy; + ULONG BufLenCopy; + LARGE_INTEGER TargetLocationCopy; + + /* + * This is a standard SCSI structure that receives a detailed + * report about a SCSI error on the hardware. + */ + SENSE_DATA SrbErrorSenseData; + + /* + * This is the SRB block for this TRANSFER_PACKET. + * For IOCTLs, the SRB block includes two DWORDs for + * device object and ioctl code; so these must + * immediately follow the SRB block. + */ + SCSI_REQUEST_BLOCK Srb; + // ULONG SrbIoctlDevObj; // not handling ioctls yet + // ULONG SrbIoctlCode; + +} TRANSFER_PACKET, *PTRANSFER_PACKET; + +/* + * MIN_INITIAL_TRANSFER_PACKETS is the minimum number of packets that + * we preallocate at startup for each device (we need at least one packet + * to guarantee forward progress during memory stress). + * MIN_WORKINGSET_TRANSFER_PACKETS is the number of TRANSFER_PACKETs + * we allow to build up and remain for each device; + * we _lazily_ work down to this number when they're not needed. + * MAX_WORKINGSET_TRANSFER_PACKETS is the number of TRANSFER_PACKETs + * that we _immediately_ reduce to when they are not needed. + * + * The absolute maximum number of packets that we will allocate is + * whatever is required by the current activity, up to the memory limit; + * as soon as stress ends, we snap down to MAX_WORKINGSET_TRANSFER_PACKETS; + * we then lazily work down to MIN_WORKINGSET_TRANSFER_PACKETS. + */ +#define MIN_INITIAL_TRANSFER_PACKETS 1 +#define MIN_WORKINGSET_TRANSFER_PACKETS_Consumer 4 +#define MAX_WORKINGSET_TRANSFER_PACKETS_Consumer 64 +#define MIN_WORKINGSET_TRANSFER_PACKETS_Server 64 +#define MAX_WORKINGSET_TRANSFER_PACKETS_Server 1024 +#define MIN_WORKINGSET_TRANSFER_PACKETS_Enterprise 256 +#define MAX_WORKINGSET_TRANSFER_PACKETS_Enterprise 2048 + + +// +// add to the front of this structure to help prevent illegal +// snooping by other utilities. +// +struct _CLASS_PRIVATE_FDO_DATA { + + // + // this private structure allows us to + // dynamically re-enable the perf benefits + // lost due to transient error conditions. + // in w2k, a reboot was required. :( + // + struct { + ULONG OriginalSrbFlags; + ULONG SuccessfulIO; + ULONG ReEnableThreshhold; // 0 means never + } Perf; + + ULONG_PTR HackFlags; + + STORAGE_HOTPLUG_INFO HotplugInfo; + + // Legacy. Still used by obsolete legacy code. + struct { + LARGE_INTEGER Delta; // in ticks + LARGE_INTEGER Tick; // when it should fire + PCLASS_RETRY_INFO ListHead; // singly-linked list + ULONG Granularity; // static + KSPIN_LOCK Lock; // protective spin lock + KDPC Dpc; // DPC routine object + KTIMER Timer; // timer to fire DPC + } Retry; + + BOOLEAN TimerStarted; + BOOLEAN LoggedTURFailureSinceLastIO; + + // + // privately allocated release queue irp + // protected by fdoExtension->ReleaseQueueSpinLock + // + BOOLEAN ReleaseQueueIrpAllocated; + PIRP ReleaseQueueIrp; + + /* + * Queues for TRANSFER_PACKETs that contextualize the IRPs and SRBs + * that we send down to the port driver. + * (The free list is an slist so that we can use fast + * interlocked operations on it; but the relatively-static + * AllTransferPacketsList list has to be + * a doubly-linked list since we have to dequeue from the middle). + */ + LIST_ENTRY AllTransferPacketsList; + SLIST_HEADER FreeTransferPacketsList; + ULONG NumFreeTransferPackets; + ULONG NumTotalTransferPackets; + ULONG DbgPeakNumTransferPackets; + + /* + * Queue for deferred client irps + */ + LIST_ENTRY DeferredClientIrpList; + + /* + * Precomputed maximum transfer length for the hardware. + */ + ULONG HwMaxXferLen; + + /* + * SCSI_REQUEST_BLOCK template preconfigured with the constant values. + * This is slapped into the SRB in the TRANSFER_PACKET for each transfer. + */ + SCSI_REQUEST_BLOCK SrbTemplate; + + KSPIN_LOCK SpinLock; + + /* + * Circular array of timestamped logs of errors that occurred on this device. + */ + ULONG ErrorLogNextIndex; + CLASS_ERROR_LOG_DATA ErrorLogs[NUM_ERROR_LOG_ENTRIES]; + +}; + + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + + +#define NOT_READY_RETRY_INTERVAL 10 +#define MINIMUM_RETRY_UNITS ((LONGLONG)32) + + +/* + * Simple singly-linked-list queuing macros, with no synchronization. + */ +static inline VOID SimpleInitSlistHdr(SINGLE_LIST_ENTRY *SListHdr) +{ + SListHdr->Next = NULL; +} +static inline VOID SimplePushSlist(SINGLE_LIST_ENTRY *SListHdr, SINGLE_LIST_ENTRY *SListEntry) +{ + SListEntry->Next = SListHdr->Next; + SListHdr->Next = SListEntry; +} +static inline SINGLE_LIST_ENTRY *SimplePopSlist(SINGLE_LIST_ENTRY *SListHdr) +{ + SINGLE_LIST_ENTRY *sListEntry = SListHdr->Next; + if (sListEntry){ + SListHdr->Next = sListEntry->Next; + sListEntry->Next = NULL; + } + return sListEntry; +} +static inline BOOLEAN SimpleIsSlistEmpty(SINGLE_LIST_ENTRY *SListHdr) +{ + return (SListHdr->Next == NULL); +} + +NTSTATUS +DriverEntry( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath + ); + +VOID +ClassUnload( + IN PDRIVER_OBJECT DriverObject + ); + +NTSTATUS +ClassCreateClose( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +ClasspCreateClose( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +VOID +ClasspCleanupProtectedLocks( + IN PFILE_OBJECT_EXTENSION FsContext + ); + +NTSTATUS +ClasspEjectionControl( + IN PDEVICE_OBJECT Fdo, + IN PIRP Irp, + IN MEDIA_LOCK_TYPE LockType, + IN BOOLEAN Lock + ); + +NTSTATUS +ClassReadWrite( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +ClassDeviceControlDispatch( + PDEVICE_OBJECT DeviceObject, + PIRP Irp + ); + +NTSTATUS +ClassDeviceControl( + PDEVICE_OBJECT DeviceObject, + PIRP Irp + ); + +NTSTATUS +ClassDispatchPnp( + PDEVICE_OBJECT DeviceObject, + PIRP Irp + ); + +NTSTATUS +ClassPnpStartDevice( + IN PDEVICE_OBJECT DeviceObject + ); + +NTSTATUS +ClassInternalIoControl ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +ClassShutdownFlush( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +ClassSystemControl( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +// +// Class internal routines +// + +NTSTATUS +ClassAddDevice( + IN PDRIVER_OBJECT DriverObject, + IN OUT PDEVICE_OBJECT PhysicalDeviceObject + ); + +NTSTATUS +ClasspSendSynchronousCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ); + +VOID +RetryRequest( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PSCSI_REQUEST_BLOCK Srb, + BOOLEAN Associated, + ULONG RetryInterval + ); + +NTSTATUS +ClassIoCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ); + +NTSTATUS +ClassPnpQueryFdoRelations( + IN PDEVICE_OBJECT Fdo, + IN PIRP Irp + ); + +NTSTATUS +ClassRetrieveDeviceRelations( + IN PDEVICE_OBJECT Fdo, + IN DEVICE_RELATION_TYPE RelationType, + OUT PDEVICE_RELATIONS *DeviceRelations + ); + +NTSTATUS +ClassGetPdoId( + IN PDEVICE_OBJECT Pdo, + IN BUS_QUERY_ID_TYPE IdType, + IN PUNICODE_STRING IdString + ); + +NTSTATUS +ClassQueryPnpCapabilities( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PDEVICE_CAPABILITIES Capabilities + ); + +VOID +ClasspStartIo( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +ClasspPagingNotificationCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PDEVICE_OBJECT RealDeviceObject + ); + +NTSTATUS +ClasspMediaChangeCompletion( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID Context + ); + +PFILE_OBJECT_EXTENSION +ClasspGetFsContext( + IN PCOMMON_DEVICE_EXTENSION CommonExtension, + IN PFILE_OBJECT FileObject + ); + +NTSTATUS +ClasspMcnControl( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PIRP Irp, + IN PSCSI_REQUEST_BLOCK Srb + ); + +VOID +ClasspRegisterMountedDeviceInterface( + IN PDEVICE_OBJECT DeviceObject + ); + +NTSTATUS +ClasspDisableTimer( + PDEVICE_OBJECT DeviceObject + ); + +NTSTATUS +ClasspEnableTimer( + PDEVICE_OBJECT DeviceObject + ); + +// +// routines for dictionary list support +// + +VOID +InitializeDictionary( + IN PDICTIONARY Dictionary + ); + +BOOLEAN +TestDictionarySignature( + IN PDICTIONARY Dictionary + ); + +NTSTATUS +AllocateDictionaryEntry( + IN PDICTIONARY Dictionary, + IN ULONGLONG Key, + IN ULONG Size, + IN ULONG Tag, + OUT PVOID *Entry + ); + +PVOID +GetDictionaryEntry( + IN PDICTIONARY Dictionary, + IN ULONGLONG Key + ); + +VOID +FreeDictionaryEntry( + IN PDICTIONARY Dictionary, + IN PVOID Entry + ); + + +NTSTATUS +ClasspAllocateReleaseRequest( + IN PDEVICE_OBJECT Fdo + ); + +VOID +ClasspFreeReleaseRequest( + IN PDEVICE_OBJECT Fdo + ); + +NTSTATUS +ClassReleaseQueueCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ); + +VOID +ClasspReleaseQueue( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP ReleaseQueueIrp + ); + +VOID +ClasspDisablePowerNotification( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension +); + +// +// class power routines +// + +NTSTATUS +ClassDispatchPower( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +ClassMinimalPowerHandler( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +// +// Child list routines +// + +VOID +ClassAddChild( + IN PFUNCTIONAL_DEVICE_EXTENSION Parent, + IN PPHYSICAL_DEVICE_EXTENSION Child, + IN BOOLEAN AcquireLock + ); + +PPHYSICAL_DEVICE_EXTENSION +ClassRemoveChild( + IN PFUNCTIONAL_DEVICE_EXTENSION Parent, + IN PPHYSICAL_DEVICE_EXTENSION Child, + IN BOOLEAN AcquireLock + ); + +VOID +ClasspRetryDpcTimer( + IN PCLASS_PRIVATE_FDO_DATA FdoData + ); + +VOID +ClasspRetryRequestDpc( + IN PKDPC Dpc, + IN PDEVICE_OBJECT DeviceObject, + IN PVOID Arg1, + IN PVOID Arg2 + ); + +VOID +ClassFreeOrReuseSrb( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PSCSI_REQUEST_BLOCK Srb + ); + +VOID +ClassRetryRequest( + IN PDEVICE_OBJECT SelfDeviceObject, + IN PIRP Irp, + IN LARGE_INTEGER TimeDelta100ns // in 100ns units + ); + +VOID +ClasspBuildRequestEx( + IN PFUNCTIONAL_DEVICE_EXTENSION Fdo, + IN PIRP Irp, + IN PSCSI_REQUEST_BLOCK Srb + ); + +NTSTATUS +ClasspAllocateReleaseQueueIrp( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ); + +NTSTATUS +ClasspInitializeGesn( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PMEDIA_CHANGE_DETECTION_INFO Info + ); + +VOID +ClasspSendNotification( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN const GUID * Guid, + IN ULONG ExtraDataSize, + IN PVOID ExtraData + ); + +VOID +ClassSendEjectionNotification( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ); + +VOID +ClasspScanForSpecialInRegistry( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ); + +VOID +ClasspScanForClassHacks( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN ULONG_PTR Data + ); + +NTSTATUS +ClasspInitializeHotplugInfo( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ); + +VOID +ClasspPerfIncrementErrorCount( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ); +VOID +ClasspPerfIncrementSuccessfulIo( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ); + + +PTRANSFER_PACKET NewTransferPacket(PDEVICE_OBJECT Fdo); +VOID DestroyTransferPacket(PTRANSFER_PACKET Pkt); +VOID EnqueueFreeTransferPacket(PDEVICE_OBJECT Fdo, PTRANSFER_PACKET Pkt); +PTRANSFER_PACKET DequeueFreeTransferPacket(PDEVICE_OBJECT Fdo, BOOLEAN AllocIfNeeded); +VOID SetupReadWriteTransferPacket(PTRANSFER_PACKET pkt, PVOID Buf, ULONG Len, LARGE_INTEGER DiskLocation, PIRP OriginalIrp); +VOID SubmitTransferPacket(PTRANSFER_PACKET Pkt); +NTSTATUS TransferPktComplete(IN PDEVICE_OBJECT NullFdo, IN PIRP Irp, IN PVOID Context); +VOID ServiceTransferRequest(PDEVICE_OBJECT Fdo, PIRP Irp); +VOID TransferPacketRetryTimerDpc(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2); +BOOLEAN InterpretTransferPacketError(PTRANSFER_PACKET Pkt); +BOOLEAN RetryTransferPacket(PTRANSFER_PACKET Pkt); +VOID EnqueueDeferredClientIrp(PCLASS_PRIVATE_FDO_DATA FdoData, PIRP Irp); +PIRP DequeueDeferredClientIrp(PCLASS_PRIVATE_FDO_DATA FdoData); +VOID InitLowMemRetry(PTRANSFER_PACKET Pkt, PVOID BufPtr, ULONG Len, LARGE_INTEGER TargetLocation); +BOOLEAN StepLowMemRetry(PTRANSFER_PACKET Pkt); +VOID SetupEjectionTransferPacket(TRANSFER_PACKET *Pkt, BOOLEAN PreventMediaRemoval, PKEVENT SyncEventPtr, PIRP OriginalIrp); +VOID SetupModeSenseTransferPacket(TRANSFER_PACKET *Pkt, PKEVENT SyncEventPtr, PVOID ModeSenseBuffer, UCHAR ModeSenseBufferLen, UCHAR PageMode, PIRP OriginalIrp); +VOID SetupDriveCapacityTransferPacket(TRANSFER_PACKET *Pkt, PVOID ReadCapacityBuffer, ULONG ReadCapacityBufferLen, PKEVENT SyncEventPtr, PIRP OriginalIrp); +PMDL BuildDeviceInputMdl(PVOID Buffer, ULONG BufferLen); +VOID FreeDeviceInputMdl(PMDL Mdl); +NTSTATUS InitializeTransferPackets(PDEVICE_OBJECT Fdo); +VOID DestroyAllTransferPackets(PDEVICE_OBJECT Fdo); + + + + + diff --git a/drivers/storage/classpnp/classwmi.c b/drivers/storage/classpnp/classwmi.c new file mode 100644 index 00000000000..bbd43a6999d --- /dev/null +++ b/drivers/storage/classpnp/classwmi.c @@ -0,0 +1,778 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + classwmi.c + +Abstract: + + SCSI class driver routines + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + +#include "stddef.h" +#include "ntddk.h" +#include "scsi.h" + +#include "classpnp.h" + +#include "mountdev.h" + +#include + +#include "wmistr.h" + +NTSTATUS +ClassSystemControl( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +BOOLEAN +ClassFindGuid( + PGUIDREGINFO GuidList, + ULONG GuidCount, + LPGUID Guid, + PULONG GuidIndex + ); + +// +// This is the name for the MOF resource that must be part of all drivers that +// register via this interface. +#define MOFRESOURCENAME L"MofResourceName" + +// +// What can be paged ??? +#ifdef ALLOC_PRAGMA +#pragma alloc_text(PAGE, ClassSystemControl) +#pragma alloc_text(PAGE, ClassFindGuid) +#endif + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassFindGuid() + +Routine Description: + + This routine will search the list of guids registered and return + the index for the one that was registered. + +Arguments: + + GuidList is the list of guids to search + + GuidCount is the count of guids in the list + + Guid is the guid being searched for + + *GuidIndex returns the index to the guid + +Return Value: + + TRUE if guid is found else FALSE + +--*/ +BOOLEAN +ClassFindGuid( + PGUIDREGINFO GuidList, + ULONG GuidCount, + LPGUID Guid, + PULONG GuidIndex + ) +{ + ULONG i; + + PAGED_CODE(); + + for (i = 0; i < GuidCount; i++) + { + if (IsEqualGUID(Guid, &GuidList[i].Guid)) + { + *GuidIndex = i; + return(TRUE); + } + } + + return(FALSE); +} // end ClassFindGuid() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassSystemControl() + +Routine Description: + + Dispatch routine for IRP_MJ_SYSTEM_CONTROL. This routine will process + all wmi requests received, forwarding them if they are not for this + driver or determining if the guid is valid and if so passing it to + the driver specific function for handing wmi requests. + +Arguments: + + DeviceObject - Supplies a pointer to the device object for this request. + + Irp - Supplies the Irp making the request. + +Return Value: + + status + +--*/ +NTSTATUS +ClassSystemControl( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PCLASS_DRIVER_EXTENSION driverExtension; + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + ULONG isRemoved; + ULONG bufferSize; + PUCHAR buffer; + NTSTATUS status; + UCHAR minorFunction; + ULONG guidIndex; + PCLASS_WMI_INFO classWmiInfo; + + PAGED_CODE(); + + // + // Make sure device has not been removed + isRemoved = ClassAcquireRemoveLock(DeviceObject, Irp); + if(isRemoved) + { + Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST; + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + return STATUS_DEVICE_DOES_NOT_EXIST; + } + + // + // If the irp is not a WMI irp or it is not targetted at this device + // or this device has not regstered with WMI then just forward it on. + minorFunction = irpStack->MinorFunction; + if ((minorFunction > IRP_MN_EXECUTE_METHOD) || + (irpStack->Parameters.WMI.ProviderId != (ULONG_PTR)DeviceObject) || + ((minorFunction != IRP_MN_REGINFO) && + (commonExtension->GuidRegInfo == NULL))) + { + // + // CONSIDER: Do I need to hang onto lock until IoCallDriver returns ? + IoSkipCurrentIrpStackLocation(Irp); + ClassReleaseRemoveLock(DeviceObject, Irp); + return(IoCallDriver(commonExtension->LowerDeviceObject, Irp)); + } + + buffer = (PUCHAR)irpStack->Parameters.WMI.Buffer; + bufferSize = irpStack->Parameters.WMI.BufferSize; + + if (minorFunction != IRP_MN_REGINFO) + { + // + // For all requests other than query registration info we are passed + // a guid. Determine if the guid is one that is supported by the + // device. + if (ClassFindGuid(commonExtension->GuidRegInfo, + commonExtension->GuidCount, + (LPGUID)irpStack->Parameters.WMI.DataPath, + &guidIndex)) + { + status = STATUS_SUCCESS; + } else { + status = STATUS_WMI_GUID_NOT_FOUND; + } + + if (NT_SUCCESS(status) && + ((minorFunction == IRP_MN_QUERY_SINGLE_INSTANCE) || + (minorFunction == IRP_MN_CHANGE_SINGLE_INSTANCE) || + (minorFunction == IRP_MN_CHANGE_SINGLE_ITEM) || + (minorFunction == IRP_MN_EXECUTE_METHOD))) + { + if ( (((PWNODE_HEADER)buffer)->Flags) & + WNODE_FLAG_STATIC_INSTANCE_NAMES) + { + if ( ((PWNODE_SINGLE_INSTANCE)buffer)->InstanceIndex != 0 ) + { + status = STATUS_WMI_INSTANCE_NOT_FOUND; + } + } else { + status = STATUS_WMI_INSTANCE_NOT_FOUND; + } + } + + if (! NT_SUCCESS(status)) + { + Irp->IoStatus.Status = status; + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + return(status); + } + } + + driverExtension = commonExtension->DriverExtension; + + classWmiInfo = commonExtension->IsFdo ? + &driverExtension->InitData.FdoData.ClassWmiInfo : + &driverExtension->InitData.PdoData.ClassWmiInfo; + switch(minorFunction) + { + case IRP_MN_REGINFO: + { + ULONG guidCount; + PGUIDREGINFO guidList; + PWMIREGINFOW wmiRegInfo; + PWMIREGGUIDW wmiRegGuid; + PDEVICE_OBJECT pdo; + PUNICODE_STRING regPath; + PWCHAR stringPtr; + ULONG retSize; + ULONG registryPathOffset; + ULONG mofResourceOffset; + ULONG bufferNeeded; + ULONG i; + ULONG_PTR nameInfo; + ULONG nameSize, nameOffset, nameFlags; + UNICODE_STRING name, mofName; + PCLASS_QUERY_WMI_REGINFO_EX ClassQueryWmiRegInfoEx; + + name.Buffer = NULL; + name.Length = 0; + name.MaximumLength = 0; + nameFlags = 0; + + ClassQueryWmiRegInfoEx = commonExtension->IsFdo ? + driverExtension->ClassFdoQueryWmiRegInfoEx : + driverExtension->ClassPdoQueryWmiRegInfoEx; + + if (ClassQueryWmiRegInfoEx == NULL) + { + status = classWmiInfo->ClassQueryWmiRegInfo( + DeviceObject, + &nameFlags, + &name); + + RtlInitUnicodeString(&mofName, MOFRESOURCENAME); + } else { + RtlInitUnicodeString(&mofName, L""); + status = (*ClassQueryWmiRegInfoEx)( + DeviceObject, + &nameFlags, + &name, + &mofName); + } + + if (NT_SUCCESS(status) && + (! (nameFlags & WMIREG_FLAG_INSTANCE_PDO) && + (name.Buffer == NULL))) + { + // + // if PDO flag not specified then an instance name must be + status = STATUS_INVALID_DEVICE_REQUEST; + } + + if (NT_SUCCESS(status)) + { + guidList = classWmiInfo->GuidRegInfo; + guidCount = classWmiInfo->GuidCount; + + nameOffset = sizeof(WMIREGINFO) + + guidCount * sizeof(WMIREGGUIDW); + + if (nameFlags & WMIREG_FLAG_INSTANCE_PDO) + { + nameSize = 0; + nameInfo = commonExtension->IsFdo ? + (ULONG_PTR)((PFUNCTIONAL_DEVICE_EXTENSION)commonExtension)->LowerPdo : + (ULONG_PTR)DeviceObject; + } else { + nameFlags |= WMIREG_FLAG_INSTANCE_LIST; + nameSize = name.Length + sizeof(USHORT); + nameInfo = nameOffset; + } + + mofResourceOffset = nameOffset + nameSize; + + registryPathOffset = mofResourceOffset + + mofName.Length + sizeof(USHORT); + + regPath = &driverExtension->RegistryPath; + bufferNeeded = registryPathOffset + + regPath->Length + sizeof(USHORT); + + if (bufferNeeded <= bufferSize) + { + retSize = bufferNeeded; + + commonExtension->GuidCount = guidCount; + commonExtension->GuidRegInfo = guidList; + + wmiRegInfo = (PWMIREGINFO)buffer; + wmiRegInfo->BufferSize = bufferNeeded; + wmiRegInfo->NextWmiRegInfo = 0; + wmiRegInfo->MofResourceName = mofResourceOffset; + wmiRegInfo->RegistryPath = registryPathOffset; + wmiRegInfo->GuidCount = guidCount; + + for (i = 0; i < guidCount; i++) + { + wmiRegGuid = &wmiRegInfo->WmiRegGuid[i]; + wmiRegGuid->Guid = guidList[i].Guid; + wmiRegGuid->Flags = guidList[i].Flags | nameFlags; + wmiRegGuid->InstanceInfo = nameInfo; + wmiRegGuid->InstanceCount = 1; + } + + if ( nameFlags & WMIREG_FLAG_INSTANCE_LIST) + { + stringPtr = (PWCHAR)((PUCHAR)buffer + nameOffset); + *stringPtr++ = name.Length; + RtlCopyMemory(stringPtr, + name.Buffer, + name.Length); + } + + stringPtr = (PWCHAR)((PUCHAR)buffer + mofResourceOffset); + *stringPtr++ = mofName.Length; + RtlCopyMemory(stringPtr, + mofName.Buffer, + mofName.Length); + + stringPtr = (PWCHAR)((PUCHAR)buffer + registryPathOffset); + *stringPtr++ = regPath->Length; + RtlCopyMemory(stringPtr, + regPath->Buffer, + regPath->Length); + } else { + *((PULONG)buffer) = bufferNeeded; + retSize = sizeof(ULONG); + } + } else { + retSize = 0; + } + + if (name.Buffer != NULL) + { + ExFreePool(name.Buffer); + } + + Irp->IoStatus.Status = status; + Irp->IoStatus.Information = retSize; + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + return(status); + } + + case IRP_MN_QUERY_ALL_DATA: + { + PWNODE_ALL_DATA wnode; + ULONG bufferAvail; + + wnode = (PWNODE_ALL_DATA)buffer; + + if (bufferSize < sizeof(WNODE_ALL_DATA)) + { + bufferAvail = 0; + } else { + bufferAvail = bufferSize - sizeof(WNODE_ALL_DATA); + } + + wnode->DataBlockOffset = sizeof(WNODE_ALL_DATA); + + status = classWmiInfo->ClassQueryWmiDataBlock( + DeviceObject, + Irp, + guidIndex, + bufferAvail, + buffer + sizeof(WNODE_ALL_DATA)); + + break; + } + + case IRP_MN_QUERY_SINGLE_INSTANCE: + { + PWNODE_SINGLE_INSTANCE wnode; + ULONG dataBlockOffset; + + wnode = (PWNODE_SINGLE_INSTANCE)buffer; + + dataBlockOffset = wnode->DataBlockOffset; + + status = classWmiInfo->ClassQueryWmiDataBlock( + DeviceObject, + Irp, + guidIndex, + bufferSize - dataBlockOffset, + (PUCHAR)wnode + dataBlockOffset); + + break; + } + + case IRP_MN_CHANGE_SINGLE_INSTANCE: + { + PWNODE_SINGLE_INSTANCE wnode; + + wnode = (PWNODE_SINGLE_INSTANCE)buffer; + + status = classWmiInfo->ClassSetWmiDataBlock( + DeviceObject, + Irp, + guidIndex, + wnode->SizeDataBlock, + (PUCHAR)wnode + wnode->DataBlockOffset); + + break; + } + + case IRP_MN_CHANGE_SINGLE_ITEM: + { + PWNODE_SINGLE_ITEM wnode; + + wnode = (PWNODE_SINGLE_ITEM)buffer; + + status = classWmiInfo->ClassSetWmiDataItem( + DeviceObject, + Irp, + guidIndex, + wnode->ItemId, + wnode->SizeDataItem, + (PUCHAR)wnode + wnode->DataBlockOffset); + + break; + } + + case IRP_MN_EXECUTE_METHOD: + { + PWNODE_METHOD_ITEM wnode; + + wnode = (PWNODE_METHOD_ITEM)buffer; + + status = classWmiInfo->ClassExecuteWmiMethod( + DeviceObject, + Irp, + guidIndex, + wnode->MethodId, + wnode->SizeDataBlock, + bufferSize - wnode->DataBlockOffset, + buffer + wnode->DataBlockOffset); + + + break; + } + + case IRP_MN_ENABLE_EVENTS: + { + status = classWmiInfo->ClassWmiFunctionControl( + DeviceObject, + Irp, + guidIndex, + EventGeneration, + TRUE); + break; + } + + case IRP_MN_DISABLE_EVENTS: + { + status = classWmiInfo->ClassWmiFunctionControl( + DeviceObject, + Irp, + guidIndex, + EventGeneration, + FALSE); + break; + } + + case IRP_MN_ENABLE_COLLECTION: + { + status = classWmiInfo->ClassWmiFunctionControl( + DeviceObject, + Irp, + guidIndex, + DataBlockCollection, + TRUE); + break; + } + + case IRP_MN_DISABLE_COLLECTION: + { + status = classWmiInfo->ClassWmiFunctionControl( + DeviceObject, + Irp, + guidIndex, + DataBlockCollection, + FALSE); + break; + } + + default: + { + status = STATUS_INVALID_DEVICE_REQUEST; + break; + } + + } + + return(status); +} // end ClassSystemControl() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassWmiCompleteRequest() + +Routine Description: + + + This routine will do the work of completing a WMI irp. Depending upon the + the WMI request this routine will fixup the returned WNODE appropriately. + + NOTE: This routine assumes that the ClassRemoveLock is held and it will + release it. + +Arguments: + + DeviceObject - Supplies a pointer to the device object for this request. + + Irp - Supplies the Irp making the request. + + Status - Status to complete the irp with. STATUS_BUFFER_TOO_SMALL is used + to indicate that more buffer is required for the data requested. + + BufferUsed - number of bytes of actual data to return (not including WMI + specific structures) + + PriorityBoost - priority boost to pass to ClassCompleteRequest + +Return Value: + + status + +--*/ +SCSIPORTAPI +NTSTATUS +ClassWmiCompleteRequest( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN NTSTATUS Status, + IN ULONG BufferUsed, + IN CCHAR PriorityBoost + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + UCHAR MinorFunction; + PUCHAR buffer; + ULONG retSize; + UCHAR minorFunction; + ULONG bufferSize; + + minorFunction = irpStack->MinorFunction; + buffer = (PUCHAR)irpStack->Parameters.WMI.Buffer; + bufferSize = irpStack->Parameters.WMI.BufferSize; + + switch(minorFunction) + { + case IRP_MN_QUERY_ALL_DATA: + { + PWNODE_ALL_DATA wnode; + PWNODE_TOO_SMALL wnodeTooSmall; + ULONG bufferNeeded; + + wnode = (PWNODE_ALL_DATA)buffer; + + bufferNeeded = sizeof(WNODE_ALL_DATA) + BufferUsed; + + if (NT_SUCCESS(Status)) + { + retSize = bufferNeeded; + wnode->WnodeHeader.BufferSize = bufferNeeded; + KeQuerySystemTime(&wnode->WnodeHeader.TimeStamp); + wnode->WnodeHeader.Flags |= WNODE_FLAG_FIXED_INSTANCE_SIZE; + wnode->FixedInstanceSize = BufferUsed; + wnode->InstanceCount = 1; + + } else if (Status == STATUS_BUFFER_TOO_SMALL) { + wnodeTooSmall = (PWNODE_TOO_SMALL)wnode; + + wnodeTooSmall->WnodeHeader.BufferSize = sizeof(WNODE_TOO_SMALL); + wnodeTooSmall->WnodeHeader.Flags = WNODE_FLAG_TOO_SMALL; + wnodeTooSmall->SizeNeeded = sizeof(WNODE_ALL_DATA) + BufferUsed; + retSize = sizeof(WNODE_TOO_SMALL); + Status = STATUS_SUCCESS; + } else { + retSize = 0; + } + break; + } + + case IRP_MN_QUERY_SINGLE_INSTANCE: + { + PWNODE_SINGLE_INSTANCE wnode; + PWNODE_TOO_SMALL wnodeTooSmall; + ULONG bufferNeeded; + + wnode = (PWNODE_SINGLE_INSTANCE)buffer; + + bufferNeeded = wnode->DataBlockOffset + BufferUsed; + + if (NT_SUCCESS(Status)) + { + retSize = bufferNeeded; + wnode->WnodeHeader.BufferSize = bufferNeeded; + KeQuerySystemTime(&wnode->WnodeHeader.TimeStamp); + wnode->SizeDataBlock = BufferUsed; + + } else if (Status == STATUS_BUFFER_TOO_SMALL) { + wnodeTooSmall = (PWNODE_TOO_SMALL)wnode; + + wnodeTooSmall->WnodeHeader.BufferSize = sizeof(WNODE_TOO_SMALL); + wnodeTooSmall->WnodeHeader.Flags = WNODE_FLAG_TOO_SMALL; + wnodeTooSmall->SizeNeeded = bufferNeeded; + retSize = sizeof(WNODE_TOO_SMALL); + Status = STATUS_SUCCESS; + } else { + retSize = 0; + } + break; + } + + case IRP_MN_EXECUTE_METHOD: + { + PWNODE_METHOD_ITEM wnode; + PWNODE_TOO_SMALL wnodeTooSmall; + ULONG bufferNeeded; + + wnode = (PWNODE_METHOD_ITEM)buffer; + + bufferNeeded = wnode->DataBlockOffset + BufferUsed; + + if (NT_SUCCESS(Status)) + { + retSize = bufferNeeded; + wnode->WnodeHeader.BufferSize = bufferNeeded; + KeQuerySystemTime(&wnode->WnodeHeader.TimeStamp); + wnode->SizeDataBlock = BufferUsed; + + } else if (Status == STATUS_BUFFER_TOO_SMALL) { + wnodeTooSmall = (PWNODE_TOO_SMALL)wnode; + + wnodeTooSmall->WnodeHeader.BufferSize = sizeof(WNODE_TOO_SMALL); + wnodeTooSmall->WnodeHeader.Flags = WNODE_FLAG_TOO_SMALL; + wnodeTooSmall->SizeNeeded = bufferNeeded; + retSize = sizeof(WNODE_TOO_SMALL); + Status = STATUS_SUCCESS; + } else { + retSize = 0; + } + break; + } + + default: + { + // + // All other requests don't return any data + retSize = 0; + break; + } + + } + + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = retSize; + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, PriorityBoost); + return(Status); +} // end ClassWmiCompleteRequest() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassWmiFireEvent() + +Routine Description: + + This routine will fire a WMI event using the data buffer passed. This + routine may be called at or below DPC level + +Arguments: + + DeviceObject - Supplies a pointer to the device object for this event + + Guid is pointer to the GUID that represents the event + + InstanceIndex is the index of the instance of the event + + EventDataSize is the number of bytes of data that is being fired with + with the event + + EventData is the data that is fired with the events. This may be NULL + if there is no data associated with the event + + +Return Value: + + status + +--*/ +NTSTATUS +ClassWmiFireEvent( + IN PDEVICE_OBJECT DeviceObject, + IN LPGUID Guid, + IN ULONG InstanceIndex, + IN ULONG EventDataSize, + IN PVOID EventData + ) +{ + + ULONG sizeNeeded; + PWNODE_SINGLE_INSTANCE event; + NTSTATUS status; + + if (EventData == NULL) + { + EventDataSize = 0; + } + + sizeNeeded = sizeof(WNODE_SINGLE_INSTANCE) + EventDataSize; + + event = ExAllocatePoolWithTag(NonPagedPool, sizeNeeded, CLASS_TAG_WMI); + if (event != NULL) + { + event->WnodeHeader.Guid = *Guid; + event->WnodeHeader.ProviderId = IoWMIDeviceObjectToProviderId(DeviceObject); + event->WnodeHeader.BufferSize = sizeNeeded; + event->WnodeHeader.Flags = WNODE_FLAG_SINGLE_INSTANCE | + WNODE_FLAG_EVENT_ITEM | + WNODE_FLAG_STATIC_INSTANCE_NAMES; + KeQuerySystemTime(&event->WnodeHeader.TimeStamp); + + event->InstanceIndex = InstanceIndex; + event->SizeDataBlock = EventDataSize; + event->DataBlockOffset = sizeof(WNODE_SINGLE_INSTANCE); + if (EventData != NULL) + { + RtlCopyMemory( &event->VariableData, EventData, EventDataSize); + } + + status = IoWMIWriteEvent(event); + if (! NT_SUCCESS(status)) + { + ExFreePool(event); + } + } else { + status = STATUS_INSUFFICIENT_RESOURCES; + } + + return(status); +} // end ClassWmiFireEvent() + diff --git a/drivers/storage/classpnp/clntirp.c b/drivers/storage/classpnp/clntirp.c new file mode 100644 index 00000000000..934e389bf19 --- /dev/null +++ b/drivers/storage/classpnp/clntirp.c @@ -0,0 +1,74 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + clntirp.c + +Abstract: + + Client IRP queuing routines for CLASSPNP + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + +#include "classp.h" +#include "debug.h" + + +/* + * EnqueueDeferredClientIrp + * + * Note: we currently do not support Cancel for storage irps. + */ +VOID EnqueueDeferredClientIrp(PCLASS_PRIVATE_FDO_DATA FdoData, PIRP Irp) +{ + KIRQL oldIrql; + + KeAcquireSpinLock(&FdoData->SpinLock, &oldIrql); + InsertTailList(&FdoData->DeferredClientIrpList, &Irp->Tail.Overlay.ListEntry); + KeReleaseSpinLock(&FdoData->SpinLock, oldIrql); +} + + +/* + * DequeueDeferredClientIrp + * + */ +PIRP DequeueDeferredClientIrp(PCLASS_PRIVATE_FDO_DATA FdoData) +{ + KIRQL oldIrql; + PLIST_ENTRY listEntry; + PIRP irp; + + KeAcquireSpinLock(&FdoData->SpinLock, &oldIrql); + if (IsListEmpty(&FdoData->DeferredClientIrpList)){ + listEntry = NULL; + } + else { + listEntry = RemoveHeadList(&FdoData->DeferredClientIrpList); + } + KeReleaseSpinLock(&FdoData->SpinLock, oldIrql); + + if (listEntry == NULL) { + irp = NULL; + } else { + irp = CONTAINING_RECORD(listEntry, IRP, Tail.Overlay.ListEntry); + ASSERT(irp->Type == IO_TYPE_IRP); + InitializeListHead(&irp->Tail.Overlay.ListEntry); + } + + return irp; +} + + + diff --git a/drivers/storage/classpnp/create.c b/drivers/storage/classpnp/create.c new file mode 100644 index 00000000000..12fc002452f --- /dev/null +++ b/drivers/storage/classpnp/create.c @@ -0,0 +1,977 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + class.c + +Abstract: + + SCSI class driver routines + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + +#define CLASS_INIT_GUID 0 +#include "classp.h" +#include "debug.h" + +ULONG BreakOnClose = 0; + +PUCHAR LockTypeStrings[] = { + "Simple", + "Secure", + "Internal" +}; + + +PFILE_OBJECT_EXTENSION +ClasspGetFsContext( + IN PCOMMON_DEVICE_EXTENSION CommonExtension, + IN PFILE_OBJECT FileObject + ); + +VOID +ClasspCleanupDisableMcn( + IN PFILE_OBJECT_EXTENSION FsContext + ); + +#ifdef ALLOC_PRAGMA +#pragma alloc_text(PAGE, ClassCreateClose) +#pragma alloc_text(PAGE, ClasspCreateClose) +#pragma alloc_text(PAGE, ClasspCleanupProtectedLocks) +#pragma alloc_text(PAGE, ClasspEjectionControl) +#pragma alloc_text(PAGE, ClasspCleanupDisableMcn) +#pragma alloc_text(PAGE, ClasspGetFsContext) +#endif + +NTSTATUS +ClassCreateClose( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) + +/*++ + +Routine Description: + + SCSI class driver create and close routine. This is called by the I/O system + when the device is opened or closed. + +Arguments: + + DriverObject - Pointer to driver object created by system. + + Irp - IRP involved. + +Return Value: + + Device-specific drivers return value or STATUS_SUCCESS. + +--*/ + +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + ULONG removeState; + NTSTATUS status; + + PAGED_CODE(); + + // + // If we're getting a close request then we know the device object hasn't + // been completely destroyed. Let the driver cleanup if necessary. + // + + removeState = ClassAcquireRemoveLock(DeviceObject, Irp); + + // + // Invoke the device-specific routine, if one exists. Otherwise complete + // with SUCCESS + // + + if((removeState == NO_REMOVE) || + IS_CLEANUP_REQUEST(IoGetCurrentIrpStackLocation(Irp)->MajorFunction)) { + + status = ClasspCreateClose(DeviceObject, Irp); + + if((NT_SUCCESS(status)) && + (commonExtension->DevInfo->ClassCreateClose)) { + + return commonExtension->DevInfo->ClassCreateClose(DeviceObject, Irp); + } + + } else { + status = STATUS_DEVICE_DOES_NOT_EXIST; + } + + Irp->IoStatus.Status = status; + ClassReleaseRemoveLock(DeviceObject, Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + return status; +} + + +NTSTATUS +ClasspCreateClose( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +/*++ + +Routine Description: + + This routine will handle create/close operations for a given classpnp + device if the class driver doesn't supply it's own handler. If there + is a file object supplied for our driver (if it's a FO_DIRECT_DEVICE_OPEN + file object) then it will initialize a file extension on create or destroy + the extension on a close. + +Arguments: + + DeviceObject - the device object being opened or closed. + + Irp - the create/close irp + +Return Value: + + status + +--*/ +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + + PFILE_OBJECT fileObject = irpStack->FileObject; + + NTSTATUS status = STATUS_SUCCESS; + + PAGED_CODE(); + + + // + // ISSUE-2000/3/28-henrygab - if lower stack fails create/close, we end up + // in an inconsistent state. re-write to verify all args and allocate all + // required resources, then pass the irp down, then complete the + // transaction. this is because we also cannot forward the irp, then fail + // it after it has succeeded a lower-level driver. + // + + if(irpStack->MajorFunction == IRP_MJ_CREATE) { + + PIO_SECURITY_CONTEXT securityContext = + irpStack->Parameters.Create.SecurityContext; + DebugPrint((2, + "ClasspCREATEClose: create received for device %p\n", + DeviceObject)); + DebugPrint((2, + "ClasspCREATEClose: desired access %lx\n", + securityContext->DesiredAccess)); + DebugPrint((2, + "ClasspCREATEClose: file object %lx\n", + irpStack->FileObject)); + + ASSERT(BreakOnClose == FALSE); + + if(irpStack->FileObject != NULL) { + + PFILE_OBJECT_EXTENSION fsContext; + + // + // Allocate our own file object extension for this device object. + // + + status = AllocateDictionaryEntry( + &commonExtension->FileObjectDictionary, + (ULONGLONG) irpStack->FileObject, + sizeof(FILE_OBJECT_EXTENSION), + CLASS_TAG_FILE_OBJECT_EXTENSION, + &fsContext); + + if(NT_SUCCESS(status)) { + + RtlZeroMemory(fsContext, + sizeof(FILE_OBJECT_EXTENSION)); + + fsContext->FileObject = irpStack->FileObject; + fsContext->DeviceObject = DeviceObject; + } else if (status == STATUS_OBJECT_NAME_COLLISION) { + status = STATUS_SUCCESS; + } + } + + } else { + + DebugPrint((2, + "ClasspCreateCLOSE: close received for device %p\n", + DeviceObject)); + DebugPrint((2, + "ClasspCreateCLOSE: file object %p\n", + fileObject)); + + if(irpStack->FileObject != NULL) { + + PFILE_OBJECT_EXTENSION fsContext = + ClasspGetFsContext(commonExtension, irpStack->FileObject); + + DebugPrint((2, + "ClasspCreateCLOSE: file extension %p\n", + fsContext)); + + if(fsContext != NULL) { + + DebugPrint((2, + "ClasspCreateCLOSE: extension is ours - " + "freeing\n")); + ASSERT(BreakOnClose == FALSE); + + ClasspCleanupProtectedLocks(fsContext); + + ClasspCleanupDisableMcn(fsContext); + + FreeDictionaryEntry(&(commonExtension->FileObjectDictionary), + fsContext); + } + } + } + + // + // Notify the lower levels about the create or close operation - give them + // a chance to cleanup too. + // + + DebugPrint((2, + "ClasspCreateClose: %s for devobj %p\n", + (NT_SUCCESS(status) ? "Success" : "FAILED"), + DeviceObject)); + + + if(NT_SUCCESS(status)) { + + KEVENT event; + + // + // Set up the event to wait on + // + + KeInitializeEvent(&event, SynchronizationEvent, FALSE); + + IoCopyCurrentIrpStackLocationToNext(Irp); + IoSetCompletionRoutine( Irp, ClassSignalCompletion, &event, + TRUE, TRUE, TRUE); + + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + + if(status == STATUS_PENDING) { + KeWaitForSingleObject(&event, + Executive, + KernelMode, + FALSE, + NULL); + status = Irp->IoStatus.Status; + } + + if (!NT_SUCCESS(status)) { + DebugPrint((ClassDebugError, + "ClasspCreateClose: Lower driver failed, but we " + "succeeded. This is a problem, lock counts will be " + "out of sync between levels.\n")); + } + + } + + + return status; +} + + +VOID +ClasspCleanupProtectedLocks( + IN PFILE_OBJECT_EXTENSION FsContext + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = + FsContext->DeviceObject->DeviceExtension; + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = + commonExtension->PartitionZeroExtension; + + ULONG newDeviceLockCount = 1; + + PAGED_CODE(); + + DebugPrint((2, + "ClasspCleanupProtectedLocks called for %p\n", + FsContext->DeviceObject)); + DebugPrint((2, + "ClasspCleanupProtectedLocks - FsContext %p is locked " + "%d times\n", FsContext, FsContext->LockCount)); + + ASSERT(BreakOnClose == FALSE); + + // + // Synchronize with ejection and ejection control requests. + // + + KeEnterCriticalRegion(); + KeWaitForSingleObject(&(fdoExtension->EjectSynchronizationEvent), + UserRequest, + UserMode, + FALSE, + NULL); + + // + // For each secure lock on this handle decrement the secured lock count + // for the FDO. Keep track of the new value. + // + + if(FsContext->LockCount != 0) { + + do { + + InterlockedDecrement(&FsContext->LockCount); + + newDeviceLockCount = + InterlockedDecrement(&fdoExtension->ProtectedLockCount); + + } while(FsContext->LockCount != 0); + + // + // If the new lock count has been dropped to zero then issue a lock + // command to the device. + // + + DebugPrint((2, + "ClasspCleanupProtectedLocks: FDO secured lock count = %d " + "lock count = %d\n", + fdoExtension->ProtectedLockCount, + fdoExtension->LockCount)); + + if((newDeviceLockCount == 0) && (fdoExtension->LockCount == 0)) { + + SCSI_REQUEST_BLOCK srb; + PCDB cdb; + NTSTATUS status; + + DebugPrint((2, + "ClasspCleanupProtectedLocks: FDO lock count dropped " + "to zero\n")); + + RtlZeroMemory(&srb, sizeof(SCSI_REQUEST_BLOCK)); + cdb = (PCDB) &(srb.Cdb); + + srb.CdbLength = 6; + + cdb->MEDIA_REMOVAL.OperationCode = SCSIOP_MEDIUM_REMOVAL; + + // + // TRUE - prevent media removal. + // FALSE - allow media removal. + // + + cdb->MEDIA_REMOVAL.Prevent = FALSE; + + // + // Set timeout value. + // + + srb.TimeOutValue = fdoExtension->TimeOutValue; + status = ClassSendSrbSynchronous(fdoExtension->DeviceObject, + &srb, + NULL, + 0, + FALSE); + + DebugPrint((2, + "ClasspCleanupProtectedLocks: unlock request to drive " + "returned status %lx\n", status)); + } + } + + KeSetEvent(&fdoExtension->EjectSynchronizationEvent, + IO_NO_INCREMENT, + FALSE); + KeLeaveCriticalRegion(); + return; +} + + +VOID +ClasspCleanupDisableMcn( + IN PFILE_OBJECT_EXTENSION FsContext + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = + FsContext->DeviceObject->DeviceExtension; + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = + commonExtension->PartitionZeroExtension; + + ULONG newCount = 1; + + PAGED_CODE(); + + DebugPrint((ClassDebugTrace, + "ClasspCleanupDisableMcn called for %p\n", + FsContext->DeviceObject)); + DebugPrint((ClassDebugTrace, + "ClasspCleanupDisableMcn - FsContext %p is disabled " + "%d times\n", FsContext, FsContext->McnDisableCount)); + + // + // For each secure lock on this handle decrement the secured lock count + // for the FDO. Keep track of the new value. + // + + while(FsContext->McnDisableCount != 0) { + FsContext->McnDisableCount--; + ClassEnableMediaChangeDetection(fdoExtension); + } + + return; +} + + +#if 1 +/* + * BUGBUG REMOVE this old function implementation as soon as the + * boottime pagefile problems with the new one (below) + * are resolved. + */ +NTSTATUS +ClasspEjectionControl( + IN PDEVICE_OBJECT Fdo, + IN PIRP Irp, + IN MEDIA_LOCK_TYPE LockType, + IN BOOLEAN Lock + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension = Fdo->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = + (PCOMMON_DEVICE_EXTENSION) FdoExtension; + + PFILE_OBJECT_EXTENSION fsContext = NULL; + NTSTATUS status; + PSCSI_REQUEST_BLOCK srb = NULL; + BOOLEAN countChanged = FALSE; + + PAGED_CODE(); + + // + // Interlock with ejection and secure lock cleanup code. This is a + // user request so we can allow the stack to get swapped out while we + // wait for synchronization. + // + + status = KeWaitForSingleObject( + &(FdoExtension->EjectSynchronizationEvent), + UserRequest, + UserMode, + FALSE, + NULL); + + ASSERT(status == STATUS_SUCCESS); + + DebugPrint((2, + "ClasspEjectionControl: " + "Received request for %s lock type\n", + LockTypeStrings[LockType] + )); + + _SEH2_TRY { + PCDB cdb; + + srb = ClasspAllocateSrb(FdoExtension); + + if(srb == NULL) { + status = STATUS_INSUFFICIENT_RESOURCES; + _SEH2_LEAVE; + } + + RtlZeroMemory(srb, sizeof(SCSI_REQUEST_BLOCK)); + + cdb = (PCDB) srb->Cdb; + + // + // Determine if this is a "secured" request. + // + + if(LockType == SecureMediaLock) { + + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PFILE_OBJECT fileObject = irpStack->FileObject; + + // + // Make sure that the file object we are supplied has a + // proper FsContext before we try doing a secured lock. + // + + if(fileObject != NULL) { + fsContext = ClasspGetFsContext(commonExtension, fileObject); + } + + if (fsContext == NULL) { + + // + // This handle isn't setup correctly. We can't let the + // operation go. + // + + status = STATUS_INVALID_PARAMETER; + _SEH2_LEAVE; + } + } + + if(Lock) { + + // + // This is a lock command. Reissue the command in case bus or + // device was reset and the lock was cleared. + // note: may need to decrement count if actual lock operation + // failed.... + // + + switch(LockType) { + + case SimpleMediaLock: { + FdoExtension->LockCount++; + countChanged = TRUE; + break; + } + + case SecureMediaLock: { + fsContext->LockCount++; + FdoExtension->ProtectedLockCount++; + countChanged = TRUE; + break; + } + + case InternalMediaLock: { + FdoExtension->InternalLockCount++; + countChanged = TRUE; + break; + } + } + + } else { + + // + // This is an unlock command. If it's a secured one then make sure + // the caller has a lock outstanding or return an error. + // note: may need to re-increment the count if actual unlock + // operation fails.... + // + + switch(LockType) { + + case SimpleMediaLock: { + if(FdoExtension->LockCount != 0) { + FdoExtension->LockCount--; + countChanged = TRUE; + } + break; + } + + case SecureMediaLock: { + if(fsContext->LockCount == 0) { + status = STATUS_INVALID_DEVICE_STATE; + _SEH2_LEAVE; + } + fsContext->LockCount--; + FdoExtension->ProtectedLockCount--; + countChanged = TRUE; + break; + } + + case InternalMediaLock: { + ASSERT(FdoExtension->InternalLockCount != 0); + FdoExtension->InternalLockCount--; + countChanged = TRUE; + break; + } + } + + // + // We only send an unlock command to the drive if both the + // secured and unsecured lock counts have dropped to zero. + // + + if((FdoExtension->ProtectedLockCount != 0) || + (FdoExtension->InternalLockCount != 0) || + (FdoExtension->LockCount != 0)) { + + status = STATUS_SUCCESS; + _SEH2_LEAVE; + } + } + + status = STATUS_SUCCESS; + if (TEST_FLAG(Fdo->Characteristics, FILE_REMOVABLE_MEDIA)) { + + srb->CdbLength = 6; + cdb->MEDIA_REMOVAL.OperationCode = SCSIOP_MEDIUM_REMOVAL; + + // + // TRUE - prevent media removal. + // FALSE - allow media removal. + // + + cdb->MEDIA_REMOVAL.Prevent = Lock; + + // + // Set timeout value. + // + + srb->TimeOutValue = FdoExtension->TimeOutValue; + + // + // The actual lock operation on the device isn't so important + // as the internal lock counts. Ignore failures. + // + + status = ClassSendSrbSynchronous(FdoExtension->DeviceObject, + srb, + NULL, + 0, + FALSE); + } + + } _SEH2_FINALLY { + + if (!NT_SUCCESS(status)) { + DebugPrint((2, + "ClasspEjectionControl: FAILED status %x -- " + "reverting lock counts\n", status)); + + if (countChanged) { + + // + // have to revert to previous counts if the + // lock/unlock operation actually failed. + // + + if(Lock) { + + switch(LockType) { + + case SimpleMediaLock: { + FdoExtension->LockCount--; + break; + } + + case SecureMediaLock: { + fsContext->LockCount--; + FdoExtension->ProtectedLockCount--; + break; + } + + case InternalMediaLock: { + FdoExtension->InternalLockCount--; + break; + } + } + + } else { + + switch(LockType) { + + case SimpleMediaLock: { + FdoExtension->LockCount++; + break; + } + + case SecureMediaLock: { + fsContext->LockCount++; + FdoExtension->ProtectedLockCount++; + break; + } + + case InternalMediaLock: { + FdoExtension->InternalLockCount++; + break; + } + } + } + + } + + } else { + + DebugPrint((2, + "ClasspEjectionControl: Succeeded\n")); + + } + + DebugPrint((2, + "ClasspEjectionControl: " + "Current Counts: Internal: %x Secure: %x Simple: %x\n", + FdoExtension->InternalLockCount, + FdoExtension->ProtectedLockCount, + FdoExtension->LockCount + )); + + KeSetEvent(&(FdoExtension->EjectSynchronizationEvent), + IO_NO_INCREMENT, + FALSE); + if (srb) { + ClassFreeOrReuseSrb(FdoExtension, srb); + } + + } _SEH2_END; + return status; +} + +#else + +/* + * BUGBUG RESTORE + * This is a new implementation of the function that doesn't thrash memory + * or depend on the srbLookasideList. + * HOWEVER, it seems to cause pagefile initialization to fail during boot + * for some reason. Need to resolve this before switching to this function. + */ +NTSTATUS +ClasspEjectionControl( + IN PDEVICE_OBJECT Fdo, + IN PIRP Irp, + IN MEDIA_LOCK_TYPE LockType, + IN BOOLEAN Lock + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Fdo->DeviceExtension; + PFILE_OBJECT_EXTENSION fsContext; + BOOLEAN fileHandleOk = TRUE; + BOOLEAN countChanged = FALSE; + NTSTATUS status; + + PAGED_CODE(); + + status = KeWaitForSingleObject( + &fdoExt->EjectSynchronizationEvent, + UserRequest, + UserMode, + FALSE, + NULL); + ASSERT(status == STATUS_SUCCESS); + + /* + * If this is a "secured" request, we have to make sure + * that the file handle is valid. + */ + if (LockType == SecureMediaLock){ + PIO_STACK_LOCATION thisSp = IoGetCurrentIrpStackLocation(Irp); + + /* + * Make sure that the file object we are supplied has a + * proper FsContext before we try doing a secured lock. + */ + if (thisSp->FileObject){ + PCOMMON_DEVICE_EXTENSION commonExt = (PCOMMON_DEVICE_EXTENSION)fdoExt; + fsContext = ClasspGetFsContext(commonExt, thisSp->FileObject); + } + else { + fsContext = NULL; + } + + if (!fsContext){ + ASSERT(fsContext); + fileHandleOk = FALSE; + } + } + + if (fileHandleOk){ + + /* + * Adjust the lock counts and make sure they make sense. + */ + status = STATUS_SUCCESS; + if (Lock){ + switch(LockType) { + case SimpleMediaLock: + fdoExt->LockCount++; + countChanged = TRUE; + break; + case SecureMediaLock: + fsContext->LockCount++; + fdoExt->ProtectedLockCount++; + countChanged = TRUE; + break; + case InternalMediaLock: + fdoExt->InternalLockCount++; + countChanged = TRUE; + break; + } + } + else { + /* + * This is an unlock command. If it's a secured one then make sure + * the caller has a lock outstanding or return an error. + */ + switch (LockType){ + case SimpleMediaLock: + if (fdoExt->LockCount > 0){ + fdoExt->LockCount--; + countChanged = TRUE; + } + else { + ASSERT(fdoExt->LockCount > 0); + status = STATUS_INTERNAL_ERROR; + } + break; + case SecureMediaLock: + if (fsContext->LockCount > 0){ + ASSERT(fdoExt->ProtectedLockCount > 0); + fsContext->LockCount--; + fdoExt->ProtectedLockCount--; + countChanged = TRUE; + } + else { + ASSERT(fsContext->LockCount > 0); + status = STATUS_INVALID_DEVICE_STATE; + } + break; + case InternalMediaLock: + ASSERT(fdoExt->InternalLockCount > 0); + fdoExt->InternalLockCount--; + countChanged = TRUE; + break; + } + } + + if (NT_SUCCESS(status)){ + /* + * We only send an unlock command to the drive if + * all the lock counts have dropped to zero. + */ + if (!Lock && + (fdoExt->ProtectedLockCount || + fdoExt->InternalLockCount || + fdoExt->LockCount)){ + + /* + * The lock count is still positive, so don't unlock yet. + */ + status = STATUS_SUCCESS; + } + else if (!TEST_FLAG(Fdo->Characteristics, FILE_REMOVABLE_MEDIA)) { + /* + * The device isn't removable media. don't send a cmd. + */ + status = STATUS_SUCCESS; + } + else { + TRANSFER_PACKET *pkt; + + pkt = DequeueFreeTransferPacket(Fdo, TRUE); + if (pkt){ + KEVENT event; + + /* + * Store the number of packets servicing the irp (one) + * inside the original IRP. It will be used to counted down + * to zero when the packet completes. + * Initialize the original IRP's status to success. + * If the packet fails, we will set it to the error status. + */ + Irp->Tail.Overlay.DriverContext[0] = LongToPtr(1); + Irp->IoStatus.Status = STATUS_SUCCESS; + + /* + * Set this up as a SYNCHRONOUS transfer, submit it, + * and wait for the packet to complete. The result + * status will be written to the original irp. + */ + KeInitializeEvent(&event, SynchronizationEvent, FALSE); + SetupEjectionTransferPacket(pkt, Lock, &event, Irp); + SubmitTransferPacket(pkt); + KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); + status = Irp->IoStatus.Status; + } + else { + status = STATUS_INSUFFICIENT_RESOURCES; + } + } + } + } + else { + status = STATUS_INVALID_PARAMETER; + } + + if (!NT_SUCCESS(status) && countChanged) { + + // + // have to revert to previous counts if the + // lock/unlock operation actually failed. + // + + if(Lock) { + + switch(LockType) { + + case SimpleMediaLock: { + FdoExtension->LockCount--; + break; + } + + case SecureMediaLock: { + fsContext->LockCount--; + FdoExtension->ProtectedLockCount--; + break; + } + + case InternalMediaLock: { + FdoExtension->InternalLockCount--; + break; + } + } + + } else { + + switch(LockType) { + + case SimpleMediaLock: { + FdoExtension->LockCount++; + break; + } + + case SecureMediaLock: { + fsContext->LockCount++; + FdoExtension->ProtectedLockCount++; + break; + } + + case InternalMediaLock: { + FdoExtension->InternalLockCount++; + break; + } + } + } + } + + + + KeSetEvent(&fdoExt->EjectSynchronizationEvent, IO_NO_INCREMENT, FALSE); + + return status; +} +#endif + +PFILE_OBJECT_EXTENSION +ClasspGetFsContext( + IN PCOMMON_DEVICE_EXTENSION CommonExtension, + IN PFILE_OBJECT FileObject + ) +{ + PAGED_CODE(); + return GetDictionaryEntry(&(CommonExtension->FileObjectDictionary), + (ULONGLONG) FileObject); +} + diff --git a/drivers/storage/classpnp/data.c b/drivers/storage/classpnp/data.c new file mode 100644 index 00000000000..9bd638ba13c --- /dev/null +++ b/drivers/storage/classpnp/data.c @@ -0,0 +1,48 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + disk.c + +Abstract: + + SCSI disk class driver + +Environment: + + kernel mode only + +Notes: + +Revision History: + +--*/ + +#include "classp.h" + +#ifdef ALLOC_DATA_PRAGMA +#pragma data_seg("PAGE") +#endif + +/* +#define FDO_HACK_CANNOT_LOCK_MEDIA (0x00000001) +#define FDO_HACK_GESN_IS_BAD (0x00000002) +*/ + +CLASSPNP_SCAN_FOR_SPECIAL_INFO ClassBadItems[] = { + { "" , "MITSUMI CD-ROM FX240" , NULL, 0x02 }, + { "" , "MITSUMI CD-ROM FX320" , NULL, 0x02 }, + { "" , "MITSUMI CD-ROM FX322" , NULL, 0x02 }, + { "" , "COMPAQ CRD-8481B" , NULL, 0x04 }, + { NULL , NULL , NULL, 0x0 } +}; + + +GUID ClassGuidQueryRegInfoEx = GUID_CLASSPNP_QUERY_REGINFOEX; + +#ifdef ALLOC_DATA_PRAGMA +#pragma data_seg() +#endif + diff --git a/drivers/storage/classpnp/debug.c b/drivers/storage/classpnp/debug.c new file mode 100644 index 00000000000..bea6bfb872f --- /dev/null +++ b/drivers/storage/classpnp/debug.c @@ -0,0 +1,693 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + debug.c + +Abstract: + + CLASSPNP debug code and data + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + + +#include "classp.h" +#include "debug.h" + +#if DBG + + // + // default to not breaking in for lost irps, five minutes before we even + // bother checking for lost irps, using standard debug print macros, and + // using a 64k debug print buffer + // + + #ifndef CLASS_GLOBAL_BREAK_ON_LOST_IRPS + #error "CLASS_GLOBAL_BREAK_ON_LOST_IRPS undefined" + #define CLASS_GLOBAL_BREAK_ON_LOST_IRPS 0 + #endif // CLASS_GLOBAL_BREAK_ON_LOST_IRPS + + #ifndef CLASS_GLOBAL_SECONDS_TO_WAIT_FOR_SYNCHRONOUS_SRB + #error "CLASS_GLOBAL_SECONDS_TO_WAIT_FOR_SYNCHRONOUS_SRB undefined" + #define CLASS_GLOBAL_SECONDS_TO_WAIT_FOR_SYNCHRONOUS_SRB 300 + #endif // CLASS_GLOBAL_SECONDS_TO_WAIT_FOR_SYNCHRONOUS_SRB + + #ifndef CLASS_GLOBAL_USE_DELAYED_RETRY + #error "CLASS_GLOBAL_USE_DELAYED_RETRY undefined" + #define CLASS_GLOBAL_USE_DELAYED_RETRY 1 + #endif // CLASS_GLOBAL_USE_DELAYED_RETRY + + #ifndef CLASS_GLOBAL_BUFFERED_DEBUG_PRINT + #error "CLASS_GLOBAL_BUFFERED_DEBUG_PRINT undefined" + #define CLASS_GLOBAL_BUFFERED_DEBUG_PRINT 0 + #endif // CLASS_GLOBAL_BUFFERED_DEBUG_PRINT + + #ifndef CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFER_SIZE + #error "CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFER_SIZE undefined" + #define CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFER_SIZE 512 + #endif // CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFER_SIZE + + #ifndef CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFERS + #error "CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFERS undefined" + #define CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFERS 512 + #endif // CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFERS + + #pragma data_seg("NONPAGE") + + + + CLASSPNP_GLOBALS ClasspnpGlobals; + + // + // the low sixteen bits are used to see if the debug level is high enough + // the high sixteen bits are used to singly enable debug levels 1-16 + // + LONG ClassDebug = 0xFFFFFFFF; + + BOOLEAN DebugTrapOnWarn = FALSE; + + VOID ClasspInitializeDebugGlobals() + { + KIRQL irql; + + if (InterlockedCompareExchange(&ClasspnpGlobals.Initializing, 1, 0) == 0) { + + KeInitializeSpinLock(&ClasspnpGlobals.SpinLock); + + KeAcquireSpinLock(&ClasspnpGlobals.SpinLock, &irql); + + DebugPrint((1, "CLASSPNP.SYS => Initializing ClasspnpGlobals...\n")); + + ClasspnpGlobals.Buffer = NULL; + ClasspnpGlobals.Index = -1; + ClasspnpGlobals.BreakOnLostIrps = CLASS_GLOBAL_BREAK_ON_LOST_IRPS; + ClasspnpGlobals.EachBufferSize = CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFER_SIZE; + ClasspnpGlobals.NumberOfBuffers = CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFERS; + ClasspnpGlobals.SecondsToWaitForIrps = CLASS_GLOBAL_SECONDS_TO_WAIT_FOR_SYNCHRONOUS_SRB; + + // + // this should be the last item set + // + + ClasspnpGlobals.UseBufferedDebugPrint = CLASS_GLOBAL_BUFFERED_DEBUG_PRINT; + + KeReleaseSpinLock(&ClasspnpGlobals.SpinLock, irql); + + InterlockedExchange(&ClasspnpGlobals.Initialized, 1); + + } + } + + + + /*++//////////////////////////////////////////////////////////////////////////// + + ClassDebugPrint() + + Routine Description: + + Debug print for all class drivers, NOOP on FRE versions. + Allows printing to a debug buffer (with auto fallback to kdprint) by + properly setting the Globals in classpnp on CHK versions. + + Arguments: + + Debug print level, or from 0 to 3 for legacy drivers. + + Return Value: + + None + + --*/ + VOID ClassDebugPrint(CLASS_DEBUG_LEVEL DebugPrintLevel, PCCHAR DebugMessage, ...) + { + va_list ap; + va_start(ap, DebugMessage); + + if ((DebugPrintLevel <= (ClassDebug & 0x0000ffff)) || + ((1 << (DebugPrintLevel + 15)) & ClassDebug)) { + + if (ClasspnpGlobals.UseBufferedDebugPrint && + ClasspnpGlobals.Buffer == NULL) { + + // + // this double-check prevents always taking + // a spinlock just to ensure we have a buffer + // + + KIRQL irql; + + KeAcquireSpinLock(&ClasspnpGlobals.SpinLock, &irql); + if (ClasspnpGlobals.Buffer == NULL) { + + SIZE_T bufferSize; + bufferSize = ClasspnpGlobals.NumberOfBuffers * + ClasspnpGlobals.EachBufferSize; + DbgPrintEx(DPFLTR_CLASSPNP_ID, DPFLTR_ERROR_LEVEL, + "ClassDebugPrint: Allocating %x bytes for " + "classdebugprint buffer\n", bufferSize); + ClasspnpGlobals.Index = -1; + ClasspnpGlobals.Buffer = + ExAllocatePoolWithTag(NonPagedPool, bufferSize, 'bDcS'); + DbgPrintEx(DPFLTR_CLASSPNP_ID, DPFLTR_ERROR_LEVEL, + "ClassDebugPrint: Allocated buffer at %p\n", + ClasspnpGlobals.Buffer); + + } + KeReleaseSpinLock(&ClasspnpGlobals.SpinLock, irql); + + } + + if (ClasspnpGlobals.UseBufferedDebugPrint && + ClasspnpGlobals.Buffer != NULL) { + + // + // we never free the buffer, so once it exists, + // we can just print to it with immunity + // + + ULONG index; + PUCHAR buffer; + index = InterlockedIncrement(&ClasspnpGlobals.Index); + index %= ClasspnpGlobals.NumberOfBuffers; + index *= (ULONG)ClasspnpGlobals.EachBufferSize; + + buffer = ClasspnpGlobals.Buffer; + buffer += index; + + _vsnprintf(buffer, ClasspnpGlobals.EachBufferSize, DebugMessage, ap); + + } else { + + // + // either we could not allocate a buffer for debug prints + // or buffered debug prints are disabled + // + vDbgPrintEx(-1, DPFLTR_ERROR_LEVEL, DebugMessage, ap); + + } + + } + + va_end(ap); + + } + + + char *DbgGetIoctlStr(ULONG ioctl) + { + char *ioctlStr = "?"; + + switch (ioctl){ + + #undef MAKE_CASE + #define MAKE_CASE(ioctlCode) case ioctlCode: ioctlStr = #ioctlCode; break; + + MAKE_CASE(IOCTL_STORAGE_CHECK_VERIFY) + MAKE_CASE(IOCTL_STORAGE_CHECK_VERIFY2) + MAKE_CASE(IOCTL_STORAGE_MEDIA_REMOVAL) + MAKE_CASE(IOCTL_STORAGE_EJECT_MEDIA) + MAKE_CASE(IOCTL_STORAGE_LOAD_MEDIA) + MAKE_CASE(IOCTL_STORAGE_LOAD_MEDIA2) + MAKE_CASE(IOCTL_STORAGE_RESERVE) + MAKE_CASE(IOCTL_STORAGE_RELEASE) + MAKE_CASE(IOCTL_STORAGE_FIND_NEW_DEVICES) + MAKE_CASE(IOCTL_STORAGE_EJECTION_CONTROL) + MAKE_CASE(IOCTL_STORAGE_MCN_CONTROL) + MAKE_CASE(IOCTL_STORAGE_GET_MEDIA_TYPES) + MAKE_CASE(IOCTL_STORAGE_GET_MEDIA_TYPES_EX) + MAKE_CASE(IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER) + MAKE_CASE(IOCTL_STORAGE_GET_HOTPLUG_INFO) + MAKE_CASE(IOCTL_STORAGE_RESET_BUS) + MAKE_CASE(IOCTL_STORAGE_RESET_DEVICE) + MAKE_CASE(IOCTL_STORAGE_GET_DEVICE_NUMBER) + MAKE_CASE(IOCTL_STORAGE_PREDICT_FAILURE) + MAKE_CASE(IOCTL_STORAGE_QUERY_PROPERTY) + MAKE_CASE(OBSOLETE_IOCTL_STORAGE_RESET_BUS) + MAKE_CASE(OBSOLETE_IOCTL_STORAGE_RESET_DEVICE) + } + + return ioctlStr; + } + + char *DbgGetScsiOpStr(PSCSI_REQUEST_BLOCK Srb) + { + PCDB pCdb = (PCDB)Srb->Cdb; + UCHAR scsiOp = pCdb->CDB6GENERIC.OperationCode; + char *scsiOpStr = "?"; + + switch (scsiOp){ + + #undef MAKE_CASE + #define MAKE_CASE(scsiOpCode) case scsiOpCode: scsiOpStr = #scsiOpCode; break; + + MAKE_CASE(SCSIOP_TEST_UNIT_READY) + MAKE_CASE(SCSIOP_REWIND) // aka SCSIOP_REZERO_UNIT + MAKE_CASE(SCSIOP_REQUEST_BLOCK_ADDR) + MAKE_CASE(SCSIOP_REQUEST_SENSE) + MAKE_CASE(SCSIOP_FORMAT_UNIT) + MAKE_CASE(SCSIOP_READ_BLOCK_LIMITS) + MAKE_CASE(SCSIOP_INIT_ELEMENT_STATUS) // aka SCSIOP_REASSIGN_BLOCKS + MAKE_CASE(SCSIOP_RECEIVE) // aka SCSIOP_READ6 + MAKE_CASE(SCSIOP_SEND) // aka SCSIOP_WRITE6, SCSIOP_PRINT + MAKE_CASE(SCSIOP_SLEW_PRINT) // aka SCSIOP_SEEK6, SCSIOP_TRACK_SELECT + MAKE_CASE(SCSIOP_SEEK_BLOCK) + MAKE_CASE(SCSIOP_PARTITION) + MAKE_CASE(SCSIOP_READ_REVERSE) + MAKE_CASE(SCSIOP_FLUSH_BUFFER) // aka SCSIOP_WRITE_FILEMARKS + MAKE_CASE(SCSIOP_SPACE) + MAKE_CASE(SCSIOP_INQUIRY) + MAKE_CASE(SCSIOP_VERIFY6) + MAKE_CASE(SCSIOP_RECOVER_BUF_DATA) + MAKE_CASE(SCSIOP_MODE_SELECT) + MAKE_CASE(SCSIOP_RESERVE_UNIT) + MAKE_CASE(SCSIOP_RELEASE_UNIT) + MAKE_CASE(SCSIOP_COPY) + MAKE_CASE(SCSIOP_ERASE) + MAKE_CASE(SCSIOP_MODE_SENSE) + MAKE_CASE(SCSIOP_START_STOP_UNIT) // aka SCSIOP_STOP_PRINT, SCSIOP_LOAD_UNLOAD + MAKE_CASE(SCSIOP_RECEIVE_DIAGNOSTIC) + MAKE_CASE(SCSIOP_SEND_DIAGNOSTIC) + MAKE_CASE(SCSIOP_MEDIUM_REMOVAL) + MAKE_CASE(SCSIOP_READ_FORMATTED_CAPACITY) + MAKE_CASE(SCSIOP_READ_CAPACITY) + MAKE_CASE(SCSIOP_READ) + MAKE_CASE(SCSIOP_WRITE) + MAKE_CASE(SCSIOP_SEEK) // aka SCSIOP_LOCATE, SCSIOP_POSITION_TO_ELEMENT + MAKE_CASE(SCSIOP_WRITE_VERIFY) + MAKE_CASE(SCSIOP_VERIFY) + MAKE_CASE(SCSIOP_SEARCH_DATA_HIGH) + MAKE_CASE(SCSIOP_SEARCH_DATA_EQUAL) + MAKE_CASE(SCSIOP_SEARCH_DATA_LOW) + MAKE_CASE(SCSIOP_SET_LIMITS) + MAKE_CASE(SCSIOP_READ_POSITION) + MAKE_CASE(SCSIOP_SYNCHRONIZE_CACHE) + MAKE_CASE(SCSIOP_COMPARE) + MAKE_CASE(SCSIOP_COPY_COMPARE) + MAKE_CASE(SCSIOP_WRITE_DATA_BUFF) + MAKE_CASE(SCSIOP_READ_DATA_BUFF) + MAKE_CASE(SCSIOP_CHANGE_DEFINITION) + MAKE_CASE(SCSIOP_READ_SUB_CHANNEL) + MAKE_CASE(SCSIOP_READ_TOC) + MAKE_CASE(SCSIOP_READ_HEADER) + MAKE_CASE(SCSIOP_PLAY_AUDIO) + MAKE_CASE(SCSIOP_GET_CONFIGURATION) + MAKE_CASE(SCSIOP_PLAY_AUDIO_MSF) + MAKE_CASE(SCSIOP_PLAY_TRACK_INDEX) + MAKE_CASE(SCSIOP_PLAY_TRACK_RELATIVE) + MAKE_CASE(SCSIOP_GET_EVENT_STATUS) + MAKE_CASE(SCSIOP_PAUSE_RESUME) + MAKE_CASE(SCSIOP_LOG_SELECT) + MAKE_CASE(SCSIOP_LOG_SENSE) + MAKE_CASE(SCSIOP_STOP_PLAY_SCAN) + MAKE_CASE(SCSIOP_READ_DISK_INFORMATION) + MAKE_CASE(SCSIOP_READ_TRACK_INFORMATION) + MAKE_CASE(SCSIOP_RESERVE_TRACK_RZONE) + MAKE_CASE(SCSIOP_SEND_OPC_INFORMATION) + MAKE_CASE(SCSIOP_MODE_SELECT10) + MAKE_CASE(SCSIOP_MODE_SENSE10) + MAKE_CASE(SCSIOP_CLOSE_TRACK_SESSION) + MAKE_CASE(SCSIOP_READ_BUFFER_CAPACITY) + MAKE_CASE(SCSIOP_SEND_CUE_SHEET) + MAKE_CASE(SCSIOP_PERSISTENT_RESERVE_IN) + MAKE_CASE(SCSIOP_PERSISTENT_RESERVE_OUT) + MAKE_CASE(SCSIOP_REPORT_LUNS) + MAKE_CASE(SCSIOP_BLANK) + MAKE_CASE(SCSIOP_SEND_KEY) + MAKE_CASE(SCSIOP_REPORT_KEY) + MAKE_CASE(SCSIOP_MOVE_MEDIUM) + MAKE_CASE(SCSIOP_LOAD_UNLOAD_SLOT) // aka SCSIOP_EXCHANGE_MEDIUM + MAKE_CASE(SCSIOP_SET_READ_AHEAD) + MAKE_CASE(SCSIOP_READ_DVD_STRUCTURE) + MAKE_CASE(SCSIOP_REQUEST_VOL_ELEMENT) + MAKE_CASE(SCSIOP_SEND_VOLUME_TAG) + MAKE_CASE(SCSIOP_READ_ELEMENT_STATUS) + MAKE_CASE(SCSIOP_READ_CD_MSF) + MAKE_CASE(SCSIOP_SCAN_CD) + MAKE_CASE(SCSIOP_SET_CD_SPEED) + MAKE_CASE(SCSIOP_PLAY_CD) + MAKE_CASE(SCSIOP_MECHANISM_STATUS) + MAKE_CASE(SCSIOP_READ_CD) + MAKE_CASE(SCSIOP_SEND_DVD_STRUCTURE) + MAKE_CASE(SCSIOP_INIT_ELEMENT_RANGE) + } + + return scsiOpStr; + } + + + char *DbgGetSrbStatusStr(PSCSI_REQUEST_BLOCK Srb) + { + char *srbStatStr = "?"; + + switch (Srb->SrbStatus){ + + #undef MAKE_CASE + #define MAKE_CASE(srbStat) \ + case srbStat: \ + srbStatStr = #srbStat; \ + break; \ + case srbStat|SRB_STATUS_QUEUE_FROZEN: \ + srbStatStr = #srbStat "|SRB_STATUS_QUEUE_FROZEN"; \ + break; \ + case srbStat|SRB_STATUS_AUTOSENSE_VALID: \ + srbStatStr = #srbStat "|SRB_STATUS_AUTOSENSE_VALID"; \ + break; \ + case srbStat|SRB_STATUS_QUEUE_FROZEN|SRB_STATUS_AUTOSENSE_VALID: \ + srbStatStr = #srbStat "|SRB_STATUS_QUEUE_FROZEN|SRB_STATUS_AUTOSENSE_VALID"; \ + break; + + MAKE_CASE(SRB_STATUS_PENDING) + MAKE_CASE(SRB_STATUS_SUCCESS) + MAKE_CASE(SRB_STATUS_ABORTED) + MAKE_CASE(SRB_STATUS_ABORT_FAILED) + MAKE_CASE(SRB_STATUS_ERROR) + MAKE_CASE(SRB_STATUS_BUSY) + MAKE_CASE(SRB_STATUS_INVALID_REQUEST) + MAKE_CASE(SRB_STATUS_INVALID_PATH_ID) + MAKE_CASE(SRB_STATUS_NO_DEVICE) + MAKE_CASE(SRB_STATUS_TIMEOUT) + MAKE_CASE(SRB_STATUS_SELECTION_TIMEOUT) + MAKE_CASE(SRB_STATUS_COMMAND_TIMEOUT) + MAKE_CASE(SRB_STATUS_MESSAGE_REJECTED) + MAKE_CASE(SRB_STATUS_BUS_RESET) + MAKE_CASE(SRB_STATUS_PARITY_ERROR) + MAKE_CASE(SRB_STATUS_REQUEST_SENSE_FAILED) + MAKE_CASE(SRB_STATUS_NO_HBA) + MAKE_CASE(SRB_STATUS_DATA_OVERRUN) + MAKE_CASE(SRB_STATUS_UNEXPECTED_BUS_FREE) + MAKE_CASE(SRB_STATUS_PHASE_SEQUENCE_FAILURE) + MAKE_CASE(SRB_STATUS_BAD_SRB_BLOCK_LENGTH) + MAKE_CASE(SRB_STATUS_REQUEST_FLUSHED) + MAKE_CASE(SRB_STATUS_INVALID_LUN) + MAKE_CASE(SRB_STATUS_INVALID_TARGET_ID) + MAKE_CASE(SRB_STATUS_BAD_FUNCTION) + MAKE_CASE(SRB_STATUS_ERROR_RECOVERY) + MAKE_CASE(SRB_STATUS_NOT_POWERED) + MAKE_CASE(SRB_STATUS_INTERNAL_ERROR) + } + + return srbStatStr; + } + + + char *DbgGetSenseCodeStr(PSCSI_REQUEST_BLOCK Srb) + { + char *senseCodeStr = "?"; + + if (Srb->SrbStatus & SRB_STATUS_AUTOSENSE_VALID){ + PSENSE_DATA senseData; + UCHAR senseCode; + + ASSERT(Srb->SenseInfoBuffer); + senseData = Srb->SenseInfoBuffer; + senseCode = senseData->SenseKey & 0xf; + + switch (senseCode){ + + #undef MAKE_CASE + #define MAKE_CASE(snsCod) case snsCod: senseCodeStr = #snsCod; break; + + MAKE_CASE(SCSI_SENSE_NO_SENSE) + MAKE_CASE(SCSI_SENSE_RECOVERED_ERROR) + MAKE_CASE(SCSI_SENSE_NOT_READY) + MAKE_CASE(SCSI_SENSE_MEDIUM_ERROR) + MAKE_CASE(SCSI_SENSE_HARDWARE_ERROR) + MAKE_CASE(SCSI_SENSE_ILLEGAL_REQUEST) + MAKE_CASE(SCSI_SENSE_UNIT_ATTENTION) + MAKE_CASE(SCSI_SENSE_DATA_PROTECT) + MAKE_CASE(SCSI_SENSE_BLANK_CHECK) + MAKE_CASE(SCSI_SENSE_UNIQUE) + MAKE_CASE(SCSI_SENSE_COPY_ABORTED) + MAKE_CASE(SCSI_SENSE_ABORTED_COMMAND) + MAKE_CASE(SCSI_SENSE_EQUAL) + MAKE_CASE(SCSI_SENSE_VOL_OVERFLOW) + MAKE_CASE(SCSI_SENSE_MISCOMPARE) + MAKE_CASE(SCSI_SENSE_RESERVED) + } + } + + return senseCodeStr; + } + + + char *DbgGetAdditionalSenseCodeStr(PSCSI_REQUEST_BLOCK Srb) + { + char *adSenseCodeStr = "?"; + + if (Srb->SrbStatus & SRB_STATUS_AUTOSENSE_VALID){ + PSENSE_DATA senseData; + UCHAR adSenseCode; + + ASSERT(Srb->SenseInfoBuffer); + senseData = Srb->SenseInfoBuffer; + adSenseCode = senseData->AdditionalSenseCode; + + switch (adSenseCode){ + + #undef MAKE_CASE + #define MAKE_CASE(adSnsCod) case adSnsCod: adSenseCodeStr = #adSnsCod; break; + + MAKE_CASE(SCSI_ADSENSE_NO_SENSE) + MAKE_CASE(SCSI_ADSENSE_LUN_NOT_READY) + MAKE_CASE(SCSI_ADSENSE_TRACK_ERROR) + MAKE_CASE(SCSI_ADSENSE_SEEK_ERROR) + MAKE_CASE(SCSI_ADSENSE_REC_DATA_NOECC) + MAKE_CASE(SCSI_ADSENSE_REC_DATA_ECC) + MAKE_CASE(SCSI_ADSENSE_ILLEGAL_COMMAND) + MAKE_CASE(SCSI_ADSENSE_ILLEGAL_BLOCK) + MAKE_CASE(SCSI_ADSENSE_INVALID_CDB) + MAKE_CASE(SCSI_ADSENSE_INVALID_LUN) + MAKE_CASE(SCSI_ADSENSE_WRITE_PROTECT) // aka SCSI_ADWRITE_PROTECT + MAKE_CASE(SCSI_ADSENSE_MEDIUM_CHANGED) + MAKE_CASE(SCSI_ADSENSE_BUS_RESET) + MAKE_CASE(SCSI_ADSENSE_INVALID_MEDIA) + MAKE_CASE(SCSI_ADSENSE_NO_MEDIA_IN_DEVICE) + MAKE_CASE(SCSI_ADSENSE_POSITION_ERROR) + MAKE_CASE(SCSI_ADSENSE_OPERATOR_REQUEST) + MAKE_CASE(SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED) + MAKE_CASE(SCSI_ADSENSE_COPY_PROTECTION_FAILURE) + MAKE_CASE(SCSI_ADSENSE_VENDOR_UNIQUE) + MAKE_CASE(SCSI_ADSENSE_MUSIC_AREA) + MAKE_CASE(SCSI_ADSENSE_DATA_AREA) + MAKE_CASE(SCSI_ADSENSE_VOLUME_OVERFLOW) + } + } + + return adSenseCodeStr; + } + + + char *DbgGetAdditionalSenseCodeQualifierStr(PSCSI_REQUEST_BLOCK Srb) + { + char *adSenseCodeQualStr = "?"; + + if (Srb->SrbStatus & SRB_STATUS_AUTOSENSE_VALID){ + PSENSE_DATA senseData; + UCHAR adSenseCode; + UCHAR adSenseCodeQual; + + ASSERT(Srb->SenseInfoBuffer); + senseData = Srb->SenseInfoBuffer; + adSenseCode = senseData->AdditionalSenseCode; + adSenseCodeQual = senseData->AdditionalSenseCodeQualifier; + + switch (adSenseCode){ + + #undef MAKE_CASE + #define MAKE_CASE(adSnsCodQual) case adSnsCodQual: adSenseCodeQualStr = #adSnsCodQual; break; + + case SCSI_ADSENSE_LUN_NOT_READY: + switch (adSenseCodeQual){ + MAKE_CASE(SCSI_SENSEQ_CAUSE_NOT_REPORTABLE) + MAKE_CASE(SCSI_SENSEQ_BECOMING_READY) + MAKE_CASE(SCSI_SENSEQ_INIT_COMMAND_REQUIRED) + MAKE_CASE(SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED) + MAKE_CASE(SCSI_SENSEQ_FORMAT_IN_PROGRESS) + MAKE_CASE(SCSI_SENSEQ_REBUILD_IN_PROGRESS) + MAKE_CASE(SCSI_SENSEQ_RECALCULATION_IN_PROGRESS) + MAKE_CASE(SCSI_SENSEQ_OPERATION_IN_PROGRESS) + MAKE_CASE(SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS) + } + break; + case SCSI_ADSENSE_NO_SENSE: + switch (adSenseCodeQual){ + MAKE_CASE(SCSI_SENSEQ_FILEMARK_DETECTED) + MAKE_CASE(SCSI_SENSEQ_END_OF_MEDIA_DETECTED) + MAKE_CASE(SCSI_SENSEQ_SETMARK_DETECTED) + MAKE_CASE(SCSI_SENSEQ_BEGINNING_OF_MEDIA_DETECTED) + } + break; + case SCSI_ADSENSE_ILLEGAL_BLOCK: + switch (adSenseCodeQual){ + MAKE_CASE(SCSI_SENSEQ_ILLEGAL_ELEMENT_ADDR) + } + break; + case SCSI_ADSENSE_POSITION_ERROR: + switch (adSenseCodeQual){ + MAKE_CASE(SCSI_SENSEQ_DESTINATION_FULL) + MAKE_CASE(SCSI_SENSEQ_SOURCE_EMPTY) + } + break; + case SCSI_ADSENSE_INVALID_MEDIA: + switch (adSenseCodeQual){ + MAKE_CASE(SCSI_SENSEQ_INCOMPATIBLE_MEDIA_INSTALLED) + MAKE_CASE(SCSI_SENSEQ_UNKNOWN_FORMAT) + MAKE_CASE(SCSI_SENSEQ_INCOMPATIBLE_FORMAT) + MAKE_CASE(SCSI_SENSEQ_CLEANING_CARTRIDGE_INSTALLED) + } + break; + case SCSI_ADSENSE_OPERATOR_REQUEST: + switch (adSenseCodeQual){ + MAKE_CASE(SCSI_SENSEQ_STATE_CHANGE_INPUT) + MAKE_CASE(SCSI_SENSEQ_MEDIUM_REMOVAL) + MAKE_CASE(SCSI_SENSEQ_WRITE_PROTECT_ENABLE) + MAKE_CASE(SCSI_SENSEQ_WRITE_PROTECT_DISABLE) + } + break; + case SCSI_ADSENSE_COPY_PROTECTION_FAILURE: + switch (adSenseCodeQual){ + MAKE_CASE(SCSI_SENSEQ_AUTHENTICATION_FAILURE) + MAKE_CASE(SCSI_SENSEQ_KEY_NOT_PRESENT) + MAKE_CASE(SCSI_SENSEQ_KEY_NOT_ESTABLISHED) + MAKE_CASE(SCSI_SENSEQ_READ_OF_SCRAMBLED_SECTOR_WITHOUT_AUTHENTICATION) + MAKE_CASE(SCSI_SENSEQ_MEDIA_CODE_MISMATCHED_TO_LOGICAL_UNIT) + MAKE_CASE(SCSI_SENSEQ_LOGICAL_UNIT_RESET_COUNT_ERROR) + } + break; + } + } + + return adSenseCodeQualStr; + } + + + /* + * DbgCheckReturnedPkt + * + * Check a completed TRANSFER_PACKET for all sorts of error conditions + * and warn/trap appropriately. + */ + VOID DbgCheckReturnedPkt(TRANSFER_PACKET *Pkt) + { + PCDB pCdb = (PCDB)Pkt->Srb.Cdb; + + ASSERT(Pkt->Srb.OriginalRequest == Pkt->Irp); + ASSERT(Pkt->Srb.DataBuffer == Pkt->BufPtrCopy); + ASSERT(Pkt->Srb.DataTransferLength <= Pkt->BufLenCopy); + ASSERT(!Pkt->Irp->CancelRoutine); + + if (SRB_STATUS(Pkt->Srb.SrbStatus) == SRB_STATUS_PENDING){ + DBGERR(("SRB completed with status PENDING in packet %ph: (op=%s srbstat=%s(%xh), irpstat=%xh)", + Pkt, + DBGGETSCSIOPSTR(&Pkt->Srb), + DBGGETSRBSTATUSSTR(&Pkt->Srb), + (ULONG)Pkt->Srb.SrbStatus, + Pkt->Irp->IoStatus.Status)); + } + else if (SRB_STATUS(Pkt->Srb.SrbStatus) == SRB_STATUS_SUCCESS){ + /* + * Make sure SRB and IRP status match. + */ + if (!NT_SUCCESS(Pkt->Irp->IoStatus.Status)){ + DBGWARN(("SRB and IRP status don't match in packet %ph: (op=%s srbstat=%s(%xh), irpstat=%xh)", + Pkt, + DBGGETSCSIOPSTR(&Pkt->Srb), + DBGGETSRBSTATUSSTR(&Pkt->Srb), + (ULONG)Pkt->Srb.SrbStatus, + Pkt->Irp->IoStatus.Status)); + } + + if (Pkt->Irp->IoStatus.Information != Pkt->Srb.DataTransferLength){ + DBGERR(("SRB and IRP result transfer lengths don't match in succeeded packet %ph: (op=%s, SrbStatus=%s, Srb.DataTransferLength=%xh, Irp->IoStatus.Information=%xh).", + Pkt, + DBGGETSCSIOPSTR(&Pkt->Srb), + DBGGETSRBSTATUSSTR(&Pkt->Srb), + Pkt->Srb.DataTransferLength, + Pkt->Irp->IoStatus.Information)); + } + } + else { + if (NT_SUCCESS(Pkt->Irp->IoStatus.Status)){ + DBGWARN(("SRB and IRP status don't match in packet %ph: (op=%s srbstat=%s(%xh), irpstat=%xh)", + Pkt, + DBGGETSCSIOPSTR(&Pkt->Srb), + DBGGETSRBSTATUSSTR(&Pkt->Srb), + (ULONG)Pkt->Srb.SrbStatus, + Pkt->Irp->IoStatus.Status)); + } + DBGTRACE(ClassDebugWarning, ("Packet %ph failed (op=%s srbstat=%s(%xh), irpstat=%xh, sense=%s/%s/%s)", + Pkt, + DBGGETSCSIOPSTR(&Pkt->Srb), + DBGGETSRBSTATUSSTR(&Pkt->Srb), + (ULONG)Pkt->Srb.SrbStatus, + Pkt->Irp->IoStatus.Status, + DBGGETSENSECODESTR(&Pkt->Srb), + DBGGETADSENSECODESTR(&Pkt->Srb), + DBGGETADSENSEQUALIFIERSTR(&Pkt->Srb))); + + /* + * If the SRB failed with underrun or overrun, then the actual + * transferred length should be returned in both SRB and IRP. + * (SRB's only have an error status for overrun, so it's overloaded). + */ + if ((SRB_STATUS(Pkt->Srb.SrbStatus) == SRB_STATUS_DATA_OVERRUN) && + (Pkt->Irp->IoStatus.Information != Pkt->Srb.DataTransferLength)){ + DBGERR(("SRB and IRP result transfer lengths don't match in failed packet %ph: (op=%s, SrbStatus=%s, Srb.DataTransferLength=%xh, Irp->IoStatus.Information=%xh).", + Pkt, + DBGGETSCSIOPSTR(&Pkt->Srb), + DBGGETSRBSTATUSSTR(&Pkt->Srb), + Pkt->Srb.DataTransferLength, + Pkt->Irp->IoStatus.Information)); + } + } + + + /* + * Some miniport drivers have been caught changing the SCSI operation + * code in the SRB. This is absolutely disallowed as it breaks our error handling. + */ + switch (pCdb->CDB10.OperationCode){ + case SCSIOP_MEDIUM_REMOVAL: + case SCSIOP_MODE_SENSE: + case SCSIOP_READ_CAPACITY: + case SCSIOP_READ: + case SCSIOP_WRITE: + case SCSIOP_START_STOP_UNIT: + break; + default: + DBGERR(("Miniport illegally changed Srb.Cdb.OperationCode in packet %ph failed (op=%s srbstat=%s(%xh), irpstat=%xh, sense=%s/%s/%s)", + Pkt, + DBGGETSCSIOPSTR(&Pkt->Srb), + DBGGETSRBSTATUSSTR(&Pkt->Srb), + (ULONG)Pkt->Srb.SrbStatus, + Pkt->Irp->IoStatus.Status, + DBGGETSENSECODESTR(&Pkt->Srb), + DBGGETADSENSECODESTR(&Pkt->Srb), + DBGGETADSENSEQUALIFIERSTR(&Pkt->Srb))); + break; + } + + } + +#else + + // We have to keep this in the retail build for legacy. + VOID ClassDebugPrint(CLASS_DEBUG_LEVEL DebugPrintLevel, PCCHAR DebugMessage, ...) + { + DbgPrint("retail build\n"); + } + +#endif + diff --git a/drivers/storage/classpnp/debug.h b/drivers/storage/classpnp/debug.h new file mode 100644 index 00000000000..2fa64c41fe1 --- /dev/null +++ b/drivers/storage/classpnp/debug.h @@ -0,0 +1,148 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + debug.h + +Abstract: + + +Author: + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + + +VOID ClassDebugPrint(CLASS_DEBUG_LEVEL DebugPrintLevel, PCCHAR DebugMessage, ...); + +#if DBG + + typedef struct _CLASSPNP_GLOBALS { + + // + // whether or not to ASSERT for lost irps + // + + ULONG BreakOnLostIrps; + ULONG SecondsToWaitForIrps; + + // + // use a buffered debug print to help + // catch timing issues that do not + // reproduce with std debugprints enabled + // + + ULONG UseBufferedDebugPrint; + ULONG UseDelayedRetry; + + // + // the next four are the buffered printing support + // (currently unimplemented) and require the spinlock + // to use + // + + ULONG Index; // index into buffer + KSPIN_LOCK SpinLock; + PUCHAR Buffer; // requires spinlock to access + ULONG NumberOfBuffers; // number of buffers available + SIZE_T EachBufferSize; // size of each buffer + + // + // interlocked variables to initialize + // this data only once + // + + LONG Initializing; + LONG Initialized; + + } CLASSPNP_GLOBALS, *PCLASSPNP_GLOBALS; + + #define DBGTRACE(dbgTraceLevel, args_in_parens) \ + if (ClassDebug & (1 << (dbgTraceLevel+15))){ \ + DbgPrint("CLASSPNP> *** TRACE *** (file %s, line %d)\n", __FILE__, __LINE__ ); \ + DbgPrint(" > "); \ + DbgPrint args_in_parens; \ + DbgPrint("\n"); \ + if (DebugTrapOnWarn && (dbgTraceLevel == ClassDebugWarning)){ \ + DbgBreakPoint(); \ + } \ + } + #define DBGWARN(args_in_parens) \ + { \ + DbgPrint("CLASSPNP> *** WARNING *** (file %s, line %d)\n", __FILE__, __LINE__ ); \ + DbgPrint(" > "); \ + DbgPrint args_in_parens; \ + DbgPrint("\n"); \ + if (DebugTrapOnWarn){ \ + DbgBreakPoint(); \ + } \ + } + #define DBGERR(args_in_parens) \ + { \ + DbgPrint("CLASSPNP> *** ERROR *** (file %s, line %d)\n", __FILE__, __LINE__ ); \ + DbgPrint(" > "); \ + DbgPrint args_in_parens; \ + DbgPrint("\n"); \ + DbgBreakPoint(); \ + } + #define DBGTRAP(args_in_parens) \ + { \ + DbgPrint("CLASSPNP> *** COVERAGE TRAP *** (file %s, line %d)\n", __FILE__, __LINE__ ); \ + DbgPrint(" > "); \ + DbgPrint args_in_parens; \ + DbgPrint("\n"); \ + DbgBreakPoint(); \ + } + + + #define DBGGETIOCTLSTR(_ioctl) DbgGetIoctlStr(_ioctl) + #define DBGGETSCSIOPSTR(_pSrb) DbgGetScsiOpStr(_pSrb) + #define DBGGETSENSECODESTR(_pSrb) DbgGetSenseCodeStr(_pSrb) + #define DBGGETADSENSECODESTR(_pSrb) DbgGetAdditionalSenseCodeStr(_pSrb) + #define DBGGETADSENSEQUALIFIERSTR(_pSrb) DbgGetAdditionalSenseCodeQualifierStr(_pSrb) + #define DBGCHECKRETURNEDPKT(_pkt) DbgCheckReturnedPkt(_pkt) + #define DBGGETSRBSTATUSSTR(_pSrb) DbgGetSrbStatusStr(_pSrb) + + VOID ClasspInitializeDebugGlobals(); + char *DbgGetIoctlStr(ULONG ioctl); + char *DbgGetScsiOpStr(PSCSI_REQUEST_BLOCK Srb); + char *DbgGetSenseCodeStr(PSCSI_REQUEST_BLOCK Srb); + char *DbgGetAdditionalSenseCodeStr(PSCSI_REQUEST_BLOCK Srb); + char *DbgGetAdditionalSenseCodeQualifierStr(PSCSI_REQUEST_BLOCK Srb); + VOID DbgCheckReturnedPkt(TRANSFER_PACKET *Pkt); + char *DbgGetSrbStatusStr(PSCSI_REQUEST_BLOCK Srb); + + + extern CLASSPNP_GLOBALS ClasspnpGlobals; + extern LONG ClassDebug; + extern BOOLEAN DebugTrapOnWarn; + +#else + + #define ClasspInitializeDebugGlobals() + #define DBGWARN(args_in_parens) + #define DBGERR(args_in_parens) + #define DBGTRACE(dbgTraceLevel, args_in_parens) + #define DBGTRAP(args_in_parens) + + #define DBGGETIOCTLSTR(_ioctl) + #define DBGGETSCSIOPSTR(_pSrb) + #define DBGGETSENSECODESTR(_pSrb) + #define DBGGETADSENSECODESTR(_pSrb) + #define DBGGETADSENSEQUALIFIERSTR(_pSrb) + #define DBGCHECKRETURNEDPKT(_pkt) + #define DBGGETSRBSTATUSSTR(_pSrb) + +#endif + + diff --git a/drivers/storage/classpnp/dictlib.c b/drivers/storage/classpnp/dictlib.c new file mode 100644 index 00000000000..ba479fe9b52 --- /dev/null +++ b/drivers/storage/classpnp/dictlib.c @@ -0,0 +1,216 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1990 - 1999 + +Module Name: + + dictlib.c + +Abstract: + + Support library for maintaining a dictionary list (list of objects + referenced by a key value). + +Environment: + + kernel mode only + +Notes: + + This module generates a static library + +Revision History: + +--*/ + +#include +#include + +#define DICTIONARY_SIGNATURE (((ULONG)'dict' << 32) + 'sig ') + +struct _DICTIONARY_HEADER { + struct _DICTIONARY_HEADER* Next; + ULONGLONG Key; + UCHAR Data[0]; +}; + +struct _DICTIONARY_HEADER; +typedef struct _DICTIONARY_HEADER DICTIONARY_HEADER, *PDICTIONARY_HEADER; + + +VOID +InitializeDictionary( + IN PDICTIONARY Dictionary + ) +{ + RtlZeroMemory(Dictionary, sizeof(Dictionary)); + Dictionary->Signature = DICTIONARY_SIGNATURE; + KeInitializeSpinLock(&Dictionary->SpinLock); + return; +} + + +BOOLEAN +TestDictionarySignature( + IN PDICTIONARY Dictionary + ) +{ + return Dictionary->Signature == DICTIONARY_SIGNATURE; +} + +NTSTATUS +AllocateDictionaryEntry( + IN PDICTIONARY Dictionary, + IN ULONGLONG Key, + IN ULONG Size, + IN ULONG Tag, + OUT PVOID *Entry + ) +{ + PDICTIONARY_HEADER header; + KIRQL oldIrql; + PDICTIONARY_HEADER *entry; + + NTSTATUS status = STATUS_SUCCESS; + + *Entry = NULL; + + header = ExAllocatePoolWithTag(NonPagedPool, + Size + sizeof(DICTIONARY_HEADER), + Tag); + + if(header == NULL) { + return STATUS_INSUFFICIENT_RESOURCES; + } + + RtlZeroMemory(header, sizeof(DICTIONARY_HEADER) + Size); + header->Key = Key; + + // + // Find the correct location for this entry in the dictionary. + // + + KeAcquireSpinLock(&(Dictionary->SpinLock), &oldIrql); + + TRY { + + entry = &(Dictionary->List); + + while(*entry != NULL) { + if((*entry)->Key == Key) { + + // + // Dictionary must have unique keys. + // + + status = STATUS_OBJECT_NAME_COLLISION; + LEAVE; + + } else if ((*entry)->Key < Key) { + + // + // We will go ahead and insert the key in here. + // + break; + } else { + entry = &((*entry)->Next); + } + } + + // + // If we make it here then we will go ahead and do the insertion. + // + + header->Next = *entry; + *entry = header; + + } FINALLY { + KeReleaseSpinLock(&(Dictionary->SpinLock), oldIrql); + + if(!NT_SUCCESS(status)) { + ExFreePool(header); + } else { + *Entry = (PVOID) header->Data; + } + } + return status; +} + + +PVOID +GetDictionaryEntry( + IN PDICTIONARY Dictionary, + IN ULONGLONG Key + ) +{ + PDICTIONARY_HEADER entry; + PVOID data; + KIRQL oldIrql; + + + data = NULL; + + KeAcquireSpinLock(&(Dictionary->SpinLock), &oldIrql); + + entry = Dictionary->List; + while (entry != NULL) { + + if (entry->Key == Key) { + data = entry->Data; + break; + } else { + entry = entry->Next; + } + } + + KeReleaseSpinLock(&(Dictionary->SpinLock), oldIrql); + + return data; +} + + +VOID +FreeDictionaryEntry( + IN PDICTIONARY Dictionary, + IN PVOID Entry + ) +{ + PDICTIONARY_HEADER header; + PDICTIONARY_HEADER *entry; + KIRQL oldIrql; + BOOLEAN found; + + found = FALSE; + header = CONTAINING_RECORD(Entry, DICTIONARY_HEADER, Data); + + KeAcquireSpinLock(&(Dictionary->SpinLock), &oldIrql); + + entry = &(Dictionary->List); + while(*entry != NULL) { + + if(*entry == header) { + *entry = header->Next; + found = TRUE; + break; + } else { + entry = &(*entry)->Next; + } + } + + KeReleaseSpinLock(&(Dictionary->SpinLock), oldIrql); + + // + // calling this w/an invalid pointer invalidates the dictionary system, + // so ASSERT() that we never try to Free something not in the list + // + + ASSERT(found); + if (found) { + ExFreePool(header); + } + + return; + +} + + diff --git a/drivers/storage/classpnp/lock.c b/drivers/storage/classpnp/lock.c new file mode 100644 index 00000000000..deea29eead6 --- /dev/null +++ b/drivers/storage/classpnp/lock.c @@ -0,0 +1,418 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1990 - 1998 + +Module Name: + + lock.c + +Abstract: + + This is the NT SCSI port driver. + +Environment: + + kernel mode only + +Notes: + + This module is a driver dll for scsi miniports. + +Revision History: + +--*/ + +#include "classp.h" +#include "debug.h" + + +LONG LockHighWatermark = 0; +LONG LockLowWatermark = 0; +LONG MaxLockedMinutes = 5; + +// +// Structure used for tracking remove lock allocations in checked builds +// +typedef struct _REMOVE_TRACKING_BLOCK { + struct _REMOVE_TRACKING_BLOCK *NextBlock; + PVOID Tag; + LARGE_INTEGER TimeLocked; + PCSTR File; + ULONG Line; +} REMOVE_TRACKING_BLOCK, *PREMOVE_TRACKING_BLOCK; + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassAcquireRemoveLockEx() + +Routine Description: + + This routine is called to acquire the remove lock on the device object. + While the lock is held, the caller can assume that no pending pnp REMOVE + requests will be completed. + + The lock should be acquired immediately upon entering a dispatch routine. + It should also be acquired before creating any new reference to the + device object if there's a chance of releasing the reference before the + new one is done. + + This routine will return TRUE if the lock was successfully acquired or + FALSE if it cannot be because the device object has already been removed. + +Arguments: + + DeviceObject - the device object to lock + + Tag - Used for tracking lock allocation and release. If an irp is + specified when acquiring the lock then the same Tag must be + used to release the lock before the Tag is completed. + +Return Value: + + The value of the IsRemoved flag in the device extension. If this is + non-zero then the device object has received a Remove irp and non-cleanup + IRP's should fail. + + If the value is REMOVE_COMPLETE, the caller should not even release the + lock. + +--*/ +ULONG +ClassAcquireRemoveLockEx( + IN PDEVICE_OBJECT DeviceObject, + IN OPTIONAL PVOID Tag, + IN PCSTR File, + IN ULONG Line + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + LONG lockValue; + + + + // + // Grab the remove lock + // + lockValue = InterlockedIncrement(&commonExtension->RemoveLock); + + #if DBG + + DebugPrint((ClassDebugRemoveLock, "ClassAcquireRemoveLock: " + "Acquired for Object %p & irp %p - count is %d\n", + DeviceObject, Tag, lockValue)); + + ASSERTMSG("ClassAcquireRemoveLock - lock value was negative : ", + (lockValue > 0)); + + ASSERTMSG("RemoveLock increased to meet LockHighWatermark", + ((LockHighWatermark == 0) || + (lockValue != LockHighWatermark))); + + if (commonExtension->IsRemoved != REMOVE_COMPLETE){ + PREMOVE_TRACKING_BLOCK trackingBlock; + + trackingBlock = ExAllocatePool(NonPagedPool, + sizeof(REMOVE_TRACKING_BLOCK)); + + if(trackingBlock == NULL) { + + KIRQL oldIrql; + + KeAcquireSpinLock(&commonExtension->RemoveTrackingSpinlock, + &oldIrql); + + commonExtension->RemoveTrackingUntrackedCount++; + + DebugPrint((ClassDebugWarning, ">>>>>ClassAcquireRemoveLock: " + "Cannot track Tag %p - currently %d untracked requsts\n", + Tag, commonExtension->RemoveTrackingUntrackedCount)); + + KeReleaseSpinLock(&commonExtension->RemoveTrackingSpinlock, + oldIrql); + } + else { + PREMOVE_TRACKING_BLOCK *removeTrackingList = + (PREMOVE_TRACKING_BLOCK)&commonExtension->RemoveTrackingList; + + KIRQL oldIrql; + + trackingBlock->Tag = Tag; + + trackingBlock->File = File; + trackingBlock->Line = Line; + + KeQueryTickCount((&trackingBlock->TimeLocked)); + + KeAcquireSpinLock(&commonExtension->RemoveTrackingSpinlock, + &oldIrql); + + while(*removeTrackingList != NULL) { + + if((*removeTrackingList)->Tag > Tag) { + break; + } + + if((*removeTrackingList)->Tag == Tag) { + + DebugPrint((ClassDebugError, ">>>>>ClassAcquireRemoveLock: " + "already tracking Tag %p\n", Tag)); + DebugPrint((ClassDebugError, ">>>>>ClassAcquireRemoveLock: " + "acquired in file %s on line %d\n", + (*removeTrackingList)->File, + (*removeTrackingList)->Line)); + ASSERT(FALSE); + } + + removeTrackingList = &((*removeTrackingList)->NextBlock); + } + + trackingBlock->NextBlock = *removeTrackingList; + *removeTrackingList = trackingBlock; + + KeReleaseSpinLock(&commonExtension->RemoveTrackingSpinlock, + oldIrql); + + } + } + + #endif + + return (commonExtension->IsRemoved); +} + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassReleaseRemoveLock() + +Routine Description: + + This routine is called to release the remove lock on the device object. It + must be called when finished using a previously locked reference to the + device object. If an Tag was specified when acquiring the lock then the + same Tag must be specified when releasing the lock. + + When the lock count reduces to zero, this routine will signal the waiting + remove Tag to delete the device object. As a result the DeviceObject + pointer should not be used again once the lock has been released. + +Arguments: + + DeviceObject - the device object to lock + + Tag - The irp (if any) specified when acquiring the lock. This is used + for lock tracking purposes + +Return Value: + + none + +--*/ +VOID +ClassReleaseRemoveLock( + IN PDEVICE_OBJECT DeviceObject, + IN OPTIONAL PIRP Tag + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + LONG lockValue; + + #if DBG + PREMOVE_TRACKING_BLOCK *listEntry = + (PREMOVE_TRACKING_BLOCK)&commonExtension->RemoveTrackingList; + + BOOLEAN found = FALSE; + + LONGLONG maxCount; + + BOOLEAN isRemoved = (commonExtension->IsRemoved == REMOVE_COMPLETE); + + KIRQL oldIrql; + + if(isRemoved) { + DBGTRAP(("ClassReleaseRemoveLock: REMOVE_COMPLETE set; this should never happen")); + InterlockedDecrement(&(commonExtension->RemoveLock)); + return; + } + + // + // Check the tick count and make sure this thing hasn't been locked + // for more than MaxLockedMinutes. + // + + maxCount = KeQueryTimeIncrement() * 10; // microseconds + maxCount *= 1000; // milliseconds + maxCount *= 1000; // seconds + maxCount *= 60; // minutes + maxCount *= MaxLockedMinutes; + + DebugPrint((ClassDebugRemoveLock, "ClassReleaseRemoveLock: " + "maxCount = %0I64x\n", maxCount)); + + KeAcquireSpinLock(&commonExtension->RemoveTrackingSpinlock, + &oldIrql); + + while(*listEntry != NULL) { + + PREMOVE_TRACKING_BLOCK block; + LARGE_INTEGER difference; + + block = *listEntry; + + KeQueryTickCount((&difference)); + + difference.QuadPart -= block->TimeLocked.QuadPart; + + DebugPrint((ClassDebugRemoveLock, "ClassReleaseRemoveLock: " + "Object %p (tag %p) locked for %I64d ticks\n", + DeviceObject, block->Tag, difference.QuadPart)); + + if(difference.QuadPart >= maxCount) { + + DebugPrint((ClassDebugError, ">>>>>ClassReleaseRemoveLock: " + "Object %p (tag %p) locked for %I64d ticks - TOO LONG\n", + DeviceObject, block->Tag, difference.QuadPart)); + DebugPrint((ClassDebugError, ">>>>>ClassReleaseRemoveLock: " + "Lock acquired in file %s on line %d\n", + block->File, block->Line)); + ASSERT(FALSE); + } + + if((found == FALSE) && ((*listEntry)->Tag == Tag)) { + + *listEntry = block->NextBlock; + ExFreePool(block); + found = TRUE; + + } else { + + listEntry = &((*listEntry)->NextBlock); + + } + } + + if(!found) { + if(commonExtension->RemoveTrackingUntrackedCount == 0) { + DebugPrint((ClassDebugError, ">>>>>ClassReleaseRemoveLock: " + "Couldn't find Tag %p in the lock tracking list\n", + Tag)); + ASSERT(FALSE); + } else { + DebugPrint((ClassDebugError, ">>>>>ClassReleaseRemoveLock: " + "Couldn't find Tag %p in the lock tracking list - " + "may be one of the %d untracked requests still " + "outstanding\n", + Tag, + commonExtension->RemoveTrackingUntrackedCount)); + + commonExtension->RemoveTrackingUntrackedCount--; + ASSERT(commonExtension->RemoveTrackingUntrackedCount >= 0); + } + } + + KeReleaseSpinLock(&commonExtension->RemoveTrackingSpinlock, + oldIrql); + + #endif + + lockValue = InterlockedDecrement(&commonExtension->RemoveLock); + + DebugPrint((ClassDebugRemoveLock, "ClassReleaseRemoveLock: " + "Released for Object %p & irp %p - count is %d\n", + DeviceObject, Tag, lockValue)); + + ASSERT(lockValue >= 0); + + ASSERTMSG("RemoveLock decreased to meet LockLowWatermark", + ((LockLowWatermark == 0) || !(lockValue == LockLowWatermark))); + + if(lockValue == 0) { + + ASSERT(commonExtension->IsRemoved); + + // + // The device needs to be removed. Signal the remove event + // that it's safe to go ahead. + // + + DebugPrint((ClassDebugRemoveLock, "ClassReleaseRemoveLock: " + "Release for object %p & irp %p caused lock to go to zero\n", + DeviceObject, Tag)); + + KeSetEvent(&commonExtension->RemoveEvent, + IO_NO_INCREMENT, + FALSE); + + } + return; +} + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassCompleteRequest() + +Routine Description: + + This routine is a wrapper around (and should be used instead of) + IoCompleteRequest. It is used primarily for debugging purposes. + The routine will assert if the Irp being completed is still holding + the release lock. + +Arguments: + + DeviceObject - the device object that was handling this request + + Irp - the irp to be completed by IoCompleteRequest + + PriorityBoost - the priority boost to pass to IoCompleteRequest + +Return Value: + + none + +--*/ +VOID +ClassCompleteRequest( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN CCHAR PriorityBoost + ) +{ + + #if DBG + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PREMOVE_TRACKING_BLOCK *listEntry = + (PREMOVE_TRACKING_BLOCK)&commonExtension->RemoveTrackingList; + + KIRQL oldIrql; + + KeAcquireSpinLock(&commonExtension->RemoveTrackingSpinlock, + &oldIrql); + + while(*listEntry != NULL) { + + if((*listEntry)->Tag == Irp) { + break; + } + + listEntry = &((*listEntry)->NextBlock); + } + + if(*listEntry != NULL) { + + DebugPrint((ClassDebugError, ">>>>>ClassCompleteRequest: " + "Irp %p completed while still holding the remove lock\n", + Irp)); + DebugPrint((ClassDebugError, ">>>>>ClassCompleteRequest: " + "Lock acquired in file %s on line %d\n", + (*listEntry)->File, (*listEntry)->Line)); + ASSERT(FALSE); + } + + KeReleaseSpinLock(&commonExtension->RemoveTrackingSpinlock, oldIrql); + #endif + + IoCompleteRequest(Irp, PriorityBoost); + return; +} // end ClassCompleteRequest() + diff --git a/drivers/storage/classpnp/obsolete.c b/drivers/storage/classpnp/obsolete.c new file mode 100644 index 00000000000..1dec49c4306 --- /dev/null +++ b/drivers/storage/classpnp/obsolete.c @@ -0,0 +1,1060 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + obsolete.c + +Abstract: + + THESE ARE EXPORTED CLASSPNP FUNCTIONS (and their subroutines) + WHICH ARE NOW OBSOLETE. + BUT WE NEED TO KEEP THEM AROUND FOR LEGACY REASONS. + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + +#include "classp.h" +#include "debug.h" + +PIRP ClassRemoveCScanList(IN PCSCAN_LIST List); +VOID ClasspInitializeCScanList(IN PCSCAN_LIST List); + +#ifdef ALLOC_PRAGMA + #pragma alloc_text(PAGE, ClassDeleteSrbLookasideList) + #pragma alloc_text(PAGE, ClassInitializeSrbLookasideList) +#endif + +typedef struct _CSCAN_LIST_ENTRY { + LIST_ENTRY Entry; + ULONGLONG BlockNumber; +} CSCAN_LIST_ENTRY, *PCSCAN_LIST_ENTRY; + + + + + +/* + * ClassSplitRequest + * + * This is a legacy exported function. + * It is called by storage miniport driver that have their own + * StartIo routine when the transfer size is too large for the hardware. + * We map it to our new read/write handler. + */ +VOID ClassSplitRequest(IN PDEVICE_OBJECT Fdo, IN PIRP Irp, IN ULONG MaximumBytes) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + + if (MaximumBytes > fdoData->HwMaxXferLen) { + DBGERR(("ClassSplitRequest - driver requesting split to size that " + "hardware is unable to handle!\n")); + } + + if (MaximumBytes < fdoData->HwMaxXferLen){ + DBGWARN(("ClassSplitRequest - driver requesting smaller HwMaxXferLen " + "than required")); + fdoData->HwMaxXferLen = MAX(MaximumBytes, PAGE_SIZE); + } + + ServiceTransferRequest(Fdo, Irp); +} + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassIoCompleteAssociated() + +Routine Description: + + This routine executes when the port driver has completed a request. + It looks at the SRB status in the completing SRB and if not success + it checks for valid request sense buffer information. If valid, the + info is used to update status with more precise message of type of + error. This routine deallocates the SRB. This routine is used for + requests which were build by split request. After it has processed + the request it decrements the Irp count in the master Irp. If the + count goes to zero then the master Irp is completed. + +Arguments: + + Fdo - Supplies the functional device object which represents the target. + + Irp - Supplies the Irp which has completed. + + Context - Supplies a pointer to the SRB. + +Return Value: + + NT status + +--*/ +NTSTATUS +ClassIoCompleteAssociated( + IN PDEVICE_OBJECT Fdo, + IN PIRP Irp, + IN PVOID Context + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PSCSI_REQUEST_BLOCK srb = Context; + + PIRP originalIrp = Irp->AssociatedIrp.MasterIrp; + LONG irpCount; + + NTSTATUS status; + BOOLEAN retry; + + DBGWARN(("ClassIoCompleteAssociated is OBSOLETE !")); + + // + // Check SRB status for success of completing request. + // + + if (SRB_STATUS(srb->SrbStatus) != SRB_STATUS_SUCCESS) { + + ULONG retryInterval; + + DebugPrint((2,"ClassIoCompleteAssociated: IRP %p, SRB %p", Irp, srb)); + + // + // Release the queue if it is frozen. + // + + if (srb->SrbStatus & SRB_STATUS_QUEUE_FROZEN) { + ClassReleaseQueue(Fdo); + } + + retry = ClassInterpretSenseInfo( + Fdo, + srb, + irpStack->MajorFunction, + irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL ? + irpStack->Parameters.DeviceIoControl.IoControlCode : + 0, + MAXIMUM_RETRIES - + ((ULONG)(ULONG_PTR)irpStack->Parameters.Others.Argument4), + &status, + &retryInterval); + + // + // If the status is verified required and the this request + // should bypass verify required then retry the request. + // + + if (irpStack->Flags & SL_OVERRIDE_VERIFY_VOLUME && + status == STATUS_VERIFY_REQUIRED) { + + status = STATUS_IO_DEVICE_ERROR; + retry = TRUE; + } + + if (retry && (irpStack->Parameters.Others.Argument4--)) { + + // + // Retry request. If the class driver has supplied a StartIo, + // call it directly for retries. + // + + DebugPrint((1, "Retry request %p\n", Irp)); + + if (PORT_ALLOCATED_SENSE(fdoExtension, srb)) { + FREE_PORT_ALLOCATED_SENSE_BUFFER(fdoExtension, srb); + } + + RetryRequest(Fdo, Irp, srb, TRUE, retryInterval); + + return STATUS_MORE_PROCESSING_REQUIRED; + } + + } else { + + // + // Set status for successful request. + // + + status = STATUS_SUCCESS; + + } // end if (SRB_STATUS(srb->SrbStatus) ... + + // + // Return SRB to list. + // + + if (PORT_ALLOCATED_SENSE(fdoExtension, srb)) { + FREE_PORT_ALLOCATED_SENSE_BUFFER(fdoExtension, srb); + } + + ClassFreeOrReuseSrb(fdoExtension, srb); + + // + // Set status in completing IRP. + // + + Irp->IoStatus.Status = status; + + DebugPrint((2, "ClassIoCompleteAssociated: Partial xfer IRP %p\n", Irp)); + + // + // Get next stack location. This original request is unused + // except to keep track of the completing partial IRPs so the + // stack location is valid. + // + + irpStack = IoGetNextIrpStackLocation(originalIrp); + + // + // Update status only if error so that if any partial transfer + // completes with error, then the original IRP will return with + // error. If any of the asynchronous partial transfer IRPs fail, + // with an error then the original IRP will return 0 bytes transfered. + // This is an optimization for successful transfers. + // + + if (!NT_SUCCESS(status)) { + + originalIrp->IoStatus.Status = status; + originalIrp->IoStatus.Information = 0; + + // + // Set the hard error if necessary. + // + + if (IoIsErrorUserInduced(status)) { + + // + // Store DeviceObject for filesystem. + // + + IoSetHardErrorOrVerifyDevice(originalIrp, Fdo); + } + } + + // + // Decrement and get the count of remaining IRPs. + // + + irpCount = InterlockedDecrement( + (PLONG)&irpStack->Parameters.Others.Argument1); + + DebugPrint((2, "ClassIoCompleteAssociated: Partial IRPs left %d\n", + irpCount)); + + // + // Ensure that the irpCount doesn't go negative. This was happening once + // because classpnp would get confused if it ran out of resources when + // splitting the request. + // + + ASSERT(irpCount >= 0); + + if (irpCount == 0) { + + // + // All partial IRPs have completed. + // + + DebugPrint((2, + "ClassIoCompleteAssociated: All partial IRPs complete %p\n", + originalIrp)); + + if (fdoExtension->CommonExtension.DriverExtension->InitData.ClassStartIo) { + + // + // Acquire a separate copy of the remove lock so the debugging code + // works okay and we don't have to hold up the completion of this + // irp until after we start the next packet(s). + // + + KIRQL oldIrql; + UCHAR uniqueAddress; + ClassAcquireRemoveLock(Fdo, (PIRP)&uniqueAddress); + ClassReleaseRemoveLock(Fdo, originalIrp); + ClassCompleteRequest(Fdo, originalIrp, IO_DISK_INCREMENT); + + KeRaiseIrql(DISPATCH_LEVEL, &oldIrql); + IoStartNextPacket(Fdo, FALSE); + KeLowerIrql(oldIrql); + + ClassReleaseRemoveLock(Fdo, (PIRP)&uniqueAddress); + + } else { + + // + // just complete this request + // + + ClassReleaseRemoveLock(Fdo, originalIrp); + ClassCompleteRequest(Fdo, originalIrp, IO_DISK_INCREMENT); + + } + + } + + // + // Deallocate IRP and indicate the I/O system should not attempt any more + // processing. + // + + IoFreeIrp(Irp); + return STATUS_MORE_PROCESSING_REQUIRED; + +} // end ClassIoCompleteAssociated() + + +/*++//////////////////////////////////////////////////////////////////////////// + +RetryRequest() + +Routine Description: + + This is a wrapper around the delayed retry DPC routine, RetryRequestDPC. + This reinitalizes the necessary fields, queues the request, and sets + a timer to call the DPC if someone hasn't already done so. + +Arguments: + + DeviceObject - Supplies the device object associated with this request. + + Irp - Supplies the request to be retried. + + Srb - Supplies a Pointer to the SCSI request block to be retied. + + Assocaiated - Indicates this is an assocatied Irp created by split request. + + RetryInterval - How long, in seconds, before retrying the request. + +Return Value: + + None + +--*/ +VOID +RetryRequest( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PSCSI_REQUEST_BLOCK Srb, + BOOLEAN Associated, + ULONG RetryInterval + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(Irp); + PIO_STACK_LOCATION nextIrpStack = IoGetNextIrpStackLocation(Irp); + ULONG transferByteCount; + + // This function is obsolete but is still used by some of our class drivers. + // DBGWARN(("RetryRequest is OBSOLETE !")); + + // + // Determine the transfer count of the request. If this is a read or a + // write then the transfer count is in the Irp stack. Otherwise assume + // the MDL contains the correct length. If there is no MDL then the + // transfer length must be zero. + // + + if (currentIrpStack->MajorFunction == IRP_MJ_READ || + currentIrpStack->MajorFunction == IRP_MJ_WRITE) { + + transferByteCount = currentIrpStack->Parameters.Read.Length; + + } else if (Irp->MdlAddress != NULL) { + + // + // Note this assumes that only read and write requests are spilt and + // other request do not need to be. If the data buffer address in + // the MDL and the SRB don't match then transfer length is most + // likely incorrect. + // + + ASSERT(Srb->DataBuffer == MmGetMdlVirtualAddress(Irp->MdlAddress)); + transferByteCount = Irp->MdlAddress->ByteCount; + + } else { + + transferByteCount = 0; + } + + // + // this is a safety net. this should not normally be hit, since we are + // not guaranteed to be an fdoExtension + // + + ASSERT(!TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)); + + // + // Reset byte count of transfer in SRB Extension. + // + + Srb->DataTransferLength = transferByteCount; + + // + // Zero SRB statuses. + // + + Srb->SrbStatus = Srb->ScsiStatus = 0; + + // + // Set the no disconnect flag, disable synchronous data transfers and + // disable tagged queuing. This fixes some errors. + // NOTE: Cannot clear these flags, just add to them + // + + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_DISABLE_DISCONNECT); + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + CLEAR_FLAG(Srb->SrbFlags, SRB_FLAGS_QUEUE_ACTION_ENABLE); + + Srb->QueueTag = SP_UNTAGGED; + + // + // Set up major SCSI function. + // + + nextIrpStack->MajorFunction = IRP_MJ_SCSI; + + // + // Save SRB address in next stack for port driver. + // + + nextIrpStack->Parameters.Scsi.Srb = Srb; + + + IoSetCompletionRoutine(Irp, ClassIoComplete, Srb, TRUE, TRUE, TRUE); + + { + LARGE_INTEGER retry100ns; + retry100ns.QuadPart = RetryInterval; // seconds + retry100ns.QuadPart *= (LONGLONG)1000 * 1000 * 10; + + ClassRetryRequest(DeviceObject, Irp, retry100ns); + } + return; +} // end RetryRequest() + + +/*++ + +ClassBuildRequest() + +Routine Description: + + This routine allocates an SRB for the specified request then calls + ClasspBuildRequestEx to create a SCSI operation to read or write the device. + + If no SRB is available then the request will be queued to be issued later + when requests are available. Drivers which do not want the queueing + behavior should allocate the SRB themselves and call ClasspBuildRequestEx + to issue it. + +Arguments: + + Fdo - Supplies the functional device object associated with this request. + + Irp - Supplies the request to be retried. + +Note: + + If the IRP is for a disk transfer, the byteoffset field + will already have been adjusted to make it relative to + the beginning of the disk. + + +Return Value: + + NT Status + +--*/ +NTSTATUS +ClassBuildRequest( + PDEVICE_OBJECT Fdo, + PIRP Irp + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension; + + PSCSI_REQUEST_BLOCK srb; + + // This function is obsolete, but still called by CDROM.SYS . + // DBGWARN(("ClassBuildRequest is OBSOLETE !")); + + // + // Allocate an Srb. + // + + srb = ClasspAllocateSrb(fdoExtension); + + if(srb == NULL) { + return STATUS_INSUFFICIENT_RESOURCES; + } + + ClasspBuildRequestEx(fdoExtension, Irp, srb); + return STATUS_SUCCESS; + +} // end ClassBuildRequest() + + +VOID +ClasspBuildRequestEx( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PIRP Irp, + IN PSCSI_REQUEST_BLOCK Srb + ) + +/*++ + +ClasspBuildRequestEx() + +Routine Description: + + This routine allocates and builds an Srb for a read or write request. + The block address and length are supplied by the Irp. The retry count + is stored in the current stack for use by ClassIoComplete which + processes these requests when they complete. The Irp is ready to be + passed to the port driver when this routine returns. + +Arguments: + + FdoExtension - Supplies the device extension associated with this request. + + Irp - Supplies the request to be issued. + + Srb - Supplies an SRB to be used for the request. + +Note: + + If the IRP is for a disk transfer, the byteoffset field + will already have been adjusted to make it relative to + the beginning of the disk. + + +Return Value: + + NT Status + +--*/ +{ + PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(Irp); + PIO_STACK_LOCATION nextIrpStack = IoGetNextIrpStackLocation(Irp); + + LARGE_INTEGER startingOffset = currentIrpStack->Parameters.Read.ByteOffset; + + PCDB cdb; + ULONG logicalBlockAddress; + USHORT transferBlocks; + + // This function is obsolete, but still called by CDROM.SYS . + // DBGWARN(("ClasspBuildRequestEx is OBSOLETE !")); + + // + // Prepare the SRB. + // + + RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK)); + + // + // Calculate relative sector address. + // + + logicalBlockAddress = + (ULONG)(Int64ShrlMod32(startingOffset.QuadPart, + FdoExtension->SectorShift)); + + // + // Write length to SRB. + // + + Srb->Length = sizeof(SCSI_REQUEST_BLOCK); + + // + // Set up IRP Address. + // + + Srb->OriginalRequest = Irp; + + // + // Set up target ID and logical unit number. + // + + Srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + Srb->DataBuffer = MmGetMdlVirtualAddress(Irp->MdlAddress); + + // + // Save byte count of transfer in SRB Extension. + // + + Srb->DataTransferLength = currentIrpStack->Parameters.Read.Length; + + // + // Initialize the queue actions field. + // + + Srb->QueueAction = SRB_SIMPLE_TAG_REQUEST; + + // + // Queue sort key is Relative Block Address. + // + + Srb->QueueSortKey = logicalBlockAddress; + + // + // Indicate auto request sense by specifying buffer and size. + // + + Srb->SenseInfoBuffer = FdoExtension->SenseData; + Srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; + + // + // Set timeout value of one unit per 64k bytes of data. + // + + Srb->TimeOutValue = ((Srb->DataTransferLength + 0xFFFF) >> 16) * + FdoExtension->TimeOutValue; + + // + // Zero statuses. + // + + Srb->SrbStatus = Srb->ScsiStatus = 0; + Srb->NextSrb = 0; + + // + // Indicate that 10-byte CDB's will be used. + // + + Srb->CdbLength = 10; + + // + // Fill in CDB fields. + // + + cdb = (PCDB)Srb->Cdb; + + transferBlocks = (USHORT)(currentIrpStack->Parameters.Read.Length >> + FdoExtension->SectorShift); + + // + // Move little endian values into CDB in big endian format. + // + + cdb->CDB10.LogicalBlockByte0 = ((PFOUR_BYTE)&logicalBlockAddress)->Byte3; + cdb->CDB10.LogicalBlockByte1 = ((PFOUR_BYTE)&logicalBlockAddress)->Byte2; + cdb->CDB10.LogicalBlockByte2 = ((PFOUR_BYTE)&logicalBlockAddress)->Byte1; + cdb->CDB10.LogicalBlockByte3 = ((PFOUR_BYTE)&logicalBlockAddress)->Byte0; + + cdb->CDB10.TransferBlocksMsb = ((PFOUR_BYTE)&transferBlocks)->Byte1; + cdb->CDB10.TransferBlocksLsb = ((PFOUR_BYTE)&transferBlocks)->Byte0; + + // + // Set transfer direction flag and Cdb command. + // + + if (currentIrpStack->MajorFunction == IRP_MJ_READ) { + + DebugPrint((3, "ClassBuildRequest: Read Command\n")); + + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_DATA_IN); + cdb->CDB10.OperationCode = SCSIOP_READ; + + } else { + + DebugPrint((3, "ClassBuildRequest: Write Command\n")); + + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_DATA_OUT); + cdb->CDB10.OperationCode = SCSIOP_WRITE; + } + + // + // If this is not a write-through request, then allow caching. + // + + if (!(currentIrpStack->Flags & SL_WRITE_THROUGH)) { + + SET_FLAG(Srb->SrbFlags, SRB_FLAGS_ADAPTER_CACHE_ENABLE); + + } else { + + // + // If write caching is enable then force media access in the + // cdb. + // + + if (FdoExtension->DeviceFlags & DEV_WRITE_CACHE) { + cdb->CDB10.ForceUnitAccess = TRUE; + } + } + + if(TEST_FLAG(Irp->Flags, (IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))) { + SET_FLAG(Srb->SrbFlags, SRB_CLASS_FLAGS_PAGING); + } + + // + // OR in the default flags from the device object. + // + + SET_FLAG(Srb->SrbFlags, FdoExtension->SrbFlags); + + // + // Set up major SCSI function. + // + + nextIrpStack->MajorFunction = IRP_MJ_SCSI; + + // + // Save SRB address in next stack for port driver. + // + + nextIrpStack->Parameters.Scsi.Srb = Srb; + + // + // Save retry count in current IRP stack. + // + + currentIrpStack->Parameters.Others.Argument4 = (PVOID)MAXIMUM_RETRIES; + + // + // Set up IoCompletion routine address. + // + + IoSetCompletionRoutine(Irp, ClassIoComplete, Srb, TRUE, TRUE, TRUE); + +} + + +VOID ClasspInsertCScanList(IN PLIST_ENTRY ListHead, IN PCSCAN_LIST_ENTRY Entry) +{ + PCSCAN_LIST_ENTRY t; + + DBGWARN(("ClasspInsertCScanList is OBSOLETE !")); + + // + // Iterate through the list. Insert this entry in the sorted list in + // order (after other requests for the same block). At each stop if + // blockNumber(Entry) >= blockNumber(t) then move on. + // + + for(t = (PCSCAN_LIST_ENTRY) ListHead->Flink; + t != (PCSCAN_LIST_ENTRY) ListHead; + t = (PCSCAN_LIST_ENTRY) t->Entry.Flink) { + + if(Entry->BlockNumber < t->BlockNumber) { + + // + // Set the pointers in entry to the right location. + // + + Entry->Entry.Flink = &(t->Entry); + Entry->Entry.Blink = t->Entry.Blink; + + // + // Set the pointers in the surrounding elements to refer to us. + // + + t->Entry.Blink->Flink = &(Entry->Entry); + t->Entry.Blink = &(Entry->Entry); + return; + } + } + + // + // Insert this entry at the tail of the list. If the list was empty this + // will also be the head of the list. + // + + InsertTailList(ListHead, &(Entry->Entry)); + +} + + +VOID ClassInsertCScanList(IN PCSCAN_LIST List, IN PIRP Irp, IN ULONGLONG BlockNumber, IN BOOLEAN LowPriority) +/*++ + +Routine Description: + + This routine inserts an entry into the CScan list based on it's block number + and priority. It is assumed that the caller is providing synchronization + to the access of the list. + + Low priority requests are always scheduled to run on the next sweep across + the disk. Normal priority requests will be inserted into the current or + next sweep based on the standard C-SCAN algorithm. + +Arguments: + + List - the list to insert into + + Irp - the irp to be inserted. + + BlockNumber - the block number for this request. + + LowPriority - indicates that the request is lower priority and should be + done on the next sweep across the disk. + +Return Value: + + none + +--*/ +{ + PCSCAN_LIST_ENTRY entry = (PCSCAN_LIST_ENTRY)Irp->Tail.Overlay.DriverContext; + + DBGWARN(("ClassInsertCScanList is OBSOLETE !")); + + // + // Set the block number in the entry. We need this to keep the list sorted. + // + entry->BlockNumber = BlockNumber; + + // + // If it's a normal priority request and further down the disk than our + // current position then insert this entry into the current sweep. + // + + if((LowPriority != TRUE) && (BlockNumber > List->BlockNumber)) { + ClasspInsertCScanList(&(List->CurrentSweep), entry); + } else { + ClasspInsertCScanList(&(List->NextSweep), entry); + } + return; +} + + + + +VOID ClassFreeOrReuseSrb( IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PSCSI_REQUEST_BLOCK Srb) +/*++ + +Routine Description: + + This routine will attempt to reuse the provided SRB to start a blocked + read/write request. + If there is no need to reuse the request it will be returned + to the SRB lookaside list. + +Arguments: + + Fdo - the device extension + + Srb - the SRB which is to be reused or freed. + +Return Value: + + none. + +--*/ + +{ + PCLASS_PRIVATE_FDO_DATA privateData = FdoExtension->PrivateFdoData; + PCOMMON_DEVICE_EXTENSION commonExt = &FdoExtension->CommonExtension; + KIRQL oldIrql; + PIRP blockedIrp; + + // This function is obsolete, but still called by DISK.SYS . + // DBGWARN(("ClassFreeOrReuseSrb is OBSOLETE !")); + + // + // safety net. this should never occur. if it does, it's a potential + // memory leak. + // + ASSERT(!TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)); + + if (commonExt->IsSrbLookasideListInitialized){ + /* + * Put the SRB back in our lookaside list. + * + * BUGBUG - Some class drivers use ClassIoComplete + * to complete SRBs that they themselves allocated. + * So we may be putting a "foreign" SRB + * (e.g. with a different pool tag) into our lookaside list. + */ + ClasspFreeSrb(FdoExtension, Srb); + } + else { + DBGERR(("ClassFreeOrReuseSrb: someone is trying to use an uninitialized SrbLookasideList !!!"));; + ExFreePool(Srb); + } +} + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassDeleteSrbLookasideList() + +Routine Description: + + This routine deletes a lookaside listhead for srbs, and should be called + only during the final removal. + + If called at other times, the caller is responsible for + synchronization and removal issues. + +Arguments: + + CommonExtension - Pointer to the CommonExtension containing the listhead. + +Return Value: + + None + +--*/ +VOID ClassDeleteSrbLookasideList(IN PCOMMON_DEVICE_EXTENSION CommonExtension) +{ + PAGED_CODE(); + + // This function is obsolete, but is still called by some of our code. + // DBGWARN(("ClassDeleteSrbLookasideList is OBSOLETE !")); + + if (CommonExtension->IsSrbLookasideListInitialized){ + CommonExtension->IsSrbLookasideListInitialized = FALSE; + ExDeleteNPagedLookasideList(&CommonExtension->SrbLookasideList); + } + else { + DBGWARN(("ClassDeleteSrbLookasideList: attempt to delete uninitialized or freed srblookasidelist")); + } +} + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassInitializeSrbLookasideList() + +Routine Description: + + This routine sets up a lookaside listhead for srbs, and should be called + only from the ClassInitDevice() routine to prevent race conditions. + + If called from other locations, the caller is responsible for + synchronization and removal issues. + +Arguments: + + CommonExtension - Pointer to the CommonExtension containing the listhead. + + NumberElements - Supplies the maximum depth of the lookaside list. + + +Note: + + The Windows 2000 version of classpnp did not return any status value from + this call. + +--*/ + +VOID ClassInitializeSrbLookasideList( IN PCOMMON_DEVICE_EXTENSION CommonExtension, + IN ULONG NumberElements) +{ + PAGED_CODE(); + + // This function is obsolete, but still called by DISK.SYS . + // DBGWARN(("ClassInitializeSrbLookasideList is OBSOLETE !")); + + ASSERT(!CommonExtension->IsSrbLookasideListInitialized); + if (!CommonExtension->IsSrbLookasideListInitialized){ + + ExInitializeNPagedLookasideList(&CommonExtension->SrbLookasideList, + NULL, + NULL, + NonPagedPool, + sizeof(SCSI_REQUEST_BLOCK), + '$scS', + (USHORT)NumberElements); + + CommonExtension->IsSrbLookasideListInitialized = TRUE; + } + +} + + + + +VOID ClasspInitializeCScanList(IN PCSCAN_LIST List) +{ + PAGED_CODE(); + RtlZeroMemory(List, sizeof(CSCAN_LIST)); + InitializeListHead(&(List->CurrentSweep)); + InitializeListHead(&(List->NextSweep)); +} + + + +VOID ClasspStartNextSweep(PCSCAN_LIST List) +{ + ASSERT(IsListEmpty(&(List->CurrentSweep)) == TRUE); + + // + // If the next sweep is empty then there's nothing to do. + // + + if(IsListEmpty(&(List->NextSweep))) { + return; + } + + // + // Copy the next sweep list head into the current sweep list head. + // + + List->CurrentSweep = List->NextSweep; + + // + // Unlink the next sweep list from the list head now that we have a copy + // of it. + // + + InitializeListHead(&(List->NextSweep)); + + // + // Update the next sweep list to point back to the current sweep list head. + // + + List->CurrentSweep.Flink->Blink = &(List->CurrentSweep); + List->CurrentSweep.Blink->Flink = &(List->CurrentSweep); + + return; +} + + + +PIRP ClassRemoveCScanList(IN PCSCAN_LIST List) +{ + PCSCAN_LIST_ENTRY entry; + + // + // If the current sweep is empty then promote the next sweep. + // + + if(IsListEmpty(&(List->CurrentSweep))) { + ClasspStartNextSweep(List); + } + + // + // If the current sweep is still empty then we're done. + // + + if(IsListEmpty(&(List->CurrentSweep))) { + return NULL; + } + + // + // Remove the head entry from the current sweep. Record it's block number + // so that nothing before it on the disk gets into the current sweep. + // + + entry = (PCSCAN_LIST_ENTRY) RemoveHeadList(&(List->CurrentSweep)); + + List->BlockNumber = entry->BlockNumber; + + return CONTAINING_RECORD(entry, IRP, Tail.Overlay.DriverContext); +} + diff --git a/drivers/storage/classpnp/power.c b/drivers/storage/classpnp/power.c new file mode 100644 index 00000000000..26d4d0172c2 --- /dev/null +++ b/drivers/storage/classpnp/power.c @@ -0,0 +1,1607 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + class.c + +Abstract: + + SCSI class driver routines + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + +#include "stddef.h" +#include "ntddk.h" +#include "scsi.h" +#include "classp.h" + +#include + +#define CLASS_TAG_POWER 'WLcS' + +NTSTATUS +ClasspPowerHandler( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN CLASS_POWER_OPTIONS Options + ); + +NTSTATUS +ClasspPowerDownCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PCLASS_POWER_CONTEXT Context + ); + +NTSTATUS +ClasspPowerUpCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PCLASS_POWER_CONTEXT Context + ); + +VOID +RetryPowerRequest( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PCLASS_POWER_CONTEXT Context + ); + +NTSTATUS +ClasspStartNextPowerIrpCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ); + + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassDispatchPower() + +Routine Description: + + This routine acquires the removelock for the irp and then calls the + appropriate power callback. + +Arguments: + + DeviceObject - + Irp - + +Return Value: + +--*/ +NTSTATUS +ClassDispatchPower( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + ULONG isRemoved; + PCLASS_POWER_DEVICE powerRoutine = NULL; + + // + // NOTE: This code may be called at PASSIVE or DISPATCH, depending + // upon the device object it is being called for. + // don't do anything that would break under either circumstance. + // + + NTSTATUS status; + + isRemoved = ClassAcquireRemoveLock(DeviceObject, Irp); + + if(isRemoved) { + ClassReleaseRemoveLock(DeviceObject, Irp); + Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST; + PoStartNextPowerIrp(Irp); + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + return STATUS_DEVICE_DOES_NOT_EXIST; + } + + return commonExtension->DevInfo->ClassPowerDevice(DeviceObject, Irp); +} // end ClassDispatchPower() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspPowerUpCompletion() + +Routine Description: + + This routine is used for intermediate completion of a power up request. + PowerUp requires four requests to be sent to the lower driver in sequence. + + * The queue is "power locked" to ensure that the class driver power-up + work can be done before request processing resumes. + + * The power irp is sent down the stack for any filter drivers and the + port driver to return power and resume command processing for the + device. Since the queue is locked, no queued irps will be sent + immediately. + + * A start unit command is issued to the device with appropriate flags + to override the "power locked" queue. + + * The queue is "power unlocked" to start processing requests again. + + This routine uses the function in the srb which just completed to determine + which state it is in. + +Arguments: + + DeviceObject - the device object being powered up + + Irp - the IO_REQUEST_PACKET containing the power request + + Srb - the SRB used to perform port/class operations. + +Return Value: + + STATUS_MORE_PROCESSING_REQUIRED or + STATUS_SUCCESS + +--*/ +NTSTATUS +ClasspPowerUpCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PCLASS_POWER_CONTEXT Context + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + + PIO_STACK_LOCATION currentStack = IoGetCurrentIrpStackLocation(Irp); + PIO_STACK_LOCATION nextStack = IoGetNextIrpStackLocation(Irp); + + + NTSTATUS status = STATUS_MORE_PROCESSING_REQUIRED; + + DebugPrint((1, "ClasspPowerUpCompletion: Device Object %p, Irp %p, " + "Context %p\n", + DeviceObject, Irp, Context)); + + ASSERT(!TEST_FLAG(Context->Srb.SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)); + ASSERT(!TEST_FLAG(Context->Srb.SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE)); + ASSERT(Context->Options.PowerDown == FALSE); + ASSERT(Context->Options.HandleSpinUp); + + if(Irp->PendingReturned) { + IoMarkIrpPending(Irp); + } + + Context->PowerChangeState.PowerUp++; + + switch(Context->PowerChangeState.PowerUp) { + + case PowerUpDeviceLocked: { + + DebugPrint((1, "(%p)\tPreviously sent power lock\n", Irp)); + + // + // Issue the actual power request to the lower driver. + // + + IoCopyCurrentIrpStackLocationToNext(Irp); + + // + // If the lock wasn't successful then just bail out on the power + // request unless we can ignore failed locks + // + + if((Context->Options.LockQueue == TRUE) && + (!NT_SUCCESS(Irp->IoStatus.Status))) { + + DebugPrint((1, "(%p)\tIrp status was %lx\n", + Irp, Irp->IoStatus.Status)); + DebugPrint((1, "(%p)\tSrb status was %lx\n", + Irp, Context->Srb.SrbStatus)); + + // + // Lock was not successful - throw down the power IRP + // by itself and don't try to spin up the drive or unlock + // the queue. + // + + Context->InUse = FALSE; + Context = NULL; + + // + // Set the new power state + // + + fdoExtension->DevicePowerState = + currentStack->Parameters.Power.State.DeviceState; + + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + + IoCopyCurrentIrpStackLocationToNext(Irp); + + IoSetCompletionRoutine(Irp, + ClasspStartNextPowerIrpCompletion, + NULL, + TRUE, + TRUE, + TRUE); + + // + // Indicate to Po that we've been successfully powered up so + // it can do it's notification stuff. + // + + PoSetPowerState(DeviceObject, + currentStack->Parameters.Power.Type, + currentStack->Parameters.Power.State); + + PoCallDriver(commonExtension->LowerDeviceObject, Irp); + + ClassReleaseRemoveLock(commonExtension->DeviceObject, + Irp); + + return STATUS_MORE_PROCESSING_REQUIRED; + + } else { + Context->QueueLocked = (UCHAR) Context->Options.LockQueue; + } + + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + + Context->PowerChangeState.PowerUp = PowerUpDeviceLocked; + + IoSetCompletionRoutine(Irp, + ClasspPowerUpCompletion, + Context, + TRUE, + TRUE, + TRUE); + + status = PoCallDriver(commonExtension->LowerDeviceObject, Irp); + + DebugPrint((2, "(%p)\tPoCallDriver returned %lx\n", Irp, status)); + break; + } + + case PowerUpDeviceOn: { + + PCDB cdb; + + if(NT_SUCCESS(Irp->IoStatus.Status)) { + + DebugPrint((1, "(%p)\tSending start unit to device\n", Irp)); + + // + // Issue the start unit command to the device. + // + + Context->Srb.Length = sizeof(SCSI_REQUEST_BLOCK); + Context->Srb.Function = SRB_FUNCTION_EXECUTE_SCSI; + + Context->Srb.SrbStatus = Context->Srb.ScsiStatus = 0; + Context->Srb.DataTransferLength = 0; + + Context->Srb.TimeOutValue = START_UNIT_TIMEOUT; + + Context->Srb.SrbFlags = SRB_FLAGS_NO_DATA_TRANSFER | + SRB_FLAGS_DISABLE_AUTOSENSE | + SRB_FLAGS_DISABLE_SYNCH_TRANSFER | + SRB_FLAGS_NO_QUEUE_FREEZE; + + if(Context->Options.LockQueue) { + SET_FLAG(Context->Srb.SrbFlags, SRB_FLAGS_BYPASS_LOCKED_QUEUE); + } + + Context->Srb.CdbLength = 6; + + cdb = (PCDB) (Context->Srb.Cdb); + RtlZeroMemory(cdb, sizeof(CDB)); + + + cdb->START_STOP.OperationCode = SCSIOP_START_STOP_UNIT; + cdb->START_STOP.Start = 1; + + Context->PowerChangeState.PowerUp = PowerUpDeviceOn; + + IoSetCompletionRoutine(Irp, + ClasspPowerUpCompletion, + Context, + TRUE, + TRUE, + TRUE); + + nextStack->Parameters.Scsi.Srb = &(Context->Srb); + nextStack->MajorFunction = IRP_MJ_SCSI; + + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + + DebugPrint((2, "(%p)\tIoCallDriver returned %lx\n", Irp, status)); + + } else { + + // + // we're done. + // + + Context->FinalStatus = Irp->IoStatus.Status; + goto ClasspPowerUpCompletionFailure; + } + + break; + } + + case PowerUpDeviceStarted: { // 3 + + // + // First deal with an error if one occurred. + // + + if(SRB_STATUS(Context->Srb.SrbStatus) != SRB_STATUS_SUCCESS) { + + BOOLEAN retry; + + DebugPrint((1, "%p\tError occured when issuing START_UNIT " + "command to device. Srb %p, Status %x\n", + Irp, + &Context->Srb, + Context->Srb.SrbStatus)); + + ASSERT(!(TEST_FLAG(Context->Srb.SrbStatus, + SRB_STATUS_QUEUE_FROZEN))); + ASSERT(Context->Srb.Function == SRB_FUNCTION_EXECUTE_SCSI); + + Context->RetryInterval = 0; + + retry = ClassInterpretSenseInfo( + commonExtension->DeviceObject, + &Context->Srb, + IRP_MJ_SCSI, + IRP_MJ_POWER, + MAXIMUM_RETRIES - Context->RetryCount, + &status, + &Context->RetryInterval); + + if((retry == TRUE) && (Context->RetryCount-- != 0)) { + + DebugPrint((1, "(%p)\tRetrying failed request\n", Irp)); + + // + // Decrement the state so we come back through here the + // next time. + // + + Context->PowerChangeState.PowerUp--; + + RetryPowerRequest(commonExtension->DeviceObject, + Irp, + Context); + + break; + + } + + // reset retries + Context->RetryCount = MAXIMUM_RETRIES; + + } + +ClasspPowerUpCompletionFailure: + + DebugPrint((1, "(%p)\tPreviously spun device up\n", Irp)); + + if (Context->QueueLocked) { + DebugPrint((1, "(%p)\tUnlocking queue\n", Irp)); + + Context->Srb.Function = SRB_FUNCTION_UNLOCK_QUEUE; + Context->Srb.SrbFlags = SRB_FLAGS_BYPASS_LOCKED_QUEUE; + Context->Srb.SrbStatus = Context->Srb.ScsiStatus = 0; + Context->Srb.DataTransferLength = 0; + + nextStack->Parameters.Scsi.Srb = &(Context->Srb); + nextStack->MajorFunction = IRP_MJ_SCSI; + + Context->PowerChangeState.PowerUp = PowerUpDeviceStarted; + + IoSetCompletionRoutine(Irp, + ClasspPowerUpCompletion, + Context, + TRUE, + TRUE, + TRUE); + + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + DebugPrint((1, "(%p)\tIoCallDriver returned %lx\n", + Irp, status)); + break; + } + + // Fall-through to next case... + + } + + case PowerUpDeviceUnlocked: { + + // + // This is the end of the dance. Free the srb and complete the + // request finally. We're ignoring possible intermediate + // error conditions .... + // + + if (Context->QueueLocked) { + DebugPrint((1, "(%p)\tPreviously unlocked queue\n", Irp)); + ASSERT(NT_SUCCESS(Irp->IoStatus.Status)); + ASSERT(Context->Srb.SrbStatus == SRB_STATUS_SUCCESS); + } else { + DebugPrint((1, "(%p)\tFall-through (queue not locked)\n", Irp)); + } + + DebugPrint((1, "(%p)\tFreeing srb and completing\n", Irp)); + Context->InUse = FALSE; + + status = Context->FinalStatus; + Irp->IoStatus.Status = status; + + Context = NULL; + + // + // Set the new power state + // + + if(NT_SUCCESS(status)) { + fdoExtension->DevicePowerState = + currentStack->Parameters.Power.State.DeviceState; + } + + // + // Indicate to Po that we've been successfully powered up so + // it can do it's notification stuff. + // + + PoSetPowerState(DeviceObject, + currentStack->Parameters.Power.Type, + currentStack->Parameters.Power.State); + + DebugPrint((1, "(%p)\tStarting next power irp\n", Irp)); + ClassReleaseRemoveLock(DeviceObject, Irp); + PoStartNextPowerIrp(Irp); + + return status; + } + } + + return STATUS_MORE_PROCESSING_REQUIRED; +} // end ClasspPowerUpCompletion() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspPowerDownCompletion() + +Routine Description: + + This routine is used for intermediate completion of a power up request. + PowerUp requires four requests to be sent to the lower driver in sequence. + + * The queue is "power locked" to ensure that the class driver power-up + work can be done before request processing resumes. + + * The power irp is sent down the stack for any filter drivers and the + port driver to return power and resume command processing for the + device. Since the queue is locked, no queued irps will be sent + immediately. + + * A start unit command is issued to the device with appropriate flags + to override the "power locked" queue. + + * The queue is "power unlocked" to start processing requests again. + + This routine uses the function in the srb which just completed to determine + which state it is in. + +Arguments: + + DeviceObject - the device object being powered up + + Irp - the IO_REQUEST_PACKET containing the power request + + Srb - the SRB used to perform port/class operations. + +Return Value: + + STATUS_MORE_PROCESSING_REQUIRED or + STATUS_SUCCESS + +--*/ +NTSTATUS +ClasspPowerDownCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PCLASS_POWER_CONTEXT Context + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + + PIO_STACK_LOCATION currentStack = IoGetCurrentIrpStackLocation(Irp); + PIO_STACK_LOCATION nextStack = IoGetNextIrpStackLocation(Irp); + + NTSTATUS status = STATUS_MORE_PROCESSING_REQUIRED; + + DebugPrint((1, "ClasspPowerDownCompletion: Device Object %p, " + "Irp %p, Context %p\n", + DeviceObject, Irp, Context)); + + ASSERT(!TEST_FLAG(Context->Srb.SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)); + ASSERT(!TEST_FLAG(Context->Srb.SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE)); + ASSERT(Context->Options.PowerDown == TRUE); + ASSERT(Context->Options.HandleSpinDown); + + if(Irp->PendingReturned) { + IoMarkIrpPending(Irp); + } + + Context->PowerChangeState.PowerDown2++; + + switch(Context->PowerChangeState.PowerDown2) { + + case PowerDownDeviceLocked2: { + + PCDB cdb; + + DebugPrint((1, "(%p)\tPreviously sent power lock\n", Irp)); + + if((Context->Options.LockQueue == TRUE) && + (!NT_SUCCESS(Irp->IoStatus.Status))) { + + DebugPrint((1, "(%p)\tIrp status was %lx\n", + Irp, + Irp->IoStatus.Status)); + DebugPrint((1, "(%p)\tSrb status was %lx\n", + Irp, + Context->Srb.SrbStatus)); + + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + + // + // Lock was not successful - throw down the power IRP + // by itself and don't try to spin down the drive or unlock + // the queue. + // + + Context->InUse = FALSE; + Context = NULL; + + // + // Set the new power state + // + + fdoExtension->DevicePowerState = + currentStack->Parameters.Power.State.DeviceState; + + // + // Indicate to Po that we've been successfully powered down + // so it can do it's notification stuff. + // + + IoCopyCurrentIrpStackLocationToNext(Irp); + IoSetCompletionRoutine(Irp, + ClasspStartNextPowerIrpCompletion, + NULL, + TRUE, + TRUE, + TRUE); + + PoSetPowerState(DeviceObject, + currentStack->Parameters.Power.Type, + currentStack->Parameters.Power.State); + + fdoExtension->PowerDownInProgress = FALSE; + + PoCallDriver(commonExtension->LowerDeviceObject, Irp); + + ClassReleaseRemoveLock(commonExtension->DeviceObject, + Irp); + + return STATUS_MORE_PROCESSING_REQUIRED; + + } else { + Context->QueueLocked = (UCHAR) Context->Options.LockQueue; + } + + if (!TEST_FLAG(fdoExtension->PrivateFdoData->HackFlags, + FDO_HACK_NO_SYNC_CACHE)) { + + // + // send SCSIOP_SYNCHRONIZE_CACHE + // + + Context->Srb.Length = sizeof(SCSI_REQUEST_BLOCK); + Context->Srb.Function = SRB_FUNCTION_EXECUTE_SCSI; + + Context->Srb.TimeOutValue = fdoExtension->TimeOutValue; + + Context->Srb.SrbFlags = SRB_FLAGS_NO_DATA_TRANSFER | + SRB_FLAGS_DISABLE_AUTOSENSE | + SRB_FLAGS_DISABLE_SYNCH_TRANSFER | + SRB_FLAGS_NO_QUEUE_FREEZE | + SRB_FLAGS_BYPASS_LOCKED_QUEUE; + + Context->Srb.SrbStatus = Context->Srb.ScsiStatus = 0; + Context->Srb.DataTransferLength = 0; + + Context->Srb.CdbLength = 10; + + cdb = (PCDB) Context->Srb.Cdb; + + RtlZeroMemory(cdb, sizeof(CDB)); + cdb->SYNCHRONIZE_CACHE10.OperationCode = SCSIOP_SYNCHRONIZE_CACHE; + + IoSetCompletionRoutine(Irp, + ClasspPowerDownCompletion, + Context, + TRUE, + TRUE, + TRUE); + + nextStack->Parameters.Scsi.Srb = &(Context->Srb); + nextStack->MajorFunction = IRP_MJ_SCSI; + + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + + DebugPrint((1, "(%p)\tIoCallDriver returned %lx\n", Irp, status)); + break; + + } else { + + DebugPrint((1, "(%p)\tPower Down: not sending SYNCH_CACHE\n", + DeviceObject)); + Context->PowerChangeState.PowerDown2++; + Context->Srb.SrbStatus = SRB_STATUS_SUCCESS; + // and fall through.... + } + // no break in case the device doesn't like synch_cache commands + + } + + case PowerDownDeviceFlushed2: { + + PCDB cdb; + + DebugPrint((1, "(%p)\tPreviously send SCSIOP_SYNCHRONIZE_CACHE\n", + Irp)); + + // + // SCSIOP_SYNCHRONIZE_CACHE was sent + // + + if(SRB_STATUS(Context->Srb.SrbStatus) != SRB_STATUS_SUCCESS) { + + BOOLEAN retry; + + DebugPrint((1, "(%p)\tError occured when issuing " + "SYNCHRONIZE_CACHE command to device. " + "Srb %p, Status %lx\n", + Irp, + &Context->Srb, + Context->Srb.SrbStatus)); + + ASSERT(!(TEST_FLAG(Context->Srb.SrbStatus, + SRB_STATUS_QUEUE_FROZEN))); + ASSERT(Context->Srb.Function == SRB_FUNCTION_EXECUTE_SCSI); + + Context->RetryInterval = 0; + retry = ClassInterpretSenseInfo( + commonExtension->DeviceObject, + &Context->Srb, + IRP_MJ_SCSI, + IRP_MJ_POWER, + MAXIMUM_RETRIES - Context->RetryCount, + &status, + &Context->RetryInterval); + + if((retry == TRUE) && (Context->RetryCount-- != 0)) { + + DebugPrint((1, "(%p)\tRetrying failed request\n", Irp)); + + // + // decrement the state so we come back through here + // the next time. + // + + Context->PowerChangeState.PowerDown2--; + RetryPowerRequest(commonExtension->DeviceObject, + Irp, + Context); + break; + } + + DebugPrint((1, "(%p)\tSYNCHRONIZE_CACHE not retried\n", Irp)); + Context->RetryCount = MAXIMUM_RETRIES; + + } // end !SRB_STATUS_SUCCESS + + // + // note: we are purposefully ignoring any errors. if the drive + // doesn't support a synch_cache, then we're up a creek + // anyways. + // + + DebugPrint((1, "(%p)\tSending stop unit to device\n", Irp)); + + // + // Issue the start unit command to the device. + // + + Context->Srb.Length = sizeof(SCSI_REQUEST_BLOCK); + Context->Srb.Function = SRB_FUNCTION_EXECUTE_SCSI; + + Context->Srb.TimeOutValue = START_UNIT_TIMEOUT; + + Context->Srb.SrbFlags = SRB_FLAGS_NO_DATA_TRANSFER | + SRB_FLAGS_DISABLE_AUTOSENSE | + SRB_FLAGS_DISABLE_SYNCH_TRANSFER | + SRB_FLAGS_NO_QUEUE_FREEZE | + SRB_FLAGS_BYPASS_LOCKED_QUEUE; + + Context->Srb.SrbStatus = Context->Srb.ScsiStatus = 0; + Context->Srb.DataTransferLength = 0; + + Context->Srb.CdbLength = 6; + + cdb = (PCDB) Context->Srb.Cdb; + RtlZeroMemory(cdb, sizeof(CDB)); + + cdb->START_STOP.OperationCode = SCSIOP_START_STOP_UNIT; + cdb->START_STOP.Start = 0; + cdb->START_STOP.Immediate = 1; + + IoSetCompletionRoutine(Irp, + ClasspPowerDownCompletion, + Context, + TRUE, + TRUE, + TRUE); + + nextStack->Parameters.Scsi.Srb = &(Context->Srb); + nextStack->MajorFunction = IRP_MJ_SCSI; + + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + + DebugPrint((1, "(%p)\tIoCallDriver returned %lx\n", Irp, status)); + break; + + } + + case PowerDownDeviceStopped2: { + + BOOLEAN ignoreError = TRUE; + + // + // stop was sent + // + + if(SRB_STATUS(Context->Srb.SrbStatus) != SRB_STATUS_SUCCESS) { + + BOOLEAN retry; + + DebugPrint((1, "(%p)\tError occured when issueing STOP_UNIT " + "command to device. Srb %p, Status %lx\n", + Irp, + &Context->Srb, + Context->Srb.SrbStatus)); + + ASSERT(!(TEST_FLAG(Context->Srb.SrbStatus, + SRB_STATUS_QUEUE_FROZEN))); + ASSERT(Context->Srb.Function == SRB_FUNCTION_EXECUTE_SCSI); + + Context->RetryInterval = 0; + retry = ClassInterpretSenseInfo( + commonExtension->DeviceObject, + &Context->Srb, + IRP_MJ_SCSI, + IRP_MJ_POWER, + MAXIMUM_RETRIES - Context->RetryCount, + &status, + &Context->RetryInterval); + + if((retry == TRUE) && (Context->RetryCount-- != 0)) { + + DebugPrint((1, "(%p)\tRetrying failed request\n", Irp)); + + // + // decrement the state so we come back through here + // the next time. + // + + Context->PowerChangeState.PowerDown2--; + RetryPowerRequest(commonExtension->DeviceObject, + Irp, + Context); + break; + } + + DebugPrint((1, "(%p)\tSTOP_UNIT not retried\n", Irp)); + Context->RetryCount = MAXIMUM_RETRIES; + + } // end !SRB_STATUS_SUCCESS + + + DebugPrint((1, "(%p)\tPreviously sent stop unit\n", Irp)); + + // + // some operations, such as a physical format in progress, + // should not be ignored and should fail the power operation. + // + + if (!NT_SUCCESS(status)) { + + PSENSE_DATA senseBuffer = Context->Srb.SenseInfoBuffer; + + if (TEST_FLAG(Context->Srb.SrbStatus, + SRB_STATUS_AUTOSENSE_VALID) && + ((senseBuffer->SenseKey & 0xf) == SCSI_SENSE_NOT_READY) && + (senseBuffer->AdditionalSenseCode == SCSI_ADSENSE_LUN_NOT_READY) && + (senseBuffer->AdditionalSenseCodeQualifier == SCSI_SENSEQ_FORMAT_IN_PROGRESS) + ) { + ignoreError = FALSE; + Context->FinalStatus = STATUS_DEVICE_BUSY; + status = Context->FinalStatus; + } + + } + + if (NT_SUCCESS(status) || ignoreError) { + + // + // Issue the actual power request to the lower driver. + // + + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + + IoCopyCurrentIrpStackLocationToNext(Irp); + + IoSetCompletionRoutine(Irp, + ClasspPowerDownCompletion, + Context, + TRUE, + TRUE, + TRUE); + + status = PoCallDriver(commonExtension->LowerDeviceObject, Irp); + + DebugPrint((1, "(%p)\tPoCallDriver returned %lx\n", Irp, status)); + break; + } + + // else fall through w/o sending the power irp, since the device + // is reporting an error that would be "really bad" to power down + // during. + + } + + case PowerDownDeviceOff2: { + + // + // SpinDown request completed ... whether it succeeded or not is + // another matter entirely. + // + + DebugPrint((1, "(%p)\tPreviously sent power irp\n", Irp)); + + if (Context->QueueLocked) { + + DebugPrint((1, "(%p)\tUnlocking queue\n", Irp)); + + Context->Srb.Length = sizeof(SCSI_REQUEST_BLOCK); + + Context->Srb.SrbStatus = Context->Srb.ScsiStatus = 0; + Context->Srb.DataTransferLength = 0; + + Context->Srb.Function = SRB_FUNCTION_UNLOCK_QUEUE; + Context->Srb.SrbFlags = SRB_FLAGS_BYPASS_LOCKED_QUEUE; + nextStack->Parameters.Scsi.Srb = &(Context->Srb); + nextStack->MajorFunction = IRP_MJ_SCSI; + + IoSetCompletionRoutine(Irp, + ClasspPowerDownCompletion, + Context, + TRUE, + TRUE, + TRUE); + + status = IoCallDriver(commonExtension->LowerDeviceObject, Irp); + DebugPrint((1, "(%p)\tIoCallDriver returned %lx\n", + Irp, + status)); + break; + } + + } + + case PowerDownDeviceUnlocked2: { + + // + // This is the end of the dance. Free the srb and complete the + // request finally. We're ignoring possible intermediate + // error conditions .... + // + + if (Context->QueueLocked == FALSE) { + DebugPrint((1, "(%p)\tFall through (queue not locked)\n", Irp)); + } else { + DebugPrint((1, "(%p)\tPreviously unlocked queue\n", Irp)); + ASSERT(NT_SUCCESS(Irp->IoStatus.Status)); + ASSERT(Context->Srb.SrbStatus == SRB_STATUS_SUCCESS); + } + + DebugPrint((1, "(%p)\tFreeing srb and completing\n", Irp)); + Context->InUse = FALSE; + status = Context->FinalStatus; // allow failure to propogate + Context = NULL; + + if(Irp->PendingReturned) { + IoMarkIrpPending(Irp); + } + + Irp->IoStatus.Status = status; + Irp->IoStatus.Information = 0; + + if (NT_SUCCESS(status)) { + + // + // Set the new power state + // + + fdoExtension->DevicePowerState = + currentStack->Parameters.Power.State.DeviceState; + + } + + + DebugPrint((1, "(%p)\tStarting next power irp\n", Irp)); + + ClassReleaseRemoveLock(DeviceObject, Irp); + PoStartNextPowerIrp(Irp); + fdoExtension->PowerDownInProgress = FALSE; + + return status; + } + } + + return STATUS_MORE_PROCESSING_REQUIRED; +} // end ClasspPowerDownCompletion() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspPowerHandler() + +Routine Description: + + This routine reduces the number of useless spinups and spindown requests + sent to a given device by ignoring transitions to power states we are + currently in. + + ISSUE-2000/02/20-henrygab - by ignoring spin-up requests, we may be + allowing the drive + +Arguments: + + DeviceObject - the device object which is transitioning power states + Irp - the power irp + Options - a set of flags indicating what the device handles + +Return Value: + +--*/ +NTSTATUS +ClasspPowerHandler( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN CLASS_POWER_OPTIONS Options // ISSUE-2000/02/20-henrygab - pass pointer, not whole struct + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PDEVICE_OBJECT lowerDevice = commonExtension->LowerDeviceObject; + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + PIO_STACK_LOCATION nextIrpStack; + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PCLASS_POWER_CONTEXT context; + + if (!commonExtension->IsFdo) { + + // + // certain assumptions are made here, + // particularly: having the fdoExtension + // + + DebugPrint((0, "ClasspPowerHandler: Called for PDO %p???\n", + DeviceObject)); + ASSERT(!"PDO using ClasspPowerHandler"); + return STATUS_NOT_SUPPORTED; + } + + DebugPrint((1, "ClasspPowerHandler: Power irp %p to %s %p\n", + Irp, (commonExtension->IsFdo ? "fdo" : "pdo"), DeviceObject)); + + switch(irpStack->MinorFunction) { + + case IRP_MN_SET_POWER: { + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExtension->PrivateFdoData; + + DebugPrint((1, "(%p)\tIRP_MN_SET_POWER\n", Irp)); + + DebugPrint((1, "(%p)\tSetting %s state to %d\n", + Irp, + (irpStack->Parameters.Power.Type == SystemPowerState ? + "System" : "Device"), + irpStack->Parameters.Power.State.SystemState)); + + switch (irpStack->Parameters.Power.ShutdownType){ + + case PowerActionSleep: + case PowerActionHibernate: + if (fdoData->HotplugInfo.MediaRemovable || fdoData->HotplugInfo.MediaHotplug){ + /* + * We are suspending and this drive is either hot-pluggable + * or contains removeable media. + * Set the media dirty bit, since the media may change while + * we are suspended. + */ + SET_FLAG(DeviceObject->Flags, DO_VERIFY_VOLUME); + } + break; + } + + break; + } + + default: { + + DebugPrint((1, "(%p)\tIrp minor code = %#x\n", + Irp, irpStack->MinorFunction)); + break; + } + } + + if (irpStack->Parameters.Power.Type != DevicePowerState || + irpStack->MinorFunction != IRP_MN_SET_POWER) { + + DebugPrint((1, "(%p)\tSending to lower device\n", Irp)); + + goto ClasspPowerHandlerCleanup; + + } + + nextIrpStack = IoGetNextIrpStackLocation(Irp); + + // + // already in exact same state, don't work to transition to it. + // + + if(irpStack->Parameters.Power.State.DeviceState == + fdoExtension->DevicePowerState) { + + DebugPrint((1, "(%p)\tAlready in device state %x\n", + Irp, fdoExtension->DevicePowerState)); + goto ClasspPowerHandlerCleanup; + + } + + // + // or powering down from non-d0 state (device already stopped) + // NOTE -- we're not sure whether this case can exist or not (the + // power system may never send this sort of request) but it's trivial + // to deal with. + // + + if ((irpStack->Parameters.Power.State.DeviceState != PowerDeviceD0) && + (fdoExtension->DevicePowerState != PowerDeviceD0)) { + DebugPrint((1, "(%p)\tAlready powered down to %x???\n", + Irp, fdoExtension->DevicePowerState)); + fdoExtension->DevicePowerState = + irpStack->Parameters.Power.State.DeviceState; + goto ClasspPowerHandlerCleanup; + } + + // + // or going into a hibernation state when we're in the hibernation path. + // If the device is spinning then we should leave it spinning - if it's not + // then the dump driver will start it up for us. + // + + if((irpStack->Parameters.Power.State.DeviceState == PowerDeviceD3) && + (irpStack->Parameters.Power.ShutdownType == PowerActionHibernate) && + (commonExtension->HibernationPathCount != 0)) { + + DebugPrint((1, "(%p)\tdoing nothing for hibernation request for " + "state %x???\n", + Irp, fdoExtension->DevicePowerState)); + fdoExtension->DevicePowerState = + irpStack->Parameters.Power.State.DeviceState; + goto ClasspPowerHandlerCleanup; + } + // + // or when not handling powering up and are powering up + // + + if ((!Options.HandleSpinUp) && + (irpStack->Parameters.Power.State.DeviceState == PowerDeviceD0)) { + + DebugPrint((2, "(%p)\tNot handling spinup to state %x\n", + Irp, fdoExtension->DevicePowerState)); + fdoExtension->DevicePowerState = + irpStack->Parameters.Power.State.DeviceState; + goto ClasspPowerHandlerCleanup; + + } + + // + // or when not handling powering down and are powering down + // + + if ((!Options.HandleSpinDown) && + (irpStack->Parameters.Power.State.DeviceState != PowerDeviceD0)) { + + DebugPrint((2, "(%p)\tNot handling spindown to state %x\n", + Irp, fdoExtension->DevicePowerState)); + fdoExtension->DevicePowerState = + irpStack->Parameters.Power.State.DeviceState; + goto ClasspPowerHandlerCleanup; + + } + + context = &(fdoExtension->PowerContext); + +#if DBG + // + // Mark the context as in use. We should be synchronizing this but + // since it's just for debugging purposes we don't worry too much. + // + + ASSERT(context->InUse == FALSE); +#endif + + RtlZeroMemory(context, sizeof(CLASS_POWER_CONTEXT)); + context->InUse = TRUE; + + nextIrpStack->Parameters.Scsi.Srb = &(context->Srb); + nextIrpStack->MajorFunction = IRP_MJ_SCSI; + + context->FinalStatus = STATUS_SUCCESS; + + context->Srb.Length = sizeof(SCSI_REQUEST_BLOCK); + context->Srb.OriginalRequest = Irp; + context->Srb.SrbFlags |= SRB_FLAGS_BYPASS_LOCKED_QUEUE + | SRB_FLAGS_NO_QUEUE_FREEZE; + context->Srb.Function = SRB_FUNCTION_LOCK_QUEUE; + + context->Srb.SenseInfoBuffer = + commonExtension->PartitionZeroExtension->SenseData; + context->Srb.SenseInfoBufferLength = SENSE_BUFFER_SIZE; + context->RetryCount = MAXIMUM_RETRIES; + + context->Options = Options; + context->DeviceObject = DeviceObject; + context->Irp = Irp; + + if(irpStack->Parameters.Power.State.DeviceState == PowerDeviceD0) { + + ASSERT(Options.HandleSpinUp); + + DebugPrint((2, "(%p)\tpower up - locking queue\n", Irp)); + + // + // We need to issue a queue lock request so that we + // can spin the drive back up after the power is restored + // but before any requests are processed. + // + + context->Options.PowerDown = FALSE; + context->PowerChangeState.PowerUp = PowerUpDeviceInitial; + context->CompletionRoutine = ClasspPowerUpCompletion; + + } else { + + ASSERT(Options.HandleSpinDown); + + fdoExtension->PowerDownInProgress = TRUE; + + DebugPrint((2, "(%p)\tPowering down - locking queue\n", Irp)); + + PoSetPowerState(DeviceObject, + irpStack->Parameters.Power.Type, + irpStack->Parameters.Power.State); + + context->Options.PowerDown = TRUE; + context->PowerChangeState.PowerDown2 = PowerDownDeviceInitial2; + context->CompletionRoutine = ClasspPowerDownCompletion; + + } + + // + // we are not dealing with port-allocated sense in these routines. + // + + ASSERT(!TEST_FLAG(context->Srb.SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)); + ASSERT(!TEST_FLAG(context->Srb.SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE)); + + // + // we are always returning STATUS_PENDING, so we need to always + // set the irp as pending. + // + + IoMarkIrpPending(Irp); + + if(Options.LockQueue) { + + // + // Send the lock irp down. + // + + IoSetCompletionRoutine(Irp, + context->CompletionRoutine, + context, + TRUE, + TRUE, + TRUE); + + IoCallDriver(lowerDevice, Irp); + + } else { + + // + // Call the completion routine directly. It won't care what the + // status of the "lock" was - it will just go and do the next + // step of the operation. + // + + context->CompletionRoutine(DeviceObject, Irp, context); + } + + return STATUS_PENDING; + +ClasspPowerHandlerCleanup: + + ClassReleaseRemoveLock(DeviceObject, Irp); + + DebugPrint((1, "(%p)\tStarting next power irp\n", Irp)); + IoCopyCurrentIrpStackLocationToNext(Irp); + IoSetCompletionRoutine(Irp, + ClasspStartNextPowerIrpCompletion, + NULL, + TRUE, + TRUE, + TRUE); + return PoCallDriver(lowerDevice, Irp); +} // end ClasspPowerHandler() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassMinimalPowerHandler() + +Routine Description: + + This routine is the minimum power handler for a storage driver. It does + the least amount of work possible. + +--*/ +NTSTATUS +ClassMinimalPowerHandler( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); + NTSTATUS status; + + ClassReleaseRemoveLock(DeviceObject, Irp); + PoStartNextPowerIrp(Irp); + + if(commonExtension->IsFdo) { + + if (DeviceObject->Characteristics & FILE_REMOVABLE_MEDIA) { + + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = + DeviceObject->DeviceExtension; + + // + // Check if the system is going to hibernate or standby. + // + if (irpStack->MinorFunction == IRP_MN_SET_POWER){ + PVPB vpb; + + switch (irpStack->Parameters.Power.ShutdownType){ + + case PowerActionSleep: + case PowerActionHibernate: + // + // If the volume is mounted, set the verify bit so that + // the filesystem will be forced re-read the media + // after coming out of hibernation or standby. + // + vpb = ClassGetVpb(fdoExtension->DeviceObject); + if (vpb && (vpb->Flags & VPB_MOUNTED)){ + SET_FLAG(fdoExtension->DeviceObject->Flags, DO_VERIFY_VOLUME); + } + break; + } + } + } + + IoCopyCurrentIrpStackLocationToNext(Irp); + return PoCallDriver(commonExtension->LowerDeviceObject, Irp); + + } else { + + if (irpStack->MinorFunction != IRP_MN_SET_POWER && + irpStack->MinorFunction != IRP_MN_QUERY_POWER) { + + NOTHING; + + } else { + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + } + status = Irp->IoStatus.Status; + + ClassCompleteRequest(DeviceObject, Irp, IO_NO_INCREMENT); + return status; + } +} // end ClassMinimalPowerHandler() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassSpinDownPowerHandler() + +Routine Description: + + This routine is a callback for disks and other things which require both + a start and a stop to be sent to the device. (actually the starts are + almost always optional, since most device power themselves on to process + commands, but i digress). + + Determines proper use of spinup, spindown, and queue locking based upon + ScanForSpecialFlags in the FdoExtension. This is the most common power + handler passed into classpnp.sys + +Arguments: + + DeviceObject - Supplies the functional device object + + Irp - Supplies the request to be retried. + +Return Value: + + None + +--*/ +NTSTATUS +ClassSpinDownPowerHandler( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + CLASS_POWER_OPTIONS options; + + fdoExtension = (PFUNCTIONAL_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + // + // this will set all options to FALSE + // + + RtlZeroMemory(&options, sizeof(CLASS_POWER_OPTIONS)); + + // + // check the flags to see what options we need to worry about + // + + if (!TEST_FLAG(fdoExtension->ScanForSpecialFlags, + CLASS_SPECIAL_DISABLE_SPIN_DOWN)) { + options.HandleSpinDown = TRUE; + } + + if (!TEST_FLAG(fdoExtension->ScanForSpecialFlags, + CLASS_SPECIAL_DISABLE_SPIN_UP)) { + options.HandleSpinUp = TRUE; + } + + if (!TEST_FLAG(fdoExtension->ScanForSpecialFlags, + CLASS_SPECIAL_NO_QUEUE_LOCK)) { + options.LockQueue = TRUE; + } + + DebugPrint((3, "ClasspPowerHandler: Devobj %p\n" + "\t%shandling spin down\n" + "\t%shandling spin up\n" + "\t%slocking queue\n", + DeviceObject, + (options.HandleSpinDown ? "" : "not "), + (options.HandleSpinUp ? "" : "not "), + (options.LockQueue ? "" : "not ") + )); + + // + // do all the dirty work + // + + return ClasspPowerHandler(DeviceObject, Irp, options); +} // end ClassSpinDownPowerHandler() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClassStopUnitPowerHandler() + +Routine Description: + + This routine is an outdated call. To achieve equivalent functionality, + the driver should set the following flags in ScanForSpecialFlags in the + FdoExtension: + + CLASS_SPECIAL_DISABLE_SPIN_UP + CLASS_SPECIAL_NO_QUEUE_LOCK + +--*/ +NTSTATUS +ClassStopUnitPowerHandler( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension; + + DebugPrint((0, "ClassStopUnitPowerHandler - Devobj %p using outdated call\n" + "Drivers should set the following flags in ScanForSpecialFlags " + " in the FDO extension:\n" + "\tCLASS_SPECIAL_DISABLE_SPIN_UP\n" + "\tCLASS_SPECIAL_NO_QUEUE_LOCK\n" + "This will provide equivalent functionality if the power " + "routine is then set to ClassSpinDownPowerHandler\n\n", + DeviceObject)); + + fdoExtension = (PFUNCTIONAL_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + SET_FLAG(fdoExtension->ScanForSpecialFlags, + CLASS_SPECIAL_DISABLE_SPIN_UP); + SET_FLAG(fdoExtension->ScanForSpecialFlags, + CLASS_SPECIAL_NO_QUEUE_LOCK); + + return ClassSpinDownPowerHandler(DeviceObject, Irp); +} // end ClassStopUnitPowerHandler() + +/*++//////////////////////////////////////////////////////////////////////////// + +RetryPowerRequest() + +Routine Description: + + This routine reinitalizes the necessary fields, and sends the request + to the lower driver. + +Arguments: + + DeviceObject - Supplies the device object associated with this request. + + Irp - Supplies the request to be retried. + + Context - Supplies a pointer to the power up context for this request. + +Return Value: + + None + +--*/ +VOID +RetryPowerRequest( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PCLASS_POWER_CONTEXT Context + ) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = DeviceObject->DeviceExtension; + PCOMMON_DEVICE_EXTENSION commonExtension = DeviceObject->DeviceExtension; + PIO_STACK_LOCATION nextIrpStack = IoGetNextIrpStackLocation(Irp); + PSCSI_REQUEST_BLOCK srb = &(Context->Srb); + LARGE_INTEGER dueTime; + + DebugPrint((1, "(%p)\tDelaying retry by queueing DPC\n", Irp)); + + ASSERT(Context->Irp == Irp); + ASSERT(Context->DeviceObject == DeviceObject); + ASSERT(!TEST_FLAG(Context->Srb.SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)); + ASSERT(!TEST_FLAG(Context->Srb.SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE)); + + // + // reset the retry interval + // + + Context->RetryInterval = 0; + + // + // Reset byte count of transfer in SRB Extension. + // + + srb->DataTransferLength = 0; + + // + // Zero SRB statuses. + // + + srb->SrbStatus = srb->ScsiStatus = 0; + + // + // Set up major SCSI function. + // + + nextIrpStack->MajorFunction = IRP_MJ_SCSI; + + // + // Save SRB address in next stack for port driver. + // + + nextIrpStack->Parameters.Scsi.Srb = srb; + + // + // Set the completion routine up again. + // + + IoSetCompletionRoutine(Irp, Context->CompletionRoutine, Context, + TRUE, TRUE, TRUE); + + + if (Context->RetryInterval == 0) { + + DebugPrint((2, "(%p)\tDelaying minimum time (.2 sec)\n", Irp)); + dueTime.QuadPart = (LONGLONG)1000000 * 2; + + } else { + + DebugPrint((2, "(%p)\tDelaying %x seconds\n", + Irp, Context->RetryInterval)); + dueTime.QuadPart = (LONGLONG)1000000 * 10 * Context->RetryInterval; + + } + + ClassRetryRequest(DeviceObject, Irp, dueTime); + + return; + +} // end RetryRequest() + +/*++//////////////////////////////////////////////////////////////////////////// + +ClasspStartNextPowerIrpCompletion() + +Routine Description: + + This routine guarantees that the next power irp (power up or down) is not + sent until the previous one has fully completed. + +--*/ +NTSTATUS +ClasspStartNextPowerIrpCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ) +{ + if(Irp->PendingReturned) { + IoMarkIrpPending(Irp); + } + + PoStartNextPowerIrp(Irp); + return STATUS_SUCCESS; +} // end ClasspStartNextPowerIrpCompletion() + diff --git a/drivers/storage/classpnp/retry.c b/drivers/storage/classpnp/retry.c new file mode 100644 index 00000000000..3a88e647582 --- /dev/null +++ b/drivers/storage/classpnp/retry.c @@ -0,0 +1,349 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + retry.c + +Abstract: + + Packet retry routines for CLASSPNP + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + +#include "classp.h" +#include "debug.h" + + + +/* + * InterpretTransferPacketError + * + * Interpret the SRB error into a meaningful IRP status. + * ClassInterpretSenseInfo also may modify the SRB for the retry. + * + * Return TRUE iff packet should be retried. + */ +BOOLEAN InterpretTransferPacketError(PTRANSFER_PACKET Pkt) +{ + BOOLEAN shouldRetry = FALSE; + PCDB pCdb = (PCDB)Pkt->Srb.Cdb; + + /* + * Interpret the error using the returned sense info first. + */ + Pkt->RetryIntervalSec = 0; + if (pCdb->MEDIA_REMOVAL.OperationCode == SCSIOP_MEDIUM_REMOVAL){ + /* + * This is an Ejection Control SRB. Interpret its sense info specially. + */ + shouldRetry = ClassInterpretSenseInfo( + Pkt->Fdo, + &Pkt->Srb, + IRP_MJ_SCSI, + 0, + MAXIMUM_RETRIES - Pkt->NumRetries, + &Pkt->Irp->IoStatus.Status, + &Pkt->RetryIntervalSec); + if (shouldRetry){ + /* + * If the device is not ready, wait at least 2 seconds before retrying. + */ + PSENSE_DATA senseInfoBuffer = Pkt->Srb.SenseInfoBuffer; + ASSERT(senseInfoBuffer); + if (((Pkt->Irp->IoStatus.Status == STATUS_DEVICE_NOT_READY) && + (senseInfoBuffer->AdditionalSenseCode == SCSI_ADSENSE_LUN_NOT_READY)) || + (SRB_STATUS(Pkt->Srb.SrbStatus) == SRB_STATUS_SELECTION_TIMEOUT)){ + + Pkt->RetryIntervalSec = MAX(Pkt->RetryIntervalSec, 2); + } + } + } + else if ((pCdb->MODE_SENSE.OperationCode == SCSIOP_MODE_SENSE) || + (pCdb->MODE_SENSE.OperationCode == SCSIOP_MODE_SENSE10)){ + /* + * This is an Mode Sense SRB. Interpret its sense info specially. + */ + shouldRetry = ClassInterpretSenseInfo( + Pkt->Fdo, + &Pkt->Srb, + IRP_MJ_SCSI, + 0, + MAXIMUM_RETRIES - Pkt->NumRetries, + &Pkt->Irp->IoStatus.Status, + &Pkt->RetryIntervalSec); + if (shouldRetry){ + /* + * If the device is not ready, wait at least 2 seconds before retrying. + */ + PSENSE_DATA senseInfoBuffer = Pkt->Srb.SenseInfoBuffer; + ASSERT(senseInfoBuffer); + if (((Pkt->Irp->IoStatus.Status == STATUS_DEVICE_NOT_READY) && + (senseInfoBuffer->AdditionalSenseCode == SCSI_ADSENSE_LUN_NOT_READY)) || + (SRB_STATUS(Pkt->Srb.SrbStatus) == SRB_STATUS_SELECTION_TIMEOUT)){ + + Pkt->RetryIntervalSec = MAX(Pkt->RetryIntervalSec, 2); + } + } + + /* + * Some special cases for mode sense. + */ + if (Pkt->Irp->IoStatus.Status == STATUS_VERIFY_REQUIRED){ + shouldRetry = TRUE; + } + else if (SRB_STATUS(Pkt->Srb.SrbStatus) == SRB_STATUS_DATA_OVERRUN){ + /* + * This is a HACK. + * Atapi returns SRB_STATUS_DATA_OVERRUN when it really means + * underrun (i.e. success, and the buffer is longer than needed). + * So treat this as a success. + */ + Pkt->Irp->IoStatus.Status = STATUS_SUCCESS; + InterlockedExchangeAdd((PLONG)&Pkt->OriginalIrp->IoStatus.Information, (LONG)Pkt->Srb.DataTransferLength); + shouldRetry = FALSE; + } + } + else if (pCdb->CDB10.OperationCode == SCSIOP_READ_CAPACITY){ + /* + * This is a Drive Capacity SRB. Interpret its sense info specially. + */ + shouldRetry = ClassInterpretSenseInfo( + Pkt->Fdo, + &Pkt->Srb, + IRP_MJ_SCSI, + 0, + MAXIMUM_RETRIES - Pkt->NumRetries, + &Pkt->Irp->IoStatus.Status, + &Pkt->RetryIntervalSec); + if (Pkt->Irp->IoStatus.Status == STATUS_VERIFY_REQUIRED){ + shouldRetry = TRUE; + } + } + else if ((pCdb->CDB10.OperationCode == SCSIOP_READ) || + (pCdb->CDB10.OperationCode == SCSIOP_WRITE)){ + /* + * This is a Read/Write Data packet. + */ + PIO_STACK_LOCATION origCurrentSp = IoGetCurrentIrpStackLocation(Pkt->OriginalIrp); + + shouldRetry = ClassInterpretSenseInfo( + Pkt->Fdo, + &Pkt->Srb, + origCurrentSp->MajorFunction, + 0, + MAXIMUM_RETRIES - Pkt->NumRetries, + &Pkt->Irp->IoStatus.Status, + &Pkt->RetryIntervalSec); + /* + * Deal with some special cases. + */ + if (Pkt->Irp->IoStatus.Status == STATUS_INSUFFICIENT_RESOURCES){ + /* + * We are in extreme low-memory stress. + * We will retry in smaller chunks. + */ + shouldRetry = TRUE; + } + else if (TEST_FLAG(origCurrentSp->Flags, SL_OVERRIDE_VERIFY_VOLUME) && + (Pkt->Irp->IoStatus.Status == STATUS_VERIFY_REQUIRED)){ + /* + * We are still verifying a (possibly) reloaded disk/cdrom. + * So retry the request. + */ + Pkt->Irp->IoStatus.Status = STATUS_IO_DEVICE_ERROR; + shouldRetry = TRUE; + } + } + else { + DBGERR(("Unhandled SRB Function %xh in error path for packet %p (did miniport change Srb.Cdb.OperationCode ?)", (ULONG)pCdb->CDB10.OperationCode, Pkt)); + } + + return shouldRetry; +} + + +/* + * RetryTransferPacket + * + * Retry sending a TRANSFER_PACKET. + * + * Return TRUE iff the packet is complete. + * (if so the status in pkt->irp is the final status). + */ +BOOLEAN RetryTransferPacket(PTRANSFER_PACKET Pkt) +{ + BOOLEAN packetDone; + + DBGTRACE(ClassDebugTrace, ("retrying failed transfer (pkt=%ph, op=%s)", Pkt, DBGGETSCSIOPSTR(&Pkt->Srb))); + + ASSERT(Pkt->NumRetries > 0); + Pkt->NumRetries--; + + /* + * Tone down performance on the retry. + * This increases the chance for success on the retry. + * We've seen instances of drives that fail consistently but then start working + * once this scale-down is applied. + */ + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_DISABLE_DISCONNECT); + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + CLEAR_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_QUEUE_ACTION_ENABLE); + Pkt->Srb.QueueTag = SP_UNTAGGED; + + if (Pkt->Irp->IoStatus.Status == STATUS_INSUFFICIENT_RESOURCES){ + PCDB pCdb = (PCDB)Pkt->Srb.Cdb; + BOOLEAN isReadWrite = ((pCdb->CDB10.OperationCode == SCSIOP_READ) || + (pCdb->CDB10.OperationCode == SCSIOP_WRITE)); + + if (Pkt->InLowMemRetry || !isReadWrite){ + /* + * This should never happen. + * The memory manager guarantees that at least four pages will + * be available to allow forward progress in the port driver. + * So a one-page transfer should never fail with insufficient resources. + */ + ASSERT(isReadWrite && !Pkt->InLowMemRetry); + packetDone = TRUE; + } + else { + /* + * We are in low-memory stress. + * Start the low-memory retry state machine, which tries to + * resend the packet in little one-page chunks. + */ + InitLowMemRetry( Pkt, + Pkt->BufPtrCopy, + Pkt->BufLenCopy, + Pkt->TargetLocationCopy); + StepLowMemRetry(Pkt); + packetDone = FALSE; + } + } + else { + /* + * Retry the packet by simply resending it after a delay. + * Put the packet back in the pending queue and + * schedule a timer to retry the transfer. + * + * Do not call SetupReadWriteTransferPacket again because: + * (1) The minidriver may have set some bits + * in the SRB that it needs again and + * (2) doing so would reset numRetries. + * + * BECAUSE we do not call SetupReadWriteTransferPacket again, + * we have to reset a couple fields in the SRB that + * some miniports overwrite when they fail an SRB. + */ + + Pkt->Srb.DataBuffer = Pkt->BufPtrCopy; + Pkt->Srb.DataTransferLength = Pkt->BufLenCopy; + + if (Pkt->RetryIntervalSec == 0){ + /* + * Always delay by at least a little when retrying. + * Some problems (e.g. CRC errors) are not recoverable without a slight delay. + */ + LARGE_INTEGER timerPeriod; + + timerPeriod.HighPart = -1; + timerPeriod.LowPart = -(LONG)((ULONG)MINIMUM_RETRY_UNITS*KeQueryTimeIncrement()); + KeInitializeTimer(&Pkt->RetryTimer); + KeInitializeDpc(&Pkt->RetryTimerDPC, TransferPacketRetryTimerDpc, Pkt); + KeSetTimer(&Pkt->RetryTimer, timerPeriod, &Pkt->RetryTimerDPC); + } + else { + LARGE_INTEGER timerPeriod; + + ASSERT(Pkt->RetryIntervalSec < 100); // sanity check + timerPeriod.HighPart = -1; + timerPeriod.LowPart = Pkt->RetryIntervalSec*-10000000; + KeInitializeTimer(&Pkt->RetryTimer); + KeInitializeDpc(&Pkt->RetryTimerDPC, TransferPacketRetryTimerDpc, Pkt); + KeSetTimer(&Pkt->RetryTimer, timerPeriod, &Pkt->RetryTimerDPC); + } + packetDone = FALSE; + } + + return packetDone; +} + + +VOID TransferPacketRetryTimerDpc( IN PKDPC Dpc, + IN PVOID DeferredContext, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2) +{ + PTRANSFER_PACKET pkt = (PTRANSFER_PACKET)DeferredContext; + SubmitTransferPacket(pkt); +} + + +VOID InitLowMemRetry(PTRANSFER_PACKET Pkt, PVOID BufPtr, ULONG Len, LARGE_INTEGER TargetLocation) +{ + ASSERT(Len > 0); + ASSERT(!Pkt->InLowMemRetry); + Pkt->InLowMemRetry = TRUE; + Pkt->LowMemRetry_remainingBufPtr = BufPtr; + Pkt->LowMemRetry_remainingBufLen = Len; + Pkt->LowMemRetry_nextChunkTargetLocation = TargetLocation; +} + + +/* + * StepLowMemRetry + * + * During extreme low-memory stress, this function retries + * a packet in small one-page chunks, sent serially. + * + * Returns TRUE iff the packet is done. + */ +BOOLEAN StepLowMemRetry(PTRANSFER_PACKET Pkt) +{ + BOOLEAN packetDone; + + if (Pkt->LowMemRetry_remainingBufLen == 0){ + packetDone = TRUE; + } + else { + ULONG thisChunkLen; + ULONG bytesToNextPageBoundary; + + /* + * Make sure the little chunk we send is <= a page length + * AND that it does not cross any page boundaries. + */ + bytesToNextPageBoundary = PAGE_SIZE-(ULONG)((ULONG_PTR)Pkt->LowMemRetry_remainingBufPtr%PAGE_SIZE); + thisChunkLen = MIN(Pkt->LowMemRetry_remainingBufLen, bytesToNextPageBoundary); + + /* + * Set up the transfer packet for the new little chunk. + * This will reset numRetries so that we retry each chunk as required. + */ + SetupReadWriteTransferPacket(Pkt, + Pkt->LowMemRetry_remainingBufPtr, + thisChunkLen, + Pkt->LowMemRetry_nextChunkTargetLocation, + Pkt->OriginalIrp); + + Pkt->LowMemRetry_remainingBufPtr += thisChunkLen; + Pkt->LowMemRetry_remainingBufLen -= thisChunkLen; + Pkt->LowMemRetry_nextChunkTargetLocation.QuadPart += thisChunkLen; + + SubmitTransferPacket(Pkt); + packetDone = FALSE; + } + + return packetDone; +} + diff --git a/drivers/storage/classpnp/utils.c b/drivers/storage/classpnp/utils.c new file mode 100644 index 00000000000..43dd04916d1 --- /dev/null +++ b/drivers/storage/classpnp/utils.c @@ -0,0 +1,565 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + utils.c + +Abstract: + + SCSI class driver routines + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + +#include "classp.h" +#include "debug.h" + + + +#ifdef ALLOC_PRAGMA + #pragma alloc_text(PAGE, ClassGetDeviceParameter) + #pragma alloc_text(PAGE, ClassScanForSpecial) + #pragma alloc_text(PAGE, ClassSetDeviceParameter) +#endif + + + +// custom string match -- careful! +BOOLEAN ClasspMyStringMatches(IN PCHAR StringToMatch OPTIONAL, IN PCHAR TargetString) +{ + ULONG length; // strlen returns an int, not size_t (!) + PAGED_CODE(); + ASSERT(TargetString); + // if no match requested, return TRUE + if (StringToMatch == NULL) { + return TRUE; + } + // cache the string length for efficiency + length = strlen(StringToMatch); + // ZERO-length strings may only match zero-length strings + if (length == 0) { + return (strlen(TargetString) == 0); + } + // strncmp returns zero if the strings match + return (strncmp(StringToMatch, TargetString, length) == 0); +} + + +VOID ClassGetDeviceParameter( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PWSTR SubkeyName OPTIONAL, + IN PWSTR ParameterName, + IN OUT PULONG ParameterValue // also default value + ) +{ + NTSTATUS status; + RTL_QUERY_REGISTRY_TABLE queryTable[2]; + HANDLE deviceParameterHandle; + HANDLE deviceSubkeyHandle; + ULONG defaultParameterValue; + + PAGED_CODE(); + + // + // open the given parameter + // + + status = IoOpenDeviceRegistryKey(FdoExtension->LowerPdo, + PLUGPLAY_REGKEY_DEVICE, + KEY_READ, + &deviceParameterHandle); + + if (NT_SUCCESS(status) && (SubkeyName != NULL)) { + + UNICODE_STRING subkeyName; + OBJECT_ATTRIBUTES objectAttributes; + + RtlInitUnicodeString(&subkeyName, SubkeyName); + InitializeObjectAttributes(&objectAttributes, + &subkeyName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + deviceParameterHandle, + NULL); + + status = ZwOpenKey(&deviceSubkeyHandle, + KEY_READ, + &objectAttributes); + if (!NT_SUCCESS(status)) { + ZwClose(deviceParameterHandle); + } + + } + + if (NT_SUCCESS(status)) { + + RtlZeroMemory(queryTable, sizeof(queryTable)); + + defaultParameterValue = *ParameterValue; + + queryTable->Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; + queryTable->Name = ParameterName; + queryTable->EntryContext = ParameterValue; + queryTable->DefaultType = REG_DWORD; + queryTable->DefaultData = NULL; + queryTable->DefaultLength = 0; + + status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE, + (PWSTR)(SubkeyName ? + deviceSubkeyHandle : + deviceParameterHandle), + queryTable, + NULL, + NULL); + if (!NT_SUCCESS(status)) { + *ParameterValue = defaultParameterValue; // use default value + } + + // + // close what we open + // + + if (SubkeyName) { + ZwClose(deviceSubkeyHandle); + } + + ZwClose(deviceParameterHandle); + } + + return; + +} // end ClassGetDeviceParameter() + + +NTSTATUS ClassSetDeviceParameter( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN PWSTR SubkeyName OPTIONAL, + IN PWSTR ParameterName, + IN ULONG ParameterValue) +{ + NTSTATUS status; + HANDLE deviceParameterHandle; + HANDLE deviceSubkeyHandle; + + PAGED_CODE(); + + // + // open the given parameter + // + + status = IoOpenDeviceRegistryKey(FdoExtension->LowerPdo, + PLUGPLAY_REGKEY_DEVICE, + KEY_READ | KEY_WRITE, + &deviceParameterHandle); + + if (NT_SUCCESS(status) && (SubkeyName != NULL)) { + + UNICODE_STRING subkeyName; + OBJECT_ATTRIBUTES objectAttributes; + + RtlInitUnicodeString(&subkeyName, SubkeyName); + InitializeObjectAttributes(&objectAttributes, + &subkeyName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + deviceParameterHandle, + NULL); + + status = ZwCreateKey(&deviceSubkeyHandle, + KEY_READ | KEY_WRITE, + &objectAttributes, + 0, NULL, 0, NULL); + if (!NT_SUCCESS(status)) { + ZwClose(deviceParameterHandle); + } + + } + + if (NT_SUCCESS(status)) { + + status = RtlWriteRegistryValue( + RTL_REGISTRY_HANDLE, + (PWSTR) (SubkeyName ? + deviceSubkeyHandle : + deviceParameterHandle), + ParameterName, + REG_DWORD, + &ParameterValue, + sizeof(ULONG)); + + // + // close what we open + // + + if (SubkeyName) { + ZwClose(deviceSubkeyHandle); + } + + ZwClose(deviceParameterHandle); + } + + return status; + +} // end ClassSetDeviceParameter() + + +/* + * ClassScanForSpecial + * + * This routine was written to simplify scanning for special + * hardware based upon id strings. it does not check the registry. + */ + +VOID ClassScanForSpecial( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + IN CLASSPNP_SCAN_FOR_SPECIAL_INFO DeviceList[], + IN PCLASS_SCAN_FOR_SPECIAL_HANDLER Function) +{ + PSTORAGE_DEVICE_DESCRIPTOR deviceDescriptor; + PUCHAR vendorId; + PUCHAR productId; + PUCHAR productRevision; + UCHAR nullString[] = ""; + ULONG j; + + PAGED_CODE(); + ASSERT(DeviceList); + ASSERT(Function); + + deviceDescriptor = FdoExtension->DeviceDescriptor; + + if (DeviceList == NULL) { + return; + } + if (Function == NULL) { + return; + } + + // + // SCSI sets offsets to -1, ATAPI sets to 0. check for both. + // + + if (deviceDescriptor->VendorIdOffset != 0 && + deviceDescriptor->VendorIdOffset != -1) { + vendorId = ((PUCHAR)deviceDescriptor); + vendorId += deviceDescriptor->VendorIdOffset; + } else { + vendorId = nullString; + } + if (deviceDescriptor->ProductIdOffset != 0 && + deviceDescriptor->ProductIdOffset != -1) { + productId = ((PUCHAR)deviceDescriptor); + productId += deviceDescriptor->ProductIdOffset; + } else { + productId = nullString; + } + if (deviceDescriptor->VendorIdOffset != 0 && + deviceDescriptor->VendorIdOffset != -1) { + productRevision = ((PUCHAR)deviceDescriptor); + productRevision += deviceDescriptor->ProductRevisionOffset; + } else { + productRevision = nullString; + } + + // + // loop while the device list is valid (not null-filled) + // + + for (;(DeviceList->VendorId != NULL || + DeviceList->ProductId != NULL || + DeviceList->ProductRevision != NULL);DeviceList++) { + + if (ClasspMyStringMatches(DeviceList->VendorId, vendorId) && + ClasspMyStringMatches(DeviceList->ProductId, productId) && + ClasspMyStringMatches(DeviceList->ProductRevision, productRevision) + ) { + + DebugPrint((1, "ClasspScanForSpecialByInquiry: Found matching " + "controller Ven: %s Prod: %s Rev: %s\n", + vendorId, productId, productRevision)); + + // + // pass the context to the call back routine and exit + // + + (Function)(FdoExtension, DeviceList->Data); + + // + // for CHK builds, try to prevent wierd stacks by having a debug + // print here. it's a hack, but i know of no other way to prevent + // the stack from being wrong. + // + + DebugPrint((16, "ClasspScanForSpecialByInquiry: " + "completed callback\n")); + return; + + } // else the strings did not match + + } // none of the devices matched. + + DebugPrint((1, "ClasspScanForSpecialByInquiry: no match found for %p\n", + FdoExtension->DeviceObject)); + return; + +} // end ClasspScanForSpecialByInquiry() + + +// +// In order to provide better performance without the need to reboot, +// we need to implement a self-adjusting method to set and clear the +// srb flags based upon current performance. +// +// whenever there is an error, immediately grab the spin lock. the +// MP perf hit here is acceptable, since we're in an error path. this +// is also neccessary because we are guaranteed to be modifying the +// SRB flags here, setting SuccessfulIO to zero, and incrementing the +// actual error count (which is always done within this spinlock). +// +// whenever there is no error, increment a counter. if there have been +// errors on the device, and we've enabled dynamic perf, *and* we've +// just crossed the perf threshhold, then grab the spin lock and +// double check that the threshhold has, indeed been hit(*). then +// decrement the error count, and if it's dropped sufficiently, undo +// some of the safety changes made in the SRB flags due to the errors. +// +// * this works in all cases. even if lots of ios occur after the +// previous guy went in and cleared the successfulio counter, that +// just means that we've hit the threshhold again, and so it's proper +// to run the inner loop again. +// + +VOID +ClasspPerfIncrementErrorCount( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) +{ + PCLASS_PRIVATE_FDO_DATA fdoData = FdoExtension->PrivateFdoData; + KIRQL oldIrql; + ULONG errors; + + KeAcquireSpinLock(&fdoData->SpinLock, &oldIrql); + + fdoData->Perf.SuccessfulIO = 0; // implicit interlock + errors = InterlockedIncrement(&FdoExtension->ErrorCount); + + if (errors >= CLASS_ERROR_LEVEL_1) { + + // + // If the error count has exceeded the error limit, then disable + // any tagged queuing, multiple requests per lu queueing + // and sychronous data transfers. + // + // Clearing the no queue freeze flag prevents the port driver + // from sending multiple requests per logical unit. + // + + CLEAR_FLAG(FdoExtension->SrbFlags, SRB_FLAGS_NO_QUEUE_FREEZE); + CLEAR_FLAG(FdoExtension->SrbFlags, SRB_FLAGS_QUEUE_ACTION_ENABLE); + + SET_FLAG(FdoExtension->SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + + DebugPrint((ClassDebugError, "ClasspPerfIncrementErrorCount: " + "Too many errors; disabling tagged queuing and " + "synchronous data tranfers.\n")); + + } + + if (errors >= CLASS_ERROR_LEVEL_2) { + + // + // If a second threshold is reached, disable disconnects. + // + + SET_FLAG(FdoExtension->SrbFlags, SRB_FLAGS_DISABLE_DISCONNECT); + DebugPrint((ClassDebugError, "ClasspPerfIncrementErrorCount: " + "Too many errors; disabling disconnects.\n")); + } + + KeReleaseSpinLock(&fdoData->SpinLock, oldIrql); + return; +} + +VOID +ClasspPerfIncrementSuccessfulIo( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) +{ + PCLASS_PRIVATE_FDO_DATA fdoData = FdoExtension->PrivateFdoData; + KIRQL oldIrql; + ULONG errors; + ULONG succeeded = 0; + + // + // don't take a hit from the interlocked op unless we're in + // a degraded state and we've got a threshold to hit. + // + + if (FdoExtension->ErrorCount == 0) { + return; + } + + if (fdoData->Perf.ReEnableThreshhold == 0) { + return; + } + + succeeded = InterlockedIncrement(&fdoData->Perf.SuccessfulIO); + if (succeeded < fdoData->Perf.ReEnableThreshhold) { + return; + } + + // + // if we hit the threshold, grab the spinlock and verify we've + // actually done so. this allows us to ignore the spinlock 99% + // of the time. + // + + KeAcquireSpinLock(&fdoData->SpinLock, &oldIrql); + + // + // re-read the value, so we don't run this multiple times + // for a single threshhold being hit. this keeps errorcount + // somewhat useful. + // + + succeeded = fdoData->Perf.SuccessfulIO; + + if ((FdoExtension->ErrorCount != 0) && + (fdoData->Perf.ReEnableThreshhold <= succeeded) + ) { + + fdoData->Perf.SuccessfulIO = 0; // implicit interlock + + ASSERT(FdoExtension->ErrorCount > 0); + errors = InterlockedDecrement(&FdoExtension->ErrorCount); + + // + // note: do in reverse order of the sets "just in case" + // + + if (errors < CLASS_ERROR_LEVEL_2) { + if (errors == CLASS_ERROR_LEVEL_2 - 1) { + DebugPrint((ClassDebugError, "ClasspPerfIncrementSuccessfulIo: " + "Error level 2 no longer required.\n")); + } + if (!TEST_FLAG(fdoData->Perf.OriginalSrbFlags, + SRB_FLAGS_DISABLE_DISCONNECT)) { + CLEAR_FLAG(FdoExtension->SrbFlags, + SRB_FLAGS_DISABLE_DISCONNECT); + } + } + + if (errors < CLASS_ERROR_LEVEL_1) { + if (errors == CLASS_ERROR_LEVEL_1 - 1) { + DebugPrint((ClassDebugError, "ClasspPerfIncrementSuccessfulIo: " + "Error level 1 no longer required.\n")); + } + if (!TEST_FLAG(fdoData->Perf.OriginalSrbFlags, + SRB_FLAGS_DISABLE_SYNCH_TRANSFER)) { + CLEAR_FLAG(FdoExtension->SrbFlags, + SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + } + if (TEST_FLAG(fdoData->Perf.OriginalSrbFlags, + SRB_FLAGS_QUEUE_ACTION_ENABLE)) { + SET_FLAG(FdoExtension->SrbFlags, + SRB_FLAGS_QUEUE_ACTION_ENABLE); + } + if (TEST_FLAG(fdoData->Perf.OriginalSrbFlags, + SRB_FLAGS_NO_QUEUE_FREEZE)) { + SET_FLAG(FdoExtension->SrbFlags, + SRB_FLAGS_NO_QUEUE_FREEZE); + } + } + } // end of threshhold definitely being hit for first time + + KeReleaseSpinLock(&fdoData->SpinLock, oldIrql); + return; +} + + +PMDL BuildDeviceInputMdl(PVOID Buffer, ULONG BufferLen) +{ + PMDL mdl; + + mdl = IoAllocateMdl(Buffer, BufferLen, FALSE, FALSE, NULL); + if (mdl){ + _SEH2_TRY { + /* + * We are reading from the device. + * Therefore, the device is WRITING to the locked memory. + * So we request IoWriteAccess. + */ + MmProbeAndLockPages(mdl, KernelMode, IoWriteAccess); + + } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { + NTSTATUS status = _SEH2_GetExceptionCode(); + + DBGWARN(("BuildReadMdl: MmProbeAndLockPages failed with %xh.", status)); + IoFreeMdl(mdl); + mdl = NULL; + } _SEH2_END; + } + else { + DBGWARN(("BuildReadMdl: IoAllocateMdl failed")); + } + + return mdl; +} + + +VOID FreeDeviceInputMdl(PMDL Mdl) +{ + MmUnlockPages(Mdl); + IoFreeMdl(Mdl); +} + + +#if 0 + VOID + ClasspPerfResetCounters( + IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension + ) + { + PCLASS_PRIVATE_FDO_DATA fdoData = FdoExtension->PrivateFdoData; + KIRQL oldIrql; + + KeAcquireSpinLock(&fdoData->SpinLock, &oldIrql); + DebugPrint((ClassDebugError, "ClasspPerfResetCounters: " + "Resetting all perf counters.\n")); + fdoData->Perf.SuccessfulIO = 0; + FdoExtension->ErrorCount = 0; + + if (!TEST_FLAG(fdoData->Perf.OriginalSrbFlags, + SRB_FLAGS_DISABLE_DISCONNECT)) { + CLEAR_FLAG(FdoExtension->SrbFlags, + SRB_FLAGS_DISABLE_DISCONNECT); + } + if (!TEST_FLAG(fdoData->Perf.OriginalSrbFlags, + SRB_FLAGS_DISABLE_SYNCH_TRANSFER)) { + CLEAR_FLAG(FdoExtension->SrbFlags, + SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + } + if (TEST_FLAG(fdoData->Perf.OriginalSrbFlags, + SRB_FLAGS_QUEUE_ACTION_ENABLE)) { + SET_FLAG(FdoExtension->SrbFlags, + SRB_FLAGS_QUEUE_ACTION_ENABLE); + } + if (TEST_FLAG(fdoData->Perf.OriginalSrbFlags, + SRB_FLAGS_NO_QUEUE_FREEZE)) { + SET_FLAG(FdoExtension->SrbFlags, + SRB_FLAGS_NO_QUEUE_FREEZE); + } + KeReleaseSpinLock(&fdoData->SpinLock, oldIrql); + return; + } +#endif + + diff --git a/drivers/storage/classpnp/xferpkt.c b/drivers/storage/classpnp/xferpkt.c new file mode 100644 index 00000000000..7cd1f92cd63 --- /dev/null +++ b/drivers/storage/classpnp/xferpkt.c @@ -0,0 +1,911 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1991 - 1999 + +Module Name: + + xferpkt.c + +Abstract: + + Packet routines for CLASSPNP + +Environment: + + kernel mode only + +Notes: + + +Revision History: + +--*/ + +#include "classp.h" +#include "debug.h" + +#ifdef ALLOC_PRAGMA + #pragma alloc_text(PAGE, InitializeTransferPackets) + #pragma alloc_text(PAGE, DestroyAllTransferPackets) + #pragma alloc_text(PAGE, SetupEjectionTransferPacket) + #pragma alloc_text(PAGE, SetupModeSenseTransferPacket) +#endif + + +ULONG MinWorkingSetTransferPackets = MIN_WORKINGSET_TRANSFER_PACKETS_Consumer; +ULONG MaxWorkingSetTransferPackets = MAX_WORKINGSET_TRANSFER_PACKETS_Consumer; + + +/* + * InitializeTransferPackets + * + * Allocate/initialize TRANSFER_PACKETs and related resources. + */ +NTSTATUS InitializeTransferPackets(PDEVICE_OBJECT Fdo) +{ + PCOMMON_DEVICE_EXTENSION commonExt = Fdo->DeviceExtension; + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + PSTORAGE_ADAPTER_DESCRIPTOR adapterDesc = commonExt->PartitionZeroExtension->AdapterDescriptor; + ULONG hwMaxPages; + NTSTATUS status = STATUS_SUCCESS; + + PAGED_CODE(); + + /* + * Precompute the maximum transfer length + */ + ASSERT(adapterDesc->MaximumTransferLength); + ASSERT(adapterDesc->MaximumPhysicalPages); + hwMaxPages = adapterDesc->MaximumPhysicalPages ? adapterDesc->MaximumPhysicalPages-1 : 0; + +#if defined(_AMD64_SIMULATOR_) + + // + // The simulator appears to have a problem with large transfers. + // + + if (hwMaxPages > 4) { + hwMaxPages = 4; + } + +#endif + + fdoData->HwMaxXferLen = MIN(adapterDesc->MaximumTransferLength, hwMaxPages << PAGE_SHIFT); + fdoData->HwMaxXferLen = MAX(fdoData->HwMaxXferLen, PAGE_SIZE); + + fdoData->NumTotalTransferPackets = 0; + fdoData->NumFreeTransferPackets = 0; + InitializeSListHead(&fdoData->FreeTransferPacketsList); + InitializeListHead(&fdoData->AllTransferPacketsList); + InitializeListHead(&fdoData->DeferredClientIrpList); + + /* + * Set the packet threshold numbers based on the Windows SKU. + */ + if (ExVerifySuite(Personal)){ + // this is Windows Personal + MinWorkingSetTransferPackets = MIN_WORKINGSET_TRANSFER_PACKETS_Consumer; + MaxWorkingSetTransferPackets = MAX_WORKINGSET_TRANSFER_PACKETS_Consumer; + } + else if (ExVerifySuite(Enterprise) || ExVerifySuite(DataCenter)){ + // this is Advanced Server or Datacenter + MinWorkingSetTransferPackets = MIN_WORKINGSET_TRANSFER_PACKETS_Enterprise; + MaxWorkingSetTransferPackets = MAX_WORKINGSET_TRANSFER_PACKETS_Enterprise; + } + else if (ExVerifySuite(TerminalServer)){ + // this is standard Server or Pro with terminal server + MinWorkingSetTransferPackets = MIN_WORKINGSET_TRANSFER_PACKETS_Server; + MaxWorkingSetTransferPackets = MAX_WORKINGSET_TRANSFER_PACKETS_Server; + } + else { + // this is Professional without terminal server + MinWorkingSetTransferPackets = MIN_WORKINGSET_TRANSFER_PACKETS_Consumer; + MaxWorkingSetTransferPackets = MAX_WORKINGSET_TRANSFER_PACKETS_Consumer; + } + + while (fdoData->NumFreeTransferPackets < MIN_INITIAL_TRANSFER_PACKETS){ + PTRANSFER_PACKET pkt = NewTransferPacket(Fdo); + if (pkt){ + InterlockedIncrement(&fdoData->NumTotalTransferPackets); + EnqueueFreeTransferPacket(Fdo, pkt); + } + else { + status = STATUS_INSUFFICIENT_RESOURCES; + break; + } + } + fdoData->DbgPeakNumTransferPackets = fdoData->NumTotalTransferPackets; + + /* + * Pre-initialize our SCSI_REQUEST_BLOCK template with all + * the constant fields. This will save a little time for each xfer. + * NOTE: a CdbLength field of 10 may not always be appropriate + */ + RtlZeroMemory(&fdoData->SrbTemplate, sizeof(SCSI_REQUEST_BLOCK)); + fdoData->SrbTemplate.Length = sizeof(SCSI_REQUEST_BLOCK); + fdoData->SrbTemplate.Function = SRB_FUNCTION_EXECUTE_SCSI; + fdoData->SrbTemplate.QueueAction = SRB_SIMPLE_TAG_REQUEST; + fdoData->SrbTemplate.SenseInfoBufferLength = sizeof(SENSE_DATA); + fdoData->SrbTemplate.CdbLength = 10; + + return status; +} + + +VOID DestroyAllTransferPackets(PDEVICE_OBJECT Fdo) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + TRANSFER_PACKET *pkt; + + PAGED_CODE(); + + ASSERT(IsListEmpty(&fdoData->DeferredClientIrpList)); + + while (pkt = DequeueFreeTransferPacket(Fdo, FALSE)){ + DestroyTransferPacket(pkt); + InterlockedDecrement(&fdoData->NumTotalTransferPackets); + } + + ASSERT(fdoData->NumTotalTransferPackets == 0); +} + + +PTRANSFER_PACKET NewTransferPacket(PDEVICE_OBJECT Fdo) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + PTRANSFER_PACKET newPkt; + + newPkt = ExAllocatePoolWithTag(NonPagedPool, sizeof(TRANSFER_PACKET), 'pnPC'); + if (newPkt){ + RtlZeroMemory(newPkt, sizeof(TRANSFER_PACKET)); // just to be sure + + /* + * Allocate resources for the packet. + */ + newPkt->Irp = IoAllocateIrp(Fdo->StackSize, FALSE); + if (newPkt->Irp){ + KIRQL oldIrql; + + newPkt->Fdo = Fdo; + + /* + * Enqueue the packet in our static AllTransferPacketsList + * (just so we can find it during debugging if its stuck somewhere). + */ + KeAcquireSpinLock(&fdoData->SpinLock, &oldIrql); + InsertTailList(&fdoData->AllTransferPacketsList, &newPkt->AllPktsListEntry); + KeReleaseSpinLock(&fdoData->SpinLock, oldIrql); + } + else { + ExFreePool(newPkt); + newPkt = NULL; + } + } + + return newPkt; +} + + +/* + * DestroyTransferPacket + * + */ +VOID DestroyTransferPacket(PTRANSFER_PACKET Pkt) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Pkt->Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + KIRQL oldIrql; + + ASSERT(!Pkt->SlistEntry.Next); + ASSERT(!Pkt->OriginalIrp); + + KeAcquireSpinLock(&fdoData->SpinLock, &oldIrql); + + /* + * Delete the packet from our all-packets queue. + */ + ASSERT(!IsListEmpty(&Pkt->AllPktsListEntry)); + ASSERT(!IsListEmpty(&fdoData->AllTransferPacketsList)); + RemoveEntryList(&Pkt->AllPktsListEntry); + InitializeListHead(&Pkt->AllPktsListEntry); + + KeReleaseSpinLock(&fdoData->SpinLock, oldIrql); + + IoFreeIrp(Pkt->Irp); + ExFreePool(Pkt); +} + + +VOID EnqueueFreeTransferPacket(PDEVICE_OBJECT Fdo, PTRANSFER_PACKET Pkt) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + KIRQL oldIrql; + ULONG newNumPkts; + + ASSERT(!Pkt->SlistEntry.Next); + + InterlockedPushEntrySList(&fdoData->FreeTransferPacketsList, &Pkt->SlistEntry); + newNumPkts = InterlockedIncrement(&fdoData->NumFreeTransferPackets); + ASSERT(newNumPkts <= fdoData->NumTotalTransferPackets); + + /* + * If the total number of packets is larger than MinWorkingSetTransferPackets, + * that means that we've been in stress. If all those packets are now + * free, then we are now out of stress and can free the extra packets. + * Free down to MaxWorkingSetTransferPackets immediately, and + * down to MinWorkingSetTransferPackets lazily (one at a time). + */ + if (fdoData->NumFreeTransferPackets >= fdoData->NumTotalTransferPackets){ + + /* + * 1. Immediately snap down to our UPPER threshold. + */ + if (fdoData->NumTotalTransferPackets > MaxWorkingSetTransferPackets){ + SINGLE_LIST_ENTRY pktList; + PSINGLE_LIST_ENTRY slistEntry; + PTRANSFER_PACKET pktToDelete; + + DBGTRACE(ClassDebugTrace, ("Exiting stress, block freeing (%d-%d) packets.", fdoData->NumTotalTransferPackets, MaxWorkingSetTransferPackets)); + + /* + * Check the counter again with lock held. This eliminates a race condition + * while still allowing us to not grab the spinlock in the common codepath. + * + * Note that the spinlock does not synchronize with threads dequeuing free + * packets to send (DequeueFreeTransferPacket does that with a lightweight + * interlocked exchange); the spinlock prevents multiple threads in this function + * from deciding to free too many extra packets at once. + */ + SimpleInitSlistHdr(&pktList); + KeAcquireSpinLock(&fdoData->SpinLock, &oldIrql); + while ((fdoData->NumFreeTransferPackets >= fdoData->NumTotalTransferPackets) && + (fdoData->NumTotalTransferPackets > MaxWorkingSetTransferPackets)){ + + pktToDelete = DequeueFreeTransferPacket(Fdo, FALSE); + if (pktToDelete){ + SimplePushSlist(&pktList, &pktToDelete->SlistEntry); + InterlockedDecrement(&fdoData->NumTotalTransferPackets); + } + else { + DBGTRACE(ClassDebugTrace, ("Extremely unlikely condition (non-fatal): %d packets dequeued at once for Fdo %p. NumTotalTransferPackets=%d (1).", MaxWorkingSetTransferPackets, Fdo, fdoData->NumTotalTransferPackets)); + break; + } + } + KeReleaseSpinLock(&fdoData->SpinLock, oldIrql); + + while (slistEntry = SimplePopSlist(&pktList)){ + pktToDelete = CONTAINING_RECORD(slistEntry, TRANSFER_PACKET, SlistEntry); + DestroyTransferPacket(pktToDelete); + } + + } + + /* + * 2. Lazily work down to our LOWER threshold (by only freeing one packet at a time). + */ + if (fdoData->NumTotalTransferPackets > MinWorkingSetTransferPackets){ + /* + * Check the counter again with lock held. This eliminates a race condition + * while still allowing us to not grab the spinlock in the common codepath. + * + * Note that the spinlock does not synchronize with threads dequeuing free + * packets to send (DequeueFreeTransferPacket does that with a lightweight + * interlocked exchange); the spinlock prevents multiple threads in this function + * from deciding to free too many extra packets at once. + */ + PTRANSFER_PACKET pktToDelete = NULL; + + DBGTRACE(ClassDebugTrace, ("Exiting stress, lazily freeing one of %d/%d packets.", fdoData->NumTotalTransferPackets, MinWorkingSetTransferPackets)); + + KeAcquireSpinLock(&fdoData->SpinLock, &oldIrql); + if ((fdoData->NumFreeTransferPackets >= fdoData->NumTotalTransferPackets) && + (fdoData->NumTotalTransferPackets > MinWorkingSetTransferPackets)){ + + pktToDelete = DequeueFreeTransferPacket(Fdo, FALSE); + if (pktToDelete){ + InterlockedDecrement(&fdoData->NumTotalTransferPackets); + } + else { + DBGTRACE(ClassDebugTrace, ("Extremely unlikely condition (non-fatal): %d packets dequeued at once for Fdo %p. NumTotalTransferPackets=%d (2).", MinWorkingSetTransferPackets, Fdo, fdoData->NumTotalTransferPackets)); + } + } + KeReleaseSpinLock(&fdoData->SpinLock, oldIrql); + + if (pktToDelete){ + DestroyTransferPacket(pktToDelete); + } + } + + } + +} + + +PTRANSFER_PACKET DequeueFreeTransferPacket(PDEVICE_OBJECT Fdo, BOOLEAN AllocIfNeeded) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + PTRANSFER_PACKET pkt; + PSINGLE_LIST_ENTRY slistEntry; + KIRQL oldIrql; + + slistEntry = InterlockedPopEntrySList(&fdoData->FreeTransferPacketsList); + if (slistEntry){ + slistEntry->Next = NULL; + pkt = CONTAINING_RECORD(slistEntry, TRANSFER_PACKET, SlistEntry); + ASSERT(fdoData->NumFreeTransferPackets > 0); + InterlockedDecrement(&fdoData->NumFreeTransferPackets); + } + else { + if (AllocIfNeeded){ + /* + * We are in stress and have run out of lookaside packets. + * In order to service the current transfer, + * allocate an extra packet. + * We will free it lazily when we are out of stress. + */ + pkt = NewTransferPacket(Fdo); + if (pkt){ + InterlockedIncrement(&fdoData->NumTotalTransferPackets); + fdoData->DbgPeakNumTransferPackets = max(fdoData->DbgPeakNumTransferPackets, fdoData->NumTotalTransferPackets); + } + else { + DBGWARN(("DequeueFreeTransferPacket: packet allocation failed")); + } + } + else { + pkt = NULL; + } + } + + return pkt; +} + + + +/* + * SetupReadWriteTransferPacket + * + * This function is called once to set up the first attempt to send a packet. + * It is not called before a retry, as SRB fields may be modified for the retry. + * + * Set up the Srb of the TRANSFER_PACKET for the transfer. + * The Irp is set up in SubmitTransferPacket because it must be reset + * for each packet submission. + */ +VOID SetupReadWriteTransferPacket( PTRANSFER_PACKET Pkt, + PVOID Buf, + ULONG Len, + LARGE_INTEGER DiskLocation, + PIRP OriginalIrp) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Pkt->Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + PIO_STACK_LOCATION origCurSp = IoGetCurrentIrpStackLocation(OriginalIrp); + UCHAR majorFunc = origCurSp->MajorFunction; + ULONG logicalBlockAddr; + ULONG numTransferBlocks; + PCDB pCdb; + + logicalBlockAddr = (ULONG)Int64ShrlMod32(DiskLocation.QuadPart, fdoExt->SectorShift); + numTransferBlocks = Len >> fdoExt->SectorShift; + + /* + * Slap the constant SRB fields in from our pre-initialized template. + * We'll then only have to fill in the unique fields for this transfer. + * Tell lower drivers to sort the SRBs by the logical block address + * so that disk seeks are minimized. + */ + Pkt->Srb = fdoData->SrbTemplate; // copies _contents_ of SRB blocks + Pkt->Srb.DataBuffer = Buf; + Pkt->Srb.DataTransferLength = Len; + Pkt->Srb.QueueSortKey = logicalBlockAddr; + Pkt->Srb.OriginalRequest = Pkt->Irp; + Pkt->Srb.SenseInfoBuffer = &Pkt->SrbErrorSenseData; + Pkt->Srb.TimeOutValue = (Len/0x10000) + ((Len%0x10000) ? 1 : 0); + Pkt->Srb.TimeOutValue *= fdoExt->TimeOutValue; + + /* + * Arrange values in CDB in big-endian format. + */ + pCdb = (PCDB)Pkt->Srb.Cdb; + pCdb->CDB10.LogicalBlockByte0 = ((PFOUR_BYTE)&logicalBlockAddr)->Byte3; + pCdb->CDB10.LogicalBlockByte1 = ((PFOUR_BYTE)&logicalBlockAddr)->Byte2; + pCdb->CDB10.LogicalBlockByte2 = ((PFOUR_BYTE)&logicalBlockAddr)->Byte1; + pCdb->CDB10.LogicalBlockByte3 = ((PFOUR_BYTE)&logicalBlockAddr)->Byte0; + pCdb->CDB10.TransferBlocksMsb = ((PFOUR_BYTE)&numTransferBlocks)->Byte1; + pCdb->CDB10.TransferBlocksLsb = ((PFOUR_BYTE)&numTransferBlocks)->Byte0; + pCdb->CDB10.OperationCode = (majorFunc==IRP_MJ_READ) ? SCSIOP_READ : SCSIOP_WRITE; + + /* + * Set SRB and IRP flags + */ + Pkt->Srb.SrbFlags = fdoExt->SrbFlags; + if (TEST_FLAG(OriginalIrp->Flags, IRP_PAGING_IO) || + TEST_FLAG(OriginalIrp->Flags, IRP_SYNCHRONOUS_PAGING_IO)){ + SET_FLAG(Pkt->Srb.SrbFlags, SRB_CLASS_FLAGS_PAGING); + } + SET_FLAG(Pkt->Srb.SrbFlags, (majorFunc==IRP_MJ_READ) ? SRB_FLAGS_DATA_IN : SRB_FLAGS_DATA_OUT); + + /* + * Allow caching only if this is not a write-through request. + * If write-through and caching is enabled on the device, force + * media access. + */ + if (TEST_FLAG(origCurSp->Flags, SL_WRITE_THROUGH)){ + if (TEST_FLAG(fdoExt->DeviceFlags, DEV_WRITE_CACHE)){ + pCdb->CDB10.ForceUnitAccess = TRUE; + } + } + else { + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_ADAPTER_CACHE_ENABLE); + } + + /* + * Remember the buf and len in the SRB because miniports + * can overwrite SRB.DataTransferLength and we may need it again + * for the retry. + */ + Pkt->BufPtrCopy = Buf; + Pkt->BufLenCopy = Len; + Pkt->TargetLocationCopy = DiskLocation; + + Pkt->OriginalIrp = OriginalIrp; + Pkt->NumRetries = MAXIMUM_RETRIES; + Pkt->SyncEventPtr = NULL; + Pkt->CompleteOriginalIrpWhenLastPacketCompletes = TRUE; +} + + +/* + * SubmitTransferPacket + * + * Set up the IRP for the TRANSFER_PACKET submission and send it down. + */ +VOID SubmitTransferPacket(PTRANSFER_PACKET Pkt) +{ + PCOMMON_DEVICE_EXTENSION commonExtension = Pkt->Fdo->DeviceExtension; + PDEVICE_OBJECT nextDevObj = commonExtension->LowerDeviceObject; + PIO_STACK_LOCATION nextSp = IoGetNextIrpStackLocation(Pkt->Irp); + + ASSERT(Pkt->Irp->CurrentLocation == Pkt->Irp->StackCount+1); + + /* + * Attach the SRB to the IRP. + * The reused IRP's stack location has to be rewritten for each retry + * call because IoCompleteRequest clears the stack locations. + */ + IoReuseIrp(Pkt->Irp, STATUS_NOT_SUPPORTED); + nextSp->MajorFunction = IRP_MJ_SCSI; + nextSp->Parameters.Scsi.Srb = &Pkt->Srb; + Pkt->Srb.ScsiStatus = Pkt->Srb.SrbStatus = 0; + if (Pkt->CompleteOriginalIrpWhenLastPacketCompletes){ + /* + * Only dereference the "original IRP"'s stack location + * if its a real client irp (as opposed to a static irp + * we're using just for result status for one of the non-IO scsi commands). + * + * For read/write, propagate the storage-specific IRP stack location flags + * (e.g. SL_OVERRIDE_VERIFY_VOLUME, SL_WRITE_THROUGH). + */ + PIO_STACK_LOCATION origCurSp = IoGetCurrentIrpStackLocation(Pkt->OriginalIrp); + nextSp->Flags = origCurSp->Flags; + } + + /* + * Write MDL address to new IRP. In the port driver the SRB DataBuffer + * field is used as the actual buffer pointer within the MDL, + * so the same MDL can be used for each partial transfer. + * This saves having to build a new MDL for each partial transfer. + */ + Pkt->Irp->MdlAddress = Pkt->OriginalIrp->MdlAddress; + + IoSetCompletionRoutine(Pkt->Irp, TransferPktComplete, Pkt, TRUE, TRUE, TRUE); + IoCallDriver(nextDevObj, Pkt->Irp); +} + + +NTSTATUS TransferPktComplete(IN PDEVICE_OBJECT NullFdo, IN PIRP Irp, IN PVOID Context) +{ + PTRANSFER_PACKET pkt = (PTRANSFER_PACKET)Context; + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = pkt->Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + PIO_STACK_LOCATION origCurrentSp = IoGetCurrentIrpStackLocation(pkt->OriginalIrp); + BOOLEAN packetDone = FALSE; + + /* + * Put all the assertions and spew in here so we don't have to look at them. + */ + DBGCHECKRETURNEDPKT(pkt); + + if (SRB_STATUS(pkt->Srb.SrbStatus) == SRB_STATUS_SUCCESS){ + + fdoData->LoggedTURFailureSinceLastIO = FALSE; + + /* + * The port driver should not have allocated a sense buffer + * if the SRB succeeded. + */ + ASSERT(!PORT_ALLOCATED_SENSE(fdoExt, &pkt->Srb)); + + /* + * Add this packet's transferred length to the original IRP's. + */ + InterlockedExchangeAdd((PLONG)&pkt->OriginalIrp->IoStatus.Information, + (LONG)pkt->Srb.DataTransferLength); + + if (pkt->InLowMemRetry){ + packetDone = StepLowMemRetry(pkt); + } + else { + packetDone = TRUE; + } + + } + else { + /* + * The packet failed. We may retry it if possible. + */ + BOOLEAN shouldRetry; + + /* + * Make sure IRP status matches SRB error status (since we propagate it). + */ + if (NT_SUCCESS(Irp->IoStatus.Status)){ + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + } + + /* + * Interpret the SRB error (to a meaningful IRP status) + * and determine if we should retry this packet. + * This call looks at the returned SENSE info to figure out what to do. + */ + shouldRetry = InterpretTransferPacketError(pkt); + + /* + * Sometimes the port driver can allocates a new 'sense' buffer + * to report transfer errors, e.g. when the default sense buffer + * is too small. If so, it is up to us to free it. + * Now that we're done interpreting the sense info, free it if appropriate. + */ + if (PORT_ALLOCATED_SENSE(fdoExt, &pkt->Srb)) { + DBGTRACE(ClassDebugSenseInfo, ("Freeing port-allocated sense buffer for pkt %ph.", pkt)); + FREE_PORT_ALLOCATED_SENSE_BUFFER(fdoExt, &pkt->Srb); + pkt->Srb.SenseInfoBuffer = &pkt->SrbErrorSenseData; + pkt->Srb.SenseInfoBufferLength = sizeof(SENSE_DATA); + } + + /* + * If the SRB queue is locked-up, release it. + * Do this after calling the error handler. + */ + if (pkt->Srb.SrbStatus & SRB_STATUS_QUEUE_FROZEN){ + ClassReleaseQueue(pkt->Fdo); + } + + if (shouldRetry && (pkt->NumRetries > 0)){ + packetDone = RetryTransferPacket(pkt); + } + else { + packetDone = TRUE; + } + + } + + /* + * If the packet is completed, put it back in the free list. + * If it is the last packet servicing the original request, complete the original irp. + */ + if (packetDone){ + LONG numPacketsRemaining; + PIRP deferredIrp; + PDEVICE_OBJECT Fdo = pkt->Fdo; + UCHAR uniqueAddr; + + /* + * In case a remove is pending, bump the lock count so we don't get freed + * right after we complete the original irp. + */ + ClassAcquireRemoveLock(Fdo, (PIRP)&uniqueAddr); + + /* + * The original IRP should get an error code + * if any one of the packets failed. + */ + if (!NT_SUCCESS(Irp->IoStatus.Status)){ + pkt->OriginalIrp->IoStatus.Status = Irp->IoStatus.Status; + + /* + * If the original I/O originated in user space (i.e. it is thread-queued), + * and the error is user-correctable (e.g. media is missing, for removable media), + * alert the user. + * Since this is only one of possibly several packets completing for the original IRP, + * we may do this more than once for a single request. That's ok; this allows + * us to test each returned status with IoIsErrorUserInduced(). + */ + if (IoIsErrorUserInduced(Irp->IoStatus.Status) && + pkt->CompleteOriginalIrpWhenLastPacketCompletes && + pkt->OriginalIrp->Tail.Overlay.Thread){ + + IoSetHardErrorOrVerifyDevice(pkt->OriginalIrp, pkt->Fdo); + } + } + + /* + * We use a field in the original IRP to count + * down the transfer pieces as they complete. + */ + numPacketsRemaining = InterlockedDecrement( + (PLONG)&pkt->OriginalIrp->Tail.Overlay.DriverContext[0]); + + if (numPacketsRemaining > 0){ + /* + * More transfer pieces remain for the original request. + * Wait for them to complete before completing the original irp. + */ + } + else { + + /* + * All the transfer pieces are done. + * Complete the original irp if appropriate. + */ + ASSERT(numPacketsRemaining == 0); + if (pkt->CompleteOriginalIrpWhenLastPacketCompletes){ + if (NT_SUCCESS(pkt->OriginalIrp->IoStatus.Status)){ + ASSERT((ULONG)pkt->OriginalIrp->IoStatus.Information == origCurrentSp->Parameters.Read.Length); + ClasspPerfIncrementSuccessfulIo(fdoExt); + } + ClassReleaseRemoveLock(pkt->Fdo, pkt->OriginalIrp); + + ClassCompleteRequest(pkt->Fdo, pkt->OriginalIrp, IO_DISK_INCREMENT); + + /* + * We may have been called by one of the class drivers (e.g. cdrom) + * via the legacy API ClassSplitRequest. + * This is the only case for which the packet engine is called for an FDO + * with a StartIo routine; in that case, we have to call IoStartNextPacket + * now that the original irp has been completed. + */ + if (fdoExt->CommonExtension.DriverExtension->InitData.ClassStartIo) { + if (TEST_FLAG(pkt->Srb.SrbFlags, SRB_FLAGS_DONT_START_NEXT_PACKET)){ + DBGTRAP(("SRB_FLAGS_DONT_START_NEXT_PACKET should never be set here (?)")); + } + else { + KIRQL oldIrql; + KeRaiseIrql(DISPATCH_LEVEL, &oldIrql); + IoStartNextPacket(pkt->Fdo, FALSE); + KeLowerIrql(oldIrql); + } + } + } + } + + /* + * If the packet was synchronous, write the final + * result back to the issuer's status buffer and + * signal his event. + */ + if (pkt->SyncEventPtr){ + KeSetEvent(pkt->SyncEventPtr, 0, FALSE); + pkt->SyncEventPtr = NULL; + } + + /* + * Free the completed packet. + */ + pkt->OriginalIrp = NULL; + pkt->InLowMemRetry = FALSE; + EnqueueFreeTransferPacket(pkt->Fdo, pkt); + + /* + * Now that we have freed some resources, + * try again to send one of the previously deferred irps. + */ + deferredIrp = DequeueDeferredClientIrp(fdoData); + if (deferredIrp){ + DBGWARN(("... retrying deferred irp %xh.", deferredIrp)); + ServiceTransferRequest(pkt->Fdo, deferredIrp); + } + + ClassReleaseRemoveLock(Fdo, (PIRP)&uniqueAddr); + } + + return STATUS_MORE_PROCESSING_REQUIRED; +} + + +/* + * SetupEjectionTransferPacket + * + * Set up a transferPacket for a synchronous Ejection Control transfer. + */ +VOID SetupEjectionTransferPacket( TRANSFER_PACKET *Pkt, + BOOLEAN PreventMediaRemoval, + PKEVENT SyncEventPtr, + PIRP OriginalIrp) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Pkt->Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + PCDB pCdb; + + PAGED_CODE(); + + RtlZeroMemory(&Pkt->Srb, sizeof(SCSI_REQUEST_BLOCK)); + + Pkt->Srb.Length = sizeof(SCSI_REQUEST_BLOCK); + Pkt->Srb.Function = SRB_FUNCTION_EXECUTE_SCSI; + Pkt->Srb.QueueAction = SRB_SIMPLE_TAG_REQUEST; + Pkt->Srb.CdbLength = 6; + Pkt->Srb.OriginalRequest = Pkt->Irp; + Pkt->Srb.SenseInfoBuffer = &Pkt->SrbErrorSenseData; + Pkt->Srb.SenseInfoBufferLength = sizeof(SENSE_DATA); + Pkt->Srb.TimeOutValue = fdoExt->TimeOutValue; + + Pkt->Srb.SrbFlags = fdoExt->SrbFlags; + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_NO_QUEUE_FREEZE); + + pCdb = (PCDB)Pkt->Srb.Cdb; + pCdb->MEDIA_REMOVAL.OperationCode = SCSIOP_MEDIUM_REMOVAL; + pCdb->MEDIA_REMOVAL.Prevent = PreventMediaRemoval; + + Pkt->BufPtrCopy = NULL; + Pkt->BufLenCopy = 0; + + Pkt->OriginalIrp = OriginalIrp; + Pkt->NumRetries = NUM_LOCKMEDIAREMOVAL_RETRIES; + Pkt->SyncEventPtr = SyncEventPtr; + Pkt->CompleteOriginalIrpWhenLastPacketCompletes = FALSE; +} + + +/* + * SetupModeSenseTransferPacket + * + * Set up a transferPacket for a synchronous Mode Sense transfer. + */ +VOID SetupModeSenseTransferPacket( TRANSFER_PACKET *Pkt, + PKEVENT SyncEventPtr, + PVOID ModeSenseBuffer, + UCHAR ModeSenseBufferLen, + UCHAR PageMode, + PIRP OriginalIrp) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Pkt->Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + PCDB pCdb; + + PAGED_CODE(); + + RtlZeroMemory(&Pkt->Srb, sizeof(SCSI_REQUEST_BLOCK)); + + Pkt->Srb.Length = sizeof(SCSI_REQUEST_BLOCK); + Pkt->Srb.Function = SRB_FUNCTION_EXECUTE_SCSI; + Pkt->Srb.QueueAction = SRB_SIMPLE_TAG_REQUEST; + Pkt->Srb.CdbLength = 6; + Pkt->Srb.OriginalRequest = Pkt->Irp; + Pkt->Srb.SenseInfoBuffer = &Pkt->SrbErrorSenseData; + Pkt->Srb.SenseInfoBufferLength = sizeof(SENSE_DATA); + Pkt->Srb.TimeOutValue = fdoExt->TimeOutValue; + Pkt->Srb.DataBuffer = ModeSenseBuffer; + Pkt->Srb.DataTransferLength = ModeSenseBufferLen; + + Pkt->Srb.SrbFlags = fdoExt->SrbFlags; + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_DATA_IN); + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_NO_QUEUE_FREEZE); + + pCdb = (PCDB)Pkt->Srb.Cdb; + pCdb->MODE_SENSE.OperationCode = SCSIOP_MODE_SENSE; + pCdb->MODE_SENSE.PageCode = PageMode; + pCdb->MODE_SENSE.AllocationLength = (UCHAR)ModeSenseBufferLen; + + Pkt->BufPtrCopy = ModeSenseBuffer; + Pkt->BufLenCopy = ModeSenseBufferLen; + + Pkt->OriginalIrp = OriginalIrp; + Pkt->NumRetries = NUM_MODESENSE_RETRIES; + Pkt->SyncEventPtr = SyncEventPtr; + Pkt->CompleteOriginalIrpWhenLastPacketCompletes = FALSE; +} + + +/* + * SetupDriveCapacityTransferPacket + * + * Set up a transferPacket for a synchronous Drive Capacity transfer. + */ +VOID SetupDriveCapacityTransferPacket( TRANSFER_PACKET *Pkt, + PVOID ReadCapacityBuffer, + ULONG ReadCapacityBufferLen, + PKEVENT SyncEventPtr, + PIRP OriginalIrp) +{ + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Pkt->Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + PCDB pCdb; + + RtlZeroMemory(&Pkt->Srb, sizeof(SCSI_REQUEST_BLOCK)); + + Pkt->Srb.Length = sizeof(SCSI_REQUEST_BLOCK); + Pkt->Srb.Function = SRB_FUNCTION_EXECUTE_SCSI; + Pkt->Srb.QueueAction = SRB_SIMPLE_TAG_REQUEST; + Pkt->Srb.CdbLength = 10; + Pkt->Srb.OriginalRequest = Pkt->Irp; + Pkt->Srb.SenseInfoBuffer = &Pkt->SrbErrorSenseData; + Pkt->Srb.SenseInfoBufferLength = sizeof(SENSE_DATA); + Pkt->Srb.TimeOutValue = fdoExt->TimeOutValue; + Pkt->Srb.DataBuffer = ReadCapacityBuffer; + Pkt->Srb.DataTransferLength = ReadCapacityBufferLen; + + Pkt->Srb.SrbFlags = fdoExt->SrbFlags; + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_DATA_IN); + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_NO_QUEUE_FREEZE); + + pCdb = (PCDB)Pkt->Srb.Cdb; + pCdb->CDB10.OperationCode = SCSIOP_READ_CAPACITY; + + Pkt->BufPtrCopy = ReadCapacityBuffer; + Pkt->BufLenCopy = ReadCapacityBufferLen; + + Pkt->OriginalIrp = OriginalIrp; + Pkt->NumRetries = NUM_DRIVECAPACITY_RETRIES; + Pkt->SyncEventPtr = SyncEventPtr; + Pkt->CompleteOriginalIrpWhenLastPacketCompletes = FALSE; +} + + +#if 0 + /* + * SetupSendStartUnitTransferPacket + * + * Set up a transferPacket for a synchronous Send Start Unit transfer. + */ + VOID SetupSendStartUnitTransferPacket( TRANSFER_PACKET *Pkt, + PIRP OriginalIrp) + { + PFUNCTIONAL_DEVICE_EXTENSION fdoExt = Pkt->Fdo->DeviceExtension; + PCLASS_PRIVATE_FDO_DATA fdoData = fdoExt->PrivateFdoData; + PCDB pCdb; + + PAGED_CODE(); + + RtlZeroMemory(&Pkt->Srb, sizeof(SCSI_REQUEST_BLOCK)); + + /* + * Initialize the SRB. + * Use a very long timeout value to give the drive time to spin up. + */ + Pkt->Srb.Length = sizeof(SCSI_REQUEST_BLOCK); + Pkt->Srb.Function = SRB_FUNCTION_EXECUTE_SCSI; + Pkt->Srb.TimeOutValue = START_UNIT_TIMEOUT; + Pkt->Srb.CdbLength = 6; + Pkt->Srb.OriginalRequest = Pkt->Irp; + Pkt->Srb.SenseInfoBuffer = &Pkt->SrbErrorSenseData; + Pkt->Srb.SenseInfoBufferLength = sizeof(SENSE_DATA); + Pkt->Srb.Lun = 0; + + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_NO_DATA_TRANSFER); + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_DISABLE_AUTOSENSE); + SET_FLAG(Pkt->Srb.SrbFlags, SRB_FLAGS_DISABLE_SYNCH_TRANSFER); + + pCdb = (PCDB)Pkt->Srb.Cdb; + pCdb->START_STOP.OperationCode = SCSIOP_START_STOP_UNIT; + pCdb->START_STOP.Start = 1; + pCdb->START_STOP.Immediate = 0; + pCdb->START_STOP.LogicalUnitNumber = 0; + + Pkt->OriginalIrp = OriginalIrp; + Pkt->NumRetries = 0; + Pkt->SyncEventPtr = NULL; + Pkt->CompleteOriginalIrpWhenLastPacketCompletes = FALSE; + } +#endif + + diff --git a/drivers/storage/inc/class.h b/drivers/storage/inc/class.h new file mode 100644 index 00000000000..f983d4ce3c0 --- /dev/null +++ b/drivers/storage/inc/class.h @@ -0,0 +1,374 @@ +/*++ + +Copyright (c) 1991 Microsoft Corporation + +Module Name: + + class.h + +Abstract: + + These are the structures and defines that are used in the + SCSI class drivers. + +Author: + + Mike Glass (mglass) + Jeff Havens (jhavens) + +Revision History: + +--*/ + +#ifndef _CLASS_ + +#include +#include +#include +#include +#include +#include "ntddscsi.h" +#include + +// begin_ntminitape + +#if DBG + +#define DebugPrint(x) ScsiDebugPrint x + +#else + +#define DebugPrint(x) + +#endif // DBG + +// end_ntminitape + +#ifdef POOL_TAGGING +#undef ExAllocatePool +#undef ExAllocatePoolWithQuota +#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'HscS') +#define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,'HscS') +#endif + +#define MAXIMUM_RETRIES 4 + +typedef +VOID +(*PCLASS_ERROR) ( + IN PDEVICE_OBJECT DeviceObject, + IN PSCSI_REQUEST_BLOCK Srb, + IN OUT NTSTATUS *Status, + IN OUT BOOLEAN *Retry + ); + +typedef struct _DEVICE_EXTENSION { + + // + // Back pointer to device object + // + + PDEVICE_OBJECT DeviceObject; + + // + // Pointer to port device object + // + + PDEVICE_OBJECT PortDeviceObject; + + // + // Length of partition in bytes + // + + LARGE_INTEGER PartitionLength; + + // + // Number of bytes before start of partition + // + + LARGE_INTEGER StartingOffset; + + // + // Bytes to skew all requests, since DM Driver has been placed on an IDE drive. + // + + ULONG DMByteSkew; + + // + // Sectors to skew all requests. + // + + ULONG DMSkew; + + // + // Flag to indicate whether DM driver has been located on an IDE drive. + // + + BOOLEAN DMActive; + + // + // Pointer to the specific class error routine. + // + + PCLASS_ERROR ClassError; + + // + // SCSI port driver capabilities + // + + PIO_SCSI_CAPABILITIES PortCapabilities; + + // + // Buffer for drive parameters returned in IO device control. + // + + PDISK_GEOMETRY DiskGeometry; + + // + // Back pointer to device object of physical device + // + + PDEVICE_OBJECT PhysicalDevice; + + // + // Request Sense Buffer + // + + PSENSE_DATA SenseData; + + // + // Request timeout in seconds; + // + + ULONG TimeOutValue; + + // + // System device number + // + + ULONG DeviceNumber; + + // + // Add default Srb Flags. + // + + ULONG SrbFlags; + + // + // Total number of SCSI protocol errors on the device. + // + + ULONG ErrorCount; + + // + // Spinlock for split requests + // + + KSPIN_LOCK SplitRequestSpinLock; + + // + // Zone header and spin lock for zoned SRB requests. + // + + PZONE_HEADER SrbZone; + + PKSPIN_LOCK SrbZoneSpinLock; + + // + // Lock count for removable media. + // + + LONG LockCount; + + // + // Scsi port number + // + + UCHAR PortNumber; + + // + // SCSI path id + // + + UCHAR PathId; + + // + // SCSI bus target id + // + + UCHAR TargetId; + + // + // SCSI bus logical unit number + // + + UCHAR Lun; + + // + // Log2 of sector size + // + + UCHAR SectorShift; + + // + // Flag to indicate that the device has write caching enabled. + // + + BOOLEAN WriteCache; + + // + // Build SCSI 1 or SCSI 2 CDBs + // + + BOOLEAN UseScsi1; + +} DEVICE_EXTENSION, *PDEVICE_EXTENSION; + +// +// Define context structure for asynchronous completions. +// + +typedef struct _COMPLETION_CONTEXT { + PDEVICE_OBJECT DeviceObject; + SCSI_REQUEST_BLOCK Srb; +}COMPLETION_CONTEXT, *PCOMPLETION_CONTEXT; + + +NTSTATUS +ScsiClassGetCapabilities( + IN PDEVICE_OBJECT PortDeviceObject, + OUT PIO_SCSI_CAPABILITIES *PortCapabilities + ); + +NTSTATUS +ScsiClassGetInquiryData( + IN PDEVICE_OBJECT PortDeviceObject, + IN PSCSI_ADAPTER_BUS_INFO *ConfigInfo + ); + +NTSTATUS +ScsiClassReadDriveCapacity( + IN PDEVICE_OBJECT DeviceObject + ); + +VOID +ScsiClassReleaseQueue( + IN PDEVICE_OBJECT DeviceObject + ); + +NTSTATUS +ScsiClassRemoveDevice( + IN PDEVICE_OBJECT PortDeviceObject, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun + ); + +NTSTATUS +ScsiClassAsynchronousCompletion( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID Context + ); + +VOID +ScsiClassSplitRequest( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN ULONG MaximumBytes + ); + +NTSTATUS +ScsiClassDeviceControl( + PDEVICE_OBJECT DeviceObject, + PIRP Irp + ); + +NTSTATUS +ScsiClassIoComplete( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ); + +NTSTATUS +ScsiClassIoCompleteAssociated( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context + ); + +BOOLEAN +ScsiClassInterpretSenseInfo( + IN PDEVICE_OBJECT DeviceObject, + IN PSCSI_REQUEST_BLOCK Srb, + IN UCHAR MajorFunctionCode, + IN ULONG IoDeviceCode, + IN ULONG RetryCount, + OUT NTSTATUS *Status + ); + +NTSTATUS +ScsiClassSendSrbSynchronous( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + PVOID BufferAddress, + ULONG BufferLength, + BOOLEAN WriteToDevice + ); + +NTSTATUS +ScsiClassSendSrbAsynchronous( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + PIRP Irp, + PVOID BufferAddress, + ULONG BufferLength, + BOOLEAN WriteToDevice + ); + +VOID +ScsiClassBuildRequest( + PDEVICE_OBJECT DeviceObject, + PIRP Irp + ); + +ULONG +ScsiClassModeSense( + IN PDEVICE_OBJECT DeviceObject, + IN PCHAR ModeSenseBuffer, + IN ULONG Length, + IN UCHAR PageMode + ); + +BOOLEAN +ScsiClassModeSelect( + IN PDEVICE_OBJECT DeviceObject, + IN PCHAR ModeSelectBuffer, + IN ULONG Length, + IN BOOLEAN SavePage + ); + +PVOID +ScsiClassFindModePage( + IN PCHAR ModeSenseBuffer, + IN ULONG Length, + IN UCHAR PageMode + ); + +NTSTATUS +ScsiClassClaimDevice( + IN PDEVICE_OBJECT PortDeviceObject, + IN PSCSI_INQUIRY_DATA LunInfo, + IN BOOLEAN Release, + OUT PDEVICE_OBJECT *NewPortDeviceObject OPTIONAL + ); + +NTSTATUS +ScsiClassInternalIoControl ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +#endif /* _CLASS_ */ + diff --git a/drivers/storage/inc/ide.h b/drivers/storage/inc/ide.h new file mode 100644 index 00000000000..9c868ca587e --- /dev/null +++ b/drivers/storage/inc/ide.h @@ -0,0 +1,495 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1999 - 1999 + +Module Name: + + ide.h + +Abstract: + + These are the structures and defines that are used in the + PCI IDE mini drivers. + +Revision History: + +--*/ + + +#if !defined (___ide_h___) +#define ___ide_h___ + +#include "ideuser.h" + +#define MAX_IDE_DEVICE 2 +#define MAX_IDE_LINE 2 +#define MAX_IDE_CHANNEL 2 + +// +// Some miniports need this structure. +// IdentifyData is passed to the miniport in +// the XfermodeSelect structure +// + +// +// IDENTIFY data +// + +#pragma pack (1) +typedef struct _IDENTIFY_DATA { + USHORT GeneralConfiguration; // 00 00 + USHORT NumCylinders; // 02 1 + USHORT Reserved1; // 04 2 + USHORT NumHeads; // 06 3 + USHORT UnformattedBytesPerTrack; // 08 4 + USHORT UnformattedBytesPerSector; // 0A 5 + USHORT NumSectorsPerTrack; // 0C 6 + USHORT VendorUnique1[3]; // 0E 7-9 + UCHAR SerialNumber[20]; // 14 10-19 + USHORT BufferType; // 28 20 + USHORT BufferSectorSize; // 2A 21 + USHORT NumberOfEccBytes; // 2C 22 + UCHAR FirmwareRevision[8]; // 2E 23-26 + UCHAR ModelNumber[40]; // 36 27-46 + UCHAR MaximumBlockTransfer; // 5E 47 + UCHAR VendorUnique2; // 5F + USHORT DoubleWordIo; // 60 48 + USHORT Capabilities; // 62 49 + USHORT Reserved2; // 64 50 + UCHAR VendorUnique3; // 66 51 + UCHAR PioCycleTimingMode; // 67 + UCHAR VendorUnique4; // 68 52 + UCHAR DmaCycleTimingMode; // 69 + USHORT TranslationFieldsValid:3; // 6A 53 + USHORT Reserved3:13; + USHORT NumberOfCurrentCylinders; // 6C 54 + USHORT NumberOfCurrentHeads; // 6E 55 + USHORT CurrentSectorsPerTrack; // 70 56 + ULONG CurrentSectorCapacity; // 72 57-58 + USHORT CurrentMultiSectorSetting; // 59 + ULONG UserAddressableSectors; // 60-61 + USHORT SingleWordDMASupport : 8; // 62 + USHORT SingleWordDMAActive : 8; + USHORT MultiWordDMASupport : 8; // 63 + USHORT MultiWordDMAActive : 8; + USHORT AdvancedPIOModes : 8; // 64 + USHORT Reserved4 : 8; + USHORT MinimumMWXferCycleTime; // 65 + USHORT RecommendedMWXferCycleTime; // 66 + USHORT MinimumPIOCycleTime; // 67 + USHORT MinimumPIOCycleTimeIORDY; // 68 + USHORT Reserved5[11]; // 69-79 + USHORT MajorRevision; // 80 + USHORT MinorRevision; // 81 + USHORT Reserved6; // 82 + USHORT CommandSetSupport; // 83 + USHORT Reserved6a[2]; // 84-85 + USHORT CommandSetActive; // 86 + USHORT Reserved6b; // 87 + USHORT UltraDMASupport : 8; // 88 + USHORT UltraDMAActive : 8; // + USHORT Reserved7[11]; // 89-99 + ULONG Max48BitLBA[2]; // 100-103 + USHORT Reserved7a[22]; // 104-125 + USHORT LastLun:3; // 126 + USHORT Reserved8:13; + USHORT MediaStatusNotification:2; // 127 + USHORT Reserved9:6; + USHORT DeviceWriteProtect:1; + USHORT Reserved10:7; + USHORT Reserved11[128]; // 128-255 +} IDENTIFY_DATA, *PIDENTIFY_DATA; + +// +// Identify data without the Reserved4. +// + +//typedef struct _IDENTIFY_DATA2 { +// USHORT GeneralConfiguration; // 00 00 +// USHORT NumCylinders; // 02 1 +// USHORT Reserved1; // 04 2 +// USHORT NumHeads; // 06 3 +// USHORT UnformattedBytesPerTrack; // 08 4 +// USHORT UnformattedBytesPerSector; // 0A 5 +// USHORT NumSectorsPerTrack; // 0C 6 +// USHORT VendorUnique1[3]; // 0E 7-9 +// UCHAR SerialNumber[20]; // 14 10-19 +// USHORT BufferType; // 28 20 +// USHORT BufferSectorSize; // 2A 21 +// USHORT NumberOfEccBytes; // 2C 22 +// UCHAR FirmwareRevision[8]; // 2E 23-26 +// UCHAR ModelNumber[40]; // 36 27-46 +// UCHAR MaximumBlockTransfer; // 5E 47 +// UCHAR VendorUnique2; // 5F +// USHORT DoubleWordIo; // 60 48 +// USHORT Capabilities; // 62 49 +// USHORT Reserved2; // 64 50 +// UCHAR VendorUnique3; // 66 51 +// UCHAR PioCycleTimingMode; // 67 +// UCHAR VendorUnique4; // 68 52 +// UCHAR DmaCycleTimingMode; // 69 +// USHORT TranslationFieldsValid:3; // 6A 53 +// USHORT Reserved3:13; +// USHORT NumberOfCurrentCylinders; // 6C 54 +// USHORT NumberOfCurrentHeads; // 6E 55 +// USHORT CurrentSectorsPerTrack; // 70 56 +// ULONG CurrentSectorCapacity; // 72 57-58 +// USHORT CurrentMultiSectorSetting; // 59 +// ULONG UserAddressableSectors; // 60-61 +// USHORT SingleWordDMASupport : 8; // 62 +// USHORT SingleWordDMAActive : 8; +// USHORT MultiWordDMASupport : 8; // 63 +// USHORT MultiWordDMAActive : 8; +// USHORT AdvancedPIOModes : 8; // 64 +// USHORT Reserved4 : 8; +// USHORT MinimumMWXferCycleTime; // 65 +// USHORT RecommendedMWXferCycleTime; // 66 +// USHORT MinimumPIOCycleTime; // 67 +// USHORT MinimumPIOCycleTimeIORDY; // 68 +// USHORT Reserved5[11]; // 69-79 +// USHORT MajorRevision; // 80 +// USHORT MinorRevision; // 81 +// USHORT Reserved6[6]; // 82-87 +// USHORT UltraDMASupport : 8; // 88 +// USHORT UltraDMAActive : 8; // +// USHORT Reserved7[37]; // 89-125 +// USHORT LastLun:3; // 126 +// USHORT Reserved8:13; +// USHORT MediaStatusNotification:2; // 127 +// USHORT Reserved9:6; +// USHORT DeviceWriteProtect:1; +// USHORT Reserved10:7; +//} IDENTIFY_DATA2, *PIDENTIFY_DATA2; +#pragma pack () + +#define IDENTIFY_DATA_SIZE sizeof(IDENTIFY_DATA) + + +// +// The structure is passed to pci ide mini driver +// TransferModeSelect callback for selecting +// proper transfer mode the the devices connected +// to the given IDE channel +// +typedef struct _PCIIDE_TRANSFER_MODE_SELECT { + + // + // Input Parameters + // + + // + // IDE Channel Number. 0 or 1 + // + ULONG Channel; + + // + // Indicate whether devices are present + // + BOOLEAN DevicePresent[MAX_IDE_DEVICE * MAX_IDE_LINE]; + + // + // Indicate whether devices are ATA harddisk + // + BOOLEAN FixedDisk[MAX_IDE_DEVICE * MAX_IDE_LINE]; + + // + // Indicate whether devices support IO Ready Line + // + BOOLEAN IoReadySupported[MAX_IDE_DEVICE * MAX_IDE_LINE]; + + // + // Indicate the data transfer modes devices support + // + ULONG DeviceTransferModeSupported[MAX_IDE_DEVICE * MAX_IDE_LINE]; + + // + // Indicate devices' best timings for PIO, single word DMA, + // multiword DMA, and Ultra DMA modes + // + ULONG BestPioCycleTime[MAX_IDE_DEVICE * MAX_IDE_LINE]; + ULONG BestSwDmaCycleTime[MAX_IDE_DEVICE * MAX_IDE_LINE]; + ULONG BestMwDmaCycleTime[MAX_IDE_DEVICE * MAX_IDE_LINE]; + ULONG BestUDmaCycleTime[MAX_IDE_DEVICE * MAX_IDE_LINE]; + + // + // Indicate devices' current data transfer modes + // + ULONG DeviceTransferModeCurrent[MAX_IDE_DEVICE * MAX_IDE_LINE]; + + // + // The user's choice. This will allow pciidex to + // default to a transfer mode indicated by the mini driver + // + ULONG UserChoiceTransferMode[MAX_IDE_DEVICE * MAX_IDE_LINE]; + + // + // This enables UDMA66 on the intel chipsets + // + ULONG EnableUDMA66; + + // + //Some miniports need this + // The miniport will save this data in their deviceExtension + // + IDENTIFY_DATA IdentifyData[MAX_IDE_DEVICE]; + + + // + // Output Parameters + // + + // + // Indicate devices' data transfer modes chosen by + // the pcii ide mini drive + // + ULONG DeviceTransferModeSelected[MAX_IDE_DEVICE * MAX_IDE_LINE]; + + // + // Transfermode timings + // + PULONG TransferModeTimingTable; + ULONG TransferModeTableLength; + +} PCIIDE_TRANSFER_MODE_SELECT, *PPCIIDE_TRANSFER_MODE_SELECT; + +// +// possible ide channel state +// + +typedef enum { + ChannelDisabled = 0, + ChannelEnabled, + ChannelStateUnknown +} IDE_CHANNEL_STATE; + + +// +// Prototype for different PCI IDE mini driver +// callbacks +// +typedef IDE_CHANNEL_STATE + (*PCIIDE_CHANNEL_ENABLED) ( + IN PVOID DeviceExtension, + IN ULONG Channel + ); + +typedef BOOLEAN + (*PCIIDE_SYNC_ACCESS_REQUIRED) ( + IN PVOID DeviceExtension + ); + +typedef NTSTATUS + (*PCIIDE_TRANSFER_MODE_SELECT_FUNC) ( + IN PVOID DeviceExtension, + IN OUT PPCIIDE_TRANSFER_MODE_SELECT TransferModeSelect + ); + +typedef ULONG + (*PCIIDE_USEDMA_FUNC)( + IN PVOID deviceExtension, + IN PVOID cdbCmd, + IN UCHAR targetID + ); + +typedef NTSTATUS + (*PCIIDE_UDMA_MODES_SUPPORTED) ( + IDENTIFY_DATA IdentifyData, + PULONG BestXferMode, + PULONG CurrentMode + ); +// +// This structure is for the PCI IDE mini driver to +// return its properties +// +typedef struct _IDE_CONTROLLER_PROPERTIES { + + // + // sizeof (IDE_CONTROLLER_PROPERTIES) + // + ULONG Size; + + // + // Indicate the amount of memory PCI IDE mini driver + // needs for its private data + // + ULONG ExtensionSize; + + // + // Indicate all the data transfer modes the PCI IDE + // controller supports + // + ULONG SupportedTransferMode[MAX_IDE_CHANNEL][MAX_IDE_DEVICE]; + + // + // callback to query whether a IDE channel is enabled + // + PCIIDE_CHANNEL_ENABLED PciIdeChannelEnabled; + + // + // callback to query whether both IDE channels requires + // synchronized access. (one channel at a time) + // + PCIIDE_SYNC_ACCESS_REQUIRED PciIdeSyncAccessRequired; + + // + // callback to select proper transfer modes for the + // given devices + // + PCIIDE_TRANSFER_MODE_SELECT_FUNC PciIdeTransferModeSelect; + + // + // at the end of a ATA data transfer, ignores busmaster + // status active bit. Normally, it should be FALSE + // + BOOLEAN IgnoreActiveBitForAtaDevice; + + // + // always clear the busmaster interrupt on every interrupt + // generated by the device. Normnally, it should be FALSE + // + BOOLEAN AlwaysClearBusMasterInterrupt; + + // + // callback to determine whether DMA should be used or not + // called for every IO + // + PCIIDE_USEDMA_FUNC PciIdeUseDma; + + + // + // if the miniport needs a different alignment + // + ULONG AlignmentRequirement; + + ULONG DefaultPIO; + + // + // retrieves the supported udma modes from the Identify data + // + PCIIDE_UDMA_MODES_SUPPORTED PciIdeUdmaModesSupported; + +} IDE_CONTROLLER_PROPERTIES, *PIDE_CONTROLLER_PROPERTIES; + +// +// callback to query PCI IDE controller properties +// +typedef +NTSTATUS (*PCONTROLLER_PROPERTIES) ( + IN PVOID DeviceExtension, + IN PIDE_CONTROLLER_PROPERTIES ControllerProperties + ); + + +// +// To initailize PCI IDE mini driver +// +NTSTATUS +PciIdeXInitialize( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath, + IN PCONTROLLER_PROPERTIES PciIdeGetControllerProperties, + IN ULONG ExtensionSize + ); + +// +// To query PCI IDE config space data +// +NTSTATUS +PciIdeXGetBusData( + IN PVOID DeviceExtension, + IN PVOID Buffer, + IN ULONG ConfigDataOffset, + IN ULONG BufferLength + ); + +// +// To save PCI IDE config space data +// +NTSTATUS +PciIdeXSetBusData( + IN PVOID DeviceExtension, + IN PVOID Buffer, + IN PVOID DataMask, + IN ULONG ConfigDataOffset, + IN ULONG BufferLength + ); + + +#pragma pack(1) +typedef struct _PCIIDE_CONFIG_HEADER { + + USHORT VendorID; // (ro) + USHORT DeviceID; // (ro) + + // + // Command + // + union { + + struct { + + USHORT IoAccessEnable:1; // Device control + USHORT MemAccessEnable:1; + USHORT MasterEnable:1; + USHORT SpecialCycle:1; + USHORT MemWriteInvalidateEnable:1; + USHORT VgaPaletteSnoopEnable:1; + USHORT ParityErrorResponse:1; + USHORT WaitCycleEnable:1; + USHORT SystemErrorEnable:1; + USHORT FastBackToBackEnable:1; + USHORT CommandReserved:6; + } b; + + USHORT w; + + } Command; + + + USHORT Status; + UCHAR RevisionID; // (ro) + + // + // Program Interface + // + UCHAR Chan0OpMode:1; + UCHAR Chan0Programmable:1; + UCHAR Chan1OpMode:1; + UCHAR Chan1Programmable:1; + UCHAR ProgIfReserved:3; + UCHAR MasterIde:1; + + UCHAR SubClass; // (ro) + UCHAR BaseClass; // (ro) + UCHAR CacheLineSize; // (ro+) + UCHAR LatencyTimer; // (ro+) + UCHAR HeaderType; // (ro) + UCHAR BIST; // Built in self test + + struct _PCI_HEADER_TYPE_0 type0; + +} PCIIDE_CONFIG_HEADER, *PPCIIDE_CONFIG_HEADER; +#pragma pack() + +// +// Debug Print +// +#if DBG + +VOID +PciIdeXDebugPrint( + ULONG DebugPrintLevel, + PCCHAR DebugMessage, + ... + ); + +#define PciIdeXDebugPrint(x) PciIdeXDebugPrint x + +#else + +#define PciIdeXDebugPrint(x) + +#endif // DBG + +#endif // ___ide_h___ + diff --git a/drivers/storage/inc/ideuser.h b/drivers/storage/inc/ideuser.h new file mode 100644 index 00000000000..babde7162f2 --- /dev/null +++ b/drivers/storage/inc/ideuser.h @@ -0,0 +1,132 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1999 - 1999 + +Module Name: + + ideuser.h + +Abstract: + + These are the structures and defines that are used in the + PCI IDE mini drivers. + +Revision History: + +--*/ + +#if !defined (___ideuser_h___) +#define ___ideuser_h___ + + +#define PIO_MODE0 (1 << 0) +#define PIO_MODE1 (1 << 1) +#define PIO_MODE2 (1 << 2) +#define PIO_MODE3 (1 << 3) +#define PIO_MODE4 (1 << 4) + +#define SWDMA_MODE0 (1 << 5) +#define SWDMA_MODE1 (1 << 6) +#define SWDMA_MODE2 (1 << 7) + +#define MWDMA_MODE0 (1 << 8) +#define MWDMA_MODE1 (1 << 9) +#define MWDMA_MODE2 (1 << 10) + +#define UDMA_MODE0 (1 << 11) +#define UDMA_MODE1 (1 << 12) +#define UDMA_MODE2 (1 << 13) +#define UDMA_MODE3 (1 << 14) +#define UDMA_MODE4 (1 << 15) +#define UDMA_MODE5 (1 << 16) + +#define PIO_SUPPORT (PIO_MODE0 | PIO_MODE1 | PIO_MODE2 | PIO_MODE3 | PIO_MODE4) +#define SWDMA_SUPPORT (SWDMA_MODE0 | SWDMA_MODE1 | SWDMA_MODE2) +#define MWDMA_SUPPORT (MWDMA_MODE0 | MWDMA_MODE1 | MWDMA_MODE2) +#define UDMA33_SUPPORT (UDMA_MODE0 | UDMA_MODE1 | UDMA_MODE2) +#define UDMA66_SUPPORT (UDMA_MODE3 | UDMA_MODE4) +#define UDMA100_SUPPORT (UDMA_MODE5 ) +#define UDMA_SUPPORT (UNINITIALIZED_TRANSFER_MODE & (~(PIO_SUPPORT | SWDMA_SUPPORT | MWDMA_SUPPORT))) + +#define DMA_SUPPORT (SWDMA_SUPPORT | MWDMA_SUPPORT | UDMA_SUPPORT) +#define ALL_MODE_SUPPORT (PIO_SUPPORT | DMA_SUPPORT) + +#define PIO0 0 +#define PIO1 1 +#define PIO2 2 +#define PIO3 3 +#define PIO4 4 +#define SWDMA0 5 +#define SWDMA1 6 +#define SWDMA2 7 +#define MWDMA0 8 +#define MWDMA1 9 +#define MWDMA2 10 +#define UDMA0 11 + +#define MAX_XFER_MODE 17 +#define UNINITIALIZED_CYCLE_TIME 0xffffffff +#define UNINITIALIZED_TRANSFER_MODE 0x7fffffff +#define IS_DEFAULT(mode) (!(mode & 0x80000000)) + +#define GenTransferModeMask(i, mode) {\ + ULONG temp=0xffffffff; \ + mode |= (temp >> (31-(i)));\ +} + +// +// mode should not be 0 +// +#define GetHighestTransferMode(mode, i) {\ + ULONG temp=(mode); \ + ASSERT(temp); \ + i=0; \ + while ( temp) { \ + temp = (temp >> 1);\ + i++;\ + } \ + i--; \ +} + +#define GetHighestDMATransferMode(mode, i) {\ + ULONG temp=mode >> 5;\ + i=5; \ + while ( temp) { \ + temp = (temp >> 1); \ + i++; \ + } \ + i--; \ +} +#define GetHighestPIOTransferMode(mode, i) { \ + ULONG temp = (mode & PIO_SUPPORT); \ + i=0; \ + temp = temp >> 1; \ + while (temp) { \ + temp = temp >> 1; \ + i++; \ + } \ +} + +#define SetDefaultTiming(timingTable, length) {\ + timingTable[0]=PIO_MODE0_CYCLE_TIME; \ + timingTable[1]=PIO_MODE1_CYCLE_TIME; \ + timingTable[2]=PIO_MODE2_CYCLE_TIME; \ + timingTable[3]=PIO_MODE3_CYCLE_TIME; \ + timingTable[4]=PIO_MODE4_CYCLE_TIME; \ + timingTable[5]=SWDMA_MODE0_CYCLE_TIME; \ + timingTable[6]=SWDMA_MODE1_CYCLE_TIME; \ + timingTable[7]=SWDMA_MODE2_CYCLE_TIME; \ + timingTable[8]=MWDMA_MODE0_CYCLE_TIME; \ + timingTable[9]=MWDMA_MODE1_CYCLE_TIME; \ + timingTable[10]=MWDMA_MODE2_CYCLE_TIME; \ + timingTable[11]=UDMA_MODE0_CYCLE_TIME; \ + timingTable[12]=UDMA_MODE1_CYCLE_TIME; \ + timingTable[13]=UDMA_MODE2_CYCLE_TIME; \ + timingTable[14]=UDMA_MODE3_CYCLE_TIME; \ + timingTable[15]=UDMA_MODE4_CYCLE_TIME; \ + timingTable[16]=UDMA_MODE5_CYCLE_TIME; \ + length = MAX_XFER_MODE; \ +} + +#endif // ___ideuser_h___ + diff --git a/drivers/storage/inc/physlogi.h b/drivers/storage/inc/physlogi.h new file mode 100644 index 00000000000..57e71e0c7c8 --- /dev/null +++ b/drivers/storage/inc/physlogi.h @@ -0,0 +1,115 @@ +/*++ + +Copyright (c) 1992 Microsoft Corporation + +Module Name: + + physlogi.h + +Abstract: + + This file contains structures and defines that are used + specifically for the tape drivers. Contains #define's, + function protypes, etc. for use in calling functions in + physlogi.c that do physical to pseudo-logical and pseudo- + logical to physical tape block address/position translation. + +Author: + + Mike Colandreo (Maynard) + +Revision History: + +--*/ + +// begin_ntminitape + +// +// defines for QIC tape density codes +// + +#define QIC_XX 0 // ???? +#define QIC_24 5 // 0x05 +#define QIC_120 15 // 0x0F +#define QIC_150 16 // 0x10 +#define QIC_525 17 // 0x11 +#define QIC_1350 18 // 0x12 +#define QIC_1000 21 // 0x15 +#define QIC_1000C 30 // 0x1E +#define QIC_2100 31 // 0x1F +#define QIC_2GB 34 // 0x22 +#define QIC_5GB 40 // 0x28 + +// +// defines for QIC tape media codes +// + +#define DCXXXX 0 +#define DC300 1 +#define DC300XLP 2 +#define DC615 3 +#define DC600 4 +#define DC6037 5 +#define DC6150 6 +#define DC6250 7 +#define DC6320 8 +#define DC6525 9 +#define DC9135SL 33 //0x21 +#define DC9210 34 //0x22 +#define DC9135 35 //0x23 +#define DC9100 36 //0x24 +#define DC9120 37 //0x25 +#define DC9120SL 38 //0x26 +#define DC9164 39 //0x27 +#define DCXXXXFW 48 //0x30 +#define DC9200SL 49 //0x31 +#define DC9210XL 50 //0x32 +#define DC10GB 51 //0x33 +#define DC9200 52 //0x34 +#define DC9120XL 53 //0x35 +#define DC9210SL 54 //0x36 +#define DC9164XL 55 //0x37 +#define DC9200XL 64 //0x40 +#define DC9400 65 //0x41 +#define DC9500 66 //0x42 +#define DC9500SL 70 //0x46 + +// +// defines for translation reference point +// + +#define NOT_FROM_BOT 0 +#define FROM_BOT 1 + +// +// info/structure returned by/from +// TapeLogicalBlockToPhysicalBlock( ) +// + +typedef struct _TAPE_PHYS_POSITION { + ULONG SeekBlockAddress; + ULONG SpaceBlockCount; +} TAPE_PHYS_POSITION, PTAPE_PHYS_POSITION; + +// +// function prototypes +// + +TAPE_PHYS_POSITION +TapeClassLogicalBlockToPhysicalBlock( + IN UCHAR DensityCode, + IN ULONG LogicalBlockAddress, + IN ULONG BlockLength, + IN BOOLEAN FromBOT + ); + +ULONG +TapeClassPhysicalBlockToLogicalBlock( + IN UCHAR DensityCode, + IN ULONG PhysicalBlockAddress, + IN ULONG BlockLength, + IN BOOLEAN FromBOT + ); + +// end_ntminitape + diff --git a/drivers/storage/inc/rbc.h b/drivers/storage/inc/rbc.h new file mode 100644 index 00000000000..5afa8bb1d7a --- /dev/null +++ b/drivers/storage/inc/rbc.h @@ -0,0 +1,180 @@ +/*++ + +Copyright (C) Microsoft Corporation, 1998 - 1999 + +Module Name: + + rbc.h + +Abstract: + + These are the structures and defines used in the Reduced Block Command set + +Authors: + + George Chrysanthakopoulos(georgioc) - April 1998 + +Revision History: + + Dan Knudson (DanKn), 23 Sep 1999 - updated per rev 10 of RBC spec + +--*/ +#ifndef _NTRBC_ +#define _NTRBC_ + +#include "scsi.h" + +// +// Command Descriptor Block. encapsulated under the bus/protocol specific request block +// + +typedef union _CDB_RBC { + + // + // format unit + // + + struct _FORMAT_RBC { + UCHAR OperationCode; + UCHAR VendorSpecific; + UCHAR Increment : 1; + UCHAR Percent_Time : 1; + UCHAR Reserved1 : 1; + UCHAR VendorSpecific1 : 5; + UCHAR Reserved2[2]; + UCHAR Control; + } FORMAT_RBC, *PFORMAT_RBC; + + // + // prevent/allow medium removal + // + + struct _MEDIA_REMOVAL_RBC { + UCHAR OperationCode; + UCHAR Reserved[3]; + + UCHAR Prevent : 1; + UCHAR Persistant : 1; + UCHAR Reserved3 : 6; + + UCHAR Control; + } MEDIA_REMOVAL_RBC, *PMEDIA_REMOVAL_RBC; + + // + // START_STOP_UNIT + // + + struct _START_STOP_RBC { + UCHAR OperationCode; + UCHAR Immediate: 1; + UCHAR Reserved1 : 7; + UCHAR Reserved2[2]; + UCHAR Start : 1; + UCHAR LoadEject : 1; + UCHAR Reserved3 : 2; + UCHAR PowerConditions : 4; + UCHAR Control; + } START_STOP_RBC, *PSTART_STOP_RBC; + + struct _SYNCHRONIZE_CACHE_RBC { + + UCHAR OperationCode; // 0x35 + UCHAR Reserved[8]; + UCHAR Control; + + } SYNCHRONIZE_CACHE_RBC, *PSYNCHRONIZE_CACHE_RBC; + + +} CDB_RBC, *PCDB_RBC; + + +// +// START_STOP_UNIT Power Condition descriptions +// + +#define START_STOP_RBC_POWER_CND_NO_CHANGE 0 +#define START_STOP_RBC_POWER_CND_ACTIVE 1 +#define START_STOP_RBC_POWER_CND_IDLE 2 +#define START_STOP_RBC_POWER_CND_STANDBY 3 +#define START_STOP_RBC_POWER_CND_SLEEP 5 +#define START_STOP_RBC_POWER_CND_DEVICE_CTRL 7 + + +// +// Mode Sense/Select page constants. +// + +#define MODE_PAGE_RBC_DEVICE_PARAMETERS 0x06 + + +// +// DeviceType field in inquiry Data +// + +#define RBC_DEVICE 0x0E + +// +// Define Device Capabilities page. +// + +typedef struct _MODE_RBC_DEVICE_PARAMETERS_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved : 1; + UCHAR PageSavable : 1; + UCHAR PageLength; + UCHAR WriteCacheDisable : 1; + UCHAR Reserved1 : 7; + UCHAR LogicalBlockSize[2]; + UCHAR NumberOfLogicalBlocks[5]; + UCHAR PowerPerformance; + UCHAR LockDisabled : 1; + UCHAR FormatDisabled : 1; + UCHAR WriteDisabled : 1; + UCHAR ReadDisabled : 1; + UCHAR Reserved2 : 4; + UCHAR Reserved3; + +}MODE_RBC_DEVICE_PARAMETERS_PAGE, *PMODE_RBC_DEVICE_PARAMETERS_PAGE; + +typedef struct _MODE_RBC_DEVICE_PARAMETERS_HEADER_AND_PAGE { + + MODE_PARAMETER_HEADER Header; + MODE_RBC_DEVICE_PARAMETERS_PAGE Page; + +}MODE_RBC_DEVICE_PARAMETERS_HEADER_AND_PAGE, + *PMODE_RBC_DEVICE_PARAMETERS_HEADER_AND_PAGE; + + +// +// unsolicited status sense code qualifier values +// + +#define RBC_UNSOLICITED_STATUS 0x02 +#define RBC_UNSOLICITED_SENSE_KEY 0x06 + +#define RBC_UNSOLICITED_SC_PWR_STATE_CHNG 0xFF +#define RBC_UNSOLICITED_SC_EVENT_STATUS 0xFE + +#define RBC_UNSOLICITED_CLASS_ASQ_DEVICE 0x06 +#define RBC_UNSOLICITED_CLASS_ASQ_MEDIA 0x04 +#define RBC_UNSOLICITED_CLASS_ASQ_POWER 0x02 + + + + +// +// Translation routine used to convert SCSI requests that differ from RBC +// + +NTSTATUS +Rbc_Scsi_Conversion( + IN PSCSI_REQUEST_BLOCK Srb, + IN PSCSI_REQUEST_BLOCK *OriginalSrb, + IN PMODE_RBC_DEVICE_PARAMETERS_HEADER_AND_PAGE RbcHeaderAndPage, + IN BOOLEAN OutgoingRequest, + IN BOOLEAN RemovableMedia + ); + + +#endif + diff --git a/drivers/storage/inc/tape.h b/drivers/storage/inc/tape.h new file mode 100644 index 00000000000..2f11917a24c --- /dev/null +++ b/drivers/storage/inc/tape.h @@ -0,0 +1,312 @@ +/*++ + +Copyright (c) 1992 Microsoft Corporation + +Module Name: + + tape.h + +Abstract: + + These are the structures and defines that are used in the + SCSI tape class drivers. The tape class driver is separated + into two modules. Tape.c contains code common to all tape + class drivers including the driver's major entry points. + The major entry point names each begin with the prefix + 'ScsiTape.' The second module is the device specific code. + It provides support for a set of functions. Each device + specific function name is prefixed by 'Tape.' + +Author: + + Mike Glass + +Revision History: + +--*/ + +#include "scsi.h" +#include "class.h" + +// +// Define the maximum inquiry data length. +// + +#define MAXIMUM_TAPE_INQUIRY_DATA 252 + +// +// Tape device data +// + +typedef struct _TAPE_DATA { + ULONG Flags; + ULONG CurrentPartition; + PVOID DeviceSpecificExtension; + PSCSI_INQUIRY_DATA InquiryData; +} TAPE_DATA, *PTAPE_DATA; + +#define DEVICE_EXTENSION_SIZE sizeof(DEVICE_EXTENSION) + sizeof(TAPE_DATA) + + +// +// Define Device Configuration Page +// + +typedef struct _MODE_DEVICE_CONFIGURATION_PAGE { + + UCHAR PageCode : 6; + UCHAR Reserved1 : 1; + UCHAR PS : 1; + UCHAR PageLength; + UCHAR ActiveFormat : 5; + UCHAR CAFBit : 1; + UCHAR CAPBit : 1; + UCHAR Reserved2 : 1; + UCHAR ActivePartition; + UCHAR WriteBufferFullRatio; + UCHAR ReadBufferEmptyRatio; + UCHAR WriteDelayTime[2]; + UCHAR REW : 1; + UCHAR RBO : 1; + UCHAR SOCF : 2; + UCHAR AVC : 1; + UCHAR RSmk : 1; + UCHAR BIS : 1; + UCHAR DBR : 1; + UCHAR GapSize; + UCHAR Reserved3 : 3; + UCHAR SEW : 1; + UCHAR EEG : 1; + UCHAR EODdefined : 3; + UCHAR BufferSize[3]; + UCHAR DCAlgorithm; + UCHAR Reserved4; + +} MODE_DEVICE_CONFIGURATION_PAGE, *PMODE_DEVICE_CONFIGURATION_PAGE; + +// +// Define Medium Partition Page +// + +typedef struct _MODE_MEDIUM_PARTITION_PAGE { + + UCHAR PageCode : 6; + UCHAR Reserved1 : 1; + UCHAR PSBit : 1; + UCHAR PageLength; + UCHAR MaximumAdditionalPartitions; + UCHAR AdditionalPartitionDefined; + UCHAR Reserved2 : 3; + UCHAR PSUMBit : 2; + UCHAR IDPBit : 1; + UCHAR SDPBit : 1; + UCHAR FDPBit : 1; + UCHAR MediumFormatRecognition; + UCHAR Reserved3[2]; + UCHAR Partition0Size[2]; + UCHAR Partition1Size[2]; + +} MODE_MEDIUM_PARTITION_PAGE, *PMODE_MEDIUM_PARTITION_PAGE; + +// +// Define Data Compression Page +// + +typedef struct _MODE_DATA_COMPRESSION_PAGE { + + UCHAR PageCode : 6; + UCHAR Reserved1 : 2; + UCHAR PageLength; + UCHAR Reserved2 : 6; + UCHAR DCC : 1; + UCHAR DCE : 1; + UCHAR Reserved3 : 5; + UCHAR RED : 2; + UCHAR DDE : 1; + UCHAR CompressionAlgorithm[4]; + UCHAR DecompressionAlgorithm[4]; + UCHAR Reserved4[4]; + +} MODE_DATA_COMPRESSION_PAGE, *PMODE_DATA_COMPRESSION_PAGE; + +// +// Mode parameter list header and medium partition page - +// used in creating partitions +// + +typedef struct _MODE_MEDIUM_PART_PAGE { + + MODE_PARAMETER_HEADER ParameterListHeader; + MODE_MEDIUM_PARTITION_PAGE MediumPartPage; + +} MODE_MEDIUM_PART_PAGE, *PMODE_MEDIUM_PART_PAGE; + + +// +// Mode parameters for retrieving tape or media information +// + +typedef struct _MODE_TAPE_MEDIA_INFORMATION { + + MODE_PARAMETER_HEADER ParameterListHeader; + MODE_PARAMETER_BLOCK ParameterListBlock; + MODE_MEDIUM_PARTITION_PAGE MediumPartPage; + +} MODE_TAPE_MEDIA_INFORMATION, *PMODE_TAPE_MEDIA_INFORMATION; + +// +// Mode parameter list header and device configuration page - +// used in retrieving device configuration information +// + +typedef struct _MODE_DEVICE_CONFIG_PAGE { + + MODE_PARAMETER_HEADER ParameterListHeader; + MODE_DEVICE_CONFIGURATION_PAGE DeviceConfigPage; + +} MODE_DEVICE_CONFIG_PAGE, *PMODE_DEVICE_CONFIG_PAGE; + + +// +// Mode parameter list header and data compression page - +// used in retrieving data compression information +// + +typedef struct _MODE_DATA_COMPRESS_PAGE { + + MODE_PARAMETER_HEADER ParameterListHeader; + MODE_DATA_COMPRESSION_PAGE DataCompressPage; + +} MODE_DATA_COMPRESS_PAGE, *PMODE_DATA_COMPRESS_PAGE; + + + +// +// The following routines are the exported entry points for +// all tape class drivers. Note all these routines name start +// with 'ScsiTape.' +// + +NTSTATUS +DriverEntry( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath + ); + +NTSTATUS +ScsiTapeInitialize( + IN PDRIVER_OBJECT DriverObject + ); + +NTSTATUS +ScsiTapeCreate ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +ScsiTapeReadWrite ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +ScsiTapeDeviceControl( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + + + +// +// The following routines are provided by the tape +// device-specific module. Each routine name is +// prefixed with 'Tape.' + +NTSTATUS +TapeCreatePartition( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +TapeErase( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +VOID +TapeError( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + NTSTATUS *Status, + BOOLEAN *Retry + ); + +NTSTATUS +TapeGetDriveParameters( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +TapeGetMediaParameters( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +TapeGetPosition( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +TapeGetStatus( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +TapePrepare( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +TapeReadWrite( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +TapeSetDriveParameters( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +TapeSetMediaParameters( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS +TapeSetPosition( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +BOOLEAN +TapeVerifyInquiry( + IN PSCSI_INQUIRY_DATA LunInfo + ); + +NTSTATUS +TapeWriteMarks( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + + + diff --git a/drivers/storage/scsiport/scsiport.c b/drivers/storage/scsiport/scsiport.c index 74b787bfb12..817d9de3866 100644 --- a/drivers/storage/scsiport/scsiport.c +++ b/drivers/storage/scsiport/scsiport.c @@ -1041,10 +1041,8 @@ ScsiPortInitialize(IN PVOID Argument1, WCHAR DosNameBuffer[80]; UNICODE_STRING DosDeviceName; PIO_SCSI_CAPABILITIES PortCapabilities; - ULONG MappedIrq; - KIRQL Dirql; - KAFFINITY Affinity; + KIRQL OldIrql; PCM_RESOURCE_LIST ResourceList; BOOLEAN Conflict; @@ -1137,6 +1135,7 @@ ScsiPortInitialize(IN PVOID Argument1, /* Fill Device Extension */ DeviceExtension = PortDeviceObject->DeviceExtension; + RtlZeroMemory(DeviceExtension, DeviceExtensionSize); DeviceExtension->Length = DeviceExtensionSize; DeviceExtension->DeviceObject = PortDeviceObject; DeviceExtension->PortNumber = SystemConfig->ScsiPortCount; @@ -1509,45 +1508,55 @@ CreatePortConfig: (PortConfig->BusInterruptLevel == 0 && PortConfig->BusInterruptVector == 0)) { /* No interrupts */ - KeInitializeSpinLock(&DeviceExtension->IrqLock); + DeviceExtension->InterruptCount = 0; - /* FIXME: Use synchronization routine */ - ASSERT("No interrupts branch requires changes in synchronization\n"); + DPRINT1("Interrupt Count: 0\n"); - DeviceExtension->Interrupt = (PVOID)DeviceExtension; - DPRINT("No interrupts\n"); + UNIMPLEMENTED; + /* This code path will ALWAYS crash so stop it now */ + while(TRUE); } else { - /* Are 2 interrupts needed? */ - if (DeviceExtension->HwInterrupt != NULL && - (PortConfig->BusInterruptLevel != 0 || PortConfig->BusInterruptVector != 0) && - (PortConfig->BusInterruptLevel2 != 0 || PortConfig->BusInterruptVector2 != 0)) + BOOLEAN InterruptShareable; + KINTERRUPT_MODE InterruptMode[2]; + ULONG InterruptVector[2], i, MappedIrq[2]; + KIRQL Dirql[2], MaxDirql; + KAFFINITY Affinity[2]; + + DeviceExtension->InterruptLevel[0] = PortConfig->BusInterruptLevel; + DeviceExtension->InterruptLevel[1] = PortConfig->BusInterruptLevel2; + + InterruptVector[0] = PortConfig->BusInterruptVector; + InterruptVector[1] = PortConfig->BusInterruptVector2; + + InterruptMode[0] = PortConfig->InterruptMode; + InterruptMode[1] = PortConfig->InterruptMode2; + + DeviceExtension->InterruptCount = (PortConfig->BusInterruptLevel2 != 0 || PortConfig->BusInterruptVector2 != 0) ? 2 : 1; + + for (i = 0; i < DeviceExtension->InterruptCount; i++) { - DPRINT1("2 interrupts requested! Not yet supported\n"); - ASSERT(FALSE); - } - else - { - BOOLEAN InterruptShareable; - - /* No, only 1 interrupt */ - DPRINT("1 interrupt, IRQ is %d\n", PortConfig->BusInterruptLevel); - - DeviceExtension->InterruptLevel = PortConfig->BusInterruptLevel; - /* Register an interrupt handler for this device */ - MappedIrq = HalGetInterruptVector(PortConfig->AdapterInterfaceType, - PortConfig->SystemIoBusNumber, - PortConfig->BusInterruptLevel, - PortConfig->BusInterruptVector, - &Dirql, - &Affinity); - + MappedIrq[i] = HalGetInterruptVector(PortConfig->AdapterInterfaceType, + PortConfig->SystemIoBusNumber, + DeviceExtension->InterruptLevel[i], + InterruptVector[i], + &Dirql[i], + &Affinity[i]); + } + + if (DeviceExtension->InterruptCount == 1 || Dirql[0] > Dirql[1]) + MaxDirql = Dirql[0]; + else + MaxDirql = Dirql[1]; + + for (i = 0; i < DeviceExtension->InterruptCount; i++) + { /* Determing IRQ sharability as usual */ if (PortConfig->AdapterInterfaceType == MicroChannel || - PortConfig->InterruptMode == LevelSensitive) + InterruptMode[i] == LevelSensitive) { InterruptShareable = TRUE; } @@ -1556,27 +1565,29 @@ CreatePortConfig: InterruptShareable = FALSE; } - Status = IoConnectInterrupt(&DeviceExtension->Interrupt, + Status = IoConnectInterrupt(&DeviceExtension->Interrupt[i], (PKSERVICE_ROUTINE)ScsiPortIsr, DeviceExtension, - NULL, - MappedIrq, - Dirql, - Dirql, - PortConfig->InterruptMode, + &DeviceExtension->IrqLock, + MappedIrq[i], + Dirql[i], + MaxDirql, + InterruptMode[i], InterruptShareable, - Affinity, + Affinity[i], FALSE); if (!(NT_SUCCESS(Status))) { DPRINT1("Could not connect interrupt %d\n", - PortConfig->BusInterruptVector); - DeviceExtension->Interrupt = NULL; + InterruptVector[i]); + DeviceExtension->Interrupt[i] = NULL; break; } - } + + if (!NT_SUCCESS(Status)) + break; } /* Save IoAddress (from access ranges) */ @@ -1607,14 +1618,14 @@ CreatePortConfig: } /* Call HwInitialize at DISPATCH_LEVEL */ - KeRaiseIrql(DISPATCH_LEVEL, &Dirql); + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); - if (!KeSynchronizeExecution(DeviceExtension->Interrupt, + if (!KeSynchronizeExecution(DeviceExtension->Interrupt[0], DeviceExtension->HwInitialize, DeviceExtension->MiniPortDeviceExtension)) { DPRINT1("HwInitialize() failed!\n"); - KeLowerIrql(Dirql); + KeLowerIrql(OldIrql); Status = STATUS_ADAPTER_HARDWARE_ERROR; break; } @@ -1630,7 +1641,7 @@ CreatePortConfig: } /* Lower irql back to what it was */ - KeLowerIrql(Dirql); + KeLowerIrql(OldIrql); /* Start our timer */ IoStartTimer(PortDeviceObject); @@ -1720,11 +1731,14 @@ SpiCleanupAfterInit(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension) if (DeviceExtension == NULL) return; - /* Stop the timer and disconnect the interrupt */ - if (DeviceExtension->Interrupt) + /* Stop the timer */ + IoStopTimer(DeviceExtension->DeviceObject); + + /* Disconnect the interrupts */ + while (DeviceExtension->InterruptCount) { - IoStopTimer(DeviceExtension->DeviceObject); - IoDisconnectInterrupt(DeviceExtension->Interrupt); + if (DeviceExtension->Interrupt[--DeviceExtension->InterruptCount]) + IoDisconnectInterrupt(DeviceExtension->Interrupt[DeviceExtension->InterruptCount]); } /* Delete ConfigInfo */ @@ -2042,6 +2056,8 @@ SpiResourceToConfig(IN PHW_INITIALIZATION_DATA HwInitializationData, PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialData; ULONG RangeNumber; ULONG Index; + ULONG Interrupt = 0; + ULONG Dma = 0; RangeNumber = 0; @@ -2081,24 +2097,71 @@ SpiResourceToConfig(IN PHW_INITIALIZATION_DATA HwInitializationData, break; case CmResourceTypeInterrupt: - /* Copy interrupt data */ - PortConfig->BusInterruptLevel = PartialData->u.Interrupt.Level; - PortConfig->BusInterruptVector = PartialData->u.Interrupt.Vector; - /* Set interrupt mode accordingly to the resource */ - if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LATCHED) + if (Interrupt == 0) { - PortConfig->InterruptMode = Latched; + /* Copy interrupt data */ + PortConfig->BusInterruptLevel = PartialData->u.Interrupt.Level; + PortConfig->BusInterruptVector = PartialData->u.Interrupt.Vector; + + /* Set interrupt mode accordingly to the resource */ + if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LATCHED) + { + PortConfig->InterruptMode = Latched; + } + else if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE) + { + PortConfig->InterruptMode = LevelSensitive; + } } - else if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE) + else if (Interrupt == 1) { - PortConfig->InterruptMode = LevelSensitive; + /* Copy interrupt data */ + PortConfig->BusInterruptLevel2 = PartialData->u.Interrupt.Level; + PortConfig->BusInterruptVector2 = PartialData->u.Interrupt.Vector; + + /* Set interrupt mode accordingly to the resource */ + if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LATCHED) + { + PortConfig->InterruptMode2 = Latched; + } + else if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE) + { + PortConfig->InterruptMode2 = LevelSensitive; + } } + + Interrupt++; break; case CmResourceTypeDma: - PortConfig->DmaChannel = PartialData->u.Dma.Channel; - PortConfig->DmaPort = PartialData->u.Dma.Port; + + if (Dma == 0) + { + PortConfig->DmaChannel = PartialData->u.Dma.Channel; + PortConfig->DmaPort = PartialData->u.Dma.Port; + + if (PartialData->Flags & CM_RESOURCE_DMA_8) + PortConfig->DmaWidth = Width8Bits; + else if ((PartialData->Flags & CM_RESOURCE_DMA_16) || + (PartialData->Flags & CM_RESOURCE_DMA_8_AND_16)) //??? + PortConfig->DmaWidth = Width16Bits; + else if (PartialData->Flags & CM_RESOURCE_DMA_32) + PortConfig->DmaWidth = Width32Bits; + } + else if (Dma == 1) + { + PortConfig->DmaChannel2 = PartialData->u.Dma.Channel; + PortConfig->DmaPort2 = PartialData->u.Dma.Port; + + if (PartialData->Flags & CM_RESOURCE_DMA_8) + PortConfig->DmaWidth2 = Width8Bits; + else if ((PartialData->Flags & CM_RESOURCE_DMA_16) || + (PartialData->Flags & CM_RESOURCE_DMA_8_AND_16)) //??? + PortConfig->DmaWidth2 = Width16Bits; + else if (PartialData->Flags & CM_RESOURCE_DMA_32) + PortConfig->DmaWidth2 = Width32Bits; + } break; } } @@ -2112,9 +2175,8 @@ SpiConfigToResource(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, PCM_RESOURCE_LIST ResourceList; PCM_PARTIAL_RESOURCE_DESCRIPTOR ResourceDescriptor; PACCESS_RANGE AccessRange; - BOOLEAN Dma; ULONG ListLength = 0, i, FullSize; - ULONG Interrupt; + ULONG Interrupt, Dma; /* Get current Atdisk usage from the system */ ConfigInfo = IoGetConfigurationInformation(); @@ -2129,34 +2191,21 @@ SpiConfigToResource(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, if (PortConfig->DmaChannel != SP_UNINITIALIZED_VALUE || PortConfig->DmaPort != SP_UNINITIALIZED_VALUE) { - Dma = TRUE; - ListLength++; + Dma = 1; + + if (PortConfig->DmaChannel2 != SP_UNINITIALIZED_VALUE || + PortConfig->DmaPort2 != SP_UNINITIALIZED_VALUE) + Dma++; } else { - Dma = FALSE; + Dma = 0; } + ListLength += Dma; /* How many interrupts to we have? */ - if (DeviceExtension->HwInterrupt == NULL || - (PortConfig->BusInterruptLevel == 0 && - PortConfig->BusInterruptVector == 0)) - { - Interrupt = 0; - } - else - { - Interrupt = 1; - ListLength++; - } - - if (DeviceExtension->HwInterrupt != NULL && - (PortConfig->BusInterruptLevel2 != 0 || - PortConfig->BusInterruptVector2 != 0)) - { - Interrupt++; - ListLength++; - } + Interrupt = DeviceExtension->InterruptCount; + ListLength += Interrupt; /* How many access ranges do we use? */ AccessRange = &((*(PortConfig->AccessRanges))[0]); @@ -2216,12 +2265,12 @@ SpiConfigToResource(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, } /* If we use interrupt(s), copy them */ - if (Interrupt) + while (Interrupt) { ResourceDescriptor->Type = CmResourceTypeInterrupt; if (PortConfig->AdapterInterfaceType == MicroChannel || - PortConfig->InterruptMode == LevelSensitive) + ((Interrupt == 2) ? PortConfig->InterruptMode2 : PortConfig->InterruptMode) == LevelSensitive) { ResourceDescriptor->ShareDisposition = CmResourceShareShared; ResourceDescriptor->Flags = CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE; @@ -2232,53 +2281,38 @@ SpiConfigToResource(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, ResourceDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; } - ResourceDescriptor->u.Interrupt.Level = PortConfig->BusInterruptLevel; - ResourceDescriptor->u.Interrupt.Vector = PortConfig->BusInterruptVector; + ResourceDescriptor->u.Interrupt.Level = (Interrupt == 2) ? PortConfig->BusInterruptLevel2 : PortConfig->BusInterruptLevel; + ResourceDescriptor->u.Interrupt.Vector = (Interrupt == 2) ? PortConfig->BusInterruptVector2 : PortConfig->BusInterruptVector; ResourceDescriptor->u.Interrupt.Affinity = 0; ResourceDescriptor++; Interrupt--; } - /* Copy 2nd interrupt - FIXME: Stupid code duplication, remove */ - if (Interrupt) - { - ResourceDescriptor->Type = CmResourceTypeInterrupt; - - if (PortConfig->AdapterInterfaceType == MicroChannel || - PortConfig->InterruptMode == LevelSensitive) - { - ResourceDescriptor->ShareDisposition = CmResourceShareShared; - ResourceDescriptor->Flags = CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE; - } - else - { - ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive; - ResourceDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; - } - - ResourceDescriptor->u.Interrupt.Level = PortConfig->BusInterruptLevel; - ResourceDescriptor->u.Interrupt.Vector = PortConfig->BusInterruptVector; - ResourceDescriptor->u.Interrupt.Affinity = 0; - - ResourceDescriptor++; - } - /* Copy DMA data */ - if (Dma) + while (Dma) { ResourceDescriptor->Type = CmResourceTypeDma; ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive; - ResourceDescriptor->u.Dma.Channel = PortConfig->DmaChannel; - ResourceDescriptor->u.Dma.Port = PortConfig->DmaPort; + ResourceDescriptor->u.Dma.Channel = (Dma == 2) ? PortConfig->DmaChannel2 : PortConfig->DmaChannel; + ResourceDescriptor->u.Dma.Port = (Dma == 2) ? PortConfig->DmaPort2 : PortConfig->DmaPort; ResourceDescriptor->Flags = 0; + + if (((Dma == 2) ? PortConfig->DmaWidth2 : PortConfig->DmaWidth) == Width8Bits) + ResourceDescriptor->Flags |= CM_RESOURCE_DMA_8; + else if (((Dma == 2) ? PortConfig->DmaWidth2 : PortConfig->DmaWidth) == Width16Bits) + ResourceDescriptor->Flags |= CM_RESOURCE_DMA_16; + else + ResourceDescriptor->Flags |= CM_RESOURCE_DMA_32; - if (PortConfig->DmaChannel == SP_UNINITIALIZED_VALUE) + if (((Dma == 2) ? PortConfig->DmaChannel2 : PortConfig->DmaChannel) == SP_UNINITIALIZED_VALUE) ResourceDescriptor->u.Dma.Channel = 0; - if (PortConfig->DmaPort == SP_UNINITIALIZED_VALUE) + if (((Dma == 2) ? PortConfig->DmaPort2 : PortConfig->DmaPort) == SP_UNINITIALIZED_VALUE) ResourceDescriptor->u.Dma.Port = 0; + + ResourceDescriptor++; + Dma--; } return ResourceList; @@ -3006,7 +3040,7 @@ ScsiPortStartIo(IN PDEVICE_OBJECT DeviceObject, KeAcquireSpinLockAtDpcLevel(&DeviceExtension->SpinLock); - if (!KeSynchronizeExecution(DeviceExtension->Interrupt, + if (!KeSynchronizeExecution(DeviceExtension->Interrupt[0], ScsiPortStartPacket, DeviceObject)) { @@ -3259,7 +3293,7 @@ SpiAdapterControl(PDEVICE_OBJECT DeviceObject, /* Schedule an active request */ InterlockedIncrement(&DeviceExtension->ActiveRequestCounter ); KeAcquireSpinLock(&DeviceExtension->SpinLock, &CurrentIrql); - KeSynchronizeExecution(DeviceExtension->Interrupt, + KeSynchronizeExecution(DeviceExtension->Interrupt[0], ScsiPortStartPacket, DeviceObject); KeReleaseSpinLock(&DeviceExtension->SpinLock, CurrentIrql); @@ -4821,7 +4855,7 @@ TryAgain: Context.InterruptData = &InterruptData; Context.DeviceExtension = DeviceExtension; - if (!KeSynchronizeExecution(DeviceExtension->Interrupt, + if (!KeSynchronizeExecution(DeviceExtension->Interrupt[0], SpiSaveInterruptData, &Context)) { @@ -5114,7 +5148,7 @@ ScsiPortIoTimer(PDEVICE_OBJECT DeviceObject, if (DeviceExtension->TimerCount == 0) { /* Timeout, process it */ - if (KeSynchronizeExecution(DeviceExtension->Interrupt, + if (KeSynchronizeExecution(DeviceExtension->Interrupt[0], SpiProcessTimeout, DeviceExtension->DeviceObject)) { @@ -5168,7 +5202,7 @@ ScsiPortIoTimer(PDEVICE_OBJECT DeviceObject, ResetParams.PathId = LunExtension->PathId; ResetParams.DeviceExtension = DeviceExtension; - if (!KeSynchronizeExecution(DeviceExtension->Interrupt, + if (!KeSynchronizeExecution(DeviceExtension->Interrupt[0], SpiResetBus, &ResetParams)) { @@ -5679,6 +5713,8 @@ SpiCreatePortConfig(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, ConfigInfo->InterruptMode = Latched; ConfigInfo->DmaChannel = SP_UNINITIALIZED_VALUE; ConfigInfo->DmaPort = SP_UNINITIALIZED_VALUE; + ConfigInfo->DmaChannel2 = SP_UNINITIALIZED_VALUE; + ConfigInfo->DmaPort2 = SP_UNINITIALIZED_VALUE; ConfigInfo->MaximumTransferLength = SP_UNINITIALIZED_VALUE; ConfigInfo->NumberOfAccessRanges = HwInitData->NumberOfAccessRanges; ConfigInfo->MaximumNumberOfTargets = 8; @@ -5901,11 +5937,12 @@ SpiParseDeviceInfo(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, PCM_FULL_RESOURCE_DESCRIPTOR FullResource; PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; PCM_SCSI_DEVICE_DATA ScsiDeviceData; - ULONG Length, Count; + ULONG Length, Count, Dma = 0, Interrupt = 0; ULONG Index = 0, RangeCount = 0; UNICODE_STRING UnicodeString; ANSI_STRING AnsiString; NTSTATUS Status = STATUS_SUCCESS; + KeyValueInformation = (PKEY_VALUE_FULL_INFORMATION) Buffer; @@ -6194,16 +6231,61 @@ SpiParseDeviceInfo(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, break; case CmResourceTypeInterrupt: - ConfigInfo->BusInterruptLevel = + + if (Interrupt == 0) + { + ConfigInfo->BusInterruptLevel = + PartialDescriptor->u.Interrupt.Level; + + ConfigInfo->BusInterruptVector = + PartialDescriptor->u.Interrupt.Vector; + + ConfigInfo->InterruptMode = (PartialDescriptor->Flags & CM_RESOURCE_INTERRUPT_LATCHED) ? Latched : LevelSensitive; + } + else if (Interrupt == 1) + { + ConfigInfo->BusInterruptLevel2 = PartialDescriptor->u.Interrupt.Level; - ConfigInfo->BusInterruptVector = + ConfigInfo->BusInterruptVector2 = PartialDescriptor->u.Interrupt.Vector; + + ConfigInfo->InterruptMode2 = (PartialDescriptor->Flags & CM_RESOURCE_INTERRUPT_LATCHED) ? Latched : LevelSensitive; + } + + Interrupt++; break; case CmResourceTypeDma: - ConfigInfo->DmaChannel = PartialDescriptor->u.Dma.Channel; - ConfigInfo->DmaPort = PartialDescriptor->u.Dma.Port; + + if (Dma == 0) + { + ConfigInfo->DmaChannel = PartialDescriptor->u.Dma.Channel; + ConfigInfo->DmaPort = PartialDescriptor->u.Dma.Port; + + if (PartialDescriptor->Flags & CM_RESOURCE_DMA_8) + ConfigInfo->DmaWidth = Width8Bits; + else if ((PartialDescriptor->Flags & CM_RESOURCE_DMA_16) || + (PartialDescriptor->Flags & CM_RESOURCE_DMA_8_AND_16)) //??? + ConfigInfo->DmaWidth = Width16Bits; + else if (PartialDescriptor->Flags & CM_RESOURCE_DMA_32) + ConfigInfo->DmaWidth = Width32Bits; + } + else if (Dma == 1) + { + ConfigInfo->DmaChannel2 = PartialDescriptor->u.Dma.Channel; + ConfigInfo->DmaPort2 = PartialDescriptor->u.Dma.Port; + + if (PartialDescriptor->Flags & CM_RESOURCE_DMA_8) + ConfigInfo->DmaWidth2 = Width8Bits; + else if ((PartialDescriptor->Flags & CM_RESOURCE_DMA_16) || + (PartialDescriptor->Flags & CM_RESOURCE_DMA_8_AND_16)) //??? + ConfigInfo->DmaWidth2 = Width16Bits; + else if (PartialDescriptor->Flags & CM_RESOURCE_DMA_32) + ConfigInfo->DmaWidth2 = Width32Bits; + } + + Dma++; break; case CmResourceTypeDeviceSpecific: @@ -6265,7 +6347,7 @@ ScsiPortAllocateAdapterChannel(IN PDEVICE_OBJECT DeviceObject, DeviceExtension->MapRegisterBase = MapRegisterBase; /* Start pending request */ - KeSynchronizeExecution(DeviceExtension->Interrupt, + KeSynchronizeExecution(DeviceExtension->Interrupt[0], ScsiPortStartPacket, DeviceObject); /* Release spinlock we took */ diff --git a/drivers/storage/scsiport/scsiport_int.h b/drivers/storage/scsiport/scsiport_int.h index 9b6899f9b6c..97ef8d4fcad 100644 --- a/drivers/storage/scsiport/scsiport_int.h +++ b/drivers/storage/scsiport/scsiport_int.h @@ -222,7 +222,7 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION KSPIN_LOCK IrqLock; /* Used when there are 2 irqs */ ULONG SequenceNumber; /* Global sequence number for packets */ KSPIN_LOCK SpinLock; - PKINTERRUPT Interrupt; + PKINTERRUPT Interrupt[2]; PIRP CurrentIrp; ULONG IrpFlags; @@ -281,7 +281,7 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION PHYSICAL_ADDRESS PhysicalAddress; ULONG CommonBufferLength; - ULONG InterruptLevel; + ULONG InterruptLevel[2]; ULONG IoAddress; BOOLEAN NeedSrbExtensionAlloc; @@ -289,6 +289,8 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION ULONG RequestsNumber; + ULONG InterruptCount; + UCHAR MiniPortDeviceExtension[1]; /* must be the last entry */ } SCSI_PORT_DEVICE_EXTENSION, *PSCSI_PORT_DEVICE_EXTENSION; diff --git a/drivers/video/videoprt/dma.c b/drivers/video/videoprt/dma.c index a2db10a9920..e35f63b9ecf 100644 --- a/drivers/video/videoprt/dma.c +++ b/drivers/video/videoprt/dma.c @@ -14,8 +14,10 @@ typedef struct { + LIST_ENTRY Entry; PDMA_ADAPTER Adapter; ULONG MapRegisters; + PVOID HwDeviceExtension; }VIP_DMA_ADAPTER, *PVIP_DMA_ADAPTER; @@ -46,7 +48,14 @@ VideoPortAllocateCommonBuffer(IN PVOID HwDeviceExtension, { PVIP_DMA_ADAPTER Adapter = (PVIP_DMA_ADAPTER)VpDmaAdapter; + /* check for valid arguments */ + if (!Adapter || !Adapter->Adapter) + { + /* invalid parameter */ + return NULL; + } + /* allocate common buffer */ return Adapter->Adapter->DmaOperations->AllocateCommonBuffer(Adapter->Adapter, DesiredLength, LogicalAddress, CacheEnabled); } @@ -64,6 +73,14 @@ VideoPortReleaseCommonBuffer(IN PVOID HwDeviceExtension, { PVIP_DMA_ADAPTER Adapter = (PVIP_DMA_ADAPTER)VpDmaAdapter; + /* check for valid arguments */ + if (!Adapter || !Adapter->Adapter) + { + /* invalid parameter */ + return; + } + + /* release common buffer */ Adapter->Adapter->DmaOperations->FreeCommonBuffer(Adapter->Adapter, Length, LogicalAddress, VirtualAddress, CacheEnabled); } @@ -75,9 +92,22 @@ NTAPI VideoPortPutDmaAdapter(IN PVOID HwDeviceExtension, IN PVP_DMA_ADAPTER VpDmaAdapter) { + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension; PVIP_DMA_ADAPTER Adapter = (PVIP_DMA_ADAPTER)VpDmaAdapter; + /* get hw device extension */ + DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + + /* sanity check */ + ASSERT(!IsListEmpty(&DeviceExtension->DmaAdapterList)); + + /* remove dma adapter from list */ + RemoveEntryList(&Adapter->Entry); + + /* release dma adapter */ Adapter->Adapter->DmaOperations->PutDmaAdapter(Adapter->Adapter); + + /* free memory */ ExFreePool(Adapter); } @@ -95,13 +125,21 @@ VideoPortGetDmaAdapter(IN PVOID HwDeviceExtension, PVIP_DMA_ADAPTER Adapter; PDMA_ADAPTER DmaAdapter; + /* allocate private adapter structure */ + Adapter = ExAllocatePool(NonPagedPool, sizeof(VIP_DMA_ADAPTER)); + if (!Adapter) + { + /* failed to allocate adapter structure */ + return NULL; + } + /* Zero the structure */ RtlZeroMemory(&DeviceDescription, sizeof(DEVICE_DESCRIPTION)); /* Initialize the structure */ DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; - DeviceDescription.Master = TRUE /* ?? */; + DeviceDescription.Master = TRUE; DeviceDescription.DmaWidth = Width8Bits; DeviceDescription.DmaSpeed = Compatible; @@ -115,21 +153,28 @@ VideoPortGetDmaAdapter(IN PVOID HwDeviceExtension, DeviceDescription.BusNumber = DeviceExtension->SystemIoBusNumber; DeviceDescription.InterfaceType = DeviceExtension->AdapterInterfaceType; - Adapter = ExAllocatePool(NonPagedPool, sizeof(VIP_DMA_ADAPTER)); - if (!Adapter) - return NULL; - - + /* acquire dma adapter */ DmaAdapter = IoGetDmaAdapter(DeviceExtension->PhysicalDeviceObject, &DeviceDescription, &NumberOfMapRegisters); if (!DmaAdapter) { + /* failed to acquire dma */ ExFreePool(Adapter); return NULL; } + /* store dma adapter */ Adapter->Adapter = DmaAdapter; + + /* store map register count */ Adapter->MapRegisters = NumberOfMapRegisters; + /* store hw device extension */ + Adapter->HwDeviceExtension = HwDeviceExtension; + + /* store in dma adapter list */ + InsertTailList(&DeviceExtension->DmaAdapterList, &Adapter->Entry); + + /* return result */ return (PVP_DMA_ADAPTER)Adapter; } @@ -144,21 +189,26 @@ VideoPortFreeCommonBuffer(IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS LogicalAddress, IN BOOLEAN CacheEnabled) { - DEVICE_DESCRIPTION DeviceDescription; - PVP_DMA_ADAPTER VpDmaAdapter; + PVIP_DMA_ADAPTER VpDmaAdapter; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + + /* sanity check */ + ASSERT(!IsListEmpty(&DeviceExtension->DmaAdapterList)); + + /* grab first dma adapter */ + VpDmaAdapter = (PVIP_DMA_ADAPTER)CONTAINING_RECORD(DeviceExtension->DmaAdapterList.Flink, VIP_DMA_ADAPTER, Entry); + + /* sanity checks */ + ASSERT(VpDmaAdapter->HwDeviceExtension == HwDeviceExtension); + ASSERT(VpDmaAdapter->Adapter != NULL); + ASSERT(VpDmaAdapter->MapRegisters != 0); + + return VideoPortReleaseCommonBuffer(HwDeviceExtension, (PVP_DMA_ADAPTER)VpDmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled); - /* FIXME: Broken code*/ - VpDmaAdapter = VideoPortGetDmaAdapter(HwDeviceExtension, - (PVP_DEVICE_DESCRIPTION)&DeviceDescription); - HalFreeCommonBuffer((PADAPTER_OBJECT)VpDmaAdapter, - Length, - LogicalAddress, - VirtualAddress, - CacheEnabled); } /* - * @unimplemented + * @implemented */ PVOID NTAPI @@ -169,8 +219,44 @@ VideoPortGetCommonBuffer(IN PVOID HwDeviceExtension, OUT PULONG pActualLength, IN BOOLEAN CacheEnabled) { - UNIMPLEMENTED; - return NULL; + PVOID Result; + PVIP_DMA_ADAPTER VpDmaAdapter; + PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension); + + /* maximum palette size */ + if (DesiredLength > 262144) + { + /* size exceeded */ + return NULL; + } + + /* sanity check */ + ASSERT(!IsListEmpty(&DeviceExtension->DmaAdapterList)); + + /* grab first dma adapter */ + VpDmaAdapter = (PVIP_DMA_ADAPTER)CONTAINING_RECORD(DeviceExtension->DmaAdapterList.Flink, VIP_DMA_ADAPTER, Entry); + + /* sanity checks */ + ASSERT(VpDmaAdapter->HwDeviceExtension == HwDeviceExtension); + ASSERT(VpDmaAdapter->Adapter != NULL); + ASSERT(VpDmaAdapter->MapRegisters != 0); + + + /* allocate common buffer */ + Result = VideoPortAllocateCommonBuffer(HwDeviceExtension, (PVP_DMA_ADAPTER)VpDmaAdapter, DesiredLength, LogicalAddress, CacheEnabled, NULL); + + if (Result) + { + /* store length */ + *pActualLength = DesiredLength; + } + else + { + /* failed to allocate common buffer */ + *pActualLength = 0; + } + + return Result; } /* @@ -185,7 +271,7 @@ VideoPortUnmapDmaMemory( PDMA BoardMemoryHandle) { /* Deprecated */ - return FALSE; + return FALSE; } /* @@ -203,7 +289,7 @@ VideoPortMapDmaMemory(IN PVOID HwDeviceExtension, IN OUT PVOID *VirtualAddress) { /* Deprecated */ - return NULL; + return NULL; } /* @@ -216,7 +302,7 @@ VideoPortSetDmaContext(IN PVOID HwDeviceExtension, IN PVOID InstanceContext) { /* Deprecated */ - return; + return; } /* @@ -228,7 +314,7 @@ VideoPortSignalDmaComplete(IN PVOID HwDeviceExtension, IN PDMA pDmaHandle) { /* Deprecated */ - return FALSE; + return FALSE; } @@ -327,7 +413,7 @@ VideoPortGetDmaContext(IN PVOID HwDeviceExtension, IN PDMA pDma) { /* Deprecated */ - return NULL; + return NULL; } /* @@ -344,7 +430,7 @@ VideoPortDoDma(IN PVOID HwDeviceExtension, } /* - * @unimplemented + * @implemented */ PDMA NTAPI @@ -353,8 +439,8 @@ VideoPortAssociateEventsWithDmaHandle(IN PVOID HwDeviceExtension, IN PVOID MappedUserEvent, IN PVOID DisplayDriverEvent) { - UNIMPLEMENTED; - return NULL; + /* Deprecated */ + return NULL; } /* diff --git a/drivers/video/videoprt/resource.c b/drivers/video/videoprt/resource.c index b17edb75500..1e4162de0c3 100644 --- a/drivers/video/videoprt/resource.c +++ b/drivers/video/videoprt/resource.c @@ -760,7 +760,49 @@ VideoPortLockBuffer( } /* - * @unimplemented + * @implemented + */ + +BOOLEAN +NTAPI +VideoPortLockPages( + IN PVOID HwDeviceExtension, + IN OUT PVIDEO_REQUEST_PACKET pVrp, + IN PEVENT pUEvent, + IN PEVENT pDisplayEvent, + IN DMA_FLAGS DmaFlags) +{ + PVOID Buffer; + + /* clear output buffer */ + pVrp->OutputBuffer = NULL; + + if (DmaFlags != VideoPortDmaInitOnly) + { + /* VideoPortKeepPagesLocked / VideoPortUnlockAfterDma is no-op */ + return FALSE; + } + + /* lock the buffer */ + Buffer = VideoPortLockBuffer(HwDeviceExtension, pVrp->InputBuffer, pVrp->InputBufferLength, IoModifyAccess); + + if (Buffer) + { + /* store result buffer & length */ + pVrp->OutputBuffer = Buffer; + pVrp->OutputBufferLength = pVrp->InputBufferLength; + + /* operation succeeded */ + return TRUE; + } + + /* operation failed */ + return FALSE; +} + + +/* + * @implemented */ VOID NTAPI diff --git a/drivers/video/videoprt/stubs.c b/drivers/video/videoprt/stubs.c index 0f6a29f876f..5e557f09cfc 100644 --- a/drivers/video/videoprt/stubs.c +++ b/drivers/video/videoprt/stubs.c @@ -62,19 +62,6 @@ VideoPortGetMdl( return 0; } -BOOLEAN -NTAPI -VideoPortLockPages( - IN PVOID HwDeviceExtension, - IN OUT PVIDEO_REQUEST_PACKET pVrp, - IN PEVENT pUEvent, - IN PEVENT pDisplayEvent, - IN DMA_FLAGS DmaFlags) -{ - UNIMPLEMENTED; - return 0; -} - LONG NTAPI VideoPortReadStateEvent( diff --git a/drivers/video/videoprt/videoprt.c b/drivers/video/videoprt/videoprt.c index 4c339b67677..e2e8df2ca77 100644 --- a/drivers/video/videoprt/videoprt.c +++ b/drivers/video/videoprt/videoprt.c @@ -304,6 +304,8 @@ IntVideoPortCreateAdapterDeviceObject( } InitializeListHead(&DeviceExtension->AddressMappingListHead); + InitializeListHead(&DeviceExtension->DmaAdapterList); + KeInitializeDpc( &DeviceExtension->DpcObject, IntVideoPortDeferredRoutine, diff --git a/drivers/video/videoprt/videoprt.h b/drivers/video/videoprt/videoprt.h index 21ea2c09ee1..9a24c2e6e31 100644 --- a/drivers/video/videoprt/videoprt.h +++ b/drivers/video/videoprt/videoprt.h @@ -95,6 +95,7 @@ typedef struct _VIDEO_PORT_DEVICE_EXTENSTION ULONG DeviceOpened; AGP_BUS_INTERFACE_STANDARD AgpInterface; KMUTEX DeviceLock; + LIST_ENTRY DmaAdapterList; CHAR MiniPortDeviceExtension[1]; } VIDEO_PORT_DEVICE_EXTENSION, *PVIDEO_PORT_DEVICE_EXTENSION; diff --git a/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp b/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp index 7e55116e52c..ec451fe6067 100644 --- a/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp +++ b/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp @@ -324,6 +324,9 @@ CPortWavePci::Init( m_ServiceGroup->AddRef(); } + // store for node property requests + m_SubDeviceDescriptor->UnknownMiniport = UnknownMiniport; + // check if it supports IPinCount interface Status = UnknownMiniport->QueryInterface(IID_IPinCount, (PVOID*)&PinCount); if (NT_SUCCESS(Status)) diff --git a/drivers/wdm/audio/legacy/wdmaud/mmixer.c b/drivers/wdm/audio/legacy/wdmaud/mmixer.c index 397bf994ef2..72e7776ce9d 100644 --- a/drivers/wdm/audio/legacy/wdmaud/mmixer.c +++ b/drivers/wdm/audio/legacy/wdmaud/mmixer.c @@ -318,6 +318,53 @@ FreeEventData(IN PVOID EventData) FreeItem(Data); } +VOID +EventCallback( + IN PVOID MixerEventContext, + IN HANDLE hMixer, + IN ULONG NotificationType, + IN ULONG Value) +{ + PWDMAUD_CLIENT ClientInfo; + PEVENT_ENTRY Entry; + ULONG Index; + + /* get client context */ + ClientInfo = (PWDMAUD_CLIENT)MixerEventContext; + + /* now search for the mixer which originated the request */ + for(Index = 0; Index < ClientInfo->NumPins; Index++) + { + if (ClientInfo->hPins[Index].Handle == hMixer && ClientInfo->hPins[Index].Type == MIXER_DEVICE_TYPE) + { + if (ClientInfo->hPins[Index].NotifyEvent) + { + /* allocate event entry */ + Entry = AllocateItem(NonPagedPool, sizeof(EVENT_ENTRY)); + if (!Entry) + { + /* no memory */ + break; + } + + /* setup event entry */ + Entry->NotificationType = NotificationType; + Entry->Value = Value; + Entry->hMixer = hMixer; + + /* insert entry */ + InsertTailList(&ClientInfo->MixerEventList, &Entry->Entry); + + /* now notify the client */ + KeSetEvent(ClientInfo->hPins[Index].NotifyEvent, 0, FALSE); + } + /* done */ + break; + } + } +} + + NTSTATUS WdmAudMixerInitialize( IN PDEVICE_OBJECT DeviceObject) @@ -378,7 +425,7 @@ WdmAudControlOpenMixer( } } - if (MMixerOpen(&MixerContext, DeviceInfo->DeviceIndex, EventObject, NULL /* FIXME */, &hMixer) != MM_STATUS_SUCCESS) + if (MMixerOpen(&MixerContext, DeviceInfo->DeviceIndex, ClientInfo, EventCallback, &hMixer) != MM_STATUS_SUCCESS) { ObDereferenceObject(EventObject); DPRINT1("Failed to open mixer\n"); @@ -511,7 +558,39 @@ WdmAudGetMixerEvent( IN PWDMAUD_DEVICE_INFO DeviceInfo, IN PWDMAUD_CLIENT ClientInfo) { - UNIMPLEMENTED + PLIST_ENTRY Entry; + PEVENT_ENTRY EventEntry; + + /* enumerate event list and check if there is a new event */ + Entry = ClientInfo->MixerEventList.Flink; + + while(Entry != &ClientInfo->MixerEventList) + { + /* grab event entry */ + EventEntry = (PEVENT_ENTRY)CONTAINING_RECORD(Entry, EVENT_ENTRY, Entry); + + if (EventEntry->hMixer == DeviceInfo->hDevice) + { + /* found an entry */ + DeviceInfo->u.MixerEvent.hMixer = EventEntry->hMixer; + DeviceInfo->u.MixerEvent.NotificationType = EventEntry->NotificationType; + DeviceInfo->u.MixerEvent.Value = EventEntry->Value; + + /* remove entry from list */ + RemoveEntryList(&EventEntry->Entry); + + /* free event entry */ + FreeItem(EventEntry); + + /* done */ + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); + } + + /* move to next */ + Entry = Entry->Flink; + } + + /* no event entry available */ return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); } diff --git a/drivers/wdm/audio/legacy/wdmaud/wdmaud.h b/drivers/wdm/audio/legacy/wdmaud/wdmaud.h index 0258c8e6691..dff0d8f75fb 100644 --- a/drivers/wdm/audio/legacy/wdmaud/wdmaud.h +++ b/drivers/wdm/audio/legacy/wdmaud/wdmaud.h @@ -35,6 +35,14 @@ typedef struct LIST_ENTRY MixerEventList; }WDMAUD_CLIENT, *PWDMAUD_CLIENT; +typedef struct +{ + LIST_ENTRY Entry; + ULONG NotificationType; + ULONG Value; + HANDLE hMixer; +}EVENT_ENTRY, *PEVENT_ENTRY; + typedef struct { LIST_ENTRY Entry; diff --git a/hal/halx86/amd64/halinit.c b/hal/halx86/amd64/halinit.c index b9b305126d3..5d1a1f65db2 100644 --- a/hal/halx86/amd64/halinit.c +++ b/hal/halx86/amd64/halinit.c @@ -14,6 +14,8 @@ /* GLOBALS *******************************************************************/ +BOOLEAN HalpPciLockSettings; + /* PRIVATE FUNCTIONS *********************************************************/ /* FUNCTIONS *****************************************************************/ diff --git a/hal/halx86/generic/cmos.c b/hal/halx86/generic/cmos.c index 225b6e31600..71c4e67c13c 100644 --- a/hal/halx86/generic/cmos.c +++ b/hal/halx86/generic/cmos.c @@ -19,8 +19,8 @@ UCHAR HalpCmosCenturyOffset; /* PRIVATE FUNCTIONS *********************************************************/ -FORCEINLINE UCHAR +NTAPI HalpReadCmos(IN UCHAR Reg) { /* Select the register */ @@ -30,8 +30,8 @@ HalpReadCmos(IN UCHAR Reg) return READ_PORT_UCHAR(CMOS_DATA_PORT); } -FORCEINLINE VOID +NTAPI HalpWriteCmos(IN UCHAR Reg, IN UCHAR Value) { diff --git a/hal/halx86/generic/legacy/bus/pcibus.c b/hal/halx86/generic/legacy/bus/pcibus.c index 6cdbfb168ec..8169fb19deb 100644 --- a/hal/halx86/generic/legacy/bus/pcibus.c +++ b/hal/halx86/generic/legacy/bus/pcibus.c @@ -14,6 +14,7 @@ /* GLOBALS *******************************************************************/ +extern BOOLEAN HalpPciLockSettings; ULONG HalpBusType; PCI_TYPE1_CFG_CYCLE_BITS HalpPciDebuggingDevice[2] = {{{{0}}}}; @@ -558,8 +559,42 @@ HalpGetISAFixedPCIIrq(IN PBUS_HANDLER BusHandler, IN PCI_SLOT_NUMBER PciSlot, OUT PSUPPORTED_RANGE *Range) { - UNIMPLEMENTED; - while (TRUE); + PCI_COMMON_HEADER PciData; + + /* Read PCI configuration data */ + HalGetBusData(PCIConfiguration, + BusHandler->BusNumber, + PciSlot.u.AsULONG, + &PciData, + PCI_COMMON_HDR_LENGTH); + + /* Make sure it's a real device */ + if (PciData.VendorID == PCI_INVALID_VENDORID) return STATUS_UNSUCCESSFUL; + + /* Allocate the supported range structure */ + *Range = ExAllocatePoolWithTag(PagedPool, sizeof(SUPPORTED_RANGE), 'Hal '); + if (!*Range) return STATUS_INSUFFICIENT_RESOURCES; + + /* Set it up */ + RtlZeroMemory(*Range, sizeof(SUPPORTED_RANGE)); + (*Range)->Base = 1; + + /* If the PCI device has no IRQ, nothing to do */ + if (!PciData.u.type0.InterruptPin) return STATUS_SUCCESS; + + /* FIXME: The PCI IRQ Routing Miniport should be called */ + + /* Also if the INT# seems bogus, nothing to do either */ + if ((PciData.u.type0.InterruptLine == 0) || + (PciData.u.type0.InterruptLine == 255)) + { + /* Fake success */ + return STATUS_SUCCESS; + } + + /* Otherwise, the INT# should be valid, return it to the caller */ + (*Range)->Base = PciData.u.type0.InterruptLine; + (*Range)->Limit = PciData.u.type0.InterruptLine; return STATUS_SUCCESS; } @@ -622,10 +657,40 @@ HalpAdjustPCIResourceList(IN PBUS_HANDLER BusHandler, IN PBUS_HANDLER RootHandler, IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList) { - /* Not yet supported */ - DbgPrint("HAL: PCI Resource List Adjustment not implemented!"); - while (TRUE); - return STATUS_UNSUCCESSFUL; + PPCIPBUSDATA BusData; + PCI_SLOT_NUMBER SlotNumber; + PSUPPORTED_RANGE Interrupt; + NTSTATUS Status; + + /* Get PCI bus data */ + BusData = BusHandler->BusData; + SlotNumber.u.AsULONG = (*pResourceList)->SlotNumber; + + /* Get the IRQ supported range */ + Status = BusData->GetIrqRange(BusHandler, RootHandler, SlotNumber, &Interrupt); + if (!NT_SUCCESS(Status)) return Status; +#ifndef _MINIHAL_ + /* Handle the /PCILOCK feature */ + if (HalpPciLockSettings) + { + /* /PCILOCK is not yet supported */ + UNIMPLEMENTED; + while (TRUE); + } +#endif + /* Now create the correct resource list based on the supported bus ranges */ +#if 0 + Status = HaliAdjustResourceListRange(BusHandler->BusAddresses, + Interrupt, + pResourceList); +#else + DPRINT1("HAL: No PCI Resource Adjustment done! Hardware may malfunction\n"); + Status = STATUS_SUCCESS; +#endif + + /* Return to caller */ + ExFreePool(Interrupt); + return Status; } NTSTATUS @@ -688,7 +753,9 @@ HalpAssignPCISlotResources(IN PBUS_HANDLER BusHandler, } /* Interrupt resource */ - if (0 != PciConfig.u.type0.InterruptLine) + if (0 != PciConfig.u.type0.InterruptPin && + 0 != PciConfig.u.type0.InterruptLine && + 0xFF != PciConfig.u.type0.InterruptLine) ResourceCount++; /* Allocate output buffer and initialize */ @@ -741,7 +808,9 @@ HalpAssignPCISlotResources(IN PBUS_HANDLER BusHandler, } } - if (0 != PciConfig.u.type0.InterruptLine) + if (0 != PciConfig.u.type0.InterruptPin && + 0 != PciConfig.u.type0.InterruptLine && + 0xFF != PciConfig.u.type0.InterruptLine) { Descriptor->Type = CmResourceTypeInterrupt; Descriptor->ShareDisposition = CmResourceShareShared; /* FIXME Just a guess */ diff --git a/hal/halx86/generic/legacy/bussupp.c b/hal/halx86/generic/legacy/bussupp.c index 1758f85dab6..078a05980a7 100644 --- a/hal/halx86/generic/legacy/bussupp.c +++ b/hal/halx86/generic/legacy/bussupp.c @@ -785,7 +785,9 @@ HalpDebugPciDumpBus(IN ULONG i, if ((PciData->Status & PCI_STATUS_DEVSEL) == 0x200) DbgPrint(" medium devsel,"); if ((PciData->Status & PCI_STATUS_DEVSEL) == 0x400) DbgPrint(" fast devsel,"); DbgPrint(" latency %d", PciData->LatencyTimer); - if (PciData->u.type0.InterruptLine) DbgPrint(", IRQ %02d", PciData->u.type0.InterruptLine); + if (PciData->u.type0.InterruptPin != 0 && + PciData->u.type0.InterruptLine != 0 && + PciData->u.type0.InterruptLine != 0xFF) DbgPrint(", IRQ %02d", PciData->u.type0.InterruptLine); DbgPrint("\n"); /* Scan addresses */ diff --git a/hal/halx86/generic/profil.c b/hal/halx86/generic/profil.c index 53d653a0d1e..b145942d9ab 100644 --- a/hal/halx86/generic/profil.c +++ b/hal/halx86/generic/profil.c @@ -4,6 +4,7 @@ * FILE: hal/halx86/generic/profil.c * PURPOSE: System Profiling * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + * Eric Kohl */ /* INCLUDES ******************************************************************/ @@ -15,14 +16,28 @@ /* FUNCTIONS *****************************************************************/ /* - * @unimplemented + * @implemented */ VOID NTAPI HalStopProfileInterrupt(IN KPROFILE_SOURCE ProfileSource) { - UNIMPLEMENTED; - return; + UCHAR StatusB; + + /* Acquire the CMOS lock */ + HalpAcquireSystemHardwareSpinLock(); + + /* Read Status Register B */ + StatusB = HalpReadCmos(RTC_REGISTER_B); + + /* Disable periodic interrupts */ + StatusB = StatusB & ~RTC_REG_B_PI; + + /* Write new value into Status Register B */ + HalpWriteCmos(RTC_REGISTER_B, StatusB); + + /* Release the CMOS lock */ + HalpReleaseCmosSpinLock(); } /* diff --git a/hal/halx86/include/halp.h b/hal/halx86/include/halp.h index f837b849abd..3ab0f7b253c 100644 --- a/hal/halx86/include/halp.h +++ b/hal/halx86/include/halp.h @@ -48,8 +48,11 @@ ATTRIB_NORETURN #define CMOS_CONTROL_PORT (PUCHAR)0x70 #define CMOS_DATA_PORT (PUCHAR)0x71 #define RTC_REGISTER_A 0x0A +#define RTC_REG_A_UIP 0x80 #define RTC_REGISTER_B 0x0B -#define RTC_REG_A_UIP 0x80 +#define RTC_REG_B_PI 0x40 +#define RTC_REGISTER_C 0x0C +#define RTC_REGISTER_D 0x0D #define RTC_REGISTER_CENTURY 0x32 /* Usage flags */ @@ -683,7 +686,7 @@ HaliHaltSystem( ); // -// CMOS initialization +// CMOS Routines // VOID NTAPI @@ -691,6 +694,19 @@ HalpInitializeCmos( VOID ); +UCHAR +NTAPI +HalpReadCmos( + IN UCHAR Reg +); + +VOID +NTAPI +HalpWriteCmos( + IN UCHAR Reg, + IN UCHAR Value +); + // // Spinlock for protecting CMOS access // diff --git a/importlibs/libadvapi32.a b/importlibs/libadvapi32.a index d7a04756fca..4ef4f9c4269 100644 Binary files a/importlibs/libadvapi32.a and b/importlibs/libadvapi32.a differ diff --git a/importlibs/libbattc.a b/importlibs/libbattc.a index 28908dc1e60..e88165566ec 100644 Binary files a/importlibs/libbattc.a and b/importlibs/libbattc.a differ diff --git a/importlibs/libbootvid.a b/importlibs/libbootvid.a index 3c3b7fe24e9..36016bd60c9 100644 Binary files a/importlibs/libbootvid.a and b/importlibs/libbootvid.a differ diff --git a/importlibs/libclass2.a b/importlibs/libclass2.a index 35f2a58c33f..5b2b6596886 100644 Binary files a/importlibs/libclass2.a and b/importlibs/libclass2.a differ diff --git a/importlibs/libcomctl32.a b/importlibs/libcomctl32.a index 483cb983d5b..9ca04c3266e 100644 Binary files a/importlibs/libcomctl32.a and b/importlibs/libcomctl32.a differ diff --git a/importlibs/libcrypt32.a b/importlibs/libcrypt32.a index 6a73c62b57e..d19258c9dfb 100644 Binary files a/importlibs/libcrypt32.a and b/importlibs/libcrypt32.a differ diff --git a/importlibs/libcryptui.a b/importlibs/libcryptui.a index 22436b9fb37..05faf2912ab 100644 Binary files a/importlibs/libcryptui.a and b/importlibs/libcryptui.a differ diff --git a/importlibs/libcsrsrv.a b/importlibs/libcsrsrv.a index 02b4a08cedd..2d321f7d503 100644 Binary files a/importlibs/libcsrsrv.a and b/importlibs/libcsrsrv.a differ diff --git a/importlibs/libdbghelp.a b/importlibs/libdbghelp.a index 33ff48f068f..190b308f864 100644 Binary files a/importlibs/libdbghelp.a and b/importlibs/libdbghelp.a differ diff --git a/importlibs/libdevmgr.a b/importlibs/libdevmgr.a index 94a64476997..8b7b15ee5aa 100644 Binary files a/importlibs/libdevmgr.a and b/importlibs/libdevmgr.a differ diff --git a/importlibs/libdhcpcsvc.a b/importlibs/libdhcpcsvc.a index db4116ae8a7..e2bc4174e90 100644 Binary files a/importlibs/libdhcpcsvc.a and b/importlibs/libdhcpcsvc.a differ diff --git a/importlibs/libdrmk.a b/importlibs/libdrmk.a index 5aa13fa72a8..07934c6e2dd 100644 Binary files a/importlibs/libdrmk.a and b/importlibs/libdrmk.a differ diff --git a/importlibs/libdxgthk.a b/importlibs/libdxgthk.a index b5b889f423f..19d1be81592 100644 Binary files a/importlibs/libdxgthk.a and b/importlibs/libdxgthk.a differ diff --git a/importlibs/libfmifs.a b/importlibs/libfmifs.a index 70ea4ea2acd..c7c98560715 100644 Binary files a/importlibs/libfmifs.a and b/importlibs/libfmifs.a differ diff --git a/importlibs/libftfd.a b/importlibs/libftfd.a index ba1bf999c79..cba1d76cfcd 100644 Binary files a/importlibs/libftfd.a and b/importlibs/libftfd.a differ diff --git a/importlibs/libgdi32.a b/importlibs/libgdi32.a index 4d658114f66..1ea430e6afe 100644 Binary files a/importlibs/libgdi32.a and b/importlibs/libgdi32.a differ diff --git a/importlibs/libgdiplus.a b/importlibs/libgdiplus.a index b91aa5d8f25..84b0fbeff00 100644 Binary files a/importlibs/libgdiplus.a and b/importlibs/libgdiplus.a differ diff --git a/importlibs/libhal.a b/importlibs/libhal.a index 6d028b2e040..e71ab30bed9 100644 Binary files a/importlibs/libhal.a and b/importlibs/libhal.a differ diff --git a/importlibs/libimm32.a b/importlibs/libimm32.a index 0b0d96faac8..49e42f104cf 100644 Binary files a/importlibs/libimm32.a and b/importlibs/libimm32.a differ diff --git a/importlibs/libkdcom.a b/importlibs/libkdcom.a index e4e2a0302ed..54aa584a5ed 100644 Binary files a/importlibs/libkdcom.a and b/importlibs/libkdcom.a differ diff --git a/importlibs/libkernel32.a b/importlibs/libkernel32.a index c89d95286a3..51d957f3ff6 100644 Binary files a/importlibs/libkernel32.a and b/importlibs/libkernel32.a differ diff --git a/importlibs/libks.a b/importlibs/libks.a index 348e81ba7c8..155290e0aa6 100644 Binary files a/importlibs/libks.a and b/importlibs/libks.a differ diff --git a/importlibs/libloadperf.a b/importlibs/libloadperf.a index c8de1f8199e..c728713814d 100644 Binary files a/importlibs/libloadperf.a and b/importlibs/libloadperf.a differ diff --git a/importlibs/liblsasrv.a b/importlibs/liblsasrv.a index a8c18466744..5b733da2b00 100644 Binary files a/importlibs/liblsasrv.a and b/importlibs/liblsasrv.a differ diff --git a/importlibs/libmlang.a b/importlibs/libmlang.a index af4c23c4c82..4290e038b0e 100644 Binary files a/importlibs/libmlang.a and b/importlibs/libmlang.a differ diff --git a/importlibs/libmpr.a b/importlibs/libmpr.a index 56aad070c96..6bcaaff46e4 100644 Binary files a/importlibs/libmpr.a and b/importlibs/libmpr.a differ diff --git a/importlibs/libmsi.a b/importlibs/libmsi.a index 1256de30f13..dc9533243ec 100644 Binary files a/importlibs/libmsi.a and b/importlibs/libmsi.a differ diff --git a/importlibs/libmsimg32.a b/importlibs/libmsimg32.a index b970e353f01..a64b909c6c7 100644 Binary files a/importlibs/libmsimg32.a and b/importlibs/libmsimg32.a differ diff --git a/importlibs/libmsvcrt.a b/importlibs/libmsvcrt.a index 73c504747a2..f44a826ef33 100644 Binary files a/importlibs/libmsvcrt.a and b/importlibs/libmsvcrt.a differ diff --git a/importlibs/libnetapi32.a b/importlibs/libnetapi32.a index 5c5a4014fa2..021ff811a98 100644 Binary files a/importlibs/libnetapi32.a and b/importlibs/libnetapi32.a differ diff --git a/importlibs/libnotifyhook.a b/importlibs/libnotifyhook.a index 5f5a3a5ad6f..971e4690b1c 100644 Binary files a/importlibs/libnotifyhook.a and b/importlibs/libnotifyhook.a differ diff --git a/importlibs/libntdll.a b/importlibs/libntdll.a index a437f4aa003..268b798bf24 100644 Binary files a/importlibs/libntdll.a and b/importlibs/libntdll.a differ diff --git a/importlibs/libntoskrnl.a b/importlibs/libntoskrnl.a index c91c3904abf..08f9dfaecfa 100644 Binary files a/importlibs/libntoskrnl.a and b/importlibs/libntoskrnl.a differ diff --git a/importlibs/libole32.a b/importlibs/libole32.a index 9182a2816c9..92dbb0d9310 100644 Binary files a/importlibs/libole32.a and b/importlibs/libole32.a differ diff --git a/importlibs/liboleaut32.a b/importlibs/liboleaut32.a index c90ee24a7b5..de9788f8459 100644 Binary files a/importlibs/liboleaut32.a and b/importlibs/liboleaut32.a differ diff --git a/importlibs/libpciidex.a b/importlibs/libpciidex.a index 3b49aac4002..88abb7ce55b 100644 Binary files a/importlibs/libpciidex.a and b/importlibs/libpciidex.a differ diff --git a/importlibs/libriched20.a b/importlibs/libriched20.a index e1e344e50fd..eb9a5af7b2d 100644 Binary files a/importlibs/libriched20.a and b/importlibs/libriched20.a differ diff --git a/importlibs/librpcrt4.a b/importlibs/librpcrt4.a index 37d4fea57da..5eb9e699fcd 100644 Binary files a/importlibs/librpcrt4.a and b/importlibs/librpcrt4.a differ diff --git a/importlibs/librsaenh.a b/importlibs/librsaenh.a index 290193ad792..06aeae967b2 100644 Binary files a/importlibs/librsaenh.a and b/importlibs/librsaenh.a differ diff --git a/importlibs/libsamlib.a b/importlibs/libsamlib.a index f1d93e51d74..aef165f7694 100644 Binary files a/importlibs/libsamlib.a and b/importlibs/libsamlib.a differ diff --git a/importlibs/libscsiport.a b/importlibs/libscsiport.a index d9d53161b3e..04f58c622a2 100644 Binary files a/importlibs/libscsiport.a and b/importlibs/libscsiport.a differ diff --git a/importlibs/libsetupapi.a b/importlibs/libsetupapi.a index a7e4e79c51f..04771472e18 100644 Binary files a/importlibs/libsetupapi.a and b/importlibs/libsetupapi.a differ diff --git a/importlibs/libshdocvw.a b/importlibs/libshdocvw.a index ec1785d653c..3380025f60e 100644 Binary files a/importlibs/libshdocvw.a and b/importlibs/libshdocvw.a differ diff --git a/importlibs/libshell32.a b/importlibs/libshell32.a index 7962240a926..5ec55d7d6ec 100644 Binary files a/importlibs/libshell32.a and b/importlibs/libshell32.a differ diff --git a/importlibs/libshlwapi.a b/importlibs/libshlwapi.a index 44c3623d2a6..9bc46338a91 100644 Binary files a/importlibs/libshlwapi.a and b/importlibs/libshlwapi.a differ diff --git a/importlibs/libsmdll.a b/importlibs/libsmdll.a index 31a27fcaba0..91bab48fef8 100644 Binary files a/importlibs/libsmdll.a and b/importlibs/libsmdll.a differ diff --git a/importlibs/libsnmpapi.a b/importlibs/libsnmpapi.a index 6c8e72ce0c9..36e78ae1d45 100644 Binary files a/importlibs/libsnmpapi.a and b/importlibs/libsnmpapi.a differ diff --git a/importlibs/libspoolss.a b/importlibs/libspoolss.a index 48a4ef9f11a..eae449536ab 100644 Binary files a/importlibs/libspoolss.a and b/importlibs/libspoolss.a differ diff --git a/importlibs/liburlmon.a b/importlibs/liburlmon.a index 897ce0ec144..cb74ce8cf44 100644 Binary files a/importlibs/liburlmon.a and b/importlibs/liburlmon.a differ diff --git a/importlibs/libuser32.a b/importlibs/libuser32.a index 1355231f879..de0d0a7e8da 100644 Binary files a/importlibs/libuser32.a and b/importlibs/libuser32.a differ diff --git a/importlibs/libuserenv.a b/importlibs/libuserenv.a index 3979a78376e..5cdfaf1dc8d 100644 Binary files a/importlibs/libuserenv.a and b/importlibs/libuserenv.a differ diff --git a/importlibs/libvideoprt.a b/importlibs/libvideoprt.a index 057e2f5021d..e38ecb95f17 100644 Binary files a/importlibs/libvideoprt.a and b/importlibs/libvideoprt.a differ diff --git a/importlibs/libwin32k.a b/importlibs/libwin32k.a index a640c7c4033..5336a603d1b 100644 Binary files a/importlibs/libwin32k.a and b/importlibs/libwin32k.a differ diff --git a/importlibs/libwindowscodecs.a b/importlibs/libwindowscodecs.a index de66a9ca61b..04880e81767 100644 Binary files a/importlibs/libwindowscodecs.a and b/importlibs/libwindowscodecs.a differ diff --git a/importlibs/libwinspool.a b/importlibs/libwinspool.a index bd105295a02..1e2e0ce02d1 100644 Binary files a/importlibs/libwinspool.a and b/importlibs/libwinspool.a differ diff --git a/importlibs/libwintrust.a b/importlibs/libwintrust.a index 3ddaf6519f1..af3b5a642b9 100644 Binary files a/importlibs/libwintrust.a and b/importlibs/libwintrust.a differ diff --git a/importlibs/libwmilib.a b/importlibs/libwmilib.a index ce2f5bb0226..19898293855 100644 Binary files a/importlibs/libwmilib.a and b/importlibs/libwmilib.a differ diff --git a/importlibs/libws2_32.a b/importlibs/libws2_32.a index 5e8b5f55193..bdbf716d360 100644 Binary files a/importlibs/libws2_32.a and b/importlibs/libws2_32.a differ diff --git a/importlibs/libws2help.a b/importlibs/libws2help.a index ccc5ed58e49..43c1aa0b569 100644 Binary files a/importlibs/libws2help.a and b/importlibs/libws2help.a differ diff --git a/include/ddk/classpnp.h b/include/ddk/classpnp.h new file mode 100644 index 00000000000..58d783a42f9 --- /dev/null +++ b/include/ddk/classpnp.h @@ -0,0 +1,1221 @@ + +#pragma once + +#define _CLASS_ + +#include +#include +#include +#include +#include + +#include + +#include + +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#define min(a,b) (((a) < (b)) ? (a) : (b)) + +#define SRB_CLASS_FLAGS_LOW_PRIORITY 0x10000000 +#define SRB_CLASS_FLAGS_PERSISTANT 0x20000000 +#define SRB_CLASS_FLAGS_PAGING 0x40000000 +#define SRB_CLASS_FLAGS_FREE_MDL 0x80000000 + +#define ASSERT_FDO(x) \ + ASSERT(((PCOMMON_DEVICE_EXTENSION) (x)->DeviceExtension)->IsFdo) + +#define ASSERT_PDO(x) \ + ASSERT(!(((PCOMMON_DEVICE_EXTENSION) (x)->DeviceExtension)->IsFdo)) + +#define IS_CLEANUP_REQUEST(majorFunction) \ + ((majorFunction == IRP_MJ_CLOSE) || \ + (majorFunction == IRP_MJ_CLEANUP) || \ + (majorFunction == IRP_MJ_SHUTDOWN)) + +#define DO_MCD(fdoExtension) \ + (((fdoExtension)->MediaChangeDetectionInfo != NULL) && \ + ((fdoExtension)->MediaChangeDetectionInfo->MediaChangeDetectionDisableCount == 0)) + +#define IS_SCSIOP_READ(opCode) \ + ((opCode == SCSIOP_READ6) || \ + (opCode == SCSIOP_READ) || \ + (opCode == SCSIOP_READ12) || \ + (opCode == SCSIOP_READ16)) + +#define IS_SCSIOP_WRITE(opCode) \ + ((opCode == SCSIOP_WRITE6) || \ + (opCode == SCSIOP_WRITE) || \ + (opCode == SCSIOP_WRITE12) || \ + (opCode == SCSIOP_WRITE16)) + +#define IS_SCSIOP_READWRITE(opCode) (IS_SCSIOP_READ(opCode) || IS_SCSIOP_WRITE(opCode)) + +#define ADJUST_FUA_FLAG(fdoExt) { \ + if (TEST_FLAG(fdoExt->DeviceFlags, DEV_WRITE_CACHE) && \ + !TEST_FLAG(fdoExt->DeviceFlags, DEV_POWER_PROTECTED) && \ + !TEST_FLAG(fdoExt->ScanForSpecialFlags, CLASS_SPECIAL_FUA_NOT_SUPPORTED) ) { \ + fdoExt->CdbForceUnitAccess = TRUE; \ + } else { \ + fdoExt->CdbForceUnitAccess = FALSE; \ + } \ +} + +#define FREE_POOL(_PoolPtr) \ + if (_PoolPtr != NULL) { \ + ExFreePool(_PoolPtr); \ + _PoolPtr = NULL; \ + } + +#ifdef POOL_TAGGING +#undef ExAllocatePool +#undef ExAllocatePoolWithQuota +#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'nUcS') +//#define ExAllocatePool(a,b) #assert(0) +#define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,'nUcS') +#endif + +#define CLASS_TAG_AUTORUN_DISABLE 'ALcS' +#define CLASS_TAG_FILE_OBJECT_EXTENSION 'FLcS' +#define CLASS_TAG_MEDIA_CHANGE_DETECTION 'MLcS' +#define CLASS_TAG_MOUNT 'mLcS' +#define CLASS_TAG_RELEASE_QUEUE 'qLcS' +#define CLASS_TAG_POWER 'WLcS' +#define CLASS_TAG_WMI 'wLcS' +#define CLASS_TAG_FAILURE_PREDICT 'fLcS' +#define CLASS_TAG_DEVICE_CONTROL 'OIcS' +#define CLASS_TAG_MODE_DATA 'oLcS' +#define CLASS_TAG_MULTIPATH 'mPcS' + +#define MAXIMUM_RETRIES 4 + +#define CLASS_DRIVER_EXTENSION_KEY ((PVOID) ClassInitialize) + +#define NO_REMOVE 0 +#define REMOVE_PENDING 1 +#define REMOVE_COMPLETE 2 + +#define ClassAcquireRemoveLock(devobj, tag) \ + ClassAcquireRemoveLockEx(devobj, tag, __FILE__, __LINE__) + +#ifdef TRY +#undef TRY +#endif +#ifdef LEAVE +#undef LEAVE +#endif + +#ifdef FINALLY +#undef FINALLY +#endif + +#define TRY +#define LEAVE goto __tryLabel; +#define FINALLY __tryLabel: + +#if defined DebugPrint +#undef DebugPrint +#endif + +#if DBG +#define DebugPrint(x) ClassDebugPrint x +#else +#define DebugPrint(x) +#endif + +#define DEBUG_BUFFER_LENGTH 256 + +#define START_UNIT_TIMEOUT (60 * 4) + +#define MEDIA_CHANGE_DEFAULT_TIME 1 +#define MEDIA_CHANGE_TIMEOUT_TIME 300 + +#define MAXIMUM_RETRY_FOR_SINGLE_IO_IN_100NS_UNITS 0x3b9aca00 + +#ifdef ALLOCATE_SRB_FROM_POOL + +#define ClasspAllocateSrb(ext) \ + ExAllocatePoolWithTag(NonPagedPool, \ + sizeof(SCSI_REQUEST_BLOCK), \ + 'sBRS') + +#define ClasspFreeSrb(ext, srb) ExFreePool((srb)); + +#else /* ALLOCATE_SRB_FROM_POOL */ + +#define ClasspAllocateSrb(ext) \ + ExAllocateFromNPagedLookasideList( \ + &((ext)->CommonExtension.SrbLookasideList)) + +#define ClasspFreeSrb(ext, srb) \ + ExFreeToNPagedLookasideList( \ + &((ext)->CommonExtension.SrbLookasideList), \ + (srb)) + +#endif /* ALLOCATE_SRB_FROM_POOL */ + +#define SET_FLAG(Flags, Bit) ((Flags) |= (Bit)) +#define CLEAR_FLAG(Flags, Bit) ((Flags) &= ~(Bit)) +#define TEST_FLAG(Flags, Bit) (((Flags) & (Bit)) != 0) + +#define CLASS_WORKING_SET_MAXIMUM 2048 + +#define CLASS_INTERPRET_SENSE_INFO2_MAXIMUM_HISTORY_COUNT 30000 + +#define CLASS_SPECIAL_DISABLE_SPIN_DOWN 0x00000001 +#define CLASS_SPECIAL_DISABLE_SPIN_UP 0x00000002 +#define CLASS_SPECIAL_NO_QUEUE_LOCK 0x00000008 +#define CLASS_SPECIAL_DISABLE_WRITE_CACHE 0x00000010 +#define CLASS_SPECIAL_CAUSE_NOT_REPORTABLE_HACK 0x00000020 +#if ((NTDDI_VERSION == NTDDI_WIN2KSP3) || (OSVER(NTDDI_VERSION) == NTDDI_WINXP)) +#define CLASS_SPECIAL_DISABLE_WRITE_CACHE_NOT_SUPPORTED 0x00000040 +#endif +#define CLASS_SPECIAL_MODIFY_CACHE_UNSUCCESSFUL 0x00000040 +#define CLASS_SPECIAL_FUA_NOT_SUPPORTED 0x00000080 +#define CLASS_SPECIAL_VALID_MASK 0x000000FB +#define CLASS_SPECIAL_RESERVED (~CLASS_SPECIAL_VALID_MASK) + +#define DEV_WRITE_CACHE 0x00000001 +#define DEV_USE_SCSI1 0x00000002 +#define DEV_SAFE_START_UNIT 0x00000004 +#define DEV_NO_12BYTE_CDB 0x00000008 +#define DEV_POWER_PROTECTED 0x00000010 +#define DEV_USE_16BYTE_CDB 0x00000020 + +#define GUID_CLASSPNP_QUERY_REGINFOEX {0x00e34b11, 0x2444, 0x4745, {0xa5, 0x3d, 0x62, 0x01, 0x00, 0xcd, 0x82, 0xf7}} +#define GUID_CLASSPNP_SENSEINFO2 {0x509a8c5f, 0x71d7, 0x48f6, {0x82, 0x1e, 0x17, 0x3c, 0x49, 0xbf, 0x2f, 0x18}} +#define GUID_CLASSPNP_WORKING_SET {0x105701b0, 0x9e9b, 0x47cb, {0x97, 0x80, 0x81, 0x19, 0x8a, 0xf7, 0xb5, 0x24}} + +#define DEFAULT_FAILURE_PREDICTION_PERIOD 60 * 60 * 1 + +static inline ULONG CountOfSetBitsUChar(UCHAR _X) +{ ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; } +static inline ULONG CountOfSetBitsULong(ULONG _X) +{ ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; } +static inline ULONG CountOfSetBitsULong32(ULONG32 _X) +{ ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; } +static inline ULONG CountOfSetBitsULong64(ULONG64 _X) +{ ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; } +static inline ULONG CountOfSetBitsUlongPtr(ULONG_PTR _X) +{ ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; } + +typedef enum _MEDIA_CHANGE_DETECTION_STATE { + MediaUnknown, + MediaPresent, + MediaNotPresent, + MediaUnavailable +} MEDIA_CHANGE_DETECTION_STATE, *PMEDIA_CHANGE_DETECTION_STATE; + +typedef enum _CLASS_DEBUG_LEVEL { + ClassDebugError = 0, + ClassDebugWarning = 1, + ClassDebugTrace = 2, + ClassDebugInfo = 3, + ClassDebugMediaLocks = 8, + ClassDebugMCN = 9, + ClassDebugDelayedRetry = 10, + ClassDebugSenseInfo = 11, + ClassDebugRemoveLock = 12, + ClassDebugExternal4 = 13, + ClassDebugExternal3 = 14, + ClassDebugExternal2 = 15, + ClassDebugExternal1 = 16 +} CLASS_DEBUG_LEVEL, *PCLASS_DEBUG_LEVEL; + +typedef enum { + EventGeneration, + DataBlockCollection +} CLASSENABLEDISABLEFUNCTION; + +typedef enum { + FailurePredictionNone = 0, + FailurePredictionIoctl, + FailurePredictionSmart, + FailurePredictionSense +} FAILURE_PREDICTION_METHOD, *PFAILURE_PREDICTION_METHOD; + +typedef enum { + PowerDownDeviceInitial, + PowerDownDeviceLocked, + PowerDownDeviceStopped, + PowerDownDeviceOff, + PowerDownDeviceUnlocked +} CLASS_POWER_DOWN_STATE; + +typedef enum { + PowerDownDeviceInitial2, + PowerDownDeviceLocked2, + PowerDownDeviceFlushed2, + PowerDownDeviceStopped2, + PowerDownDeviceOff2, + PowerDownDeviceUnlocked2 +} CLASS_POWER_DOWN_STATE2; + +typedef enum { + PowerUpDeviceInitial, + PowerUpDeviceLocked, + PowerUpDeviceOn, + PowerUpDeviceStarted, + PowerUpDeviceUnlocked +} CLASS_POWER_UP_STATE; + +struct _CLASS_INIT_DATA; +typedef struct _CLASS_INIT_DATA CLASS_INIT_DATA, *PCLASS_INIT_DATA; + +struct _CLASS_PRIVATE_FDO_DATA; +typedef struct _CLASS_PRIVATE_FDO_DATA CLASS_PRIVATE_FDO_DATA, *PCLASS_PRIVATE_FDO_DATA; + +struct _CLASS_PRIVATE_PDO_DATA; +typedef struct _CLASS_PRIVATE_PDO_DATA CLASS_PRIVATE_PDO_DATA, *PCLASS_PRIVATE_PDO_DATA; + +struct _CLASS_PRIVATE_COMMON_DATA; +typedef struct _CLASS_PRIVATE_COMMON_DATA CLASS_PRIVATE_COMMON_DATA, *PCLASS_PRIVATE_COMMON_DATA; + +struct _MEDIA_CHANGE_DETECTION_INFO; +typedef struct _MEDIA_CHANGE_DETECTION_INFO MEDIA_CHANGE_DETECTION_INFO, *PMEDIA_CHANGE_DETECTION_INFO; + +typedef struct _DICTIONARY { + ULONGLONG Signature; + struct _DICTIONARY_HEADER* List; + KSPIN_LOCK SpinLock; +} DICTIONARY, *PDICTIONARY; + +typedef struct _CLASSPNP_SCAN_FOR_SPECIAL_INFO { + PCHAR VendorId; + PCHAR ProductId; + PCHAR ProductRevision; + ULONG_PTR Data; +} CLASSPNP_SCAN_FOR_SPECIAL_INFO, *PCLASSPNP_SCAN_FOR_SPECIAL_INFO; + +typedef VOID +(NTAPI *PCLASS_ERROR)( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + NTSTATUS *Status, + BOOLEAN *Retry); + +typedef NTSTATUS +(NTAPI *PCLASS_ADD_DEVICE)( + PDRIVER_OBJECT DriverObject, + PDEVICE_OBJECT Pdo); + +typedef NTSTATUS +(NTAPI *PCLASS_POWER_DEVICE)( + PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +typedef NTSTATUS +(NTAPI *PCLASS_START_DEVICE)( + PDEVICE_OBJECT DeviceObject); + +typedef NTSTATUS +(NTAPI *PCLASS_STOP_DEVICE)( + PDEVICE_OBJECT DeviceObject, + UCHAR Type); + +typedef NTSTATUS +(NTAPI *PCLASS_INIT_DEVICE)( + PDEVICE_OBJECT DeviceObject); + +typedef NTSTATUS +(NTAPI *PCLASS_ENUM_DEVICE)( + PDEVICE_OBJECT DeviceObject); + +typedef NTSTATUS +(NTAPI *PCLASS_READ_WRITE)( + PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +typedef NTSTATUS +(NTAPI *PCLASS_DEVICE_CONTROL)( + PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +typedef NTSTATUS +(NTAPI *PCLASS_SHUTDOWN_FLUSH)( + PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +typedef NTSTATUS +(NTAPI *PCLASS_CREATE_CLOSE)( + PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +typedef NTSTATUS +(NTAPI *PCLASS_QUERY_ID)( + PDEVICE_OBJECT DeviceObject, + BUS_QUERY_ID_TYPE IdType, + PUNICODE_STRING IdString); + +typedef NTSTATUS +(NTAPI *PCLASS_REMOVE_DEVICE)( + PDEVICE_OBJECT DeviceObject, + UCHAR Type); + +typedef VOID +(NTAPI *PCLASS_UNLOAD)( + PDRIVER_OBJECT DriverObject); + +typedef NTSTATUS +(NTAPI *PCLASS_QUERY_PNP_CAPABILITIES)( + PDEVICE_OBJECT PhysicalDeviceObject, + PDEVICE_CAPABILITIES Capabilities); + +typedef VOID +(NTAPI *PCLASS_TICK)( + PDEVICE_OBJECT DeviceObject); + +typedef NTSTATUS +(NTAPI *PCLASS_QUERY_WMI_REGINFO_EX)( + PDEVICE_OBJECT DeviceObject, + ULONG *RegFlags, + PUNICODE_STRING Name, + PUNICODE_STRING MofResouceName); + +typedef NTSTATUS +(NTAPI *PCLASS_QUERY_WMI_REGINFO)( + PDEVICE_OBJECT DeviceObject, + ULONG *RegFlags, + PUNICODE_STRING Name); + +typedef NTSTATUS +(NTAPI *PCLASS_QUERY_WMI_DATABLOCK)( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + ULONG GuidIndex, + ULONG BufferAvail, + PUCHAR Buffer); + +typedef NTSTATUS +(NTAPI *PCLASS_SET_WMI_DATABLOCK)( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + ULONG GuidIndex, + ULONG BufferSize, + PUCHAR Buffer); + +typedef NTSTATUS +(NTAPI *PCLASS_SET_WMI_DATAITEM)( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + ULONG GuidIndex, + ULONG DataItemId, + ULONG BufferSize, + PUCHAR Buffer); + +typedef NTSTATUS +(NTAPI *PCLASS_EXECUTE_WMI_METHOD)( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + ULONG GuidIndex, + ULONG MethodId, + ULONG InBufferSize, + ULONG OutBufferSize, + PUCHAR Buffer); + +typedef NTSTATUS +(NTAPI *PCLASS_WMI_FUNCTION_CONTROL)( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + ULONG GuidIndex, + CLASSENABLEDISABLEFUNCTION Function, + BOOLEAN Enable); + +typedef struct _SRB_HISTORY_ITEM { + LARGE_INTEGER TickCountSent; + LARGE_INTEGER TickCountCompleted; + ULONG MillisecondsDelayOnRetry; + SENSE_DATA NormalizedSenseData; + UCHAR SrbStatus; + UCHAR ClassDriverUse; +} SRB_HISTORY_ITEM, *PSRB_HISTORY_ITEM; + +typedef struct _SRB_HISTORY { + ULONG_PTR ClassDriverUse[4]; + ULONG TotalHistoryCount; + ULONG UsedHistoryCount; + SRB_HISTORY_ITEM History[1]; +} SRB_HISTORY, *PSRB_HISTORY; + +typedef BOOLEAN +(NTAPI *PCLASS_INTERPRET_SENSE_INFO)( + PDEVICE_OBJECT Fdo, + PIRP OriginalRequest, + PSCSI_REQUEST_BLOCK Srb, + UCHAR MajorFunctionCode, + ULONG IoDeviceCode, + ULONG PreviousRetryCount, + SRB_HISTORY *RequestHistory, + NTSTATUS *Status, + LONGLONG *RetryIn100nsUnits); + +typedef VOID +(NTAPI *PCLASS_COMPRESS_RETRY_HISTORY_DATA)( + PDEVICE_OBJECT DeviceObject, + PSRB_HISTORY RequestHistory); + +typedef struct { + GUID Guid; + ULONG InstanceCount; + ULONG Flags; +} GUIDREGINFO, *PGUIDREGINFO; + +typedef struct _CLASS_WMI_INFO { + ULONG GuidCount; + PGUIDREGINFO GuidRegInfo; + PCLASS_QUERY_WMI_REGINFO ClassQueryWmiRegInfo; + PCLASS_QUERY_WMI_DATABLOCK ClassQueryWmiDataBlock; + PCLASS_SET_WMI_DATABLOCK ClassSetWmiDataBlock; + PCLASS_SET_WMI_DATAITEM ClassSetWmiDataItem; + PCLASS_EXECUTE_WMI_METHOD ClassExecuteWmiMethod; + PCLASS_WMI_FUNCTION_CONTROL ClassWmiFunctionControl; +} CLASS_WMI_INFO, *PCLASS_WMI_INFO; + +typedef struct _CLASS_DEV_INFO { + ULONG DeviceExtensionSize; + DEVICE_TYPE DeviceType; + UCHAR StackSize; + ULONG DeviceCharacteristics; + PCLASS_ERROR ClassError; + PCLASS_READ_WRITE ClassReadWriteVerification; + PCLASS_DEVICE_CONTROL ClassDeviceControl; + PCLASS_SHUTDOWN_FLUSH ClassShutdownFlush; + PCLASS_CREATE_CLOSE ClassCreateClose; + PCLASS_INIT_DEVICE ClassInitDevice; + PCLASS_START_DEVICE ClassStartDevice; + PCLASS_POWER_DEVICE ClassPowerDevice; + PCLASS_STOP_DEVICE ClassStopDevice; + PCLASS_REMOVE_DEVICE ClassRemoveDevice; + PCLASS_QUERY_PNP_CAPABILITIES ClassQueryPnpCapabilities; + CLASS_WMI_INFO ClassWmiInfo; +} CLASS_DEV_INFO, *PCLASS_DEV_INFO; + +struct _CLASS_INIT_DATA { + ULONG InitializationDataSize; + CLASS_DEV_INFO FdoData; + CLASS_DEV_INFO PdoData; + PCLASS_ADD_DEVICE ClassAddDevice; + PCLASS_ENUM_DEVICE ClassEnumerateDevice; + PCLASS_QUERY_ID ClassQueryId; + PDRIVER_STARTIO ClassStartIo; + PCLASS_UNLOAD ClassUnload; + PCLASS_TICK ClassTick; +}; + +typedef struct _FILE_OBJECT_EXTENSION { + PFILE_OBJECT FileObject; + PDEVICE_OBJECT DeviceObject; + ULONG LockCount; + ULONG McnDisableCount; +} FILE_OBJECT_EXTENSION, *PFILE_OBJECT_EXTENSION; + +typedef struct _CLASS_WORKING_SET { + ULONG Size; + ULONG XferPacketsWorkingSetMaximum; + ULONG XferPacketsWorkingSetMinimum; +} CLASS_WORKING_SET, *PCLASS_WORKING_SET; + +typedef struct _CLASS_INTERPRET_SENSE_INFO2 { + ULONG Size; + ULONG HistoryCount; + PCLASS_COMPRESS_RETRY_HISTORY_DATA Compress; + PCLASS_INTERPRET_SENSE_INFO Interpret; +} CLASS_INTERPRET_SENSE_INFO2, *PCLASS_INTERPRET_SENSE_INFO2; + +C_ASSERT((MAXULONG - sizeof(SRB_HISTORY)) / 30000 >= sizeof(SRB_HISTORY_ITEM)); + +typedef struct _CLASS_DRIVER_EXTENSION { + UNICODE_STRING RegistryPath; + CLASS_INIT_DATA InitData; + ULONG DeviceCount; +#if (NTDDI_VERSION >= NTDDI_WINXP) + PCLASS_QUERY_WMI_REGINFO_EX ClassFdoQueryWmiRegInfoEx; + PCLASS_QUERY_WMI_REGINFO_EX ClassPdoQueryWmiRegInfoEx; +#endif +#if (NTDDI_VERSION >= NTDDI_VISTA) + REGHANDLE EtwHandle; + PDRIVER_DISPATCH DeviceMajorFunctionTable[IRP_MJ_MAXIMUM_FUNCTION + 1]; + PDRIVER_DISPATCH MpDeviceMajorFunctionTable[IRP_MJ_MAXIMUM_FUNCTION + 1]; + PCLASS_INTERPRET_SENSE_INFO2 InterpretSenseInfo; + PCLASS_WORKING_SET WorkingSet; +#endif +} CLASS_DRIVER_EXTENSION, *PCLASS_DRIVER_EXTENSION; + +typedef struct _COMMON_DEVICE_EXTENSION { + ULONG Version; + PDEVICE_OBJECT DeviceObject; + PDEVICE_OBJECT LowerDeviceObject; + struct _FUNCTIONAL_DEVICE_EXTENSION *PartitionZeroExtension; + PCLASS_DRIVER_EXTENSION DriverExtension; + LONG RemoveLock; + KEVENT RemoveEvent; + KSPIN_LOCK RemoveTrackingSpinlock; + PVOID RemoveTrackingList; + LONG RemoveTrackingUntrackedCount; + PVOID DriverData; + _ANONYMOUS_STRUCT struct { + BOOLEAN IsFdo:1; + BOOLEAN IsInitialized:1; + BOOLEAN IsSrbLookasideListInitialized:1; + } DUMMYSTRUCTNAME; + UCHAR PreviousState; + UCHAR CurrentState; + ULONG IsRemoved; + UNICODE_STRING DeviceName; + struct _PHYSICAL_DEVICE_EXTENSION *ChildList; + ULONG PartitionNumber; + LARGE_INTEGER PartitionLength; + LARGE_INTEGER StartingOffset; + PCLASS_DEV_INFO DevInfo; + ULONG PagingPathCount; + ULONG DumpPathCount; + ULONG HibernationPathCount; + KEVENT PathCountEvent; +#ifndef ALLOCATE_SRB_FROM_POOL + NPAGED_LOOKASIDE_LIST SrbLookasideList; +#endif + UNICODE_STRING MountedDeviceInterfaceName; + ULONG GuidCount; + PGUIDREGINFO GuidRegInfo; + DICTIONARY FileObjectDictionary; +#if (NTDDI_VERSION >= NTDDI_WINXP) + PCLASS_PRIVATE_COMMON_DATA PrivateCommonData; +#else + ULONG_PTR Reserved1; +#endif +#if (NTDDI_VERSION >= NTDDI_VISTA) + PDRIVER_DISPATCH *DispatchTable; +#else + ULONG_PTR Reserved2; +#endif + ULONG_PTR Reserved3; + ULONG_PTR Reserved4; +} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION; + +typedef struct _PHYSICAL_DEVICE_EXTENSION { + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + ULONG Version; + PDEVICE_OBJECT DeviceObject; + } DUMMYSTRUCTNAME; + COMMON_DEVICE_EXTENSION CommonExtension; + } DUMMYUNIONNAME; + BOOLEAN IsMissing; + BOOLEAN IsEnumerated; +#if (NTDDI_VERSION >= NTDDI_WINXP) + PCLASS_PRIVATE_PDO_DATA PrivatePdoData; +#else + ULONG_PTR Reserved1; +#endif + ULONG_PTR Reserved2; + ULONG_PTR Reserved3; + ULONG_PTR Reserved4; +} PHYSICAL_DEVICE_EXTENSION, *PPHYSICAL_DEVICE_EXTENSION; + +typedef struct _CLASS_POWER_OPTIONS { + ULONG PowerDown:1; + ULONG LockQueue:1; + ULONG HandleSpinDown:1; + ULONG HandleSpinUp:1; + ULONG Reserved:27; +} CLASS_POWER_OPTIONS, *PCLASS_POWER_OPTIONS; + +typedef struct _CLASS_POWER_CONTEXT { + union { + CLASS_POWER_DOWN_STATE PowerDown; + CLASS_POWER_DOWN_STATE2 PowerDown2; + CLASS_POWER_UP_STATE PowerUp; + } PowerChangeState; + CLASS_POWER_OPTIONS Options; + BOOLEAN InUse; + BOOLEAN QueueLocked; + NTSTATUS FinalStatus; + ULONG RetryCount; + ULONG RetryInterval; + PIO_COMPLETION_ROUTINE CompletionRoutine; + PDEVICE_OBJECT DeviceObject; + PIRP Irp; + SCSI_REQUEST_BLOCK Srb; +} CLASS_POWER_CONTEXT, *PCLASS_POWER_CONTEXT; + +typedef struct _COMPLETION_CONTEXT { + PDEVICE_OBJECT DeviceObject; + SCSI_REQUEST_BLOCK Srb; +} COMPLETION_CONTEXT, *PCOMPLETION_CONTEXT; + +SCSIPORTAPI +ULONG +NTAPI +ClassInitialize( + PVOID Argument1, + PVOID Argument2, + PCLASS_INIT_DATA InitializationData); + +typedef struct _CLASS_QUERY_WMI_REGINFO_EX_LIST { + ULONG Size; + PCLASS_QUERY_WMI_REGINFO_EX ClassFdoQueryWmiRegInfoEx; + PCLASS_QUERY_WMI_REGINFO_EX ClassPdoQueryWmiRegInfoEx; +} CLASS_QUERY_WMI_REGINFO_EX_LIST, *PCLASS_QUERY_WMI_REGINFO_EX_LIST; + +typedef struct _FUNCTIONAL_DEVICE_EXTENSION { + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + ULONG Version; + PDEVICE_OBJECT DeviceObject; + } DUMMYSTRUCTNAME; + COMMON_DEVICE_EXTENSION CommonExtension; + } DUMMYUNIONNAME; + PDEVICE_OBJECT LowerPdo; + PSTORAGE_DEVICE_DESCRIPTOR DeviceDescriptor; + PSTORAGE_ADAPTER_DESCRIPTOR AdapterDescriptor; + DEVICE_POWER_STATE DevicePowerState; + ULONG DMByteSkew; + ULONG DMSkew; + BOOLEAN DMActive; + DISK_GEOMETRY DiskGeometry; + PSENSE_DATA SenseData; + ULONG TimeOutValue; + ULONG DeviceNumber; + ULONG SrbFlags; + ULONG ErrorCount; + LONG LockCount; + LONG ProtectedLockCount; + LONG InternalLockCount; + KEVENT EjectSynchronizationEvent; + USHORT DeviceFlags; + UCHAR SectorShift; +#if (NTDDI_VERSION >= NTDDI_VISTA) + UCHAR CdbForceUnitAccess; +#else + UCHAR ReservedByte; +#endif + PMEDIA_CHANGE_DETECTION_INFO MediaChangeDetectionInfo; + PKEVENT Unused1; + HANDLE Unused2; + FILE_OBJECT_EXTENSION KernelModeMcnContext; + ULONG MediaChangeCount; + HANDLE DeviceDirectory; + KSPIN_LOCK ReleaseQueueSpinLock; + PIRP ReleaseQueueIrp; + SCSI_REQUEST_BLOCK ReleaseQueueSrb; + BOOLEAN ReleaseQueueNeeded; + BOOLEAN ReleaseQueueInProgress; + BOOLEAN ReleaseQueueIrpFromPool; + BOOLEAN FailurePredicted; + ULONG FailureReason; + struct _FAILURE_PREDICTION_INFO* FailurePredictionInfo; + BOOLEAN PowerDownInProgress; + ULONG EnumerationInterlock; + KEVENT ChildLock; + PKTHREAD ChildLockOwner; + ULONG ChildLockAcquisitionCount; + ULONG ScanForSpecialFlags; + KDPC PowerRetryDpc; + KTIMER PowerRetryTimer; + CLASS_POWER_CONTEXT PowerContext; + +#if (NTDDI_VERSION <= NTDDI_WIN2K) + +#if (SPVER(NTDDI_VERSION) < 2)) + ULONG_PTR Reserved1; + ULONG_PTR Reserved2; + ULONG_PTR Reserved3; + ULONG_PTR Reserved4; +#else + ULONG CompletionSuccessCount; + ULONG SavedSrbFlags; + ULONG SavedErrorCount; + ULONG_PTR Reserved1; +#endif + +#else /* (NTDDI_VERSION <= NTDDI_WIN2K) */ + + PCLASS_PRIVATE_FDO_DATA PrivateFdoData; + ULONG_PTR Reserved2; + ULONG_PTR Reserved3; + ULONG_PTR Reserved4; + +#endif /* (NTDDI_VERSION <= NTDDI_WIN2K) */ + +} FUNCTIONAL_DEVICE_EXTENSION, *PFUNCTIONAL_DEVICE_EXTENSION; + +SCSIPORTAPI +ULONG +NTAPI +ClassInitializeEx( + PDRIVER_OBJECT DriverObject, + LPGUID Guid, + PVOID Data); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassCreateDeviceObject( + PDRIVER_OBJECT DriverObject, + PCCHAR ObjectNameBuffer, + PDEVICE_OBJECT LowerDeviceObject, + BOOLEAN IsFdo, + PDEVICE_OBJECT *DeviceObject); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassReadDriveCapacity( + PDEVICE_OBJECT DeviceObject); + +SCSIPORTAPI +VOID +NTAPI +ClassReleaseQueue( + PDEVICE_OBJECT DeviceObject); + +SCSIPORTAPI +VOID +NTAPI +ClassSplitRequest( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + ULONG MaximumBytes); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassDeviceControl( + PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassIoComplete( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID Context); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassIoCompleteAssociated( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID Context); + +SCSIPORTAPI +BOOLEAN +NTAPI +ClassInterpretSenseInfo( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + UCHAR MajorFunctionCode, + ULONG IoDeviceCode, + ULONG RetryCount, + NTSTATUS *Status, + ULONG *RetryInterval); + +VOID +NTAPI +ClassSendDeviceIoControlSynchronous( + ULONG IoControlCode, + PDEVICE_OBJECT TargetDeviceObject, + PVOID Buffer, + ULONG InputBufferLength, + ULONG OutputBufferLength, + BOOLEAN InternalDeviceIoControl, + PIO_STATUS_BLOCK IoStatus); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassSendIrpSynchronous( + PDEVICE_OBJECT TargetDeviceObject, + PIRP Irp); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassForwardIrpSynchronous( + PCOMMON_DEVICE_EXTENSION CommonExtension, + PIRP Irp); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassSendSrbSynchronous( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + PVOID BufferAddress, + ULONG BufferLength, + BOOLEAN WriteToDevice); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassSendSrbAsynchronous( + PDEVICE_OBJECT DeviceObject, + PSCSI_REQUEST_BLOCK Srb, + PIRP Irp, + PVOID BufferAddress, + ULONG BufferLength, + BOOLEAN WriteToDevice); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassBuildRequest( + PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +SCSIPORTAPI +ULONG +NTAPI +ClassModeSense( + PDEVICE_OBJECT DeviceObject, + PCHAR ModeSenseBuffer, + ULONG Length, + UCHAR PageMode); + +SCSIPORTAPI +PVOID +NTAPI +ClassFindModePage( + PCHAR ModeSenseBuffer, + ULONG Length, + UCHAR PageMode, + BOOLEAN Use6Byte); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassClaimDevice( + PDEVICE_OBJECT LowerDeviceObject, + BOOLEAN Release); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassInternalIoControl ( + PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +SCSIPORTAPI +VOID +NTAPI +ClassInitializeSrbLookasideList( + PCOMMON_DEVICE_EXTENSION CommonExtension, + ULONG NumberElements); + +SCSIPORTAPI +VOID +NTAPI +ClassDeleteSrbLookasideList( + PCOMMON_DEVICE_EXTENSION CommonExtension); + +SCSIPORTAPI +ULONG +NTAPI +ClassQueryTimeOutRegistryValue( + PDEVICE_OBJECT DeviceObject); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassGetDescriptor( + PDEVICE_OBJECT DeviceObject, + PSTORAGE_PROPERTY_ID PropertyId, + PSTORAGE_DESCRIPTOR_HEADER *Descriptor); + +SCSIPORTAPI +VOID +NTAPI +ClassInvalidateBusRelations( + PDEVICE_OBJECT Fdo); + +SCSIPORTAPI +VOID +NTAPI +ClassMarkChildrenMissing( + PFUNCTIONAL_DEVICE_EXTENSION Fdo); + +SCSIPORTAPI +BOOLEAN +NTAPI +ClassMarkChildMissing( + PPHYSICAL_DEVICE_EXTENSION PdoExtension, + BOOLEAN AcquireChildLock); + +SCSIPORTAPI +VOID +ClassDebugPrint( + CLASS_DEBUG_LEVEL DebugPrintLevel, + PCCHAR DebugMessage, + ...); + +SCSIPORTAPI +PCLASS_DRIVER_EXTENSION +NTAPI +ClassGetDriverExtension( + PDRIVER_OBJECT DriverObject); + +SCSIPORTAPI +VOID +NTAPI +ClassCompleteRequest( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + CCHAR PriorityBoost); + +SCSIPORTAPI +VOID +NTAPI +ClassReleaseRemoveLock( + PDEVICE_OBJECT DeviceObject, + PIRP Tag); + +SCSIPORTAPI +ULONG +NTAPI +ClassAcquireRemoveLockEx( + PDEVICE_OBJECT DeviceObject, + PVOID Tag, + PCSTR File, + ULONG Line); + +SCSIPORTAPI +VOID +NTAPI +ClassUpdateInformationInRegistry( + PDEVICE_OBJECT Fdo, + PCHAR DeviceName, + ULONG DeviceNumber, + PINQUIRYDATA InquiryData, + ULONG InquiryDataLength); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassWmiCompleteRequest( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + NTSTATUS Status, + ULONG BufferUsed, + CCHAR PriorityBoost); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassWmiFireEvent( + PDEVICE_OBJECT DeviceObject, + LPGUID Guid, + ULONG InstanceIndex, + ULONG EventDataSize, + PVOID EventData); + +SCSIPORTAPI +VOID +NTAPI +ClassResetMediaChangeTimer( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + +SCSIPORTAPI +VOID +NTAPI +ClassInitializeMediaChangeDetection( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + PUCHAR EventPrefix); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassInitializeTestUnitPolling( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + BOOLEAN AllowDriveToSleep); + +SCSIPORTAPI +PVPB +NTAPI +ClassGetVpb( + PDEVICE_OBJECT DeviceObject); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassSpinDownPowerHandler( + PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +NTSTATUS +NTAPI +ClassStopUnitPowerHandler( + PDEVICE_OBJECT DeviceObject, + PIRP Irp); + +NTSTATUS +NTAPI +ClassSetFailurePredictionPoll( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + FAILURE_PREDICTION_METHOD FailurePredictionMethod, + ULONG PollingPeriod); + +VOID +NTAPI +ClassNotifyFailurePredicted( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + PUCHAR Buffer, + ULONG BufferSize, + BOOLEAN LogError, + ULONG UniqueErrorValue, + UCHAR PathId, + UCHAR TargetId, + UCHAR Lun); + +SCSIPORTAPI +VOID +NTAPI +ClassAcquireChildLock( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + +SCSIPORTAPI +VOID +NTAPI +ClassReleaseChildLock( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + +NTSTATUS +NTAPI +ClassSignalCompletion( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PKEVENT Event); + +VOID +NTAPI +ClassSendStartUnit( + PDEVICE_OBJECT DeviceObject); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassRemoveDevice( + PDEVICE_OBJECT DeviceObject, + UCHAR RemoveType); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassAsynchronousCompletion( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID Event); + +SCSIPORTAPI +VOID +NTAPI +ClassCheckMediaState( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + +SCSIPORTAPI +NTSTATUS +NTAPI +ClassCheckVerifyComplete( + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID Context); + +SCSIPORTAPI +VOID +NTAPI +ClassSetMediaChangeState( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + MEDIA_CHANGE_DETECTION_STATE State, + BOOLEAN Wait); + +SCSIPORTAPI +VOID +NTAPI +ClassEnableMediaChangeDetection( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + +SCSIPORTAPI +VOID +NTAPI +ClassDisableMediaChangeDetection( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + +SCSIPORTAPI +VOID +NTAPI +ClassCleanupMediaChangeDetection( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + +VOID +NTAPI +ClassGetDeviceParameter( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + PWSTR SubkeyName, + PWSTR ParameterName, + PULONG ParameterValue); + +NTSTATUS +NTAPI +ClassSetDeviceParameter( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + PWSTR SubkeyName, + PWSTR ParameterName, + ULONG ParameterValue); + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +PFILE_OBJECT_EXTENSION +NTAPI +ClassGetFsContext( + PCOMMON_DEVICE_EXTENSION CommonExtension, + PFILE_OBJECT FileObject); + +VOID +NTAPI +ClassSendNotification( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + const GUID *Guid, + ULONG ExtraDataSize, + PVOID ExtraData); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +static __inline +BOOLEAN +PORT_ALLOCATED_SENSE( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + PSCSI_REQUEST_BLOCK Srb) +{ + return ((BOOLEAN)((TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE) && + TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)) && + (Srb->SenseInfoBuffer != FdoExtension->SenseData))); +} + +static __inline +VOID +FREE_PORT_ALLOCATED_SENSE_BUFFER( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + PSCSI_REQUEST_BLOCK Srb) +{ + ASSERT(TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE)); + ASSERT(TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)); + ASSERT(Srb->SenseInfoBuffer != FdoExtension->SenseData); + + ExFreePool(Srb->SenseInfoBuffer); + Srb->SenseInfoBuffer = FdoExtension->SenseData; + Srb->SenseInfoBufferLength = SENSE_BUFFER_SIZE; + CLEAR_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER); + return; +} + +typedef VOID +(NTAPI *PCLASS_SCAN_FOR_SPECIAL_HANDLER)( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + ULONG_PTR Data); + +VOID +NTAPI +ClassScanForSpecial( + PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + CLASSPNP_SCAN_FOR_SPECIAL_INFO DeviceList[], + PCLASS_SCAN_FOR_SPECIAL_HANDLER Function); diff --git a/include/ddk/ntstrsafe.h b/include/ddk/ntstrsafe.h index f7fc9f39355..c107a0da425 100644 --- a/include/ddk/ntstrsafe.h +++ b/include/ddk/ntstrsafe.h @@ -221,7 +221,6 @@ RtlStringCchCopyA(IN LPSTR Destination, static __inline NTSTATUS -NTAPI RtlStringCbPrintfA(OUT LPSTR Destination, IN SIZE_T Length, IN LPCSTR Format, @@ -251,7 +250,6 @@ RtlStringCbPrintfA(OUT LPSTR Destination, static __inline NTSTATUS -NTAPI RtlStringCbPrintfExA(OUT LPSTR Destination, IN SIZE_T Length, OUT LPSTR *DestinationEnd OPTIONAL, @@ -409,7 +407,6 @@ RtlStringCbCopyExA(OUT LPSTR Destination, static __inline NTSTATUS -NTAPI RtlStringCbPrintfW( LPWSTR pszDest, IN size_t cbDest, diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index daffb9b1fd5..233a0c96a4b 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -9773,7 +9773,7 @@ KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock) #endif NTKERNELAPI -DECLSPEC_NORETURN +//DECLSPEC_NORETURN VOID NTAPI KeBugCheckEx( @@ -10615,6 +10615,7 @@ KeFlushWriteBuffer(VOID); ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset)) #define MmGetProcedureAddress(Address) (Address) +#define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address) /* PVOID MmGetSystemAddressForMdl( * IN PMDL Mdl); diff --git a/include/ndk/mmtypes.h b/include/ndk/mmtypes.h index da4a63edf33..f7c553446db 100644 --- a/include/ndk/mmtypes.h +++ b/include/ndk/mmtypes.h @@ -740,6 +740,27 @@ typedef struct _MMVAD_LONG } u4; } MMVAD_LONG, *PMMVAD_LONG; +// +// Short VAD used in virtual memory allocations +// +typedef struct _MMVAD_SHORT +{ + union + { + LONG_PTR Balance:2; + PMMVAD Parent; + } u1; + PMMVAD LeftChild; + PMMVAD RightChild; + ULONG StartingVpn; + ULONG EndingVpn; + union + { + ULONG LongFlags; + MMVAD_FLAGS VadFlags; + } u; +} MMVAD_SHORT, *PMMVAD_SHORT; + // // Actual Section Object // diff --git a/include/ndk/rtlfuncs.h b/include/ndk/rtlfuncs.h index a58690ec66e..a5c453f2e32 100644 --- a/include/ndk/rtlfuncs.h +++ b/include/ndk/rtlfuncs.h @@ -707,6 +707,17 @@ RtlProtectHeap( IN BOOLEAN Protect ); +NTSYSAPI +NTSTATUS +NTAPI +RtlQueryHeapInformation ( + IN PVOID HeapHandle, + IN HEAP_INFORMATION_CLASS HeapInformationClass, + OUT PVOID HeapInformation OPTIONAL, + IN SIZE_T HeapInformationLength OPTIONAL, + OUT PSIZE_T ReturnLength OPTIONAL + ); + NTSYSAPI PWSTR NTAPI @@ -728,6 +739,16 @@ RtlReAllocateHeap( SIZE_T Size ); +NTSYSAPI +NTSTATUS +NTAPI +RtlSetHeapInformation ( + IN PVOID HeapHandle, + IN HEAP_INFORMATION_CLASS HeapInformationClass, + IN PVOID HeapInformation OPTIONAL, + IN SIZE_T HeapInformationLength OPTIONAL + ); + NTSYSAPI BOOLEAN NTAPI @@ -735,6 +756,27 @@ RtlLockHeap( IN HANDLE Heap ); +NTSYSAPI +NTSTATUS +NTAPI +RtlMultipleAllocateHeap ( + IN PVOID HeapHandle, + IN ULONG Flags, + IN SIZE_T Size, + IN ULONG Count, + OUT PVOID * Array + ); + +NTSYSAPI +NTSTATUS +NTAPI +RtlMultipleFreeHeap ( + IN PVOID HeapHandle, + IN ULONG Flags, + IN ULONG Count, + OUT PVOID * Array + ); + NTSYSAPI NTSTATUS NTAPI @@ -766,7 +808,8 @@ RtlSetUserFlagsHeap( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID BaseAddress, - IN ULONG UserFlags + IN ULONG UserFlagsReset, + IN ULONG UserFlagsSet ); NTSYSAPI @@ -3318,7 +3361,7 @@ NTSYSAPI ULONG NTAPI RtlComputeCrc32( - IN USHORT PartialCrc, + IN ULONG InitialCrc, IN PUCHAR Buffer, IN ULONG Length ); @@ -3496,14 +3539,14 @@ NTSYSAPI NTSTATUS NTAPI RtlLockBootStatusData( - HANDLE FileHandle + OUT PHANDLE FileHandle ); NTSYSAPI NTSTATUS NTAPI RtlUnlockBootStatusData( - HANDLE FileHandle + IN HANDLE FileHandle ); #endif diff --git a/include/ndk/rtltypes.h b/include/ndk/rtltypes.h index 04aa9242624..45ccf9af7f0 100644 --- a/include/ndk/rtltypes.h +++ b/include/ndk/rtltypes.h @@ -368,6 +368,15 @@ typedef enum _RTL_PATH_TYPE #ifndef NTOS_MODE_USER +// +// Heap Information Class +// +typedef enum _HEAP_INFORMATION_CLASS +{ + HeapCompatibilityInformation, + HeapEnableTerminationOnCorruption +} HEAP_INFORMATION_CLASS; + // // Callback function for RTL Timers or Registered Waits // @@ -1039,6 +1048,21 @@ typedef struct _RTL_CRITICAL_SECTION #endif +// +// RTL Private Heap Structures +// +typedef struct _HEAP_LOCK +{ + union + { + RTL_CRITICAL_SECTION CriticalSection; +#ifndef NTOS_MODE_USER + ERESOURCE Resource; +#endif + UCHAR Padding[0x68]; /* Max ERESOURCE size for x64 build. Needed because RTL is built only once */ + }; +} HEAP_LOCK, *PHEAP_LOCK; + // // RTL Range List Structures // diff --git a/include/psdk/authz.h b/include/psdk/authz.h index da2cf6f119a..aab6c1e79e2 100644 --- a/include/psdk/authz.h +++ b/include/psdk/authz.h @@ -222,7 +222,7 @@ AuthzInitializeContextFromToken(IN DWORD Flags, AUTHZAPI BOOL -WINAPI +WINAPIV AuthzInitializeObjectAccessAuditEvent(IN DWORD Flags, IN AUTHZ_AUDIT_EVENT_TYPE_HANDLE hAuditEventType, IN PWSTR szOperationType, @@ -230,11 +230,12 @@ AuthzInitializeObjectAccessAuditEvent(IN DWORD Flags, IN PWSTR szObjectName, IN PWSTR szAdditionalInfo, OUT PAUTHZ_AUDIT_EVENT_HANDLE phAuditEvent, - IN DWORD dwAdditionalParamCount); + IN DWORD dwAdditionalParameterCount, + ...); AUTHZAPI BOOL -WINAPI +WINAPIV AuthzInitializeObjectAccessAuditEvent2(IN DWORD Flags, IN AUTHZ_AUDIT_EVENT_TYPE_HANDLE hAuditEventType, IN PWSTR szOperationType, @@ -243,7 +244,8 @@ AuthzInitializeObjectAccessAuditEvent2(IN DWORD Flags, IN PWSTR szAdditionalInfo, IN PWSTR szAdditionalInfo2, OUT PAUTHZ_AUDIT_EVENT_HANDLE phAuditEvent, - IN DWORD dwAdditionalParameterCount); + IN DWORD dwAdditionalParameterCount, + ...); AUTHZAPI BOOL @@ -282,7 +284,7 @@ AuthzRegisterSecurityEventSource(IN DWORD dwFlags, AUTHZAPI BOOL -WINAPI +WINAPIV AuthzReportSecurityEvent(IN DWORD dwFlags, IN AUTHZ_SECURITY_EVENT_PROVIDER_HANDLE hEventProvider, IN DWORD dwAuditId, diff --git a/include/psdk/ioevent.h b/include/psdk/ioevent.h index b87c950ccfb..fd2c720ddc4 100644 --- a/include/psdk/ioevent.h +++ b/include/psdk/ioevent.h @@ -71,6 +71,44 @@ DEFINE_GUID(GUID_IO_DISK_CLONE_ARRIVAL, DEFINE_GUID(GUID_IO_DISK_LAYOUT_CHANGE, 0x11DFF54C, 0x8469, 0x41F9, 0xB3, 0xDE, 0xEF, 0x83, 0x64, 0x87, 0xC5, 0x4A); +typedef struct _DEVICE_EVENT_MOUNT { + ULONG Version; + ULONG Flags; + ULONG FileSystemNameLength; + ULONG FileSystemNameOffset; +} DEVICE_EVENT_MOUNT, *PDEVICE_EVENT_MOUNT; + +typedef struct _DEVICE_EVENT_BECOMING_READY { + ULONG Version; + ULONG Reason; + ULONG Estimated100msToReady; +} DEVICE_EVENT_BECOMING_READY, *PDEVICE_EVENT_BECOMING_READY; + +typedef struct _DEVICE_EVENT_EXTERNAL_REQUEST { + ULONG Version; + ULONG DeviceClass; + USHORT ButtonStatus; + USHORT Request; + LARGE_INTEGER SystemTime; +} DEVICE_EVENT_EXTERNAL_REQUEST, *PDEVICE_EVENT_EXTERNAL_REQUEST; + +typedef struct _DEVICE_EVENT_GENERIC_DATA { + ULONG EventNumber; +} DEVICE_EVENT_GENERIC_DATA, *PDEVICE_EVENT_GENERIC_DATA; + +typedef struct _DEVICE_EVENT_RBC_DATA { + ULONG EventNumber; + UCHAR SenseQualifier; + UCHAR SenseCode; + UCHAR SenseKey; + UCHAR Reserved; + ULONG Information; +} DEVICE_EVENT_RBC_DATA, *PDEVICE_EVENT_RBC_DATA; + +typedef struct _GUID_IO_DISK_CLONE_ARRIVAL_INFORMATION { + ULONG DiskNumber; +} GUID_IO_DISK_CLONE_ARRIVAL_INFORMATION, *PGUID_IO_DISK_CLONE_ARRIVAL_INFORMATION; + #ifdef __cplusplus } #endif diff --git a/include/psdk/msi.h b/include/psdk/msi.h index b331057d53c..550ce954b62 100644 --- a/include/psdk/msi.h +++ b/include/psdk/msi.h @@ -19,14 +19,14 @@ #ifndef __WINE_MSI_H #define __WINE_MSI_H -#ifdef __cplusplus -extern "C" { -#endif - #ifndef _MSI_NO_CRYPTO #include #endif +#ifdef __cplusplus +extern "C" { +#endif + typedef ULONG MSIHANDLE; typedef enum tagINSTALLSTATE @@ -663,6 +663,12 @@ UINT WINAPI MsiApplyMultiplePatchesA(LPCSTR, LPCSTR, LPCSTR); UINT WINAPI MsiApplyMultiplePatchesW(LPCWSTR, LPCWSTR, LPCWSTR); #define MsiApplyMultiplePatches WINELIB_NAME_AW(MsiApplyMultiplePatches) +UINT WINAPI MsiBeginTransactionA(LPCSTR, DWORD, MSIHANDLE *, HANDLE *); +UINT WINAPI MsiBeginTransactionW(LPCWSTR, DWORD, MSIHANDLE *, HANDLE *); +#define MsiBeginTransaction WINELIB_NAME_AW(MsiBeginTransaction) + +UINT WINAPI MsiEndTransaction(DWORD); + /* Non Unicode */ UINT WINAPI MsiCloseHandle(MSIHANDLE); UINT WINAPI MsiCloseAllHandles(void); diff --git a/include/psdk/ntddcdrm.h b/include/psdk/ntddcdrm.h index 06411661995..c23487dade6 100644 --- a/include/psdk/ntddcdrm.h +++ b/include/psdk/ntddcdrm.h @@ -37,12 +37,18 @@ extern "C" { #define IOCTL_CDROM_FIND_NEW_DEVICES \ CTL_CODE(IOCTL_CDROM_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_CDROM_GET_CONFIGURATION \ + CTL_CODE(IOCTL_CDROM_BASE, 0x0016, METHOD_BUFFERED, FILE_READ_ACCESS) + #define IOCTL_CDROM_GET_CONTROL \ CTL_CODE(IOCTL_CDROM_BASE, 0x000D, METHOD_BUFFERED, FILE_READ_ACCESS) #define IOCTL_CDROM_GET_DRIVE_GEOMETRY \ CTL_CODE(IOCTL_CDROM_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_CDROM_GET_DRIVE_GEOMETRY_EX \ + CTL_CODE(IOCTL_CDROM_BASE, 0x0014, METHOD_BUFFERED, FILE_READ_ACCESS) + #define IOCTL_CDROM_GET_LAST_SESSION \ CTL_CODE(IOCTL_CDROM_BASE, 0x000E, METHOD_BUFFERED, FILE_READ_ACCESS) @@ -159,6 +165,13 @@ typedef struct _CDROM_TOC { #define CDROM_TOC_SIZE sizeof(CDROM_TOC) +typedef struct _CDROM_TOC_SESSION_DATA { + UCHAR Length[2]; + UCHAR FirstCompleteSession; + UCHAR LastCompleteSession; + TRACK_DATA TrackData[1]; +} CDROM_TOC_SESSION_DATA, *PCDROM_TOC_SESSION_DATA; + typedef struct _CDROM_TOC_ATIP_DATA_BLOCK { UCHAR CdrwReferenceSpeed : 3; UCHAR Reserved3 : 1; diff --git a/include/psdk/ntddcdvd.h b/include/psdk/ntddcdvd.h index 9bd4b3cdc90..c07164de633 100644 --- a/include/psdk/ntddcdvd.h +++ b/include/psdk/ntddcdvd.h @@ -31,12 +31,18 @@ extern "C" { #define IOCTL_DVD_BASE FILE_DEVICE_DVD +#define IOCTL_STORAGE_SET_READ_AHEAD \ + CTL_CODE(IOCTL_STORAGE_BASE, 0x0100, METHOD_BUFFERED, FILE_READ_ACCESS) + #define IOCTL_DVD_END_SESSION \ CTL_CODE(IOCTL_DVD_BASE, 0x0403, METHOD_BUFFERED, FILE_READ_ACCESS) #define IOCTL_DVD_GET_REGION \ CTL_CODE(IOCTL_DVD_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DVD_SEND_KEY2 \ + CTL_CODE(IOCTL_DVD_BASE, 0x0406, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + #define IOCTL_DVD_READ_KEY \ CTL_CODE(IOCTL_DVD_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS) diff --git a/include/psdk/ntddmmc.h b/include/psdk/ntddmmc.h new file mode 100644 index 00000000000..f98368af13f --- /dev/null +++ b/include/psdk/ntddmmc.h @@ -0,0 +1,661 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the ReactOS PSDK package. + * No warranty is given; refer to the file DISCLAIMER within this package. + */ + +#pragma once + +#define __NTDDMMC__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define SCSI_GET_CONFIGURATION_REQUEST_TYPE_ALL 0x0 +#define SCSI_GET_CONFIGURATION_REQUEST_TYPE_CURRENT 0x1 +#define SCSI_GET_CONFIGURATION_REQUEST_TYPE_ONE 0x2 + +typedef struct _GET_CONFIGURATION_HEADER { + UCHAR DataLength[4]; + UCHAR Reserved[2]; + UCHAR CurrentProfile[2]; +#if !defined(__midl) && !defined(__WIDL__) + UCHAR Data[0]; +#endif +} GET_CONFIGURATION_HEADER, *PGET_CONFIGURATION_HEADER; + +typedef struct _FEATURE_HEADER { + UCHAR FeatureCode[2]; + UCHAR Current:1; + UCHAR Persistent:1; + UCHAR Version:4; + UCHAR Reserved0:2; + UCHAR AdditionalLength; +} FEATURE_HEADER, *PFEATURE_HEADER; + +typedef enum _FEATURE_PROFILE_TYPE { + ProfileInvalid = 0x0000, + ProfileNonRemovableDisk = 0x0001, + ProfileRemovableDisk = 0x0002, + ProfileMOErasable = 0x0003, + ProfileMOWriteOnce = 0x0004, + ProfileAS_MO = 0x0005, + ProfileCdrom = 0x0008, + ProfileCdRecordable = 0x0009, + ProfileCdRewritable = 0x000a, + ProfileDvdRom = 0x0010, + ProfileDvdRecordable = 0x0011, + ProfileDvdRam = 0x0012, + ProfileDvdRewritable = 0x0013, + ProfileDvdRWSequential = 0x0014, + ProfileDvdDashRDualLayer = 0x0015, + ProfileDvdDashRLayerJump = 0x0016, + ProfileDvdPlusRW = 0x001A, + ProfileDvdPlusR = 0x001B, + ProfileDDCdrom = 0x0020, + ProfileDDCdRecordable = 0x0021, + ProfileDDCdRewritable = 0x0022, + ProfileDvdPlusRWDualLayer = 0x002A, + ProfileDvdPlusRDualLayer = 0x002B, + ProfileBDRom = 0x0040, + ProfileBDRSequentialWritable = 0x0041, + ProfileBDRRandomWritable = 0x0042, + ProfileBDRewritable = 0x0043, + ProfileHDDVDRom = 0x0050, + ProfileHDDVDRecordable = 0x0051, + ProfileHDDVDRam = 0x0052, + ProfileHDDVDRewritable = 0x0053, + ProfileHDDVDRDualLayer = 0x0058, + ProfileHDDVDRWDualLayer = 0x005A, + ProfileNonStandard = 0xffff +} FEATURE_PROFILE_TYPE, *PFEATURE_PROFILE_TYPE; + +typedef enum _FEATURE_NUMBER { + FeatureProfileList = 0x0000, + FeatureCore = 0x0001, + FeatureMorphing = 0x0002, + FeatureRemovableMedium = 0x0003, + FeatureWriteProtect = 0x0004, + FeatureRandomReadable = 0x0010, + FeatureMultiRead = 0x001D, + FeatureCdRead = 0x001E, + FeatureDvdRead = 0x001F, + FeatureRandomWritable = 0x0020, + FeatureIncrementalStreamingWritable = 0x0021, + FeatureSectorErasable = 0x0022, + FeatureFormattable = 0x0023, + FeatureDefectManagement = 0x0024, + FeatureWriteOnce = 0x0025, + FeatureRestrictedOverwrite = 0x0026, + FeatureCdrwCAVWrite = 0x0027, + FeatureMrw = 0x0028, + FeatureEnhancedDefectReporting = 0x0029, + FeatureDvdPlusRW = 0x002A, + FeatureDvdPlusR = 0x002B, + FeatureRigidRestrictedOverwrite = 0x002C, + FeatureCdTrackAtOnce = 0x002D, + FeatureCdMastering = 0x002E, + FeatureDvdRecordableWrite = 0x002F, + FeatureDDCDRead = 0x0030, + FeatureDDCDRWrite = 0x0031, + FeatureDDCDRWWrite = 0x0032, + FeatureLayerJumpRecording = 0x0033, + FeatureCDRWMediaWriteSupport = 0x0037, + FeatureBDRPseudoOverwrite = 0x0038, + FeatureDvdPlusRWDualLayer = 0x003A, + FeatureDvdPlusRDualLayer = 0x003B, + FeatureBDRead = 0x0040, + FeatureBDWrite = 0x0041, + FeatureTSR = 0x0042, + FeatureHDDVDRead = 0x0050, + FeatureHDDVDWrite = 0x0051, + FeatureHybridDisc = 0x0080, + FeaturePowerManagement = 0x0100, + FeatureSMART = 0x0101, + FeatureEmbeddedChanger = 0x0102, + FeatureCDAudioAnalogPlay = 0x0103, + FeatureMicrocodeUpgrade = 0x0104, + FeatureTimeout = 0x0105, + FeatureDvdCSS = 0x0106, + FeatureRealTimeStreaming = 0x0107, + FeatureLogicalUnitSerialNumber = 0x0108, + FeatureMediaSerialNumber = 0x0109, + FeatureDiscControlBlocks = 0x010A, + FeatureDvdCPRM = 0x010B, + FeatureFirmwareDate = 0x010C, + FeatureAACS = 0x010D, + FeatureVCPS = 0x0110, +} FEATURE_NUMBER, *PFEATURE_NUMBER; + +typedef struct _FEATURE_DATA_PROFILE_LIST_EX { + UCHAR ProfileNumber[2]; + UCHAR Current:1; + UCHAR Reserved1:7; + UCHAR Reserved2; +} FEATURE_DATA_PROFILE_LIST_EX, *PFEATURE_DATA_PROFILE_LIST_EX; + +typedef struct _FEATURE_DATA_PROFILE_LIST { + FEATURE_HEADER Header; +#if !defined(__midl) && !defined(__WIDL__) + FEATURE_DATA_PROFILE_LIST_EX Profiles[0]; +#endif +} FEATURE_DATA_PROFILE_LIST, *PFEATURE_DATA_PROFILE_LIST; + +typedef struct _FEATURE_DATA_CORE { + FEATURE_HEADER Header; + UCHAR PhysicalInterface[4]; + UCHAR DeviceBusyEvent:1; + UCHAR INQUIRY2:1; + UCHAR Reserved1:6; + UCHAR Reserved2[3]; +} FEATURE_DATA_CORE, *PFEATURE_DATA_CORE; + +typedef struct _FEATURE_DATA_MORPHING { + FEATURE_HEADER Header; + UCHAR Asynchronous:1; + UCHAR OCEvent:1; + UCHAR Reserved01:6; + UCHAR Reserved2[3]; +} FEATURE_DATA_MORPHING, *PFEATURE_DATA_MORPHING; + +typedef struct _FEATURE_DATA_REMOVABLE_MEDIUM { + FEATURE_HEADER Header; + UCHAR Lockable:1; + UCHAR Reserved1:1; + UCHAR DefaultToPrevent:1; + UCHAR Eject:1; + UCHAR Reserved2:1; + UCHAR LoadingMechanism:3; + UCHAR Reserved3[3]; +} FEATURE_DATA_REMOVABLE_MEDIUM, *PFEATURE_DATA_REMOVABLE_MEDIUM; + +typedef struct _FEATURE_DATA_WRITE_PROTECT { + FEATURE_HEADER Header; + UCHAR SupportsSWPPBit:1; + UCHAR SupportsPersistentWriteProtect:1; + UCHAR WriteInhibitDCB:1; + UCHAR DiscWriteProtectPAC:1; + UCHAR Reserved01:4; + UCHAR Reserved2[3]; +} FEATURE_DATA_WRITE_PROTECT, *PFEATURE_DATA_WRITE_PROTECT; + +typedef struct _FEATURE_DATA_RANDOM_READABLE { + FEATURE_HEADER Header; + UCHAR LogicalBlockSize[4]; + UCHAR Blocking[2]; + UCHAR ErrorRecoveryPagePresent:1; + UCHAR Reserved1:7; + UCHAR Reserved2; +} FEATURE_DATA_RANDOM_READABLE, *PFEATURE_DATA_RANDOM_READABLE; + +typedef struct _FEATURE_DATA_MULTI_READ { + FEATURE_HEADER Header; +} FEATURE_DATA_MULTI_READ, *PFEATURE_DATA_MULTI_READ; + +typedef struct _FEATURE_DATA_CD_READ { + FEATURE_HEADER Header; + UCHAR CDText:1; + UCHAR C2ErrorData:1; + UCHAR Reserved01:5; + UCHAR DigitalAudioPlay:1; + UCHAR Reserved2[3]; +} FEATURE_DATA_CD_READ, *PFEATURE_DATA_CD_READ; + +typedef struct _FEATURE_DATA_DVD_READ { + FEATURE_HEADER Header; + UCHAR Multi110:1; + UCHAR Reserved1:7; + UCHAR Reserved2; + UCHAR DualDashR:1; + UCHAR Reserved3:7; + UCHAR Reserved4; +} FEATURE_DATA_DVD_READ, *PFEATURE_DATA_DVD_READ; + +typedef struct _FEATURE_DATA_RANDOM_WRITABLE { + FEATURE_HEADER Header; + UCHAR LastLBA[4]; + UCHAR LogicalBlockSize[4]; + UCHAR Blocking[2]; + UCHAR ErrorRecoveryPagePresent:1; + UCHAR Reserved1:7; + UCHAR Reserved2; +} FEATURE_DATA_RANDOM_WRITABLE, *PFEATURE_DATA_RANDOM_WRITABLE; + +typedef struct _FEATURE_DATA_INCREMENTAL_STREAMING_WRITABLE { + FEATURE_HEADER Header; + UCHAR DataTypeSupported[2]; + UCHAR BufferUnderrunFree:1; + UCHAR AddressModeReservation:1; + UCHAR TrackRessourceInformation:1; + UCHAR Reserved01:5; + UCHAR NumberOfLinkSizes; +#if !defined(__midl) && !defined(__WIDL__) + UCHAR LinkSize[0]; +#endif +} FEATURE_DATA_INCREMENTAL_STREAMING_WRITABLE, *PFEATURE_DATA_INCREMENTAL_STREAMING_WRITABLE; + +typedef struct _FEATURE_DATA_SECTOR_ERASABLE { + FEATURE_HEADER Header; +} FEATURE_DATA_SECTOR_ERASABLE, *PFEATURE_DATA_SECTOR_ERASABLE; + +typedef struct _FEATURE_DATA_FORMATTABLE { + FEATURE_HEADER Header; + UCHAR FullCertification:1; + UCHAR QuickCertification:1; + UCHAR SpareAreaExpansion:1; + UCHAR RENoSpareAllocated:1; + UCHAR Reserved1:4; + UCHAR Reserved2[3]; + UCHAR RRandomWritable:1; + UCHAR Reserved3:7; + UCHAR Reserved4[3]; +} FEATURE_DATA_FORMATTABLE, *PFEATURE_DATA_FORMATTABLE; + +typedef struct _FEATURE_DATA_DEFECT_MANAGEMENT { + FEATURE_HEADER Header; + UCHAR Reserved1:7; + UCHAR SupplimentalSpareArea:1; + UCHAR Reserved2[3]; +} FEATURE_DATA_DEFECT_MANAGEMENT, *PFEATURE_DATA_DEFECT_MANAGEMENT; + +typedef struct _FEATURE_DATA_WRITE_ONCE { + FEATURE_HEADER Header; + UCHAR LogicalBlockSize[4]; + UCHAR Blocking[2]; + UCHAR ErrorRecoveryPagePresent:1; + UCHAR Reserved1:7; + UCHAR Reserved2; +} FEATURE_DATA_WRITE_ONCE, *PFEATURE_DATA_WRITE_ONCE; + +typedef struct _FEATURE_DATA_RESTRICTED_OVERWRITE { + FEATURE_HEADER Header; +} FEATURE_DATA_RESTRICTED_OVERWRITE, *PFEATURE_DATA_RESTRICTED_OVERWRITE; + +typedef struct _FEATURE_DATA_CDRW_CAV_WRITE { + FEATURE_HEADER Header; + UCHAR Reserved1[4]; +} FEATURE_DATA_CDRW_CAV_WRITE, *PFEATURE_DATA_CDRW_CAV_WRITE; + +typedef struct _FEATURE_DATA_MRW { + FEATURE_HEADER Header; + UCHAR Write:1; + UCHAR DvdPlusRead:1; + UCHAR DvdPlusWrite:1; + UCHAR Reserved01:5; + UCHAR Reserved2[3]; +} FEATURE_DATA_MRW, *PFEATURE_DATA_MRW; + +typedef struct _FEATURE_ENHANCED_DEFECT_REPORTING { + FEATURE_HEADER Header; + UCHAR DRTDMSupported:1; + UCHAR Reserved0:7; + UCHAR NumberOfDBICacheZones; + UCHAR NumberOfEntries[2]; +} FEATURE_ENHANCED_DEFECT_REPORTING, *PFEATURE_ENHANCED_DEFECT_REPORTING; + +typedef struct _FEATURE_DATA_DVD_PLUS_RW { + FEATURE_HEADER Header; + UCHAR Write:1; + UCHAR Reserved1:7; + UCHAR CloseOnly:1; + UCHAR QuickStart:1; + UCHAR Reserved02:6; + UCHAR Reserved03[2]; +} FEATURE_DATA_DVD_PLUS_RW, *PFEATURE_DATA_DVD_PLUS_RW; + +typedef struct _FEATURE_DATA_DVD_PLUS_R { + FEATURE_HEADER Header; + UCHAR Write:1; + UCHAR Reserved1:7; + UCHAR Reserved2[3]; +} FEATURE_DATA_DVD_PLUS_R, *PFEATURE_DATA_DVD_PLUS_R; + +typedef struct _FEATURE_DATA_DVD_RW_RESTRICTED_OVERWRITE { + FEATURE_HEADER Header; + UCHAR Blank:1; + UCHAR Intermediate:1; + UCHAR DefectStatusDataRead:1; + UCHAR DefectStatusDataGenerate:1; + UCHAR Reserved0:4; + UCHAR Reserved1[3]; +} FEATURE_DATA_DVD_RW_RESTRICTED_OVERWRITE, *PFEATURE_DATA_DVD_RW_RESTRICTED_OVERWRITE; + +typedef struct _FEATURE_DATA_CD_TRACK_AT_ONCE { + FEATURE_HEADER Header; + UCHAR RWSubchannelsRecordable:1; + UCHAR CdRewritable:1; + UCHAR TestWriteOk:1; + UCHAR RWSubchannelPackedOk:1; + UCHAR RWSubchannelRawOk:1; + UCHAR Reserved1:1; + UCHAR BufferUnderrunFree:1; + UCHAR Reserved3:1; + UCHAR Reserved2; + UCHAR DataTypeSupported[2]; +} FEATURE_DATA_CD_TRACK_AT_ONCE, *PFEATURE_DATA_CD_TRACK_AT_ONCE; + +typedef struct _FEATURE_DATA_CD_MASTERING { + FEATURE_HEADER Header; + UCHAR RWSubchannelsRecordable:1; + UCHAR CdRewritable:1; + UCHAR TestWriteOk:1; + UCHAR RawRecordingOk:1; + UCHAR RawMultiSessionOk:1; + UCHAR SessionAtOnceOk:1; + UCHAR BufferUnderrunFree:1; + UCHAR Reserved1:1; + UCHAR MaximumCueSheetLength[3]; +} FEATURE_DATA_CD_MASTERING, *PFEATURE_DATA_CD_MASTERING; + +typedef struct _FEATURE_DATA_DVD_RECORDABLE_WRITE { + FEATURE_HEADER Header; + UCHAR Reserved1:1; + UCHAR DVD_RW:1; + UCHAR TestWrite:1; + UCHAR RDualLayer:1; + UCHAR Reserved02:2; + UCHAR BufferUnderrunFree:1; + UCHAR Reserved3:1; + UCHAR Reserved4[3]; +} FEATURE_DATA_DVD_RECORDABLE_WRITE, *PFEATURE_DATA_DVD_RECORDABLE_WRITE; + +typedef struct _FEATURE_DATA_DDCD_READ { + FEATURE_HEADER Header; +} FEATURE_DATA_DDCD_READ, *PFEATURE_DATA_DDCD_READ; + +typedef struct _FEATURE_DATA_DDCD_R_WRITE { + FEATURE_HEADER Header; + UCHAR Reserved1:2; + UCHAR TestWrite:1; + UCHAR Reserved2:5; + UCHAR Reserved3[3]; +} FEATURE_DATA_DDCD_R_WRITE, *PFEATURE_DATA_DDCD_R_WRITE; + +typedef struct _FEATURE_DATA_DDCD_RW_WRITE { + FEATURE_HEADER Header; + UCHAR Blank:1; + UCHAR Intermediate:1; + UCHAR Reserved1:6; + UCHAR Reserved2[3]; +} FEATURE_DATA_DDCD_RW_WRITE, *PFEATURE_DATA_DDCD_RW_WRITE; + +typedef struct _FEATURE_DATA_LAYER_JUMP_RECORDING { + FEATURE_HEADER Header; + UCHAR Reserved0[3]; + UCHAR NumberOfLinkSizes; +#if !defined(__midl) && !defined(__WIDL__) + UCHAR LinkSizes[0]; +#endif +} FEATURE_DATA_LAYER_JUMP_RECORDING, *PFEATURE_DATA_LAYER_JUMP_RECORDING; + +typedef struct _FEATURE_CD_RW_MEDIA_WRITE_SUPPORT { + FEATURE_HEADER Header; + UCHAR Reserved1; + struct{ + UCHAR Subtype0:1; + UCHAR Subtype1:1; + UCHAR Subtype2:1; + UCHAR Subtype3:1; + UCHAR Subtype4:1; + UCHAR Subtype5:1; + UCHAR Subtype6:1; + UCHAR Subtype7:1; + } CDRWMediaSubtypeSupport; + UCHAR Reserved2[2]; +} FEATURE_CD_RW_MEDIA_WRITE_SUPPORT, *PFEATURE_CD_RW_MEDIA_WRITE_SUPPORT; + +typedef struct _FEATURE_BD_R_PSEUDO_OVERWRITE { + FEATURE_HEADER Header; + UCHAR Reserved[4]; +} FEATURE_BD_R_PSEUDO_OVERWRITE, *PFEATURE_BD_R_PSEUDO_OVERWRITE; + +typedef struct _FEATURE_DATA_DVD_PLUS_RW_DUAL_LAYER { + FEATURE_HEADER Header; + UCHAR Write:1; + UCHAR Reserved1:7; + UCHAR CloseOnly:1; + UCHAR QuickStart:1; + UCHAR Reserved2:6; + UCHAR Reserved3[2]; +} FEATURE_DATA_DVD_PLUS_RW_DUAL_LAYER, *PFEATURE_DATA_DVD_PLUS_RW_DUAL_LAYER; + +typedef struct _FEATURE_DATA_DVD_PLUS_R_DUAL_LAYER { + FEATURE_HEADER Header; + UCHAR Write:1; + UCHAR Reserved1:7; + UCHAR Reserved2[3]; +} FEATURE_DATA_DVD_PLUS_R_DUAL_LAYER, *PFEATURE_DATA_DVD_PLUS_R_DUAL_LAYER; + +typedef struct _BD_CLASS_SUPPORT_BITMAP { + UCHAR Version8:1; + UCHAR Version9:1; + UCHAR Version10:1; + UCHAR Version11:1; + UCHAR Version12:1; + UCHAR Version13:1; + UCHAR Version14:1; + UCHAR Version15:1; + UCHAR Version0:1; + UCHAR Version1:1; + UCHAR Version2:1; + UCHAR Version3:1; + UCHAR Version4:1; + UCHAR Version5:1; + UCHAR Version6:1; + UCHAR Version7:1; +} BD_CLASS_SUPPORT_BITMAP, *PBD_CLASS_SUPPORT_BITMAP; + +typedef struct _FEATURE_BD_READ { + FEATURE_HEADER Header; + UCHAR Reserved[4]; + BD_CLASS_SUPPORT_BITMAP Class0BitmapBDREReadSupport; + BD_CLASS_SUPPORT_BITMAP Class1BitmapBDREReadSupport; + BD_CLASS_SUPPORT_BITMAP Class2BitmapBDREReadSupport; + BD_CLASS_SUPPORT_BITMAP Class3BitmapBDREReadSupport; + BD_CLASS_SUPPORT_BITMAP Class0BitmapBDRReadSupport; + BD_CLASS_SUPPORT_BITMAP Class1BitmapBDRReadSupport; + BD_CLASS_SUPPORT_BITMAP Class2BitmapBDRReadSupport; + BD_CLASS_SUPPORT_BITMAP Class3BitmapBDRReadSupport; + BD_CLASS_SUPPORT_BITMAP Class0BitmapBDROMReadSupport; + BD_CLASS_SUPPORT_BITMAP Class1BitmapBDROMReadSupport; + BD_CLASS_SUPPORT_BITMAP Class2BitmapBDROMReadSupport; + BD_CLASS_SUPPORT_BITMAP Class3BitmapBDROMReadSupport; +} FEATURE_BD_READ, *PFEATURE_BD_READ; + +typedef struct _FEATURE_BD_WRITE { + FEATURE_HEADER Header; + UCHAR SupportsVerifyNotRequired:1; + UCHAR Reserved1:7; + UCHAR Reserved2[3]; + BD_CLASS_SUPPORT_BITMAP Class0BitmapBDREWriteSupport; + BD_CLASS_SUPPORT_BITMAP Class1BitmapBDREWriteSupport; + BD_CLASS_SUPPORT_BITMAP Class2BitmapBDREWriteSupport; + BD_CLASS_SUPPORT_BITMAP Class3BitmapBDREWriteSupport; + BD_CLASS_SUPPORT_BITMAP Class0BitmapBDRWriteSupport; + BD_CLASS_SUPPORT_BITMAP Class1BitmapBDRWriteSupport; + BD_CLASS_SUPPORT_BITMAP Class2BitmapBDRWriteSupport; + BD_CLASS_SUPPORT_BITMAP Class3BitmapBDRWriteSupport; +} FEATURE_BD_WRITE, *PFEATURE_BD_WRITE; + +typedef struct _FEATURE_TSR { + FEATURE_HEADER Header; +} FEATURE_TSR, *PFEATURE_TSR; + +typedef struct _FEATURE_DATA_HDDVD_READ { + FEATURE_HEADER Header; + UCHAR Recordable:1; + UCHAR Reserved0:7; + UCHAR Reserved1; + UCHAR Rewritable:1; + UCHAR Reserved2:7; + UCHAR Reserved3; +} FEATURE_DATA_HDDVD_READ, *PFEATURE_DATA_HDDVD_READ; + +typedef struct _FEATURE_DATA_HDDVD_WRITE { + FEATURE_HEADER Header; + UCHAR Recordable:1; + UCHAR Reserved0:7; + UCHAR Reserved1; + UCHAR Rewritable:1; + UCHAR Reserved2:7; + UCHAR Reserved3; +} FEATURE_DATA_HDDVD_WRITE, *PFEATURE_DATA_HDDVD_WRITE; + +typedef struct _FEATURE_HYBRID_DISC { + FEATURE_HEADER Header; + UCHAR ResetImmunity:1; + UCHAR Reserved1:7; + UCHAR Reserved2[3]; +} FEATURE_HYBRID_DISC, *PFEATURE_HYBRID_DISC; + +typedef struct _FEATURE_DATA_POWER_MANAGEMENT { + FEATURE_HEADER Header; +} FEATURE_DATA_POWER_MANAGEMENT, *PFEATURE_DATA_POWER_MANAGEMENT; + +typedef struct _FEATURE_DATA_SMART { + FEATURE_HEADER Header; + UCHAR FaultFailureReportingPagePresent:1; + UCHAR Reserved1:7; + UCHAR Reserved02[3]; +} FEATURE_DATA_SMART, *PFEATURE_DATA_SMART; + +typedef struct _FEATURE_DATA_EMBEDDED_CHANGER { + FEATURE_HEADER Header; + UCHAR Reserved1:2; + UCHAR SupportsDiscPresent:1; + UCHAR Reserved2:1; + UCHAR SideChangeCapable:1; + UCHAR Reserved3:3; + UCHAR Reserved4[2]; + UCHAR HighestSlotNumber:5; + UCHAR Reserved:3; +} FEATURE_DATA_EMBEDDED_CHANGER, *PFEATURE_DATA_EMBEDDED_CHANGER; + +typedef struct _FEATURE_DATA_CD_AUDIO_ANALOG_PLAY { + FEATURE_HEADER Header; + UCHAR SeperateVolume:1; + UCHAR SeperateChannelMute:1; + UCHAR ScanSupported:1; + UCHAR Reserved1:5; + UCHAR Reserved2; + UCHAR NumerOfVolumeLevels[2]; +} FEATURE_DATA_CD_AUDIO_ANALOG_PLAY, *PFEATURE_DATA_CD_AUDIO_ANALOG_PLAY; + +typedef struct _FEATURE_DATA_MICROCODE_UPDATE { + FEATURE_HEADER Header; + UCHAR M5:1; + UCHAR Reserved1:7; + UCHAR Reserved2[3]; +} FEATURE_DATA_MICROCODE_UPDATE, *PFEATURE_DATA_MICROCODE_UPDATE; + +typedef struct _FEATURE_DATA_TIMEOUT { + FEATURE_HEADER Header; + UCHAR Group3:1; + UCHAR Reserved1:7; + UCHAR Reserved2; + UCHAR UnitLength[2]; +} FEATURE_DATA_TIMEOUT, *PFEATURE_DATA_TIMEOUT; + +typedef struct _FEATURE_DATA_DVD_CSS { + FEATURE_HEADER Header; + UCHAR Reserved1[3]; + UCHAR CssVersion; +} FEATURE_DATA_DVD_CSS, *PFEATURE_DATA_DVD_CSS; + +typedef struct _FEATURE_DATA_REAL_TIME_STREAMING { + FEATURE_HEADER Header; + UCHAR StreamRecording:1; + UCHAR WriteSpeedInGetPerf:1; + UCHAR WriteSpeedInMP2A:1; + UCHAR SetCDSpeed:1; + UCHAR ReadBufferCapacityBlock:1; + UCHAR Reserved1:3; + UCHAR Reserved2[3]; +} FEATURE_DATA_REAL_TIME_STREAMING, *PFEATURE_DATA_REAL_TIME_STREAMING; + +typedef struct _FEATURE_DATA_LOGICAL_UNIT_SERIAL_NUMBER { + FEATURE_HEADER Header; +#if !defined(__midl) && !defined(__WIDL__) + UCHAR SerialNumber[0]; +#endif +} FEATURE_DATA_LOGICAL_UNIT_SERIAL_NUMBER, *PFEATURE_DATA_LOGICAL_UNIT_SERIAL_NUMBER; + +typedef struct _FEATURE_MEDIA_SERIAL_NUMBER { + FEATURE_HEADER Header; +} FEATURE_MEDIA_SERIAL_NUMBER, *PFEATURE_MEDIA_SERIAL_NUMBER; + +typedef struct _FEATURE_DATA_DISC_CONTROL_BLOCKS_EX { + UCHAR ContentDescriptor[4]; +} FEATURE_DATA_DISC_CONTROL_BLOCKS_EX, *PFEATURE_DATA_DISC_CONTROL_BLOCKS_EX; + +typedef struct _FEATURE_DATA_DISC_CONTROL_BLOCKS { + FEATURE_HEADER Header; +#if !defined(__midl) && !defined(__WIDL__) + FEATURE_DATA_DISC_CONTROL_BLOCKS_EX Data[0]; +#endif +} FEATURE_DATA_DISC_CONTROL_BLOCKS, *PFEATURE_DATA_DISC_CONTROL_BLOCKS; + +typedef struct _FEATURE_DATA_DVD_CPRM { + FEATURE_HEADER Header; + UCHAR Reserved0[3]; + UCHAR CPRMVersion; +} FEATURE_DATA_DVD_CPRM, *PFEATURE_DATA_DVD_CPRM; + +typedef struct _FEATURE_DATA_FIRMWARE_DATE { + FEATURE_HEADER Header; + UCHAR Year[4]; + UCHAR Month[2]; + UCHAR Day[2]; + UCHAR Hour[2]; + UCHAR Minute[2]; + UCHAR Seconds[2]; + UCHAR Reserved[2]; +} FEATURE_DATA_FIRMWARE_DATE, *PFEATURE_DATA_FIRMWARE_DATE; + +typedef struct _FEATURE_DATA_AACS { + FEATURE_HEADER Header; + UCHAR BindingNonceGeneration:1; + UCHAR Reserved0:7; + UCHAR BindingNonceBlockCount; + UCHAR NumberOfAGIDs:4; + UCHAR Reserved1:4; + UCHAR AACSVersion; +} FEATURE_DATA_AACS, *PFEATURE_DATA_AACS; + +typedef struct _FEATURE_VCPS { + FEATURE_HEADER Header; + UCHAR Reserved[4]; +} FEATURE_VCPS, *PFEATURE_VCPS; + +typedef struct _FEATURE_DATA_RESERVED { + FEATURE_HEADER Header; +#if !defined(__midl) && !defined(__WIDL__) + UCHAR Data[0]; +#endif +} FEATURE_DATA_RESERVED, *PFEATURE_DATA_RESERVED; + +typedef struct _FEATURE_DATA_VENDOR_SPECIFIC { + FEATURE_HEADER Header; +#if !defined(__midl) && !defined(__WIDL__) + UCHAR VendorSpecificData[0]; +#endif +} FEATURE_DATA_VENDOR_SPECIFIC, *PFEATURE_DATA_VENDOR_SPECIFIC; + +typedef struct _GET_CONFIGURATION_IOCTL_INPUT { + FEATURE_NUMBER Feature; + ULONG RequestType; + PVOID Reserved[2]; +} GET_CONFIGURATION_IOCTL_INPUT, *PGET_CONFIGURATION_IOCTL_INPUT; + +#if defined(_WIN64) +typedef struct _GET_CONFIGURATION_IOCTL_INPUT32 { + FEATURE_NUMBER Feature; + ULONG RequestType; + VOID* UPOINTER_32 Reserved[2]; +} GET_CONFIGURATION_IOCTL_INPUT32, *PGET_CONFIGURATION_IOCTL_INPUT32; +#endif + +#ifdef __cplusplus +} +#endif diff --git a/include/psdk/ntddstor.h b/include/psdk/ntddstor.h index 6b74133e0b2..3d5081e0e14 100644 --- a/include/psdk/ntddstor.h +++ b/include/psdk/ntddstor.h @@ -124,10 +124,10 @@ DEFINE_GUID(GUID_DEVINTERFACE_HIDDEN_VOLUME, CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_STORAGE_RESET_BUS \ - CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS) #define IOCTL_STORAGE_RESET_DEVICE \ - CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS) #define IOCTL_STORAGE_GET_DEVICE_NUMBER \ CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS) diff --git a/include/psdk/ntdef.h b/include/psdk/ntdef.h index be71648f18b..634294a33d4 100644 --- a/include/psdk/ntdef.h +++ b/include/psdk/ntdef.h @@ -617,6 +617,12 @@ typedef struct _GROUP_AFFINITY { #define RTL_FIELD_SIZE(type, field) (sizeof(((type *)0)->field)) +#define RTL_SIZEOF_THROUGH_FIELD(type, field) \ + (FIELD_OFFSET(type, field) + RTL_FIELD_SIZE(type, field)) + +#define RTL_CONTAINS_FIELD(Struct, Size, Field) \ + ( (((PCHAR)(&(Struct)->Field)) + sizeof((Struct)->Field)) <= (((PCHAR)(Struct))+(Size)) ) + #define RTL_NUMBER_OF_V1(A) (sizeof(A)/sizeof((A)[0])) #define RTL_NUMBER_OF_V2(A) RTL_NUMBER_OF_V1(A) #ifdef ENABLE_RTL_NUMBER_OF_V2 diff --git a/include/psdk/ntsecapi.h b/include/psdk/ntsecapi.h index 885315385b9..7aaf903ec56 100644 --- a/include/psdk/ntsecapi.h +++ b/include/psdk/ntsecapi.h @@ -671,14 +671,16 @@ typedef struct _TRUSTED_DOMAIN_FULL_INFORMATION { BOOLEAN WINAPI RtlGenRandom(PVOID,ULONG); NTSTATUS NTAPI LsaAddAccountRights(LSA_HANDLE,PSID,PLSA_UNICODE_STRING,ULONG); +NTSTATUS NTAPI LsaAddPrivilegesToAccount(LSA_HANDLE, PPRIVILEGE_SET); NTSTATUS NTAPI LsaCallAuthenticationPackage(HANDLE,ULONG,PVOID,ULONG,PVOID*, PULONG,PNTSTATUS); NTSTATUS NTAPI LsaClose(LSA_HANDLE); NTSTATUS NTAPI LsaConnectUntrusted(PHANDLE); -NTSTATUS NTAPI LsaCreateTrustedDomainEx(LSA_HANDLE, - PTRUSTED_DOMAIN_INFORMATION_EX, - PTRUSTED_DOMAIN_AUTH_INFORMATION,ACCESS_MASK, - PLSA_HANDLE); +NTSTATUS NTAPI LsaCreateAccount(LSA_HANDLE, PSID, ULONG, PLSA_HANDLE); +NTSTATUS NTAPI LsaCreateTrustedDomain(LSA_HANDLE, PLSA_TRUST_INFORMATION, + ACCESS_MASK, PLSA_HANDLE); +NTSTATUS NTAPI LsaCreateTrustedDomainEx(LSA_HANDLE, PTRUSTED_DOMAIN_INFORMATION_EX, + PTRUSTED_DOMAIN_AUTH_INFORMATION, ACCESS_MASK, PLSA_HANDLE); NTSTATUS NTAPI LsaDeleteTrustedDomain(LSA_HANDLE,PSID); NTSTATUS NTAPI LsaDeregisterLogonProcess(HANDLE); NTSTATUS NTAPI LsaEnumerateAccountRights(LSA_HANDLE,PSID,PLSA_UNICODE_STRING*,PULONG); @@ -703,8 +705,11 @@ NTSTATUS NTAPI LsaLookupPrivilegeValue(LSA_HANDLE, PLSA_UNICODE_STRING, PLUID); NTSTATUS NTAPI LsaLookupSids(LSA_HANDLE,ULONG,PSID*, PLSA_REFERENCED_DOMAIN_LIST*,PLSA_TRANSLATED_NAME*); ULONG NTAPI LsaNtStatusToWinError(NTSTATUS); +NTSTATUS NTAPI LsaOpenAccount(LSA_HANDLE, PSID, ULONG, PLSA_HANDLE); NTSTATUS NTAPI LsaOpenPolicy(PLSA_UNICODE_STRING,PLSA_OBJECT_ATTRIBUTES, ACCESS_MASK,PLSA_HANDLE); +NTSTATUS NTAPI LsaOpenTrustedDomainByName(LSA_HANDLE, PLSA_UNICODE_STRING, + ACCESS_MASK, PLSA_HANDLE); NTSTATUS NTAPI LsaQueryDomainInformationPolicy(LSA_HANDLE, POLICY_DOMAIN_INFORMATION_CLASS,PVOID*); NTSTATUS NTAPI LsaQueryInformationPolicy(LSA_HANDLE,POLICY_INFORMATION_CLASS,PVOID*); diff --git a/include/psdk/urlmon.idl b/include/psdk/urlmon.idl index c1d3bec3b57..3fb5566b14a 100644 --- a/include/psdk/urlmon.idl +++ b/include/psdk/urlmon.idl @@ -1897,6 +1897,7 @@ cpp_quote("#define INET_E_SECURITY_PROBLEM _HRESULT_TYPEDEF_(0x800C000E cpp_quote("#define INET_E_CANNOT_LOAD_DATA _HRESULT_TYPEDEF_(0x800C000F)") cpp_quote("#define INET_E_CANNOT_INSTANTIATE_OBJECT _HRESULT_TYPEDEF_(0x800C0010)") cpp_quote("#define INET_E_USE_DEFAULT_PROTOCOLHANDLER _HRESULT_TYPEDEF_(0x800C0011)") +cpp_quote("#define INET_E_USE_DEFAULT_SETTING _HRESULT_TYPEDEF_(0x800C0012)") cpp_quote("#define INET_E_QUERYOPTION_UNKNOWN _HRESULT_TYPEDEF_(0x800C0013)") cpp_quote("#define INET_E_REDIRECT_FAILED _HRESULT_TYPEDEF_(0x800C0014)") cpp_quote("#define INET_E_REDIRECT_TO_DIR _HRESULT_TYPEDEF_(0x800C0015)") diff --git a/include/psdk/winbase.h b/include/psdk/winbase.h index 4b15fdf0a0b..d011f3983dd 100644 --- a/include/psdk/winbase.h +++ b/include/psdk/winbase.h @@ -1399,6 +1399,8 @@ BOOL WINAPI DebugSetProcessKillOnExit(BOOL); #endif PVOID WINAPI DecodePointer(PVOID); PVOID WINAPI DecodeSystemPointer(PVOID); +BOOL WINAPI DecryptFileA(LPCSTR,DWORD); +BOOL WINAPI DecryptFileW(LPCWSTR,DWORD); BOOL WINAPI DefineDosDeviceA(DWORD,LPCSTR,LPCSTR); BOOL WINAPI DefineDosDeviceW(DWORD,LPCWSTR,LPCWSTR); #define DefineHandleTable(w) ((w),TRUE) @@ -2374,6 +2376,7 @@ typedef PCACTCTXW PCACTCTX; #define CreateProcessAsUser CreateProcessAsUserW #define CreateSemaphore CreateSemaphoreW #define CreateWaitableTimer CreateWaitableTimerW +#define DecryptFile DecryptFileW #define DefineDosDevice DefineDosDeviceW #define DeleteFile DeleteFileW #if (_WIN32_WINNT >= 0x0500) @@ -2577,6 +2580,7 @@ typedef ENUMRESTYPEPROCA ENUMRESTYPEPROC; #define CreateProcessAsUser CreateProcessAsUserA #define CreateSemaphore CreateSemaphoreA #define CreateWaitableTimer CreateWaitableTimerA +#define DecryptFile DecryptFileA #define DefineDosDevice DefineDosDeviceA #define DeleteFile DeleteFileA #if (_WIN32_WINNT >= 0x0500) diff --git a/include/psdk/wingdi.h b/include/psdk/wingdi.h index 550ef68c626..052b04be334 100644 --- a/include/psdk/wingdi.h +++ b/include/psdk/wingdi.h @@ -1319,6 +1319,7 @@ extern "C" { #define LAYOUT_VBH 4 // Vertical before horizontal #define LAYOUT_ORIENTATIONMASK (LAYOUT_RTL | LAYOUT_BTT | LAYOUT_VBH) #define LAYOUT_BITMAPORIENTATIONPRESERVED 8 +#define NOMIRRORBITMAP 0x80000000 #if (WINVER > 0x400) #define CS_ENABLE 0x00000001 #define CS_DISABLE 0x00000002 diff --git a/include/psdk/winnls.h b/include/psdk/winnls.h index 2385689a210..2bb65024bb8 100644 --- a/include/psdk/winnls.h +++ b/include/psdk/winnls.h @@ -573,6 +573,21 @@ typedef enum _NORM_FORM { NormalizationKD = 0x6 } NORM_FORM; #endif /* (WINVER >= 0x0600) */ +typedef struct _FILEMUIINFO { + DWORD dwSize; + DWORD dwVersion; + DWORD dwFileType; + BYTE pChecksum[16]; + BYTE pServiceChecksum[16]; + DWORD dwLanguageNameOffset; + DWORD dwTypeIDMainSize; + DWORD dwTypeIDMainOffset; + DWORD dwTypeNameMainOffset; + DWORD dwTypeIDMUISize; + DWORD dwTypeIDMUIOffset; + DWORD dwTypeNameMUIOffset; + BYTE abBuffer[8]; +} FILEMUIINFO, *PFILEMUIINFO; int WINAPI CompareStringA(LCID,DWORD,LPCSTR,int,LPCSTR,int); int WINAPI CompareStringW(LCID,DWORD,LPCWSTR,int,LPCWSTR,int); @@ -634,6 +649,7 @@ int WINAPI SetCalendarInfoW(LCID,CALID,CALTYPE,LPCWSTR); BOOL WINAPI SetLocaleInfoA(LCID,LCTYPE,LPCSTR); BOOL WINAPI SetLocaleInfoW(LCID,LCTYPE,LPCWSTR); BOOL WINAPI SetThreadLocale(LCID); +LANGID WINAPI SetThreadUILanguage(LANGID); BOOL WINAPI SetUserDefaultLCID(LCID); BOOL WINAPI SetUserDefaultUILanguage(LANGID); BOOL WINAPI SetUserGeoID(GEOID); @@ -654,14 +670,24 @@ LANGID WINAPI GetUserDefaultUILanguage(void); BOOL WINAPI IsValidLanguageGroup(LGRPID,DWORD); #endif /* (WINVER >= 0x0500) */ #if (WINVER >= 0x0600) +BOOL WINAPI GetFileMUIInfo(DWORD,PCWSTR,PFILEMUIINFO,DWORD*); +BOOL WINAPI GetFileMUIPath(DWORD,PCWSTR,PWSTR,PULONG,PWSTR,PULONG,PULONGLONG); WINBASEAPI int WINAPI GetLocaleInfoEx(LPCWSTR,LCTYPE,LPWSTR,int); +BOOL WINAPI GetProcessPreferredUILanguages(DWORD,PULONG,PZZWSTR,PULONG); +BOOL WINAPI GetSystemPreferredUILanguages(DWORD,PULONG,PZZWSTR,PULONG); +BOOL WINAPI GetThreadPreferredUILanguages(DWORD,PULONG,PZZWSTR,PULONG); +LANGID WINAPI GetThreadUILanguage(void); +BOOL WINAPI GetUILanguageInfo(DWORD,PCZZWSTR,PZZWSTR,PDWORD,PDWORD); +BOOL WINAPI GetUserPreferredUILanguages(DWORD,PULONG,PZZWSTR,PULONG); int WINAPI IdnToAscii(DWORD,LPCWSTR,int,LPWSTR,int); int WINAPI IdnToNameprepUnicode(DWORD,LPCWSTR,int,LPWSTR,int); int WINAPI IdnToUnicode(DWORD,LPCWSTR,int,LPWSTR,int); BOOL WINAPI IsNormalizedString(NORM_FORM,LPCWSTR,int); int WINAPI NormalizeString(NORM_FORM,LPCWSTR,int,LPWSTR,int); int WINAPI GetStringScripts(DWORD,LPCWSTR,int,LPWSTR,int); +BOOL WINAPI SetProcessPreferredUILanguages(DWORD,PCZZWSTR,PULONG); +BOOL WINAPI SetThreadPreferredUILanguages(DWORD,PCZZWSTR,PULONG); BOOL WINAPI VerifyScripts(DWORD,LPCWSTR,int,LPCWSTR,int); #endif /* (WINVER >= 0x0600) */ diff --git a/include/psdk/winnt.h b/include/psdk/winnt.h index 859acc5f212..441660a894f 100644 --- a/include/psdk/winnt.h +++ b/include/psdk/winnt.h @@ -148,8 +148,8 @@ typedef void* __ptr64 PVOID64; #endif typedef wchar_t WCHAR; -typedef WCHAR *PWCHAR,*LPWCH,*PWCH,*NWPSTR,*LPWSTR,*PWSTR; -typedef CONST WCHAR *LPCWCH,*PCWCH,*LPCWSTR,*PCWSTR; +typedef WCHAR *PWCHAR,*LPWCH,*PWCH,*NWPSTR,*LPWSTR,*PWSTR,*PZZWSTR; +typedef CONST WCHAR *LPCWCH,*PCWCH,*LPCWSTR,*PCWSTR,*PCZZWSTR; typedef CHAR *PCHAR,*LPCH,*PCH,*NPSTR,*LPSTR,*PSTR; typedef CONST CHAR *LPCCH,*PCCH,*PCSTR,*LPCSTR; typedef PWSTR *PZPWSTR; @@ -161,6 +161,7 @@ typedef PSTR *PZPSTR; typedef CONST PSTR *PCZPSTR; typedef PCSTR *PZPCSTR; + #ifdef UNICODE #ifndef _TCHAR_DEFINED #define _TCHAR_DEFINED @@ -1304,6 +1305,8 @@ typedef enum { #define SEC_RESERVE 0x04000000 #define SEC_COMMIT 0x08000000 #define SEC_NOCACHE 0x10000000 +#define SEC_WRITECOMBINE 0x40000000 +#define SEC_LARGE_PAGES 0x80000000 #define SECTION_EXTEND_SIZE 16 #define SECTION_MAP_READ 4 #define SECTION_MAP_WRITE 2 @@ -4955,50 +4958,6 @@ typedef enum _HEAP_INFORMATION_CLASS { HeapEnableTerminationOnCorruption } HEAP_INFORMATION_CLASS; -NTSYSAPI -DWORD -NTAPI -RtlSetHeapInformation ( - IN PVOID HeapHandle, - IN HEAP_INFORMATION_CLASS HeapInformationClass, - IN PVOID HeapInformation OPTIONAL, - IN SIZE_T HeapInformationLength OPTIONAL - ); - -NTSYSAPI -DWORD -NTAPI -RtlQueryHeapInformation ( - IN PVOID HeapHandle, - IN HEAP_INFORMATION_CLASS HeapInformationClass, - OUT PVOID HeapInformation OPTIONAL, - IN SIZE_T HeapInformationLength OPTIONAL, - OUT PSIZE_T ReturnLength OPTIONAL - ); - -// -// Multiple alloc-free APIS -// - -DWORD -NTAPI -RtlMultipleAllocateHeap ( - IN PVOID HeapHandle, - IN DWORD Flags, - IN SIZE_T Size, - IN DWORD Count, - OUT PVOID * Array - ); - -DWORD -NTAPI -RtlMultipleFreeHeap ( - IN PVOID HeapHandle, - IN DWORD Flags, - IN DWORD Count, - OUT PVOID * Array - ); - typedef enum _PROCESSOR_CACHE_TYPE { CacheUnified, CacheInstruction, diff --git a/include/psdk/winuser.h b/include/psdk/winuser.h index dd1ba77bcdf..769c0e12129 100644 --- a/include/psdk/winuser.h +++ b/include/psdk/winuser.h @@ -2341,6 +2341,15 @@ extern "C" { #define TPM_VERPOSANIMATION 0x1000 #define TPM_VERNEGANIMATION 0x2000 #endif +#if(_WIN32_WINNT >= 0x0500) +#define TPM_NOANIMATION 16384 +#endif +#if (_WIN32_WINNT >= 0x0501) +#define TPM_LAYOUTRTL 32768 +#endif +#if (_WIN32_WINNT >= 0x0601) +#define TPM_WORKAREA 65536 +#endif #define HELP_COMMAND 0x102 #define HELP_CONTENTS 3 #define HELP_CONTEXT 1 @@ -3051,6 +3060,32 @@ typedef struct _ICONINFO { HBITMAP hbmColor; } ICONINFO,*PICONINFO; +typedef struct _ICONINFOEXA +{ + DWORD cbSize; + BOOL fIcon; + DWORD xHotspot; + DWORD yHotspot; + HBITMAP hbmMask; + HBITMAP hbmColor; + WORD wResID; + CHAR szModName[MAX_PATH]; + CHAR szResName[MAX_PATH]; +} ICONINFOEXA, *PICONINFOEXA; + +typedef struct _ICONINFOEXW +{ + DWORD cbSize; + BOOL fIcon; + DWORD xHotspot; + DWORD yHotspot; + HBITMAP hbmMask; + HBITMAP hbmColor; + WORD wResID; + WCHAR szModName[MAX_PATH]; + WCHAR szResName[MAX_PATH]; +} ICONINFOEXW, *PICONINFOEXW; + typedef struct tagNMHDR { HWND hwndFrom; UINT_PTR idFrom; @@ -4103,6 +4138,8 @@ HWND WINAPI GetForegroundWindow(void); DWORD WINAPI GetGuiResources(HANDLE,DWORD); #endif BOOL WINAPI GetIconInfo(HICON,PICONINFO); +BOOL WINAPI GetIconInfoExA(HICON,ICONINFOEXA*); +BOOL WINAPI GetIconInfoExW(HICON,ICONINFOEXW*); BOOL WINAPI GetInputState(void); UINT WINAPI GetKBCodePage(void); HKL WINAPI GetKeyboardLayout(DWORD); diff --git a/include/psdk/wmistr.h b/include/psdk/wmistr.h index 7136245d055..8cb13c7defa 100644 --- a/include/psdk/wmistr.h +++ b/include/psdk/wmistr.h @@ -25,6 +25,123 @@ typedef struct _WNODE_HEADER ULONG Flags; } WNODE_HEADER, *PWNODE_HEADER; +#define WNODE_FLAG_ALL_DATA 0x00000001 +#define WNODE_FLAG_SINGLE_INSTANCE 0x00000002 +#define WNODE_FLAG_SINGLE_ITEM 0x00000004 +#define WNODE_FLAG_EVENT_ITEM 0x00000008 +#define WNODE_FLAG_FIXED_INSTANCE_SIZE 0x00000010 +#define WNODE_FLAG_TOO_SMALL 0x00000020 +#define WNODE_FLAG_INSTANCES_SAME 0x00000040 +#define WNODE_FLAG_STATIC_INSTANCE_NAMES 0x00000080 +#define WNODE_FLAG_INTERNAL 0x00000100 +#define WNODE_FLAG_USE_TIMESTAMP 0x00000200 +#define WNODE_FLAG_PERSIST_EVENT 0x00000400 +#define WNODE_FLAG_EVENT_REFERENCE 0x00002000 +#define WNODE_FLAG_ANSI_INSTANCENAMES 0x00004000 +#define WNODE_FLAG_METHOD_ITEM 0x00008000 +#define WNODE_FLAG_PDO_INSTANCE_NAMES 0x00010000 +#define WNODE_FLAG_TRACED_GUID 0x00020000 +#define WNODE_FLAG_LOG_WNODE 0x00040000 +#define WNODE_FLAG_USE_GUID_PTR 0x00080000 +#define WNODE_FLAG_USE_MOF_PTR 0x00100000 +#define WNODE_FLAG_NO_HEADER 0x00200000 +#define WNODE_FLAG_SEVERITY_MASK 0xff000000 + +typedef struct tagWNODE_TOO_SMALL +{ + struct _WNODE_HEADER WnodeHeader; + ULONG SizeNeeded; +} WNODE_TOO_SMALL, *PWNODE_TOO_SMALL; + +typedef struct tagWNODE_SINGLE_INSTANCE +{ + struct _WNODE_HEADER WnodeHeader; + ULONG OffsetInstanceName; + ULONG InstanceIndex; + ULONG DataBlockOffset; + ULONG SizeDataBlock; + UCHAR VariableData[]; +} WNODE_SINGLE_INSTANCE, *PWNODE_SINGLE_INSTANCE; + +#define WMIREG_FLAG_EXPENSIVE 0x00000001 +#define WMIREG_FLAG_INSTANCE_LIST 0x00000004 +#define WMIREG_FLAG_INSTANCE_BASENAME 0x00000008 +#define WMIREG_FLAG_INSTANCE_PDO 0x00000020 +#define WMIREG_FLAG_REMOVE_GUID 0x00010000 +#define WMIREG_FLAG_RESERVED1 0x00020000 +#define WMIREG_FLAG_RESERVED2 0x00040000 +#define WMIREG_FLAG_TRACED_GUID 0x00080000 +#define WMIREG_FLAG_TRACE_CONTROL_GUID 0x00001000 +#define WMIREG_FLAG_EVENT_ONLY_GUID 0x00000040 + +typedef struct +{ + GUID Guid; + ULONG Flags; + ULONG InstanceCount; + union + { + ULONG InstanceNameList; + ULONG BaseNameOffset; + ULONG_PTR Pdo; + ULONG_PTR InstanceInfo; + }; +} WMIREGGUIDW, *PWMIREGGUIDW; + +typedef struct +{ + ULONG BufferSize; + ULONG NextWmiRegInfo; + ULONG RegistryPath; + ULONG MofResourceName; + ULONG GuidCount; + WMIREGGUIDW WmiRegGuid[]; +} WMIREGINFOW, *PWMIREGINFOW; + +typedef WMIREGINFOW WMIREGINFO; +typedef PWMIREGINFOW PWMIREGINFO; + +typedef struct +{ + ULONG OffsetInstanceData; + ULONG LengthInstanceData; +} OFFSETINSTANCEDATAANDLENGTH, *POFFSETINSTANCEDATAANDLENGTH; + +typedef struct tagWNODE_ALL_DATA +{ + struct _WNODE_HEADER WnodeHeader; + ULONG DataBlockOffset; + ULONG InstanceCount; + ULONG OffsetInstanceNameOffsets; + union + { + ULONG FixedInstanceSize; + OFFSETINSTANCEDATAANDLENGTH OffsetInstanceDataAndLength[0]; + }; +} WNODE_ALL_DATA, *PWNODE_ALL_DATA; + +typedef struct tagWNODE_SINGLE_ITEM +{ + struct _WNODE_HEADER WnodeHeader; + ULONG OffsetInstanceName; + ULONG InstanceIndex; + ULONG ItemId; + ULONG DataBlockOffset; + ULONG SizeDataItem; + UCHAR VariableData[]; +} WNODE_SINGLE_ITEM, *PWNODE_SINGLE_ITEM; + +typedef struct tagWNODE_METHOD_ITEM +{ + struct _WNODE_HEADER WnodeHeader; + ULONG OffsetInstanceName; + ULONG InstanceIndex; + ULONG MethodId; + ULONG DataBlockOffset; + ULONG SizeDataBlock; + UCHAR VariableData[]; +} WNODE_METHOD_ITEM, *PWNODE_METHOD_ITEM; + typedef enum { WMI_GET_ALL_DATA = 0, diff --git a/include/reactos/exeformat.h b/include/reactos/exeformat.h index d7a7730840b..f96e2dea460 100644 --- a/include/reactos/exeformat.h +++ b/include/reactos/exeformat.h @@ -95,6 +95,78 @@ typedef NTSTATUS (NTAPI * PEXEFMT_LOADER) #define EXEFMT_LOADED_ELF32 (0x00000004) #define EXEFMT_LOADED_ELF64 (0x00000005) +/* TODO: Intsafe should be made into a library, as it's generally useful */ +static __inline BOOLEAN Intsafe_CanAddULongPtr(IN ULONG_PTR Addend1, IN ULONG_PTR Addend2) +{ + return Addend1 <= (MAXULONG_PTR - Addend2); +} + +static __inline BOOLEAN Intsafe_CanAddLong64(IN LONG64 Addend1, IN LONG64 Addend2) +{ + return Addend1 <= (MAXLONGLONG - Addend2); +} + +static __inline BOOLEAN Intsafe_CanAddULong32(IN ULONG Addend1, IN ULONG Addend2) +{ + return Addend1 <= (MAXULONG - Addend2); +} + +static __inline BOOLEAN Intsafe_AddULong32(OUT PULONG Result, IN ULONG Addend1, IN ULONG Addend2) +{ + if(!Intsafe_CanAddULong32(Addend1, Addend2)) + return FALSE; + + *Result = Addend1 + Addend2; + return TRUE; +} + +static __inline BOOLEAN Intsafe_CanMulULong32(IN ULONG Factor1, IN ULONG Factor2) +{ + return Factor1 <= (MAXULONG / Factor2); +} + +static __inline BOOLEAN Intsafe_CanOffsetPointer(IN CONST VOID * Pointer, IN SIZE_T Offset) +{ + /* FIXME: (PVOID)MAXULONG_PTR isn't necessarily a valid address */ + return Intsafe_CanAddULongPtr((ULONG_PTR)Pointer, Offset); +} + +static __inline BOOLEAN IsPowerOf2(IN ULONG Number) +{ + if(Number == 0) + return FALSE; + return (Number & (Number - 1)) == 0; +} + +static __inline ULONG ModPow2(IN ULONG Address, IN ULONG Alignment) +{ + ASSERT(IsPowerOf2(Alignment)); + return Address & (Alignment - 1); +} + +static __inline BOOLEAN IsAligned(IN ULONG Address, IN ULONG Alignment) +{ + return ModPow2(Address, Alignment) == 0; +} + +static __inline BOOLEAN AlignUp(OUT PULONG AlignedAddress, IN ULONG Address, IN ULONG Alignment) +{ + ULONG nExcess = ModPow2(Address, Alignment); + + if(nExcess == 0) + { + *AlignedAddress = Address; + return nExcess == 0; + } + else + return Intsafe_AddULong32(AlignedAddress, Address, Alignment - nExcess); +} + +#define PEFMT_FIELDS_EQUAL(TYPE1_, TYPE2_, FIELD_) \ + ( \ + (FIELD_OFFSET(TYPE1_, FIELD_) == FIELD_OFFSET(TYPE2_, FIELD_)) && \ + (RTL_FIELD_SIZE(TYPE1_, FIELD_) == RTL_FIELD_SIZE(TYPE2_, FIELD_)) \ + ) #endif /* EOF */ diff --git a/include/reactos/idl/lsa.idl b/include/reactos/idl/lsa.idl index 706554a0717..00949cf4779 100644 --- a/include/reactos/idl/lsa.idl +++ b/include/reactos/idl/lsa.idl @@ -592,34 +592,34 @@ cpp_quote("#endif") interface lsarpc { /* Function 0 */ - NTSTATUS LsarClose( + NTSTATUS __stdcall LsarClose( [in, out] LSAPR_HANDLE *ObjectHandle); /* Function 1 */ - NTSTATUS LsarDelete( + NTSTATUS __stdcall LsarDelete( [in] LSAPR_HANDLE ObjectHandle); /* Function 2 */ - NTSTATUS LsarEnumeratePrivileges( + NTSTATUS __stdcall LsarEnumeratePrivileges( [in] LSAPR_HANDLE PolicyHandle, [in, out] DWORD *EnumerationContext, [out] PLSAPR_PRIVILEGE_ENUM_BUFFER EnumerationBuffer, [in] DWORD PreferedMaximumLength); /* Function 3 */ - NTSTATUS LsarQuerySecurityObject( + NTSTATUS __stdcall LsarQuerySecurityObject( [in] LSAPR_HANDLE ObjectHandle, [in] SECURITY_INFORMATION SecurityInformation, [out] PLSAPR_SR_SECURITY_DESCRIPTOR *SecurityDescriptor); /* Function 4 */ - NTSTATUS LsarSetSecurityObject( + NTSTATUS __stdcall LsarSetSecurityObject( [in] LSAPR_HANDLE ObjectHandle, [in] SECURITY_INFORMATION SecurityInformation, [in] PLSAPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor); /* Function 5 */ - NTSTATUS LsarChangePassword( + NTSTATUS __stdcall LsarChangePassword( [in] PRPC_UNICODE_STRING String1, [in] PRPC_UNICODE_STRING String2, [in] PRPC_UNICODE_STRING String3, @@ -627,58 +627,58 @@ interface lsarpc [in] PRPC_UNICODE_STRING String5); /* Function 6 */ - NTSTATUS LsarOpenPolicy( + NTSTATUS __stdcall LsarOpenPolicy( [in, unique] PLSAPR_SERVER_NAME SystemName, [in] PLSAPR_OBJECT_ATTRIBUTES ObjectAttributes, [in] ACCESS_MASK DesiredAccess, [out] LSAPR_HANDLE *PolicyHandle); /* Function 7 */ - NTSTATUS LsarQueryInformationPolicy( + NTSTATUS __stdcall LsarQueryInformationPolicy( [in] LSAPR_HANDLE PolicyHandle, [in] POLICY_INFORMATION_CLASS InformationClass, [out, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION *PolicyInformation); /* Function 8 */ - NTSTATUS LsarSetInformationPolicy( + NTSTATUS __stdcall LsarSetInformationPolicy( [in] LSAPR_HANDLE PolicyHandle, [in] POLICY_INFORMATION_CLASS InformationClass, [in, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION PolicyInformation); /* Function 9 */ - NTSTATUS LsarClearAuditLog( + NTSTATUS __stdcall LsarClearAuditLog( [in] LSAPR_HANDLE ObjectHandle); /* Function 10 */ - NTSTATUS LsarCreateAccount( + NTSTATUS __stdcall LsarCreateAccount( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_SID AccountSid, [in] ACCESS_MASK DesiredAccess, [out] LSAPR_HANDLE *AccountHandle); /* Function 11 */ - NTSTATUS LsarEnumerateAccounts( + NTSTATUS __stdcall LsarEnumerateAccounts( [in] LSAPR_HANDLE PolicyHandle, [in, out] DWORD *EnumerationContext, [out] PLSAPR_ACCOUNT_ENUM_BUFFER EnumerationBuffer, [in] DWORD PreferedMaximumLength); /* Function 12 */ - NTSTATUS LsarCreateTrustedDomain( + NTSTATUS __stdcall LsarCreateTrustedDomain( [in] LSAPR_HANDLE PolicyHandle, [in] PLSAPR_TRUST_INFORMATION TrustedDomainInformation, [in] ACCESS_MASK DesiredAccess, [out] LSAPR_HANDLE *TrustedDomainHandle); /* Function 13 */ - NTSTATUS LsarEnumerateTrustedDomains( + NTSTATUS __stdcall LsarEnumerateTrustedDomains( [in] LSAPR_HANDLE PolicyHandle, [in, out] DWORD *EnumerationContext, [out] PLSAPR_TRUSTED_ENUM_BUFFER EnumerationBuffer, [in] DWORD PreferedMaximumLength); /* Function 14 */ - NTSTATUS LsarLookupNames( + NTSTATUS __stdcall LsarLookupNames( [in] LSAPR_HANDLE PolicyHandle, [in] DWORD Count, [in, size_is(Count)] PRPC_UNICODE_STRING Names, @@ -688,7 +688,7 @@ interface lsarpc [in, out] DWORD *MappedCount); /* Function 15 */ - NTSTATUS LsarLookupSids( + NTSTATUS __stdcall LsarLookupSids( [in] LSAPR_HANDLE PolicyHandle, [in] PLSAPR_SID_ENUM_BUFFER SidEnumBuffer, [out] PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, @@ -697,89 +697,89 @@ interface lsarpc [in, out] DWORD *MappedCount); /* Function 16 */ - NTSTATUS LsarCreateSecret( + NTSTATUS __stdcall LsarCreateSecret( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_UNICODE_STRING SecretName, [in] ACCESS_MASK DesiredAccess, [out] LSAPR_HANDLE *SecretHandle); /* Function 17 */ - NTSTATUS LsarOpenAccount( + NTSTATUS __stdcall LsarOpenAccount( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_SID AccountSid, [in] ACCESS_MASK DesiredAccess, [out] LSAPR_HANDLE *AccountHandle); /* Function 18 */ - NTSTATUS LsarEnumeratePrivilegesAccount( + NTSTATUS __stdcall LsarEnumeratePrivilegesAccount( [in] LSAPR_HANDLE AccountHandle, [out] PLSAPR_PRIVILEGE_SET *Privileges); /* Function 19 */ - NTSTATUS LsarAddPrivilegesToAccount( + NTSTATUS __stdcall LsarAddPrivilegesToAccount( [in] LSAPR_HANDLE AccountHandle, [in] PLSAPR_PRIVILEGE_SET Privileges); /* Function 20 */ - NTSTATUS LsarRemovePrivilegesFromAccount( + NTSTATUS __stdcall LsarRemovePrivilegesFromAccount( [in] LSAPR_HANDLE AccountHandle, [in] BOOL AllPrivileges, [in, unique] PLSAPR_PRIVILEGE_SET Privileges); /* Function 21 */ - NTSTATUS LsarGetQuotasForAccount( + NTSTATUS __stdcall LsarGetQuotasForAccount( [in] LSAPR_HANDLE AccountHandle, [out] PQUOTA_LIMITS QuotaLimits); /* Function 22 */ - NTSTATUS LsarSetQuotasForAccount( + NTSTATUS __stdcall LsarSetQuotasForAccount( [in] LSAPR_HANDLE AccountHandle, [in] PQUOTA_LIMITS QuotaLimits); /* Function 23 */ - NTSTATUS LsarGetSystemAccessAccount( + NTSTATUS __stdcall LsarGetSystemAccessAccount( [in] LSAPR_HANDLE AccountHandle, [out] ACCESS_MASK *SystemAccess); /* Function 24 */ - NTSTATUS LsarSetSystemAccessAccount( + NTSTATUS __stdcall LsarSetSystemAccessAccount( [in] LSAPR_HANDLE AccountHandle, [in] ACCESS_MASK SystemAccess); /* Function 25 */ - NTSTATUS LsarOpenTrustedDomain( + NTSTATUS __stdcall LsarOpenTrustedDomain( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_SID TrustedDomainSid, [in] ACCESS_MASK DesiredAccess, [out] LSAPR_HANDLE *TrustedDomainHandle); /* Function 26 */ - NTSTATUS LsarQueryInfoTrustedDomain( + NTSTATUS __stdcall LsarQueryInfoTrustedDomain( [in] LSAPR_HANDLE TrustedDomainHandle, [in] TRUSTED_INFORMATION_CLASS InformationClass, [out, switch_is(InformationClass)] PLSAPR_TRUSTED_DOMAIN_INFO *TrustedDomainInformation); /* Function 27 */ - NTSTATUS LsarSetInformationTrustedDomain( + NTSTATUS __stdcall LsarSetInformationTrustedDomain( [in] LSAPR_HANDLE TrustedDomainHandle, [in] TRUSTED_INFORMATION_CLASS InformationClass, [in, switch_is(InformationClass)] PLSAPR_TRUSTED_DOMAIN_INFO TrustedDomainInformation); /* Function 28 */ - NTSTATUS LsarOpenSecret( + NTSTATUS __stdcall LsarOpenSecret( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_UNICODE_STRING SecretName, [in] ACCESS_MASK DesiredAccess, [out] LSAPR_HANDLE *SecretHandle); /* Function 29 */ - NTSTATUS LsarSetSecret( + NTSTATUS __stdcall LsarSetSecret( [in] LSAPR_HANDLE *SecretHandle, [in, unique] PLSAPR_CR_CIPHER_VALUE EncryptedCurrentValue, [in, unique] PLSAPR_CR_CIPHER_VALUE EncryptedOldValue); /* Function 30 */ - NTSTATUS LsarQuerySecret( + NTSTATUS __stdcall LsarQuerySecret( [in] LSAPR_HANDLE SecretHandle, [in, out, unique] PLSAPR_CR_CIPHER_VALUE *EncryptedCurrentValue, [in, out, unique] PLARGE_INTEGER CurrentValueSetTime, @@ -787,19 +787,19 @@ interface lsarpc [in, out, unique] PLARGE_INTEGER OldValueSetTime); /* Function 31 */ - NTSTATUS LsarLookupPrivilegeValue( + NTSTATUS __stdcall LsarLookupPrivilegeValue( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_UNICODE_STRING Name, [out] PLUID Value); /* Function 32 */ - NTSTATUS LsarLookupPrivilegeName( + NTSTATUS __stdcall LsarLookupPrivilegeName( [in] LSAPR_HANDLE PolicyHandle, [in] PLUID Value, [out] PRPC_UNICODE_STRING *Name); /* Function 33 */ - NTSTATUS LsarLookupPrivilegeDisplayName( + NTSTATUS __stdcall LsarLookupPrivilegeDisplayName( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_UNICODE_STRING Name, [in] USHORT ClientLanguage, @@ -808,76 +808,76 @@ interface lsarpc [out] USHORT *LanguageReturned); /* Function 34 */ - NTSTATUS LsarDeleteObject( + NTSTATUS __stdcall LsarDeleteObject( [in, out] LSAPR_HANDLE *ObjectHandle); cpp_quote("#if _WIN32_WINNT >= 0x0351") /* Function 35 */ - NTSTATUS LsarEnumerateAccountsWithUserRight( + NTSTATUS __stdcall LsarEnumerateAccountsWithUserRight( [in] LSAPR_HANDLE PolicyHandle, [in, unique] PRPC_UNICODE_STRING UserRight, [out] PLSAPR_ACCOUNT_ENUM_BUFFER EnumerationBuffer); /* Function 36 */ - NTSTATUS LsarEnmuerateAccountRights( + NTSTATUS __stdcall LsarEnmuerateAccountRights( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_SID AccountSid, [out] PLSAPR_USER_RIGHT_SET UserRights); /* Function 37 */ - NTSTATUS LsarAddAccountRights( + NTSTATUS __stdcall LsarAddAccountRights( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_SID AccountSid, [in] PLSAPR_USER_RIGHT_SET UserRights); /* Function 38 */ - NTSTATUS LsarRemoveAccountRights( + NTSTATUS __stdcall LsarRemoveAccountRights( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_SID AccountSid, [in] BOOL AllRights, [in] PLSAPR_USER_RIGHT_SET UserRights); /* Function 39 */ - NTSTATUS LsarQueryTrustedDomainInfo( + NTSTATUS __stdcall LsarQueryTrustedDomainInfo( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_SID TrustedDomainSid, [in] TRUSTED_INFORMATION_CLASS InformationClass, [out, switch_is(InformationClass)] PLSAPR_TRUSTED_DOMAIN_INFO *TrustedDomainInformation); /* Function 40 */ - NTSTATUS LsarSetTrustedDomainInfo( + NTSTATUS __stdcall LsarSetTrustedDomainInfo( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_SID TrustedDomainSid, [in] TRUSTED_INFORMATION_CLASS InformationClass, [in, switch_is(InformationClass)] PLSAPR_TRUSTED_DOMAIN_INFO TrustedDomainInformation); /* Function 41 */ - NTSTATUS LsarDeleteTrustedDomain( + NTSTATUS __stdcall LsarDeleteTrustedDomain( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_SID TrustedDomainSid); /* Function 42 */ - NTSTATUS LsarStorePrivateData( + NTSTATUS __stdcall LsarStorePrivateData( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_UNICODE_STRING KeyName, [in, unique] PLSAPR_CR_CIPHER_VALUE EncryptedData); /* Function 43 */ - NTSTATUS LsarRetrievePrivateData( + NTSTATUS __stdcall LsarRetrievePrivateData( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_UNICODE_STRING KeyName, [in, out] PLSAPR_CR_CIPHER_VALUE *EncryptedData); /* Function 44 */ - NTSTATUS LsarOpenPolicy2( + NTSTATUS __stdcall LsarOpenPolicy2( [in, unique, string] PLSAPR_SERVER_NAME SystemName, [in] PLSAPR_OBJECT_ATTRIBUTES ObjectAttributes, [in] ACCESS_MASK DesiredAccess, [out] LSAPR_HANDLE *PolicyHandle); /* Function 45 */ - NTSTATUS LsarGetUserName( + NTSTATUS __stdcall LsarGetUserName( [in, unique, string] PLSAPR_SERVER_NAME SystemName, [in, out] PRPC_UNICODE_STRING *UserName, [in, out, unique] PRPC_UNICODE_STRING *DomainName); @@ -885,21 +885,21 @@ cpp_quote("#if _WIN32_WINNT >= 0x0351") cpp_quote("#if _WIN32_WINNT >= 0x0500") /* Function 46 */ - NTSTATUS LsarQueryInformationPolicy2( + NTSTATUS __stdcall LsarQueryInformationPolicy2( [in] LSAPR_HANDLE PolicyHandle, [in] POLICY_INFORMATION_CLASS InformationClass, [out] unsigned long *PolicyInformation); /* FIXME: should be [out, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION *PolicyInformation); */ /* Function 47 */ - NTSTATUS LsarSetInformationPolicy2( + NTSTATUS __stdcall LsarSetInformationPolicy2( [in] LSAPR_HANDLE PolicyHandle, [in] POLICY_INFORMATION_CLASS InformationClass, [in] unsigned long PolicyInformation); /* FIXME: should be [in, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION PolicyInformation); */ /* Function 48 */ - NTSTATUS LsarQueryTrustedDomainInfoByName( + NTSTATUS __stdcall LsarQueryTrustedDomainInfoByName( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_UNICODE_STRING TrustedDomainName, [in] POLICY_INFORMATION_CLASS InformationClass, @@ -907,7 +907,7 @@ cpp_quote("#if _WIN32_WINNT >= 0x0500") /* FIXME: should be [out, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION *PolicyInformation); */ /* Function 49 */ - NTSTATUS LsarSetTrustedDomainInfoByName( + NTSTATUS __stdcall LsarSetTrustedDomainInfoByName( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_UNICODE_STRING TrustedDomainName, [in] POLICY_INFORMATION_CLASS InformationClass, @@ -915,14 +915,14 @@ cpp_quote("#if _WIN32_WINNT >= 0x0500") /* FIXME: should be [in, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION PolicyInformation); */ /* Function 50 */ - NTSTATUS LsarEnumerateTrustedDomainsEx( + NTSTATUS __stdcall LsarEnumerateTrustedDomainsEx( [in] LSAPR_HANDLE PolicyHandle, [in, out] DWORD *EnumerationContext, [out] PLSAPR_TRUSTED_ENUM_BUFFER_EX EnumerationBuffer, [in] DWORD PreferedMaximumLength); /* Function 51 */ - NTSTATUS LsarCreateTrustedDomainEx( + NTSTATUS __stdcall LsarCreateTrustedDomainEx( [in] LSAPR_HANDLE PolicyHandle, [in] PLSAPR_TRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation, [in] PLSAPR_TRUSTED_DOMAIN_AUTH_INFORMATION AuthentificationInformation, @@ -930,36 +930,36 @@ cpp_quote("#if _WIN32_WINNT >= 0x0500") [out] LSAPR_HANDLE *TrustedDomainHandle); /* Function 52 */ - NTSTATUS LsarSetPolicyReplicationHandle( + NTSTATUS __stdcall LsarSetPolicyReplicationHandle( [in, out] PLSAPR_HANDLE PolicyHandle); /* Function 53 */ - NTSTATUS LsarQueryDomainInformationPolicy( + NTSTATUS __stdcall LsarQueryDomainInformationPolicy( [in] LSAPR_HANDLE PolicyHandle, [in] POLICY_INFORMATION_CLASS InformationClass, [out] unsigned long *PolicyInformation); /* FIXME: should be [out, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION *PolicyInformation); */ /* Function 54 */ - NTSTATUS LsarSetDomainInformationPolicy( + NTSTATUS __stdcall LsarSetDomainInformationPolicy( [in] LSAPR_HANDLE PolicyHandle, [in] POLICY_INFORMATION_CLASS InformationClass, [in] unsigned long PolicyInformation); /* FIXME: should be [in, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION PolicyInformation); */ /* Function 55 */ - NTSTATUS LsarOpenTrustedDomainByName( + NTSTATUS __stdcall LsarOpenTrustedDomainByName( [in] LSAPR_HANDLE PolicyHandle, [in] PRPC_UNICODE_STRING TrustedDomainName, [in] ACCESS_MASK DesiredAccess, [out] LSAPR_HANDLE *TrustedDomainHandle); /* Function 56 */ - NTSTATUS LsarTestCall( + NTSTATUS __stdcall LsarTestCall( [in] handle_t hBinding); /* FIXME */ /* Function 57 */ - NTSTATUS LsarLookupSids2( + NTSTATUS __stdcall LsarLookupSids2( [in] LSAPR_HANDLE PolicyHandle, [in] PLSAPR_SID_ENUM_BUFFER SidEnumBuffer, [out] PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, @@ -970,7 +970,7 @@ cpp_quote("#if _WIN32_WINNT >= 0x0500") [in] DWORD ClientRevision); /* Function 58 */ - NTSTATUS LsarLookupNames2( + NTSTATUS __stdcall LsarLookupNames2( [in] LSAPR_HANDLE PolicyHandle, [in] DWORD Count, [in, size_is(Count)] PRPC_UNICODE_STRING Names, @@ -982,7 +982,7 @@ cpp_quote("#if _WIN32_WINNT >= 0x0500") [in] DWORD ClientRevision); /* Function 59 */ - NTSTATUS LsarCreateTrustedDomainEx2( + NTSTATUS __stdcall LsarCreateTrustedDomainEx2( [in] LSAPR_HANDLE PolicyHandle, [in] PLSAPR_TRUSTED_DOMAIN_INFORMATION_EX TrustedDomainInformation, [in] PLSAPR_TRUSTED_DOMAIN_AUTH_INFORMATION_INTERNAL AuthentificationInformation, @@ -992,39 +992,39 @@ cpp_quote("#if _WIN32_WINNT >= 0x0500") cpp_quote("#if _WIN32_WINNT >= 0x0501") /* Function 60 */ - NTSTATUS CredrWrite( + NTSTATUS __stdcall CredrWrite( [in] handle_t hBinding); /* FIXME */ /* Function 61 */ - NTSTATUS CredrRead( + NTSTATUS __stdcall CredrRead( [in] handle_t hBinding); /* FIXME */ /* Function 62 */ - NTSTATUS CredrEnumerate( + NTSTATUS __stdcall CredrEnumerate( [in] handle_t hBinding); /* FIXME */ /* Function 63 */ - NTSTATUS CredrWriteDomainCredentials( + NTSTATUS __stdcall CredrWriteDomainCredentials( [in] handle_t hBinding); /* FIXME */ /* Function 64 */ - NTSTATUS CredrReadDomainCredentials( + NTSTATUS __stdcall CredrReadDomainCredentials( [in] handle_t hBinding); /* FIXME */ /* Function 65 */ - NTSTATUS CredrDelete( + NTSTATUS __stdcall CredrDelete( [in] handle_t hBinding); /* FIXME */ /* Function 66 */ - NTSTATUS CredrGetTargetInfo( + NTSTATUS __stdcall CredrGetTargetInfo( [in] handle_t hBinding); /* FIXME */ /* Function 67 */ - NTSTATUS CredrProfileLoaded( + NTSTATUS __stdcall CredrProfileLoaded( [in] handle_t hBinding); /* FIXME */ /* Function 68 */ - NTSTATUS LsarLookupNames3( + NTSTATUS __stdcall LsarLookupNames3( [in] LSAPR_HANDLE PolicyHandle, [in] DWORD Count, [in, size_is(Count)] PRPC_UNICODE_STRING Names, @@ -1036,30 +1036,30 @@ cpp_quote("#if _WIN32_WINNT >= 0x0501") [in] DWORD ClientRevision); /* Function 69 */ - NTSTATUS CredrGetSessionTypes( + NTSTATUS __stdcall CredrGetSessionTypes( [in] handle_t hBinding); /* FIXME */ /* Function 70 */ - NTSTATUS LsarRegisterAuditEvent( + NTSTATUS __stdcall LsarRegisterAuditEvent( [in] handle_t hBinding); /* FIXME */ /* Function 71 */ - NTSTATUS LsarGenAuditEvent( + NTSTATUS __stdcall LsarGenAuditEvent( [in] handle_t hBinding); /* FIXME */ /* Function 72 */ - NTSTATUS LsarUnregisterAuditEvent( + NTSTATUS __stdcall LsarUnregisterAuditEvent( [in] handle_t hBinding); /* FIXME */ /* Function 73 */ - NTSTATUS LsarQueryForestTrustInformation( + NTSTATUS __stdcall LsarQueryForestTrustInformation( [in] LSAPR_HANDLE PolicyHandle, [in] PLSA_UNICODE_STRING TrustedDomainName, [in] LSA_FOREST_TRUST_RECORD_TYPE HighestRecordType, [out] PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo); /* Function 74 */ - NTSTATUS LsarSetForestTrustInformation( + NTSTATUS __stdcall LsarSetForestTrustInformation( [in] LSAPR_HANDLE PolicyHandle, [in] PLSA_UNICODE_STRING TrustedDomainName, [in] LSA_FOREST_TRUST_RECORD_TYPE HighestRecordType, @@ -1068,11 +1068,11 @@ cpp_quote("#if _WIN32_WINNT >= 0x0501") [out] PLSA_FOREST_TRUST_COLLISION_INFORMATION *CollisionInfo); /* Function 75 */ - NTSTATUS CredrRename( + NTSTATUS __stdcall CredrRename( [in] handle_t hBinding); /* FIXME */ /* Function 76 */ - NTSTATUS LsarLookupSids3( + NTSTATUS __stdcall LsarLookupSids3( [in] LSAPR_HANDLE PolicyHandle, [in] PLSAPR_SID_ENUM_BUFFER SidEnumBuffer, [out] PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, @@ -1083,7 +1083,7 @@ cpp_quote("#if _WIN32_WINNT >= 0x0501") [in] DWORD ClientRevision); /* Function 77 */ - NTSTATUS LsarLookupNames4( + NTSTATUS __stdcall LsarLookupNames4( [in] LSAPR_HANDLE PolicyHandle, [in] DWORD Count, [in, size_is(Count)] PRPC_UNICODE_STRING Names, @@ -1095,19 +1095,19 @@ cpp_quote("#if _WIN32_WINNT >= 0x0501") [in] DWORD ClientRevision); /* Function 78 */ - NTSTATUS LsarOpenPolicySce( + NTSTATUS __stdcall LsarOpenPolicySce( [in] handle_t hBinding); /* FIXME */ /* Function 79 */ - NTSTATUS LsarAdtRegisterSecurityEventSource( + NTSTATUS __stdcall LsarAdtRegisterSecurityEventSource( [in] handle_t hBinding); /* FIXME */ /* Function 80 */ - NTSTATUS LsarAdtUnregisterSecurityEventSource( + NTSTATUS __stdcall LsarAdtUnregisterSecurityEventSource( [in] handle_t hBinding); /* FIXME */ /* Function 81 */ - NTSTATUS LsarAdtReportSecurityEvent( + NTSTATUS __stdcall LsarAdtReportSecurityEvent( [in] handle_t hBinding); /* FIXME */ cpp_quote("#endif /* _WIN32_WINNT >= 0x0501 */") diff --git a/include/reactos/subsys/lsass/lsasrv.h b/include/reactos/subsys/lsass/lsasrv.h index 48120bf0bd3..445506f4527 100644 --- a/include/reactos/subsys/lsass/lsasrv.h +++ b/include/reactos/subsys/lsass/lsasrv.h @@ -5,4 +5,7 @@ NTSTATUS WINAPI LsapInitLsa(VOID); +NTSTATUS WINAPI +ServiceInit(VOID); + #endif /* __LSASRV_H */ diff --git a/include/reactos/win32k/ntuser.h b/include/reactos/win32k/ntuser.h index f07263a6f1d..920e4e1abff 100644 --- a/include/reactos/win32k/ntuser.h +++ b/include/reactos/win32k/ntuser.h @@ -173,7 +173,7 @@ typedef struct tagHOOK typedef struct _CALLBACKWND { HWND hWnd; - PVOID pvWnd; + struct _WND *pWnd; } CALLBACKWND, *PCALLBACKWND; #define CI_TRANSACTION 0x00000001 @@ -384,6 +384,12 @@ typedef struct _CLS } CLS, *PCLS; +typedef struct _SBINFOEX +{ + SCROLLBARINFO ScrollBarInfo; + SCROLLINFO ScrollInfo; +} SBINFOEX, *PSBINFOEX; + // State Flags !Not Implemented! #define WNDS_HASMENU 0X00000001 #define WNDS_HASVERTICALSCROOLLBAR 0X00000002 @@ -526,6 +532,7 @@ typedef struct _WND struct _WND *spwndClipboardListener; DWORD ExStyle2; + /* ReactOS */ struct { RECT NormalRect; @@ -538,6 +545,11 @@ typedef struct _WND UINT InternalPosInitialized : 1; UINT HideFocus : 1; // WS_EX_UISTATEFOCUSRECTHIDDEN ? UINT HideAccel : 1; // WS_EX_UISTATEKBACCELHIDDEN ? + + /* Scrollbar info */ + PSBINFOEX pSBInfoex; // convert to PSBINFO + /* Entry in the list of thread windows. */ + LIST_ENTRY ThreadListEntry; } WND, *PWND; typedef struct _PFNCLIENT @@ -943,7 +955,7 @@ UINT NTAPI NtUserGetMenuIndex( HMENU hMenu, - UINT wID); + HMENU hSubMenu); BOOL NTAPI @@ -1013,13 +1025,13 @@ NtUserSetSystemMenu( HWND hWnd, HMENU hMenu); -DWORD +BOOL NTAPI NtUserThunkedMenuInfo( HMENU hMenu, LPCMENUINFO lpcmi); -DWORD +BOOL NTAPI NtUserThunkedMenuItemInfo( HMENU hMenu, @@ -3231,8 +3243,6 @@ NtUserMenuInfo( BOOL fsog ); - - typedef struct tagROSMENUITEMINFO { /* ----------- MENUITEMINFOW ----------- */ diff --git a/include/reactos/wine/unicode.h b/include/reactos/wine/unicode.h index 6b2b3cf04d3..9e301888e41 100644 --- a/include/reactos/wine/unicode.h +++ b/include/reactos/wine/unicode.h @@ -34,6 +34,7 @@ #define isdigitW(n) iswdigit((n)) #define isxdigitW(n) iswxdigit((n)) #define isspaceW(n) iswspace((n)) +#define iscntrlW(n) iswcntrl((n)) #define atoiW(s) _wtoi((const wchar_t *)(s)) #define atolW(s) _wtol((const wchar_t *)(s)) #define strlwrW(s) _wcslwr((wchar_t *)(s)) diff --git a/include/reactos/wine/wined3d.idl b/include/reactos/wine/wined3d.idl index 1da7d44b738..83e2bae9740 100644 --- a/include/reactos/wine/wined3d.idl +++ b/include/reactos/wine/wined3d.idl @@ -135,7 +135,7 @@ typedef enum _WINED3DDEGREETYPE WINED3DDEGREE_FORCE_DWORD = 0x7fffffff } WINED3DDEGREETYPE; -typedef enum _WINED3DFORMAT +enum wined3d_format_id { WINED3DFMT_UNKNOWN, WINED3DFMT_B8G8R8_UNORM, @@ -267,11 +267,12 @@ typedef enum _WINED3DFORMAT WINED3DFMT_R8G8_B8G8 = 0x47424752, /* RGBG */ WINED3DFMT_ATI2N = 0x32495441, /* ATI2 */ WINED3DFMT_INST = 0x54534e49, /* INST */ + WINED3DFMT_NVDB = 0x4244564e, /* NVDB */ WINED3DFMT_NVHU = 0x5548564e, /* NVHU */ WINED3DFMT_NVHS = 0x5348564e, /* NVHS */ WINED3DFMT_FORCE_DWORD = 0xffffffff -} WINED3DFORMAT; +}; typedef enum _WINED3DRENDERSTATETYPE { @@ -1536,7 +1537,7 @@ typedef struct _WINED3DDISPLAYMODE UINT Width; UINT Height; UINT RefreshRate; - WINED3DFORMAT Format; + enum wined3d_format_id Format; } WINED3DDISPLAYMODE; typedef struct _WINED3DCOLORVALUE @@ -1569,14 +1570,6 @@ typedef struct _WINED3DMATRIX } DUMMYUNIONNAME; } WINED3DMATRIX; -typedef struct _WINED3DRECT -{ - LONG x1; - LONG y1; - LONG x2; - LONG y2; -} WINED3DRECT; - typedef struct _WINED3DLIGHT { WINED3DLIGHTTYPE Type; @@ -1668,7 +1661,7 @@ typedef struct _WINED3DPRESENT_PARAMETERS { UINT BackBufferWidth; UINT BackBufferHeight; - WINED3DFORMAT BackBufferFormat; + enum wined3d_format_id BackBufferFormat; UINT BackBufferCount; WINED3DMULTISAMPLE_TYPE MultiSampleType; DWORD MultiSampleQuality; @@ -1676,7 +1669,7 @@ typedef struct _WINED3DPRESENT_PARAMETERS HWND hDeviceWindow; BOOL Windowed; BOOL EnableAutoDepthStencil; - WINED3DFORMAT AutoDepthStencilFormat; + enum wined3d_format_id AutoDepthStencilFormat; DWORD Flags; UINT FullScreen_RefreshRateInHz; UINT PresentationInterval; @@ -1685,7 +1678,7 @@ typedef struct _WINED3DPRESENT_PARAMETERS typedef struct _WINED3DSURFACE_DESC { - WINED3DFORMAT format; + enum wined3d_format_id format; WINED3DRESOURCETYPE resource_type; DWORD usage; WINED3DPOOL pool; @@ -1698,7 +1691,7 @@ typedef struct _WINED3DSURFACE_DESC typedef struct _WINED3DVOLUME_DESC { - WINED3DFORMAT Format; + enum wined3d_format_id Format; WINED3DRESOURCETYPE Type; DWORD Usage; WINED3DPOOL Pool; @@ -1716,7 +1709,7 @@ typedef struct _WINED3DCLIPSTATUS typedef struct _WINED3DVERTEXELEMENT { - WINED3DFORMAT format; + enum wined3d_format_id format; WORD input_slot; WORD offset; UINT output_slot; /* D3D 8 & 10 */ @@ -1846,7 +1839,7 @@ typedef struct _WINED3DBUFFER_DESC typedef struct WineDirect3DStridedData { - WINED3DFORMAT format; /* Format of the data */ + enum wined3d_format_id format; /* Format of the data */ const BYTE *lpData; /* Pointer to start of data */ DWORD dwStride; /* Stride between occurrences of this data */ } WineDirect3DStridedData; @@ -2103,7 +2096,7 @@ struct wined3d_shader_signature struct wined3d_parent_ops { - void (*wined3d_object_destroyed)(void *parent); + void (__stdcall *wined3d_object_destroyed)(void *parent); }; interface IWineD3DResource; @@ -2127,7 +2120,7 @@ interface IWineD3DDeviceParent : IUnknown [in] IUnknown *superior, [in] UINT width, [in] UINT height, - [in] WINED3DFORMAT format, + [in] enum wined3d_format_id format_id, [in] DWORD usage, [in] WINED3DPOOL pool, [in] UINT level, @@ -2139,7 +2132,7 @@ interface IWineD3DDeviceParent : IUnknown [in] IUnknown *superior, [in] UINT width, [in] UINT height, - [in] WINED3DFORMAT format, + [in] enum wined3d_format_id format_id, [in] WINED3DMULTISAMPLE_TYPE multisample_type, [in] DWORD multisample_quality, [in] BOOL lockable, @@ -2147,10 +2140,9 @@ interface IWineD3DDeviceParent : IUnknown ); HRESULT CreateDepthStencilSurface( - [in] IUnknown *superior, [in] UINT width, [in] UINT height, - [in] WINED3DFORMAT format, + [in] enum wined3d_format_id format_id, [in] WINED3DMULTISAMPLE_TYPE multisample_type, [in] DWORD multisample_quality, [in] BOOL discard, @@ -2162,7 +2154,7 @@ interface IWineD3DDeviceParent : IUnknown [in] UINT width, [in] UINT height, [in] UINT depth, - [in] WINED3DFORMAT format, + [in] enum wined3d_format_id format_id, [in] WINED3DPOOL pool, [in] DWORD usage, [out] IWineD3DVolume **volume @@ -2173,8 +2165,8 @@ interface IWineD3DDeviceParent : IUnknown [out] IWineD3DSwapChain **swapchain ); } -typedef ULONG (*D3DCB_DESTROYSWAPCHAINFN)(IWineD3DSwapChain *pSwapChain); -typedef HRESULT (*D3DCB_ENUMRESOURCES)(IWineD3DResource *resource, void *pData); +typedef ULONG (__stdcall *D3DCB_DESTROYSWAPCHAINFN)(IWineD3DSwapChain *pSwapChain); +typedef HRESULT (__stdcall *D3DCB_ENUMRESOURCES)(IWineD3DResource *resource, void *pData); [ object, @@ -2183,8 +2175,7 @@ typedef HRESULT (*D3DCB_ENUMRESOURCES)(IWineD3DResource *resource, void *pData); ] interface IWineD3DBase : IUnknown { - HRESULT GetParent( - [out] IUnknown **parent + void *GetParent( ); } @@ -2205,11 +2196,11 @@ interface IWineD3D : IWineD3DBase ); UINT GetAdapterModeCount( [in] UINT adapter_idx, - [in] WINED3DFORMAT format + [in] enum wined3d_format_id format_id ); HRESULT EnumAdapterModes( [in] UINT adapter_idx, - [in] WINED3DFORMAT format, + [in] enum wined3d_format_id format_id, [in] UINT mode_idx, [out] WINED3DDISPLAYMODE *mode ); @@ -2225,7 +2216,7 @@ interface IWineD3D : IWineD3DBase HRESULT CheckDeviceMultiSampleType( [in] UINT adapter_idx, [in] WINED3DDEVTYPE device_type, - [in] WINED3DFORMAT surface_format, + [in] enum wined3d_format_id surface_format_id, [in] BOOL windowed, [in] WINED3DMULTISAMPLE_TYPE multisample_type, [out] DWORD *quality_levels @@ -2233,31 +2224,31 @@ interface IWineD3D : IWineD3DBase HRESULT CheckDepthStencilMatch( [in] UINT adapter_idx, [in] WINED3DDEVTYPE device_type, - [in] WINED3DFORMAT adapter_format, - [in] WINED3DFORMAT render_target_format, - [in] WINED3DFORMAT depth_stencil_format + [in] enum wined3d_format_id adapter_format_id, + [in] enum wined3d_format_id render_target_format_id, + [in] enum wined3d_format_id depth_stencil_format_id ); HRESULT CheckDeviceType( [in] UINT adapter_idx, [in] WINED3DDEVTYPE device_type, - [in] WINED3DFORMAT display_format, - [in] WINED3DFORMAT backbuffer_format, + [in] enum wined3d_format_id display_format_id, + [in] enum wined3d_format_id backbuffer_format_id, [in] BOOL windowed ); HRESULT CheckDeviceFormat( [in] UINT adaper_idx, [in] WINED3DDEVTYPE device_type, - [in] WINED3DFORMAT adapter_format, + [in] enum wined3d_format_id adapter_format_id, [in] DWORD usage, [in] WINED3DRESOURCETYPE resource_type, - [in] WINED3DFORMAT check_format, + [in] enum wined3d_format_id check_format, [in] WINED3DSURFTYPE surface_type ); HRESULT CheckDeviceFormatConversion( [in] UINT adapter_idx, [in] WINED3DDEVTYPE device_type, - [in] WINED3DFORMAT source_format, - [in] WINED3DFORMAT target_format + [in] enum wined3d_format_id source_format_id, + [in] enum wined3d_format_id target_format_id ); HRESULT GetDeviceCaps( [in] UINT adapter_idx, @@ -2269,7 +2260,6 @@ interface IWineD3D : IWineD3DBase [in] WINED3DDEVTYPE device_type, [in] HWND focus_window, [in] DWORD behaviour_flags, - [in] IUnknown *parent, [in] IWineD3DDeviceParent *device_parent, [out] IWineD3DDevice **device ); @@ -2350,7 +2340,7 @@ interface IWineD3DPalette : IWineD3DBase local, uuid(8f2bceb1-d338-488c-ab7f-0ec980bf5d2d) ] -interface IWineD3DClipper : IWineD3DBase +interface IWineD3DClipper : IUnknown { HRESULT GetClipList( [in] const RECT *rect, @@ -2380,11 +2370,7 @@ interface IWineD3DClipper : IWineD3DBase ] interface IWineD3DSurface : IWineD3DResource { - HRESULT GetContainer( - [in] REFIID riid, - [out] void **container - ); - HRESULT GetDesc( + void GetDesc( [out] WINED3DSURFACE_DESC *desc ); HRESULT LockRect( @@ -2477,27 +2463,13 @@ interface IWineD3DSurface : IWineD3DResource void BindTexture( [in] BOOL srgb ); - HRESULT SaveSnapshot( - [in] const char *filename - ); - HRESULT SetContainer( - [in] IWineD3DBase *container - ); const void *GetData( ); HRESULT SetFormat( - [in] WINED3DFORMAT format + [in] enum wined3d_format_id format_id ); HRESULT PrivateSetup( ); - void ModifyLocation( - [in] DWORD location, - [in] BOOL persistent - ); - HRESULT LoadLocation( - [in] DWORD location, - [in] const RECT *rect - ); WINED3DSURFTYPE GetImplType( ); HRESULT DrawOverlay( @@ -2511,11 +2483,7 @@ interface IWineD3DSurface : IWineD3DResource ] interface IWineD3DVolume : IWineD3DResource { - HRESULT GetContainer( - [in] REFIID riid, - [out] void **container - ); - HRESULT GetDesc( + void GetDesc( [out] WINED3DVOLUME_DESC *desc ); HRESULT LockBox( @@ -2529,9 +2497,6 @@ interface IWineD3DVolume : IWineD3DResource [in] int gl_level, [in] BOOL srgb_mode ); - HRESULT SetContainer( - [in] IWineD3DBase *container - ); } [ @@ -2563,8 +2528,6 @@ interface IWineD3DBaseTexture : IWineD3DResource HRESULT BindTexture( [in] BOOL srgb ); - UINT GetTextureDimensions( - ); BOOL IsCondNP2( ); } @@ -2680,8 +2643,6 @@ interface IWineD3DStateBlock : IUnknown ); HRESULT Apply( ); - HRESULT InitStartupStateBlock( - ); } [ @@ -2689,7 +2650,7 @@ interface IWineD3DStateBlock : IUnknown local, uuid(905ddbac-6f30-11d9-c687-00046142c14f) ] -interface IWineD3DQuery : IWineD3DBase +interface IWineD3DQuery : IUnknown { HRESULT GetData( [out] void *data, @@ -2768,7 +2729,7 @@ interface IWineD3DBuffer : IWineD3DResource ); HRESULT Unmap( ); - HRESULT GetDesc( + void GetDesc( [out] WINED3DBUFFER_DESC *desc ); } @@ -2823,12 +2784,12 @@ interface IWineD3DPixelShader : IWineD3DBaseShader local, uuid(6d10a2ce-09d0-4a53-a427-11388f9f8ca5) ] -interface IWineD3DDevice : IWineD3DBase +interface IWineD3DDevice : IUnknown { HRESULT CreateBuffer( [in] struct wined3d_buffer_desc *desc, [in] const void *data, - [in] IUnknown *parent, + [in] void *parent, [in] const struct wined3d_parent_ops *parent_ops, [out] IWineD3DBuffer **buffer ); @@ -2836,42 +2797,41 @@ interface IWineD3DDevice : IWineD3DBase [in] UINT length, [in] DWORD usage, [in] WINED3DPOOL pool, - [out] IWineD3DBuffer **vertex_buffer, - [in] IUnknown *parent, - [in] const struct wined3d_parent_ops *parent_ops + [in] void *parent, + [in] const struct wined3d_parent_ops *parent_ops, + [out] IWineD3DBuffer **vertex_buffer ); HRESULT CreateIndexBuffer( [in] UINT length, [in] DWORD usage, [in] WINED3DPOOL pool, - [out] IWineD3DBuffer **index_buffer, - [in] IUnknown *parent, - [in] const struct wined3d_parent_ops *parent_ops + [in] void *parent, + [in] const struct wined3d_parent_ops *parent_ops, + [out] IWineD3DBuffer **index_buffer ); HRESULT CreateStateBlock( [in] WINED3DSTATEBLOCKTYPE type, - [out] IWineD3DStateBlock **stateblock, - [in] IUnknown *parent + [out] IWineD3DStateBlock **stateblock ); HRESULT CreateSurface( [in] UINT width, [in] UINT height, - [in] WINED3DFORMAT format, + [in] enum wined3d_format_id format_id, [in] BOOL lockable, [in] BOOL discard, [in] UINT level, - [out] IWineD3DSurface **surface, [in] DWORD usage, [in] WINED3DPOOL pool, [in] WINED3DMULTISAMPLE_TYPE multisample_type, [in] DWORD multisample_quality, [in] WINED3DSURFTYPE surface_type, - [in] IUnknown *parent, - [in] const struct wined3d_parent_ops *parent_ops + [in] void *parent, + [in] const struct wined3d_parent_ops *parent_ops, + [out] IWineD3DSurface **surface ); HRESULT CreateRendertargetView( [in] IWineD3DResource *resource, - [in] IUnknown *parent, + [in] void *parent, [out] IWineD3DRendertargetView **rendertarget_view ); HRESULT CreateTexture( @@ -2879,11 +2839,11 @@ interface IWineD3DDevice : IWineD3DBase [in] UINT height, [in] UINT levels, [in] DWORD usage, - [in] WINED3DFORMAT format, + [in] enum wined3d_format_id format_id, [in] WINED3DPOOL pool, - [out] IWineD3DTexture **texture, - [in] IUnknown *parent, - [in] const struct wined3d_parent_ops *parent_ops + [in] void *parent, + [in] const struct wined3d_parent_ops *parent_ops, + [out] IWineD3DTexture **texture ); HRESULT CreateVolumeTexture( [in] UINT width, @@ -2891,83 +2851,82 @@ interface IWineD3DDevice : IWineD3DBase [in] UINT depth, [in] UINT levels, [in] DWORD usage, - [in] WINED3DFORMAT format, + [in] enum wined3d_format_id format_id, [in] WINED3DPOOL pool, - [out] IWineD3DVolumeTexture **texture, - [in] IUnknown *parent, - [in] const struct wined3d_parent_ops *parent_ops + [in] void *parent, + [in] const struct wined3d_parent_ops *parent_ops, + [out] IWineD3DVolumeTexture **texture ); HRESULT CreateVolume( [in] UINT width, [in] UINT height, [in] UINT depth, [in] DWORD usage, - [in] WINED3DFORMAT format, + [in] enum wined3d_format_id format_id, [in] WINED3DPOOL pool, - [out] IWineD3DVolume **volume, - [in] IUnknown *parent, - [in] const struct wined3d_parent_ops *parent_ops + [in] void *parent, + [in] const struct wined3d_parent_ops *parent_ops, + [out] IWineD3DVolume **volume ); HRESULT CreateCubeTexture( [in] UINT edge_length, [in] UINT levels, [in] DWORD usage, - [in] WINED3DFORMAT format, + [in] enum wined3d_format_id format_id, [in] WINED3DPOOL pool, - [out] IWineD3DCubeTexture **texture, - [in] IUnknown *parent, - [in] const struct wined3d_parent_ops *parent_ops + [in] void *parent, + [in] const struct wined3d_parent_ops *parent_ops, + [out] IWineD3DCubeTexture **texture ); HRESULT CreateQuery( [in] WINED3DQUERYTYPE type, - [out] IWineD3DQuery **query, - [in] IUnknown *parent + [out] IWineD3DQuery **query ); HRESULT CreateSwapChain( [in] WINED3DPRESENT_PARAMETERS *present_parameters, - [out] IWineD3DSwapChain **swapchain, - [in] IUnknown *parent, - [in] WINED3DSURFTYPE surface_type + [in] WINED3DSURFTYPE surface_type, + [in] void *parent, + [out] IWineD3DSwapChain **swapchain ); HRESULT CreateVertexDeclaration( - [out] IWineD3DVertexDeclaration **declaration, - [in] IUnknown *parent, - [in] const struct wined3d_parent_ops *parent_ops, [in] const WINED3DVERTEXELEMENT *elements, - [in] UINT element_count + [in] UINT element_count, + [in] void *parent, + [in] const struct wined3d_parent_ops *parent_ops, + [out] IWineD3DVertexDeclaration **declaration ); HRESULT CreateVertexDeclarationFromFVF( - [out] IWineD3DVertexDeclaration **declaration, - [in] IUnknown *parent, + [in] DWORD fvf, + [in] void *parent, [in] const struct wined3d_parent_ops *parent_ops, - [in] DWORD fvf + [out] IWineD3DVertexDeclaration **declaration ); HRESULT CreateVertexShader( [in] const DWORD *function, [in] const struct wined3d_shader_signature *output_signature, - [out] IWineD3DVertexShader **shader, - [in] IUnknown *parent, - [in] const struct wined3d_parent_ops *parent_ops + [in] void *parent, + [in] const struct wined3d_parent_ops *parent_ops, + [out] IWineD3DVertexShader **shader ); HRESULT CreateGeometryShader( [in] const DWORD *byte_code, [in] const struct wined3d_shader_signature *output_signature, - [out] IWineD3DGeometryShader **shader, - [in] IUnknown *parent, - [in] const struct wined3d_parent_ops *parent_ops + [in] void *parent, + [in] const struct wined3d_parent_ops *parent_ops, + [out] IWineD3DGeometryShader **shader ); HRESULT CreatePixelShader( [in] const DWORD *function, [in] const struct wined3d_shader_signature *output_signature, - [out] IWineD3DPixelShader **shader, - [in] IUnknown *parent, - [in] const struct wined3d_parent_ops *parent_ops + [in] void *parent, + [in] const struct wined3d_parent_ops *parent_ops, + [out] IWineD3DPixelShader **shader ); HRESULT CreatePalette( [in] DWORD flags, [in] const PALETTEENTRY *palette_entry, - [out] IWineD3DPalette **palette, - [in] IUnknown *parent + [in] void *parent, + [out] IWineD3DPalette **palette ); HRESULT Init3D( [in] WINED3DPRESENT_PARAMETERS *present_parameters @@ -3076,7 +3035,7 @@ interface IWineD3DDevice : IWineD3DBase ); HRESULT SetIndexBuffer( [in] IWineD3DBuffer *index_buffer, - [in] WINED3DFORMAT format + [in] enum wined3d_format_id format_id ); HRESULT GetIndexBuffer( [out] IWineD3DBuffer **index_buffer @@ -3125,8 +3084,7 @@ interface IWineD3DDevice : IWineD3DBase HRESULT SetPixelShader( [in] IWineD3DPixelShader *shader ); - HRESULT GetPixelShader( - [out] IWineD3DPixelShader **shader + IWineD3DPixelShader *GetPixelShader( ); HRESULT SetPixelShaderConstantB( [in] UINT start_register, @@ -3175,10 +3133,6 @@ interface IWineD3DDevice : IWineD3DBase [in] DWORD render_target_idx, [out] IWineD3DSurface **render_target ); - HRESULT SetFrontBackBuffers( - [in] IWineD3DSurface *front, - [in] IWineD3DSurface *back - ); HRESULT SetSamplerState( [in] DWORD sampler_idx, [in] WINED3DSAMPLERSTATETYPE state, @@ -3255,8 +3209,7 @@ interface IWineD3DDevice : IWineD3DBase HRESULT SetVertexShader( [in] IWineD3DVertexShader *shader ); - HRESULT GetVertexShader( - [out] IWineD3DVertexShader **shader + IWineD3DVertexShader *GetVertexShader( ); HRESULT SetVertexShaderConstantB( [in] UINT start_register, @@ -3327,7 +3280,7 @@ interface IWineD3DDevice : IWineD3DBase ); HRESULT Clear( [in] DWORD rect_count, - [in] const WINED3DRECT *rects, + [in] const RECT *rects, [in] DWORD flags, [in] WINED3DCOLOR color, [in] float z, @@ -3335,7 +3288,7 @@ interface IWineD3DDevice : IWineD3DBase ); void ClearRendertargetView( [in] IWineD3DRendertargetView *rendertarget_view, - [in] const float color[4] + [in] const WINED3DCOLORVALUE *color ); void SetPrimitiveType( [in] WINED3DPRIMITIVETYPE primitive_topology @@ -3359,7 +3312,7 @@ interface IWineD3DDevice : IWineD3DBase HRESULT DrawIndexedPrimitiveUP( [in] UINT index_count, [in] const void *index_data, - [in] WINED3DFORMAT index_data_format, + [in] enum wined3d_format_id index_data_format_id, [in] const void *stream_data, [in] UINT stream_stride ); @@ -3372,7 +3325,7 @@ interface IWineD3DDevice : IWineD3DBase [in] const WineDirect3DVertexStridedData *strided_data, [in] UINT vertex_count, [in] const void *index_data, - [in] WINED3DFORMAT index_data_format + [in] enum wined3d_format_id index_data_format_id ); HRESULT DrawRectPatch( [in] UINT handle, @@ -3389,8 +3342,8 @@ interface IWineD3DDevice : IWineD3DBase ); HRESULT ColorFill( [in] IWineD3DSurface *surface, - [in] const WINED3DRECT *rect, - [in] WINED3DCOLOR color + [in] const RECT *rect, + [in] const WINED3DCOLORVALUE *color ); HRESULT UpdateTexture( [in] IWineD3DBaseTexture *src_texture, @@ -3421,7 +3374,7 @@ interface IWineD3DDevice : IWineD3DBase ); } -IWineD3D *WineDirect3DCreate(UINT dxVersion, IUnknown *parent); -IWineD3DClipper *WineDirect3DCreateClipper(IUnknown *parent); +IWineD3D *WineDirect3DCreate(UINT dxVersion, void *parent); +IWineD3DClipper *WineDirect3DCreateClipper(void); void wined3d_mutex_lock(void); void wined3d_mutex_unlock(void); diff --git a/lib/3rdparty/bzip2/CHANGES b/lib/3rdparty/bzip2/CHANGES index 6e4f65e2e0a..81e97ca6fa2 100644 --- a/lib/3rdparty/bzip2/CHANGES +++ b/lib/3rdparty/bzip2/CHANGES @@ -2,8 +2,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. @@ -317,3 +317,11 @@ Fixes some minor bugs since the last version, 1.0.3. ~~~~~~~~~~~~~~~~~ Security fix only. Fixes CERT-FI 20469 as it applies to bzip2. + +1.0.6 (6 Sept 10) +~~~~~~~~~~~~~~~~~ + +* Security fix for CVE-2010-0405. This was reported by Mikolaj + Izdebski. + +* Make the documentation build on Ubuntu 10.04 diff --git a/lib/3rdparty/bzip2/LICENSE b/lib/3rdparty/bzip2/LICENSE index f420cffb67d..cc614178cf7 100644 --- a/lib/3rdparty/bzip2/LICENSE +++ b/lib/3rdparty/bzip2/LICENSE @@ -2,7 +2,7 @@ -------------------------------------------------------------------------- This program, "bzip2", the associated library "libbzip2", and all -documentation, are copyright (C) 1996-2007 Julian R Seward. All +documentation, are copyright (C) 1996-2010 Julian R Seward. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -37,6 +37,6 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Julian Seward, jseward@bzip.org -bzip2/libbzip2 version 1.0.5 of 10 December 2007 +bzip2/libbzip2 version 1.0.6 of 6 September 2010 -------------------------------------------------------------------------- diff --git a/lib/3rdparty/bzip2/Makefile-libbz2_so b/lib/3rdparty/bzip2/Makefile-libbz2_so index 9a13c77e487..e58791b3b33 100644 --- a/lib/3rdparty/bzip2/Makefile-libbz2_so +++ b/lib/3rdparty/bzip2/Makefile-libbz2_so @@ -1,6 +1,6 @@ # This Makefile builds a shared version of the library, -# libbz2.so.1.0.4, with soname libbz2.so.1.0, +# libbz2.so.1.0.6, with soname libbz2.so.1.0, # at least on x86-Linux (RedHat 7.2), # with gcc-2.96 20000731 (Red Hat Linux 7.1 2.96-98). # Please see the README file for some important info @@ -10,8 +10,8 @@ # This file is part of bzip2/libbzip2, a program and library for # lossless, block-sorting data compression. # -# bzip2/libbzip2 version 1.0.5 of 10 December 2007 -# Copyright (C) 1996-2007 Julian Seward +# bzip2/libbzip2 version 1.0.6 of 6 September 2010 +# Copyright (C) 1996-2010 Julian Seward # # Please read the WARNING, DISCLAIMER and PATENTS sections in the # README file. @@ -35,13 +35,13 @@ OBJS= blocksort.o \ bzlib.o all: $(OBJS) - $(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.4 $(OBJS) - $(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.1.0.4 + $(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.6 $(OBJS) + $(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.1.0.6 rm -f libbz2.so.1.0 - ln -s libbz2.so.1.0.4 libbz2.so.1.0 + ln -s libbz2.so.1.0.6 libbz2.so.1.0 clean: - rm -f $(OBJS) bzip2.o libbz2.so.1.0.4 libbz2.so.1.0 bzip2-shared + rm -f $(OBJS) bzip2.o libbz2.so.1.0.6 libbz2.so.1.0 bzip2-shared blocksort.o: blocksort.c $(CC) $(CFLAGS) -c blocksort.c diff --git a/lib/3rdparty/bzip2/README b/lib/3rdparty/bzip2/README index e17a84e049f..9fb0f636013 100644 --- a/lib/3rdparty/bzip2/README +++ b/lib/3rdparty/bzip2/README @@ -6,8 +6,8 @@ This version is fully compatible with the previous public releases. This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. -bzip2/libbzip2 version 1.0.5 of 10 December 2007 -Copyright (C) 1996-2007 Julian Seward +bzip2/libbzip2 version 1.0.6 of 6 September 2010 +Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in this file. @@ -181,6 +181,10 @@ WHAT'S NEW IN 1.0.5 ? See the CHANGES file. +WHAT'S NEW IN 1.0.6 ? + + See the CHANGES file. + I hope you find bzip2 useful. Feel free to contact me at jseward@bzip.org @@ -208,3 +212,4 @@ Cambridge, UK. 15 February 2005 (bzip2, version 1.0.3) 20 December 2006 (bzip2, version 1.0.4) 10 December 2007 (bzip2, version 1.0.5) + 6 Sept 2010 (bzip2, version 1.0.6) diff --git a/lib/3rdparty/bzip2/README.COMPILATION.PROBLEMS b/lib/3rdparty/bzip2/README.COMPILATION.PROBLEMS index 22b95c6cb66..667d0d6dfe4 100644 --- a/lib/3rdparty/bzip2/README.COMPILATION.PROBLEMS +++ b/lib/3rdparty/bzip2/README.COMPILATION.PROBLEMS @@ -2,8 +2,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. -bzip2/libbzip2 version 1.0.5 of 10 December 2007 -Copyright (C) 1996-2007 Julian Seward +bzip2/libbzip2 version 1.0.6 of 6 September 2010 +Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. @@ -12,7 +12,7 @@ This program is released under the terms of the license contained in the file LICENSE. ------------------------------------------------------------------ -bzip2-1.0.5 should compile without problems on the vast majority of +bzip2-1.0.6 should compile without problems on the vast majority of platforms. Using the supplied Makefile, I've built and tested it myself for x86-linux and amd64-linux. With makefile.msc, Visual C++ 6.0 and nmake, you can build a native Win32 version too. Large file diff --git a/lib/3rdparty/bzip2/blocksort.c b/lib/3rdparty/bzip2/blocksort.c index bd2dec157fa..d0d662cd4e9 100644 --- a/lib/3rdparty/bzip2/blocksort.c +++ b/lib/3rdparty/bzip2/blocksort.c @@ -8,8 +8,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. diff --git a/lib/3rdparty/bzip2/bzip2.1 b/lib/3rdparty/bzip2/bzip2.1 index a313f2d5bed..ce3a78e6b4f 100644 --- a/lib/3rdparty/bzip2/bzip2.1 +++ b/lib/3rdparty/bzip2/bzip2.1 @@ -1,7 +1,7 @@ .PU .TH bzip2 1 .SH NAME -bzip2, bunzip2 \- a block-sorting file compressor, v1.0.4 +bzip2, bunzip2 \- a block-sorting file compressor, v1.0.6 .br bzcat \- decompresses files to stdout .br @@ -405,11 +405,11 @@ I/O error messages are not as helpful as they could be. tries hard to detect I/O errors and exit cleanly, but the details of what the problem is sometimes seem rather misleading. -This manual page pertains to version 1.0.4 of +This manual page pertains to version 1.0.6 of .I bzip2. Compressed data created by this version is entirely forwards and backwards compatible with the previous public releases, versions -0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, 1.0.2 and 1.0.3, but with the following +0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, 1.0.2 and above, but with the following exception: 0.9.0 and above can correctly decompress multiple concatenated compressed files. 0.1pl2 cannot do this; it will stop after decompressing just the first file in the stream. diff --git a/lib/3rdparty/bzip2/bzip2.1.preformatted b/lib/3rdparty/bzip2/bzip2.1.preformatted index 15e16e50aba..63c33be99e7 100644 --- a/lib/3rdparty/bzip2/bzip2.1.preformatted +++ b/lib/3rdparty/bzip2/bzip2.1.preformatted @@ -3,7 +3,7 @@ bzip2(1) bzip2(1) NNAAMMEE - bzip2, bunzip2 竏 a block窶尽orting file compressor, v1.0.4 + bzip2, bunzip2 竏 a block窶尽orting file compressor, v1.0.6 bzcat 竏 decompresses files to stdout bzip2recover 竏 recovers data from damaged bzip2 files @@ -348,11 +348,11 @@ CCAAVVEEAATTSS but the details of what the problem is sometimes seem rather misleading. - This manual page pertains to version 1.0.4 of _b_z_i_p_2_. Comツュ + This manual page pertains to version 1.0.6 of _b_z_i_p_2_. Comツュ pressed data created by this version is entirely forwards and backwards compatible with the previous public releases, versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, - 1.0.2 and 1.0.3, but with the following exception: 0.9.0 + 1.0.2 and above, but with the following exception: 0.9.0 and above can correctly decompress multiple concatenated compressed files. 0.1pl2 cannot do this; it will stop after decompressing just the first file in the stream. diff --git a/lib/3rdparty/bzip2/bzip2.c b/lib/3rdparty/bzip2/bzip2.c index 390410735b5..6de9d1d1488 100644 --- a/lib/3rdparty/bzip2/bzip2.c +++ b/lib/3rdparty/bzip2/bzip2.c @@ -7,8 +7,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. @@ -1605,11 +1605,11 @@ void license ( void ) "bzip2, a block-sorting file compressor. " "Version %s.\n" " \n" - " Copyright (C) 1996-2007 by Julian Seward.\n" + " Copyright (C) 1996-2010 by Julian Seward.\n" " \n" " This program is free software; you can redistribute it and/or modify\n" " it under the terms set out in the LICENSE file, which is included\n" - " in the bzip2-1.0.5 source distribution.\n" + " in the bzip2-1.0.6 source distribution.\n" " \n" " This program is distributed in the hope that it will be useful,\n" " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" diff --git a/lib/3rdparty/bzip2/bzip2.txt b/lib/3rdparty/bzip2/bzip2.txt index 4fb9c7435ee..d2deb394911 100644 --- a/lib/3rdparty/bzip2/bzip2.txt +++ b/lib/3rdparty/bzip2/bzip2.txt @@ -1,6 +1,6 @@ NAME - bzip2, bunzip2 - a block-sorting file compressor, v1.0.4 + bzip2, bunzip2 - a block-sorting file compressor, v1.0.6 bzcat - decompresses files to stdout bzip2recover - recovers data from damaged bzip2 files @@ -345,11 +345,11 @@ CAVEATS but the details of what the problem is sometimes seem rather misleading. - This manual page pertains to version 1.0.4 of bzip2. Com- + This manual page pertains to version 1.0.6 of bzip2. Com- pressed data created by this version is entirely forwards and backwards compatible with the previous public releases, versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, - 1.0.2 and 1.0.3, but with the following exception: 0.9.0 + 1.0.2 and above, but with the following exception: 0.9.0 and above can correctly decompress multiple concatenated compressed files. 0.1pl2 cannot do this; it will stop after decompressing just the first file in the stream. diff --git a/lib/3rdparty/bzip2/bzip2recover.c b/lib/3rdparty/bzip2/bzip2recover.c index 5f6d6218095..f9de0496abf 100644 --- a/lib/3rdparty/bzip2/bzip2recover.c +++ b/lib/3rdparty/bzip2/bzip2recover.c @@ -7,8 +7,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. @@ -313,7 +313,7 @@ Int32 main ( Int32 argc, Char** argv ) inFileName[0] = outFileName[0] = 0; fprintf ( stderr, - "bzip2recover 1.0.5: extracts blocks from damaged .bz2 files.\n" ); + "bzip2recover 1.0.6: extracts blocks from damaged .bz2 files.\n" ); if (argc != 2) { fprintf ( stderr, "%s: usage is `%s damaged_file_name'.\n", diff --git a/lib/3rdparty/bzip2/bzlib.c b/lib/3rdparty/bzip2/bzlib.c index 4d76c0f6549..a97eaba5a18 100644 --- a/lib/3rdparty/bzip2/bzlib.c +++ b/lib/3rdparty/bzip2/bzlib.c @@ -8,8 +8,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. diff --git a/lib/3rdparty/bzip2/bzlib.h b/lib/3rdparty/bzip2/bzlib.h index 751750544bd..16432f6088d 100644 --- a/lib/3rdparty/bzip2/bzlib.h +++ b/lib/3rdparty/bzip2/bzlib.h @@ -8,8 +8,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. diff --git a/lib/3rdparty/bzip2/bzlib_private.h b/lib/3rdparty/bzip2/bzlib_private.h index 23427879b18..5d0217f4635 100644 --- a/lib/3rdparty/bzip2/bzlib_private.h +++ b/lib/3rdparty/bzip2/bzlib_private.h @@ -8,8 +8,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. @@ -36,7 +36,7 @@ /*-- General stuff. --*/ -#define BZ_VERSION "1.0.5, 10-Dec-2007" +#define BZ_VERSION "1.0.6, 6-Sept-2010" typedef char Char; typedef unsigned char Bool; diff --git a/lib/3rdparty/bzip2/compress.c b/lib/3rdparty/bzip2/compress.c index 8c80a079700..caf7696011b 100644 --- a/lib/3rdparty/bzip2/compress.c +++ b/lib/3rdparty/bzip2/compress.c @@ -8,8 +8,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. diff --git a/lib/3rdparty/bzip2/crctable.c b/lib/3rdparty/bzip2/crctable.c index 215687b2c05..1fea7e946c5 100644 --- a/lib/3rdparty/bzip2/crctable.c +++ b/lib/3rdparty/bzip2/crctable.c @@ -8,8 +8,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. diff --git a/lib/3rdparty/bzip2/decompress.c b/lib/3rdparty/bzip2/decompress.c index bba5e0fa36d..311f5668f9a 100644 --- a/lib/3rdparty/bzip2/decompress.c +++ b/lib/3rdparty/bzip2/decompress.c @@ -8,8 +8,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. @@ -381,6 +381,13 @@ Int32 BZ2_decompress ( DState* s ) es = -1; N = 1; do { + /* Check that N doesn't get too big, so that es doesn't + go negative. The maximum value that can be + RUNA/RUNB encoded is equal to the block size (post + the initial RLE), viz, 900k, so bounding N at 2 + million should guard against overflow without + rejecting any legitimate inputs. */ + if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR); if (nextSym == BZ_RUNA) es = es + (0+1) * N; else if (nextSym == BZ_RUNB) es = es + (1+1) * N; N = N * 2; @@ -485,15 +492,28 @@ Int32 BZ2_decompress ( DState* s ) RETURN(BZ_DATA_ERROR); /*-- Set up cftab to facilitate generation of T^(-1) --*/ + /* Check: unzftab entries in range. */ + for (i = 0; i <= 255; i++) { + if (s->unzftab[i] < 0 || s->unzftab[i] > nblock) + RETURN(BZ_DATA_ERROR); + } + /* Actually generate cftab. */ s->cftab[0] = 0; for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; + /* Check: cftab entries in range. */ for (i = 0; i <= 256; i++) { if (s->cftab[i] < 0 || s->cftab[i] > nblock) { /* s->cftab[i] can legitimately be == nblock */ RETURN(BZ_DATA_ERROR); } } + /* Check: cftab entries non-descending. */ + for (i = 1; i <= 256; i++) { + if (s->cftab[i-1] > s->cftab[i]) { + RETURN(BZ_DATA_ERROR); + } + } s->state_out_len = 0; s->state_out_ch = 0; diff --git a/lib/3rdparty/bzip2/huffman.c b/lib/3rdparty/bzip2/huffman.c index 87e79e38af0..2283fdbc5a1 100644 --- a/lib/3rdparty/bzip2/huffman.c +++ b/lib/3rdparty/bzip2/huffman.c @@ -8,8 +8,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. diff --git a/lib/3rdparty/bzip2/manual.ps b/lib/3rdparty/bzip2/manual.ps index b8b610c8123..cbc6f924dff 100644 --- a/lib/3rdparty/bzip2/manual.ps +++ b/lib/3rdparty/bzip2/manual.ps @@ -1,5 +1,5 @@ %!PS-Adobe-3.0 -%%Creator: xpdf/pdftops 3.01 +%%Creator: PassiveTeX 1.25 %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%DocumentMedia: plain 612 792 0 () () @@ -10,7 +10,8 @@ %%PageMedia: plain %%EndDefaults %%BeginProlog -%%BeginResource: procset xpdf 3.01 0 +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2004 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def @@ -20,7 +21,6 @@ pop 3 dict begin /PageSize exch def /ImagingBBox null def - /Policies 1 dict dup begin /PageSize 3 def end def { /Duplex true def } if currentdict end setpagedevice } { @@ -135,6 +135,7 @@ % clipping operators /W { clip newpath } def /W* { eoclip newpath } def +/Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def @@ -243,6 +244,8 @@ pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def % Level 2 image operators /pdfImBuf 100 string def /pdfIm { @@ -257,6 +260,7 @@ not { pop exit } if (%-EOD-) eq { exit } if } loop } def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { @@ -338,7 +342,8 @@ dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { - pop 2 copy add 0.5 mul axialCol sc + pop 2 copy add 0.5 mul + axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { @@ -382,11 +387,24 @@ dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { - pop 2 copy add 0.5 mul dt mul t0 add axialCol sc - exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add - 0 360 arc h - dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add - 0 360 arc h f* + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse } ifelse } def end @@ -394,7 +412,7 @@ end %%EndProlog %%BeginSetup xpdf begin -%%BeginResource: font DTUUHP+NimbusSanL-Bold +%%BeginResource: font PYRIYB+NimbusSanL-Bold %!PS-AdobeFont-1.0: NimbusSanL-Bold 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development @@ -417,7 +435,7 @@ xpdf begin /UnderlinePosition -155 def /UnderlineThickness 69 def end readonly def -/FontName /DTUUHP+NimbusSanL-Bold def +/FontName /PYRIYB+NimbusSanL-Bold def /PaintType 0 def /WMode 0 def /FontBBox {-173 -307 1003 949} readonly def @@ -431,342 +449,352 @@ d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf 045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 -1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b8d62a63193c4ae94c086c1 -552833ddd8f116b5df33205ae709b3aa63da7bebb165b67281827b48fb5edbed -02a1a5c0784fc57d3487daa59520bada1be3fb9795669924321ce4f466cd8e3f -7e8ec2494aee80e2dd7a48a6861af5b9f0ccaa4a2fe2b03498eacacd6b9c39c6 -a8f2e39e06bbb061cf2ec380a32efad0b790974bb5cc3daf0992471456967362 -77de34813f27abe99302f86bb4d293a37f84667e7f3dfee4cfe9d1a676a5728c -aeb5222ff50da97e74b2cdebf725fbca7015a188891c8a376b9dd8a642c4b184 -b1bbf3f376a6d6e31ef1c8354ddf8039cb20faabcb34d4749b3c8c8d6972ceb1 -06b8a5aae3ae40a91f1f2b1155681a9cc933f87528c99a2b0268b43a3e829e7f -3bd863cb52950773bd9b0731dc4992541d7de7a055ca65ddd2317f1705c20d1f -93291bcc254cbaba425c032b3b15050d41da14ffe1b3d684eea428095a01e931 -98d4f849b239ad9d79f4502f0271affb0c297f2f347bfb9c137782646f648f77 -0076b85f5a929fcdea2703333f6918b8f125627f8b505c688e30f258ded1aecf -2c86edcd88c29249a8081731737195fab7adbb54743bd66511194dee2516959b -a20701e2d97342248297425491f6c9471ec9a98e630d734dac19721f0b324432 -c8d7a0b751453f89f7008ba37bc48e0831ee3ecbd8a0a292d63cfc890b28f695 -9e29ac3b4ddb78a6883b9272ce34a012a82adec0b6b641e3940a438a098ccfbf -c50544b94facfd9d7ae09ad0632015f81d2f77fc6d80a42ec11d67d8a91c376c -13c8e3444cdfde4d2a1ed021410f4d6a4e97804ae949bd913094d23108c9d384 -56f11025e2d24939114b6bcf579a0315c52f3ca1bcc2860fc1a0b9fb8a37ae2f -c20c0fd44d215fc2af737fd0339b070d54e664021240071c665de4170dfa182d -4e385685fb41a2d85888b1149e9a766cb4f309b4e2baa28cf1f8cc12c4b19e33 -f046ce97b53deb549fea96cf6ce66357c4904b7932f5b1ce03cfe3a10c976b9c -c9ad11d7a02816f8e11666ca8b3ee1411df2ca94172659bad929e3e3e5248f48 -0690cec6d8f7061608cf2672f65abdc96b4fca84d5c847440cf9523d3bf23f6b -d4365582e4b187b6a1a0282ed323bf221edd0a4ce11ce7eda738d1af48b2e19f -eb3da1664de99c447c35dfd45069fded1fcd70b4a6855e91ffbd7146efe88012 -0bff1d6d1acb53d5e07fb5795f561a4a3e953bba7c03a9762adae18e58dce6b3 -b1a703122ef3b16963ac7cb9682ce60e17947e7e675d19901c7e8272ce4c9fdf -536abdffa429b820a82aee9a73d7dcf77dde4d8e251cb3b3a5b0a91c0fcd7fbb -ead7a812ff194fd049f28b82f4c2d73e41cc73c1c9f668931a2c7eba5400a1b9 -0902efe6792f207136e1e16b41794e6cbf7316889a602d35c37ef36dec95af26 -e9bb0900456f2ebf2705ecce7b2ed90343d23e006ecb282d4b3629bb0c3892f3 -ff9c17fe6c5fab68358e1cd44aff021948ac9fb8410a3de22e0a01e367c52470 -2a8cfd284cf9e8f505d5dbd7bbe242fe071fea0094a55ed1cd7c9be6b7c56c98 -16ad1985fb7624f5e48cf6c0c2ed85b466f64c52f017b20cdabb85d24452e086 -3942362e764a2bda0f6c1b24426e302ddc4403a087efb2850cf3275c7b24275a -ae270f212831f4c4a5d95deab61923ca126e587e8f5ed4f2d5738f06e8c4f911 -b346b8ecdac481dedd2f546305a7cd63cb67d40093c618fbbdf498c8d7ead8c7 -1f5f022d0bbcfaa8670e3b3b999a1697c947af38d7e1a360e3f0825a9aa77840 -d7a9dfd575ce2f04d308f7c553ebf569ac84f2c12aa0869ce107c713a3cce624 -5059bfb3f5aa27d10e337086144ab09286be3825a3482c5422454c6a9cbbf205 -833316780eb88302796fc427a0fb9e53a7bf24577feb3fa5d85cb6344f908007 -183522d3c760c11fc7da8d14bb5dd800576a6b4d1b991c1bf3db0f9ca2ac5d22 -91079a199f2f6e6dc68213d33ea893b74f6aff30ed1b51f8b53a015ffd4d2076 -b71f73225b151cfcf11e2a2917cf1b3f60e2b4d442307c394e1625f7e60eb12a -f2eb9ca7b17b082f1664d09cb7a3f38aea99a13f659089426126f47fad5b6dc7 -64101cd437da3c22bc43e7a8de07253eb371470ee1e4e42a5d1fa2c4db5565ad -79d6271ae28e8fde5d4cb24064c145de44ed486a1e7df2df921f2b1be5fdb120 -d8b781c3655ea72dc22a2a2d37579f0af60b42320ab25c8d769124352448a154 -7a381b388a4d9a54e82f199ba35f1a3981823ab698e3f87d38d32addd4f13832 -77fcc9acee7fbd3285f689a85b76d0feb9e70f09bad0ce144770a6cc203ce40e -15912de0e3465dbc7918e3ea49ade57ee8c48c75937f5d25498c45170693067e -6902937c9b43ab6080111663d5dc6d88f72a39c5e7bad677229498323a3e7a22 -2fe2552b00cb91ce2848a1a53538b7af2503a3671903e10df0e9641dbb70577a -e828dd3cae98fa9e1a74f4377f908d3cd79461408ed29832bc4c9865550ccb00 -45359282255057a4bd4859915cf1e45ecdb7329f90bbf63e0a22a54b05c5acd1 -9c7c4dfc25482a27a20c7ab908546c3577e87ade93ea46436314a0a7c524b892 -4b012239e77cd65ae2949bbf7e46a5a2269b7ffb1cf8a5bc7eea1944d2b0bf37 -bfc36adad9a599fa133f77935f24ef518819d054345df144731dd2332b0f7f5e -84c46af486941cf1293e86ee719c9bab6263470c7009c3933f1857b0a863e36c -288d37e6ac85e6a1b4e6e91c0a9fe367bec427ea3713e8d1f0523ecff6067717 -244ca21c177968583815f023420a660f7aa4cdc8bf25ac3b3e429942b9f5123d -84234c186d9226487c76dfef5d26165771c0e75f0ace7e3882e49de831b46c12 -e30dc37395241d7619c05abc40f5a36f8042b461fb6c3a5181f77b14e9e6d978 -37356b4b31fac3850df1869063724316104c799b6a2f42c361a375e4d29eba7f -850fe29efbc2cef627a25db549a4d4c48f9fc9a2f32fa50c1ce6b5a545a95f7e -bf2e9ed710ae91ace1281a44e49aee4133ccc04926a6dba24b721c21188c89a5 -2a49745501cfaa4364cf49e3ec2a59d9ee46f33362634f9758827b199fd07dba -939bd7387124656831862f70a97c5a05959572c74865f5902e95093fecdbea3b -bba9b47dace807262de0c7ef04843259f58a323471237cd573298c5d0a0650ad -2acabd71cb44c63675192845e3d01b3b28af871f347d4a460cc28d9e94409443 -30e893d27b06132063ab727a38f447a2a4633d29adac01bdccc7634e64dfdc55 -9141f69e1202c4a0fd48479b0ed95a7605c94901373e1100a6cbfc113fcce445 -e0317cc94a8507dd637c37676954b9d34c6727aacf17285876db16dd0e11384c -2b996e85e82fd8fd2b8f9b83bccb398b997364f0ddb71e60ccc50cdd5d122eec -c36b86a89fbbb5bfb227fba3a7b7de7c907e58780fc276c24ff066982691a97a -50d14362d27d790375a47162decc53c5c11e8a7499788dfd86aefffe7e674aed -26706e2d079e9a571c6a32accc8c0dcf23508f58477d05f9a1fc679c0da64254 -27ae33293d02c9eca01daf2d0a1b07e5515d36e18caa3ab1b6c5736dfdefe384 -dbcd244f0c11087a873c4501c6de2a5a57e346fd3f92a0451e63fff6b99c6dfc -64ed8673dc54ef6509d0d043925bce39072fc64ddf2c49b8602d1a51ee822f19 -d7b2135aa84626bfe3ff321a6bec3a003ad97e7699cfa34bf41f9c2b38df4794 -cb5ae36c95f42b44212de67a96ca9d047587998636673a031c4eb03cf1a55326 -f5d94dde75086b44f095ede0068fb6b9d256759041cda04ecacbd8d7784159af -ae31a9c637d9a5c0c6840dd9e30eacc66d4d6fd6f12a603aa2db3e9866693070 -0d69cddc416d4b76cf6b835c7bebf914816b87edcd5a24e346eba2dded30f5a0 -dc033e93b040a6ee7f8ab3c44c61017c758c11c2e2fe3c4f18996287a48fa9f8 -fd068c42d0d3384ff27c5a88ef630125562663ee95a66b7b588b417b20d3ae84 -6ecf2693940d4733f9e70b0455b6097e73553eed34df8da712c29d76326670b7 -13f19d4b5ada1833d46fd6cfb92b85eb946cc74252718cc5e605cd6c3c5a46e8 -51536cddcc3cb244c78e629fab784fd76372ca9417fa67f292a7e780b78186d7 -f391cd91b6222e88c0bcff66208814965511967b2ed0d075c77b57701608b647 -b4e462d3e56e06c0403f858582a754dcbf8841fe81d39359d8c5a77c8ae6b795 -c11b84f702de09f22498a189a4c69d726a63260784066562a50544e5d07aebb5 -8265c1c6607bfc6008f2edfc9d0de71646548e59bb374996a4412ac22ab47dc8 -357153c7c9061e95952a729a80fb45f3650fb0c84a07c1956dcc0856d7b0fa71 -3f09c1b995b0c48c57c9367c0601a46cdaefd0460735682d5aafe8545cba587b -ca6e8144ff14a25b2fce9b23d8ebf715c5a544bd646d5460d2f8cbd44b6d8203 -54e4b7377db351ff26b7b9336a7dca3a610d3a92541054c544064447ac6d1a15 -cf1d1a3797cfe85fb55b56ac01fbb6f47e9c8e5c2929bdc7ee14f6d868464493 -df4759cc80405ef270a816607f248c5c1d5c56035a8ffc1fc1b5f69aabe2f964 -cba4c0ed5416a20f102c82bdfe59ddb4a16140c85d55af2aa52c92ee85c37881 -9c95865704b3cc39da6270dfaca8c3611edbb6da767bb50a03d6a06ed9890104 -da2a575ea45e16da2e1fdcd603c91af6beb934ea33023152c25c27c3c771b553 -1a9aa1ae684e1539e549972c97321fa0710759b6d4b9e55ef1b41bda01d77786 -87c22cb79310a9000bade74a8ac97b3eb2ff024bfd60c0ad7fdedb23c805f64e -fd139e015e0d1d3591be5930c356e6b8c1a4f0ad9af94eded4ee9aaa436d4cf9 -58c5897d06b7c97cdec22745c46e7b37695a8c66140f7f8421138892f4851c3f -d355b1de1d32145d39243d0590a90f1c4ec2c246d3f3779b319c38d4221576be -fd17d8bc8819cf8ec30075305f8637d1ddf0f7255ad456cc290f10ec39ddc2f5 -290092718e7d268531aaeb377701dafa933b94ce763c1954ef0cce19d77c9208 -157c38b279c578c56b7e523afccc91fe6819483de18ceebbe74b81844ddb84c6 -22d4f29661e89e5417ce43c28028e9e1c54063afd716088b6e8fe0cd1702c2c3 -31273573f5c3d760c8a2c7cbb362ed650ea8ff54f19e097f14af9739885af15b -46ed31cdef73db671b22efd41ff3f6bbd29625fae7571f9542fc06c77e28d2f6 -3ba2c9cf89da564de3a6fb3f0ff981c5c482a1e1de730041b7f1c890c4528bf1 -8e79f2fa4ed8a738f09a68a5b53edf6cbcf8861003917a89989146af7ab2e5a2 -836279643900c27a90463679a22f0ca5077728f6ae8a28324f9adcc19fa493b5 -e2465c6d98cb608f8dc52cdd6c52bad1a1502779b638df9336e12f035b3c310c -b92b3add047365f2d25b0ec7e05cc46f31c0575eaf4ebea0b660aa20d9e7edf9 -0aa077e3000e25176038ccc92d4f9fdbae6b05aa2e17ad004e13308464a20cdd -0271ed0f964e73cb11f18c2b795dba31c3ffd5648c63dab395238ba7c0cc7db6 -b206e6179c6ad7c2534c46a2b9c1d7fe6bc693df35118b708933677ab3a76cee -9ac0303c2c0967d718a1691f6a922abb6b37625fc01908c10242731b79a1a82c -fce9efbd1c6bd483fd867bc2938609ee52c0271a7ed1fde1b8667b98e22fd450 -86f515fd2ac2c11c50fce95f3e506ac6518dd4e532ddb100d87a9240bdcdafc2 -0c8bec467d76261165e9d8bdac9197ec798c81cfe80e3619f432674cadf44ff4 -3f61089abeb13d665e7901f4a1ba84115333210009d55e051b692aebee9d9bf3 -d0219c290191c17f7317aaf402b88ba353c25f126e2d32bef73d528c65af0840 -3ed4086daff574762531794fdbf637b765273911297b75338691e9ef4d2ad452 -22454c6a9cbbf205039d6d35c09a0ce284e9a776773a98e09e6a816dd71d80c3 -d80abcb006353b4b7c48c76bd9c1ed9db78bf62e9ad2222e5bee9fde0281f0e6 -11fd6f899938cee729a184be7cbdb0b84fc9c380d6c69cdd6e0f3f6780af684b -cec6361673853b400f47e00177ff1ee7f9eb8c285a49e137e08d5d7663df71ab -71ca71adc0857055686a04777a2e1408ce629e018c97524af5588991be92e4fa -4a27745aa950a72d479c48d6f8c30d4258a882f199b4359f92a963fc650230c5 -79edf743f2cfe86a197296dd675bf05f25ed969de77bfdd0b518cbb5c30b4e42 -27c5117f235b34f7fc32413a980a38968ff9b8151280a0259214790e421d0f39 -eeebe98adba820401c2d47d4132cc68cae0f59b049d7489f62259bfc55091c81 -89e2480dcb77f689965151b7f6706af675a871370d2195b07457af8809f7abfe -7d3672d76a74f55ec749ef40f755a3eed96cce000644ca0c497afaab7294afdc -13c3239f54f3eeee809bcd936ff447277d2f3613936e7b39e683f25b60505f2b -f4343ed0902badeb62495cef53789b9e74baf866be33efe66c1c5faa95f60ac9 -156a26bb9f72cb73e891ee4b905f72845b3ae05e025879f07a7b91fd06204148 -60832d64b6bd5abe0472aa7aff07fa05d23a01238b6f624ae8db25bb71ddd893 -1fc6003f23292a428a5a99df5861e0ae858c398d66d027a32a71d6e62d62b6a1 -a1db86b1ea3005a201618f22899cb1e7d70f65fdcfbf7962ee0d0d15412d006c -cfebd0e0892888f26238bd1f7f090de03c41ee4ba53548f469fda2d94f6b3da8 -a606fcc3554e3f261b8490a3b8cde3ee846542668ce3b371318f9864c45a4223 -fa2a86e12034bba867c4abeb461c609c8d47e184703bd6c891f39076ee06bfd3 -bffa679de07d8c8eed9b4b24ff74c6db2cf84108f28e4f0fdb78e0e726a9bd3f -2a1b94daee18fd20f2c902cbeba13c1b281d0a11a96b20800e4cf939dd32bda8 -25aa63d9f86f380af4dd379d80441dc4fbc0719a69ebc16e1617940a19eb0b44 -96581982d45b08e512000e3915490a1a79b908e1e63ae129750fa45dd33c0e9e -2e767a89c6f11e33f193da18dc6c820dbed8d370492c19ad9d6407e50cb62446 -d3ab009d9e8f3c51eac2139ab64ffa19b70405813652fbbe33fbe5bc95d40b5f -9ef833a4b1b51e56065abfef1036eeab8e04f096aac0d2813c2e721e0db97368 -c17f0cc971c9ca18a2db11745f67d42ce5148e2e8b2c0e13e4bb16a2789f0c4c -e7b65be454ea623212bb2ce5afc6b5b3ad5bfed65063354becbc1531389977e4 -6599896d9ddbdf3ad6fdd8a44b14ec8cc9f131d73cba91e28cb54b37655e4b44 -db0457ae7bfd3c6b73bacf09861a7fe4b664928230fa03cb99ebb763703ff8d2 -68877c3a3b1cf915891578aec60c1f7d1e447fc777d8eb3573ba2a9ce47c99ca -a9d52f2f12b101fe48658edc7543ef85dfe01b72dc4dda597951ea4298fd444a -ee33b14ff2f91b7297922daa7e346493080868f56aaa2176c9f2c1284e4b2672 -a3b75face39df1c8b7a825a3a5c25871d190e48574e1d03a5fb094d418c47ac1 -687e8347036cc44fed3d84fe5d4b84a61fac9968b8d004c28539a3681476ac45 -56538901ff2764c1c46f5ffe048cd3a7eafc6a9fe98ff9b3cfdf3ac035a9d3f6 -8d75440d43a1842cc1e8b6b9b6d49a9bd093620735c9c7c11c21652a5262a86f -c10413a373a9e02a488bd9a16a51fb51b027b2c5cde35cb1aed91ce58703e1e9 -ebdc1a161d754ee437412182f7d532426841e2455add22c031a2171426881bbe -4090d1cbfc498ef46749308b73ebf4dc5a06adde6f83bfb368388bf7c2d900cf -57932ba4c9db0f15faff7cbd701050a1db98bdc9a5f9f428980ecfb1e999f460 -231e59b5c62c7879278f10f6a61f79cc9da24d35a2d26996d8a4a106e081b8c8 -3fcc015b775acb00f78953a834018c146c65cd715bfb5f90c03feac01839c6ba -156e327c97350d2851dd77e8263b967742472dc1e3b8f0e980de9f1815007cea -51619d84375b777d5cf32a144affd8ef0f4fee2df1f839b2a5d900ec8e76363d -c829f1d03d211175ab982226616b19c51800e4b5d4b28aba82980eaac6131940 -026e3c2297e197fb8f130fb15d2c4098b97c84074d4e50b5c6606bb0f3230931 -52b39a58964b4ca44caf45f63af49b330ab3dd863f5ebfa8ab0db6cc37838a64 -72c601c215037e94ac89420fea13d52174ed5c933e8c8525f88e6ce482661861 -58b904ba7fdb864cfe04bd7ce6070fc5ef576b1de985a8c4eeca7fe32b90d320 -9091d8931bc21c6f969288b1cab44bc53755d8d8f257466803dfd5725dbb5830 -4be6c784fb6f8c5e66802028759c0597246fc103eb63b58f361b144668713570 -8c6be071b51fde425a0aa5724986ca67e87eacb8f517fb3103e52595ba002e02 -82e54cb82b04c993d991d70b5eaac7a639213ec0f82a1d7750f3f6e94d8ac7a0 -8a586b816a9fbe78ff96bf1e3cd52798089f279a0a0d93e0314883988bba0f78 -7ce5745f8b07eb3b750c1d0a13fa4b0338346220ff9ff10cfe04f29e2c24aef0 -f77f6748b63b0c6d53461536034450820c73116cc66feb9c7f7d08e0a47d4c92 -ec61c5342099c27d93a79d9c9f278142ba03b51d6e1e03944abe063baac32629 -1b5dc30de8512f0cb3a973cc43afc2be532ed012c3eb58266cbeebf611f91aa1 -489d0174e713b976f3a0b36c575df597a3d8b12d4c5441e3a478f0933eb129ea -e44484e084bdde7d2d9ba23a6bf1bbdd51d96ba4a5207af1044e917186b7e66d -accde1295b615f37f1395827e29e3a1711fb2b6c50374df468be421cc531eae4 -b3cd2473c979d11c11beaf14aa9b6cce4acc8208f22f9fbb6713bb8306e5b5a4 -d46d11e604114d9a5a4be0615a843d10de54ad62d582302fffcfab7f785b11c4 -83081286cfa04302f7b92f64dbb42f3f97cde0c047662be6a3e58986c54b7c3e -2ac1b0d19bc1490311150931aed3497abaa74303d3f0a3f3af8667c4b0b91385 -cdc9bd2ae98ac32a2d943e0583a0f3c74fcb803559fea211098b48385d3d8d32 -9e2cda61d7589e5383fa32abfcac50355549f1e819eb31531dadc47f5e759790 -d355444f1efa6b1dfc7713d446008225808fffbdc81a3b1b374c7f2901e27e2c -41c477de0e52e9005288b7175117b32c326b3ad2b9f9342865d0bdd0ba6044ac -395c2c69bf82a7aa9b77842a3bc7b4a675b0c32a4e4504d2a9fe8762170f54c3 -4dc3620cdea9d1877f274559ac6d37aa83f90346130472775858c18746db4558 -4f2fa7698926c4fb2eef0951579dae63c2d3c7b9e1fc811ee5dda4dc5b5e61fd -c0ed21724902532087dbef11b1fd0d71eca9f271a3d1bf8ded5df19db6761547 -97d0a12f94147d64bade52704f880d0fcb89f4958547c6839c9e111892797f29 -4e65f7a54e14ea3d3f50712979f84852e57b9c1d70474a3593d53f21603e00e0 -e79ff355914f9a3d4ab1e14410eac9926928e714248535b178d6fe9e0e84ce99 -59f66fb52f37a4e3dfa5488b76d9ae2f62d4495bca11cc148dc20e29a694fabd -e65c7629ebc40ff0c0fa109631655d3ef9848e16aa7c73cfd4aed02f8f125ab5 -0d628ce52fcae577c7ef0ab688a2f4fa9a0e2a9b10b93130f0b357f4679c1f7c -9bd270f34f0bfd86459b402c74224a621dfad6ed316d05e15d31707fae7a9b62 -f8f75537326742f1e9d0c7483489f4f4fa38e0f327f24fbfb26307ead2720bd9 -678f45875eb05036341ba38660630b7d005304d4388ff7eb3be9c2635c21af0a -02d12fd19a4e52181a9c7f2356b2a16eae4e8ed5b1ea0c01565c26856787fdfc -2aaaf11958ff3414ab62ca19e947db6b78030e2c528f3d1c0215cadbb0c34f72 -6751da03c604bae7b97f379864bb54be9799bd387e88d6c7053f83dbae1cfb04 -f2ac87d12dcbe17a5183780fab4589e8b0d70934e856f11629a91e6d13da7704 -73cc80e0b80bdd42a71eee5f43a4dab994ee7cfeff83d08169aa298c98a85477 -dfc729ed6db098b4ae47a25b8ae7587b8cb2d59cc0989c06129fc201e7c9b763 -f8b3f651a5c735edc975cec4ce461e81ac9d5e3b08a708fc536b46b9566a58c3 -0402aafd2b6018dd063877b880f85e09895dd4c9d89b5f264ad72cbea438c153 -054e1a5ece2091e1d4105f46b047b75ff3be86491e694c1e2e03bff36812d148 -d9923f5d89a28fbc4f45fbc3db74cc37bf3cf41b070d72a4cd571524fa6df788 -3153e77818641287ae22b1c72331fbff019ccecbc1709615ad749dc77cb6b331 -30ca3d0fa05cc47447c17d96cf6ded782ff6b505193915aebe31f1f7b95dc9fd -91a124f9551224117174ae1e05754dedcec813a8aa4934b73de1b20d7c10a20d -83a8b085cc2d431b87397e5f8286c0a80704101475ec9845b2bf7ecb9ae457fd -abad09e4e8ee411d4a20518597b08d5dd66afebba03f632ff2ed520270893f00 -35cf0716f4a092faf8a0c2a3f73ca46afd2a825eee041bbc2b649330fe821807 -707a06ed91847b434d34742844947d54e80422f5b5b56f6dbda934089c32ad12 -375b31af9aa91329c253fafd3cff4858c39ae5efbed4d590819d2f5963b7e08a -99e157ca1c18b20c62a8f7bd278f560e871b6126d9cdcec52c6839417bc70dd2 -49fa373ca6dd557540906729f2fc5476c38595d958ab2b6c14629f9e16a2a9ce -9f6e2dd760e55a38a3432e74126135364cec00a7b6dbf0cd48555df9f31e71aa -9d573bb077085030aa3146d0693fe683884ab380f052c38b31b0e3483d122c4d -d15a6a93eafec3523f4b2744935de9d1660fb4d8a76d82045862b59ea2183961 -f9868bf03e4a71db61e03fae93bea1092ac5ec83d71dad123d5663149d4bd0be -e643435aabc919942bbc60d4ab56ecdecad30d270589775a3ff718cef0e2ea46 -b8c75fa911752ef13410185e5cea25aee6fae74489355d3328e0cbe8d4c55d46 -4114b4a4c85309dff4f2a5c2b14fc4f4779f4e3a8bd29076baec35cd59ecadca -09e93d8dd4786052d970484ea3cb45b37c4a6f74249e9f5eb7583b018dcdabfe -67259769ae1a904f20b3ef352cd191bbed998f4b2c06465d7355e82ffa718e08 -9dfa5c8fdaac95d8e05cf8b5a899b8484c5ea104eef3e5b21436ed396662222c -8cfd00b5a854ba9338da205f16e5c0f451bc1c6cf34f0da069af5ccfb460cccb -b6f393a99f6138e0ece299e0c0f7f1d0c83e0b936cac2dc38f08292245e7afdc -6538c4fecc7d712ef83997088f73ae6ff0ab83d0ae76a7811cc07b41a57d1d34 -04681526d327b489094dd961f2f60a0c6c275f09f0a171e88056f58735d2f502 -65a167d12ff3395df58c3b901a68f0d96f8ef54ac5548086229adac495fbc256 -afe832991f1839aeddf1a87abc217835e58af4199823165fb9899fc831b47bfe -4c3c1f5a2696e9a5f310afb8138eea06fda0688e0d0d7cd1ceff93a72c57289d -332525c3bc60e51ab25526a4876affb2c64657caf14b34fca46a78e41b0c1955 -01fa1a0c0d77d5f7026234af489b316872e64b4d449efc540fb0da553063a71b -d8ee44b0f9a20adb9f60b99803f1760c0cde357784e87042133aa085e9a37a5b -b5685e73354ca0e9a48d886fd12841674bc0713d43301883f1c2f6190b47a4b9 -996c0e528b6572c96232ecbc57c57073463ae36b5b2974163cff75828a20c47f -926e99faab51f19fdbe0f89bb71ffba9eb95a82b3a712b54578f665a89edf193 -d575ed95bb883f9d6797029ff0cc8a75459fac0cca4530e17d93c9834a8d9c9b -376d3e40f3e44e6e895f25c90a803cf8b0f3056037809e3ed618475c199f43cb -a7eeff84d38f49aafa4e469aa78cddb87ea76a87da1b888c38e225499d1bb089 -32d599918227c97b1e4de521460f1a175ff2fc500bb95574d9eac64cd00896f6 -27589fe5351f46a46d1fe8ae16fdc945decb08c0b7d841c5516535ab65b84724 -04796bd7b7083a606977316dffaeec0e8681c10df4deef6335403e5b08889558 -48bfb1b8708a5c41c5147fbed3942ac26ce66357c4904b79147dca55f039b648 -ae18d0d6d330a621301e3c1d6e478fc6fcee4c3382d463491a167596ff51f17d -1afdd4ee7ab8f1b27b4ef2b665cb6818637b5e982447f6d7ab2806f769d254f9 -f5981812a9458a39f51366773a8980c7c6dced448d878af3bc088237815d2727 -40093cb7c3a4e6e86ec6cd61fa8ad13b20e270f97ee5be1799f2966a0ca2a7c9 -32de08bb021adf9466f1b88ffef315b818954057877d3d59f173c1b1874fffdd -e3749a0dba7d62d70483b1a7c7720c1e95c59faeed0c8be1913177c6dbaa6905 -a6bd1a153906aa1b6919ebd1befb9a54d9b84cd9d548b1abe83933670ea719b8 -6337d01283b95306db92fe059da52d107ec47819bd163b3830c989df4052614a -9866b057aeaed455fc9864df1960e97806cf95011394e2052861152024969836 -77be8008c246f14aea1c26e620fb331f96cd32a23b1c87d534d678181a198758 -4bffe069fb5a0c6b63ca8a9cfb6c3fd6ecf07c5bc59712ec7d02a5b988c3fbbf -695fc7068a644d8885ccd88987532539e5cefc64fb97ec1376ef0a97970db510 -4c19b7a64a1b4f7eedfec2515996238dadbbfa8afd8004f12867de20912c2774 -1ceca6f2956b340ccb5e30f2b1f5f6376e6d3a272be05c29125f6d74bbee7879 -8836ee673971ab724dc89867d5a939da0cb41678fbb8d8ed35efa28de86728f7 -953c9c5896b867e4b7df3322563aff8a31cca8901b5542af2c7254547c7c09d0 -15baa7cbdc7352960ac650a543f05e290341d245ddd331a556ac7fc0ee7eb246 -718b71073b9a32776f6215fd8fa2297a2e9be23728cbb24c53ea10a4544ddfb5 -7d6292640840c77bf03728c3e5d2665ed7db7410c9ecb32c249a45664f72f8f4 -2e81a2e086b535f6473b1a3319d134317edbd1864cba7b79f89ef99d16c8871a -28fbc4cb45f982bac6de81ef637a7e1022a5579f73867e40e31ec8903632e33f -b24abe53b1f3a3097779b977bbeb41c21857909d3e25f7bc88e6d3fe6f183da0 -0133a99ae39080012df8498b9ce322ea9b76343c2e8be3676f08602470da2761 -ed9de407fba38be82de624e1552be40a0e10b55ad74367b91c80b8bc5cf59f64 -b79072369d9e492ee6b9f9df0b91ae608a44020ed6874038974ccc9afa88d6b7 -8114af4de09e77e4b0a1a1fb27e226a62385b969bbebb657ea927fd86e050ff1 -3ebd001a022333f8caca13c54f9b345cd5b6553c90b4f7fb949d7d65d9bf9fd9 -46a3c7c531f6a6479aab0d5a7015b56959777892feea7990edbd2b423f6e9ce4 -583caac124c268628a9cb703dd96aacd35b1031e08a741d02adfd579267df790 -5ef26af14b2bbdc22a1eb33b58719a1e8463f28784f4c15cb3c25cfb2e20a508 -7854a53f4ab398b02177de500a049d6c9faa13fd40c19178e878f1cc26221c59 -b40545f5f4442abba06656ead5afd938adeb3ea50c699862d48e767c223c1f22 -246e58c5694d1e23511710817a9fd18a1620cc651345e6d3302d85139f7a5734 -7e423be145e165baf46019fe831f97602ec87b3cdfb8fea12869c98f115d1b66 -5aa588fa82484acded7ca2c13a17bda305f63ee226ee1f37cf247f1aea9ff92e -2fa4c1e0448a5dde45294699a9490a5ea94cf81c53491fc19e2ade5af005c300 -a5fc99b893ed1d469788e94de823006f8848dc9d021f19b934278d44e8c73da9 -3728f389563e10ae6017c5caf3b4b340be1d7d2b7f24a8cfcc1ed1eb920cd366 -6fa12f35e45673fb12b45a6ed7e84937576e5327c82d7f27f6c0255f75ef4b02 -cd492b23ec1f346bdf8e007042a82ab730ab2805569d7b978a4b114577514548 -0d426dc4a8ad86de85b23ab5aa8a50a30bbdd8ef5e9ff8e7954a69987fb5401e -a9d039d5e05ef245e3c70a85236969f32bd1e5d29d71a2013493945e803838dc -7241a73c4c1f14548eaadcba64aebc29fd2253fa59b6b039bb2edc9e4a7c8e83 -317ec39a07b8c8297e4b08d4e6f01a53e3d690f1d1db49f19640c16441be6ae8 -d1cbdf853394cf665f741938733fbc700e8d82c4cf1d72456008a0fe55c8b677 -a4f3e197aac9b976343923dd4c5a181454319fc509d499bf14740ef1387f354d -d71c3bc5b9d4d2d9e0e7a3bc60c79c8e6d344bebeb3b2dc2c3605fdf1002f061 -d52f718b57d1f6c1406b1fdf2ce37ee45693ba72284c5652b2d88b29ad55d9bd -78032a76ae6427c19749ca1503fdfa6eda4861f0b0c72684589efe6c01d9c964 -1201b79c5ce03520510e13bc5461fa3d2897e2b7c65ebb571e2d0ce319248d4a -fcde6d70c38d25f6bbf0c09b64553c3fdadc64c293deda6e2ed8c191d7f432ac -5bcc1ac3183c92d545abbd4da7e768140b9f5a5077b08dc8eae64727eade3e5c -05e07036b08c31ba5ae366c642f816b5fa60e148795d3d4ce050f09c443d6fe0 -d44f8859d43da39643d4fb8c5e2e34f1b32142ddef07b1c02c09f4cc9509eabe -99350ccd3a9d2d6fb809016dbe0c1a29fd1d25cc83125ba7d0143e09203f9e34 -99c6d07cc78bfdb82f72c577aff1045cd2ce2e3de0300283ae5ac540d498e467 -0e3718e3dac6dcdf1c7ab2d5f75c5b6e56bc32d8ddace4ce7f9272aae188f3b7 -d6d31b380592cfc0de45eabdd87cfaa15143cce738ede40bd9a06db0b3d5f570 -be5b21b328b3ac4ff46abb190ec17e73d31af389dc8e887280f84caf7b317c27 -38593005aa586b3c4918fa95a9435e45db40bb52d2f6034686463c87280b8085 -877297a871dd11fa1d782568fe813cbdab6daba828c1c264c3db809cb9da6635 -640c3e991dc41cb1841ea1556b7560d47526bdc012a8f1dacb30f38ed0f4721b -b98b107526258d66804fb0dd4c52d827850d8f0a764a53cd81f66269a8cc114c -06482a5b2b752416707d28e88291bca02b7746161794437f61e7e3353ecc92c4 -151af9a2f0b0e0e7b8be3106fa8b455e60d1b8e7a30a45922fe00f7ac9031be3 -b9e1dcae83017ffa27f196e1b8da6cff1bc25c0d776dbf675838c24c57a3078c -d2f6dad8722aa8997078f22bfab7e8f995538174d577c28d1660e5484270e63b -90ff29111a71bcfdda204034ad6df026ba9fe61c02bc99e0553cae82fc1f84a6 -f8c744cf34a92b3fa239b23fa2aa469c5765c02abeea272fc928d24714c14ea1 -2dc6871a82973f1b57a2063379dc471f0dd0684ab5ce9ab8088512b548c0e96c -59f314ee81f9ba0a793072325d5b2a478eca04739746 +1b2b9e8f09253b61177e95ea219474796072f4b363fd772dae3a9d9385cd2163 +c2c8062ef9af240bc02404e5411b401d68ee5d983d33df8a63b6da7ed443e71a +e94a32ce1db15d759113b684bdc92cb4c920e35cb677534219abcea434fba862 +2fbc8237219af7943fb467616d86b4251b350647c43c8df74289646adecf0367 +7c838d720affd234259e947e6ac432993323e8fc0b1c7609675558ae470b19fc +ba7b5ca1eff86dfe4d9ef0356f5d57d03f0b2d0f449d6165b92c78c00162b164 +648ca123b1ffa8c2bcdf125864ccc81c7d58f19374b71dcdacc3c43450bca81c +364753c7d444062a98ce202aa990c652d540b1dd09459bd4818f7675d21cd2e1 +45a0d2670c3136a6c56fed36fa640520c0a880f954cf4bea74789d14c9b7ca0a +e91f4ece020bb0d3cf1890cb79d94675c25c7ca667199195134e70ef0db9949a +416f0a0443f1191421f2323202445f5af44871eed6956d3a3de21a34e302d41b +d7eef2a4023a66862fef89ca6386a8e47ba55e6f89db590cc810feb27b68238a +205275e7573968693cfe1f8a60b5af3fc965dc05bbac5bbd6d2ef74c4f140423 +9fb13eda8457a5b26248ca5ca4d3f896b0a93b69a9045b0adc25b43df700e90b +820f28307cc6f6ff2fa4a06a8a6deb8cba4cb0d136da07593fabc1c8ba1149d9 +1c422f461a429ece40b7c90417320167d99ffa9490f9abc3101f2359bef6c6f2 +15c5585c8733ca06a9cb793d618247757063ff41c5fce1a209ea5a138777dad8 +943b73186bc17e03fb06ba658e5b3305e39078f5de984bfe093ab3d782150e2f +8545c9601bd2a531a8196e157f8f18017c0331881abf07d6c21931fcf9b81c51 +be05d2ace462ab8899e2929f0d821eddb18e9887cb7e8e3ae0beda34ccd0428a +38c4429417cebce5ef4bebf7f64eedca8769d004d2432ded2240b732481a6da7 +458cd26e4730c4aecdc1078ee3fbaf6cd275b426bbca2d0cbd42eb7b100b1c58 +f043391fc5929fca7ccb7d2188b6cec6bbdb78079e36d67129c17aef9fa72fa7 +5357dda5167e3c0ddb4f9266f3ef69c2ce9b6191ba911c1fc740549496aa76af +b86e4fddc0f31f92595f8bc0bdd3ac613b16426d722c0d27822944899572bdd7 +96d248b1adba5ec18a7f0cab096e134c36b2fcccd0b2104e43b2123936dbf7d6 +e0706616a7676da73a30a36cfe2231fba5e1fe69952a2f0ac15145c5cff411a8 +b57db37742efd6b78096d0fc69fbcdea39cb05d034f31c23b04ee90fcb4484ab +2053e8dd69a2eaf120a6bb64bd55409ab4b6a6e92d305e40974b0df80009f4d9 +8fe9e8aceddb346f8e75941c1189aeb685f4f02d20814ad6bbe3c4364bd1c64f +9c1f111790dd74d635520606a6bc978b65ccb6e8bcfd8fdbae26ea62e36d0317 +5564995f2a07393255d7c3450303f5a26b783afa95962e9438fc3b10239fc8be +7809f48340aa9a61ded2e1de62b8ece240dbd1dc8be3819ac3e9aacb6e165923 +4a264036c6017b46af959f7e574185e66a3a161eed1f99b8496a9fcfac13492d +fe3f21bf1c0c1dd432fb523701060720730e9f51b76082ef4e72d2f2ebae7a00 +ecc0e1a922d6ded5c4f0a76eef3f6e157210a3a46a4a30114f032ba029d8207a +5946b8242fc9b939559654b5c9831eab6bc2f1a8cd2779f95698f26bdfe2e421 +cccfadd7e6684364a8ce71574f2d675239e404f754237da4cb564bc7b23d7159 +5b1dd8a0b62d6bc044fe0bd2ea98458fb2188b8ab1af6438e9693ebf939c7c9e +db285c87698d8eb206cf58d89a05e74a150ae0f0f0300dc1b3bcf1f3d6b73bd4 +70e604c23d313121a4cdcfedcc834feec5b1894e5384979966f496fea5cbf1db +7f3645abc9a5e9fe04f056648f8b5882a5399fafad915207a1434b7184b48949 +43aa2c3ae059f96905277ec06fc91c4536efe679c6fa6e71167496cc0d2f297d +d07159b01a02731e578879fb16f9ffd84768207629ba38f902230a03fc844eee +f9fb458929cc8e1c988b486e9cdc3d00a84de8bf078ba4f1c73cf88a2cbb20a4 +e19a8c02d1bd767103c08b8ce14162a9cd99d167fd5cdbf53bc39fa14cab520b +2e91ef7a2952c936c9825e30e3ed350ce9ad799b27b1091a0b2f3be2208838d3 +1bcdb3aad13a1299bd93b3f1a972c04f117f05bd9e5029b6c799eb25e3e98734 +a0ca4a814d824ee4ca5383c6eb8c6c45882289cf2a52934fb7764f3556eaebba +2823e5007f83f6a3d3a6eb0f7fbc3b91320de755745ab44513deeb65d6d81c0d +838125bc1480d494b8cdecb253a230fb950df5fd1cfdf3b8b0c56aa0168b01aa +a690593f22c25e6ea9d2de70b8bb93cccde841d2b923b4a70c7cccfdc1c400e5 +d3d71cf640a201397f09e13d27faec5d041b9d904467c4c573c6fb1820a55c1a +8d0ec1f6ad502bbda597925ab353429a5bbdf3df01066e5cb3c2bf2d19e7df4c +285766c06ea868f915e051139ecfe22ac9b8466a5da38e4e2f92c01428ac9051 +4930a9e9420c49bb8dac35d2a7e9846b0c9c8db992bd5dd95fdc0c8d5bf2e7d0 +baefc4ce8fe265e57b7b6c8c91e1797db85d90eb1888170744db916ca7e353bc +4edb9fc4a1d42013ba275d3efc76259e25860a3549d104880157db843cc75fcd +5a14800ab8743fdacc4c5ff064cbf3ba6e737833850e618ad9674d0fb01918e8 +ba87eb21aab2c494c6f6ff275d1501d78a9a97d2774ef4d5fbc8032955669b04 +69e354b9984fcf4c0b890e4e8a7796d3b7b3855815f5565b13d95b139c32ee02 +4a2057235cef0b98b1c0bb84d64921dce789c2eccf58364e832cc2bef739d807 +012512769f57dfefa384083415b668285db3f6f9e5c850205dba7c66b2da0280 +f771183b302ff529a691590321a6b06dff8593a28e83a7c66008ae45b2989da0 +0455253031ed2da983e9f1ad6fbaaf85035b4715cc1525cc8d7f1a3c0ec40f9c +9eca905a50a0f4b1f5db072918617213f7863ef202c0adf926e3be1c8307b571 +2c94daf13b6a659d0f613cb319e8782a0a2781b3a61227424ff5e554eba32b55 +de5bae43483ff916e37a129c877f10f7c8c0ec1fee0fe10b3fc813d976e6e54c +8ea8aeaa179727d3335f86662bd318260fbc314986a2f97f919ccd564e001903 +eec90c13abbf988114cd330ccd7e9fde42e218a9484b565a0cd7e9c1807ada0e +e6a7f916c5a38d64dae17faae3e84822e6c63bf32148ae3dffc010920509491b +424d27fc1970abe5ac799936aac46c4a98cf4c66b3182e73df72431e53ab1f36 +460e6c6a9b2db27e38eda8972835ba64210b45dd04a778d59c5751b8478312b4 +38012796f5a8be056c8e3a9e656bfa909f7ebfb7f32fa1ae99dc291b0f002a0f +8873351e9684adbefe40d607631559c78f5688a708160ad3803db743282353bc +20098c6212dfad417f106d92527506ca0c9a8864c1eb61997dfedbbbf1d052d9 +81ea593f2a6c4a90676aec9354a6598436d1de7e15e4979344eb976a917471cf +c85e52ecf3437ebb4b6f8e9b292b7db33be0a9ead500b9353f3f367ceff8dd77 +32b67a559e56ffa3b5311fb52689c1e296c01a362a5c33bbf54b84624f2373bd +2c25e90644683376f03da577dad1fb9a9903c5ee9f531a5f9da82aadb2098e3d +15896c3c727d60ee5de0ee1cefa7e4aa3a5336ad2f1a845d16bb2ee58c50d2e8 +055e3e11272224b23c689f2e7ca0051d10ae4d4514b89483ed8d97c2a77894a5 +640d45bc86b1f66de1fd24b08034e70a443cf1c3ee17f2e7c7e11da524781c7a +75a1f69de55aad4a309e27fc8ae9b1ce1c7d52f94fc84c59f37165e35f0f721a +9d3d5c3bcead85d8150408c1387e5a348d1f0f376b3cc2d24346280af119df86 +b62f46e2ddf46f38db4aeaa456accf3f29082f73e9c5f003d77d99eea3d5156f +2043e9b573fe34694910236ef3a1ce03ffb205406f3466e028b635f3ec5173e7 +482c796060bcb0efae62308e3624c466df5b49b1dfd3445233a03cff1f58bf86 +0a2b46225d1784e91f65ecd52504c8605aaf2a5dca560db5b8ce7eb86187e6df +677c977ab4d1fec4f124324bc896ee7d669aa295897fec0b881221434fae3a4b +1a3a1f1457fca374bca91885e74543ee919b881181642cb1f6c34ff817fa8e81 +18aa5e21c994d8aa12e1fdf5d6ff6726dd3d075dcd056f046ddd86894235d7db +fc11532518f8d8695ae74dfbb769528840e8c30572ad06d6ef7b0ed471db9418 +11ea9cd32b4ba6205b5c198bd528b06092df3f50b9714fc1275aa5105a3a7422 +823d4a30d7fd19f77bb2cc4c5df23202d6a74092a710a9a855d8059031ec6ec9 +4d4fc86b37186c46a5cd183a81fc12a743c7168837953d2b5202ade986b4b00d +86e41a88fad5ba0d91c150f4a7c396a02aef1ae9b96c0cea83b3306785ab3ba5 +39c49d9f984a08a9e8c06d282af94d87606d5601296456b6a0ef4ea8c88a1fcb +96cd1b1bc0e287adfd1b9aa1a8c8a7d4a6b14ed3b04b1f0532ed5d40238ebf71 +5bd8c8b032afdccd26a940b19a1340b1e93041b2265b8534c099d14f00b82fbb +2b55d8dc64691c3e5a6dd7c0cdc1212d0c80be2f454a7d8613d0cf64ac5bcc7c +64d4166bfda12bc262de9cdfc614d7dc1bc569109bb84bf469071963e5a576db +b19f3e748799d49c30612c1d7fa918d72051db6cfba44520b5b5689c87541560 +292dd6bf1f40f6a5af97c3ff71b1fb57cb36234be973890a1a610551a724abb6 +b01bb5bd1fc5191c9f99b389b6445a99de978b0d81e4baa92e8b121a1e1b32b1 +601a34dbe6cd348e56f59a92af56caa782b3b416958a6f1bb73771f35000fb9e +a55a132f9b151bea59cafa3a1cc72f7cd60952852c53379530e0a6bd4e9545bd +f78da021349902332707106bbb5d307960ea2bd811adf35b869bb210e44a5717 +8893af229268d805262725a0904bcb5ea7c17a39552a1f26283f54ae45449943 +5270b17b9afe2e0c0729e5f10461a8ddb85efc35dc8a32bcfebfdb16a0642e5c +c69e5a25a661cfbd1f3a9386aa2433b68a356f36404f96d97fff817b42a58a62 +a5fcb5653373df412068876f541169bf642bce8458297fb6a6e936d80af2004c +e9a248e1c92fb63b3e53caadd749924c390fd9f542496cf2347a3a429cc25917 +c31fc437291fa9856a7d3b2b6a5644d82e23a14d0281ed4d8f9dd687e06f23a0 +d0e8a3dab5fe6ded172ebbcac68218092f4480c7ceabc55b059877d7e82d2846 +b4f9e82aabc56f397be2c6b67040dc71a9d1f39b1a60c33288bbae4e41457830 +f8d8c96c8dce7c01bc6efd70e021a0c2d160a61b906a3ea551b7e3fe8c1f9952 +7e9583c6b6010e0887560f1c3e19e0be82efe91f0114e726c888f580d6b514cb +a0933ccde04de0872dd0e07b1a7cede67bf9f4e73400d118a6d600e13debe6f2 +aa1d895dcc127c76ff82e579a06d8a3a323458808bad060afc953c2158d476d0 +fe0725dee6886bde038e2726886d255dec9052e9ba886a318c75b8c7a218edc5 +78783ab8dd90b738b16cfb47ef8610f428a4315c703763d6b3dda570cd0a89af +4e6c215ea5395b13a5c1f0883faa2eb2d6de918ec5fef99c21758e4b6bf72861 +b684a28787b63d3ae7f1096b1c56e4862e7f3650884d0803db03362c587e2ed7 +bf5c7f2847bebe35327f1f7fb76f3cf7e9fec9a5c057acedf6245c724a8e754b +d44e028181b75ad590b3989a7f340fd59c3b75cc4a8e28b155b5da0fbf3cc358 +375edb0992206514347924c69ab28e30c707f24199767937bd7990bc70bd5849 +5c335a752c06bdd9f0520c6d8b2f5fffce931b601151b37f1be9885e41864e31 +1ea0f33e17fb4b844425ee7de31d839ad3a8609bfc9e393079b9a7891e17b48f +2e5fed17943313afccc55826cc0144c2e7ac9784261bb40d51bbd4467103f432 +865cd4b821dd5be8fc760171b49b70141ce2042376e879013edf8180d185d988 +591f9084536cbf97816291ee77255315987422c2c2489d209d78e0a2fd3fa71c +28edfc1577db5c080e7881848222220a63605f00205c205b35d0a017013ca099 +deb71a9ffd511549c61f9ee36a63ee00b0610d1b290e073b8a067dd91bf52f9c +ab53a258ccd29d9220a659e44717f84062d39dd554294996c46e69608ca111e1 +088494c6c3c0b75cf06c2b39a08172700b35d1efd0526d78f2ca5388056b02d8 +28962b456a44b1348bc4c199c2425217cee4297873ba2018259ad02cdb518b24 +023f4ffc5fd7c2b7b022d8f61aecd1e97bf78c7d0448611c0af788af2447d5a7 +b66b496dfde8522f9dc0ff8513baf8b19b51256da57159b87df032545708fad8 +0b15a0764cb951263a5008d1a61a1b69f171a5d7449f1c1d2cba92e9ae340e13 +ee455edc278caf37e5733a34a5c1b2206833d4ec3c41db8e8c760624c6031550 +7124f71f9d18399c3df46c5023a753a08ecc991b61acb6ad781cd9c258af17ae +33a2f8c5a86b5dae8ae1061893bdbca4e76473fb073cc9c5c3389e525553a879 +16c23e3fb51d65f3cc3bf3e87f97a02eedfbb928cd37a770e7e7b5413cbfb0c1 +3281f30eac6290a85ffe8ebf68a7fe77b4a68982d010a2284051861a35230401 +234b3278bd810686b1ee0c63104adfeaeb7ec79e0a4fae757018fc05fb12db3d +81e0400f7760b46fa0ac5f9e52583f2af265843cbb2ec1d1392ee68c7410c9f5 +87351a0f3247036a01080242732f5453b54a88de2d7515b5b570d94bd2b97f2a +d3894658627178dc90029c8e7131855b422c912c9fb6141439042b1df9f3739f +063d8d054258cb1c9cc893aed8097aa06fbb7e923b3756409c61b7cff54c2c87 +51cc2f11c2b7bc0be6868584f64bbbc22a1e0ed325b6c2064cc0ef2fa8acfde8 +6fa40b544ab6d2c360b6786c29b69e80d20566e1e25cbb075f9a687b428f4ed2 +10c028936c8f5e7308d2a3984290d96e5c8df5c959a563b4be5b7ce15c24d5d2 +fd6dfeee85e0e9595f52ef13aa08f52db73e858a3932e9e913f5ba674289523d +0eaaefd670f3ba4fb5a0295816fcfc042f7141c64ce577b103558455dbd0852b +730b2acb37b3115ca4ff017602f9428879e96a621a760e7961c006801c5908c5 +f291981da07820a11aaafc3f4ae613c7cb4424b0e1b797094ddd88829d5d4eff +d8613b50b2df38eef34ad0b05a9f13dac5b3c31d44c06bcc58d737f7d239ebe3 +eee1a4f981b35641482b536ee869389888c2eb28b56a5d0864a7f451f7d362e3 +d56ef1ec01fc6eb85c40c78d791b16aedf904c7d75890bf99bfef9783fdff55d +ee19cdf9e0217133b8af29fd87ad09382b8f64a6690f4ece0ff8116d44bac576 +be9a602084c63bd4dbf56354dfe69300cfcbbb99ae3c8226d02b1bef022851fd +896d83549c594e8fa709d23465207626632319b253dbb32a74155939d9fa0631 +8aaeaf9c26c04a55e1fe935fc5d21f1d798107a625fc25cb90d2ca72c31b3eb2 +c2aef7615eeb8c7f0e7f767aa672ffc236271f98c01bf41acd72da9d108792e4 +66ed133eced633ba0fe7503aaf68ebb226ed6d0e18561eb03c9b9763680f9295 +7709b653d3940ddc7703da6c3fcd893ace04627cc6bd92b65b80cfba4d0a50c6 +d48c5239a76bdaa4319fa9f0382e5ff6bb51c5a390678ef4bcb6a56a13828f32 +fa51ba7bd7d6a11405b0873d4e96b93fc693f21bada72f9f257d89630711cca0 +c3a78e2a0e5735617e77a7a77881b37d77877df4eff9da9d465239f1f2dfb5dc +9351a5dd8216e98c15cf443250b85be6a463526d8aaed42fabc1cdc095ef9e42 +8f956a2abed2cb7fa127f49bd2b5accf7ed80cef4fe96fea42c0ed4991bbb734 +596379a991607836c6ea74bbc359ecf2eb52d015910b847534a519cfc32d5216 +9510940a9ded08ed2a83fe52ee1275b05d19666994836add094ad38cc0a3e081 +bed96e0cec2d8e17d51bbe3a63a34884da909733ab092c9ce8d8e411ca3b2831 +a022e5a3fd1abccb902647e484833b8181d1b9edcb5448098e13b5ad289c9aa5 +8e4726f0c2df0ceb089401871c26c7ddfc5d5cbeeae249871ac5604056b69e96 +3c1bf9b8ce006b701c9523b5b9b145be6f6c7b9e513973df94cc2d37694850ec +e54c80d2ce79309ce51515d2ba0d44855014654d1a999cad1a5e9dd53a34e44c +9cb32ea91176d5c3294e3064016e8554b9b6c6d2e6c03b4e655bf2a7957d95ff +01cae1dc020e577abe5775f656caf198f1073b7bfe06ea127ba3b1edf4784917 +51d41bea93204e6ad3aada6f2415a8bcd5c987b6629874253852ca417bf6a259 +27b0e7f34e0ed0f9dfbe1be2c64d805c2edf0bd62c77be4224613f2e788c56eb +0dccd0a467bb30d529610944338ea0b832d3ecedd85ad4da22ea2b47e799a1a1 +1cd56274f7dcd9a66a32d8509f3d0eb4c4a160a723a9e71f504da5549eab101c +70c73efbf1ee0805c0f8e394f94f3e6623eb2fb5896563404fe4a7f0d47e802f +698295ca19ad813ae552e8dce8d6f73a7e676308a07f230edb99902132ca5b6e +0e95558764ff3f6f854cc29b338a5e1bc14c9468b5528f5b5dc8bcce69bcd0b8 +e295f3ff96dff56779de49a1157c7d1fe777e3a94cf95e3c707d6c1fb41b279e +9abf7b4077fe611a1669c689c1d9a81c933e8075af7b5b440c24318b26a1206e +92266a64a0577abd20659d83fbc433621c7a01f74c6863d43b02651ea96fd0a1 +e1a553a05978a4fbff7d591254a5e3a2642c0eec9b4a0988e4aae449964323b7 +9bade117a3ce68969f62944d027dd0bf7ff0f73b0283c8843e9a3001bd096baa +f61833401353462890af71b05b84b2e8a8a3bce954febceeaf5c10ec704a68ff +24364e70e1749dbc2b1299887309e014f82b805c37aecf05fd413220403e48c3 +3cb49d0c265ec2511211833f8c475d7bdc3959c3378597773f02b5d41fbded8f +eb58a06037a79c3424e56d48a1cf82672026b3122e379a0012322a325bef16b1 +f95958c7b22cce273e8aaa1e8e40978abf5626000a2563577e164b89e24e4d06 +483f503454a37fac420c7945ad53a6c102f1713208c99ab6ccb0bb3e50a70b6a +38b38bce6444a7951cd669008776a1720790b0b6722be634f90120f42e3b5cdf +9007d9b8fcfeb1c2042367c5f7445e69bbc19cbea5b305b1bca2f6398211ca07 +96d5bd57d23639b1a7d7a5f50b609dff3c7622e922714dffc7dbd6b820460c67 +e8ea1c017e57fd172fa3cac1678df44f20e718542342847e33698d382ec37f60 +21b7d901ca384beec87374854e4a1372610ef8fe5c69a141b860b5a9c51af0be +8e33cd57dc6f1d2fe672e72fd0f370cef74a02fef6a0e6303b7445efa72758ff +b98b3549de42d525c166c92b652ef1e71c92b0ed3c1ba2418dd13a2d301ea894 +7b3d54d469676944a58f147851fcd8500747899ec3bd885f25e1631a3dedd10b +4eeb87c74ac62e316d2ebd3aa0ce027e91b39450ea3e30cb01baafab02ed0567 +cd83c482d6e92d7835fe387cd6c050d8f4f2f64b95fc44e1101d89e112b971e6 +61d975a98183617bc942f425b837e4e868136b17ecde0e1380ce8a52b95881da +2bf547a37f38c603e43ae53f32b5a347e4b43c0bb86d8aaf447bb5f4c983616e +be1a48c7dc636242f20e876baef484506e2888f0913d8b76b1086b60409a2a03 +e82ac9970d6c120a6621bd68250d88e95c01abb861af559132e6d9b8f5abbb66 +4152d65779019e678cc86909e31bee3d13a16d764998d94ae5df24f02fc8153d +72b41953605ca86a99bc3dd05ca620e7a28d51beddff28596ec8eb878c09c041 +74baef8d2fc52b3b0c55e95b7482dde018c706a3fb83b945d3df90cffeb1380b +09c4576040668f537083afc50a1e26d28c4d58bad52b17964871210ecb2f148c +daa07db5d3780ecd1635cc5d5dc23867a13e152872c78e20b95f11a4afb8508e +813f4c580f80546b2d5dcda546a6fa4b28a906511be9ae09f3adf926fa237825 +ac9f250d275294c5f21466af681e4e61ea6915d623c7d48837d0bbfd7f893a2c +d347cd7514ace7badbbff683aa9c6eef46d1c830afac64a9f64b95a6fba4bc48 +a33135b70cf12c2eb19c2af6a45b9be09619e4b89f47ef4b9d3d234466822c1f +3ce559a85fc52ac8aa947f981fb5fe7605a373f5484d4929932590eb79a504e5 +ec35c263a30ab3e50ca900c2488baf5f1c1c23cd42d6401bfd7b09172be16f1a +df93f41ab0b4465a4f1e2ab556078dbe76729d69434690fec8f59894a77d3b8b +bbd3a87346b6706fb127da2f6b458208befdd75d68207bc88ca1f2e36b65d170 +922071549c382790beee82ba0dfde07d7d5f58ebd02b19feeaeb6aaad59792cf +461d467665cb3a0cda48058fb5181273c8632075e2f11f8de7181373a9b73901 +a816cfde3e2029a04b1139eb306132f989f4a2e85cbebfdc52bda2e88bd8d1df +3f331602fe0fc1802abcb35b8e6dbe5bff9740a4af24077a725d17660fee662b +209db93c54baffeffbce92a9e2e696d5f56f5d7c81b29cd00a59ccaa389183b0 +ae2507f0ec1a9e224097be40e0db4c8099a96a858425c6a680365704f39a05cd +4887bf94f49e4f8efacdab96877a18272900237356ce576042dcb16e5851e1b9 +4fa0ef754cc9d84e91486d771871151a5983f158b7e05cecad73ba064c258397 +cd00cd6b8cecbb898c5d4609531d387ebf15a5c38b80efe629bedc9314736e90 +d4117c763f18dda7974d519ef1bef9824934159d0fe29edaea2173c69c56967e +ff9c37eea1e8b38eaed338699c6a3763c6353dfb2584f6da9923ab74b18cbe05 +278a5ed2936b193c75c986e8bfdcc63904a25ecb4a04e998ef8789e9c3ec618f +1fefe74fe5a23d368b563579e318bbe956f29d191748ee26bc883bec714e1f8c +88c98dc012b95385e894919f1de5afc62c9c513014d6105baf24ecaf88275909 +4d13079cccc3f103d6751b4f79b785577686abc760a6c56bf34db0f2ac3d0b82 +ee63f9e750c7790d7a3a1626d66e70d26617459a8103e08b6f14af71c017d3c4 +e5b4450986908ec345af9bfc4d650cf35f337026ae940513a9b3de95df3e16c0 +588a59a7f2f1d5e2a418410b5e2fcb4692998921834fa44f30f2117228005347 +9a3a82341434ea71f82d87e1bbcaed725ede9f6001ae4c8651da9afa36b3e6ef +07a8b311afe1bda98e3143c8e2417fc188bfd48627d9b6aae94f510054dab99c +12fa0d5d73069f48c86391d27e37265c91ab1c06ce4d4bf0af63db65e16e783f +7dc649a88967284c9d9fe861add619a3ffde0a31a5719bb456d1ab8010ccc8ec +89615ae875db7a321398ff923c088a6ab51ffe2fd21d3541474d79f07e536709 +46d1a8c65e8dd6ba6f19410b76ee7b5468462b9aadd9f8ddb68c32b08b0df0c4 +f3b909fe714f453bb1ebe914752c5eb5f68377a82e5d5b90abc19402bd589b43 +05f905efc12878733902c54391c267fd81aecb8cd692aaaac3218d34a4c1612a +5aa9844d171e6ebf94f4d8900236e8e27c5bd7460fa1e195c1077da5918afdc3 +90abc6db247885a42158c3cd36ee89d82cbf2471c6daf51120ba3f6937d537e9 +370af7ce73f3b50b742ade8264df9288120dd74094a064909c00764e9347d2f9 +a3f92bb53d8263053a3082809e04e9bc7c9f3b8a7c97c5cc1f9f886115676a18 +cc04c656aa33535e5893b8db3ba5d627f8810048b2a7a28e6d1374afd6af6980 +ace96ee05d890339773f6dbdc92f2f840b50770213bf6188dcdd1bad8d527e71 +9692ab1dfc47e7673c175a1b9841d56e2e0b30e8685b01a68ce561bfc6463a6a +d34557d05276f7befbc1fec7bd56a18bf0292cd25eae57450b3b590e60181258 +4b35e2004e7b1e27f3b26d7108a03c94dea662b7342e38f8300adbd92261809e +bee8ec971a7f2f59487c89357580f9aa8145a1825573f037a0ade5b98be24a86 +530435bcb82e17054f67fa873946c732c8840b9eaa9130bbd360ef27fe72ecfb +b421627d2d52578373ca7ef9fc6f850f4b7f22e6501378de0a9dd56f5f5815f2 +7ea81d8ee3a4f7b98e59ea1cb3159f5816fa703b18f03c5b0aafbbdcc979df41 +7258af2ed57f7da62871c0efdab55fafcbda5fbef92ce65aa0ff37b92ce6c953 +a9d92a8c6e02b8a1f9a9f0c66461c5a62097e12e9f656c87ae283e6f3b63ed10 +a6a723316b9beb28b62a55d372b9a22bdc669b51533c5690e593f2a409619b2a +d73655a40a33e83c65e66f18a40c8e77b048674fad760b9a7d86621181d498b5 +59707d36440af3e015851ce43cfad5d1d96e9274ad714ef46cac1a02974245a8 +d25d894caa256c320af31f954bf574dd95bf32e5841333063d32709b93b009fe +e680d5b2bb5f95275d118a085e98506d0272fd1b8220a2343979bb1467f9006a +1f17b2ae2941413683c3cbbaa1c0a3aa55193d46a2573f2cbb8b7adc7e74d0d0 +135dfa18405bfaeda37f3d4787a965192ca64e4462a0c701de5c361088b3319e +7b5d19a14337068661abc7c36002ff4dbe90e7b655b8e06bd70e283cad1c5d88 +de63628c638083b303ee6b038836893707f6e1121ef56292a75bd9301d987ae1 +ada2acdf61ef74f2b3dc4f87c6374254f865f6e8f6c0933c54265e9a5cc7ef62 +432baad5fa08dd485c3b1d0e75ffd5180e99df967b85861d9710ff294e93cfc3 +7ba6c006164690c10339aae9c1113cb48687672e8a2dd88ea9af6d0cae13ac05 +9b61095b999c87bc3c80748fe6722bb76818b2339223dc051a4938f435b92629 +4395dc3d2b9b3a0e370363535d960735fca855ffcba0aefe767732f7991c5977 +46fb683b9a0c11fcd6a3eb370bb56d6611e7c20dfa1d9fdb3b90ef31bf0a6aaa +d8bee6d7ceb116373e74f072d2c61b646f0da308955829be7578d1909b03c4d9 +307709be75ab3d72d0864af89bb713da0938f038ffb3459b793d06bb37d6efd5 +5d4e755f3403c32c28201fa5f979f51f3a9d4c521480e58ccf06cc60a056a5b1 +c48f27872ef36da126d580ec0520ee9d252cd27c207b6a12b27b1861ae0debbc +21e549144604b277ac8e7b4caaf5f7220d67fa9a985001488c128e1a4c9ebaa9 +de54a13cd4baedcd50653b73a6514ac47bb5411d8094854212c9219caa4e4c7c +447324ab35edc9ceeeef505fb71a2348c3be2082fba20b8ab572bf9276e84e2b +0b328828eb0c636750dc104e741c5df9caf3808a061484a23dd0aafcf5bfd1a7 +319c50d09cb55d73c87d3ab59e74e29de58723ea32cb96a0b497e2e530b54b9a +355a27d988ef4387d8260863e8beecbcc27e4b051961aeffcb8475d7da9bdec6 +42d6a55f06ae9af2450545811fc6486c6be309955c53121db95ac255263e93ef +3adb9e07e56b1133c491b550a511204ed55c8dd911e2fc0669c90fd904267f0e +79d56ddeb72895002a7f795349da2137b6eedcc300c1206dbdfdc3a52f71c86b +8141b63c3d33957c66a9e074bfa703ba2344d802028d787878f9fea87fa9ccdf +f4ed49f4daa6e6839fd64c91e60f99b8e10652bffdac46169c413a36e8105d8d +9343496c1a9b5bc33cb5e573166d4097fb4f3f5517b38f9298de2ac6d51121e2 +0eb9f07ecaf4d70c56a5280948c67e506e47fe9d3465c7cd156e5768b70f694c +57c11c80e7a4d1417c25690197d058d02216a81d7104ef27003dadb3ed10c742 +4b03f54aeba13d17f681fee3a8797754348b134d89572a2083225178a9db4466 +ababce914cf2777d3ae7effca5f4973eb2945672c0218c420173d8d2fdb8d60a +a1b40773a74f904955e7991bc973d12eb5bffc4dd0032b1a1397cb5ba3b431cf +92b76b1f7bf1f9eec8389e525553a8791692a9a9eb495822684df34bc5209953 +1b38bc4875beb62a391a8e0fdef5b0ad35190c44c782e374e3ca17b9f5e2f5b7 +c8566acd0df90ef22b50100f501a80c17a32ef4eb28da320c20ff407fa116404 +aef81d37037013406eb51aa024605e01257fd78c625bd120d4bbbed7bfd4f95f +a3c3088a0fb237d44fdf4aa0bff28254063416918e276e7b68c545def20f896e +509cdc2c31b65668200637bbfa587b547b77f81bad98ff0b70805d9c6fd17abd +f107e1d39d98d9ba1a7bcdf98ed607a3770508ada6bc25fcb63f5bb642a4e028 +bed525fcd1a9dbf1e1520c5164a53c0ddb1b3974366b8feaaf766f02a4085f57 +948854365bad4f6cf18fc871256f9ba3c60a79f3d08617f6a483fb6b50ef2dd5 +0755b2b824dad8935247fcff268b7cd152cab7e7a876b381491589f3d4c65c50 +3353d07c94786db7346cb89cf5350b585cf890fde7a891e7646e5fb912b71db0 +10e73de1100848dd1bd100d0daf43c4bef2b43440513be6281ea0359ae0be4ff +a861b07d06a311b97028daf2fcfb14eb8e8f713bca854befa5a46172dbc0dbd4 +448a8c20ce02a71d33457d4c52704733b90b005b03fe89fa90b73e747f273118 +4bc20d38fca2e51eb0d5bd5454a23e0fa6616a330d61e5a487aa516daa6ca1d7 +b8cfc260bedbfcdfd3d3d0c115359c73a67c1921df252899298bc9015a6c96dd +e70e6dee29597cc7c111a565a6877ec4efe425783478bd79ae97b5d1bac5d10f +5cf77c6c026966155264c7ff1dd30028f21bfe0b7948edb1710f30ee09747272 +81aa09b166177f5e507ce6a09a6368505a1d7b58d5aa2d63dac1b073442be702 +9b2ba6a5a6073bb8aa8c6f741e1b135a73675ef22ea810435f4b1a899d180e2e +be37106d4db6ac2c01d2d962117c4b6a62b1eafdd923d89cc830c00f4cacf98a +3e02d0863389d2dd73db37d8af50cee306da798989047e47c165d47926ec533d +5e1f5fd0d039ff2fb3e01c61509b3ddc62754cc30b7946c4a705d56f16730b99 +8a40275da604170fe8da1f8d8c5e4a393c701aa708f916fb66939adf2546097f +2ad583fd795ad2fd059e9450c6df7be3a22f36c359ddcd8de44e1106b1edeed8 +65e317c06382f6473e3d15fd731ee92b39d3a3dc42c9107ca046febf2ed214f8 +014ea9efdd078b94dfe6a53e5357dcb99a937583a89b90105349829575a5f474 +ce7519336dedef19083bf6d9312f19c78f09085db567895a10edb5a6cfbf3532 +5cec8e3db206815af7bd78c8dcde6a910eb9232eea4b9e68684be8083f335761 +916fc1f64c649fefda1b3fd499e851cdfa7ad22acd535a04986f35b62c2adf2e +74519f043c7c1864c6b3a9d5126fd87c105f123711b560531f46628f872b085d +ad00961bf770b386b416ca2c5a738ba54f7a7a2e234dd97b2918d007c135aabe +9ba541eaa0d19c216b5a6f245cd33a1666e26bcd5ece41bbd5bfb3aea9511bd7 +da27388e8b62f49f0b4db0b190c5dbb7bfdb1fec5a786bf43783cbecf09d8056 +15ce4179710883f8fe7bf4fde22e8a7b46273172e9a4751b4fdf6ec099e8d685 +32a4c9c4708902285df499de4a6b0e143d72c13b747461bda19f5e3a34f1dc8a +96dd2194b6083c75715f9f5261947ef0eb21c496effe37f407f45c5f66aadb99 +cf42aea5fab6694a64cd89daecab44bcc134280a3614f02c432b98054ff8be39 +7cb464de7b1ee896f798a90377bdd07afbc9394ba931c3fe490d11fc60506a3e +476d86bff5d3d850683942744d651355cb081b39d8d2147409a4bbf3ec699da2 +d79303ca40261fa3b6ab5b17ff331eb3d9f01896590905a2c7841d1f4b1f85a0 +b4afeb0183a61e21958ab3f541d321ac6bc81dafc5dc633cf1f4231b0e4dbc9e +bd3c 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -777,11 +805,11 @@ f8c744cf34a92b3fa239b23fa2aa469c5765c02abeea272fc928d24714c14ea1 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource -/F122_0 /DTUUHP+NimbusSanL-Bold 1 1 -[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash - /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron - /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity - /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle +/F116_0 /PYRIYB+NimbusSanL-Bold 1 1 +[ /.notdef/.notdef/fi/fl/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven @@ -794,24 +822,24 @@ cleartomark /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef - /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl - /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal - /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash - /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis - /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section - /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron - /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered - /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown - /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla - /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis - /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply - /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls - /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla - /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis - /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide - /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/bullet/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section + /currency/copyright/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl + /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet + /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown + /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent + /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron + /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef + /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef + /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef + /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont -%%BeginResource: font VXAMRV+NimbusRomNo9L-Regu +%%BeginResource: font XDVKOU+NimbusRomNo9L-Regu %!PS-AdobeFont-1.0: NimbusRomNo9L-Regu 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development @@ -834,7 +862,7 @@ pdfMakeFont /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def -/FontName /VXAMRV+NimbusRomNo9L-Regu def +/FontName /XDVKOU+NimbusRomNo9L-Regu def /PaintType 0 def /WMode 0 def /FontBBox {-168 -281 1000 924} readonly def @@ -848,619 +876,620 @@ d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf 045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 -1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b8e152a40e590419249f2e4 -c36159f8e54b532468e36965a38646781ab0b7f6a3e851fd10caa49adfc1e546 -2fd2ec6150dc6e19523050f6148348a561ad8d2e2721eff8a570cb33460a745b -926c889304c09753c2d78fb0ca95dc6de5b8c524752c83601e7e9f73df660674 -f05ad83a166da9be89f22feabd4b2665960f6fb5bc32928e1230c212e5d69cee -0b3311a1738a11747ae263106916d8e95f25b25b4bc6afb03b79abb95dda518b -41a49458111d2a1433c043627ef9460d324ffe22935f4f6da88b8b91ae95b34e -08408a34ec8eac3f65b6ae3e3e2524867ee9d29068f81e4372f4470beeb4d6be -ee4df956becc0cb77f8490117b22b2fb75c938ed0a5e208d88bc38b2ab8b9cfb -f1d53084b6f43df336481eca0aa2d5317bc83fc0e1d4db01d0b7707eef217e94 -a7f985102ded27d8e8b009f7ef6db91b91e78bfae7bd688e10b3dc9ac77cdee8 -47aa4dc8ec78241e593d26ec7a60696151a2ae5325d736e99e01bdcbde69579f -92eeec224b6757eedc64a75455bb665df42a0e4ce7b99bf3e7d66f8ffc8c13f9 -d7a1ff7a9d5ff7ac43396779f11c9b008c33a2043d48b61b88b03104b1425f09 -675b559ca4302c001ee80d2b739cc0fd1023bf4f1ff9c01e892e59cca7c26011 -b8e0b6d29cc29fc72792fda5e7d5d88ef98f9dba960c96534c399c54865eab86 -0fa2e0d6c7c44b553eac1574d55e7970744d4792fffbdce6fb4365bdbc2965bb -2e9edad9e0ebf0b620db415ad98297f5ae83d9c710436657e74d26e83957c745 -89834337035a7501803947f6880b70e56a3a404c62d57b849d28804cbe0f5884 -435a0e12dcc9ba414abb732bfbae237001f557dea5e972ba0838a3c7c9eb75aa -4a050da0a529bdffbf9011c360564fd17a02c18860af6b86efd4e2c125686c9a -5e114e95c71fc89a5de9c589bfe5ac0480cff716345265d2435edae67cfc4801 -5bc08e7a48d683acdb91e05f469c0c8919d73a5d07a1ccb173e30e76680acb09 -02a40a3e11916198bd69f1a26e88330f50692d0d5917e99e7a01b327413e24aa -e98ea484e45897e6ae4d6997b6e8bbf61c9406e916d56985cb2bd297e8acfc6e -cf2d2281ad84696b7c6cb584bd85cc20ba14add3bc3e25db91124c0acf22e902 -3cfbf04cc40de331991e9075d22ab5ee0e849b340050e6c417c664a782d05549 -db2ef572f193b1c12b4635c2b358747046de5858ec32b3b2e79d42750657977f -acdd2ee5a7c9320d907438dba63aa05ed410fc7000f53549091be71be45da4ab -a315f95b724a60f17c70833e889cfe7ea206a7abc4393cb6ef47be3700ba5638 -6831391809ef8384aea8c22735e8062a9f9101add125a321fb65399cbcd9c9e6 -0f46fbf271b2b1ec80832cc054bab5ca80d4561da0a380d56d5cb3d90ae89a19 -48cd824eb1e7ac6127a6dba3e8ea40f00add89749d77ec0eebe26fd6ea5d8cce -f7239681b3d94898236ae92ff3912e0afe84b6c7e08134c158b640b4aecab5f2 -a90028e67d33df31b461a2846f83d90979bb22618e2a17c5d159fb59d5177e12 -edf1320f596e7a4c379329adb367f92bf2869a9a97398e0c20f5f017ca9db7ba -b3bab72b87a7b6bf4febd03132f9075c271f2054078396df8403dc91461325f6 -12cf1421f3099ccd799c2c099492c4f071336d985c0c360b2f5a5877fd00b6f9 -2e5911dddfb31d17a60124ee8da6cbda94196d7ed42804610e4f730daf2f2d5a -b767c320c62543e26534314facae006ba2064623902c8ac479eeebb609e8c3e4 -1516ce412cb410bd026231e22a9cd0f664d769e4e45cbb75b7341f06d8e37285 -beaa9ab71aabe3cbfe5a348681aa246047ca29ca6b442feade254c7582d32d3c -71b5e645c82e92f057eb5f859bee23daa95c575edaaf9896d6c10980a09db34e -084c8a754e31b618c6991baa856cb86877044e10c2f189b284e3195a2db6b910 -2574e2461d2fae65b7321c0093a2a34996c0b77123503e9edc623dd02c44fb76 -3c550840bdf969582d226510ebf89944e59684eb2e2c463e69702266fbcf8d1d -4c0be400495e227b9cb21c8086f328782ca7294dcf3ecdc1a62714143a4c1b98 -e5de1dd554fba60571188a58f0354a6b9ef580689b78a0c8515ca05a35832616 -7e0a90f68f3c306ab60aab20872fb167673f41e8e87ff0111f579cbd0da68b56 -3e35d2ebf9f28b104082e36187373efc7a33f62d3fe4a390b63a76e9b2531871 -6bd59861f51b561dcc115192a6fc22d15a5af03ba09cdfa66b660cf4288e9d79 -26e797256659b0ff64bb5d900990c3cb588e1e18810bcb009a91e5f4f8d9db1a -f2a063bdabd9c3332f4bdb701bb94b4fd24570b440ae74b8d924e48e7c2defb0 -53a19e5b4df39abf4f6fc6160b5fcca00608422a3091cd03e726b1ea1d203b3f -c44173460b490498eda3121881ebd21cb5b571d21a6228cc0a1b035ebe97f26b -0b58179bd22ac950ec3a98458051a874297cd6bfe731c5b413819503111f1f6e -ebfb5628c955f5fcaed76f2402ce351f77e471d1c9821dad627ff25131590577 -5ff9335dd28d85a11bf155765632b34a3aa1df9c01134bd8fe927e0064319951 -e2c1d374c9acfc30932712a5c3e0fe3c7e355e3356e9135a143f1b4e2738e208 -8f44633dd9300bafc770625a64b2bd20d4f672701310e5d1d5b2dd502802539a -65344601924c473b7618f9b87bf6eb49474fe62891097b9b381dfc9dd22f6ceb -340efd950b74e614a2908eea7b0d395e15943d0a9072e2c0e6c91d9141c84281 -6a59f02111333723db78c2c287675d73152ee3c63397f5ea6203c707568137e0 -12438b86ead16d71a0a56d00e6ace9d80aff646b05d829dcf08dce2fed1a17d3 -83a7c9e7c2a5caeb38bda802e6696bab17a5d1e5d6c51b6371c642d5588a2945 -1f3c8b0cd56806531579f7c0d10a9fbe254ea910522d955c86ddd693b8660bbd -17b2b23fea57af15b1720e42c6de537074c071c50c114ac54c45ba2fee00d13a -2573bb9243648a1be2569cf68ff78e4cacacdb34dad918a30005c31f17781633 -6b74af8b9931bec0c1892780020c1a92470e3ad7f1bb6ef26c835f13a9c56ded -51df4a7847c993b88b9fda9a8955d8bdbf6ba773d06645e292ce26d9df4bbd4f -3d20f52161853827837c837f33425990818b958adcc3ae79b5791ff04daa32fe -54050aa9d34606f16c7763de770cc33c9acb60e5354d5a27a687ca6e0fd74a4b -5cffeadf6ad0ba87b906c09201ff65ce6c3f620bbfaaccbe54da884b87e906b5 -f5285d3841ecf78f0a1ee4a80724da3a4fd49ffbaa66be3402a2480a6f8fc164 -343a369e2b8947fd5f58a4697234c742685421ce3d57398c5ed6f6b049fdf39f -6870236751d9ef2210e680b4d8a6daab758bd7fa7da9680604e5bf85d1826611 -2ca08e8922a1d46ac853f4bdca37f7fe80d2d27854012e4a8f70bd854ea4c189 -ea6939096b56168aeb971aaafe1bca667137a76761cba2fbffceafe3e98d5590 -db3dbc44b3f9d4ef0419cae23086898bb25a222eea19c1a760389672933ea7c2 -8b31025619bd108b79d51d54e23f401f42165f0d513bb2409ce66ba3e83fc000 -4372873eb8b4405a8f5bd88cc2f21d2d60fa4024707869c5fd40d94028ed13b2 -5762cc7924d100d3ce0dd32cfca124ec1fce4cce8c137070a18f05cd73809449 -bcdeb0ac24dcf63679d46aa8b3a4a5d0dbfa9342716619cd3683dfa7a9d6683e -5a7a03ddb47833fdff8935f2f004f58ede6447adce4fda1b734c75c52d16c406 -9428cdf68855946014584f7fe49b03f896e0054cffff5da4728bf4ce1d892052 -701b48b81f58f5ea344e8ebfe13baa70cb43ce4a979d8225ed78417648672e61 -07eb7b31f81cf52b4136288200e640654e83534eadf05301faf2f3a859772c3a -545fc20429119ff00c259aa582af4e3cde1c99769f4e433d9b178edcecf142ad -ffaa6da004a90f53e70048aa8d15a26bfcf7b02ed70bc262d165e99f87ca7424 -0eb98f3d7fc0d4926ae43c8d322bb9eca24a4c45f7dbb0feaa9a900e3521d6b3 -87b52a30acb29c914b06793f19a1efbe3be7d0b8e20cad99d292c315b12376d5 -655121189a833132715762ca7118685814f71aaa08b89e466c7468bca01bd98b -63ec7cc3ac41dd06c5bbda86227afcc1f7796b5f878946c135bfa75a98db1b57 -0f38c49770ae23986ffaedbf6644df58a252c29ac821f4584b96b5ddafa9b3a1 -aa0ef6d17fc1e75916753bc8c799497e1279ec783ea86df307cd54b58c2b3ebb -fd722006d127834b089670e5f1e7ba8bc4a0f6181bb4efbb8f99e4475181449f -2fcb255da4233f7ab097ef0108ba3fc12cda0618870eacb9fe4195dfab182242 -bae0956d09e388d10da2f940186e25c9926886e9806c70105dc75259fb1e5da2 -675e4e114f84862e6b822a10a9d364b1cd13dca3d385b83499c715ecd7598766 -b215910f002358d592fc36d0bd482ee9cc338378ea1566839526a5783f250818 -078b97d73b1d62a1aad3d5a9753bfef23f7b3e6d5bd318c463aa04490b9063a0 -e83e3e68109b182720d2b1c13b498f8f495661c0f4e6455b96a6a92ff806f1cb -3b1c6eac82d9a687b83c572c42df22beae31d1239719186f14ef637fe4e7c7b1 -fe8f4f1bd8367d76d467be95c394a818198d922bcaeeee371fe17e396b27cec5 -f0554778587fc7d78acdf317a8efdfc82c2f57b6411b3ab68f96e3e7cd321a6d -4783435056ab5a0095726435be6885bf2784fb2cbeffc0f8248dcd594d34b21c -98e67de50b6876c3d6d4d4ca7ce0b9013ebe754b104dcfc0719a10cdd9985e19 -2cdf4e88876c2dd4e79e23afa70ab5b4758af32ee87b8415b881ac15c5c3e1bc -d17a5b961efb3a8dc987deded6f28a240d66f004ad05ce1c551e29b45668db2b -305c9b1af5cd5388a0802d80f18e0f4bc8065baf393ffab9a4d674312c2033d2 -7c78b5e9461fb09b9b2caaab70ceb3afa574c89bc620328211c85656f63a8ddd -97c827297327b7980c2fe0acb1c34866aa3c5d7408e257eba3c53de8338bdf96 -cb7ba55fe31bddbf7807148c0a132bdbbe8a2c21a23e11889da13e429914f7f5 -7132936359a0cc65e5993caf52902f76f75d6cb46dd20a3c0be80d45f2c746bf -236733462080fbdc8c5c1dbe9781f45aba74af8033a6ef2bdb16f7b0930d6b6e -7ca7fac8cfb2dfab8c063d961077585d24e8fbb5e0b0bee9c4509b23361dd06a -dd25767833b9a770780b311f608cae7adde000297a2672211f0de8cf7f5fbc62 -78faba25d035fe3a7cc3a4743c0efe1c4a5e9cadf1e05bc7982648d5c9fb2992 -4a9ee1570ba2ab068cce168552299361d62a2bc2c0da48ee94d1cedf1e2d29bb -43864ab5b770a14c98a432ab76c17998904f052a50ef845100533ba5cfb24c84 -da53581ec4f2201ca9fdae76ef365515188ace4cfc939ad6d193413ca7ee225b -0137f4637f09952213be725cc7aec579b2fe85f7c6af18d70c4fda0557567e64 -d430f09aca7bf28984977ba0f5849a5a86729d5640bbe4c30b17ab03262a02bd -8ee077ead7fdaefd37af16007d83714aca07fcf882adc4792583aabb279579df -6741f637cdf8598fb5827528771444b0aa82dd5e00e70edefa7405a1d8a7797b -ef021a53ba68c7ff6780c94f1393d1745ab1fd7c728c6112766a3c2e21dff002 -9e45a5c5668f8b084f22cd6a6cfb056cf0f402a73b2c02118259352eff6d680b -877ce3024c37d532c186f3d4a97603704cc0ddb25cac00aeb4cf601f6fb45655 -8939ab962cb9e16a2400938d226056535ebe5707cf0a8678b54e6e3a103b2eff -0bb7306d7c7c3f523b2aec267a5f1e3f99208d8ec9ab27d658c26f635c2984ab -5a4d214768c6dc775bcc616838159aa10d5bd93cfc8b2d836eae5ed480fb6ddb -24253a62a1b798bfa51b068b6888b76d2233b6fb11794f166254cb3ac8cfb650 -429866dbeb8d09e6d03889899a4e8bfc9a855ea4660f928d0aae8247eec1668c -8e798398d53e52a5684caa59c47cb38c8f1009a8aa12a269a587593874c2dc78 -0ba989078910f3d70211147751e9f7264d6e64f1b05410ed3427bb7d0704443e -f2baeb0fb9e3f1c1c14b178e716feb4644240447a3f02211350e36e1a586a042 -9ab336c6b44c0d2977294e704e8695b6daf079bca033b6bd3485eb7a78582fb9 -373716136c63eadbab3a2577738f553f81135829f9118f4bfe20cd51190bd7c5 -17035ebe97f26b0b58973ea9b5e0d111d9eacf2fa54b223c4f40c139ab891a41 -c7d5ba5338bfd58090ea727c3fd9d0c0217c05798787881d07cefe019518ccdd -a7ad72305f06a98717cda80c5daaafc50e3c6d78d2b5d851beec46731a6c29ed -ddcb9089de5cc2ddb696d3b7de3b67f066527ae22cc1ae6285dd1ad42e0809ee -65812268d28e7105859262e9368a3aa7fd0207d47de5ea5591927f5e568386d3 -a61fcbe872945a272c75384be1e85b26aa094704715f1957de37a2fde2577ba3 -85000d0708fc918d52360cda828cedd17cb7d625155ceb6931a29025b44ec8fc -3678fa08027b20fb9649d07f01484f2fd2e1746f290e32434fcd4d15acf0708b -ee3fe9948d3ae141749b47810558d71d592735c1c86ee375be7413b2cf462660 -0b115cd043ede5612ab895cee0909da8d165408cd5c4c34114ee4d7fab4c37b6 -a31cb829c4bab2dd04b1a7097dec24c6429c13482667116522f94edc99de551c -a693362be4d277e12829bc466e13d09841b5d9af504be4ea59e9c2459eea5ac2 -c678e3fa30cdfc5ab855d56c1ad8374f9769a6b575a1dee5aaaab4f716dcebe0 -0fab8b0b5522294ce3164f8446679fcc7aff5bf49062cea58f5c661a895ae753 -8891536066f8416ff5e357fc34cc34d6b68abe2fb2c540a7123bbf90d2671f65 -90515b96cdd1bd2c1396bc15503caa4ccd3ce28e0361801bdc5da98887b2c39d -b84a0a4de7859c7da394acc497641ece12ad8a7d62ac5f8e6bda0577fe64d581 -35390a37a1570cb25b23b747b236f3f2606a3ff6e487a78069a068e7af13a8e9 -315016ebb2552f644065408a69f1bb6fed50486b2a05d403cd56ec5d3671c9ce -091995d384491b65eeaf33078529238342c32a4b81788c31e62ba0614bafcf9c -3c1cd422c605740a8939487e26bb9233d4cde68afe7a0cadc3aecd739c9c425d -09cb50b4b4be28115ba7fc59b541513cd6fd08039cf40a1f5b90a8bd1263806f -ec35aaa4100ecc05416ece2f061cfdbc321cf3324f1eda91976cabb8d2d9acc9 -b93c575c363fa691e18215311431841de8187a20d6664348c7a8adb06e867d02 -07bd48fe8067168c4412fc80cdba62f8b9209f5407670a26db1f7f5d67c4d227 -90bcd0f1e8640e5f9288c410487290808b88f9421d506386ac95cd959fd1ed07 -778de2f62958ff409d37332aa4ba88c735f2a56e4e746ee98b9667072874b21a -5f98225aeecabf5cc818f3fa54edde178b40a1b1d6e2f900365e2b503346b213 -ddb43a269c5a973d303dbf615ac3caabfc39fe2144681e7cd633056bc77d95a9 -16f54291575aff7a3a4c13eca61a8d261b3a74307aac38b50c0e55222626e717 -db6e122547b3b8a766fb877deeea52ece2e74ba02ca7676f0e037cffaf287340 -c19bbfd9378d8e898225eda3fbf814ad51f976241a7285dbcc62610fe998ebc9 -7dc5961af9d70a6786e8922e7932a539f1606101440c6855f2284eb34a895cae -44637b6a0b1c6386c21f11f2e7ee2adf012ea6ff35314981226505bd4b0ea25d -371be9fb6fc0425d8f374cc51fcb15600ff7a49a4104bc29a369c8336438bd4a -45b7c8fd52577a49acdb394cbbc16c844ad99f85b5af1e8018900d50862d7c7b -045ee4bf7972eb05aa5696a004f3ec9be95c4c14180c7c8098a3a0443c0dfaad -91e9c3a37509b29066af112db77107b9daf2e45e72dcd78660d5d56018cdf1e4 -ca787593c31a2d6ef925e37e4ee77e687e149bf506664975ccbf5fdc20b5c306 -984208ffb9ec2f79e76a7a029cf5981fd2d07176083d7fa0d9fa7b1e6c6da9fe -423bf29011478ba39fbdc7e77ba230ee7b89728c9312602dda359f1ee65ba362 -d1f36657943255d62f0c84fe8a630204a8e64d8f940e9ddaf3c2ddc16fd131c7 -f302a2f9fb65ecccad4616977b2ec724fc6a4c39417962e0de1dcfa69aec8a02 -07179266935b655d20af3d45228ac3796fd2b7b6e0580904a27fe0c8023f4fa0 -fd70e469e5f309690c6ab737e9e0dd1db57fb312362b64ff1955401395b42086 -07e7f9449a8953149f324b4d5785c2a0a4c28eb487fd0bfd65462a1a4a741be1 -b1876330912edefcace1dfacea7628d16a4716d3989e1b31830cbc2bf9fce144 -9f0e80bdcbcfcf477a2c30a72ec227b20a0af16fcb8356bc205f18c6088c1d6d -c579f1dcd23ffa147d72821b7a63fc011d5718fed41b16ea1d83ecd8d2ade289 -54eaa105f82f777b6635c160d0e3d67fbff2080db2a99d489a070d865c39ac9d -2a88ab5fbce010919edc0ab213a09038fac6d3c81a4972e3c5683f49480fa5fe -b8cd3279398028dab63ef7e8e1df85a63f93273f187f8f8619c14ab824c97c3c -70d06fbc0a1b4be1b2b7f11ef469adef71617b304b51c462ab3c6c0e831c9ad3 -cb80c5e0d0fafd079d7f4f245d542ea892c6fe3c3d6d1ac2c92371b7a33aab5a -ab8375b4cae9661c9d314999093b2a04ea1cb671c9f07ecefba615e023cb0f72 -b6eed231ad31b1f4d03e807e56c1e1663986eed65e3ee47a2dd11c1211236973 -4b4607a6570f534debc72ac06dbb2149f9efb793a917b3b604271fb764fab871 -f7aa5a5fcc54533951454fe7afa29cddef96e951aaa9b8eeb3f9b418bd132974 -c601b6fa29471dc34814fc81a1e1a5155951c12022aadce5826302220b18dfc3 -d30b2277d08e7cc7a87bf1b8ec4507b43cefb117119d86de3be51bf870390ea3 -d8daa3f74ccd3712d1c00261e853dc3078dd411189872a50d85d58cee8fffb1f -0288029490412f3e58f83dada08fa695b18efd0a4f289705385a411fcb2d7a47 -ffe38977fce18188c0043c448d27e160ee752be0d44d0f83b6bf642c694aa530 -e223aefa3fdb17ee7aeaba75b9a86d7cb0f50ad4d5ce68d4ed48cb0c188f9dc4 -34548b48403078f63079bce8529f910ab280ebcae7df9f824dca756f9d647dc4 -d42da412230a6231307e7495424f98c9f129cc4a326a3dd8e476e18d666f94fe -53edc87e47f6d84abb643ff3b4084437da26b4a298f819f4b6823eddac11bc85 -b9f5c5d0aa1e7b0ddca82c8e01944b3ea48978c1b8f4ff47779a5523f600d33b -896b659c31f4f6f7decbae0fe1f83dde18f77f53db140a36b0f6f4b883ebcbb2 -b6d353bf2ca6102173b6dfba0f452d011f6cf7d661a470c3c5dd189c1e83fc4b -9372ed67ef4ed9a5b98f85c8d73d490133b7362ab976a385cec705a2eb89d7f3 -2fbd60c08b86a30219aa2988f79e6386062be839c1f9d30affde82cade3494ee -13041755e76cc07ccb3a4a701461290b5b79728eddfc63b2ed5cd4bbe0c4c365 -75488d590258ce2084f898d7c58b3f65b09dea2f8d4f71e80b2a2f8f31d5fcef -7a7744b64d7baa701e473b85c65814b0a93e3ffbd7b2af85e00ffbfab9bb7766 -f444709a47902c919bd2a4becdce07b64053aea1058e26024b46153d6bb92c0b -59861b2ddaf3d38dbea5bfedcc49938eb98188a3c4dceefa1f308559f7712ccf -288219c6a3d4eefb81a2c5f154990fd8f09713a0531017d74b47e1f97aa6f0f3 -92ce5bb7475c676247d57bb14ff676f11a4b5b564ac26bfa9d85c9cb0414fafb -c35b46eacf74dd964fbddab28fd7bb304b9bf4e12cd15b3bbb163dd66e89f24e -6485c6ea63365d29907f6ba96d313f9b2ab7d175d549f4235653ef979a5c63cb -6ee50cc333387a0ed88d30d9fd2197d31a0894ed0a47b15d92dca463a8c84b3a -986d396e6530b2e9ba127bb5662ca948a8f0c563b9c868644b8d01064db6aa72 -090dda0521e6d778192a8c6d4d4639e80e309194cb76fc5d4615f396dd85b06f -71dfc7f39a259e322c5e7d28646310eac92e5f6afdd6071b21e6664e1cdd3848 -c864ce0e380fdc48b251d52b5094ead64d380b6818e2c8b1a4eb8f9c18adde6d -6e4ce1def2ae8f2649f1e5aaa05720a358a74e181568a10b536f68b7a0292787 -12c34acfa5bbafc4aa3eaa4d8ebb26e20bb00d228b4eac4a163e0b72899874a3 -f85e82c396d9e2891d8e0d6e5571d4ef116879cd2f5485dde4b9d40f638a3a95 -de5ddd14adbe72f5bbadf0d9950a195f64fd3209c6d47b46b7708f855da96cb5 -e9e1260f6699d945a611a7ea348db3c86be4b32fc2687f15c4c86957018d428d -f6244a1fb6a99122bf89d7add01c80f2b2bb2c7168b02c400bfc98d65394948d -c736741f9e0244fe096571f087c5d6d7d022c726a4cecf37cf2ddeb1e9d77098 -60c5d43121bc2e4b72a2d895a5ad2f449196aefe8c01784323de3804363b88c9 -1c86124f431e6dd0744c3d073fff4bbc2b98bdef713bdefc2da4e0e22eda76d0 -34424ce13529bc04c078dfbf8b3efd96cf662c4e151f15d4f8ea52641689d4a0 -5f7c9ec4efa5119db9e3a61e4a669c29348a1e71382c093499cd35d7d1227a5f -5bc3db96823c167100074c70040a55142148196567c20c7eecbb25ed6e31f563 -9add24d52aceea4b88114eb6dba9461c2e5262fb9529e9f6f0bde20d3e209a8f -0c9fd81b99b00d268f764593baa894f7ae50634766c922f751ed183aacaec03d -b7d96d012cd0d111904245be9537edb0f8769ad1a8abbd8d1cbbe5e79c53c00d -983c69d8865e93b6495a2f15ad9ab1da7503bd5b85ebe27aba01f71e56482be9 -d4342ac2562d8e6d1e4146447561ef5068d17306d66a52fa41644897a9b161c8 -5dd4161aa3d956e7961aa8020467e76a833e01c974e32aa2b8cf27d62fc81ee4 -d74649bf9530306481f430a539a95dcc2502f712947f6a68dda00589ef404132 -1dbc8b94afd827bbd5f77820353fddec5d98fdd256e858581054789781ab090a -816e65ad3dc4a68b4ef2356e7cd2f906a859dad680d649457bae159f91805d52 -fb6dcfa5d0ac6373fa8325a817563bc9ed89a17d8cdee9b7516f38908e426f05 -1517eec7941cbadb22390e3e2e17d62ca67f37d01377c5a1e09bef5b795b4446 -54b383193351e05ed8bbd8b0b138cf62a428c78744582eec90a41c3bd44a4e73 -c9b32ea4936c211269ba5f883d45b16681f8afa0646a4031ef69cf4936305336 -5758f50534e6974342f4d232b5024dba0eb297e3aa3e9ef0935bd47998370420 -ead844c7e336288356715ceb8cb8492ecdc8fd8f1183360fa32850051442f4d7 -c0250d658c633de21048f4676a1875df6a8a61f0fc7c25dd5acd0220798ca70e -f09a72b19595172afb9085b9a5971ad1b9a3a2508884a3bce88c984f58389620 -95584866c59f89120c7f491cde35b9d179f11db0d3c30370138852050cf14b18 -c06dadc218335bb465dd88304f1c1cd11062ca72649491fdc62d571c082cc816 -261444906d399760159f6b1e6df4b42a7a84750aa61c034b11a6e7eddcdeb54d -e1f5151042a8e9f6a23a81a235fbc3908a85a6b05d8162bbdf3a672715b6fcce -554e98df1f4583e03e456469890f07f83bc0a8954fc5edc7898f21f6917d30fa -36faee98f622ef313cc8431931d83d271cef880dba07b832a01384994e964233 -f2e29de305c3863191f877dfba44214da68bdbfbde1e3b8b9659d7800df5bd19 -28bb1425a51abc317efdda09d29e04ec8b17bd3b78085595120b58fb421916c6 -af4b92776ef8a8211cc376a37566422bf2e2a840be57a357ab9b9adaa20600d5 -c49f228d2f7bb606fcfa867342884fcd426a72ca4c5d09612bbe26a2d9d3c8fe -15a55e095b6705f2a2f2a00c9f1cbae16b91e13798b96d5ae66b5a8d1cd751cc -9747bd951a55ec3fcc11f58f8afb40913166ab60a01b697507fe0753d085e5a8 -8153cfcbb70e29b7073ab33f7be2b6bd070ed974d0cfe4d41f7f57f05cef38c4 -251aa826e4a1d37459212c1b411b6b51faa564da0ff48ee6402b3c9fb77d502f -61feeb32602da2b5fa880c537f60e1394571392c3fba4d110ff47a42d923c153 -f7a83bc1ffe67cd11ff1a763950f2d7b6d9575f45562c3a9de6d4ebf59482d7a -716f39eca97fd68be71aa73987d570ce2ddf953c6ec97cbb76b147ceb8973564 -7ee159434e3af6588f47ff9722b7e90f4d9fd0c5b9e9f3a14f9bfba60ca6556b -0473dc073a961731d322161500e15ada373d503552c0b76fc6576088e630cf29 -b9b0c82cb348259edd482520a84965a53cd673138aa57c32e41fcf50fe24a447 -4ed23401f43f5206de7fb3b6d1750223115919d85b54eae8298a19212e5c66e0 -c05c6dd7d7f8dd877123205b7e391a189e11fc30fdc6532fca87770985b357a4 -fbf9c5d261a4c998e2fe8eb96e27dac9daf1d3f0ec7422a85d9c7b241857209c -f372c03c1100d8ebf3ce4ab3c0efc1f979c5999bac6d4abb6abab1d059c53f7e -34f972f56df329bdb8485e39cc98cbf20ccb70a2a3cfdad4deb3267578b02f0b -0340f42bac749465951198d2ea2bf7995852a50b5876597e55e1a1977b9e2f0b -8a8fb0f03839dcf6bd5542827208d443ed4b9c0145e4522274a02e4420f738e7 -962c6d9fee17520ecf6d6772e5e77d6ed395304699dd65d7a610d793e38ce3dc -e461843d5af1e27bed5652bb84d5e85622b48bec72e1622ab11506ade702cb2e -8ca3ffb8add5c2470207bed74f2b34faf8cb61dd5e0bf54f2b8e1c7ea1fee81e -0e0a16747443630b04990ee1be9db5764a580222b27332072e74a60ab7b789da -aee741eb538e3ac7e38b333c7f6dadcad5b9383ab433359862dcb30ba53a413b -5e9947eb637e78eedc4b8b17cec6b82f4cb8d2d71a37921e69d428723823ec95 -0f683a6bfb55d22dfb161e1d6b6db49dacece6e43ad2c51a70e6342a85169fde -f8060d7da7e20b4db176bb862c29749077d7104bcb313e5c886a01cb16f11f62 -984c5f853516c1419df929d29eaf4490a3aebd24358eac006a594afcb839778f -d0925e2daabe74c7ddcce9a4f454633b52b445fea99105fb0699485956fc737f -25625d53dcf0b9e2386bbf0900e0e011e8adfe162d5876a850a6507512690d2d -d1f00992f4dbbca2c63cd70b16dce15d1c128b9d6881f3f7ffeb68d7174ae769 -3b6f5e02523c7f046de294e18255b689d2ef529e6dfe489956afc909284a4d43 -b0ca1d9f8b9be4e4da535522cd9b6e64841c81138ee358ef6768e7f78af8033a -6885457da6ba42cb4bdd4f35233b8e5ac02b7d8fbf2092bb8ce890decb6e99ca -152d2aa56c5ab4179ba7936c74dd6c342a392131fb96c14c3b24d9f0e4d8b1cb -862ea5e7b13e204c914bf95f55ff32e4308fe5b2949fa454560e8dec474ef52b -65bbbed017d5eaed0d89a3c86fc63bf01d3a6a10a5fe389b1af013ebcbff2a17 -7f6e854dfec5dbf19d4e977a07a42287a2dbd42a78e589a002cca47eb865bd5e -601a98bb3a8572f20ef1c0a2b3500f615b1b8f9b04215f91acec454312ec1dce -08f413b9e2ddddcfd2bd85125dc5a043a45c0b9d3c86ac30b21f34cae2d347a1 -e93586eb95fdd3d1db7157b21b7ed1702d31876a1cfce58d619a66df8ccc3116 -319854a57965fe23d2d2d7e02f4d95d810e8a13d29872274fa6f48b7333b743c -7af418c1fdaf467acd5483a47c5e99a7bd81e18ef98763ecc08820176a109145 -af183870faf171a3c24f603654896e2d1b0ac6224cfc765bf747e194cd18c740 -6c61fd10b6b7dce9c0a6577a87ae840e88f99cbf1c1d6cc83623d2fe80bd710c -ec79256f89f26b45f75281d3de9636a134f63e244df4a623c63a895fe66e1464 -1959655f235bd056d65e3a50f55a041447594422eeffacce6af7cc9768f72158 -18ed408e47358ad45fce20e4848cc38f70943755e9233ac711e663f2c7d77b46 -c878e70669ad30ed18b6f832e4d7f54a23c837ed440ae97883348a0b5fe95232 -779187e429b6f855ed7cffccc8d6784d8bcd92548e3257ac87231c36f119ddfb -f28ab8dc8b253a1fa09f016887fc29b6659b40bf3dd9db6ead8c8c3e504b10f8 -37dac82a816e06722397867df32fa25da0713e92ede9e4d41577ef58ac70b402 -a4427a7c86f7c1d7f378b62db43ca4bc3a8669f6e924d719f18799d1a9e5969d -76bde4fc976074f2d623721d38e3f5c73428d6824049dea9416a450be02dcb55 -908e37faf4a56a36519311ddb3d1cb66837c2964a2dd0d34a23dde43eb30c88d -b6ea541956b904db911d009f0b209bfdc139f48878c811ec38a21692f9b866c0 -a59d9d736d429de0db4b0526463d0348157019a262b2c3e0bf54095d06110593 -3646fcd24134d6b3a2a906a891187692967e93f69a54ff3ab8050418585ed1f5 -9822b134f8841589fe146d05ab00c8e22651c43723216c053851a5d1f9bdfaf8 -59c55523acf1e394d27500a1cdd551c773c9a6d7b3882f31f29c281fb6c6250d -8a1c3c8dd110c1910014da6fd1d57b8ae102b261fb65a3019bd75e81ccebde3f -3e23764e9a5dbe640ca98585da2a4af9de5a5045598a905ee7b82bbaabdd0d92 -bb5351d3a0b3071e8666fce45202af6000790c1c1d0a5bf0c4623b9815b8d3b7 -7c39970a509db6a4a0fface38a60e2dccab7f5b7ad1c0f42a74da16147589a2d -3dadde9bb1a63a4047ea20dde1109f8856bb81184f4256994b5005d654e49086 -7bb8396fc8d807ebdefbb74e9894bf0ec793699f0e68263885581a17c87d7082 -371d3d4884b50e1295c517fc56b91ebb6b4c23b150d542cd0768924232a5ac00 -8a98f5ce9adc8dd3e65f085b35640919767237d0f9703cbd691a987a0aa0444a -5ea0d887837482a7248865cd78b6f665301cb67cceb1f689198821227c1acd81 -3d0a50674832bd33b2672756d5186c89528180e190d1525c3e806caddc1e4157 -46055910cee4f60f40b1065f435be8a39eb454d88f5bc45ba818e5b006e5a38d -29974f68ee1962448f7a9fd83c7f107c7788eb8975dedee759a2bbca40c811b9 -d857cf8e510376d48abd60567f307d6ec471f99b03cc7b5e8140dc0450af3832 -242a353515b5b347774f32b8b6c033adc43b2bf7185480e47c868308f3906bee -e44131b11b2b14e77f33686307842337cd1f9695491bbbdf271b5345c44d6a75 -58c59d6d5bf8b24af38248368644e331a88cf73d0eba9dfa6f80f11af0293bb8 -40d9755540afd18fb03e0b26b6432277434166123d80044808f6f1115ca55b87 -60f82520eb81166f8363b150bac7f45983d1f4ea0b503fa8d041261e2fd14caa -c7db8e5b1bdb04a65cbb660526d8b21eeff68105486474803acc96e7b882bc9f -5a1d5f1e333b2b2aacf4272a05a41aea04b2c18a82b1c66a40753a3690aef089 -b9fe83dd0d86fb7b7045f041b690928b7b2b67162a1f5564117652fa7899a444 -bccc231189c60ceb72abb4038d7d0ab5a027bea7ee75542416b12a16ee00900c -db94b2c89b2345d209cd68307e101cd06dbb79e76c725dc7180becca0eab9f8c -ae1714c57bee7e7f54c84e7a2ab9a2b1ddd4d160cb4825b69c1bf5ee26b18391 -acd6fab3f890d8cbff5ba3666b8d7853652da2bd5db79ad8de358e55a5e02270 -e1a2d09adfed75088a71593ff0f54d5c527518cc767584e4380b8fce58b04ca2 -05a69ee280da655169029a16a3df3b86fc4ab635300397767c7d9ec3b3fbd60a -bbf51ad4a3cb348539fb9b7eb072ece9afb2b3c00e2b91bb40a82d2ddfa58e9d -f40699038c9a7bf930a83996afe9580c5338405108ac04fd713bb22ca2024475 -f540fe14290ab1818d9bb19483aba2f39a958ea417ec73792233ab538cb70e0a -455c6b7e0bc86eab1df73eec1e16a6f95cd23b8f695fd2b919dd282bd1129baa -93fb68080d90c29776bf27fa42dc0721e380ecf88286484417664e41c5b257ca -bd4835c1d64318507de5dc2f1060644b2b125f17aff1b95a37b9b667906d48c0 -9fa7d875d59cb6f7fef2e37ec418540f8f13c2d70cbe9566299dfb80c06df99e -b045dd3baefd87b24316700fa1c9f72157b927052cda3fd2b480df750298d645 -7c412ca39f6325d66c77be38bd8e491d8f710c5f91f432e13f89056940029532 -db065329782579b79d9f6ba60552dbd6a302e628f75e0d3582d25eb03e7deb33 -54790b02521553eb0c286cb415cde225b5d65cb79db060d13afe862d5885b567 -2430481620475f50546ac782370e3ea1c95600a524d288b5d4028be7cfbea855 -528953e607721b7488f7d7f9dd5ad14332b32bbef72240036a3e1646fe5418a7 -1fd206ad3fc75b7dcd9813caf5d29ddbb12d7ff94e37bccd72ba1086dc431b5b -713ed14ab7e9f1bff7dddfa9bf22624e4caf3cc0d4194f0b6a36b1c67e43f117 -4bb23054ed01209d28bc55224028648a4a3073d56835afa9e004fb999372f29a -d76db663c2a29b5638567058904a4933be88e75ca1f365739a65c27bdc195e7e -09cfb2426fa829ca3859306b556d1bfadb5d9493c66e34dd7f63583e4532a075 -532cee2d8976f785d7909093787e8aa5fc7912ca8fa89d346634ef71f98c9fa3 -cdfd931ccc699caa314c402ebcd6bbcfcd3ef7ede19e6c8b5ea9bbe73ae35b72 -e214974b2bbb26a115750327d20732b6f6795c25e4c0b1a63b5054383d428d2b -85ac1f719ce35a18de6f4753cb615aec6212a272d89b3750863536fcf5f791db -3b7b39a66ebbe9fb1876bb089ec2cba092d291aac88f09c720aac4dd8fdc22d6 -4367c4c5330d4e0ed7d454728af2b4801618edada4fa3e5357fb91458dc13288 -7650401bbca16d73bea8cd5127797f92c8b5314663e02cefabd1edd89e4486ba -4d371138ea6a07ce358d31bc9ecae64f409546e9101fff7ec710b45f910510aa -b51eb2374992009a28262a370d42109a0aa5ebbc16d2ec5d58e0a5e7e6f80a02 -5cf8a581f3bbf98752edf64feba585fbeb56b27a79384a22c868693c05084423 -f7cd396cb48e68f76bab6512f76da2772f3d137881ebaf1d3ca6e1c98d54732a -fc24bfe29efcd703c489dd8dcc69da4b86b5650788bfeab8bf66c5c1df7697af -ab33d0c14caf16b9810ea74c32ccb5bbac2613c6a3d946436ccf934a20b81cfe -5e712765d1983bd77cc45612a31c893a5583238c944f91f2d6d1069386621108 -108b0e65b4f6d76bfd0e1158005e8ba53ab48e865e9f6d07835d4e9e124b01b6 -41baaa6cff413e7ef8eed73f1cccaef55a87d71afb309ba162d3e15dda6f04da -2de8db583beabac1e5680df43bc063095de043b2ad4c8600ef63a8090b64785e -5288892b63a87d8c805d1000b6524109a41e05e517e07f0a76466125650b3d97 -008057de3d3380b0c352e70ac04fcc21108e619a707fbf7f59869cc9a2d571c9 -f77114250c1c41dcd527323edb2fb883dabf371dccf42389a260fbf53464bd24 -d5ae5be48163f142733b205e110d77de5cc07117d7d6d347cc8b035fa387b249 -fde3beeeac843c89bbb871114f5313437a784c051e021da4f80adb2d5e392f0e -46068df67f46afeca052378d97597f21c39db6a2ca7c10c57421499da8d5bdec -128109432f86a0ce63ca2be7fd64e29e8392bdd0013d4990884f7cf49e7b88ad -846af39a3aa1ec3c85f21db07952d1b45cfc20d6848536b63d2572f44ff718ad -c2cfacaf395cc64b34290bf19a19d756b38142c6a7471ab436c6b81abed86fbf -8553dd8d5a052f4d53d6124ea4ddf235f4a792f8aa485fb068d39c682eda37c3 -2fcc58da51f74c24bac8db5cf825407f88daba78f41d8ba078fceb0236c2deff -e61cc0abbdbec3bfa099b49cd1218dbff85cc705730ea545cdff4421ee5a5355 -9ccea2cf6257b757e4c6b853a476f0c97ece80a41fee4994b05eec575f87bba6 -9066eceb28ac92e1f4483f8744ede06a05ea038565096458785453b2462d103f -300aff3783f7a2ee1a27cb223e7145b6b74fb5a95a5445b5800d0b7e4451be83 -8a7679e3a29c9bd79be0ce900f8cede4f5fbfcf46b6354268087bb020914f246 -fe06d18cc7e9cb1003bc96fb5961043d919c9298e61dc5c7cb39886e65939fc9 -037e0484b62d1ee35842b3ddb879a7fe175f07451c4456361bb646e5dd87ad6d -ded8388fa78806f8c993bf16f539a4526503d8baf83d1f0a594db7fb1a11e7da -d2f9db98c5d8206ea4a44ed134d784b05ac0ca245b2a5adbd93efa4a566e93c4 -84fac7ef0ad46254101b308dc4e39c549942af85c96a5dd31e5d9a99149f49ff -99cfc5783d2cf9c320640a5029bbd61c86d4a6ae9fee690c5ac5e92d6b07aea0 -31c6110df41e63bd7039d6ba8ea9ef33beb3cdb415f4497245606963da60194a -8383663ba3f3be2d6e0b4865ddddb484f625beb57eadfc694125ee35480efadd -70248037bf40187f54cb53a51fd0a916d0b1a54311f43cb39856b5e4e17ddf0e -54466ad34cdbed8fee17c87f00bfe4832eea2acaf9e93aa5091b62febfba9b01 -5960618d7135ad546cf4d00c8c725c6da697406891b75361c81cfc2d13a03836 -8f2bc045495a1d24628606990f351b6f6f197ec7b52169495bc0047335c4a3d6 -1a7aaa63fba1aca730ba1fa90ca04a0fab27b145b2dd0b4c03f01c79bb77758b -fa630d02a5200c48499964fdac705d1f6b0aaddc58b47a35077f5ee2fbcab957 -919e5bf614a1468207592bfc36bdd62ea9389142350d0835243f485c99a49ee0 -b6fce33e9f1ca586f704d27c59621206abe70ac31608ca67a512dd60f07510cc -e0ab7715f3a662f824a011ec47e60f84664e474a255712aad0bbb1c7c1488a49 -0a75447e9feaba451fcd1106d7da535ad82757494620a195b2f0b1622c62351d -89b62f4f9bb812fed256952928d864147176ff0e03bdd2ba75977cbd0b5ec371 -4478c47d97601280566d937243a0c8b0b33450773897ed5535bea6d7eafd5413 -5c4a4976ee0153f4eb913aed8a1497b743e5e1ace625936b3da74119b49bb536 -1a6fefc0eb959394bd745cea919b1e62c8cac77754c59b725a26c606a7c5b3c1 -45fa3e24e5fd96e230497a0178f21cdd53c733a6bf29605879f61cd4b7ad1117 -1412b03ef42e4f8261df1544138958b3e96ac45e3a45c1bbd0a6d3f1fc4df057 -d0013bd3dea861453e54eb4721124ee277fa0eed1bdb6ca37e30dff04e91b88f -308edd43cb7dd7e9722e57dcc7f3633209505409a1f98a133874895e00b32c01 -85baefdb0b4e97f75488ea0f76424d9196a2437fc9f67fe2933ff34232768eac -722a84a7fc52fdf3ad248c69fd7d4c45fc33ffc6a04b562ce367d96b03c0ff8d -75174dbdc09bdb35a9f4840a6adc555f42d20bf5e2d3da34a991f63648ebe86f -3e155514afb82c1b3e37fcdcf8c594acf65fdfcf5965f42cb35543ffb1a1e40f -622e6ed20b4979a37835cf08e40b8bcb015db8eb1a044dced8f6bf6360d0fa20 -e656d90efbf461da451852f58439db9281f60edf5de4af016f8715eee83eb666 -d48784d39764e33008e5d9195ef62439f3af1b989bd952fe0a0d30a85708bb1b -a353efd6594a3ca201115b3659dc1a80619f155c6649f944dfa3e543971f8dd2 -b0a30afe77658ab82e630bcd4fcc33af8810da1360730055255aacc77fbe09dd -9b13d44a41e0a1d3789d94bd78494a33ae60b9ad7290e4d1ed6924820140e2a8 -ae5137fe7c2570af124263b99d11ece45cf80a6e11f56dc6d77e50fab50608fa -09eb1520f22ec16571e92a193f1699f81e352bcd9e0c838a8c1d5bfe80d76957 -7129c9c46fda7235dcc34f604171a75f069f9e00adf56e84ab1f74f093bb6995 -743f9e027fc4d9e6bcd647b2ec7f0d7af2e2efd2dbbb68c83ceb1c760fa71ed5 -0394d38963fdcbf3891934a4cbdab80107778a63f1101017becd233ba0c2e602 -e9075c5e509f2ace7b7d5c346dfb58d0ba3e005e38ea7428dfd0100b7e1fddb2 -7fe8cca96b04f9b349693acba904d44e143e03e82d16158beb36dfa21f57a039 -d6bb9bdd1a787fb9df968004388f8655e9d8b6f435117836bc910697aa1737d0 -55c73fcf23f8b56b58b09195b7cbff574a2418b1ab9f74dc607066fcb798b880 -5fb0d761cd5cca51f9ff0d2e67cabdb026f2a9b292fa472b97ab89af60cba974 -71fdef1417b14e6ff5440867aced2ff9837c1cd1e1aea23bc3cf3444e35f7cb5 -97c2f8d5576ffeaa83e06a9e6383e9225ffe0db4b1575e1f87f28b373716b668 -4f3e9e694d6d56495d21673d165cfae5c6ca112d16a40247216da4debabb7e8d -34fcb858707d82cb8868dcd8e956d1ddf8bbf6cd57c293f8e3427f14c99e910d -a7bef26c09e31ca66550496574c0c8f70e7efc9f74bb45fb1ff13b31d8982b44 -038c1218b874ac95ab907d01bca78f00fdec53773064be453a82efa3ce336c46 -69345e172763413f021d75570ddb0a16c806e444d8b9895af997ee7425d2ae29 -1d57d9aa91a5d9e992a7275381ac332a2396900e4d821f69a349d48a5197f98f -3534ab2a47926edacfc5281c09ea8ddff7ccbdec5b95857c9b2d82829376bec9 -79a6ed53c42f6be0c80a9fe6b90c06624a29adc0e268241e145b18dea609cf8e -e79720d031691f5912c7b4c1fd4358a6ed07abe23973f5b296ea3e36d8081d64 -50835e84fe95a56764117785baf8b08ac40dcf7453f4c67100445ea6a77ab755 -e3b4882dd0a9d74332f72322d36ab9dbf2199028eb6c6d0f43e79065e0fa47a7 -68bfe8609fe6ad82e7a1fadbe827d86ab6f3db8d0650c31e80c7b5ae24c703da -104ebb4cbf0d63b0248ac1c47a8ef14a095d902bb390c48760ba7da6fe56fb44 -df02ee166b522a550efab2006e814f4053d0f21f3ee790ca6d17e8ea5ae31083 -5889c2ca6b3fcd267131d33f3f71bbaa5d414479fd6c9e84ae481defa4eacf99 -93a6fe4ff57f5e09fb99b8fce71b958080971e61bf0ccbdd2a86448782aa9871 -0cb686013548fb3f691436501545d2ddb46a3424b643590da9b3069d76eefeda -946b6ae4a531f7d8b3bf98ab35d37ca5b36729548c06d230b597ab2cfd12dd01 -7fd2398830db4b4f2dd298e945659a564470b22656e28a2defb63714b5dcec1a -5cca4f9f3a07077c87c06bcc145edea8424d9f44ef8e73fa98fd216cf3fd8408 -52ec5988a7749f0d6923f6c0ef50e9b2a7a61c006316b49c51a0127004566d81 -066e7f1ed02f5f570cef07df070ee98d836ad6048fa77c8888dadea64b72d4ef -1404634b59cb590e5113d384e43ddcea459dec60c3f1cbec10e33100bc7eb8bc -7e339177105ad6a478ed9e096477601347e97c3916a3981920b16bf4d64d8fb8 -694341db499b9ca3cf34e140d7db4d6c5c291f100c2d419752e89ba7fac3e8f7 -5b4a63616197bcacae3e0170b7467670f67acd1acab2e0502f02f416b851a5cf -6f83c3cd9992dc925b388cf75b423edf1d5d234a341adf12cff88bec1da95ad5 -dcff92b3cca7418cc86ab1f1969ea85824d243bc5cf4fafd8f426556dd9017ee -0242046f909acaed3ff2a91564303d13c8df20ff52e25e60cb7168902daac679 -b794ef58e0ec9a5b5a97a1143b09157c97f9946d98077de28e8908b84f73a018 -e0c3bc6f4a6ee088edde6f1e0f568799d86765d843965381467a99c8b91632e5 -eed53fdeb8673bd6c9b3757773febbf86ee428d4b386985e810db8124f5bf974 -df99afad632f03e338642c9312787ac47a9d2f4a10fc5399b6ae9029a0336d89 -2aabb090e581b749473ff20815277881f985146a028f6dfb0acd19954a0bdbb8 -b4ed1a65d3b9866dac29c6aa8aed39d956433ba649f283aaea848f6cf8f96268 -cc669613981e4705d9220970608e67028de79d0b3668b4a3db70f61c9fc01078 -37ec51eab70d92a017d96cd8893eccbe23081dafeaf81ca2c9d45d38cf554c84 -99a6b479ebfbd96be8f7f4599b10dd45b4ac860ea6aa410f161df2b33c08586d -87218a790509800164b41e3cd0a7d30d9584813c42fe3935ee56c6f22cde9fd4 -05615ab2abac9dfcac550140c4540d6dff9ed67f530570744d0be3e56041e1d8 -ceb5a6925b3bc52c206f6dd87f2c4de70ec19487d2ddaf20ef6b26fcd60631ba -b1677d0ab695dd68b2a3b27a70b0b48fcc872991bd0b9688a966e72239b58d3b -2e58862eb4db390e169100e539c238299449bda356a0968c866ba0e0bf3b88f7 -6cfd39fe10ae30eb6ca7149b41e412cf556969b4c816a1945c0878e2a79e7ece -7e52754c8dfa755d79fb15e5576a8846307527460b6d9182154e23b84ea9d443 -7fcbb470e9833d2f3f90aa88d0e44b175a9358ad0d846ae6744c4b69a5e24692 -eb37b5b9678729be88cb9f84d2773ba99b29ad2056420328116840ccb475ab76 -27bc7efd2dbe6dcdf596e94c09aa959f2d43d48a80ce2faa7c30be324d18b8f8 -70f77be72199e931d5d5f3acf48ff8060e168b48d066b2354fea58713c1a5367 -330c9491fdb6fe9654a8fd66803fdb1990bcf5bf2d8665980d162f1be17663f6 -857563371b1056144cf54ad30f1fae5707f7bbe87fae41d2c683e8a02931de24 -29e66f35188ff3594f37f7ec5021e8ccf00248be459f80ef9a46d0344e153789 -69729194731a49135ae771aac663c0037db67200c9677bf1f39abbbc54802741 -23d36a35f128c1c35dfac1a29a9c1a488f6d7df23933488c858667bfe24948db -86bd0087f94b0c6325a403de4a434bf767c137f248c85257a72e39b51351d401 -8b530913ea8be8bfbeb039233bc3432db0b61aa281a0ce2f01b0399b066fde7e -abcafdd46c4d6bcf2924de2ed3972c01ae0213dc1553928895c2b541b1b254e7 -a1ae46069a110c55de12f66358815cfb07cf0de59865be85f1a8f2b61d0ebae2 -7d341bdc37eab342af148a05d0fa415b86cda706746c75e0fb71a610e455a64a -d8515705ec8d265f3e4ed9c0203744c86a1fe55ff52b6c8f4ba71e0a26651cd5 -fc38d93b2370b1e38c29343c96dd9b3d4a39b78f7bc7f2eed735f46bb46f96b1 -becbcaa7cd99ef23d16bcb3f38a605dbb908b28b1039d2ea1fc5d7afc11f1aa3 -798b407ec236421ccca18fc1f27a12d7e0b253039827104461c51ccb2283c9e2 -6fcb819b656a1aaf1b29821bcecc50b911d1a05330c43a0c6025ec90dc134042 -77ad9424c2d2e642a1223dc74ff16f70b54c0ff578157f0c701279facaeb2563 -cb3855872d3933c0a7be7b633e7e3ef053e1213e4cd7e1c57804eccd8026e581 -beb4c2fc59cacb4c1e7696d165316d7f3391ede443873c7ac48277e47eebc64e -3023d06ffccb05a1a71b64b7da4ce1b6256c4970b179c91e1b5d6ade81c151d4 -dc3cccff1d6ebd118285d56ff7631f2c7e2b89cd70b2ef7a3894366fd177c06a -39e3971747f671898a0109008e3190b0aef909597ffe91d7c7c2069b5680298e -eee7c04e58cd328c1bafac2a8bcb63f6d9a6a56f29f3551ce1d2512b5885d1b7 -8397e464b5f81f4803eebfc0cc632fb653f52fc7ebe2f64ab5ce16e840bd0577 -cdfa24a928e2888ef6171e43aedaf88616344cd64b3a2c0873dbbf8eb1fdc08c -cd86f324775672bc550241d139bdeca9e6ee36d49fbb117eb5eb456d99258067 -94ba27cc50585d2544b2f1f16c19ba41b0cb308c4f50039a843e66b20e04db1e -b0e99faa3556d8e95f4526f0a105d4b761df415148051c604077ce2025732152 -e6db72d810bb8d81c733ba78c0deb8799abaa20d3d77152b2dd109d70efb2bdd -7f17c1b79bcecf6b30cf0f852ac61197e0f601d2602205bc37708fb4306a782b -1f2a39bb03554a1d10100221f99ccb45b538bf2a94ddf8c4e0b10c62f4af712c -a44387b0038bf2474dbd2242c735db0d79246d73a43137d535eee525502ee440 -9021ae2414e9f443740cdacdaabcfaa0084a60ac34303dd559269eb088e2925c -632bdaae44dae0ae57f3080be448c56aa549b620d1729b6cc2974e571a5697b0 -4ff3e6f6542c4fcb2abc9261d97d6e6e60538d69b36c8189491a978a7d00b9b6 -3e62a1f51d6002e12d0604d53af0188e565ceec8ba572bfde122249dacc9d9d7 -75047c69ef0485adf9f0dcec0f0c926ab91b551ebd9b8f4aa03817c25ca92395 -518304be94b5d56bbdb833cee92c32b792c6a31f37448b319880e4cac35d2edf -dff530d0f7773e5148d41ae56e02633781cb2abb15ec2d94ae52d3c8fcfd3097 -45d95f67b560165f57393a42fc7474b5284c7cc0b893f84f8733768264ffa8dd -0bed83d99c035bd1a83597f0d614797c583ec8c5b96b9739f304edfe1e00ab42 -38f353a82e7c71d74877d8519add9b8c78f611174599512f11c22c10cb360307 -b262f1f78c7f9a85f1fd21e94d72abd413650ea6a69b057e021ada9787d06185 -c57c0947f9a2a81822054e855f802160649e25ddc82969d94c052c289f35bb57 -c77de5dfc63716c5b0a87bc7ed859663c457f080089e3d729b9bb1299050788a -79ada19db21011b01a47b278615be5359e71ecec7c06a67c4943e6106e152824 -ccb1fd39c485e90efebb1b2192d93c8bc52e356e51e5fc805cd7e43543e9c500 -d0ac85b7230350f9f403340a16bbdbbc3bdf0f7a571aaec4d6fdbecb288c210f -b7c244f1908305a0b1632a8123001175e36124b543ff92c16576d373b9bdece7 -67889128ffa3497ff846f8befaf5de3b7c339f049adc9116c9a7bb8bae435798 -08dca2d9c151d9329c345919930e8437054501bba38c2bd5102a20e4291203f6 -eece2f70bff3df08aeb8ddf1806e9657ee4a5e3fd5a8fd979d90d45734f14f71 -5d339ac91b7fa18a17be81583c08544a8a32729c17975014d629b139c0b3c236 -bc9a99231ffb339b7761a2586eac564be734ef37992cec6c06c2c93de2b340fb -3a27a52dabe69d9178d9a544430cff229335edd6f817bc52c690917fbf322852 -d4a7a709a593704568cf142b45eff164d817880cc93782c223247c65fa99aca3 -5c66a26093f9ffbc25ca9b3cf6b8ba478695c68212e80e3868a0db1a1c84bcdc -df05fe054733a1b794ed1cc483a57b97ca2e97fcb1ceb9cc2ae7d5e0e064cc8e -01cc628180359749622ac1cfbb57d51b25974ecb15dc83f99dbfba2d779adaf9 -6a9307bf3faef5d2ba5135a15d13c4215570e772376a4a4a3a5ec4028ef11004 -b93acaf38128de94531c23f114fec41cb2e2027e8ee138aef6ad017f5d97a600 -1063be706b65da0eda2234e7e9a9c27c084c4564b362ffa93ec9127cbc9366ce -7b74805943c9961be5a5b5ec87675b02f756af1b70074d03374ae931cff31757 -4145af416a9098bba84ed2d3ed44019257c0f34e7f94dbd10fd04fd15ffd1b64 -f65b2c02e581175436150a074de43f8e11fbc56e806486665cedbcf387504d6f -0687a13d668c69dddbc37adf91ad0091a770ee23850ae2fcbd6b9de9d8a8c8b8 -eccde66b7122c7b9602dbd0f6b7f7e4890933451c7a3904382d7801bcd992f76 -4cd41d74bc8723eba2647db7f813b465d11052e0f4ef593049942915c614ede3 -4f8f2b77bedec635eb3461d66cbfd4be1689a839b1feaa41c0f0fa23669806bb -52fea1fa5ab524a447ef3cfea4583a7790baa418ff8917388daadc5a3d1a9fcc -7f4a826c912eba5d4b82d4c29b639d56532b37ee9aed6bf06137a3af899c70a1 -ce4c9940e6ea87b6e274696c4a15d6aa3c17f9334aa84fcf1edb48e306640e57 -892b25e67c6f87e4e4cdf1a9cf12f69c0028b5fb768e839e1b8f75f3ab2d9763 -6e1be8c5a73bfa8675853695ee32887dd6df5f03f88e637d45f752d22f6c76b3 -71b9a514078c3200ddd2e998f33f1ae5c0a5fdc932f7c4727512caec232a681f -bbdec1a919bddaebf5efbd06869bcfe0637b72cefaac13f915f25cd3a926c0a5 -4875435ee6a413e2554fe4ecfcb96c1b5d8719e84dd34939dfd7795eedecbceb -786df32b6360bffed553a74b444a35e0ab0517cf7aa9c4e420e5bea4a5aac950 -54cfb55d1a1e57b58b8fb382e8ea2acbfb9b43d1ab67e0c1450ed3091758c1b3 -8155fd6996500a55fa5d134f17e55978d930425e0c03748364c46d3bef68a390 -649e09e48c2fab92108eef8603c70a977a388d4d24971296aaabcb932bc96033 -f648a6ada265aca938a6512f456fdc194f7186808deb3c16769d3faa850f78fb -58610c776c2ef3f208404def2940e484a801cdc45aeac88fa9852d1319159340 -3478b1b7f204ff297b67bddf1d38e256f864d3a83d6919ca7db1bbb1f5b8f6e7 -8ba272d1fb28d760618dac6f5633b9481645c9b8eb3a3384518103cc68aceb05 -5a91dd8def04b49d363b0c6daf63aef5d85b1e79504c23b3bb50a4b7194838d6 -b417b0ccbcd95a46834f9bbb2ac30fb2d9b9c31cf4b608e1379399a95f8dfa94 -53998a743c5a5bf33ed1e10177dc4a2a347f5fa4d09470cb5d71b07bf459c800 -0119a2164b143f03fce36c19384a01cec5b9080491b82b9ff115f795d969f480 -b7232d0375a9d46faff31fecc9351b42923e9ab6207d2723915d7843db279505 -280d70d9c80a1821a257aec764b7e85a1e8da7c40d42a0f77385ea66a7643435 -e20af708470f645046bbeac12d840fe3260ce75e20563014d9e2ebdaa57ef06c -0ddb55fdf6ec3e064312d13e25299b153169788e8a4decc095eb37eaf8e8ce2c -cd7174f44ee8f3875c5a3de3c7ce22296e99c44628f52cd3d18eb9215c34e563 -0ba85b5fcf3a211021a19945510c7e39ab56d977f74fd50ba8a70def82fa6777 -6930390700b4636330a998b535126d610e8a1cb63f618d69896fb47576857f5f -8926ddb4833966695a26402aecc48bbcadc04c2833afcedeee14254a9e77603a -5bb7b9de3c97007901143a7901c00b77a13e72940a6507a76164989e71d91eb2 -3080c585be2f8734909fa1efa7fc6a2464d95e4c5051fb8d6065a7d9a453cbdd -033626544b72108e4c4c087b4e4dd972893371ba7b8e8291ea4f98d03c61ce6d -d56734f17a66697f2260af9b3f8b9a36717b490e1ce649d839a66133da7742d2 -dbcaa22ff915fcadffa0383cf34c2290fa42fe23128e29e7bb1c59e55b7ac347 -fe66481f485d7bd09f55cb51d208d0765a510d5f6958fcd3ff5a5ed27d06a02a -f7ecadce4b4ac5f1d0210c5637f07382193d77945e249d2c4973aa43dea41dc0 -51cd72643bda4f749dd5846a9d3a7346d39f78eaad738d2d255df0f0cab5fb10 -96a0ac86bb013980dedfc84ddfef081700fc3c66b6d5a125c9e83df17d92658c -10d79a8aaa222004c20aaae6128132c64f96a7a7c869489a63860c15d53f958b -d6fb81cd165bf253d996c15295f7c2fc52c13b51aded1c774cb35a0ab258bca3 -ab438786ff7e648f42ab568fdd9cd598c52b5748b0c44458d4e0b8080ad19cbc -55d8aa1a78cafed7bd41a864488d8ab0bc12f6689027c65c70a2b26bd2590026 -3e80ba6189672adfe377e9fb516cc6bbb0f2e341dc9e2f34a8bb00b4079ea28f -7c8138c415306e00bdd8e71176faf06fac92e38e8e15dc6ec6cdb389d1a15310 -ca67408a9686f21bf6fbbfa7ce032974e2b860a3a72561508bcf22ede4122185 -b83532444134af2bac5ced1932c9cc06b70160d0cefc8f76ed1108b629e81060 -ce6c30e0bc9ac232fef7ab1c99e21792921bddc20f2afd3b083dba29641458a1 -1ba80613610b01543d336ebc45ae15c276c9ff18fecdc0cde3be18e044497217 -b9a812d926538fc42871f439282c1717833170bdbffbd7e2034d794eee9177ed -28045b2dc45959426e35d30fde +1b2b9e8f09253b61177e95ea219474796072f4b363fe05fa763773acd59cb757 +ae119355777a1bfbd6751f24f58ee0133199ed331e67ff4101e33040d6628f4b +77ee87860b8e32a4923e2c1fca43cf544a5eb1bcd649ebd836daecb23e3a986b +9bd8398e690be6b48bd6479823a435defe1156284048c4d49b5a869164485630 +3810995159568b3dcf3734b11a3f25453e0e8b40b080c9aa94e140a58d5ebb74 +7d1e083dbe00ad5498c3b19deb502dc63d69032d8d31e6778af4713c30404059 +6a862aeb8cf607fa52a9348e3fe23c1a0296ddb41642aacd6aacd2c6d905073f +98b58ebd11af774beee32533fa19871148dd6db41f3a8c499f25f37cf3955eb7 +bf5bbdbe984535820dd33f60cfe7c2b44ba6e10879b3c65948beed00a84b093e +8e4ea07e34955aebfd0ed462afc5b4b42c5b8be85ce0ab1b9cba42969bbf8a36 +e2943b1d9b20f6ef3416e226763f55a196ca0d86788a6b0ed38ec5b0124ac901 +f55f2f67306ce94aae5809b2203bbb5a8b185b66b2f8a18a456d028f62d8e17f +4cfccddc0743fb02567f0294ab77dca0b9708b262570e3097c76769bd590a09f +ad1523e3bd1ed5fd8475c0b57b95011759d1a55c70b39970dccf76069cdb9690 +68a4626bc863ae1d579604011354cd3ebd51b54a1ba9789f7678546bdef64c9c +51cb6f654c25578c3b4b7c2bbfad476423ab58c57f48b2a54c9d44ad356d106d +8186a85f8578b1735610f6767883701431f5a2503341005020b639f45810440f +f341eda457f8ad2213058a3369016452185f849ee25140060264a04eda7e04b8 +afedf6924f2da0adf944e4ee346e33735f6e78691634e18c4179f28fdb673ec1 +6a2b093eec51a4611030ffe1d4c1a1456e3ead051b01c94e5d9ee94c855cf31b +b8e544e687f2e2a99fd8865ad44eb929430ed39ac0985e4a5c382e16aa2d6ec3 +3b396fe9643124dc587fde09d3d867e9efde49c283dd44fd33b04ba4eacded81 +b3e7d3f7c09d565a6412ac30fc8e81be8821a9031850579b02cefe615c8e7c22 +61a77e73f5382e58ae160043a5defca7470ea62b90e0260faaf5a97a7254b091 +2a187ace29ac6adfa49c7d6f35cdab93ad32553137363ba2f0dcbafd40fa8ffa +7747eb9bb51dcd01291bc073331531dbdcea7db24c9a0302c9896a1c2cd0191a +d88b33d0b0352b356c93987ed9613720cf2be3b164c6a4a3360bf41c9f178831 +62fb73ae514d9c57675572e8c1f93313fbd1b05302f57bbebaa2e76feefea0b8 +9c83d511164b53b481bc920f40d59d152bb1f5674344801f0dc7e71ca5de4e24 +cc79207c66d0b692fe7c1c258be75488f2a0bfd5c81ec5bd0585986d0c5d4575 +82e9ce40b7477b87facaa826ebf147bddb1dc60788dec671c199d18dcd2ca48a +4653963ca85e8944074c501c8143685306d4f133037fea449b0d1cb4ab3bce89 +04a311f9410984d754a3509f51d89a4ef73ffa7f9f3bccd80daa0a34e0e10912 +b7897005607925758237d0bd3b92ac9669b1a1dcf19ff0864f84a993bf7cf266 +1d1b3981fbc5e4fdc3a5b70bd79bce35c6fcfc0a5aca0006433bc0c120073e96 +dd4ae86f022260fcfe119fd4655c3bf00be48c470b0d86e721afca140fe6bf31 +836d578fdae49d71676c77ebe2d09016e1ab71d7c681c8c0565cff9b73d79920 +1ee2def2f16d65647262f96082dd5c44fa3993d3bd1d10c217ea56b73b38428c +767dd9b71530c5f01be2d2611cf9644c28f3f52fd814e463358d70de7bc6bafe +cd377b48633d0107b05ad2472ad6652a1ad30c39adce69ebde3aadb1c5fcdaa6 +96fa9b3c3e63a7c4dac907e3b5cb7a3713505c5ad53c8dd8710acdb3786a919f +b356cc2695cb227540a5f235ae1ba3c6f3547ff24606651e5887fe889cd8913d +de9f3b04019ce0d724c1f6521925bd4fd8154f6f4d640ff94a0b0b027e483f9a +bd1188942cdff486f1a234fdf8adeb552b7e7e10aa577ed3d559010aea480709 +fa1f644fe5b7ca3479599a7e708dcd3ba33a6b2d640f8e39492565965e3b7c74 +bc8c48f3ea9a6048e86197146abc446788a3c83782f797cd278ee1b740627726 +3e1703246bc561faa060de93d224ed3eb1bf548892bc64806c4e9186a2b276d0 +fed43a3021b5a54530de20db8168d44e1947cce7fa1dc8f7927a591d6798c5a2 +b51185c3e74bb6ac782af6f089a4204b6379298617c8f67e38900ac231610ab9 +79400dfaf270c91679c516d2062b949a8d91bd5c8c1a0af1e7401489ad6e8101 +b9103cb5f50dc53ddcf2b32afa218289e9f1b5e29e5c5a2a0f67238558343524 +78cb11a68006685e13f8b9ae54732c180b4949f09839b935b1f7a944f1d4bd84 +a5074b583202cc4aeccb4b8e18096e258bff705476440b9864e746f18703321e +5d5e2f8ca5e2d07b195779f6a0d6a731116f1a26a484fb0d9931dfaafef53b41 +e56e00f32e3952261c0205afbb6f2afaffee7cc1fd39b2e108841f39dc8df97c +0f776adaf41423b47c551d48add01398dad167f4590dccc3106a5a4386499462 +78831779383abaae807b3b03b5dbd4b973219f2d1d19369889dd72e446ec95e1 +37017fbf85f4064f81f27cdb4f9117be248a8d5a65225edca22e833df98da456 +98a428edafa84085c323399562865aaa8286eb5dc63dad6839b597386e0558d2 +11bc45d66e0e60a86c968519b8b305d5ba7ebc2fad7cb5004559544330668c1a +7b77dc9762baafb4190dcc1aae670824824e00f023c574e1c017e33650e24fb5 +d4ad701ab8d93f0fd91867bd21299867f966e93cd621ec0332fa04a2a691ae0b +179d1dd6364166f94716b69027d8d0bcfc6622a086dbe92198e5c625699d0bbf +a9dee06d20554b4d82584108208ca24d7509c4ea30e71ec44f014f8cd97b8eeb +f1322fd5b116009584559a3b0574e24329aef35d2964756d50ee8a0fdae1be91 +19e20fb52c3437ef677f37b549851cc9bb60c04cbee8d80b6f1442cd8676b0e7 +bc4b2c4883d212135bcde4fc15eff6d20269a6f4463b12c214d99e68f113c5c6 +7c2d25384d8e7b9eb31d79e2c4607421389827e2fac887dbf08a43a5ddbc5797 +797a1fd10143a4e97ad79bd0bd7f3f1205130061a6581a4d30183e71fe80d570 +42083823e3ecdb6d6352b6bd54413a9b6bbaab94a76d12ad93ff99f9433e3ec6 +bab36ccf8168cfb64c4b15987379cc129f6c7c1761df5d7dc46e0996e5588298 +b329b023056dd59f4befb792c4e43fa095d63df49b6e25f821b999b56ae05919 +16346777c2579ecd17b5a87f1505f4686ba2aad3045cb414cc65cde98b92c76f +20a9be4a42b77e077b9c00eaa3914709c3fc1a16787e639a2c7fd9a30d9e8ffa +1d5a900dc9cfd5c319ec34570cb758bae3a342d936a30915dbd5160922aaf241 +74c014836eb17224a681c1d7cae7fe0d0627bd5af08286c59e2640cadf9e33db +6636197d955a073214899ae76156146452d063a460fdc5a82df0eafe9ad88a24 +905f7db7dc8097c0d9b0f9319aea0aaf7aaed4a85c93979445e8d1e5a9bdd3b5 +4d74320a1b797ace38376db0b2f6566432b8a90ca4fc7842b90623603f7aa2e5 +a2f0298157822d42f334b8f9f80fb04c36bfde0eb1187c1b15ad0666031c5c09 +62bab12d2476f696939130c5b59fe70b61320e4510be29e04f13236cbcc78a8f +93bd11c24fcc4b45405a13a65ea47c13be1f82075662c316b4de144f89beb6aa +cfb84f0d288c67d488faed8dbfff92be9a24bed443e9db3f1deab63ae94eecef +43ae1d68455826cb3a48c456d7e9a849a9822c77503e5b9f029fe70168831ea5 +2ec0c2c4471627fb5f2d03bdf8726bcce14a8a162bd9bb26137253ba8b581941 +e759a7ca7917d4244da33f45df6684d3dc361bda88b4a0a02e5e55a1efb0d851 +b4e418bc6a0e213172a08b7596b1fd93aaf111f2778006da546ca1db88d5db98 +4ae9658c1d31adf6ecd3180c19791c85a0ddd1547fdb800479a6dfea56ff1e11 +9b3c1dc388c0f372a44712954373ab66cc420b2cc80a92c2fa011d91c441bab2 +f54dbbea462e186e0617b2f3921f1aa33dcd2c1c5eccbcc37dc50bc29d0ffb03 +e45372aefe3b44d8584035f3bf5ad94459a65fa170516c271b722a2f08bd241b +7816ae887856fef57292179987b26bbff4cf1da6cd2bb092df2f6ae3064d61b9 +e7bed1d13e534b991610a2c067a1c107ec6b0a8dfa6f6c4c2539c8747ad33057 +f5a9d083a689e34c8ca2957263786c1f78cff0347ba42730544865be79b7c461 +7ebf003f8cec1e4b6af75689fa6f6dcc317c7f6975df451eada5382583a1d1c6 +510ca60fd85e55c6e16ed39a86dea378d6f41c00beed05ff2f9f1a2219e6838c +819e9576e4ef216802c4a913de00062e70df8d83754166a27708337ec6b8a031 +04a426a1c31371eaf807c8d638d16e6515ef0693651bc2dfc870a1a7e340d504 +be0feabf24b5bc879e75801d188856be2225a82eae90a792fb4e0d66ca0c4a64 +a5064e1c9c2fbe84b5d6578c2af56fef340a49911a0a346813fd5da9e694726e +a0dea4f42008ef28f8d6ea9f974327fe71889fe76945b30fa99c4c8c7bd3c40c +ccaa4f19c0e0e0c4cc88611829bdca334cd69463228c2f83e1467125b7eb3c9e +812c62fdaf831871ea0af75efe4c81224eff156fb21bf1a27123d020beb9e1a4 +d72626ddf4dfd474b98694e87ef0691b71a8aa4d346d03eb56e0715d8f6148fc +424cc472407f00bbff0cb49d05b0b5923821fccfc27869a85fedae1ecd60b31b +1c8e8810879809ec069ca308454613df0f673b5516598fb5b822833fe3e0c0fd +1b3684f7a66ff0f9132de78d198fb6dd459c42208ddd13ecf433d4c9901b0aaf +4c8ca7685711deb49d9a2cfa4209a0d058aa8490963164652bbd3cf858e53975 +0af2b20db08bad60ac71809271597b65071e7946d81c02d8e8eac13adf5d5249 +ac0b42f5c602e16b6199dde3666d58abec0c1485ba6ba71086c36481229891a6 +89bd1c4d67e91e5ad6d75ae80420cac489198821227c1ac94954cd0c94098773 +ef4313cd8aa49aacd7d34bec814e77f9aa794e57bd14f678a5f3d9311036fcf3 +d39a94b0b23b982214469f645fdb728751627c28359d6613978a340b2b2ba9b6 +a0304f87a77389a09a36a660cc983072063683920005b2434951a9c8ff375cb8 +17ce6c78b6991ab5a5efd7dd4e8b3171133da1cb44af59bd84724150d09f13b4 +39a1046904d4d3ec3d2a90cf5275a9527f8c3c62a0ae24a60e9e7d1765eabd75 +cdfc9a14c4043fd34ea73afa2e08cec40386f048879987699fb8123ded9709a8 +75b020943bfafac56dcbe4a2101223949b0179cf7de6b550657c91bf3116ee7c +66e23e4ff64cedac326536ca1f75ed1bc7113f0267ea7a26fd44728714e2a1a3 +13e88daf24c9a46de29e3767648e961b346ddc72a6724a0857078c9a2ed39df9 +d17c65b89136a6cc0c954e0c46e9f23900c7ce91ae71d74237ea1128637a673c +f6ea0c8286ef99801cc6d45bb780e21c5a7464d16f77b45236bb9819ed3a8c4c +7e1b15400eac8a99511e77effdceaf8af6cef034b79862eaaaaa00bd02f5667a +c1a03c0188d09fe4d1fcc0b0d3354c880b2943b9666224238db22257a3873b36 +be9a8a55e01165f4e8d3c8eb3521ed57aa834a4f88b97f2fd77b3b3c39ae4bbe +869a24a4714476b3d396eff67982ba0a8f9ac34bf7b247951c0c241a01f347f7 +84bf841495d76f9fb2ac130779145677c799a07678eb8a3ea3de9fd00430d46c +b1b3b6c392afd853df1d0bcee9a053d6fecad859bb9bad0bf186a6196b89fcb8 +44799928b4da77817a8cd1c36cf9515090cbf63f373aaf151154a769cb58704c +2c0263028c641e1ae224235cdb17d89af5398f3d1daf44254089e6b4db47475a +1fc228e0151f244b025e5c14411c8834486e483e4cb4406752788fa99336d980 +a7a6e6f1afecbd87f2c615880f3a6bc21524abd7076eaba6ea1bae0f995fee85 +f938283c60a7a1dfdfc053a8353051b18bd03129dfe6b472e73958d11467aded +ced7829ddf6e7879dced36391a1d113cb87969b0465d64b96b5360f774a98596 +1272aefdb74ea23d85c8af588ae0f6b43ec47292c880217c0ad03d87e1cc22bd +8117ee06e36394a8fa5e72cab0825bc3af8bea7256e7f8abe7fcf57a38e38df6 +b60d783d56905a5d7794904c0cb95e2aa835145062e022b159fa7247af415890 +117a2c9a99674891b134760def15804badb8d4ae414a1410886eff8d5284b042 +9586db6610fc1e7c2ff53f19060e6b43dfb0d8bf8dd94efd5105ee20ae0bddd9 +58176c666d2ccdbaa1a3b0a8cda0b452409c8cf61b9e085d9a9164b7eac06dad +f878ef8ff5e36bbd6414aa86e1d73d211175ab042ed5ff72030b44aba32b970b +917282a1d69f3005b0a110f90942ea6f9cb2d9eb57a43000c48bfc2af2b572c3 +f8387ab21c90facde17d772ed98280b44061671ea4d98e901f33b8a8bf0f97a3 +d87d0c4d81d6e29d895f50c1552fcbef2df93a75e3b0046c794d20229d7eae01 +7f230053c4c2f463020d060b8552cfd6463018b4c03275dea0ac42977b3dbe97 +3d7efc22c9ddbf499f2a2358f6287a8c9946fd16e6e998dc763b5abaa6888484 +c2430f2fb9f2b0ae84984af32ba54cb191274f7b85695f5faa3cd5eb154b0f1b +fa2a0b9ae93d591648d33b6c23e27f9a18e0b8548bf1f45158ba7c171bd1136c +d045e9dd27e4f23dbfe5b29a66695628a87949cd0d4d15cd066916eeddc6cbc6 +f0a5c77201d4cd352584ae70d1b8e4ad2d5278a472d230997c7c03d16cb5ea0d +d04df0bccfc7a277a0ec9516e10134a9ff93b3e6267c5ede4e5b848bdeb76b87 +52249e458b602c175ce8717e89da05ceb850d2538c340ef6142f0b5cf5906f99 +c271b6e5b9e614d64a7c72372835ec4a99bb39a7aecbc41d021118dd56d21326 +c818bff4de332c9c00e96755e71288117c19e3b920c23766f249b1abf4ebb173 +3f9d38f1772128cad4514c4c06fee49abf401feaf2368edf5b4f78fb13336189 +5040b953d2ec56876cc72fdf69ea7692da01a508c2ff7096e17d78e2f61a04b5 +400d9c28610aa8d48b790edb4bd5cf08646923b0d5a86178956bf7940f291242 +1c4f3bc76fd991e36e18d40f813095c5b9165700cf94403b23b2b7887458c4d4 +4a4f160ceee87c7d50fb4ddc3d4e3242d9ac170b060d472889e553c988126096 +dd343532e74b54d664d63141b1eda0e6ffd1d82ce4d084352e97f09e2e05a17d +cd8bed5a8adc08494e5ba8b57ce522758413cbe5e5d74e6d3b251a6567fbea78 +5d838a9506c98691e0ee47be4421a95e6b02e8c66aa06f9c88b0ab94a1a32660 +fa0d8a24f2d5873ac94ff8e0670b96d4eb007ab89f1c77e0f1d1be46155fa2c4 +5930779b70c9a6d559a3646af2b83590b2f1ac3a3f1c9e8d465e145c69fc07cb +5df5093b7cda7f1780def8060d7daf747491b0486e7ca427857946d2f3d0e22e +018cf12b04b2ecfe3accb88e5e52dde2d9118a1747917e6a9f211c1d210b2b15 +8f31adac46b63cc00beed35638a2e8155805bc068a00b757d6f9dca2ae540883 +11ed782d682b511c557ab8c413e95ea8b6dd3a6c12ea9716d670fe4446629890 +d14a1ff76cdb4eb9e2ff314ed9094148bb33db76e4f6bbd5b6ec76aac13c6660 +38b1790d9c6ecf2f33b6d4ece409f012d58a75a1a4ef5e580986db61edcd97c9 +7ae81fa20bd7fcb07053311dbd6f3f73077ddd3949fa6dc327ad2fc056a8b798 +53b22c193126e73803c83fc4b7bd9cdc54c2fb1f6353ebddc027d3925bd32d89 +219a778cdc38e5f9621b41a27cb8fee8ffc1a2fc48ebd25828373b9bca8742c3 +0a58b2473a33b4805383415deeed7197a840f6c39267de16ecfcafe7d585f672 +b5ff6bb9d143e8e615d349ed779b847f2b5930aa83b08792e193d64aa163a090 +586a383d4ef4bc273f162164154d9abe6e68e23078cbbbd0a357a771bbc427c2 +3b6a3f24401e31edd9fd7091e8849c8e37d83ef396dc505f8f843f4ef305c505 +53776af2c088aaaa5a5efc05258cf692b579cba82efe7dd3f3394d985a5518cf +93c258a168969d01842a624f56b4a6e50fde64083aa7cd0a8f3c0eea6e6d9a06 +d24b1f96d34d66c2fed66cf844b490b537561865299d18dbea55e025643f78d0 +2419619759dbcd65ed0ac4a2866c61f37383902b4e1665b2fd9414d348b4d41f +ebaf2a1e4bc97f5497de6237170ec27597c98e6cdbefee9c6a7b106b3b6aff2f +7dbc6ba1b2d145285029bed2766715781b230aedca4dbe0c92945bb7954d9fd6 +1702f5a981dc0c5c876c28659d744803202a5929f03db99b32f776a794afbec5 +3f03ab51fbdf52c98de52fcae577c7ef0a72cb1f4170bffa48734f1df30ac772 +9f23e8541aed00a2cb2bfa219626421f669494c472c88e288e5698541185b862 +29881c30d6b6124b276110bca39fc496691eb1c61432cf296b055401f2f63e03 +22b0f37395a0489a031945a21fba843a881730d3298008bb4c023b24b195dd5a +1e30b76210c17a06095e3222bd39ff2b7f7b6366a173a9e0cb527172e1da2308 +5eb7568000e9e9fa521f977c341e7c4cefc883522696ab5617d6f6854bcaaafe +ccb82352f821fd30f6edbab80310bfff84779899bc62743894dd9e726c6a585d +b4a2883fddf1d1ccb7dc8242c6d0f16d008d551ee9e02cddd4a21a28cb56bba4 +0bcaaaf95dc41650643302346318e7eef6bba6f4fb6eb956f99457f2d2ebf601 +65b6b1e4405501ddedc0d2cce1a9cc7ee6282a2432e88ff45ac520a8155a2b4c +4bfbef1e1a860ac2a2f2d25c1bcbd864001a54be48c3686cf72e98856e8d4e4f +2b3f382c3e3a75bef479a567bab3764282da78b388d27a6dec10e31db5088362 +d3586e219c55ec4e24bdfcd77b920f5ea332d29630559785a900d05813400556 +d1d0721754258799fb25bb59a79699f6f4e56f0e58f6748bf8091d848e4bf22b +728c913b0db74e9bae863413ba5ba04ec732d6f50d838424dd1a47b29e51aaaf +8ee4831f52722e1627bc84cbc737535206f251d92549b8e2d24bc6b3d2cd5687 +9c4bdc972846bceecb47b5ad23df0a82cc481e37d74ff3389ad3535d0d6254d6 +d8ec450fa1e3b81b7be26897b75025a64f480dada26aa777cda828ed66cd65fc +9d02717638bdb88571460a45aaf9abe1b460659f7893c1c64008192e38cef686 +8a076a626165bb53e34766580ea78b2bb63e45d6fa0ec31687bc4f243760d452 +b459dbed951640b1f5083a19705a3384af93eaf503a000e3f2384062bb52559e +1e0d8bdaf66cdacfaaf91636d01f7a76dd5424b7b620a706304cae6fc50f0dd3 +8d395cf39dc796c7ec271721e13b1dcff35f06b5bf5cbb6b2eb908714f4fdd35 +9763585e39484118b080504f1bdb293321cfd1b2913fb217c7b41d7212b1daac +1c4d770cfe91a1f649d760c132fd77024f7a0a4e8d0cfb275f5435f3dd911be1 +1db381c01a9c04645631fd9e1c871c5d2c91ac39a18d8b9dc563633d709a909d +614024729bbb2824c33c216612efe88278d6b1082e18f486631fde76aefda526 +2a194ecb406ec7315a43695256b1f7503d323c8fcce1f572ce5410edc931f97a +fe2671156d0167b444ab02691b81fa57696d07e235dda15640ce4d2a936d1dbc +a0d1f41aff8f3ca1792ac1c146021056a40ba5b30278222286a89825638edeaf +429cfba89cc85ff869cc5d51e41a8ffe937e03744732e3fab250127c9eb21d53 +48e3f6fbfa7d4abb16dac3c45e68e355e43d59c67a717495a6acdff50208c2c9 +7ecc5243915c0ba12e420d4fbc39c5332db7d681e51158af491169d7f7212fdf +47b9a9dd0af18a2c28bf94199e0480f9cd97c2ed0e79a57a02adae4b0cd3c1c8 +f91521a111933abee28bfa1ee0810db409fe8dfa17195a9a7637f180ec400844 +e497a7f9cbafb57866834f37b2937cd71cfd5a88eb86b64a01e33e9a639ee133 +89460417242cec260f151b9613f6aca727b2578770e86b45b395b951caba7afd +94c3442bd844ff531d069b8a2bc52710d341882860864884714eacfe23bc1cb9 +e4823b3c2315c09342cf097030f14fd7e663c2d030d2d71079b6d53799e5917c +9798624793a0f850b6046e7c987f7b1b01b586a83e8fea61486dcbe8b1362ba3 +a2ddf29c622fa55d54800823824af57e426b41b6aeb440da475e13240445d467 +26a6d4518ca92a6003209d30974a40872e176ec005233706148979aa159c2b7e +dcd5136921bb9116855f20b0de9f99a919854a9fb381d71265dbe5375b06ffcd +490b11631704a069a04c0cf952ea0d9c4176d5acfbc48d8a48074357b1b4a8d7 +1a9bff215c77e14d23e09393eb10015a5474701d12005e66a31aaaafcae6a030 +34e2281bec8d06f7b41e9b2dabb7783daec99bc7a3a8dd48e90d36848efdde98 +c09309fb1c506f5a1c0af132020b07afb2a9b3c457cb0f1a66684e043872b794 +534308404c4d7faeb296d9f1561cac5fac91f4b02f89b429212c58c55cb96fc8 +bd812563b864833a0f9fd69422d24eb4a4acc9cb2bebc4ff8b9d8e891a63babe +c423cda2fcb7cd52a04774b3738108a19eeb1208256540bfcea23ba55f4dce15 +e1d176c21f166ddc1c2bb79b75d40e38050c6658a23c416650a1dadd17e15584 +b382a148d2df13b0d186484217ce6e11308856598534befb42a76389263e975b +0a17b79be1c651630970b99d5956213b5da9d41d160dfdbb14de1e25f83725df +ee7b04c5f1eb6cf4914ce25d050de1e1fd701490f5e4d82dd51b28cdd8cce9e9 +e39bba025c012e85b2b1c125c45943798f8b93c791b06f159bbbe9a3ab1e0fde +320164f98cb091b751a57d86d15a0fe812f9a8de5306b3cb033c9e7eaaba9054 +54af59e9d61518b06302c9aad9a4884c222a41898ed8e340c7b0163e5152a394 +ded4c2abb46fa6e763e27b55fad2c1f9c5e4ddf0bc39fb7178f9f5c84eb6d793 +04815fb8fe12ba84b91019d3c52d36febd917e5fc58c423b5c9e09ea31bf78f1 +da64ca6686189475dbdaa3fa111c24cd98c82e2a9f4c768969ca12ab4d160b85 +7aff1f4af235f5127e7735fd8a4e1f4023de13c477e98d7190bf7b6e45b4f867 +38f0c045e958f0e2e20fef19fe492044c0c04fa16a3a0d33dcdbded65d83cc01 +38ae67b6b6c82ce18705e39c04ad8308ff32f03939586fade451f2dc110ab4dc +fb3125e09d8edeeb9c0ebf3d289f9354973ed883cc9df86e126f0cdf91d07622 +8d14814c51a72aaf37bf555a0e2e8ea5eb932165a430a9d0364247f0ef15886d +fb61e13710f14ee5ff73120542ea256894a17034c5b5d2db4089ee4ae8a5aaa2 +cedfa0b8453c045c75ccf036b34d53f810c2a219e2765e0f6b1aa7c7d78dd6ed +27df905f4874e65d79c161371032be490231487d9b877b3a2c6e8a9840e8f421 +7c2a536aa271ac2f44ee7037758b75f5eccdf5ffc7cb94cb100a8710a118e0cd +cdee5ffe9a3cb0797b1015e78da676e14b78a252fe4f86deb0bda164d4058b46 +3cbc28247564d64fca96b4e6f54499e08714982e495918059ef68b396226aaeb +e5ea86f697256fbb59abc1c752d459d585ddeec5792b769e8f1c55c79f9dccf9 +cb52f236496e84fd5e9a7e4e63d037835b976d5cbad20aa538a07fca3e44ee5e +f03e7b4acf304a825c3d1783a46fe5c046e30f75e8935fd323a022161f2636d7 +287b209d2aff608abf3074cba61563cbe724afa0f51b8e2b49023d2165aba623 +aac35969666595b7f010b911eac958005ac45a5b756a9a1b711f79f2d64067a9 +d4258ff5e7b4fb2142de1e561d8d098a11d63934a065585dafb5693d7b9a546a +ec40b879bb5b7c167e85cc4e9df665cbf0ea67d12e230d9bd922af96eb39dfb5 +e7bf1751f575552d9df1da8402ef816ba3be8f3c19b8912004e1da13463baf48 +ff7b3b33a57aed2a3e9e9f145be50f2e84900daa0b996632263af132f7e6b374 +35d91cbcf393cb46649ff8ee35a93b7e27a9bf39734b53cf410ab3f3a2fc4027 +af2c873a42c13aff732acc9bb83bf2862e7da328eecac95b7c0f0bf79744ea95 +363f54a5b19fd37f0282ffc0c1779d733f531ff661381dc983de2858e791ff20 +17a15a90500c579a5f61209d9a1f503788babb313bfb33f3ca0732c984c398db +687dd0868699e20655fa21040c952224811bceceb52c86e3666430e4fec39c47 +4462ea17dbd53ce9feb02d52615b93ffd7928c8f6d24b3be92f7731b8b087c0c +1d51c663dba72b2a6879c6f55c1de28f339676d7bb9af94fbe12af5488d4b3f5 +b529a6a3474e3f0cc46869343243748527080265184bbfb93eb971bdcb298e54 +16030d4076d4402b653b180ca984be40eebf024d2a7faf3910fa14a5545c6242 +fc6d8a9b6380cae5e75df338e07b8784bcbbd5369ad30a2c6a7ec32cf5d78219 +41b18b7aa533b522565cfa592c54a428813751b5943328dcd2c6a622ebd2ba11 +c6d2d65f03b4f419ba4375c714e62974b83a5a5c4392c26da2650e0ef90e5905 +402cbcac72fe007cdc6dd09bab715b7776e327215024acc013cc55f0a3a26859 +2a02a0a9f87370cc81e5c185db2e6090b6b2e947170a41ebd0cc6d71a264f0ca +16eb08e781695fd8d35777542ba057443ec42bf0a822c27327b1e064af38db65 +9233639f837a74efb758b74a117ec8841779afda95ef3f0f916c97936ec16bbe +f2b917a8e8e686aca6930649129fbe9dfd1f8247b34dbc586678999dbff6a12a +c51c1881425432805a253cfeb23c5ea0cdf05c62f99d34aa7f73d90272af0969 +68ab75f3f1ebb30b5ddd6233202fdae3573f67a51662367833673f7ff1344346 +446dcd3e29699b9028c7bbed09471ebc899cb3139284a914b98fabb1d50119b2 +347ed0d201cfd78dee828badc1655fa2c70191b24e20e699454570fb31850dac +38ae12ca5cdbbe2b0f22f0de8ef8b927dc6c54ecf3801e5c2544710a2e8f726d +cf297becfb7a93b4b422089200aafafb934334704c3d384379d34147f7d163af +3cb42599ea902106ca1befeae26d641d49b7a3490f09bf16b8d17c026e40a2f0 +8d727fa2aefcbe4ac82dafeef86eb672a95f413b73858600c7d9dc544694e25f +259b039558da35ba48443e6c931f6cc6ed108e765c879314e532d888a79c1b2d +460204838fb662dc90465032792f03f18ceb654a379648ba449922c9447c00d5 +08b81dddf1fd0304b2b803785ee94ae63b9700b36fcc894782782f51f397ccff +2a1734032660685070d6d5fe94636e6de386bf347f063dff5819b6b8554ea416 +59da8bb46c01807fdc883e15a200a6cedd4b95810da0a805c3d71c6467d84899 +6b88c60191c3a5e3c4dff6863ff024a5c4d4092164792a397b7d390b4306b56d +b002e6533752ab431804dcd2ec8c9cf242efc7b93dd9c3fdb21824068d3abb6a +831d89d241613946e097ce77a82f68c92da11dfcbde58e3450f2830a3a049bdf +c6e9bdff298b4800f150ad3833a612643316cb420af3db29f008ba36a2ef0181 +f64b4bdbb6334233c58e0e68876a6d2048db062b61a9cd020ed7ef071525cdb9 +3880a24eaeadf171b5c077e4de8527b5ed5b7e5005f73c09b2279ecf72e1ec79 +a3e4837d33cfd614e6d82df617f77eab048e71b51b3ba4334d8be27798576a28 +a21ed866fa75cd39ad747a1fea7a57446111ca317372060aacb159ee90e5efbc +dc5fd16b41a5e63363b41f13c0160f719ce353b913d069e4126743b420562d52 +e56b970fe3e660f4a850e8ef45f7262128f936ab5610401756ebeb0d9b5dab1c +8ef2d95e0cbe3542bfe0c6f29febf3f5a39fbd16a5c27d652c4a0c542124855f +4b53071df5537a5fd5bcf653c0578b4e324bfd7587ed10318333382ea137d90b +f0f83b4eb5d4796e42fb7053d4cd9feeb842d909cb67ba4bedf8592c876a83cf +48e4a2f7e92558e57a5cc6c3c6a4eddd68bba96359eef224fd78f909e016c5f0 +ad7740a686e566386c4f000764c8b6e97a1f3e9e98b047f75cad6b84d502c377 +846904339303da4c0436f1f67fcefa9fc0581f769b319c38d4221576b74b949e +532b99ed1cc90a2de4189b346dab2d48777ba5bd5cfc80bb15f0c8d4f478d007 +b84aff3121f7c0cc0887dc20cf195b1d964e14685acd86aabdecf09337ac26bb +b0e45caec8be479279364fb840c6ff36d164b7be25f9f811a466ce04c2ce5a77 +4ee329b9bd773657737db17709d3a6913793de0357bdea11ddd259b5bdc94e1a +bf95d33b8396ae9b26342cc1d2a2831e95939a0ef5f13443a9150f35aac5623b +cbaf6cc5d24d51225c2920e3bcee9d09ca5c60f22b07f24a26dd856f8efec9ef +b184f8a92781ea228c2f15ad9ab1da75002c9b352316a588d00af46a86b73aac +feb16d461c9cf969977681a88806c8e6330c1e9e8d428c91de717fe3908802ec +38abd40d988b018fd7a4c02a20f2f3c18d8364fb18692c310d4d1977be4108a8 +56f807519b471ded405d1e7ed6c02676970c2a1df6cdcda3b38edad9b5cee11e +5b221716f3137083d4a433e6af2eafe4760b0cf8ccbd5c15af998b5d5785a3f9 +b79a81aeaa9a6706b2dcd217ed437b23de309a360ff60ca82a8251be5671a625 +a90de4daee9941d44d8d1e3a19399f13b93d9b567b2ab2f9cf2b71058ccd9776 +3b6a3f95ea470066f36b343c0429655f8f25c89e65074a52cc6047885f4105de +2ceb8f80846530a88228b1f44c73e8cf8ff1e99d5cdcd3c91487caba9cce19ac +bee693c2479d8dc2c8799895e188155502f957b20e26619874cebe43d125f6e8 +638092ae98ef4429bf719bf6cbd17b1f1fd9a7c90bbb6b0b34614b32234a7f4b +1c259e4b10ec72d3a2e5526473e551450a11d8537cd6d3dfc472576307ad3354 +b2a9c24ae22c90aa37b1ac70352969e2aeb30d0fa894724d5e47a87e7319bb35 +7b76e95d7f665952ce39e05815e5718a7ec0d09dfb566e589c3655e87588b6b6 +95a272aba75b07eff8041298b7a1bf6fd1b10c5ce008180940df9f4235fab68d +bc3d2ab597192b0912b5d9486b5c8f6cd5238cb94a0c807f4baabe7e81f072ca +0b626d0a5cb1b8254a4ef588149c84c53d27ca3cbc729416976bf6a20bbed57c +6c0fd85c86dabd7ade406b27a8890bef705bf3c5c8a59615d858ca2707c47404 +78f55c4d6da862b50f90997989ce492d884f97482166d5ddd4eae075395d7be3 +cb0dfed4d966b2fd24c41acb6ba9f1280ca84aa8cf607bf1d2cae3c6dae6871e +c5eb10a943c84b83095fe1b7b9bc3682b5681a850001be80a48a2b1bf22790ec +f53a1ddb50e2325392f118cd56727005b947495ae8ca6e46cab765670ea03488 +39275b5711fd6b227ed1a6b66c02c9f199c8d54b46609a0804fcffcfe0cc8b65 +0f1ec83354d395ae89ef02d548088674fcbc0ac0daed78ab47e3ed00df77c01f +2d0e5967da9348fc0434d71eaf90785c3666694604f48bf2043bd54dae61ea1d +3e2da8efc1ae867ecb0e7d11093ba20786413e80c8f05dabcf474d6d9a1149b1 +be96ad65eeb5b865f4b321de61ff8904a072092910bbfce7bd5a42f10c355e73 +c0890e342af2f2f4d7fac20c846d372877c7b12776b76756a9002723d5ee71fe +5b1c0e5fbed5c354cf4b9cfb843f01b9e378e90e7a56994325c7c447e5269204 +c83b98d99dafc77ddb6a3fcfbbf430f6d0ab8a832c262f879369fd9ddd33b1df +602f5462b9f2b29360f1a1b7d7eecacc4f10f188e7e2ba08005878b1d9c3762c +ab8a29d01c0c164efe8d37328deb51567d5f17b25c11590a1078d53a36bee786 +5813fee10723c1acefe111dbc08b796895f2e1bb190f3da6accd6dc6c884eb44 +ec4d78df308ae7e774cef87ed4d6200bde349c35d7262448f165a6706c33563d +24d04d409c69924949aae19c13d07ee64910d1c29d15ac711fb56e3dd05a980f +acc11d9c08863c32a28bf94eb2c8fd1fa0ee61b939ed944b017a46b681e95cbd +0365d77433a27195df9d20a3483ec94192fec56b9af5c656bfc2924ca0c19fef +ad23207ac6d0169a15cc273d66899cc044b5efca9ef4078b9bc1e91f83842624 +c08a91c1c0d20306b1479e749386cc50fed78f22a27579fcfe943b033738bd67 +db8c4cba7f60e8ebbefeb2ceba747c757e902b70dc09622aa4ba96347b6948fb +3ed5c54ac78148b5976001bd3f0474d93f4903d15a6cd68727714ebcda244345 +d9a4b0020bde3e2c74385736f244206da78d0331de35feb4960d8fcd0ef4bb75 +5ab20087c2aa1da104d16ade37b9159caa0f8bf528b55cc005f017d6823268d9 +b13d199ce47d3c95e492ac8067fc44b42ac8be86b639770a91c75b7f7a55ff60 +0181451587fca8bea1721f4950b3322dd9c8a09cf8e4d2abef3ec038c8302e9a +3194d54745d5798e3b3844696d3c4566b179c98b7adcff4bd2a4fb402ab275f4 +30f2c77eecfb3c473d2e7102592e101c3d38f79a08021227f8f782a59d20cdf9 +c9750a8c0ac70e34d983356c313f85acb56ced4467357e07e23a62ab3fb6ed71 +9f9bf85edd20af93c1c1736b6112dfc8447b6d06ca12202f84b34f892a1a13af +4423b723c13701aa57982dbf20ed6ca129b72f79f77f1705485967980db5df42 +c662f0ed38a02b55cf048e713c0c6a1a85c900acaeaf6d045dc96bea5d45ecf2 +8ae85d1accc9b38a45d6f516078c72388e5337b9c1a2023d086e97e3affd3f64 +517df9ece75c3afd0e3dc74e2ed3b4aef8a8c032cdd70127ec4698db19c78646 +58f9dcd6b98676dede88a1efae04d182ba73475290ba87fdc71cee2737057855 +c9b151917eb5b3cde9f70db961ab5c8a10443a7aff427bae1d1e720a604c39a0 +14de8b45e528237198f086421b5938871ef89008148eac965bfcc850ed7aeae5 +ec3e8e37b9762a8a6580c791cd89c4d25fcdbe778bae071bb1e18257fefe9771 +255f977611825be7f64134c3521ebe7c549741265838ef00f0687ce14c463d97 +884893e5c967d3ca5286b52d0aaca5ada20e778a4f4c807a9cd97f0c05ed4876 +1cb09c787085e213a86b7aaf33acf64552ce5d8c3459c261447024035997ae76 +85d1d4337cd1a1def984e185779b2a0a8a3c8da6212730f96174f4c3b104d096 +3e0e395fb85f918cdd5f98c77daeb09a64169dfac253730c7da4122a7025ef19 +dec6042fc24d4565a1f8a7b37da00d170b6c4be72475544dc73b111c775e5c20 +401ad5b382559c2dde0bc3ec0e46c07e42a08de477b3c07159666bda273e29d1 +8ef5b8e6d514e510d8210e0a998508c3062ae26b504abb3613f3d1f167c87bc6 +48308196ff8fe6ca97db5fe0baadbfa22593c01bfab9640edc31410fa037bc90 +f6ca35ea8010a6b3c031b43e19c38a010e84f1c5c97b73fb3330ac18268c16bb +88648034875df43ea61c877c3278caddd457ee47509154aef00a86d801f8ddb1 +44e43f5ee5683e3ae84b7f6ba7aaa51f038607beb96ad79183364c49793ff0c6 +98c2a8fb0ac71b8f38eb7479a4995e1fbac92278b9f3528261d822db91d5d4f1 +9876784d0651ec7291f19a5437e987cd727afdcd267f983eabe8e5f3879805d1 +3f2089d9fca9d35e4fbfae0d72d7d0021c386bf7608fbfaa87d26a57933bb6ec +95739fbc3f7229a82efe4343b679165df1ed79eb650fac11cb7f1e74d6fdc9b9 +a8847a85bd24f58e2d988aea2f26eaea9d27f5892d2cdd77669b849a92f8d0d7 +5c54ed9682ba9d0c7058e04997279bdb3454d2b6a44598267a269a814aa9e1f0 +abf598a1b6c2afb75e173eb6fc2634253c04fcee9cb2a896523aad92457ef0eb +321e0a037eb6cfe349911c148473f86b5aff5b8985533a5f6d3b406ddac73d35 +23071332a8fc34a4816171b2c8a19bf458b4ce7259270785060b9d673f3c4997 +2da999ce0f2e7ebc2b2cce6de818d40f020d5e53b882f0d3754c341d5740ae72 +2868f364a2faa97e8c8143de444a9f3ae27eab6c4f7c838f3a5f8b9600d70831 +cbc2dc64ed3189f33030d0b32211b757f6682949ab889db99693f4dea2f670cf +057032d3034aaa6c3e75a0bbdc092c5f4886b169e59ad2d7f4d41cf7ad2f5882 +77914fdb7253e198a40b2186b1a9a0aa958ba9fb99f21a074825e053e562c2af +8cd8866861ae914042dc4b8b5342089b21013d519c44c28482cb8801c73de3a4 +9d6dd060294e4ccdc55f000f0ab7900b088e141fc2d8ce68cf771a068541657a +8b41e95fd2b1b452949716ad5bb0b8c2ece99d07a41f3c3ec381212baf8cca9d +801a993c8a3926b0e0d60637618f69facf70c7b3e6af9762afde0deb9e5be5a9 +105c3164b4d8372414fbee3181066f1772d21da04d0b350c806935669fd69cf9 +6073c324b8ea582638b11e58e43267c3854fa35c3deb3160d7756d66b87c8385 +92f86ab8a97bc9d6260e2723d435769d15dce8cec387318add815687ddb99d5f +1980da44a5332e5c98c59c8d6ba28a995ef8d809d783a9b2510e1c6b820c25bb +90f52ccb9fa3fdeaa661a69921794a60a591fc9157e755c28aa399f30e93d298 +9e7b35fcce14d5fe6bedab37c173d384d3f67323e702b14ea74951c5c07917af +f9f9fcc450950a8232cfc4744dd38ba79b9fc41a37205c97f44ddac6ea5d423d +7af9883610084080de39e5a71db472081595235f72c7ccea69a20cac059f2357 +b4d60e158834ad26f85fc1e9bbc948db8fe7a03c5c401ac2ed880fef8803e464 +76b00961ff910f1fcc897e1fa4f6b697a616f07aa95f5616a313ca01f39aa99e +8a5a9fcd389c99d750ccfa38bdbdd9a0376452970f91859aefebe5b55779516e +665c6f786b3d22a1cc781a729e477c5f82a65027c87b54a97d9130bd4464956d +735fa5b8f710cea51eb9bb909e89716160cdb112e44876ac49494f62b8f46e63 +c978f80f3a57d99ede832bb7bc1ae59ad0025944669343f432bfeadf8d7408f0 +50c7568da4400df96139c1d243b8634b19f2134fd13c783fe9012a58a7e7843d +55bc3b7c768579bee6f5931f1ea9caa44bd6808b12bf4550c852c1ee3cfa72b3 +5c883f0b6a4f4e5d768f93aed79bb5c70b681c3a9d604b6eecb7026c1b22e28d +c184d2fdade4c6afb6b9fe8d7495abe07547d092bdd73c5701696e6f256cda8e +1a6e58f3335e51498df75cf37a7213fa50f6d9a7a4ea4a251c3cd004b75b8805 +8c8b8efba9f66bbe5e8f321981aa2d8f5d455b47347e368686689d00fa5f996a +b6922e325bf4e72ac9cb09fd5802f365e4a15045683884b45f15175cabb62651 +3e71fdf4e7ac9b4b91772644ca8e55c530a9459719e181f9f2d211601d1bc5d0 +55731eebc2964f4add0f713c6b22abd36bd9163902a147f5172c4e054ff44ff1 +1999337a57a673028374a04b65e7e77ef2ce24a75c90fa2bb48cad9e9fa77111 +24514b9400e2cadf75e9d7f62fb7993f82cc336c77716bea4c00c931ac21e95b +04f35462cee46670514510bfa22ded3ea18bbb8b511f42c637bbd06134280404 +05d4355a5d252d9bc291c14cc81d77c491f62a54387442b9a884b3d21e0adc5e +1c120ac2c0b03a0355204eda408570d379547d40314f5c61f8c97971b91c521c +a5e86c1c321a90ae21dfbed0688e8c7287e7a35a1f0807b0a9a811a6d2d68636 +0fe12a04126f19c9b0fbed1083265ef6b2f4d463563df3b1be5b9fd0d277d53f +f4f5ee43b113f580be21183338592a57e29c025bfcbd56dad49e4b5bef14363a +db5594baba9ec550bd4cda1759277595d677a71c91925e6e1960f31a24117609 +4213750579cf163fdf9b3590951bb5e2a8f117412025f1807584ce1a4cd382f0 +9da5d7b56954f85327c0eb4ae556b79c08048b127101d2fb38f16996f1b66fbe +0040841b5578762c35849b0641d3343d8290f2aba7f075a0e2721718e08f0a85 +1fc82805f23c2cb0cd67740ce3d5bc6b97f98f8818cd39ad76ea2779c48ce48d +43302c382ec8d61904242e9a5e28527ea6a3bfcf9dce17a9d36398152c7c47ed +777c944db9ba4bec4f30a1261a0096081ceb94708ebe98e7165ebcbd768240be +d03fa2a0904086e1a4fbae8788315c7f864754e63f2399702bf2dca498b2b352 +09ce951389384a9e8ec4f01b207f61112956e9a59c0bf46677b9b1f8459b41e1 +b8323e5bb1ecde22bf2c47938e0e2f548cb02758dc7135004e448d9e689cf431 +11d2fa0a98f3e31b3882cf8689c76d276b85177cb27357bcb2ff0de3cb032166 +c58f25e0ddec5971b6a81325abcad1fc2a27cf0b20332769e80028ea27b841aa +16506f7c22dd55171341687682311e1f884ef87494bccfec13f5b0b217333376 +fb86573ee65386e19628e78f49c6cd9fbe4cfdaf21ab25e6f62a99cba323ebbf +c5eeaa523613eddbf85de5dbb9c66de1748624c271d8fdbc16bb8f9196428516 +f85e26d904878f9da7bd61848e96250c225e09dbd4f15180759e3e5da86d0dc3 +f5f4c5df81625a466d31872b9644afa35c81cd8a84a052b954bbada87c1e50c2 +c39594078c068c9b0aed83074cf941bc7afa3afbbcf3f40f34e4e3d1f133a57e +9c10799313813684dc597fe5ae551cec1f61802dd873526fde81f323b6c62530 +0a5ad9bec4131b9cc9cf26a4554d6d64bbd5c7eb59024b2526f12f3f9352dad4 +7043446118b2339223dc051a4938bc6a2c691029d693b8bd3d35fcc458f7df7d +bc2e51ea969285ad222a233e5331f99ee402eaf6d76403f6fec3114e6315a2db +23659ff88a0cf2738c290fb6ccacc2472bcaa3e0ce03f9e9d8357b89580c95f6 +f97c1ef3f0bad43253b8e97e6613f0ac04f55f2f321b5688fbe4076558738b71 +b378712d45c48ff6ec34057bb2a0aa7086c27716aed9c3e6ca6703ffdcfc451a +0471ae9d6512f0fa82155ae17e133b685717138397757d0230b62cda0ab1ee9b +b1f0bb791daad5f3789ec0f22d13b44143b63250f09ac760e86ce3219292c6f1 +ca0e77313611d8282d8f62c986fd525baf75a8ab194038359f6e0217d1a5fde7 +ec7de056f4fc6893e740dd8c9efcd629fe529d5116db5482d12bf39b0e3a40bc +bf1b3f99f627cbe937656f38909e3924b89ef1478be176320b6fb8a7c750f41b +90dfa427229c900b51d806d959be3b8b2b6e6187fb1bd406fd179dac8af5e70d +be10e747e198dd6cb67872b48585f33aec68a3ca94a22224056a32a8139cdba7 +aa07ea5cecad1d2e1054cd265d35c6b2ec0a25a0dc415955186cffd2c4b6a86c +028129fe12b4fd07dde82836ded99925994f058cf323bd1b362a86a8b4ac5aa5 +dbad763abb2613b41ae6b947fb79a7edf3ad23eb7d732727376a1fa9ee0e8d79 +3b5871fc0e4535563bccef6ce24a71b717f90590a7317652d7978bfa78a72454 +353fcf512ec5e804ff6d2984c3e905401b69246e1b040693c581e794e6d57ed2 +5dba59acdedbc4114116da97b749c4007f51addf7dc9bec79c77cfe29b6a93c2 +61e2007b01a0b8d6f95a9e6c25551a20ed592c90c7ab5071280e5d85200d776d +938df156ecd2d863f8b1848dfbe5d3a40d4b817deab66d5c191b4b05035e0009 +5f04c4cdfa26de785889829564c27377ff1f2518da932d4559017881aa68a802 +5bdaacfd2611e101ac667d3b69e7895337d522e56b4d9698c4c5f9a0e83c2386 +f084f40a75282c72b2fcc12973e5edf34e810fd247f9c0317899fe6efc833822 +8a788d33265883fcb78366ce69783b9a15e8c041e4556293f61c571bcc985d69 +b1761aca9460781c4b9f9035370dda95c777de8d35e1d7aac234987fe1a8ff45 +37888fde3267d97e27c8fb6d95088f0d207e4b8d3e3d689172b2d89b8dc28b34 +43d14646b23e3807afeaf3c83a22f45cbfe9eabdcee160ab7b1a664bb5fdba38 +4446b84b6b863c892a6ecf33f7a569d82df118582e514c11314dc73fdb04be15 +b6bc9b3be801419d90b74cdc52ac40e1342167440621fcaaeaaf9db8f78f9e20 +045d3a26e1b51f2c786b23c09cb94f9cc91df0b5236e3f54062925ce8804113b +c93c3ab041948a2027d00e112043ef82ce54365fe241a2c503fa334df6973406 +3402fc6d246a8694f436b318bd5558f69c9f182746a25aea1bf1993f61ca48b3 +b04074f8a44206716d6a6d834ed3c455e272b41810c6d70133c455f246aa7764 +a104c482caff864d86eebb2e1764735775e78850006f959de537d66dfcea3f2a +45e24e7d905439a59ab155474bb3dc63897c1dcb7e8f298366dd49b9b1e42f94 +816a3c275460375dbdf175ca420b46df137a34bb1ad7983807677f093a05b90e +81fd0ee6b6de147a9813a1a1ec0c7d859777c0b2945edf2901f883b8b54aca59 +814b951e4c97fdbf48aaff19cb9fe7c6c0de6532f656e5b1f03193b58ee693f8 +4684114fdbbc86134a483ba1be41cf4fd823a23f5a52ceab00021c2954e5c04c +865ec7222d33d82f19e09375610ff6dfcea95e0a25a1cd3d6156b63bcfa13740 +63bfe1d8a5e45659b0c924eb81cb3d4e70e59515ca1be45f66faadb5993ec547 +966f70f5d761c8731063422a510984f7b4587efe6799d2f28d90236b49ac10b6 +fbc45ecb7d91017e16e4fbf716709b37120d3586363e33d94ac92b01d1349c00 +18825eddd5cd9cccbf8c70046ca295d885209aa3fb0b6209c5298ef4843c39ed +d64dc504c278334107d322cde4a388a4a079bd303c4d5588be979eaa6cbdf8b4 +942ffd0d27b2ebe1533f1d31b3da2c7fb5c8b663391151fe897cffda8c227d45 +e292e9113ed2538712b40601f1f0c8f3d0d69ccb584abe6db54b4044034791b7 +d7a0838aa9d80c971f45486b4304f20d68b76ebc6e55bb683dc20c356176006c +b1f902f8d0be642da9f9209703c23e48235c35778221689c16d426fbd2903d19 +7fd00e071a1989e8b2ccef17d51e7d73d7189c06adcda120cd3e849c603729f8 +85006337a3a1136ca31e0e41d674620f97f0101a297a1b731b1d0348c51d72c1 +4be0366a2667999067d102d7007d510f31074799ec5cf6ee355e59bb68dd85fe +3e3f553168c337afddf1bbf895c0df509355dd9120735dec0715fac5804075fd +cd57fda443cffeb9e9d8e6f24a3daf1d9523ddbd29532a6c5a79e6b1ea1f2b1e +55e0369cff1bf0c074873ac1226354a6a74e62faf42f1a15c863c0ba21c3c399 +b9c1ddc4ff6e9bc9a3ba58581b6bf67b89b7045b9542694b9c2dc3e185a1390b +67aacd3c344d37467671f728fddce8bb08e2c6b8cd4a8abc60de087fdd560130 +3f40599da3a1d4abe2e93cffc5628e62d972f034681db1c6b07cdd0e7f9963dc +0b146051fe8140004c5cb27f0f0411027ba88646baa9d6f02931a762300a8085 +7aba1853932d380a72753ebcf4c9c24a03fedbb2dc057c6f62f31695d35a7e8d +da73ea4a610f515fb52ad509605b8deed5e44c36b7210dbafb46cf2c5ca7f42e +00571a8a157a953226cc00a87592050135386c5e7fa1c5e3c023edb0359cc26e +96762eff0ea623651b10ff61835614486760930756e59d54919f0dfe0b8fe93b +9b28c474055246750aa1679389c5204657d283981a5cb160e21c1737503ab109 +044a661a3b3d100ec7f4581bf7b67b50970078319890d5a67d133bdc07265d22 +99504698a00ed8c9747feb1e747737e19850d39c03a837f0d504f9b43c8fe9a5 +725eba04ee6cd478f8416470ed154a11484aed5822bf9979b1ebd5e56af698f3 +4b865aecd29c67ca74814b0cd0109767f6d582205574670b0182e0ec6d23675a +11e489fcd58f0965af4c2f2b891aabd05185de26ba4e0a86b4fce3ba710d9c81 +3a97ecb07ce16ba156e2627048da3a2155ae68a5063f6c2eebc0091711290605 +b540ca4ddd10838e2a64835ba38ecba8043074be230baddd628d8b253734397a +a213b0a9bee70d623dd5411eb58e25855209b3648a42e4681f90d51b13354f28 +267d48d1b8aaec412be2dc199ea3ed041bc3edaace1af401d01e56b5762f7c71 +cadaf26892f3e1f6ab0438a4ba0e3f5ad953fb15a7d821f6444efc966c67082e +47e1af0e6e0d199189a994239c9716711f9ed82f6fc2fa1f923b4e3aa45e5ad8 +c0dc71bb5481fa6a105b90a77bf4b8b9b852714cdf4fa814e9d0d89d349ba57e +dce13210f79ceb8733526aff221386f826a435af47f027d81bfd4d263b84f8a2 +a807c55d1bada31a59649717a4ed8d560d4f5b81ae7f6943c66e9b2ba9739c3b +559d49fe652de7c968c64030d91099ceacb9ac69417e8210f64eeb6dbec7ab1e +fe4a3babea0a42ed49cba2e70a6db7018ea0ff1b2b0af498dc6b5e686eecd7a2 +a6b85e07401e08b825457e99d0b5fe48ef13a14fc0ceaea7bd7748b2c7414522 +59ef4ddcd6a12d5e84ad402badb6af6b8d50738250677ac12324e4e3c5d72887 +c3f36f99c04cc898704bada948b431f543765f3112175412fdb80af9850ac5cd +19b65b018df357498fb4255439913acd686e3edd9a3bed54235ca6a3d93ac968 +6ccc1400b8ecc647ad4fb7334eb768ee32d3213b8a30ac2caae37e99ebd9e903 +b319139533fffa9289c29424a030940ab2b43df031c3f72542e7a8227d56c29c +a3b07551a0be3cc4d406d2b0db792e9e72942777388d1dcb4d48704c64a99434 +885c4f4f170294c7179dd43944d60739ba9412245f2c34699d04f9815db6db1e +b3835adbf1d8d9cba2da0d217562a25e0adeaa51bd8258b9b49f1ab66fb1e72b +d0312788da672625511e07ba68cb0eaf05485044acd338305f55c7b67e52af4c +124e54d8e3bbd2c6ec6080dd3e191416acaef07bfecc0e77acc92236749ecd88 +96577190a9e86b7ee306b613e0b19015af7bd544e26c6a3e98c51d98cbef559b +29d79e6bc3ff0966663de38b24b2449d38846e6652159ea825303122ffb55333 +a108e242a05d015a9abb0089a5b9974cffa5eef0de271c243fd9a4f5ebed3b53 +324de92d22fae131fc7676b747460fdcf199076cb5d922e2098446275946481d +681674c97c00466e79ed31008c4f83626ac2dda6b0464b589f01082e5ed3d7b3 +1caaff1052012b1da1e37f3c0049623555b7d1525f44c0824a53903b54d4da9c +083d7acf2717e26be8596a07574661a53c504866959e13dfe3547fb8c5ee9c54 +e4d16952d25f0d32c103c1b2381a3b06ab7a26262f95755e2cef7a028266ffdf +3687304ec78638f3607e1d4c76af0cea8a30bdb7afd9fed23b79acabfe622c82 +9059c90c5bc732c53d8ae7e55f6385ab5d78e0c4e0b55bb9c5867ff9a498d3d8 +dbe4f0c548de9edc0944f1119bd9a2c33d5d1c8de7c5156bccf7d4e52265464e +5e58d93fd79f40f0ad593f50bafdad06a77fbb22982b35516497305e78f50471 +746076b77160149dd7a38f2fdd678ddc2a954ed788a19ddac34ba6ecfa9f0ed2 +f7bcb5f97eb077bf90e7c3852ea49b1a64b3a1e618cc83bffeabd15abb82fcd5 +38b644942b6b9741b3eff1409c67632c6a40d77c42ee0846d8edeedf56100f28 +ce8a9fb58b4aea6fd3fa0345832062d748ede2877fbe30187b635ae95227a7ae +e15f86beee2718058ee928c73d0e6f2bfba3c144d5fcabdfdcd499f8b8db426e +0553781a197bad1798327e3bdd32060bb55c660c24f3ea4e658d4e95f69fd589 +e9b35a2153bd45fde6f56e50a7cbdf803e26103a62824b24ee929b16add5f9d3 +5817264fbd1d0b3171fff576d67bf6aecb15eb25c5bc6024d558725718ea8406 +de77df6446ce372a13fc2d96fa72f65932fc34e7caf2ea065d3c94367070ad57 +84e94fef2858bcaf7c60f999caa4d0a483fcf77bfda5ead04c77b87c69a3bda4 +9e752456a8a91e78c89e72b3d805cddf729c8d13346df0c1150a7e16f37abdf4 +07f8a69b062fa83cc8996e8857d26bb0c09d5a5182cacc745772b78b584cde14 +6f5e78de240c5f6bc995606afd03afb003e0f8f07f4f62478caf38494a162a82 +ecbcedb9ba0d4f074611e68f0cb7bbfb76bb11615cf4cf26772a57d635613fbb +9fae0485183a90656c81750e962f35cb61689ec21f11539df17b2662006e2391 +b5d31851ae55c40d408649349ae3500bd52990f1ad042a09d0f31fef1a5c7c89 +5ea1118ea0c1576b630bdba01bc628ceded0ad35e6decc10c02be1a05be5259c +f318b84f4a0d5eeef0ef8d991e029c55213d73a07306160751c8fa142d010c1b +9e85dce81b6c4638de70603f7dddf7fc3a80540151b985066926c581d21cda9e +9a2a0b9f428fca992ef1970a985b3f5fa6e80e5923db4de6ed7898c508852a47 +439a8c50e416c2b75d7b3c8046513d91af6de66ee4b6f26f6b639d492b105b1c +9049b04aeb7962405871e868f15b6e1a8e8806253672c6eba1d9447c1b453d36 +59860fc02c285f5f2d773f0e76c75d5fb2493a5c26901d9559a9f3550411039c +129fa2d0fb9f5aa4d6a11f490488a08fb3de699fe868ce02120fa973fa0ae84f +fb524eb2d7823fe52ed58ebf40ef5c7609b7b8a5e1d47cdb9f624d53d35a40fe +c7ae7c17bc941a7fe4c9c50777595a97573e3ef83582033e1851577036e02f5a +65aea4282fe5171269ab39a07939b2a71890ca4043102dfd0afcd8688996a45e +7b6a858c30e54a6f32fb19bd71adabd584ab82ebb85535e53788081e553fa09a +d97345c2ff7e6b7dda5093bb78844783002adae6217581860729e94f5455e6bf +8050a1df07128cfd83f682b4d11696a62d204a7d7be0a43a653d1cb6f58a760e +cc565ef2e33662ddd7daf376653963f1485cd1c523d9341b1131d527ddc5e166 +f49f08b1bf9344bf9f7551a2688bb258cf46775a6a31a4e38dd1114fe2e44e5b +3b56d7f3d7f44e3c9f09c6e9e098d425370daf4dc3c638581a3f34336e80e8de +9016f94e65ef7664a4ffc441c52d073d47da7b90c39aea70ee619b199ef79773 +bbf5ad46ce9dd19afdb335492d31fe45cd69650eac723a9d6d0a3c9c00eea011 +daae00acdde96c901f111c402703f7b1732e1527aabdab32fe1355348e76081b +27491e40f472c84e26568e8fe043ae3b0813137b34205d5a005eecd8003b244c +20e0fd57bdb3755e7bed94304a77ddf69a9c6ad5f286bd2e95e4f4f37b6b6004 +b9f7436171c6a17af1136c05bea345577c488112c7c8cecfe7c57f2601265076 +dc5cbfd0d2e66b8587d92d02ecf628c297f4d08c149fb2efd989e9ad7a41cdea +03b48ae9853b03768a1528cef605f9d64045b1c1de64a5e0d26ec5af66ff278d +296f02349a6344767f0b0983530d314a370687f2019ef6c778654c011206e8a7 +c47e5572f904f2946372e8ce442bef2cca4fde1ada3a06580539088c11804c76 +e66c32e076f0e3de041e9c9950dab9d79886a404c081f61d1eb5e0bb4ff05df3 +8412f34b01dac78411e4cd8c6322b956fdce30b66dbaa9e8df62f797e553b83e +e379d96df6a2b11fa7edb9ea2f1fd8ec4b89b5ddf937bf91d3b574ea667a9847 +5737f2bce293b7f9ed9ae06ec39ca2befe1d4378b707e266ee3363acba05eef4 +7a9d71f8a205bbe81569ff184de2e187735829b17680534888904fe67fdadf4b +146c1d80f3453840667908b0bd497d22c8ffbfd1400fbd57e140afe219fa8f51 +c8354af1cb982ef423f250eb9e8aebf30166780d631400ec33bd84bf71140403 +f5cd03fe38b27f08167cbe99bcaa3fbca13d734c74148a4321627b672468905e +c93b528e396a0d2a917ce042d8dfa63eb2575723962063a2487f044c365462fc +907b42eee612f0fb4e34a3fe9ea1a0f168da2cb89cccc1b5422e81f09bfa175e +3479915053e90007ad92ab92a2a0644726bf022737f3b7b0ee7579fb7731ac29 +e7e043175277ef22942a9030e0bf91a1e775f9fa3f6d86ea3b72c8ddb42a670c +68694780e5a7ab25968592d823bdc6e812d19641c1e176e26351ea5355435739 +7f0f92c33c67 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -1471,11 +1500,11 @@ b9a812d926538fc42871f439282c1717833170bdbffbd7e2034d794eee9177ed 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource -/F130_0 /VXAMRV+NimbusRomNo9L-Regu 1 1 -[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash - /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron - /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity - /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle +/F122_0 /XDVKOU+NimbusRomNo9L-Regu 1 1 +[ /.notdef/.notdef/fi/fl/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven @@ -1488,24 +1517,24 @@ cleartomark /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef - /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl - /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal - /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash - /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis - /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section - /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron - /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered - /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown - /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla - /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis - /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply - /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls - /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla - /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis - /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide - /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/bullet/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section + /currency/copyright/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl + /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet + /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown + /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent + /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron + /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef + /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef + /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef + /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont -%%BeginResource: font MFECUR+NimbusMonL-Regu +%%BeginResource: font QYKIKI+NimbusMonL-Regu %!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development @@ -1528,7 +1557,7 @@ pdfMakeFont /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def -/FontName /MFECUR+NimbusMonL-Regu def +/FontName /QYKIKI+NimbusMonL-Regu def /PaintType 0 def /WMode 0 def /FontBBox {-12 -237 650 811} readonly def @@ -1542,584 +1571,584 @@ d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf 045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 -1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b89290699b50c1bf1baeffe -1f57be7b5ea025241a248a6d4cfa5067a1da6eba4cfc940599ba3f3c934d7248 -b8e4ac5816f0d2ce8b3c4193ce39d19fffdb75254573173cb51ccd83c2f2d06b -2483cf9b07b21ec6f502f028c273887bb06dae2afac10e9fd3c7cf51bca7b277 -b706e425302dc78975ac0e43b87073257a5cd7424b6865fca89d886e8f95c4f6 -d457623dbbc0d16bafeb4c649f5d72b09b18502eeab687e915e9b536a361b4f1 -44c3cd4cc683b5f05a4ecb4823a5eb5179bb7eee8b76c21b2491a97808f6318b -585b0bad98f42fb4a755bcb74cd354f794c8bea5b90fb9681bd5849d45247e39 -930c882490230e1662d39cca875bffeac3e79a78de6e1298abe9817ae98675c4 -16220ad0d3a36580ee2f2a17aaa1246c416d58a4c52fbb26aaf3b6f75833af8e -3aa996218dafa571fbc7cad90ece9c883c813d8f168c5e86bbfa0f0a5cb36e35 -2de4caa0f8d3227f72c5056bfb5bca6bf9c60e037a0e44670a8d3cbc9a19f379 -ca8db30b711f518a8c7569211ac70c46eed2af62a37f238bd0bd12d60332e673 -c6e784b3eba3f2e71e9993b97e8a38f85048937e958f1cd8fc6e661048546135 -56b810fa1ff611b96495081c04542df7fef085dec619dc8c84cc57683d212813 -9d14728aa32723e1d15f2af8f03422cfafd8ea4c92dabfe00e6110bca39fc555 -bc066ef848e437b50688daf26d001aed7e74605ddf9c0ed36be45455aef92689 -8cf32baf2418e02118593f54fe1857807bfa0b93b5cdccd81d28bede22cda6ee -2e32422c1e8da8866e526300f9059e85ca54122ecbffdc011460913e0d28f7f5 -fbc9d7f9f6934b3d8efc1a91cba4128f6bbc5eb55e5e7b73647bff70662bafbb -145cfa65df3db858bc3fc577b1bd8bc74fb8a61bfa71b8304aeeb36d8efe12fa -6f5eee0eae0830e5177dc745250fc362f78231fc3ac9864559dba92dda2feb96 -2629293435bf4a89f913fd15702cf325981ca3a08b327f7ee35794a9e88326e0 -24559b547fc6da61b7a3b9357f72c767baa9c79c4e7b77f70ec01ac0b8596425 -5f7346dc8cedc702d3d57b09ef89cdd33756619af59acb9d17a3abeaa6c65218 -6d6855348a1095746b34af15df313091c59e5bf9e79b156cd7903c1c42e115e9 -c5203037c808bd295195e074fc4a46fbb1ff01c814878f0c177f552bdc9bb698 -349d73aec17997374ec90b69293a064442141a44c6fe8e3c283c02a4655c579b -f21b53d1fd37996c682745600785c7b52c4eeb47fa5fd640739e1f09d5c5dd2b -b7515a4cce0a21281d315563895972bee88bbc7401be9e20cb160b6bc81ed469 -6d66169bdc648aaae8a9495b072911cc814c19d53b95de0071e3a439d3c09c3c -1cd422c605740a8939487e26bb9233d4cdefcca49bbeb1b913570a51b2f96d30 -2ef8913c6bb60b54f7ea4b8ca16ad3b4194dcba28439eb31a9443caf061c4d88 -c22cec8d9d8d85d7aa225fd64bfae7376abd40f822ba1ecc9339e09403195752 -fc03a5c4742ad93064d975906ed63acb495aae324403d3bca118179e10256543 -1bc84d47e0c016234eec0c52255ae783417941cc884efadb63f8269876f00a8e -1e1f19eafffa00453203a0752750f8c876aaf87826baf77b81d336ffc29249c9 -a6a44f40381294447840632ee59a3c4530391f35da45c16a001f793782be488b -5e01d7f75dbd53fb31f956f16202d3d94a300866814ba44c79764cc25acb57f2 -333dfcf3d97a98fca949b1da71ab27885183d8baafc9bc743143f2f1002ad752 -1e55d207de23e97d1760cd918a55148e37e05f6347e8cc299eed28d7319abcdf -a4a279d5f64cc2151f91a0be9e8382a35b535a6b5f41f3708169881c243391c6 -67d9121ba21f6bb22be1ec9933d9af1dde9693d7704c1141ce2b977ff5181299 -6a57f7806814440a28b1dfb62c4dedb82f0ebaabef3367bebcd43246d54d8eb6 -7af07b164374998f06a0b7e271ad6ea974698a806002374d270c6dd5c9dfd5db -e056fe1b3d58482a0cc98d4d5603c59ec2e13b446023692b9ac2dd7cf767d2dc -a7c62bb3578847085cab79f139bd312cb07ce13e38c3fb8f695bcf4021c282b0 -9b20ba67f378cbb8832751b8f3eed370a572139431b9187893b592529fb1b6c5 -19f51798bce9e56ca50185d42fbd85819c3a1153d65997511b19acf87e69c07d -2ca1a7401c2b23f99c19f95da0df136472f9fb574b21aebbf0c2f892b9260001 -9a9173f108e72c3eb4a93719293e8be026b833cd709c7c05c1a2e7250cad2586 -ca70fb7d927e36a2e4a6f34e754c8dd8ea2571cd82054700d386cdf3420f37bc -b6a70b9a92e46cebee13f6641c67bc40979f9b86e052164612d3dce7be67fa71 -b26ee9f425b54b3577cb4acf3dad02f2e55d2986dea88a5a1955b78c0cd5decd -213c55c9c57183a7dd5832d49ee81724a19abb7da0779f1aa6a77d5d31434a09 -c6f53b7e27123dac042f58dc27653d940358bb8100b416b920aee20672559f62 -8b20c687d77ff83cca449e94fcf4f06614fc539802340619e3a791a18581ffb6 -9bb5961d1e70e55615cce5c9e1466d77435e486f15175cf87fff65e58127b5c3 -024b93c1c296aab24f29483aeba00736ed30be5bb5284d7afc43294b927bec1b -86814a5ac25a3b9cd1f25c813cae791f937375e013159624a360955a58e8fa94 -e49593a97150702c71dd8dbfc3774094df930414ffc68cbd4b4a25041cb3b657 -a54c9bf780142d2586eb5dd9ecc1eb5ea69245d5d9c2af868974ae5d46e3a544 -74e96780ae66023778659d9a45853c24da18dd5ca0489ccceff253b009c06cf5 -826adbd0e8fcf23edd75c3d3de8a4c789a895e06d20606e4f8e3c1bd77976e71 -de409203ef1342bdbf2c11bbab4af5a709f0462aa8fa3a02cbed6f23fb4d5e3d -1751acbd41eecd8571518a9e13889c221ba5568cadf730f9da026fb38e30a25e -87ef6a13484d6ee31c174bfa4b80cc38134d7b18c85c83b4f14d3c7b0a0b7069 -7baa1a397252ac47b67306e45d64061535d05540c86b9599df909e105bb55100 -3a0271c25bc5d596da2a446e35c019b5dead7b289614bd5085d49ecd0464b494 -cd1ab564a93ac9cbf438fa558bbef71c2fe003573a03979a10fe8bd54a053724 -a529f46ffe55cec8d6bbaf1f57d16185595c82a1ef42e3c81cbc55bf50587630 -404b2090df6d9d25468c1eb7a4b2b3da7f5b718157ef8b5f23af088301e46411 -b51e6e0d464096ce22bbc2028488d9af49792b4a17cbbba8ace8fc51e1de01b0 -97e6db05466bf66978305642b6790c08e59a7055f9442cc2cfc23095df2c27ea -decc1ba54d6b81ecc873a9c71796a1ece75765b878d12e4da9e19d026ac44dfa -2dc7e540506546aac70e7b82ae7fa98bf36549f4d540fffd53abaf7ed9044ca5 -6b4e9044a2b23c3e7c70152e96f4e64f6b1918946789d4f703675f3dd6e8e5a8 -f0add5f7e442c35cc782c92db2007596ec1a76d2d22ca5b00f7f9aa9819327a4 -db8d0b03369a05de96b8c4eaec254cba0f39ef6ca005c53afd0ec32f1c092367 -efd9f773bd00b95a60523bc0392b050b15ad70f7cb42f6d36587144cae2447ab -aa4b4d9377a7e86ac489685833e1c14c3e17638b00884a46c1efa2b158f6239b -1bbed6fc68ff606278fd4216c2a6d7888f0f0e5dfc9950962d4964901a47d6cc -2e3243e1dde9ce7f435a7dfb19349a3017ce44b87dc6baec18354a2042c87ed6 -c1e3a1a505cc679e32789f75780f84082cc653a010d14dba84da0191a510359c -1d24d700c58e54718f1d85396e7c5d3a365637085b6f79c061df17bfcd260ea0 -6b8416c9042c2831eb041346a22bc54f9d7ba43f8c4487fc240baec20ad4aaa8 -c03f180b614c59db6e5ec1531aefc908c46b93419b9f5b2d4eba0a67ba43d685 -1ad44d4b43b7796de5c9a11f726a90fb1a389a342143f98f49237fb451c43eb5 -981562d923d684923dcaee71b52ab4ce6269169a35f545e74584fa440c41eb82 -41ab194c78a5b980d021b3eb7994846d963b78eb6e149cca7713c12f77023002 -b8a797c9ccd0c2bd70dbe44f81f9d274a5ff3824ee34cb4317fa4971d67d90a2 -f3d1b1b84960f0fbee40e6341c5271b5b945b9098f3095986ab7db2e0714cca0 -301f6b8378559d86f0b0d95c2dfe94ac8e10df0c8c16dba12505a0d467dccb84 -16bfeb18784bdc10624f15da1a880ffbcbafbed0e1c7360962478006db59c78b -ddcee524b6f9b15a8849ee19aa00fa3f71a3c2c96e68dd0248a94ecc43a60ac3 -88e49e005250706880485df109ce1506c0a4edc40f5ae5fe347d52ff63b26c7c -185a698e171244aa1095620494949d526276175a7e120340d3247cbca4e3df53 -641d6d392abc61c85a22e06cdbc89cf37bffdf8a79361c6dd69e6774772f699b -92f7a7184a00fdd7f36fb8a08ccde5bbcab3731366c3b74072044d3ef2ebc1cb -33118b8c09c04174baef8df1bb4a1e1f848c1a5178ec58ea621f6f8a63d0fcf3 -13db79f885ac659c881ab7e40798a4339e6a78ba27cd9e6803c3d4df196c462b -d08555bed51d7cf5821204728356cf813f554517ac5e28e6c4047c0100610635 -7d25c33330758f71bd1043365bda5d1d9214c8b159d0f8fb69e40e6fb4ef4668 -a228938436dd209dda5925597151f8633297862799152b0317bf21f9572f503b -b10826aa7f8d15f5d780ea27f1b8ca0ba3dd732d3e3effcfad6e6ad8769db6c1 -df22ace8467481d16e8af6f56032c90c8f2500ce66afb94d378d893e84208048 -ec0cf900507f02e40da3e99386f939e05d9737b0b11b7dfae473496d056be5e0 -7f1cd25454f4b290cc43d936450c3d675ceef5da533db25ec07addc7e8355d8b -8abb095ddd61c91da2dbeac0574e9ec9d316ed13df03c997d7a4a9c7a6a3a165 -ec1ce316e820e13291132ae91660d5d1812146abfa137726e8700395b4274502 -7d53b1e5cba817beb577bddcb956e89aa2d1ab24128b9ae8e06d9f0a6dab93bd -f7ee8e2ff918255c3722a8b0e8520dd02ba7c92aba13ebad9ce0ad0f16f728d0 -ad49bcb12b429811d8ca1b5ae29b7d5393401eb5802db4d4497cad43ead218ec -c674f42143bc174c525bd736b77dc28bfc7e107366eb9091eeda60664a771782 -cb41506406dfd29c974c5a18da88b473ae58a2f1fbe5680a40138a9d2fb7955b -3fdda23b2cbe7e27c1dc4aea3069b1e7e25068c9051672b8c9a3a37d6e6fdb24 -3bc20d303198f9b8ad8154b3f4a4f2acb17c31a0489c1366eb8a13012c6b8cca -4d416b911de781563e26c08538e038dd8ef92435a054348add815687ddb99dda -88f1e2c5887707cd4be47f71ab81a3d6cc3e039bd09697734840f8bd0b88aac6 -191c6db089943f99ee4174e5fab3baf3a8429e273c4d1a5140e0073f86105402 -3f60df69e65809b7a1a5a8aee4d25bdde9fd6d05a3fcf4be5f253e41fc49e121 -df89f259ba981d2617209b53ebd92e430a69668995961177b159933501771905 -08f625b26b5085c04b325e7fb6bb45eebe3bc9f5c5114eb37f19937635d71a72 -39a0039003764d10cb403b58c61bf411aa8f5d717bcff23fb338da58d13ca81f -acb3316d2b5b675e86a95cfb525199a21af248a1245c92ee37688c6e76a95187 -3b411697a1ea6694e6ccaddef3d57114cfde70609de67972edd1db95d923e077 -4bce7cc77605f9ba5226fb792829b1b8eaa15361ff78f190a0563fd61aac4452 -ee1b0d293e695416c667735dd886d10e4467b613dd9bb899f2bd75f2f13193f0 -481fcd3b4e2aaec6cf2829b1521dd4b6471ba31aa0aa4d63a6456203896a111b -89c106f1ea85bfe0c0104b1292a1f8d49334578375b55deae2d7381f5cfcc023 -5ddfb3d8546054a0e6d5d81e4254383385ba593a7d3a8e0beb34285dd95d97ca -3eb598b643834644b611e6db4b8b4360c847120038768e218031e097ba0bdea7 -732f7e460155a496b91b3241c74f9ee0c99ec7adf6a87b701a0ceb07fef5fa44 -44e127de3e777c23a8d938f9879df1dabb7adb31247a53174f919a2a5a4f920c -9415f3976a8f4b739e114b2c49d67bcedc1852686cb041e3ee94ef94d9f2096e -76f1c558f40812444c6f0f4dac3a4bd22b82e32d8bbf1504f8232ef00dd2f3ff -5c4b8349a9d1becb8c59a9f4763f2566a7a513a6c11f54d1fdc1867ab741f3c6 -e2b44aa95479e4e9813350473bc7897b9ec592f01f97697a17967d344a4bc9a5 -62786f28f87e3639d091922f4994671b22efd41ff3f6b8a651117d0a2a97ccfc -80a69c974fb2ccb36dd6a4897bf88ebc67bfd892e35e6940e94893e1cdfd2799 -8cfcf2b3737a6232e4783eb4a8ae56b83ed7661377b30225a75a1b90b73079e2 -6aa33fd37b81f7d60de62931b6be9d16367a5fab1d14d281d3e8d09dc525f549 -ed03a449df4655802bc3265010f286df86602740d8a86aaa228b9c47e3e78c0b -22d2600d5cd55a3116058daa7e34174144f78a8f72e0dcb8cc64addcc52df0df -3f8c21d9cc04e187be53f8fed4f33633ba03afa178fa5ce769a7eb0e1b9bf5bd -de0ea74dc99598a66696bf6d5071da995a30b8144acdea116cfc447255a99cce -4ec01bc8a0b355c0881f6e9eb48725d61ee0b245e0f7cc35b9e76fe11f681017 -f794ed8d4c4c7a02e17bd16a02347f28318ccaafe0575734058121e3ad8064ec -a0086a58f216020a2dca29376981a2595bfac2a0394d448949b52ffb47e5c5e0 -d6371cb4a417ac834d6c9fa0018c5efb16e39e32c85088b266d74af5630b2544 -d4cf403482c490f86d35f81cc44b34200400c10c6dff035423e725d41d2b5ee0 -c3f03a603a161713216af97036ed38ff8d9b09f189ad191a0d03369c3fcd5a3a -f88a57338971d7bcb5f3fbf8735ad8459524d93a92eac1c2bf5f0e6e1cf675f1 -6d72b35ceaf34d8fac178a1dd823ca0448ee1fa2f616b803c38b89238aaa1ae7 -cb057ecdbad28147da46a34b8a1f1d389e082cc3e8eb1a7e5c0c932341824c21 -570e003d8c11c87d7082371d3d4804da32fde118c6c5b5b08828e5783200c6ea -0a7ab73343f5fd681a3116fd818c7054a5199212eb0f3a9a0d87bc364670ee2f -7a5081a1e48a58748d297e014dd5db7faaf7a27459f115741bf4facfa1b395e3 -e97452bdaff906af9c52c5908748f1e13cc85d165bc893c1eba728458b708f8a -9e8990a6f258bda0989aad0959e7326d1d6bccb50c4fab15a6ea3cbe94724fc2 -8f174df93fbff41adbb9d4fac0124d33151d06753d4d879ac4f15aec5d1cc0b7 -a9e861f790a16eb0821b2a7b7b42d6f3e389c51a1d7c652859ffbe66646d4199 -a62ed28a30c8932dc4d2855e7e6311d79cedba8beefe2cd529f4b45382f3e6e6 -a7659da9b786fe7bc2e431ee3f11873ab2709200b715343cc25c5365d06be9ac -829458ff77f4d509d9c3917237d759da6775e09c2eaf4ce966a14157ea2780bc -e3249446573c82b33ec5ca150022a83301f00f41eea3694059b14b2a9abcea30 -65cfd06b9dce3823477bf80938d355427666a8287a65e231a2357aed80d27a61 -58140c2cdb1f44caefd6b629fa661440c361dde7817154052436a36bbc1bf382 -e30285979c4568b180417740a17150952e3eb4091f583083d75a05a2d91009de -46da396794dbb5288e2a2e6191d3f22e335f0275f33e9af2154cddbcc99b149c -6d7aad7fdedb23c805f09725b60b5ec77e8ac9953a3578b23c6023a196f35333 -a36fab2ca195e397fc82318434e9f2844d17bbdc177989fd8af61ddb46512d2c -f5d7821941b18b7c1f1be16df6e6bed4a1655edcaf6300fa8765e903b03a95a7 -0a7e6d55457f451a8177e0e9c9f3aec8d174843e3a99ed698689019e96cb4683 -bb24c71e22f4895656acc67ecd671963abeffef53724a645b98e5d2680297fe5 -2d43ddfdfd5536f7c239a5092076512a2a9821f12338e388bd5115ff4f4d2c01 -d741f821874380838988c17bd975fc388a253c8c006c67963ce3c4404baa0750 -c56760e367b566ed129911eb056bee42f12bec9980177f1b3713068073cf34c3 -70d6ee202c49b42809afd1f8786e14a6c63794eb2ddf49d5a06f34de23356260 -96ea26d57b94a928e5312147ecc40bbc6a204c4b3ee9d4f4361f8df9e1c1ae68 -ef60fbeb99339842e652479362b19d33de080f9625b5c167bf2b11775929b12c -fa9e9a89cf84f249a1078f5584425e2ad8ac82adc298867ebea1ec6c0428fdc5 -01dccde39e5fc147959ea254217153c0b550ef96c229664c22286a7827ebbf15 -c7fcdc57dbb5914bb0460b6e0c0f58c98b264925d9996d9e0d31fb70e66eb9e4 -d928015f2c12acdb7d77a66408f2767c05f93292fae45492e5dcea337cbab346 -da82c905ddb016bba5d31e740b813c3d709d78d7ac50326f90d2e4af4c1dd893 -e26f9767db437b52a758d6237e52c4a2a71624d2b1f79dbe83b6b7839deb413b -f34b91b3dfbc88b7b0b78ab579594ac3d57471074f78e59a64d75b4e6ed3cf22 -33f6ebc86e289402dea3907b0a2406188246e8e44054f81854dae0fedaef8952 -c05c8f5c4591673102a0f24f7deea7e19e27863a27c00b510690b331413df839 -5ae5a37f8c6b25082073bcede7c8ecdbbba2c09467afcebb48f4a4e25cb069c2 -b7acc265f988955a79ba95b3f4d8c6cf94164941723601923409e9d81ba8aeea -64e8f1f09794779a1262020bc301b1966a789fa2f37d7521db536c0c8da36b7d -906398a8a41230cda975088fa5a6070d88882dd8dee7af696ef5ba2c5a525d61 -d35a6834907c4846cfc69b17edf77c58e501a0600a04ab4b36d9007ac54ccfb5 -14a47193ed01d4fd5e3c8cf04b3e38c4895de3eee14dfbe6351bbbea6530046f -89e913d022c0cafe528a33c4e84d465fe6fb031b48d904c5120d452a6c1fdfb9 -08e242a05d015a9ab2536dbadf0ffd0190d355edcd3174cfdda0974e2a33cbfb -2a3d557ed2f6f284cb3c990c3071b7efc678a5d27518ec1912cbaa890dd6bbc8 -824eb1e7ac6127a67e68428ffd67e650fd44c9ec448a309056ce45e4a4a2b769 -8183ac418981f617dc469a566e713aedce2bbc7cdddf1f7affc6d11e94757130 -c4ec7b55dba7356b21e5267c5ed99f427a19daf476e48993e856c852d35ca1bb -b32d59ce688ed184fa9ea1622c306cd788d6372c5b4a94b001f198e33209bb59 -46af1ef7b066d049825bb78318a38ca23ec9a93bc4b4b12806c1a0e5be179e3d -0c0e5bda654e506e74e0ef1a8b12c18bc3f041d5e61a8f03436f146e4daae3b9 -6b8c7ae139f42e8dcf772cb5742104aaf776f3dd19bad920df77b42aac654d32 -2de3779c42639b50059d13b81c3904df76a0ab47046a0132378f9201359f71c8 -12eb4837bcbf3f1498bf8c7b2298e6b2e528f9898ddfaf75b5358a73a67e6307 -707fb13b2360ffdc5659ed8e70ecbab711d89f8c6558622d67737b1108ad5139 -b126a6c7be8b25709fa7cc2a625a0796b7d08b11f098edb80f8aa08a5668ae91 -4ff1c470dbcc7775a73fbd857cdb9a5d0c122d4765caa8d9d35514390c9b339a -c04a78342e186e5c49dba4cd9ab165b4c139e76b88c807cc4b5db7b5063c2f81 -16721670497a0183c643c5a70ab2405d5d8b6773a4a2d39b3cd0d763c12ec296 -9b3c3ab916656fcca5d715e7dac796937b2b6d4adb251fb79b183e6eab23796a -0bd0bf5bcab03529467a265781716b0186573b862b2a2057c427d85d7b547c7a -9e7fdf7a674587df709ffd0a63d0852ea0d02c13e8038762de82362739de9ede -0db4296421d462d8286e2152aa67298c9ff511e8de1a26089d383bdbbf27066b -f322738cd2cf198bdefe566ced1808dafc015c8ae972117776594e9c506a3223 -d4ced495d6229c9bec17c47071415f80482f9ecaaeba6a135d2173254dde6be3 -f0ce9a7a81ec2e9af4add855b08309d34e780adf0f7c9029d2ce0d5f807ef0ee -531217450c82b7f3643456772549acc2ba6a5938c517fd775114ed44ec69a45f -d9110c969edd9e6f8b4bfb953aed79a1daf47c7238871e4d537100c4d8981d82 -a2344eb7df5baebad28e34870d52d97a66dfc75740cda6b403c1964c0feb034d -d3e5c8b4a37acb9f5718f7b6a3d267694df8baaabd38154d16c162ebe43b473f -ec1f060846ee8402d67942ee080dac9b18eb8b09d384ac24f85d287ea3e2c59a -0f2c1d6bad36e262e031acd399a2b9a7940908d65f142fb209416e891a6abeeb -389e2df002436d43fa1161b71382d1842788af1a9e6f39ed56e8bf63991fa790 -a52ce312aaede90df1be57e3c1151dd0350ffe7e476cac5f34cf8505bcbd25f3 -29aeed3a52bfe1f10366dfc4a15fe212b1cc9da76c8272d7ce85c2930d797b82 -4a67de55c50d45cb3640db2a79ecb647a2fd2d948114eea9bad6312319f8db5a -a29d60b22439d45760751904f5de5d8c5c9d0211ac9d30b9459dd05eeea240f0 -97f0c239068c514b8213609014e6bc50633d0ecf774c210aee7c75a5bac24e62 -813181e4d040ad1bd4bd4ec7b99b8a37abd694cb67483d1c5dd5c17f54ea7f20 -50d0ea8ce1cbfa5395e62e10c5d17a423ac76bfba25a38fd474b5b4117ccfccd -30a2ffa484af429168b1b5679b67542755e989b39387fcd9b1d8f8ba313a758c -58641f34ccbc8f2556ad1b17c33f601ea76ac75ee6b681aef12c0712a14e7b8e -a8a5bd316223d5142e8b53a6f81a8a608a3dc32f20c5e417a6aff0f725dd7867 -429fdcdc16a22ef6112fdfc5282c61a1aa9b134c1b420de7b359be8373cf3716 -d7b3ae832ec15e305ff6c8e9d4197f8b0150b30e1b9e7f15275b4b7a65dfc611 -97c0e5f91561f3e6203950edfd6cea20d0649071442b2916ebce5f4d3da73914 -5a2bfe6d055580af134b7dddbb9baf9477454eee8abc7b33eea500102e395212 -78d08c08ae455bc0fc5bf5a0a577e5f5fc71490add5a623ccca134b62c19d3a6 -4019415ecee0168621be2b4856ef3b3944c0db9aef7d3e933a034184934bfd4e -3fe21d4d2625e6464e9ff9cc25e793eb7b8701d3fa07ff9a3020f76d668d083f -59c6f6751179d60eb17b9c4e35f3815aa5ed3793a2030d317f1610215fa920a5 -5ff29a67e8e6f186f00b5ce164677eb1961eeee35b5a7891d4296967a9d096bc -76b0d072eabab7ea758da89fbdc25b8261d9fa08099b6e84494fe034c3edd5f0 -c45e67ffe588b2532efb3dd1c34be9ce299712eac0e4c4cbee6f30e958c9dea0 -15c5c4fef7cd440ea982f91c07928463807fe07f27ef61a5deefa47879847835 -d4e50aa1dd0ad2b3d01069cc7b4741b3f680131f7d5cafc6b3978c3c1d608ac9 -d24342092746628cb71fa01e3c675f14463f9edd4c339ada41ba4b6a0faa5117 -204463bc7b94d01edc1b3d5781898c85516617f29b4dce2d32c2686ddbfdb838 -f67b097be600f6aeefb6eca5f729b45be307232f92731c10c3330672c9584141 -7192e62a0ebae828fadd77bfc2ecdc1e562daf5660354e0edd5b7177bd8e9d24 -f77e526e649044cfd49633d48cea64de714e59438ad980e0b1ffd51ee19692ed -665e2ff332bb54bdbf75316c4b1a39c538312fd649e8c462994dc8f14bf056ff -0804de76474d0ee084e363c8b7081b1c08e252e05e49679e6c7ac81f42e9372d -e5af64f59c4fb62f3e2e7b16ff53bbbc006e3d9b0f29434db5a63210944053da -ab56b1075a0c3832220752d104fa1770d3acfbc31704a1b7852c077058f616e0 -a4373c1c92c7b60566691573502e9a92d583a3163bf31fc100c92e6405ee4d54 -09d23a83225bf6d1de2c7bead011ad64547d6835ac9a7378033c85592a0c3497 -a03c16190ebdabb792ca0bf803dcbc3bdf0f7a571aae00f596ee01eb476bad97 -3a27a219aafcc0fa245c6731a2e8e561c63b7bc3147b9433a8203fddb7138b0c -1611c7e62375f2a114f7bfab36cb1a94b9e10ca63833ab245af595217779bc7f -d12e68a65919eca4fae72f755669580ab0009452bf086ea835f91a0d5b384b40 -82bd515f006865bbee2c50db43b4457a793693806b86f68a2b2419fc3e937a72 -c6f414de148d2a62a71ee9fcab710d6dc08ad6c4ac443365e7a78843f80cd769 -c56efecc2d63487b5fcead1aaaf9481a7361723388f5b51c2d9cea90486cb9f9 -79f6f5ee718d4a49ed91cb091adcbd0e7b3ad963368c9cde877666a742cf5073 -aaf79428b3095f989fc1fa6f5ab1d724d92c33c1325c05a39423b8a83bba9359 -97793fda280740aeb6be3193be5f4feeca2a8f28efa9c8e016f0fc87c8f3392d -5715b9b9a7aa3c61ac84461e2c3220372568aaed851f1cc40481e326197ecab1 -f3cd792fbeb27a58a5f889a5f6321473148c6d311ca89be96039ac9423700d87 -ab0d7e8b89717d1a62ca14e01f51bd77832bb6dbf76b201a04d222852050cc5c -c6a4996789a0bfd6ce364592300282f102e66f4ae9e50d60d886cacb099df960 -c42e2213017c567f27326e677bbd04a239631950b566eb39e4f675d2e989f56f -74da3a0469d988ea0122ecc3670d458ad82bcf7ad04bf3ca9b00d76ee569f98b -a375285a1abbff253b8f179f71f496286330e364049c72ecad4d82a933af0189 -03de5e4abcfc637803167e56911f826735a7c41e7936f4bea148397bcfb18cda -fb03182ed7c511aa9de0c6e6c80b24cb535f03ee16bbcb514d65ca9ac2ef15c1 -aa1825759fc4ecafc7c0d9401f139b3f20ee915955268578a933b184a86f2017 -03cbf4db79be18c09c8cb07d85739b8653ad37b8c0b647161e5cac746b3c0b94 -2ae2a0540f38dbee122cad0cf739ef1b49b6dbbd5d08c97c04dca33030f18718 -583337a015395e1fa932df0328c7ddd9546b7812ba06d82a35f8110d55fa377d -fa6880f52645890d58478e4ee3b72f08b2d7113b2453729b37e4fffad13c5f62 -06b3c767a45c80bd479d1e24df660e46c83c48166fccec13b9cc4e62a6aaa813 -7c424885f83d7647b80849c0a77bed562f134034cda9fd6e8d7dec9e43f0c018 -9287de759676f20005556cedc67c31509a8bf56a5c972b5d247f21d8b6a58953 -7d92101841166d7781d4d80cdc35ca382d8c2dac3ea3a34f93dce0ff8c76ef12 -390d5d57d88f3bc00d46513f0358c43a22c413d9a6ba6b3e13913474b9e53bf5 -31136a5edf9192965aca98e06316c05fd3d6e88fe09cc08e327ed027b81eb146 -63e3073ea5d1d59b74149c5f5242d3cb253c36a84cc837d76b2ba36104aef0d8 -f9f4404d63c42f3d635dc9195ea582b589cb5b54ab01af9ae53f3ec95992c09f -a5bfe86e6ef6948bc387730a9cff0cdd365650aeaa5e1d52d8f88dd49d36e6f0 -786c7f4ef8c2a5a242e84cfd4dc50adfea0c2ac27839699b92fa8feb6436f2aa -d02710777083723ca7e481f83b637f19ffb7511de223a0a261324189edb38d88 -6ff5cb1356e8d567afe76f96cb72f88016e39e99af6aad499ac60c8a3205f253 -82c0312e1f2b6ee7b37d178bd4e67550276a7421b4f514fd293ad32bb1121234 -bff93d2297dd32dfdd7e7ba91c0544f79dfea965f4f67494f3ddd97d7881fcfb -20ed71f6b5cd27b12d04098a9293e273148590fbb65f6fba63e7bcf14dfe6f0b -51f870be20174f991329a5ef3d3c9fce206799a01ca102ee7999c2a97a19e796 -bb5f88922b76f922d302dd833ec532022b13ec573b375cf75e49718b2278f2b2 -4ce9865f20902d6358440efc9eab6e0e069ac7c193c88a044cf33f6a39388f6a -296f42c637533cc503adfc71c5f898c408a7e5479868ebd29c9ed02939ffd49a -2812baa355be429858e0c6aac60817d684778b71fb9a73e7ac4fcb078bb1a75a -b425ea09ad8585ab3fad79429321a8f96e2e1f02ad70e2fdbeee625bb434b0be -f8eb957f817c5699c7293e47daa4ead6d47f00fbb6c8674ef1f7729cdb19749a -ca9cd399a4abcf28ff71edececb2a955ffbe9ebf4bdab56256e7cd66304ed4ab -1b3fddf6431296aa641a8795a4006a049fd3b35074a865c901636b70619ec26d -aaaa8c8c9060938337144209f3e3de01e92293ca89583cbb4c2edec074bb4c05 -15130c3ebfd78dc687f0ad0981c0d27fcaeb28f470193ca13d98277dbfcfbf38 -f8353dbd04380abef7176b0b4199d7319ebfd88ece219ba6edec59fd158987e8 -9adc035b8fb2141be0e0f25d56e077e5992e4f95640abca7aeac3d929be02d40 -9a86dbcc043637c5e0f1a5a12579e57b042b386be96c9a8b3c4e79c8dd28a52b -a1159728785a75f2e579b8669a36a9f9e7807ff9d5aa0d8652609a47264a2003 -fd202bc8fe9cf80e2ef05ea5e5fbae676a77bbdc4308ab92eb0dd9a960f4865b -8305eef47abc2353287f52c766ea1c1b86fdacf0986e56a87462ac820e61051e -7f22cd8ea7dcc7838a45a08ea3fec105d80fe5ee5e87732bfc2e9d664a7ab43b -05321557d69ceed6b679797a67a0c38b9d101bbe870d746568325c52d4ca255b -b23f9672ce2b4e3fe944f5dbc388e575abd897d969ac2a81915e3fec3d7409ed -14de1e4cf7737b6e46f6c71142db06a799a7208539c649244ce73a58f2247e81 -4f241aba74d6ae593d47c227137ccddcf1f523a730a234c91ac3ae8a456cad1e -91a9480c438b047be40bb2e4038f8ebc34ecc3a8037454b7342c317871fc1d97 -42f26e3d956da7679a072cab96b27fb2ddf480d2f40ed88b2e5b0b82892c8314 -cec9bdc12433159714891b8591a051cf2cce7580af74d5096f53a65347488bcb -948fb028f310575d3429123ebecd9b09d83f30ab8c8ab65d49d691fac27e3612 -66ea08634f4c7d3a648ec068c2cf31f116951934864dca2755daacb6d22803f0 -9488117ef66e9b12663da9d00a3eb0280ba412e4b6f6397ee7800f250fbfa023 -3162addcca4dc23190a52397cda3285291842a2b269c4e07f17a0035fcbe785b -6a570e4b75692658ed47b6dbf297adf1b3b164740d1e851f08deca9c05a263a8 -3364c544cece706e77a32f6d5d10f8d4170d5246d92c2c9fae457e0f5e4ecd4d -08b4edfd42a1791cca41078d5e520807817206193d8a649eb39b64c80e126feb -240e1784da3c66378196828104c49e5fb86475a80c21de71e0aa36ac5e529ade -427c03c2236db0deca99c7c486ff463a72723efb519263916e73c25da625d0fb -e45258ad2abf3445b72cbf3e7e64d507198f666edec002e233cc0af6a8c1095c -3cd232e2ec50b2ede3e09b61e25996b4a64c0eec9d55025b1f47e53e0b128bef -a34646b4e2c13699d112c958590058e6b606cbd978cbb0ef69eee350bbf71ff1 -8213a42d135e77e2c53a8121aa3dd1e903dc0e961810d103bd70a2b448f29ec5 -c3d907d7243d76c6ae04c22a8fbc6c1a05f9b9ec97cbb0e76928f4aa26c913e0 -3f8c371efb61f370751eea6af25a3df4ab3da3e4aa263c2477343e4b19915219 -c4c52cf43dbf373c316b80619f479d9b531e62f26ef9fc6da13e9cf0bce74d13 -c2832f1c9d9432437d253dccf73cd699342521a3cfe8f85ccdcd23e9b240c961 -fce15ef77fad8438674b55da638df2492b29fc1a003859f382a776260ae5067f -93dd176181c10c4a45e8f237c5c9781e01d2e1e0890e1a6e75e2bbfda4d29613 -efdcdfb21317d770fa6c1ac3800f328bdb82b48b7320ddcf64add23374971af1 -50470fd002c01ef412c5bb4984737840da5c9e0e4d4b2b7747056a3865af6db4 -f4b9cd84d27dd2e45aa0d9f32d0cf58a5f1baa374359223cfdd07c18017660a2 -9227404eef0abbd0e29bd8698752e85448a5c3cf596dc805a87ff903ff890e48 -b7971764fcd8f921eefcc55b2d20cd5908a6fa35d56bea96a39ab521d985c50c -4e0213b30325d295a00d32d97e95646867122dbef37a3c866fd72e2f29ed8758 -a362a4f17875cba8be23d04a35714d4c27c4417039fc8bcd25365c8a4bb41815 -ce1f74949d6b6aa58fef0c4cbb8d54ce92d65d0a65f13ac6063de4a55ba5561d -509f2fec155b2181a169ecf14f1fab587569f260c0cacded8021ed8d7cae5ad1 -332f1061e166686b41277495597c16e728d6a8ff49f824df503a63322b442182 -665a12900dd48d1361342575fdd5c9d9ddd7bc73a937b2ac6257255414029a65 -9001199e9e1f16cf3cf876bee000302935493ae997e3f112420d7d3f06739b79 -eddc1bf7ecfc5316549d2ff228a4e28b522d6cfaae3148bea2755a45bc27dfc5 -128a9a38777cd3b07f91edacedba2565b55218d7891da863243cf68e7800b82f -0341740a1f5dc6dcf0125cda844867fe4945326f13a954430753a28ea8491bdd -c545e71e4d52cabc3f05dce434101d36a62328c5fe6b5df3864f9f5aec22f399 -43f72fed081d3724306477a06eb9b6fcc9faeb77e62ee4e20cc51600b1bb081a -1c5a00e064d5755838b251807ae57c85675cf04b69a66bef0c19c364969d3547 -55efcf31f8ae346582462e986e3a1d653c205e5d58d21de4553832c885e543bd -11eea2d3c08f883000966c99281251fbc2920917700037278d4934f3441dd535 -bdd3c52111ed0b282ca23cfa97ab25c8726acb13d50599245e532432572c35ac -b9391685d9e1deed1f95fcb151594cd63e79691b5972ba2c3a0c0a2ffaf3c9fa -5ac47d9177a691742e4634db6631c8696d0a30bce1d86a4fb737ab85296ea479 -fe90c51cce54d64087bfc80ae56abb5d04f5516bffb681e6b39f480767f2120e -97d1e8488f1f540e2ebf63eb74596670f5892f4c327971f697c7530778c3676f -2792289cb12486935c447d4eaf4afec65fe6c6962306449e33fb19fb9806f87a -8b91874ddf3e3138481fdc711f0954d73f11fba39efdeb55ed13b16b932525e9 -9f3c86ae60f9096efd4968759def8d629ff2838decbe4c68833ba0d64d1d3330 -b84cfe8ceb23f4b5d55aa5a9b51ee595aee0cd668b20c687d77ff83c803ab994 -c743b43d9882837c42a58cf704490fddcb5646d48cfd2e30464d710c1440513f -4417dfd66d39e0fa6c596e17d07964ebf2caecd0a9fd78e003541ba53468e719 -b7dac2685ccb9b7d857aff1d4432a72f61829010924781f5d15ffcf8d504e361 -6f86c6638469db4ad281d8ec365848b6f7ae1047114a2cd3cf3d1e46e0b4f40e -1a8d3e1df1c1b677702d7fbd5a5924f91c726de2e37b436250eb71610dd82cd5 -5c049fd044b4407784fd83387eb6a788103430fab4f682294b287dac43f3061e -d99c74309ae973bb998bbb2a691402843a1a28ee62ae8e8baf4d645d156b94ab -34680095425ad8b4dc27289e3c6818d6032f91535459d7595b2b9bfc2f44e782 -30f0af49c0a2223e1cee9e1289f682ed5e8ea7db99663a234719667bcffa8077 -e0118b0b9702538421dfada01d97d7a8f232464b9fc209cf278bd5fef80c14be -011a9f6fc78dd20ab012a30780db2507f4d5e1e493f30814ab1c70cda75ce959 -b5d515b2ee8640dd4bcda6710703a9e5670abadae856b86ef8e4143a5f03fc16 -a6c57ac7c3a96c50e45191b0b1c4f6acd622c400cd0f2ae9e9d51236f1b945d3 -71adc5feab8aa8422a28755b63978aaff787158a68c26fd29ab6e849b076b852 -2190caef1a86663f4e12cdf25ba7bf882ef2e0e21c77c14fdf940792d7bb28f8 -892a9ca0bbabe1c70c152f30f366bc86b5bb1eb3b54425617682a5463238c999 -aba3a7bf788a297d2a555dbb218b19ce501aac43d94a0bb6ae290628821efb0c -84ceecb30c140917a458db6fd011f3cbfb4a1cb5ea019db628c106e2a55f1c13 -448edd4a9a159ebb369d509da296da724f729fc7560c00c41f4309e32ea6fb71 -16f62325a5af317f106a8d8c2c01ecce6775d45fdbefdf6925e9a44604dda13b -27cc9a960a21eea2af9bdf6b3cd357d6097ad40df7403005746a30833e814eac -8db72c383fa42ba9fd007a263ce3b74c1356bd522d2611e4e960c9ff5204d46f -ee332f9f134e75c791a6d20923ece8d4dfedcf96ab45dfd751739dbd47b4863a -f0fda172848cd279afd9fac3cc5744c1fa8a5fb4955c6c1c952f56da06430aee -084507664f93c71d881b63041cdec58306100a0e8c77421d75679ce33e2a0a63 -ac2f813006cea69e00352ffd5f5914b63dbad5905a590ce0903ed9b9679779e2 -d9da62f478768776a173832a8f3cd66b6b62484d190baf2d834241000b0eec79 -f1e53b42a74b159bf781ee4415ab6acff86c5b0593cf463bf95d8fa82293a548 -84bb226f40f24591e5ad463ae4b672905e7a4222edf976e8ad889e71986b3818 -bd3eeb6a0c96787c6fdf3a4faed94f0ba0269fd082ac451531e3b0c01f996090 -3f821dcd64642868f07aa0feada34088a85e6644ef07f4402b4b293073e9d308 -bb298b0e44be36bdda218259b4f48f1b638f5007d3aa8ece802b485e7e9075d2 -6ec881fbdecb3cf58c8a3afe0d9835e7b468c648e52b2eddb81dcba4e9678bf4 -b173541dbec382423e80877ba2df94a605bbc2cdca2b76f74d2eb425d8191958 -804617f21172f397bb762aa7dfd0485cd020397a5d3e9fc9405ec7edccbcbdf4 -295a0057b7684a701bb7ea01e8978fb3367ecd089be19aab2828f6825d275d3f -60662c1e2ec5e98ecb99a96d6fe379e2fd158a7106b2190902f0ed71969b6daf -3f9e460f16f1b40cc2aa08330b9fc2e24802bed034b71de445a14bb33f642989 -4f76319eddee328319ee9577740fc803b81714a99bf0a5722981427ba0858546 -c0f77f3919070060704c3bd991d94909d2012146b88c0d35fba7c2de864e35b7 -caf0099c4630443625be3769b01526f3f0c8c821da9d546bc258c004a4d2b46b -886f1ef916f50d3f5fd139e0570b4151dd41f1f1b5dab0db7787105c77b86901 -73c562d3eef6ef741078659467f333450d7d80c67c91a26ba8c77adcee6f4c56 -c7f248dd92520db35768e703f7bd171f9e663b9daebeb9611cf48425b6b35c1e -8bc7a0b45441ad3854ac9b37061839f578256a8e41766d1a6b29a99a0195620f -a090d0ef4120667902b0587946206f294b78775d60ebec668f6e4fb9ca897e85 -76151b245aff8232a90f97a5a93e935c88579dc0f2e9da7cbd02426b3b15ed50 -30acf50107f7b4d4e2c32dd75d6d8c4539176a2244e761ebf1ffbf97d336fdd6 -ef9cf138326e10bdb57638235348eef8ffd33c84b426ec1c81fd8d4a3907d52d -1ba7e9b64dd56b8fbc2362e30f2451b69b0d7cbea1f3101afcd44242d3ff5b66 -89a7c05449b281035e983c6b8c68859734b232a73996a19d116ac4a94f7b482e -1f984371e7e9919c312250c35f6f7fee25ec23e562dcc25cb29ea79dff0e7c8c -fa19280288c26dd5c32f4aeb98c85afda533191809267f0555498da5688b7c20 -219a058efaa597125535871922ff9b20cfbf4c4b35bdfa4bde73ca8ce6abf14c -510ed2072a01c8adfada0064777509d4f97bd2baf66e7151ade76e407066efdd -2e08a15790c81d545b340019bd350c7b90b36adc8658c1848020a77f918e1527 -b3974710af503a79d7947dce93bd81161cd7e0b1125d2fe0edaeb91baf1279e7 -312fbed646472b352310fdfbefdcc4c20ccfed0d6626083b0261d7c47d966984 -8dca4298b9ddb58fe21bb391c7d45d9b562d38c4dc23acb5aa87e3ddf59ee238 -c91318db2491a24110af90539a16940141d1efdf4a13d202f9b9401bc89d7297 -5269cd5515f9a6186a6ef866cfa03730f726d7a4075e0bc6f094e9584a84cf1e -78489bb68dc09ee3f1356f4e45b8621e06078a6727eb72c36fca805213c1675d -4365255d90164f33ce6b2231113f64fdcf5a789cd61002b2a38d2ca5bf1f5361 -c9ae0f4efb51337e344fb7ce15f8edbdc9ec82a9435175f59b6c19ae2dd0b10a -944565e4b14bd1dcda02d42be27fb9f0330636091228e3b89709c8148932a5f8 -c5ba5bfecfef6de83eb414adc613d8534c4e4528d934c37e768d08e103b8ed2a -e1e49bb1b3e6cbcdc3ff63dac7994b8c09203d82a99710449277c20a34e01538 -67c5d5e6abebba650c441d3fe56de997e928193682e5f1faa93a5bc800862132 -ed3b6c005cc0e604231e3e61d17214ca38148c875c268a861a14b54e659dd932 -cbe6ea7109b273975d6ceed351f0b0876a0b647946d29097dd98b5f6bda7b43a -e6481f17743fda503b34a120c8c06f4798c1fcd4e521a30d76f2340df562b63d -dd4b27da8b583547d285f3848bb9fddb60d0ed22a4cb27a2784e8d7662e84ffa -eea50afc03b0815b72bbe9558c8959d0ccc00a8c8c9f740f95b671a66dfdfc68 -77fac12c1995d977495c9ccacd924e45a66f8739de156ee6962c7930f8aac374 -894f8bc396ff69f2249392c7c4248f9cf9ffff9eaf635e66a34511f39a066b88 -4866e776b8d6eca0319f23ca604ead742bb6f6f3b046454a1c0fc242551112b5 -c745e9b8f12723867b2b895c0f93c99df1d542b86c1c9db47390f2d6c3b57ecc -66b1a6ab514a47fd9aa6240b46c54a92fdf80fc44eeed4b8a136fb88b1fa5b9c -a2fe682cca4d0c5a3e994cfebdc270f48e3af91ae6bc9172bd9c73053a761364 -6ef9e68ef58c718a478e7d81e57f34a791c26269819c78574d7cc12632684219 -a1f8e1c5ce8b358d6fbf23984e59d9533ad310d158ab5baa9feda08717a7f5e0 -57684c455a7e3d833f82b4e13e9a92b0b8fba5cdd72a7e46709074ddc82e449a -c906474441066fdd9cb7f341f3a2ee9f2fbf5e4e1a350a45fcad6b2e05825b6c -89077d742619cf1f8434a3b5cc44998176667cfd5c5f4ee51326d1ee3e449915 -00bdaf57c88a107ac49c14cebf18d010c5b3206ec88fd06e3c5114581ee5a5e8 -c4ee5a5c3d48653fb23d28f26862c433ed083af01ed3df8e147548f9cdd882f8 -ca3088106b9c73b9e28786ffa643c343a940bf850f312666e635b8db95c6f70b -83d645fd947f6df322d26f8f9081cae71ba8b9d0de67d535b61146c956801d6b -ff9a69365bda9bc97d8d93142d4c367d5255587ada25e4fb061f8e430f73d2a9 -7142d9e4c17435b78805946e4fde624ea5d9b5c511c9afe2cfaf447cf08235b8 -575ddab8af93588e0c8206f08f883170ed4463da31a53cef67f01aab8f645acc -c2c764f24bf831dcf005833ccd1296025368b3d51a04efd095fd1355e93de563 -e71dd047ef49f5bf8c17b01b2884872257d743ac6fdd8f54e27a241d7c75b387 -a8841d8cede676e35d4f01acba2acebd8b22113bfbef80d5eab1e8cf56f649a4 -516ec097872a597e83519fc1397c7d4a4f6db7daf044835b17d085578f5a3776 -fd5ed9235c018354e801fac338aa7ee581e97d91df0196ea4bcb09f0e6f2e2bf -b5470827f1b6bb0b7133c19bf43bbe824ebdaf9526ab15ff8ae8848bf0decb3f -cfa7d3f5ed71191894c705a27cd9aa30fd384ce6a5f0bc51c5651dd2510a3481 -d086aa87595f885c4c0afcb02b1837cedf85c5e64d440e36581874a117043b75 -78da94a069cf2bd57ae70c230e8d1a0d4637223d14a9868835d8923feb404323 -43c22d0f0e8201c20247c78abf9267915069d6471862c2a0c51ee3ce3153e305 -4a4ec6ea52dcb55df358d1a0d8aafa79fe08ebe4d22e9ecb9d2e50a7f367cded -7169f84285c482fc1effbde6feea424ecdda2494127c7b896dd05f5e62f5fd1c -031de960d6ec59954e8405081601df741edd97f227fd426e0998ca7b9b498beb -4cda9a16715cb699c46d1386469958079ddf5ff174d70338206208f0b9ade386 -03e8dcf31e09f44976c1ad762896a615d9bfe54978b7c3914458c8af4d33dc62 -9f9af5171df3b9e548b24011ec5f02e31dc379582e16f3c999f047b82e7f27f0 -4bfdd827c9a1d19e4230695d4ec499afdb6147146cb6f5a8a26efbd6d0c5f205 -34cb9c37fa4c4b6122f55bacb756173282abd6a2e5219c25b86a5181021f0bac -6f17f89f3b8f74c281aeea7c1d4ffac602c2364c9e1ec8b0a623bd3541765cf7 -aa5febbb6e857810a564850259ac4ce6d641f7b765dd46584c43c8113c8583f9 -e7763d3f4f83649e12e15557f48dcb0a637140b2f7479f78f1f64bcf8a07acc0 -43b9d9ac1f8b2c3b00c36b46d8e514c998fcd47354b364e8c2434e774ac7098b -24c3bfadbaab5bdb8ab0a6b9773aea4175615241249a2a58222df8c53c32d01d -6adc5fb4a933605fff98c7d011266380b305403a79867936156240a5c555105b -95cec3873530fa6d37e8cfc286118a9618c60d6282412d0ccc5a8e3af47a42ec -29cee0176d1c4802144619a5bf1cdf9ec5b8d6f87c379c476ab941da24420a86 -04a0b1ad7884b5e05136139afccf0b7101cae4b8f0bfdbe276aad1b95e2c0d57 -3902bfdee651a202b99189cada176a22facd053bbc73af1c90cbda10635798e9 -8de05c338e90b3dc4afb8d29010590b641db4a9ab707294e55e44c97e275b52f -b88f52a6c7e545cdc73de46da699c8c3d895880368aa035a137fa8686ef4f64e -09167b9e523312b175a166de5e1297c60db361d9505c12b48c1780a00be2a9a1 -43bc6362c731eb26a61097c62c28d2cc8d75ba3c63e31a49b9cb5b8b7fe1fbbb -6153bc87b4538ef5cd4919811329ae933d86ef556883323ed5a6db5c98c11b2c -cc04c4f937289590e5f7ee8d57940f21373a81b8b92eb7ca978c1a07af7b1065 -3e6498a6e2fa734269d61cf0dedd647eddbbe395e1e8190552f9a4332082bee0 -87f28fd6bb19e48de8ad662f41b4a5de657511f2329fe6b541f50ec43be24d5e -e7336712535ece6a590426e10422d130f4fd8b0fe314c9fe068c6a45835994ae -7bfda8ae49fab23905e4d8b374fc654f336b36b2080df61abc288b26b9ca7b42 -68e46f120b82cdcb74715e6d09aac096fd117ace3383beaca52aa248cfe307ca -8930a34b7062fb153d968c93169dd223449ca68765480cfdc5df39be45055d37 -8ba14daa5a4745a9f7b76ab664ef3d5b2fba29c60a06d1a088c05eec6d95c080 -1974ec344b24dfd892db7874e3e9df0fd61ef8f59b525f92f2b374999f923f34 -668e55cc90ff2890107a7528853f44177fa52a071f0ce997ae94b590289411e4 -c0669c936d4b885de8427b60b2f8820bc9d6781bf275a95921d8cf4f55cc8cc7 -73ff7d001f4fc5c41ea1c755ee48c5550677755aee061a3ac85bc0d9c1e5b410 -f38ddb877fef4ad4142c87c42b6fead87f1daa99ee0fbe7e7eee948672373a3f -7ace2444607921c61cefa7360f3194685acf836165e19395c2b2c9cb5778d9a2 -6f35f91d61e5e4838aa23909b46a899a1e02e27ebfb5368f1080272f6ae9adc5 -44f512191bf17dba3eb22d98b9b934f359fc86c9e451d2d4194632a7db5b1270 -6a58cea47392fa8cc24f6b4ec5d172e9e5601617d8e22e837c0b35b4281364e5 -81757e2fccb98fa88879d7ccc568fa9b183504b491329320c968b5611eb1f337 -a6e50d6faac591da994aa47761865ab84651c328bf259be59bd752f110f89081 -7553823cc67e36721e95f1c4e2e372e020f2b2ffb045aa70ca4dd6d55d88e32d -c8a17492ef28a44d4a536fca8bd75b3dc392fc296377b2c4743897c32eb65283 -e776e8f8fd97c661c67c3f0d97343af141bf6b77499a13af4605e36d3f4c3fab -12bc5daa5db1d12dfe5915acf14409e9302b1bbc8c5861948eae329ea31132df -8494560e564bc16073c7a777fefb30cac6f4b8943c70195289946a60f06d4306 -4536c2740995b7247451c9e1619f7e277af4bcbfff6b68553ae23eef7b179c16 -cab6aae7b6f5fc72e0d7cac34611d1353716580948ba69dc534a3fa592984244 -c1bbd0a6d3f1fc4d9c8ff48e770f5c65be3b5a961e2ab8931e73c8222e6eb481 -86e92906bf2b44fef5a59b460bc88ad1837730515d82c337c349cd087329ffff -0718e22bd3f09fede7042992a191575008890c5966f1230ab186f019f1794671 -8e619ce8706fd94bf0fb1d6ec22513150c1b9496742a94e048df079bde5d7bf3 -9db82668e5f5453962990f4e3e0245cd2e767c5cf3754c1371bb37bb7e14db75 -a90fcd5de1a7d75748289177ebe65a397762b5b1dbd468e7cbb3fec66a6b3f2e -8e9a1802bb2cc4506b3ad1632d674f1d54a0c1c08787f274b48d60e9111d8035 -be3af44a3a12e16175ebbafdee5cfce2a9a26cb9826c86207f8ea895e5c2fd66 -216be83f81fa47f39dbaff3789865b1bef63bae463b7d166dfba5e3e9967697d -f6c91c7dbb765bdb91f4ee5920567a94199416484e75cb6b1c0d1bdd62e831f2 -4b6d7b1009bea14c78ca6b8f1020cb05c9bfd13076d5f335d0b8ae417fa26c75 -d04a28a778d8858e64736fa0a5ba789b58b4d05540ecdf28ee044ea18704076f -c3c92090d119bc67594021aaa4e89a063ac0e64f2198c5cdb3951c7681ababbf -6e96666f467a0fdc729efcd2f1d94e193d8fd56802063840696f3eca394c2841 -6b7e6bd4759aaceebdf82bb473d49256e653943469db71794ae96b3d130bf97d -752a9b3bc4449bb756039609a4f9fcc63c637d8672f2f24dbd49a5f9f5139c54 -23c4a1cba345784f28b7933dd3d2c9938b35e63678b045ec314fd9e9188f1b18 -ca034a26f5d7e2e779cfe4d16560ed2e4f3ac2bf1b5324c6b342e29b5ba3c9e0 -7bf1bff519f91bd9cbd4c198f0b98431d83d7309d0a4b62bcd450d62649e5b41 -335d87c297d288942a637999c2dbdaaaeda4f68d166265a37df001b1a4a5f561 -64a9a7af810851d98af3e01b0e4bbcdf33d3035b98118b48c6452da0caecca10 -228a308a0a3844d57628b2dfd7189f1fd252ea1ce3cbbab7e71329b886cc36ef -b40f642aa54698e87f4ce8b310f0ee29968ae04de003fbaff84d866e4220b607 -3b3c5fdfef88354a54d4318dd852ffeb9be81630c673e425fd3bb6ddec9f298f -a9982f8a5859b983bcc09b989f4a71ee4a54d38a220c3ce7491e7d996d8b0e11 -b085acb8f217be35f3eb7fa08bd8ea8c66df8ad00e329ae732ce12801aa8b1a9 -40db1a7b303967c185b90229a1188eeda3a1565dad1c08181fb35ba03667d513 -9f2b6a71dd27e11c7db9a7eced6404cb09250fa0ae2f0fe7fa61147039cb8685 -e7a1566e25b40b1f23ffda5515c107e3487ede0a148f2d8500f102b4f517c956 -87b2e0399387f4a9067ecc725bcb327ba5e98d5c68fb54ac99834146bbd7e91c -b04d9576bb16e39608c14c25aae446d250b388610b2714757631c18feb700057 -c0022456c9ea28140a150dc6fea0333ecf9c291d95505de3c053c1f957f76a06 -a5e96f792200eb5f1811e86d70c9bf1e0d28da28b8c6042555a27ddd0aa168b0 -0f3c113217d990f6ead0a6ecc4ff4c92c577121d2b1dcbff547c03184360a6b6 -3788919d20302f0c35541b48cb6e926be087b1f7308041dc8cb8f161d8a8bd32 -ecc861efd6ebe16568dd47b82fd1a02200733fef4176a7477185d79e44c128fd -c54f4f28cee76dcded7399bcfebbfa620a6f5e4df5350fe6005f84541a6e77cd -97ddcf704455f96435edb3666d9cb57521f35e258eeb2163944c90cbdb3d4a70 -c94b9d3905fff429f16560c6bc44aa27bb481e24d03f29f135eef38d973d12e9 -c251de1d9b976d4d7bb7b4f62dc7a6093d186d240db797432dfb5e71f8fa09d1 -b9b6cbde7b4674bb3f38967091b8b375c0e7dfddc0a206b0d8908707521254a3 -35be48528674c8597822a0a9e9ca84f0b3d2a44ec9deca0db51fa2ef3db16851 -7939ebef52b5af799ff6fe86b0cc459be94187af479e95651233f2515e01ccc9 -57130b01e6e97df375396f8499535a1fcc0dae920db25db41477263a847b578e -8ac94e59fcb69b97a1ebf8d84e2fab6925bd16077d5a58403539acb40adbb89a -55623d7e09a8481e71b47416751f01881ece4d94ea9cff6dabb3546ff2cde4cf -1ba77ecadcd4499637e26c5064a342d71cf50d725c40286ad352bf97e0da521d -58055ff97c68768b4435db372f0b3d23845d7709ac47b2a965327f62573a8fe9 -e9c5c435ddf12478bcdfde41c0e4303b03949446ec9291c553eebd9add6bfb9a -45165ce3820af4264dd3b54ac41e4b2df6ede1286973660e37281c7540beb69d -16a86ae03b8c5ce7ac142585f72a0cba8cfa3c71a54db60d1305790ffbaeee1f -f31774926a1da96a37574c9a5b66daad0a68adf9f104123941ac4d3342c13bac -b9b124ec9db917032e3f495107f3cab93d57751e88a5369e27358ecf4f9348ea -543fb55c0492862ce28cfb1f28e0e5ffaa32df8fdca241db555619583fad76d5 -04ef599f233c424359768f6e8f0cea95774901577277dfd8f90418598e +1b2b9e8f09253b61177e95ea219474796072f4b363fe05fa763777e13b518310 +ac032eeb94b88c7dc8741fef59c541b57b0441c6888237a2b66a182599d1517f +9ec474a9539f1632c9a5a1801fd646b529cec2b430f1cd205feff509b4092535 +29e0b7b372145ddf62052c9c08b7673d36dce58e3e78a8e4788b34e36eb543c0 +d68a36e2831e23c440c3e5f1ba2248633aec75ba8d6c9e7fc0da01af08776246 +9a8009a4f3a93241f2f34c72db3361e701c06538a631f6a8cc47b1b5df7cbf9e +9029d42fad4b90f81cdc2b4cf52c09864f657c7c357180375c0b64206515e472 +c6d71a2c5d03c5143600d0dd439998956b9896ffbcbbb77fc1b6675f1e428390 +144b29367ed224ea9e5f51cb3e349dd118422bda8b6adfe217a02320be72983f +d6fa232c9289e529552708746c4c76df4ff0c7b27fbca194c650679504c0fcaf +0c643c945a2563ed47cd8538edd441bfee93dc4160421cd9efe6cb32d81a8e1d +e1c446eb5ec2a6c855e4449731ed3da1c3ebbc3cfb6553c0f78fe88bea6edb14 +a4abb572eaea91681b7e9f6a2a08005164340dc1983f75b8abe75fc02747fc2f +0c5b31e0f9a8960410d5cc677ea77d0b1b28681ab5e6b3ac11368b1e493f594e +9d037f4fa4c47ee06351cb471af4c1966aad3e51415d70e57eb0d84ec3a655d2 +b0e3a818baebfcc472b485625414c4e20d63b9673b0a0780d8838b0b4004df79 +da0444405db6a534a7571cb1aaff7d4975ea8a578ac37044cb1395a056c7d9e1 +ccd617391a2e852a4d71101cdc3c9350e57657b376cfc7cf7e387414e4a017f9 +943ba9c3aa45e955812e6b8173acbb5e5fd0f0654868def282d134d0b4533159 +c2bf0fb6959689dde7e8e5d22618fe9c8a973a87ac0e853af5542de5b89e7b94 +44ad4496afb696be0eafc9dd7a421856b1c0baf95b5fa887669124ad3698b544 +5e82a4c5cfba4e5083784e52462f3724e7273de6e00e84a1d83b6a8c0e79afcd +1df167b97e2dd796b6826231d31fd02991e990dcf2dbbb0026f9a151c0720467 +e68e2cc0a5fce825564902efd08e2ce18896ca20df47d2df8928baa632825543 +d0f6a5c94630e63411a6adb264443eb7d0f6c3883d195661ca3a1bbaea7bcb41 +d5c18fee8453579ee23f1785112e31c6dfd8e9ecb8681b248f0ce3d77aef339f +b455f3817cf7182d1fb0c53589750be5bd6543beb9c341427d0a4107dd5d6ef6 +2197b85088749f3cafa40a6a3223d4ced495d6228b3398fbbd0d4765cad178a6 +f93c5217bd254777c20cbfbd33673c5ba58e2b021580d63c76bf196391815c05 +d05159b171c9034edbd0e861c5a26f2dd38736457fcd38003882a66a4cf8d7b1 +e2803ccfc1c9fc2abda0271c331247360b7f2cee58ad9cef1b325f62dbe2be6c +babe23a220f662247df70428c1f79c79684890324e6b7166b269b174b98ec8cf +f33b589cc3d3daf1aba6835a22aa2f59f8d386610bfe936a05794242e99cddea +8da5b4e5e56a875c49267e2d48ccae616053235b4b64ae53a573922009e8a05c +a56fe84205488200ac68b62fe4f07572392940638301363c4131ccb86462c242 +afa463e3f7f036f63e622243893261e7ef744ed489397030a6604318da3f592d +037a620fcdc10da51b8f31c816f91016d38efc65b6d463779720ebe8df03be2d +0ec52886ef9205fbfc6563ca80accfecb7c686f0212f85da5024129f01bd81b0 +bb90d58eefd17fb353ca143a4757421323238c5653a3bf9f28cabdce6ff9d946 +867a33fc9ffe0adabd3679b555a9ed3c181d3e108f776e13bb39794cb9f4edd7 +7a607e017fe054811b3ea3f5b02c95343a5eb449723c9fe7857441feab37cc93 +70c285d3d91df0a0e1bb21d022f68f0c0c8bfb311b8efd056f47c67b03b45dc9 +0bd78333d366796421469cda8df6f0095a5eee1a56621d055a5b12d6464cceee +9f5fb6a40ce44ab669786f4f0ff1f348c9d3712761a07eb8aac26c35c694e1cd +65b01b32a2319a381734864a06a349db71a2fba74ddd58010c94aeec901ddeb5 +41e0205df489d02664b4e2fa03a404c8aeeddd6d1506bfe56e2e8a6d3a83f79f +35f2d552dfff754bad59df45582e3aa87e6bd45725b2c44260e651b70af70186 +8b168e440bd70014be5c4ff89028997bde67279b107f9fec9b4b2f2dc112d811 +4dae65205429ffb3c9734df32328ede30565ad65d8a1aa620bd543286908d747 +d13cec2a2f19cafbd2ad480206f8b2b39524a2fee286cea20b22b67dde321e3e +3ed87d8f7d9b253a16c648de1c9c8cd84c4f2304510ee263083ac617954b7c9e +62f397daee458e60e6058addaa14ea573888162b6777c4b5e80c2fbfc8f75ebb +2026c01a1ea38b85c4fca949d15b9a470f36e0b697ef5dcee10c45f01230dc48 +728f50abafaa52ec5f2899b09db8b74f46ed55c8efbd3f54f6afb0691a992b15 +e1bfe3b6fcb6764227aabba94c4450183f139da7e12df63878b0aff0d07c51e5 +21a29ab9fa0482e9dcb043cf704f17bdc1fa1f79bac725d6fb01dda18a700eff +5d691d1573cb0ba677a9b1a62dc483fbbb7e4fb0ee0c87cd631f7145b710d181 +85d5bf85df1cff42d9dda4430a8f6f4b6f6c01d20055d8d9cf1d48f268e046a4 +9bc64bcbd7742d090608a1c025f39d44bad9a05ec2c7b5ea4b48959f1cab0974 +537bdbb8828a830843ecb3b6bac3589cb8a35fddf8a55fe4445ee3419ecb9dc1 +3c9a3045f5fa5264860b6e310854cfec5bf920061c6a4784d911fbd82c6b5353 +72cdc7ff3dba22cbd02303654e4d1ce6c5f03ea5719bb456d1ab804a6a9e08e1 +15d0ddbc46f2ff494f0703fcb9f6c079e5af3f4a7bb5a4546f9ef8d708732fbb +1bb4d11a942470e0a96d5c83d20343876d89fd6db3ae1fe60034cb97659382b8 +03a4c8ee4a01738285c8af5812c4de7a97b1eae85315c9497c082b28990e232d +7603a06ade5075fa217ef86ed78492c31ce4082f14a6952e0d07ca9d8e15589e +7c3f49cfde17055e8695923477b71b4c09986c62875e25576dfc3a3854c1cf5f +73004b97da00a3deef1be0aec1920342613d3e4f805eda2ac121809b02a42d3f +de9e9245943a23627ae0c1c34b5e6bb1504ceb67966e9b6f104fddff62e82b16 +cbe3d401aaff4d9b44236ef0d04b7edf16eb08b7d19862effe88b696d05008ae +ffbfd118722a55a1597604e232416c2190b36c30928f82b208006c26b85d7428 +7153fccc92a65f04229c8d7b2c27ac4294034a051b45f6ed5b0fa3e23af3b5a3 +5f996bb65cf298c4e15e98d228a719e1c968e7d5d0a75a9bc3cdf8b5c4a136cd +a6995d94f5dbe307ae1ca6beb56dfd09a6683bb1437fdcd537e43cb1633a72bc +1e72a5f98497227072d863dee990660c137064f8f73d78d9c5a40096dcff10a9 +4e3c9dff0d2bb80c429e2c135895b2b3c5be663adb1bf39e3125e4017a6050c5 +d4dac24a8149a6166cf87493f766d9706e13a4c3b443722d7ddedf777c5d0bdd +780e839b10a61dcbb8c06caf2246feccc66c6fbaaaf8270e06a4838391d7ba0a +a3d35b278235fff9a707e8da8344c078d88e8eb2b5e2f8cd8f2134d458221623 +1dd96524af97b92662292f6e1759e004e2255dbdc4e0a9fe007e550144af357a +32cd32e348fd2e60d4c10c33d032fc02ff8a897c4b4b5c35992e6caa8bc4c966 +6a520e2e98184efcb59e2d534fa34c428bb51998e68e91dc9382e28798845da1 +ae9d6e418c2e3b05373fe26901654e1e1a7849431681479cf05e0c19392ac9e0 +562794d94316670bdf9afe2d368fdc31fc2a2a98dc8f23bc236690d897e209b1 +c6048724f4ad378857640140a356919180b348fd6ceeb5da8e4b3f9dae1cda65 +fc155e10b53a271f23c65397711cedf404dc45dcfd9d3c87d57c1365cf9e6f9d +64a11df0f71f72ff52a8a4c899879f38e797867570844ce904c3104e28f1b85c +e31f5e4dc09852f5b47b4fcf2b1fb394f4a8c9cc8b807eaa9ad4d8ddd816a28d +7bdea3811e47722cb0a11f3967bfdc501f5f19f5b7f925455da271243465b55f +56030748235d6c1e8cda657c5fb7c1ef58427b148713c569d2fa172a2d32e50f +7440f4cb961d34feff587acfc3009b39005f8ef1b91c28718601d140034b4030 +05dcca93b5d4a0778cfc1a3fbf7e489221c88c27e05652d3c3aacae2cbcd9b5a +439d3687e32bdaa54a317a6f70833c88af86056dcd68e8546832e7662713ce20 +98e5bd9dcfee48545391246e794e408adbeba57fc3a3ba4e18e487abd6f26a3d +085eed9bf8e30a77c85271294eff2f8e3def17482c5455dd60fb942f85dc73ec +9f57db31ce83e7e3574e17004ebe6fd903f485e5ea88c8294ac48ed09afa41d3 +80ea17e2cd33190477a0492a51ba20be31a367e6260d0dbab050cedae7659cf5 +a67d94540d7022178ae1d4463f84630d51af81054a6b7ecf1229d9ba0a6773c8 +e3aa1a9d95416fbeea9ed901f1dab166058080d42f90499b415ad8aafd99ac0b +7220401edb7a32b298bd9b9010679a1f9369a5bbe7cbe04b2c395f1159c2a2fe +b4a85292714a8f491e29c703932acd583f6405828ca8331612f5f580c049da26 +22a27b7aef2806c427af57147beef345e56a2ad82b0fa3662a31828bab7f6b6a +abf00d5bdcf2d595ef576d7da2ea634a82458444145803d443560553a7d17313 +b67ce7fa22fe118e9e8187dae14e79860b371c83ae2ae787210a86a6fdcb95d0 +c05f1b2ac98eaf239af2469397fd8afa989eb8ba0c15412b9f90c1555cbef583 +25c0999b1b10ce4345e6e949b375a91ec348eda0b0d418ad25ae482e02cb47d9 +ec19b444406d720a45986bdf85b4181b8064872f65e7a93bde15ff80ebe555dd +8adfc28b6ab58525a6a72bbe50cde6461edd83ac9359c0042709e63ffda54a50 +a5a6e72058b498b7c494b2a7e68014bf1c354506c4dda52d7173e6530340f834 +7db62785ac8e70a8f560574249630f3f89c159f31ce437b8a86cac7f5b25ccfd +b2fc41fc8392430c296146477d501ea752cf52ec9bfbf462d12b39291f49ae74 +28485eec80df5a1fa01806b3013bda44477e671e87e82f58fab32ffc10c111cb +76e7099f297d6a67a7374e26109f751361768ef8118dca742c8f20774549a2d4 +da72d15706888cec1edbfba70bb8149b54655eba7caaa85529df4bea9ce0c633 +38837abff2597c6b75bd058dfe7091d3719efc3964d1a386b7c6b93d491b02ac +86b08ff115b548abdb68f67de3b6cd280ee1544ddf344782fe30913a21eadc6e +314f3ea2ab3d9a3783d5f9be76c4caed815af7def664098cf1a167444f31cf02 +b9229bfdd8109322df0cce8fe0405d523bd8020753f3d80f49365d5006829fed +63cb9571b219b3869dddfdc2212f0fd468aa3a8c78d06f58fc6be0753bf19eb2 +b014e28d06053e931257185ff8a46b2c443b163f9d9997cd2225a33ec6bef513 +41aeafb9f384bdb7f3c78de5d4adb511c16259b1916b29440fd8cc01dde8ccf4 +e8bf0a4dc53a1e26c020f813cab07eda515e7d395348ecbf8c64186fa5a81390 +7653da3f3143382a374b96398d14bf60fcc5f7603512bed7e8b33e7b20529244 +187795b01754b61d5aaab742be9be4532ddcbe6b88671076aa9551ffd58e4930 +1f3fa48529d85586f1e197dd896f91f0c64ce80bd48519f8c1bf9c4816622cad +d9cbbb97e7628a64f96b6816c5b0312bb98a23715c3de2a797015203e2787aa5 +ef40b3e17cac398805fe76a33819d4825f80654270445ba955779204f5e8fb5f +418edf66b627b992cd3db5f04b18b5dd3f742689b3182d41760bfe95be97e313 +ed97e32ecdc16d3d574a2ba1092408b5ad6c165a39eb148b2513bcdd01141a77 +0720028f31693360e9909897d85bcb5364188d391e34dc98d86d4909fb41a13a +cd4e43c7f943889aaf1d430714d1b0f3302432135a39b11be63f77d04780a191 +cb686729a89c7badec30d3a9b416c32350eb416fbd37104d038b0252a8b91f77 +45b543618155a76f06274dfcc284bfea8726e55ee8b47df6b4760e22c8f2020c +e0da1fbba9564cd974075c1670bbbfa32b5b1598d198a1a9b82d87a7814f5d6a +e5a97d890ae6e9307f3147d78d4fa40f5388b9759429acdb0e20d9ddc923f4cf +f2865f95a8fc0595724b0043e90091a2315ea8c071ab631ccd04c3ea77541646 +b2fae2bd69c5bb80849b85fcc583ed6bc743c7ab0e83634e9625262ca557911a +3715e19e727337fd16171908a75e44fd7f6ba76157167a214f11c228bb1f132a +b6cb965beb1aeb597276e4e1bf52614076a37eb859f9d61669257c195560586b +b567183114c9895464a71774bae8eb31e9de3c11e0011f85024f749a571a3e2f +0fa7d8ce0d53deb20fd2f10895bb8aed95ac89f8956a8c93e809536e9087cca8 +09106a42a59417359e0ec681c5905a6024bd3208fed44320b723392e3f900e90 +767a6af4c4e67b407b215422a6f409d59c309d1999f973fd9b3746d983b0bb9e +1675aa41b9f6713630710faa59328b3659f559a5e547451191d88e336863256e +d43a577b77f81bad982c3d06cbe5a12321cf45da2d300346d8534c4ed6f449e5 +14ad627693dd361913862aa14548113a553b5558f8da4f5fe5cce86ef8b6efec +00b188a5fa1ac6cf819110e6feb793411cfac4f900a379178c2d7990f8adfe06 +4d741594d2134678e7f9789fd72e87985334ce7e531f0855525b9dcac36196cd +2d75d8bbe2b02ad9b20184d54e9ac6bbcfdb0d13367e2b4b4310b9f89172d59c +385866af42d06f9477dbb56e8d3bc8ee8c129849080ced3d7b83d9dc1a32da0d +b79f6e1760b7b836e2d9a0b59dc7312a3cd10932fc771d14f0f2278479e7168f +2f4e058c0177456811b2de2b5358ef33a162bdbd4d908e3332930d0e1bfdcf35 +ebaad4210a5f80a39279c5faad2803a748d96651778d0ce97289bb70ba010d93 +60ca05073141c30ee35fb9b8d9eb3ba37cb97fe42fdeef382fd604a1cccbee9a +65716ccdb777bee502ce3b654612362291ab13fcb507ab797d697f4f32d85763 +39b9cf437eb119eba024e775fe01501a8e7982d266531a5a9316abcbaf5b9672 +8ffdd900cd9814cf82b9ee6e789309cbf1dfc11f715b1a201dda33cf7527da51 +cff0e36d2f4856808b522d5344596058508302f36554419f9654f941ca0804e6 +b38a6d596ca3fd660901d1c3553aa92bcc95703219cdb0cc8bb540c2e60ce0ad +0eaeab36ac18b3ae477967bf586ddc3a45b5949ca5fad78910e834d8c83faed8 +3cd8b0546efd2575a42e8d4e44c80f375c9d960686e6885a6cd283ad3c1f1a9e +8e0cd7ed0590ffcad9da423285a26c04960dfbde0a5315d81e5170ae081644b0 +2aee581ab984fc189b5adbfb155a52d9f7ed759091062e9d2b2c2b03c9272ebc +a0101422d252aeba66664b23a123ab5fb05da5c62e83934c10f7a9489fe6a26e +72ae45fa17dfe3c1badf296c09a375d2451b7b7ed5dfd262a7c74fa4a9a4f5d1 +f431bfd1e79decc99db3f7eddfa78dfc46a47c0881f500f8fdb96aeb4fc4dcaa +ae0f9687e6edb2519ea85fef772477c3e33ddb52900657f018ff227701992647 +c9db8e4802cb0d6976b1cb0e3dccbc573bfb38ecc9db8a95bed9c4d90c97d3b7 +0f87ecba2fc8b03a7088f1eb02875c27cbfa32efbbf38ddfa77ab23c8fb36d1b +ce1112bfc0de7f911f1b096461faf86cc41be0bf61ef31581847b1b478fe28c2 +cf6a34770e43a95e08ba67e429545a65bb9e6e18a6c4dd2a34ca9cfbdba9cfe6 +63826142391f15c543076928f9867bde8b2b1acefe68c777fbcb70707f4f91e4 +7eff73b0c3c26986d1ca582bd05873f4e40179723271d1799dc4fc5e3dd9cf77 +64e41b8aa8dfb907abf53e3a0007a714d6c941114f5beaac82c46927441e3402 +36c2fb70de002ae35627ee5119577ad7fcb9fe5deefc239aa09e6bef15aee873 +db24b3cd614565415a3077b20c1b095a5726ae475c889cd9341c93d4a1984709 +5ffa8e8ef4f31ea7dcf6375177f319a05e551a8905bb47c9f23cc5c0e5fcd8e0 +29b3072632a060e6891f2b77bc1da20cf7da33173db210baaaf8270e0315b6ff +3fd6c2207b1a429577d5d9d66a0f8268d4aaeb29681a21f7319ab813e2a1eadc +39b8eb7aec1c33cc62809a10ef560d2453ed7551f097960efb4e4708858d5729 +6307189fdfd3ab62c75a7c501fada7428e157752fcabfe629902715193acb11f +ca4aff2b0ed13442450e4f2a4873d5cc3689f7d4f7e372326e2f7093bd7df4d0 +ca957794a61a2e813e24155ee3a67c4312a06c72f84acba679e67e6c71f43027 +cdf8a21da3bb5f68e576405c1283016e541a3e9eadd67a20ff9ad7a658a8b831 +2f30c18c451f553c1149960156b201304263eff2f2549fef2e4906909c1b4904 +ced62fd9c0c973b82dd66044bfcd36e1991e0b6b84b6102258e205a458952aa9 +53832d094e6915c3a1669d4f532132424fc707dce60bf9ee9e06d4035394192d +922641adf5777d563ae7960c8cd6175dafb255747737b02c40687953c766601e +caf56e747afdc67f8163de81bec4dbd48b3712c0d24e92747d98d5d1da952de3 +eb9ccb3a132121cb1c9b2de42fe1417bea313043b5aec119bb0d1e3058a82087 +bea4d00203fefed8ac113723b1081e92ca7e91363b86eec7bb5dc2e123e41c66 +577dce271c93c667cd8665372d5d3b906070bd229489a91867551f3127591bca +b1ce86d7d9bbd5f265bebdca4c58af03023e9ba2c291d78b629ef48bdd731c45 +591edf98d4eae6290a00c331780943d1c6671ac237a2844cbb84082c06d39cd6 +b04a2e5819d27a25da749ee7c94488fff5f59eb0a3789522ea85eb999c66f359 +d1ecc77cfe14774fd76b97270e30e95bec696aef56f99123db82304bc662d8d4 +6b342e53171a512e7d435f3009de3613d91a6f32f9ec2e11bc98b09c4dc4d516 +8a2ed64ac351109e5e38a68caac84ab583421eafafee02980bf8d8fc700f1a00 +129564d5efcd4f7896130e76fbcc6c6ad66411285958e3d17c2d408960cecab4 +02c5068c43df99d4de6b9876ec4fa2128d9ddcb0f10aa89aa8935f22c9445804 +4c1b0ce6cd07c272cfaddab0719ef5cc8c597960b7eea7b4cb5a10c826bed1b8 +219d464d72a0be58ae80de6edf876c04dd2abdca41253efcefc0552989dea491 +9605795e6ecbac4ffbc39307ce1fc794d4bd78b64ae38b2750546b8613378f70 +7c5c29640874f1bc3549f9a381ec1d13ab38b1c20d59f90dbd2397a573ffc9df +525a4d4e995618a58148687c5c949e14c0879316236284a571a5a386fc94cb2c +c5f7327f9269996e2483e9c4f22a813db3ba38cd036a454d335497f53d654d6f +e28e4583febc2fe34cac50be37bb6e42b8f92f694cfd4f805c6423089bba4461 +8e36e92d90a06f749d8a1dfd93bd0645dc66cd18ee797ffc06d4938ed9fe7959 +ee2ee5daac4e5f2e15a8b4c311eff43f5ea1a13fb288ac57267b71bd0ae02964 +f1901a7b5005a834e366399eae62532648625bbc13c64c006c372491878ef7fc +645667f249fc7ba564e152012e485320fb3c5dffbfcd936a93916045e0ddf257 +992e927120370994664643e2d57678fb19f0754ec4c483a8b6ceae60d39703d9 +f309e68388cf20bc752caee575c86ba39575a07528b65400cbe9fdae6a5f307a +b199a54aaf70c5889bc64a30d5cce65c2276ed1d9fb30bcdc94a65941a2b0e76 +3940f7d243c8de8120b5b2f2995d2ec3c7be6421aa1f7a5f8b6050c17771c5f9 +d61330fb818df90f3062f9f21c23fd0a59d6ad28e023e0d3d7eb4dfbcf0c6bc9 +9fdfb74f740579c8460fa6755dfc800c5327da99e494d9e18efc6752f1e6eb31 +5e399606ddfe98339d085bf92634d2f557d2a07db440f45fc2e60732c51fc4c3 +047f9f6dfaccaea71a9b14ae1e22223987cfc33856fa6d78be0c8b4cfbd8d608 +96c0699ff248a80af31d111d3d7437427688430782e1e99858a2379852ca04de +bf7d0922b11865b5771d902dae865c3ff7aba28da86ce91a6c031a647b6d5676 +672480a7ea057dd805ade4318482e9f5c7e2592df1672342b98c8b67cf25dda2 +f69d55e28f1c35b070acca2e4c5100c18b102164f534b151375bf8e9ec27cd8e +e43a7a23cca2c5462ea92b202d9eaae4da36f8df69c38a4689b04ba3e6e6a2a7 +8b06763decd52595b21d5348e3f6fbfa775f8b88330a4f35bc3213a5ba19d277 +4fa8c256d06787e6aced43124b422d3ed2ca884c64da93933135926880b21cac +35e222c4b6076bb2b391357e0c643f04d209788fc140c7303c90a3c3faf5fccc +046d3b268154e017f1e4082819de8a5bef0c1725f008b936a243b2eb850d0900 +4560651003c30ae5fd462d8e68e4ae51d17b636bf9d45c7fe07255e470d2748e +f9720203181e528304f71c1fa2fdde7872ccfe55bb77c8a04b529cc5ff114c64 +544c4896f091965dafaa0eef5e8671d258f4303512567dfe2eacc764f0ab9a78 +206ddb0942d1dc868d52241185e7c830c57f31ca9c08453c6a8f35bfd7220a52 +3e3148beb6fca0c2d56048b7755f068220d59d4fc713056bde03b1146e8e4b37 +cb5cb8a90858920236e561fa21f179c12f7be7cb63eba15759bf0b6299ef3835 +b8d41edd37c1f1098fa2bf3cbbfe0f7a98620e7b072f5ce1c90bdb8d5f6fa9e7 +8629f3c6b4bfb047c9ac1869daf234e4a95bc0bb73f036de76595dcfa2d5e856 +22b48bec72edc8a798ae673dd434b01e89019a908f59089c9789f58b8350a43d +b00ca1fe192390daa4e85e7235492ce567dc403ae5fe8f0761274973e07ec119 +1b0ae1cb7f6f31076771d896139920861da5c58d3403a416f243f1b58cf54e94 +f3dbc9351633887e8d7ea6f88fc4a0dc6d2a471a78f98ebdc2a98613499a80fe +b166a4b803b7b4ed05ccabefb2405745f1ff28921a05a0245bfae09355910031 +180305de2f64f071a7abb75a72eff13539eecbc4cf54ff0bc87f6d72d8a742cf +5073aaf7942a137ab2f273e22391ad1d0dec9dafd58ec68553be5fc4e6c4936f +a3e67a86f4ec045cf294a1cb7f9a60ebe5178026fda700042cf5bfadac3d7ad3 +17f9bfb62ebd5946992569e9aedbdce9f3abfaecd6d8fee82559f0888d48f794 +697c54b805026ceb1d708751d88af0e5cf88332068833ceeb24223f5b5025384 +066f67ce49e586ebc4249bfb15074cb522c3626bf2571af43f0164b044b5aa66 +9d8217230edeae2453fe02f018bf8a8043cfd63d744388c12cc8430ca4157c81 +e7018b963021ef43aeb42f1f5246eedde76ad7507e65225430f2ed40877214ad +78a2e199f951e52790e30ca09c0ea8bb318756137639532e638661228e314364 +1b1d60aefb5222a3b724674ab6fbbc3445b878f99b629de47e52e36693dc4060 +9fcb048910f3d70211659cdbce05f0733af96afad264d1841b2fe33f3df5262a +92e98f7a5873f70b931a7c78863dbaacfde460906281d5ba5accd188edb2924a +bfc1c6313cf0cd29ac91d2d374734280adb1ec4b2dac9b53da1134b7ef26d10e +e05685ea4b31e5396c4281ba371b59b12516816675ef303fe4f01f1f84de922d +69edc0d18568c06d4dc79be0b9754b8f88632fc3a74fa418833aa2943c05c912 +b7b60343a7dc7a3f6f1aea9d83011afcc00619ca95cd8f97ea85176570bcb441 +e9b74ce8b100efa22290b3dc8113db1b383ec98f8367eca2844bf1742d752d29 +7cca604ed822c3f7b560300b39afe9fc8d9340735a718b09064157fd10d43dbf +96302c60195fa1d5bde0c68c4f235184898d0381849a6011239ed7d6c47814e0 +a163b82e56389248e7594fb9f4a2522ccea4eca0d36e1295b3ef67aead84cc8b +c297009eb5d21eaad7ab4176a443acadee13915c5ca44ff41ccc2bb9abb47fd9 +6461ec3d38876df77e5fa9993a300c39813f788e17320de56592806658b42a04 +dbcdaf7bd0684f445884e6f1a574467e52019ee8fc129ff3fe74fb03a5d67047 +80155de767defb2964317f6d058d5b8cc35324368469291ebb15cd320d566b96 +c5079d12493a8f84dda5005f8f3fd7038c40d1e704b4faade3ccbbdc7e90903d +fd3da3bfeb37ba41db2557640f2bbd6f3f49d9e37925007cb97f98c6e365d06d +282a433e1aa95dbef41be2facde3f5a08254a366a74b7a2f5c14898881d4be99 +aec4b0ee10022dcc55501637ef6f6570d437dc8120e63045002d7419057e5c15 +6a5539ebefa7d632d343a41df8804a6f855eaa3186b3f97fb7f79fe1377f5472 +04e186f1a97011fb950ecfbdeec1ff992b1ebc6837afbc0d9362c1712b114bb4 +4747c291759e7fee3f81b000f9ce65feaed5c16287f5e812f152ec27815bc6aa +35aaa245c882c9176baabcbb81548b5f271c42169287da48a7c6140af35f09a6 +b82abdc84b8220577cbf0ecf0d8edfd303f468ab9d6a2b89d806b3e19297eb13 +eedade8e405ae9e0e9412525f95e6a7716948fa2ac037dce19d67a156c5b813c +0af189b9b778bbfdf730c2050091018865e23d6cff0ea4fc0d26a0cc510ddf5f +456f6aa4f1c33fe7b40f5f8576b477970d6487275389ce7b2444f09e3fa5c426 +9090dc59354fba985544a261230fb1758bac67e142c4a1e71664d7f66eafd525 +22b83d1f2cbb5f97f04924e8cc4645b27331eae812266982efccbccc4ee93bed +e1e0ae7e88768e690cfaa0abba98973caff66daa632834527b26260e0a4b1655 +3994bdc9c729f2d45f72ba1c510a000b731ac3d9191e1faa5c9cbb7b94056d90 +f65df04c47abd4bc12b9ba0c1f84e4d77081d773a9dd939ba4c4b32785bbb337 +ab4df32d20ce0df7ef0374dcbf88be107e8813b5a769d530cded5649ec7de7de +0f7f373f006ce997b6f7bef0c52d49b8a62a620a37069ee851e7d23244f6a014 +4d50911d347551a63f9ea59cfe0159797af521c09bdf75e12a4a8e4c38ede4c4 +4e7a9712340d42110b7cbf4061ba2f2a5ddcf67a39eef57345975a9198fb8573 +f34b9a350845815873e4ddb7866c702ba7193fb92d21bb74d8bb4c49f2f3c7fc +3b703bcee9e7745fa637a9383786fc2729c73c29d2efa5ea274d9573265df506 +c1ddb510c9f3fdcd3a80c0ab90748651537efa2d8e0bf374472b5c7bb50b0101 +7263ffae7f90a979c3e5f3cd8a5cea478627890536251c4c16c0f63c1c822efa +66a75e01a68758fd97c5928bb2b1df6f2b74d2950015f2eacca793e7888c26ee +723e78f3cd926b1979bdf422bc83b4b51d1a0ae3ce120540e9b653728d769265 +c03c0a3cbee6240c0de90646e7ab730e5e0cf1124566bc16ec17989c1052f8e1 +84590223348e5b4510204322929d8632c4bd136c89169d45718a88babd7f2cda +62afba21cc46bb3207676b96695d911fb99bbf37b375ff4fb8be949fcc4b0481 +3776a3451fe65a47d623565160358c977d4bebce7aadea5648814b8769dfbaee +b8bc2da767da69b10daaff6a50b6a7006ab74f8bd0ec64e5681199b7f3bafeb9 +bd0ebd1a79554e8cf3e5896956d279d4d27202a4667afbc46b84c6b9873e8ef6 +9d5b0777a750a5c8ce86f3d5851cf3203e8b47edaabcc6c6256872f31ff228d5 +7b686b38b35d5dca23c755a5ab9e661630e61d1d376a46466b1f0100f66affcb +fd1d6befb5b196143998848e48119456d6f5791bf1473a2cacb9973bb80421fa +781d90e0c1e6912dcff9ff07ebe821aaff09597bdea4e71e72136c4e37946f0c +146b9d507ee79dc7a715cf4d65db2614cd87c5709112938acf9bb2e01187fc03 +5cea0fd5c2ca980adb6bbf5b9eb427971bed47970a13775be150a7a87bb2b8df +a92f8c86b98a36ab956ece9f5c562071306642d74f177ea0ebc1eadf96cda6ee +4c53703763505ff273c296a11adf59c4919f63c78f9b7c2fa998f5befc631ab5 +4dfec01d96fbd7d076357fd85f26eef6c10aaf99a7639c5111b3a13bd144bdfa +daf1fa9633b69feb2590a878ce4621251a2b860b3e1ad8d7a6ac1a896380f206 +158dbd525bde081e9e7c58f7aba0ba68a22065d3fb7638ab4b2027cfdf4dd926 +0f624b197d19691e1219f705d63781d6eac4ed8bddc3cbe2e7c735f73aabbfa8 +01081532536832bb4455483b827fa9f37d547a4d2cfc98707e5a4efe77037671 +faafb5489b64ea22fa51f2df96a89e8f986b3fa39e113be69438f1a4bb1b5d1f +33ed7ca77228938a98bf47fa54eeb2da8d81ecedec102f71c278d824c2bf5bb5 +37cde6342b1ac156946de7f6c4c12e1d639d83cbe78d8775cce11584a4edbcf4 +59c05abd0b590172401b83fe9cd49b347c01671277ea43400b1ff4212b3d02fa +cc6d384f815d7fdb652ab34d7bacca2e9b2b120de79e3532f81d778b6081d631 +32c88f10184f07abe8830a3f5efe712e7e3cac875f3b157ca3a0dd8a0417d512 +9554ac58171e09ae6ad91f69d3235be00c67d41e00b6988b7df3a07e5d65538b +6f600988178e4c98db360c5ded8f7f8b7866e6d3168a085ca9a823a347519ab3 +5f4fb80774aa4bcee175c02cbe39ea9a0ca56044f50ffb2fd637f925339d30ba +8f4f7fd7ea5a606dfd7b82ba69b4724c960a5cb49ad40f1900a0969cd912957f +345c08603ed7e8292789984bcfafc504dcfc19eadb79ee198dcb6539164db7bd +4d210c9bde5bfe4207c363af21967146511d70f7a0fd682afb045cf22a37bfaa +edf500dc18251dd086a8d2a91ceb979d2a1e9cb45a6b59afedf66174b764dfc1 +1048356c96b585d142f943ec97c62de95f9b8a8253ee0d6b2b0153c445563826 +787921b9a60417cd4075922332dfd82be6d45b581b581c24c4548ac5782f726b +0bf70d2d08493e9a96668054bccea2db3f66cfa6a4d37b36418f9fc8d8058c9f +e713810483a5e75b3f61cfc012dae494dfc2b717cc59e417e25e8c0e21f62186 +acab4158cdf47343ad8b73dc8e43dc792dd29897d8aa1fbb977e9a3dd20fd247 +d0ceb53d2fcc627179dabb49f2920cf8a1fa4d57f39da7e5ca0a94d377cbb20e +2c98445881201bebff5e33ce17d8089f552c3dea96bc70b99cdad2289a3686dc +b5aea099076ae9450c3aa43f18a3d98d711e43835c31f566866ca556b2945738 +f359ef7e7ade8e1f56bfbb0317fc2d08846163cf343c919adbe19686ab94f7b0 +7a06f3d97d5545df781e11a06b06b175fbdd1316580a66af1d94f4247f158c59 +d8e1fee6ecb6ad565e772fdcfead3898a5be123f2d0303ddda02b8e86c7baeea +70eca3cbd43509a85b853eb3286deae9e29921782ed417b13cf1e6775921b2dc +ff5b2424f98bf14408d446d0ab530d88f49d231315c6739ccd0cc8d01cfdc259 +f47bedfe7a53dd893cd5be51674e6ba162e1a8aeb2b21ad54819bd3d648318e5 +4d651933c280e81a327934ef0eebb83b795b3b384a129c16536bdb05bb2ea560 +72241eeb5f35e10fa050fc0f05fe4deb3e2e8eb52a97450c56594746d0278802 +9559abdc108ddd3431c2cea2da1886ebc7a973ef73038004fa13752c80a35ee2 +8e5772676df858dc9ff0d05c735576262b80e3e49751d78f2febd65ae4c1d0d7 +66cb53656583299d2c058bc94f272d398f72728e72368362a69f69af06a708f7 +ceac24a0846496457635fdfae466621eb4e0755230abb71bb5abe293abf7cc5f +8ea2fc15c66a5b2fc6a6d510a6730d9fb678a485616374f5c1c01b2ce834add5 +6f8dba31a95983c97af9e9ec5b8406fc67dc045c551ddf6131834edd18f79d55 +983aec1d18d5fb2209e87f1157df947772de42d04da8085d3691dc7010505c0f +a9724190d9a82611cf435b360971bdcd2e569629d98d439da052bda080ce1e33 +bfa5ebd35ef2e7dd77bd517f1cae2250b13a031c69bfe0d147919c53ad773024 +142ecb1a3ba1ab50a941fb54e63ef49edf844306f7e5d12c9090d2819dc6e450 +42936015482c7bd75693e910eaae10f04385f624083d00276d0499cf9891cecc +d31b06128a7afa49154eed960f37e7fc260e1372f1d4559062471db4f0db6faf +efd3e6e06b578e2ba8ffa1e9c3f5a787124a22e0111ae960bd85fb1d62b6ca5c +b2b3a87e3081470706237fcf936e37dc5b408d0c41299f921d810e01b5052751 +cfcc27024185194c147fe01bc1c4409c520b3e3a5c0f5514aea4cc899ca9e9ff +7834dfe5bb0b4b0b019c1e8163f294fb6ee50b05fec276b53f04160fce3defca +2c33ff34f6b1515705ecaba0aebd40a99fba99942bd8d451e1c1e489655daf7d +39437b97be715b11ff28fb291b972b143da98f5c66b2d02a47850765017bf4e9 +82e2bb732dc64b51fd4fdd3d8144d1231548dcc29bb9927280492da505dfe82a +dd17fb67b02ef0804bc82339d60dcc1c0f8789074747a805a7250f494dd1e9b9 +173110c4b3f2154e865371295ebad4e321f15826b3d3e61a400bdcd15ead2adc +2a5f00bc25e36413e46e195eab01069a35f34fe5c00f46b90d2e444c8d5e8a53 +bfaf1fa61745cec24611b2854a7ee8532b54b40ad523f955a4fa2a9c546dea87 +e6d9e2de21fc4b3b2da747fb3075a641b29f6d6cfc3ecd725f26972e31594686 +111bfe80caba23be92b04171b738c1709bad40060fb0b603d3a2ed6e7d49daa2 +627ea6916d3fc19815fbd0fcbe5d1ec8a8c7a6a7488b465973d3c1991664bf71 +003353d2b025d571348227ec1700407e16fc5bda2cae07dbe55bcd7dd0207219 +f4e61479f22c8b7aaa0ec7281e933379b5d25a6ad9ce46a1c67a488cbb315f2c +08fece286194bb86c66bfcda0fbc668b8b84c2af3e9cc85d065e17f55863529c +d1668f07dcd6e51caca4eca02811c1ffb9a4eaea01a41e8bbb12b1d23cdd10a4 +97d1a6b9ad43927837f9b12b9f703d414070ee06729c1e0f78d5f63629739f5d +95cbfaa9a695db4862149ee51c566b8f94f79ef9a3de87c0ebfd3bcdf4940bfb +314e1bcd17595f3d041b65e4e7765b60a192c4ed917b8361ba0b5fb4fce8f49c +b09412a1ae8f99d878a8fbdd375de3631a63119042e11e6d742f909fcd775784 +1f5a40a168b4da3dddc65d947ad0950a1a275fc72a923422db5fda3d54e4ed03 +a1ae04ab0f59134abf88aa65d6944affa2bd46ed8c5596062e4d32536d2c8ffd +e5cee1bf927d1affbf9dd4e214ef0f323a9f48af8ce0ef87e858edac7a6cbc3f +9ee530f7609cf023032a19298b334306ab3f5ed123b7652aaf77ef421dfa4ea2 +e1dbc68390082b50940aef52f583767e8a5d9eb33142f9883ec9dd26a4c0a446 +31e1b1e55031a9defc48060e783c7a56426e4f690aa6cd006c5a9fa76310d351 +9f8ba5c79c301bb370d30c7b3adcab60adb70e4b4cb9b9dbeac8bb08f07aba62 +3fa6c7805a38a4cf9c5b7f2ddd6dd510b174f7c63b2d5f4e391005bacb81b7e8 +5249518ce22a99e8811376e7a464e22fbdc4574ab3684b416dab3526b3bd0c75 +0acea306c0d448fc4942d2c61d44566f8a058ab93651eb319affdd9ecf2655c1 +d00500943b59360b6c75b780beaa2f1b98165ce2ea6a64aa9435ad5b4d57a089 +0fb6274b5f137ff957e2dc801dfcc8f778fec72a96b31e7457f421399dbd9dfa +c99e611405a24bdf0bdce785d6ade5a5c09ffb66f787bcc2ca4b7e0f5dad5453 +b3d87e5ba383065143952a9364df8cf4063b2f7b3ab30c263e5b92ec64c43c30 +502894c1b01fee36aac472a6e2adbb9b74129074e25e4cfa3c70e8ac2b3d645c +8f54f45ba3ed89629cb4f2f35c418ef74a194c496c4b2518429067932d57bc0f +7569bf4fcac26e621327db71e19eeb5335d8a6f25c99d6aea57bc6ca73238c6f +ea54a43c09c65c83d5319231adc05299a668372a9f77833064c460b312fd39e7 +49426fa209cb1f5d3d90c043603c8f997470de5cded5bef35daf0145f5dca5da +50de2bb8b678e6f36c53643aa97f3fb0bfb3191ef20abf0022d160732455237d +45d23239e4700ca5d7b71231d537bd032c3f2e7fee61b5e32caafd5de34b2a31 +9a4745e6e94da94286497233f66637586af51856552b0430710606bb3aefe457 +acaae21b8cdcd140b2bc4ff16705fcc80d04e0bd9b6a3207d933388b624893fc +349fce3e420690841637e1ce83247d5de15a109350c60944853a42fc3adabeeb +69e78bb11a5143fd2c465be7f72c9478a96883d1369414bcbc5b20bb60457eb5 +22e748594f23e082c29689369e48e01187efc53b3637218a36813cc4da7faa36 +9e29596f5de513074eb3a364b82e1af8a0cdcc513ec66d60f1173dd50937ee3f +dc888950c9a6b86ceebd3bf64b6319eee63db2199b824dc84e53553442b80e6a +6f29d9ed68d767c3d1ae78037e2c7835800e08a67c5be8f57571a71426c25e30 +a80439f9976ba351cc64a15249905b04742ab07e98b867d4985444e7a9096346 +8f70bfe63fe94f0a4f23257703e8793d059ffdc798ef3cf642a870aa311abca2 +c2a19fcbe68054c2bc94e2d030e8bede94db3c839e3d85302c297369903b9c9a +fc45596809d3c3f2be2c287d8b49273640d1dde3c7a4000616cb0821a01ee775 +e7e1b96c796acb7764ce16478e2c98547840df255eb133fe407b5081d808f368 +c575cc039dfd5fcc9e332e629e8565cf227079d25627dcd5e4d6a0710b486b00 +7189b9cc441a094d4be628d1990b63cbc5cb7fa127f49bd2b5ac659115bbb018 +dfb667d4154218d907abe558d4fa3ea3c753aef0e05b94772e6ddba0b88961ce +49d8d6f1d85930efde0fbd9dfa0682c5a8adb81d8d0be2fcd209238765af1977 +dcb18c4f80bbafa42b4cccb09f9da4db574398d30754f0c2870f0ff1d628dd4c +b57e3791ffd27ee4a9793f3ee5e105a917cbf9b6dc9fb7a32c752519b8334b71 +8fbdd41eb77d5e6c5438c6cb200559b914cb5b562cb914d777f889dc0af180a0 +3d2c2036358f8a105ec2a6f6313155cb96c5d792e2dd3c2fec6c56084f295047 +c1ef4ce1317930046ee382913d7df30626801fc5f6d1501fa31e643345128e7c +1f9dbd43ba580ef2bffd9af99a7a325a4e39f02f4ff5d372fd1ad895c3741914 +b1b944da9fefbe268e9a4763767718dae9d44728591c4e60845231f31ee5e929 +30f7c26c3235548323c5d14c3d7bc73033940071739c215441a9e72f2ff242f5 +5c65173ef32f00001340a53936c3f926a54e0818aa8cb28dd6fe9fd1c62ea09e +141fd00782dc1203b43dadebeb2104286082a14af250bf64ec9bc75371a9542a +2d27f971d3ff426371bfaae72a51d2aba44e859625120ccdfb350ba1c7f31413 +4669405f69b8515e23b0e305f3cfb9b0f29b410d26062bc8a1930ca753184e1e +dc97b40c9769450780c4a742ece35d726475e7d5ca91700e23cd325c7853b6c2 +b9b439ea12ea4576d7267e7e19baa00665f42d0cd312715e3b92493bb6a3a6db +54afd1f4c5e7f7bb20be232591b37778de18eecb0d6cfd30d247240b777501c8 +82b269a8959952836bf7d26713019f7677937a97354fd1106f6ee6d09f6c75d0 +296b22831ecac76882f68bb9434dfeef9d18f0d5b8ff6615dcafb348ec7a9866 +6fd749afbcf651be1ed1ca671a6013ce0c183f1ea86566dc9159cd9383b9e5ea +9900ae6c384ce3409aa4db1603fdc010083db0f0ee139b27c6090b8135799e8b +420f8f7b10e7334d53df7a0b1581485bc449776ca4b2678a490f9d0ec5207514 +de7bf64d8cf9711cbaef78b6b599d518d77b4544434b8cd95d04149e1b546204 +32b266a48da343d0704d10661485e4c11d4fd05fb727ab2db4975482edbc7c42 +b9b3af2806828da2173a304f83b9cff0ac4c5d4f553fe7276caec477bef48321 +ba153884a05e23002239cef2f5c95d8f6e99dc9554ea767409ce0108e73b76a4 +273aa49f123dfd32d27fb45f80622c7f61bc3242b8e00e6f50ea21d0b2c35f0f +10308818835feeb760d0ae64c755aae98e40eacb8f0ce744c8aa6d6b5c1d256a +0a476118f5f2d1de2bf12a0dfa68ca2a2e99f5cc0fb1aeb3e56cd8ee3221dd3d +5ad1fd57901727acb63a9aac3aef6c753f57e34aec57d0876b442066c2e324cf +b6637243db0a9cb9d2fe8e82e0dd2d513ad2b33f99bdf99b5c551cc0114da38e +392ac1ba0d3f536963f6e078a6a123f973395ae4846dbd335e30af20c3c23134 +91e2bc5987f44b6d377af7c5242e4f9ffb43517017dc7340f54460977dd8f8b5 +d1461c6707040c47de84d198d4164ddd7e7715a70abd458507fb336b824ba24c +ac0e6901295372b2863c119d0ee2fab224f7c0b56af33c8b82436ba9303cc0ee +3a809129e3c15b8c7a45538ec88fd1597406f696adc7ecdce383d3715325bcec +7563f1f4baaad70af9d24dbe272710dbff77d95c3462aec9e75a1e24e9f0f716 +2f82f1410d4b77344983fcae866279a98112d6718ff23da33bf16255c1b10736 +e8f98e8ef876d73ab139009bda89836d18dd03dfb13e332c50227032ff403ec7 +26dc8fa78d77aaef79bee7e0656275fbb6cc6aba6bec4920167380a1b07f8ede +5fa970f56f530ea2cb06be96def3b5327ff0f35d2d2152d23d712013bfb47b1f +e34f9339712f75c84d90df05f9ba2e8ab689f7804c588e5e075942b6dd11d875 +c56c016d18f48d569ff5ddcf4e323fd9fe03d5c702da6b98776601e925c73ff1 +7943756f5a4867c8d9c3f0a23280e873a891a6371c258e1cca3c4dd8be44e16c +267512e5fcf49a6db090e47da0f7a2f56804992df1c5387639b67aea74912727 +2d54a49823165ad330dd59020f1351f22d2172d018383555b8bd88bd50d5f715 +0839576ac6b14c3d651b54411167189c9b93f44e1783880a4c1b31f671988e19 +be05d3e519b72857420d6053ee7e459e98b31ee77dbe9242fb65d39e7065b67d +4c4b6619bb0a8bf1f860b98111710a61e2038d8ecf06c4f825322a66d327a631 +0bc1e8941fc36ff52d7286dfa8d2c38b76864f062457c198ee7335602cd975ec +1958a3930918b4959aeee256b98e0bbba1c370c9ea62913e9ef33ec799bcccea +de68997283d202476f1f065861c7d611478ffca395677e4152bc82e9686bc4fa +a82c0cc2a7e8b025eabf0fdc11e0564eab69bcdd8c4a05e5c249164c117ba859 +3b0d1c7293455320b0dd104b95afbfde7a03c0ec5b25f9d9ac6accc4de9ce736 +eab4c6726b23a116ff885b29258a57981be31f03ea5c5bf6db8c9ba21b831f37 +41c32223133c36127a0b3ea1d378a31002722f439564eaa70bf9c6465c3a7d03 +da8deaf66b1534bf11654562b6f4ee776d5fd7f3d288b51bb1e78808d261120b +b367cab8ac4ad2e910abe6bd80f9d421127cacdd282116a4bd376ff6999746f1 +4202272291588b6acc250700f32398d7ca3229bdad1e2244fa8d5a93af30fd0b +98f114afb0e4f4f917aa0935f735ec4d5d3293ba3c9d70af980d3fc9b9ba6db0 +ec2d4038a4c9872775c3ff227583bf4a0bb3baa3a14fa3757b01c461b2f6b1c9 +4e549e58ea596670aa747ee95f8b881391593f409cf52daeed278831aaede2f4 +b7dc53a8ea279127c7ac74bd500f97c86a513e546e05b343a3d590b7081df88a +3acc4d21a3c8bb060bd4ac8cf01971a8ba33d1e7828a5e64453028be2731bb48 +dec51bd85a6114c8dbb2f6ee87ed07af749318c90fb75a672b2b9c656c0b760c +ee4c6c462f9d6fae1d26469b37a043720fc710031abe62cf4deb987749340f27 +43a142310687a8b5822724b7b0657e7b291e803d14d2eee8b795b432a983f54e +53b17161d32c7a2d937fc8151c37866d3e25469c346b59c13930312fbbed651b +3019b9f09ef2c2a217780eebe098bb92f43e86c1062e161110d23b17b9b92682 +e32feb15891454b1c6201c375d58c4f66bb0a322fa8cdcdb2ad5556a9b6f0eea +2b3066c1c89a44adf94a7ee1cf4e15d51ae4c17052ac66df51d27e2b1cc36871 +14867d0fc33ea44338e9823c1016ee6263b1bf8365b900d2acdf2dc41b53429c +b64e9e89bf148370f62822b51bc4faf675fac2c9cf47a29f34f37628a471c4e3 +6daa47bc0b23ea7c1933d849ed2cec6eecc3ca56cc93a14a4258ce5148c0dc0c +f4f236316363140a32b91a4a7d78f7bd49e9e138b037621e52dd5e8e30062fb4 +1c537aac83e2e85b2e57cb43102568966d75c37fedd7799108a24de96670fd6a +4e5d9b9b778b6d25d0030070ba7329e482c82696e65df223e0579823f0db7323 +e7ff8a4bbe8ed37afde9a15deb7fc8521a1179e9197e2d3e6640e591c50606e9 +11815ea278b0809d5b7ed1dac77d333638b027e340fb624e9f1d6fdc40ad7cf5 +bc8b03e4cae755be841a9c72c86930024006b17f89f9d4ee22bef17b5baf4cd1 +364f889aecf94c1cce61909dd22f6d35a389136125d44a6b4c27efac337d8e46 +6d657a804eefea97ad0b436468e088a93764365d2481aa2d5e79ab437ecde035 +43f6023c3b75a1eb4c5b1685bf0eb3b9e3944a78c9aa0d410d20f7e366670095 +8f17d09d8b713ba121c46774ce83b09ce675193b845ace5496ed1ed96bd0f1bf +505353ed69f2aab2eef00169531e57f8ae498ec78d5d01aa45f4d7e2c96c486b +e14a1b21a1b61f6e73c970630692e385184d32c08036af05fe240976397d06e1 +18892245ebace16be7ad3445945b9edfd4794f190bc4bdd159813aba09f80544 +58a0c5d5b5624fe081c09dcf2b1707890dbc43def71d3222f8f853a5d169fdaa +95a33d1667b9e9bd7bf5883cdab58f17708bed530ebf7eee4acb2c9bae6b8337 +f1b4cb61b37c32cc0b3e390fdf35df5bb198a2d704ffbee24e27c4c1248f3f85 +606de45396611b4ba6ddbe1e9434e7e48273365ec73dd8df8aa378822e6f1f6f +8f35454c47ac054c77d62fddaa17b41f60997bb9f1ba5b700e7f840f1cbad1cd +e2305a92564e0f4c88bc4f3ccc6ee1175af3b2f83cbc57fcf10f0e63e7f635e7 +1e428064be1542f59407f2a18f70adb7d0eeff6baf6ed415d7a2a0237d17a726 +e84344dd77c48b43f47451142ae90d22b0e90e993715c55d0be8c808944f24d7 +d3b167f8f6f6469aba9fba2bde048298e85784ade8d96fe228ae328a0c8532b8 +1d97be36095fb1a3930417db8c50713f86e647113b607c7c93bfb424316e1aa4 +4f8543880efeb8b9be6fc7b978a4acaae9782a2721757f32173cc39142103963 +9da323208310b292114a62ff42e3cc0c986f709f986e07b9364634fad4a3be7a +8a63cb7b26036eb8515b8ae6af058874ca36054c184f2626ec2683bf21304e1b +5fde01772a0895de5ae8caa031125b614a83b949bf40681252218b10f5d4ec6c +21e8190dafab34551a3b8712b13d195ad6c934cf96b9da70302e84b34e6f8bc0 +ef3d383ccb7adb2e5d67ee464f9b2124cd034dd4ffb20962a6abd3764694e07f +4b4d244fad6fcee6167f5f44f943a02caa9b326726e949a8424496a79f5acb37 +d8c7c3b10d5fec76b568ee77b02061eec7bfc67c9e75ea1784e15ecaf2bade6b +48a80532beea72fbe2ce5062da978663984b2cfcf067ddef4de6155f60a6c34b +b469c3db6fdc40e5f79f3562cf6f8bc43ff8032692ec0f95a03263e2cd7cbfe7 +5b2f4a7c4dc6b8445dbecf16b800f43a6835ba3226b5b112cb09a18bb0161210 +4ab91a24919291406a436f4cafde0ed998da1b99718d003d3afa3729203b5999 +a87df0b91c5adda6e678039344bb36495fb1b5e5965fcfc86f6f61763d48c0d3 +7c55d221b1fded8a9a359371f8c08c778e269334c2af994b75186f3b75b7f61f +6d6d48def0aa6856962f7b9c468c795abec3b622ed16241f4c506963acf2cb36 +29ab91296d06193741f36343fe0f315877a090df94858d93c527d44670760ba5 +68b61609a3d750e4153c0f17dcd5f870b3a38b7d2272ee60a24668afc2b54084 +63664a6fff7ebdf7d2bdf9b1636b17041bb12f49ee3cda336f84c77746fb5036 +61b18775cf02fbb4c635fd09886798b09085b8cdb795bab93438ad36f4e9c23b +b30e1fcff1bab17fe49566f755ff904cbc11da5e966a545c6c7d7259ba4c729a +391ae47953a99bc4d500d68420204e23a07f6c0e137bd1a7034d670e1e9d8804 +1bc039653a023a6edcae8f73c93ddcd8a2e85396f5debed0d0565be384f21c5f +1171e37ce2443cd8ea5b20da6bab9b62ce5e8f1f485a4b3fd7fb22ba4bdd28df +f76493059c56b7a5c65209ee98f2e81ab6e25cd0a0f81cb511004e9da7fcd65a +8e73b549ee33577db68adc05e0b24e820500cd50523470eb760844155d4ffcd1 +759d5f50b803888f3bb3a616f99aad9a18a745fc6c248684c2b0df40e38234fe +1d21017d2a7a1def67c9dd2884d2239e9e1790910a8486e5cd001d2aed32e05c +bf6fd016f4e70e6af610330f47048bfc8d0a490e60b9e27cc75098a74147b30f +267ca6983b5940b8ce47d4fdbfc3a7f89f78ff4c35ec0a50228aed5907e05dd7 +ea33ef10c079981b1ab1c361d78f58f78fcbb3d9d4a569e0c8e1f86067bd61a6 +cdcc34c490078ea150b792d466b7a6a1a4ed7c46f4ca2e46800f5498820464f2 +c88c8e6ea79bac3535fe2c12f9e121a07588426e60067e13e77999939ac6e36d +9b63c024d67d2dd1a1e7172a6441a051b2e1405877aea4ad0e78cabb4cff67cb +82535954d4ba25bbffaf67dfa0d2a889592d2ba5718168b3a620ed8fcc10720f +b25da0cabd8265af47ce144b68c6058350d643d8f0746c43ace3b7445efebca4 +8d48d6f46c9154a95a4f4b8962fe1392418ab22e84ffe824554c74679bfd6662 +09b79c6d147858aa4ea978389503c1b8f0dd5ce10af89739f19a42a932c3cc14 +25882a16c505ddd2547572b93581ae8f0eea2c7725f91b8b2bddfed70ce9b39c +398a0beb2d83471822dc81039695f6fda204907ea0078d854dc4b86318921169 +c744ac7d846af8980e123b6219f8663b9fdbaa3416e6cba8ae367755309372ee +84b812650858053cd0f7f2d4e62d8905b0cd349112adac19953517ac36219044 +3cfb831fbe6e045dc567c182337d4148036e6e715a366a7e2be5bf0da704808d +7bf418275826e99d696b0c296e7b5a15f5e63f9c90c5ac093822290c8d254e7e +828104afc3ef7c5a8d8fe631f191e266434f34d9e10619a7f4b7df6566c86463 +a86f6dfff94f01f8b4c7688e999f306a65628679ab9123af6dca39e88808dfe3 +e99107b918a8dbb02b1d5ed0f6bb82d115cb36889e5aa14c9cef78bf09d3b429 +c1e3cf2ff96d289a6279d186130ec5cfcdd5a7dea4d23124f012646dca173108 +2ad555c142a587d98fca7b8308cccf3856b0901dbb3ca53082b368cd2850613b +32da388cffd23ab28d932eeff2a7388295286539aaf03746f35eb28338ad23f9 +f4fb3c91c79ab2fef1e061cdf2aa1f2a991b39fd0afa1063cd54dae5d31d2f44 +516cd6be0ee051bbb0201cc747a04d5b171d4f13686e77b9ebf9ba2236886c4a +505461037b7a5f2ee8db790e6fdfd047033354f60786c1f2c00aa6847c8fa0f6 +3ab3215c78229d47364fc91ac88f98eec9e5d96ecaf41c0aedb88dc216964a52 +54bf9f88a7bc9f5ed16fd210252dd2f8e7f54ca4b4ef4a7356023556fb69a31e +72df664882f57b786417d6955b17783e9c206fd33064f6d9a9e23ca274189782 +1c18375d12d1ee22e74713f6911c3ab08b1d7f35f00f18f5e9b669ad15d4e1ad +0831fb8edaa74fc257fcc5ab9ade88ed85a19cc22d32b2a9e2ff3830e76caa2d +15f5c1fe3fc21bd1eb96d1d35e8966ac563d1ea40d6d3d2b79a9c602bafadceb +31cc10aa90012955cef8982620ae3d6d01ce14bc184f5dcdbebf94cfb5b10c42 +d174ae261dbed22fb969fcf1bb64f2bdfe0e43ef54eacce5fb5e537e872eb1bd +d7070d3bee6768186c4bc824cb828830b8696af783d3410a62fca2b996aaafab +4ee639122e65f121b941485cfb581c57df7e0c5b7e4c912b75eb6409352ff5c0 +33b1c7e4dca272245235cd8b23a5e9452652d212fad18eaa899935b90bebf320 +3c50b223eb1caaa160a4ce8469a1311c69ba2ae787edc9ee304f32afa013a0e9 +092d80c29dde16413909f3d00f9844e86dc234442748128e96b3ee0d243ac8a8 +00d872aba50e81604e5270aa9972e57b021dbb1eac08a064d250df6acf727c6a +098c99b2074af3b4bf14913fe867707fe0f9b058e05c38205d1603925f7fe1a2 +54eaa39ce49ff00bfb494cbfeec9b738750b53feaead8bce2bfa1e20cedb5e2f +d815755c40352198c1daa5d092c700d3745eaf183bc281b86e7762985bb5f730 +baa1ffa889dbb0e2f7aee08d5abc2180466eecef7c588a1c0f78453685526911 +165bcbf5cf3e9e 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -2130,11 +2159,11 @@ b9b124ec9db917032e3f495107f3cab93d57751e88a5369e27358ecf4f9348ea 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource -/F134_0 /MFECUR+NimbusMonL-Regu 1 1 -[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash - /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron - /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity - /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle +/F124_0 /QYKIKI+NimbusMonL-Regu 1 1 +[ /.notdef/.notdef/fi/fl/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven @@ -2147,83 +2176,252 @@ cleartomark /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef - /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl - /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal - /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash - /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis - /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section - /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron - /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered - /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown - /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla - /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis - /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply - /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls - /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla - /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis - /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide - /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/bullet/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section + /currency/copyright/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl + /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet + /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown + /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent + /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron + /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef + /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef + /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef + /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont -%%BeginResource: font ZOVMRD+CMMI10 -%!PS-AdobeFont-1.1: CMMI10 1.100 -%%CreationDate: 1996 Jul 23 07:53:57 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +%%BeginResource: font BITXNG+CMMI10 +%!PS-AdobeFont-1.0: CMMI10 003.002 +%%Title: CMMI10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMMI10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMMI10 known{/CMMI10 findfont dup/UniqueID known{dup +/UniqueID get 5087385 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse 11 dict begin -/FontInfo 7 dict dup begin -/version (1.100) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /BITXNG+CMMI10 def +/FontBBox {-32 -250 1048 750 }readonly def +/UniqueID 5087385 def +/PaintType 0 def +/FontInfo 10 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI10.) readonly def /FullName (CMMI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +/ascent 750 def end readonly def -/FontName /ZOVMRD+CMMI10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 45 /arrowhookright put dup 58 /period put readonly def -/FontBBox{-32 -250 1048 750}readonly def currentdict end currentfile eexec -d9d66f633b846a97b686a97e45a3d0aa0529731c99a784ccbe85b4993b2eebde -3b12d472b7cf54651ef21185116a69ab1096ed4bad2f646635e019b6417cc77b -532f85d811c70d1429a19a5307ef63eb5c5e02c89fc6c20f6d9d89e7d91fe470 -b72befda23f5df76be05af4ce93137a219ed8a04a9d7d6fdf37e6b7fcde0d90b -986423e5960a5d9fbb4c956556e8df90cbfaec476fa36fd9a5c8175c9af513fe -d919c2ddd26bdc0d99398b9f4d03d5993dfc0930297866e1cd0a319b6b1fd958 -9e394a533a081c36d456a09920001a3d2199583eb9b84b4dee08e3d12939e321 -990cd249827d9648574955f61baaa11263a91b6c3d47a5190165b0c25abf6d3e -6ec187e4b05182126bb0d0323d943170b795255260f9fd25f2248d04f45dfbfb -def7ff8b19bfef637b210018ae02572b389b3f76282beb29cc301905d388c721 -59616893e774413f48de0b408bc66dce3fe17cb9f84d205839d58014d6a88823 -d9320ae93af96d97a02c4d5a2bb2b8c7925c4578003959c46e3ce1a2f0eac4bf -8b9b325e46435bde60bc54d72bc8acb5c0a34413ac87045dc7b84646a324b808 -6fd8e34217213e131c3b1510415ce45420688ed9c1d27890ec68bd7c1235faf9 -1dab3a369dd2fc3be5cf9655c7b7eda7361d7e05e5831b6b8e2eec542a7b38ee -03be4bac6079d038acb3c7c916279764547c2d51976baba94ba9866d79f13909 -95aa39b0f03103a07cbdf441b8c5669f729020af284b7ff52a29c6255fcaacf1 -74109050fba2602e72593fbcbfc26e726ee4aef97b7632bc4f5f353b5c67fed2 -3ea752a4a57b8f7feff1d7341d895f0a3a0be1d8e3391970457a967eff84f6d8 -47750b1145b8cc5bd96ee7aa99ddc9e06939e383bda41175233d58ad263ebf19 -afc0e2f840512d321166547b306c592b8a01e1fa2564b9a26dac14256414e4c8 -42616728d918c74d13c349f4186ec7b9708b86467425a6fdb3a396562f7ee4d8 -40b43621744cf8a23a6e532649b66c2a0002dd04f8f39618e4f572819dd34837 -b5a08e643fdca1505af6a1fa3ddfd1fa758013caed8acddbbb334d664dff5b53 -95601766777978d01677b8d19e1b10a078432d2884bb42d1f224976325883657 -05acb022d1e9cb556e37af91917c78e98229e3a4dbf03ae741998542977ad6df -1760fc1f1a479464922afda2cba7961e9da696b71205e19c542c97f25419c43c -fa1a042ba0cf5622ffbd3e775d0d564135d99b9ffba011eebc4066b003ce2f88 -825936d7393d05d3804601cee9d123120fdf73624a9d4e361a28e998acec53f8 -7a62a0aee33be2e96542534a8af24497d1c377cd7f723767b44857d94c6cda7a -c3d6f0087fa36655dd2b81eaecb31fe4f4a2fb1ea9fbe8b83d35826ac93fbb4f -2bee014f41f8f276510cf5ce35c3954e8cafc521d0c3ab80ea8c7fc29427a1d4 -42d6f6c1800919e58de9ae12304d718ad80febbb412da54153469cd51a288628 -ad109baa77981525b3d9b0efe593537fcbb8520d38cccbd5db171a0385a432c1 +d9d66f633b846ab284bcf8b0411b772de5ce3c05ef98f858322dcea45e0874c5 +45d25fe192539d9cda4baa46d9c431465e6abf4e4271f89eded7f37be4b31fb4 +7934f62d1f46e8671f6290d6fff601d4937bf71c22d60fb800a15796421e3aa7 +72c500501d8b10c0093f6467c553250f7c27b2c3d893772614a846374a85bc4e +bec0b0a89c4c161c3956ece25274b962c854e535f418279fe26d8f83e38c5c89 +974e9a224b3cbef90a9277af10e0c7cac8dc11c41dc18b814a7682e5f0248674 +11453bc81c443407af56dca20efc9fa776eb9a127b62471340eb64c5abdf2996 +f8b24ef268e4f2eb5d212894c037686094668c31ec7af91d1170dc14429872a0 +a3e68a64db9e871f03b7c73e93f77356c3996948c2deade21d6b4a87854b79da +d4c3d1e0fc754b97495bcfc684282c4d923dfeace4ec7db525bd8d76668602ba +27b09611e4452b169c29ea7d6683a2c6246c9ddcf62885d457325b389868bc54 +3ea6dc3984ba80581133330d766998ae550e2fb5e7c707a559f67b7a34fea2f3 +bebe4226da71af8b6e8d128c7ae0b3dc7c9aa4a1faef312fc9b46399b18c437a +776de1f67caf78e15d4cc76d6fa57dad7abc6d35ede0d7118e8c6f3a201f9ea9 +eabf8a848d182eba8922addbe3c488f51eac02906400a84ea0abfaf48116cdc6 +6fbc00330a76a8818cfaeb7afdeb029a204e0a70b47a05aa50153b56d2bf6736 +c7a2c50b023ed92cfff13eba974f804a346d4130ccfd5233b6d6b92a14c87bbe +2ba216bae4123911e1856975e5cf4d94e44f400f687d2d13db288e0d821451c8 +83e9928f8cbc41e0f4b99f8b29d3b11bd4ed0cbca83d81082e39a9e79cebf433 +671b1af39c3d0e1f5bbe5f1fff62ff6f5f15f0421c56a4dffac682cb07b6f257 +221fed1902e4b69d9bc2e061f2e96f5a46734f91298494a425ef6432f2b9778c +4ebbadd3483ef5447df5f008db9d91c559950ebcedb4b1316a5aae8367a80e06 +bf3162beb99c4aaa617c60be688da7627f29c1775983ef635b26306a94f0b258 +003779f8670a1398681953b785a226057f7d1270fe2dd2ea66d65e2061fbd65f +0ac51b6c347a56e9f3e86e52f3e0bf1d5f8d6540afb32a027a7c96919557692e +b739cc298ec7999b4286538edf7333cf8f8f6ba02c5e8c62929af07acbb90861 +0bcb85345f4206e3ea130512dcfbc6cefa31ef2bd1da11d3010fec57b5b232ca +706f9c44fb9cab8903be783eca66d748b3fa5b1f5d5445f6c16a9a52c88a7e2f +2bfb0be4e416ea209a9810dd6c38e47a58dc9270b2f49f9b9d482156f7dc8164 +b621b6803b6434a2a354a50fd9353a2ce3fa761423634b8f2adcd63b2b7acf15 +07588caf127a0d6b2017a451d3df77c53e6171c66236e5318d49fab9ce4b1026 +853f65d0d5f7913d88ea66b9b63cf06a4bfc8ed3246bb86cf6de255ff46d245d +109939e32dc483a0e5176b614ccb7f1adcf99854cf50317bd081131a146ea089 +8ed59e46da7b6254bdccbc660686e2eda0ad7b894cd2eb2688c0c00aca589d39 +e3caa6e0faf7eeb5df3e3f8113dae4b454a0d8c86fee52779ad3e13a0a871e9b +65b9ef0a2ff20989bae81d1cc1181679fbedb80e7d84a08774e6da58a283ba22 +3780f2717484e066fa7dc012e6d19429b08638045352d358957917123c9c73b4 +326a954f5ebce183ba1025c00c8f559dba85e07b3ed48d2fa0acafa9436d6fdf +e530ce25ac7da170db1764e77b6816343e8a128a075e7744a6f0406551f4640e +c403ea61696459d15ee040bfb53f08700c69333b1cb28142c5b9411d65fbfb1e +c7f4f50c03d122ad4b63e9e65f0a0af43efcc9fc546fd13da42a1c13b8c9cbfa +79a480d923701306249955ce1c61a680b2809d3551325a333a189db71bc83c59 +47d17b31f8ff63564919b00336285f724d22f889748564808083ddaa4eeb8632 +5d636961e1f634f3ff3def1dcd7299bb7679dbaf685e2ac1484bd9b17c5cf4d8 +59897713b51a4deba3332c2ab5c48a76357d2eaaa539a617b09f223661bcb411 +0e6559e99a7d900336a9327d4b8330ee5f56b016cebb8c07dbcc2fa736c07ecb +8930f26b429288c6fe6cee3e7792de58ea3ce248598db0c604787612bd137d80 +e4462d249b229b62142128b57a6b44515262743bb3c70ee96aa4b8c49d6b0be4 +4e19f634add30634f999f4dfb3dcff6a412a9b6067d28751aab1b20928a6e73b +cb81b0510d551f84437062e8cd403bf8c343003965e926465b288b0aa2fc85f9 +90f9a63fce188d72008aed98bcba5ff4ae850711d2664f0857ded002e3a89fa8 +75f930ddf7918d6b2f92ae26af35f50cc9d2a8f9b5d5d80981b12ddf4c59565a +aa62ec34589e5bcc3075cc6a163e45d46bb280b22158c5c04c90beb6f8a1c791 +5597b0f69be3204d876cfa54481cc86ed2fe799bc46555c6c6fffc73854104dc +9c8a6f85331fce7c5d1f20af5d99e4e61b7ab981dd4eae26951a9447d5553140 +b5862e2f39023bc7d14901eacf467a9424a6be8055d82f4b02036cd766367871 +e0a01d09790ab2777db18248482fb32a25fadb62956b93affc59b1796f78d0b6 +6aaeee9778a3b253bd98035c79b5296e173fba9e56e8824ab6191ef9062b1fc8 +1b6b6185a05b167adccc6698b1801297d766492add5b66193d024d121633d329 +25bcf1a9ae109371aaaeb64f2805bf5c2d5a218c191e9eeb4ac30a48291c7251 +f690b51d5135f6a37f5418624c7d2f3ece356b12ec18f73d5177a24ffe371635 +fc88231b3a95d72ca2555f164c503f91b5c7ca174e43aee6534df6d569efd50d +da3e950e11c6cff788e50ce5f1332ad76a2357c39d44ea38e88b24f2d37cf29e +21b7468adfcacc8ab8fe1ae9da4c933b5f7f0a6451964a4924b6ba96c359c828 +d818166d5271e813f7a34a5b18927e66d61003392c96ab36b3e2175f31faa3d3 +7e77200bbbeba91c532c053f318f3f83080bf3d641d4c5df796c2882e34c01b9 +cf74bba01f03ef559012eeece809c019ab6d40d22a16fb9054143990db45b902 +a5574f672dda96d6c18c0fb048e970e6180e6148061e22085c7aa4fdc2102fd2 +d31e84456a56057b9d3189f331cc8354b195564cfdd23579574b7c7a80d2f3e3 +97f07cdab67407a46a4264e985563dae7ad933dac054d64a7ebce65bb2beb5fe +d53360fd76a0fe706e7283550c4d5657aa9bf62ee713592d74e89998e9b0adb2 +327a9dd5f19184a500870a3c53367431b56cc4dd60bb629ae68a009fba0049eb +16d11d5f299d5a99f3d45f6510450e53740da5556335eccd43e1408b826fc535 +10c7784c44cdbf41988ab67ffdc54ea61dd05208204c8bed9c66c678e6324428 +9682cc6ea0b2dad69cdb69dc8daacfd1a98c730dc3d9bc8d83e2fa2e72de08b0 +031ef3455ba92d03acfdb7ecf50ee883a8817abd96e58f72ae050feae0d224a5 +42aa0b4c022f8a90e73ab84216f520d6ded72680471b9ed2ce317536305d7360 +810a92f4957c9aba9328b116349fdfa728e9f042b2fd2d116bbcbbb99ec6966b +a5e1f4fbbb4b1eae6d8bdd40de5fa44127e6d7c05abad3c012082c245265096d +d4445b03ad8dc08d707ecbf0aef0890b0658dc9341fd386d417ad9f5e79c0464 +be4e3b22e4997e1806d192a8be70dfbcf69715b8194347a60e80934ed09fb08e +c4df7c3b204b07ee3610c041dff7d4c76060e4be6a3a2f0b0217005ab38f80ff +fe55a6252afa361b5cd8f3b642e6e193da913ccaeae5508c2470036aad80c0c6 +e977c374852b69a8de69aea44aaad49eb7fcd420bd55a5c5cbf073e859ba9d6a +857da20a5cc2744843ea07efcaf91e992f0a44e1e520bbca097b6965c4e30c99 +03ac3ca1af1bbeeacffd7cc22e7b9763b0876cf8308ea38828a716da7f430898 +2beecd1cb81cd95ab8fe70242026f11061a70fb42445aa9246488d6d0029df17 +dea43305ac74df52e5699b6c243025786b21fd43993a8039e9e75fce2dbb7d6b +7e4cd140e7edacc20dcb473dc45eab68d8ea296baf9bb969093862d391f84073 +5e17f87847ff2e9186080feb184ff7869a5a8bee6aafe3461454dcbcd00d2c24 +61ef831a52dbb0fa736694b4a3a4d85c6d80636b316fb12be67f0887cce6df04 +80c145ea8762ef8b2c43ae71f3c32686fd5813eb49a39bc6d4980472bd5cdbb6 +c282c9ffe2fb52656f607692e1ba726417703feccfd4aeaf9c66d543ce1506b1 +a9d6b95705f67086d4f36b06a283cec841a01f1028d95d4de419d7110f091014 +f6dc905e81add1d54f95b16cddcfd0793d1cf4a85e7a35458c81197a24fe82cb +63edde30cb6b538a708fbd41f00268a772730b85bd8860054acd93fe6b8bbcb9 +cc474568d426e83f15838520a313e0ae1b60959de340398b21986f5c404c9361 +54975d52740bec0f7abfaf271a2ac1f7553b862d45d11ae585936fbb5462e2dd +bf35e4afb7bffcbd3294be3eabec4b787133c3a5e0c95f74a71dad9be990d07c +d157d7258830a3cc3de6459140afba942eef325ee072b3a53a9f281d483eac65 +e8da50ccddb3d43baff7d8c7d7a1847d6d579ce92df1b54de141ce7a73607362 +7d909e8cd9fdc373b840145f9373bc2f02979ee34688bf840f4f9245c2ab976c +ee8bde685c47606201f6611e38a49ab72428def2c85e553313af719ab4d4f5ef +e3f3430522abff76bf8bb8f56afe11008d3f989ffadccb411dd3b7e6352ea873 +3abe5dc71b3b4832ae85bdb23f6cbfb4b2631412e4fe0050a5f7f4216508a3db +ea2d74318ed82f1a2fc791623c869593dcfd6bfb2fe57bdf06e9d1946f9bcea0 +13848fcdc603e3eca5384725118970cebcc9ebc6b74df13ad395fa6efdc22463 +5380eb1b3521aa929eba30958ae2da40852196b67ee44409d323383b0c7fa1f2 +b4fff373041d9f5eeab03d6743f0a291b481dd3ff9e8ebd77a073b8d5f5d93bc +727e6566204893af892f74fc0bc3f3e83643a93747678eb998f9c91b3a0ff942 +3d3924f507f1c7eb18249b2ab73691f5fac868720ff52183091f65ac3be8cb0e +80d257c52ea8647ef747fe304598e1ce0900a4de4031e4b6a58d7869b08a56aa +710c91ccb8afab94ad10d670e767a44e0177795ddfd65c9cdc7332716deefe3f +9e2ed8a54bb6faf63b7bf5f554b934821086c09fc28fa74ea2efd410e006be6b +ebe0c464e078c14968453dc783a788a55d925d72205492c07d0dbaee4982fbed +9b32dd19ae230da5870499feeac55b09b0970ad5926375fd79b95552816be003 +90515262b5ca891babcd81bf86847cbc5850d4a056bdc528e97aded1ea6d7b76 +bd8ec34e742a9fccf19a6310004499b1cc1a920b5f3b746bd4de2d9b9dea341d +25a7a7b60546a8f9ef99190cf8ddedb21a0103414f9f28ae8673c966b12528dc +fb70ce44db4822322605982d708a0b4bef7eb08962e3f433213d7545f351e994 +970828eb443c3bb36ab0c4cab7fadfd949e5f93273141da2b6dffb41b4678647 +93cd4e53c78a63c632d4fcbad772122e86dde337d5438e5e4342a0e18be8b014 +3ddd7290d16096f2149c6c71ad28325dddbf994e651b9d4be89430b31dec3fa7 +d2703196f7f10b5e8d98f20e14151160507e53ff1f3d4bddff3f45f9e64b1b9b +9b26b32bf389a3725c243209245bd78c2f78d67033be00ebe25955a1ac718305 +b52a0260a07220a9f7410bad935538c6c7c56f902a70730c1cf90d45a5f66c6b +a762406e512bf3cc3b52918c6e9e92893279cf86af1684d9b67d1ebbe84be9d8 +4b56548323ab381ae18c9e9570453abe77ca9d9ed1164563120b939fc3acc33d +49f5e989a74ac760f0c99458295278efde92e99003c4780935d12eda68a82308 +ba444819ea9fd930c80263b57ec1b9164aa50ce386b8ef81a53a710416c6c868 +794bddb4fe463b3c59ff9fd085fc7ec37cf2abb7df09d41113f4542f72bffda6 +1fafef41c462eabcc7a3b4fbe46cac256c7af4309a617e73e7934450434e344b +5cb6ddf2e63f4523f1526ed2f79522eae16b23dd9ff4924053a0fa7c4a0b29ff +f4485c041b06147d2c94d276553f443c2980cb96ef5da49bfda4ee95bbf092ac +e2dee947d0c711c1930500b79a5424e8494df6e1798b009a3816342f4d1d7cb0 +b7bf239f3d60361ac605020591740d13ce386bca1e69a2e8063c62f9959c9fb9 +010ae39f18882b1e3b3d0d9b0447db7f7f7a3810375372702686b224896bf5e4 +cd40e308b5a6988b614d8088c296171423cab2657cfb98f462afe21e990b0c74 +4c8738d1b13097ca887ccfd3eabe4f1e29df71d0e51046957409964f9f02a33d +78b2a5bac5058bda0dd8a65fe6c53dff9310fd2b97afd24f39e586417dcc18a1 +5c0be1795e0f2c3d785f8cc1ab5505bb8fc0dfa1364f08876a42dae3383f853f +84e7e54405bb8d00911c5b8ef4794494d9bf076d57a65f2392628b61ff967c77 +29114960e00fadc36961617c61c673bd2d2e4a9d54702233c8414026e67940bd +ed16e2d3822f06068502c0966f2ff68f74d11a0b780b95f3f52bcc162a37b6ef +48cf5ff8513cf4183176734f80b9835401b3db6bd53597645873fa96488eb183 +646b577037e5717952d23cc71ee1780b3df42d9c768804fc47cf147db059b9ee +7a6399d4f4afcf2d296902f16d56d6df28ac4c9a96e357678ba901fe72ce3d2f +b10fbf263146547d455df1bc33a1dfa753251c264db8798da35943a4940962f9 +e3b8a68d2b094177154ba30af7bd201cad919c09a34536e41d6c5772873c0634 +fef84dca5f1a5d5488997e279876af1dfb3f51790a6ae085d09ea4e1947fc10b +987c2db0634c100484f4b45404119fee7a7ec81111029cff1b4cfa1a8637d4a5 +ad472b5ac0cb9f428cb1df8abfea3db8082a26cc815437ab387e7f87902398d2 +e0c6bf6c95c2381f15b61fb2c5bdb8684afbb7a6c1a01ca2286a8dff62e52a16 +3d7c748c1b2c63d2933012c5306cb7efb0b4cd733c56ba7700acc731d294f7a1 +1f2a1f8f461983f2972da8c3dbb3f9117f7a6f3583c8a5dcabb364ac0310457f +93fbca26c31482d806c6a7a4f87f4cb92e3f30b4dd2dd5e3da5360430c008237 +7165549aa416a73c62a50b707074b2b7ded2b07454574f60861cd2f0342e4f78 +24789278e711f18ef858b819a0accb67384b47145fee30b32181d66ff47aa657 +83f0cccb693ac70657bc2bf204974bb3bcbffcd6540477e7a973718754acbe68 +823672daeaf24c93263a57598ac4bc999120e367aaa4b54c643e8c8987024b07 +9b0d40fb33d55cee534e3a38a1a316276704e9a6df08553fde29e4d4526225d1 +fbda6f8cb78098e83e8a360de3c4c77e2998094f920aaba9c7587735cd2f22cb +e17c6b99a8286519242f18de4aabbe470bb8e0931ec7f5c19e1c304df56f2368 +70d154e925c4f2e5012d52a0283ea52acefa09d2a8ecc832358868bce8efba7c +492e3575c1605150a3f7d6822960f1a9975151c7b6e928fc07f73493351895b3 +5ea783de8482144ddfaf6f881d0835472a603fcd52464da80de0c380fed5cc67 +e38eea70c066dadf026e03fe00be35c6310f64aca4b991ed4bc4eb125b4c0a79 +b87109b442c0b624c340271988ca36e92157ebe00ace90fa4515b6c649b9ef36 +f82cfb4954c124878dfece799bd987ee930148967069b9e6ff5663689e5d186c +26dbdfa146c3dd3ab9c2104fa4e92423c88a0821443aa8008b11008525290207 +146118e39b4d7893fdc8c7225f4c97fa3f1cc264122afa3a87d630ef325d3778 +28ecba34700bae5038bc2a1c2e0476351d9e73cb623cf58eb35d4c518630ef2a +f8b64bed95d72bb7403e652e2dda6faad38fe8fe4319ae190f0496a1c6806cca +10efc6d15c7e19522b152476c36f9644a599da6786df08fe7981f9eaa0e8611f +880ce7444e6e72e82aefccf6ae7aa0ae68f883d9f85b8126a6c52687c0ffe6d4 +fc712eae8bcaf81dbfddd0a58717c4cea5ebc76c94567833f5549daa0cf6254c +627a1a0662537ad3b43c6f3a90d553bd6e7e841769777c502e4dd5fb8b15431a +61ad9b26cd69b5d7d2b28776074e7b7beb25da2d5b8ce39e2d982b9fb9122e6f +401cdba8684365458bd82680150de4ea9c386dc6666e613f4de18bcf4540ce5e +663a6f3de86e8ff97339085dd62fc33bdaed076740de76c1830a14618ced99f8 +07519a5526f787b5f96e8086ff187ddc36ab3b385520dd23ceb0b0a779c97537 +496cdcbd8b82bc87bd2473acc490c6a86a6e6f85496a2dabbe2c92f4394c23bb +714c0cdce7c02a397f2a66862ac165931eadc3dd374873357e315c8cd99f00b9 +20d3c62c04401d15413d4c640c2aa4caf5fa5db6eecf4ecf43478b2ed317e06f +cdbab783a6921463b346d8bf72e98a4d7fbe011cbe565cb54a7157af3fa4d5c9 +d6a36c7600f5a884595278efddf5085f74c3d7d8e9beb3be3f7f6131e8233b08 +4b16dfda9cc778dc10adda42786156d707750d12c920cc297e8f58578d5084a8 +6d68a5180a 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -2234,7 +2432,7 @@ ad109baa77981525b3d9b0efe593537fcbb8520d38cccbd5db171a0385a432c1 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource -/F147_0 /ZOVMRD+CMMI10 1 1 +/F230_0 /BITXNG+CMMI10 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef @@ -2268,7 +2466,7 @@ cleartomark /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef] pdfMakeFont -%%BeginResource: font ERVBFT+NimbusMonL-Bold +%%BeginResource: font ZWXELK+NimbusMonL-Bold %!PS-AdobeFont-1.0: NimbusMonL-Bold 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development @@ -2291,7 +2489,7 @@ pdfMakeFont /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def -/FontName /ERVBFT+NimbusMonL-Bold def +/FontName /ZWXELK+NimbusMonL-Bold def /PaintType 0 def /WMode 0 def /FontBBox {-43 -278 681 871} readonly def @@ -2305,314 +2503,163 @@ d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf 045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 -1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b892ad5e69acacc6c1640eb -3067bfc64938f41636db8831883bddabc6777dee17f2e84f1d530bc76f51c621 -75ec6b727a82c193d1c0801ac492bbe281b46626bd21f2adbbfd144793ef754a -ea5f1cda3310e83d78a098160c66d6b0c68d4976898d9dc1a08d01740ac3e7f6 -8d3ce0a7e109104248cb86318400bd82ef894efd9c9456e97055286c144d3efc -d2625110f1ae76241079bec19939ac962e0ba813359c15b07c74d5e9868e2167 -ea1199d21ca8827cddf1be8357261bd32e79fea6bc475577c5f6848345bce58d -f5435281572ae6b33b53607ebee6f862d4c752aee43c00cdbfd258c7765b1358 -5d6165ee034e5815de79cc26c4a720607bafa6049710ee3782bc2cd84fe2473f -1335d20a3b6e9e8355af36673cdbe63c27d4f0e183fedab10031b1ee33b9573a -2e1961b7c6baa41f7c3ee707fe86071ede5756a00d7b3bf0a21b7c3cf41093cd -66eccccc22f4534912cb900b08e69574b07f246305dcbc238780278aeb8c9e55 -3d096a944ec7aa9f697f354aa137df90a9547efec1cbd568cb999979f5aec6af -a84edaee1564d178541cf4631081781608fd38964257cf89b1c8e0120b3f6af0 -793597ad553cee5cccd5c4f09cb0b4e998e6e76243191af7e93833d067833f0e -53670d7e996ed67cfe6699a6e3815932ad272af4829c2ee08a30d3938c928d1c -e89af71192ec1247ca233093aafa54ffa58f4aaf3fe9c62302e598f4ff8cc32c -4d318391f7a36d0d8b416dd36d776b301425cbaf82d520141238781111a14cce -7927e2af21ef837558002539aaeb170fa7e7e37efd447c37db455d2f08533155 -53f3c5c3be4817680efd0ba3a114db6aaba6c4d0d57b09ef8baad463996718c1 -9d155a62d7ae82eae4c82760c594a6ba3c7ee4290f0d898bb3e404ccaa91fea4 -eaa2146ac6a23f6c5a8aae834a0587d990024bbe8de485c71b916ad96dd66792 -a732a188e6a57c459ebbd7756cfd54770e2a8d81bd4618d916a30ec7084b2492 -5f77ab14169547eedfefb6f03c7d5365cef512df194628d5fbea6cf56d0f5346 -b6b6c1da1dd8d8321b88807b579bb6a0c8f69cd919e311b6ade903b470f4e0a3 -dd5015c6432452ecec048dcd14814e47def4a53c5ca6fa9e91d8a28c719f9348 -509c0e17d632f8cb3f7468bb0e7f7f6525c086dc7efb997a60e059d3d4938489 -23e60f7c67fa6aa8062594f122a48c54aa7c049859928a3dfc72752acad074aa -416c667fcd176da4d7d31a9f6be6f146d4a9dc78f419fab7c9e6c74d40ea659c -24098088bea26bf5a725fe56025d1fcf8465ed7103702aef74973f6fb697e645 -e902d65354a44bb3489007c555a6a08bb057eca27c93bfcee9de42e2782fed4d -664ad7f2d238b7eda1ca4ad473bb9559e11a9f214e258ce1a2a60512975b112b -336864238a36732c3adacbfd52c85a0dc809ff955f9c81401f72107f3d263999 -a69836d76d228ab4f954b00da07bc4a4e165f2dc5ecd8138cc408ac22217b15d -8baf04408d4b47e55129b0e596c93d10cd42372292e1ff483868e8510076f7f1 -ed8ead1bdee2b49533f87ddbef2abdcbca432307f7ad0b3c3d4721f3e67e609b -b06f8b7e66af7c843aa1f71bdadf0f4fb6baac84815c8154a0023cfb68282b4c -8e24e478f81f8d26ef82d6d0e1da4a65478f4a1f65a7dfb4d1700207850c33f8 -148158a784b452ac6874080039e2259431c05c4522f1d67522e273b443ae9820 -adb5303cd0d839ffd17eb1fc6957159a569f64873b4b3bf99349c486a3af2b20 -b6b9c41263300ab0844d24daf780b4f324eda854d4e210daedc0e34f4b67fca2 -1265ea3764f8f755007b62e9e18e80bd30f3b96124065198c0a5985ba2172550 -8c8eabe77b26df4451f5068956fce111041a7d23f681ff2c1b93344fe688708b -61a47674c318d078fc4bf79217659987dcd1bda1e1b74068960036c472906152 -cafe4a8a702d271a02c790ea3e440e4f415556ec703a23b7aaf7bc50c5a32f7f -fee6426433e945c28be038cbe5ee0e7933945f052757d480c58d4d7dc4ab924f -985e054fd553d1c037beaba29b14e823a4091b08ed602a69d1c3eb0fd63faa93 -36db22e6588d3d2fa727916163030958cc89b3ce99ddeda6190f97e039f9821d -ab4e4d9a15cb5094041790b995d8950412bbf049bd1d8afeb8bddafc6aef748a -f2523b8313e13f90f966c134e39d52e10b63e30aadca42bbac5962e4e3f71337 -bc2fd40679beb44e111250352f04cb0404158bad9f74416c94003bd12c88d9e9 -5cac3a3eb575733eb44a3c32946dacdb3405f5b4a2513fdf9e6bb2e6e21c5385 -6c527ccc120eaf95d400847dfc9e6a40806330442e1895b53a6188e57c65b466 -da203785fc322efd64f2e6f66f996bf7ca035bb2117648a8857f1b10469aee10 -dd22d785de27f01f1d725b56b380917004a06afc0046335f97a2ff20ea44f794 -c1dfd6b107549e39247a5cb3f9c37af849e9c5f06214a570113d91ad4e14d9cb -aadf8ef93a933795c0cbfb7204dc605b4b3b95b9fed0372d8df634f7293298a3 -6aa4abd1f212ecd5d4ac49d467567385f80e163b9464f6554e48ff78d45aa402 -b5ee093a8f96da45504e41bfb1a72f579031efa801690a32f4e248a5f773027d -da3f3721d4fb481fd1b8e81054aa4a700e9964a87871e01f03fe80ac4215cdf2 -7a4944cf89a893638730631261114f8aab967fe29e280124fa8d51fc94b1c552 -db58e038097172d5f634ceafb877d7caca03436cf6bf40afe4dc99ce08d3605a -78e2c90ffe766fd3ac0e8b2ab247c3f689a55e350cbe80a9a452bf8666d5710a -6fbbc45e4690afc625bb7a8a29bc17aa582b6e200bd5123e26b2d445992a3a5f -7aa128c3f6230588c41c6c456655961b823e65d7471ad16f9aea07c2b3d39c45 -726f023ea4780719a3656ae18670daa3bc084e60fdf2ba1ff0204f285d72d9a8 -269430e406cd36741bb227a1aa28cedf9484689a78dd5495337bde66b5a790fe -4af761c0b505ff974e4c7f67348eb1887b5b9315a7b3455d3677bc77b61d48ec -f5ebdc73b25eeaf12a6c896a54b499ba5f2897b7da9465c34561b23e0e740eec -fc7adf944329e003f5266b94a425f3864b167a34d0b9d259fcd8d741c9dc0fb5 -bffb8c8cef470f923d7962cb5806c67763358a9f6ccf78220f28e45a84b0ff35 -c585c18b19c61b51cbe58007fb852e0a92ed6d704f15ff0f863528db72ea3dd4 -3ea0af466fa5b60ac4490aa5db18a649c442a60b4f824e914915376a127dbe30 -85a3c56ef4233579b756eb62e04fea0a55503f88bfdf011436d9d5088e027c26 -daa8165842a4ddd43fc3ab8dadbb4d53c5ba9a5b51f33d505fe3ed168109f1f3 -9ac5c3357e48cd9e3adccf2daaad831000e27307d6cb2aa6ecf5f92cff39b266 -73b1d3587e029313101a9075ab35de260f23f3d3bab5f7a6134fd07c076dcd99 -7bf2e7c40ff0c0fa1096312b791d638b0038138ed5c578e51309444691c1b182 -8b346fe0286e13e3907beda13044177c788b4948a4dd398aa9fc317665b250a1 -3570a783821db58159b825b14c2a639f62995a049eeeb8904226a8f8e14a7959 -731a74dc4b215d7ec095ebe86a3bf07080cdb0dce6d06fcc2e3a57bb04944f90 -8f395bd65117984c1596303c2781e3997bbfb6ab9f354ebcea7404785d8dfb04 -b19a3a6792807fe5debd6eeec1ba9ba9a37473d6c435bdefd5b2ea9c21d9ec79 -0043b5ad1b0a50f9a24594d00f8fd155681c33df8f0c0b3cd5a4fc275da65dfc -6c65ed8713956bb94b6281a4f39c8ef72b932adf3f6ecfa697ff7d84f93e7a29 -8fab7b48172e32ba7b3135f4a2501961f4a1c50403fc38c715743b55095ecc1a -38f11f1475521fa00f950776279e8a377fb4ca4870c8daa4fc67efe4db8e37c0 -d56ad93cd334ebe18dd6d92a3ea48b29e7e76eec5e8aa0db20ad690869053422 -8567c4b72be2093426677988f8ac9f7fcde0dac8bae175066a485f3b1d0c2129 -9e38a93996a0eb7a3357ee43bcdf8749bcfd7e7e0a23c7d9e118c4da7fff5661 -07454fc1ab28a875af7e512b2432256c401ea462d9aeb0a2f97270cf2aa8ec53 -1e5248ad52b1b74a376faaf7772e948f433cea2f0ed4dabec00855a394fedb83 -1daff1d977e9b816ebd27801505dcaa51f9ab531e6c1358b275d3a6ba38f4f4c -528f2dceea3a404a6362e3cfef9d904b573571a4e634d4852f3b922495af19c3 -c63c736d1e8a5b15cfc4da58f26f22be233b4579377227110f8fe5b0df57b495 -2c14d2011b6215b855c36d901f001e24261089f5edd39f7e5bbb2bf90c6f5c5e -7ba8928434f52689365ed48123414ead2e00f8860e60afb5f59d2715c4ee2b3b -2b10399ca1c3f70259c63762f64a5a1cb6b1995030a7d775a04cd77a95436e4b -c3b1f3d1959ded9f35fdd7fcde9b051245446dcac11fb3d0228ce4c012a2f201 -81ec3dd2aa1bd66ec02c93e4784268f754c9f0eba42d27b755bc58ad00e09e04 -e05fd21ed0c160353d2f5467b5903b4e1d1b8666acce06ada99c063c684d8738 -3d338c579595d1e2ab301c4236183cf2c3be0320ee83cde4ea050160b58787f2 -bad8154825c9b29cc14682e15db5f53aba109799c10f25fa2e54560fdafe6c91 -c246ae56edebe0aa30e152b61fa64e517f6cc41ac7b3c25ecada33e3f6d6ee5f -562542e0e66d9c07aa9889505d51452cc2ee73e3683e3fabe26f003b87d9fbdc -a376e85ad9547c23e463fa073429d32ca0e58326385a89106d5b72cde3c00c11 -c5f40d1e8b61e6cb1cc6416e28afa6caa469682ec8365081a21d77a8b1df7167 -6344226bb9a7533c0fdfe153878a3af3088e520b94933d0099c2ff89974bf795 -d871b9e5d40cd7aac72a99f351d824f86d33cc89bd70dd41f1a866657bac3a58 -a4eedf997eb49f8d967e148f381e753d5e67080d2843d44a3585e078615bea47 -6c882773d995f4154fdb773a7d9e29fe46e464e602cd206063c96fc51c30ffed -cecdfa28a951dd5211acd684ed3efd9feaa5aa98b091aece8681999d7c8ce708 -1c64f09e18e64198b841d7824e03de11101493975ecb1b7d556714725a14bdb4 -5d9237ecf693202198964c1554a04ab3485bbf9ff863441da3511d8fe6363e32 -a38a11f4dc6a1ee18bfa3a1c2c93a90675b0c21959054b17b1af4d533c87ac69 -08d0c344fe817d6817a74fdb46f35d3b48b9128784f43a68d809425c6570c600 -9a76199111e88a1c9802de558332000dbb9d1211929d509af5915b7ae8ea1c3d -d2598f5007de8e7383f7453fc6a9c0b91c80e9b1742bf6418dca69450785fb73 -12dd228889cfbc3f6711a26022b29f9295ee1ca8459305fbf2b93cb3fff5b6e7 -2b5c1d2c4d453f0b9a53b6f361136b1048b30e7c90e0de8edda423e55ccb2e2e -ee7b502af2baf30a92af542869b8f26ee28509dc01492095e0c27ccaa30e0db6 -3f02f11dc0ce8a94b8a8a7ef735e4fab04830ef077a8d788b224c184339274fd -5f7b547b77f81bad985c73b05a79d3c8661a9c2b71c7313d8b9cb50ae03aee95 -2dbf1afc9ddfc00d59e6f99021dffbb66acddaedf48df5462fc528dfdafa5e5b -a039d6bb9bdd1a78e47684a3c53ca307abd566093c2a4f6b9f0be52d4f1f2758 -ec48370eab4e1e6ab393a23358bae52fed3b270124639dd0a56ca6afce77494b -34f46433cac90eb63e7e0d25de6c8a0670b14e83d08a531cf2148002f9a6df19 -7f87c989b831c509df23057b3ec569eb5f5f530edd047a53b5b59f483703bdcf -b578fdc44ca7487e3d39479ca4760457e7018af01116b29bbdf7c3e0f5c07a8f -7f502c15059d9635b7ce630194962e4183c3838d9401260a743d8ebae1665ce8 -73bcfe5d090a8984e98030fe6b21dbcb49398b6905ec04ed310e37cd069a85d3 -7cd9e3a02dd8e036b2a79192ec036cf7e10653e08928cb8bf4911122d27e195f -48d3dfaa34122ef2df8e023c9ea1f246af2879f5df632719bf7a91f266d823aa -caefce067bf74ee0d625cf128c3930ab83521380e0ceb5daa2384da4ab23c34d -0db8a4acce1a33b6deea3581efe521279147ac1b36e4f6b2c08df2b2dbab051d -264a250a06ed06aa906c2682ad2ecdccbfd880941bd824d021f086560bfbb359 -e2519a2708a4976f42913465e18872a93cda809a85730a4930ef1e3e733292c8 -06c80c8865645c6a69b128b1333c3ac8c616d3e3a0163aba54c7a51a063fbce1 -4018cabe1b1ebdafaefc27d2b22afc96449cd515cced671baa88d51c5c778bfe -00208127f1fc35db9c6afe4fc91dd0bb1277181508d7b9868a055025c65394e9 -ab7a95494118d20fbdd7ce0b5f11492df5e8c54c1ce1ecd2e7279e07fe6a62d5 -63d7ffd38f04ba75057cf190319634f57aa246f03f5f904ff952d7b1006d43bc -ce88d89ade52e861aefad538b644942b6b97e778000de2f2ac2b2280d85a823a -176d8387ca420a441980d3e866604325917f78572ec9ba14a0944e37480ad3ff -9c10590c0705840d09c8bb076a5aae81b5e315ca901e262b773143a554360fda -3dc799fd07482666f47c17d8a5bad6efa53f20707869c5fd40d940a885310cd6 -d5ca9c351731fa69fdf0bfb148e17ac26ff43bfbb38c101867ed95d789ed2b0f -61820249b398fac0c5eee32032984302eb1804b82bad515d721213732ad43b95 -d4a02e17b22159ca29e300042804b75807782b9bda49255cccf4e35c461ff59b -65e36f6c6345dbb2e8c2f5445031999c2d8f0444cf4198ac17db48199c3b3fec -02a130d230aba456406e1070178bdaafc422343ed9edbf471c965d2b891586db -a34bb2d66f98f716e605799f3800c68000941a52d691640583cce11b94cb5599 -29fd0d5e8a9307831fe15fcd232eb361721d0da9e7ce111ff1ebc256a407372a -253180e51f1800ffb0313c2c3f3c4fcddd59f824dcd0eaa1e59837487288b558 -7f8e6d27954208fb815ed1d54a36476a95c660751a2ce7d475c72ff1784c363f -a641595eb92e65d9e7bfe18eeffeddfe82d9f6f0cee37e6a9e60b44939263272 -4816df40ed24551f0d07d813aba49a80bd3560188e5d0170385fd15c34b45465 -3d5d59bf7624ab116452ac28dc9217b11c75a08d68e55b10e9567a9d3d8d5da8 -89116318aff25efab611da69e132ba2ff888d68c84c056544c0fe9137faa8344 -4008487c34ff2c2376558ce20108f76582965fb06c2129e607a0e60889d97fac -2c71a026299b071ea7f9995a542b7e31efede8a4d341210a37f7b4bb96aa7c31 -c873cc0c3edff7b23d8a22e7e601ffbbab0f671b02ba487cf6b588ebecd26f9b -b7e8de0cbda870662bcca90716c0ff768a9c7c69c1dcb4086f1e881c6dd5b3f5 -0ac517ca096f28b1c7ac9195f99e44d444017a3bd54a68f4588f0a7562553053 -8bfaf7788a7243c30446213bc987e3383913f24b36b33e4b082e507cae63358c -9675599f6d746305a417fe8848f37bf85f4535e28ddbc5868dd6dbd3148cdc1f -2c2d224f00c3af4c1ddbfd88bf79eec76e45ef546cae548825a0bca6bf93b0b1 -373af60a7b24a75079d6645d0908a9f55ed0fe7397100a730a6f4e55678714bd -90c887e46a2c7703b13b1dda74a819b97abfe6275a24e73901540168737a8b32 -ca1902b7577b8761b3c4a6b60dfad490e35d71c5f35d8ef382fe66433336951d -e4ee981f980168853438755f135c333b8723d5778e2e3067dc73b7fd99aafbe1 -d5a2d1cf443905fb45730ce8fff14674abded9f94b45756a646b4cb1f789c7e8 -0748f3641a22c01b10adbdc77760c0e2a0b9055c4f9107d935f5c2fb2fdd2845 -6d6d2d2096e4baf14bcc8d716adf053bfe40845f02c0d18fccc453f3f8e45458 -69f802f506ca21d0fab24d7f3d6d6c219637a2dcbc58614c1456a9c6b0b0f57d -09cce675fff4f626b1b68c0a63fb9a16145d58176cf27ff5d3513dbec6014f3a -2b5de7ce69c8ac2fc184bad23950b28cf0414801764967ff97022cd4865d994e -585ff2c992d480de31f549f26a18e4721133f3d88316976bdae41431d44ec8d7 -4eacb29aeb132ff49e3c646ef025eb541dcc54f38b8aeb562887ed6cdd07ffa6 -cf3b2f89e4b0fbb5226702068b8043b6e2f284e4350c97a7498e6440bc3c8d2d -27d8aa1eac980e960613180ae4224624b2c6f92ed4666e391ae5e159c0ce207a -7433e462cd92aeb67eb89fdcd20e46f17f3d15ee679c064176a2db0ad5c38eed -7595cf6ab9750fca76e8e5ea2443b9d13da375ca2a2dc87fbd3d81ed58e366ef -94952cbd918134ea08f90516854207a2fd92799c410ed1fb6a9c36877d0b777e -ef59b03f19bc6b8fda91ab8ae21c89d117825a1595466da10f20b86d6d223cdb -6976312c7fb7bffb58feadfcd019bacedce96ec239b5a799005e94bdefb9ec40 -e717a597326b5330f38fbf708d002c9eb8d8ea0834241a35e3a07a58a030e678 -5812bb5de1cb511426cf49ff39647db65d8a7f2f87ca5e903eb1478984abcc17 -c7ee0b1f7d1e9e3b81c663abcce77a90f1cff1b01f116d2995e65cba0b3f1a3e -80079ece2fc25e0f5cf24507c99e5b6e87a417cdf29a1a8c58aa747afa962c25 -14671fbe467e22931a723a236aedff5676acde6ee71dc9eec11301af96927274 -a732813a49a473edb7e9886b6c45605681a563f32745d60cb4a26a7064406756 -c9add724e9b400097377258e81cfe085b1abdb3a00354353b50c9bd11a6e655a -d264a203708f739a46e4322a1a8204e32ae385d4f7694d6ad63f975986ffd869 -355b7ea9c0feef8f6d7bcce3128a0e45853de0a5f442bb805166c7906c9f1023 -df70bca683907a0bbc11249670f81c522441aa6fc4e7889a38d15ead8cad4ccf -e95ff5438d0edc450e6399f0228ea318dc2979e7e5a36eb76f9d81061ec8c615 -217d9dc7a1d0924dd953ad2b741e48357953d43186da75f340c58b7d2a6c7eaa -3038fa4b66b0ccea51af9610e5558d82bf79a301d73d57b6feaef32d6f19e801 -e37a3c1ea341bee088e322faf9ab5ab1934b70f894853984abd5f34c4d3fea05 -5ab4fc70179cc9f1379f98b3d1f529f3c2aa4ae63b8d2bfd46afdbcda8ea11be -f32c93eb4d435fc37486a1cbaadc3c98de581ebad18f35175d7b3e67c9194d5b -bb3cd1918e86daacb86055a548fab07ce7c933bd984eb713405d2b3f48124432 -a88e10b97f7be3a270405594d3e06c17b47719e2678f0f069ff1abfe7d3672d7 -6a748a9e277ffdd25f5477d0c9d60d7e8da9e0ef30e5fd6c70d47d31637bc0cd -4d67f5ed2b103889a61fd11075aabce9f2517ec9b53d7db5b27790d9bb1e19c3 -d7c3a7e1b95516ee38062d4ea759151e4de0449e6aae79500c42b4efe4936d0d -000fb3391330c035d9d6b9e25671f9ac599a40c37b2439c06fdfd988abcbaf77 -0e42d324e8ca78613f35ea64aa88c3c43e51cebe8ed1067cad94ea0387783e03 -e76af474f739b9249d1e95eef85ab528e8cd2da99e33c7ef0ee9df694db43f3d -fe467e6fd1b5291ecbf6b1ac7a25c002dee8be0727ec5439715bfd8f854843ea -1d080677f64889d70165f1bad110a8baf3885629f8ddbc3d3b09c57dea28b4f6 -7a3c042ce64d636d0bdef920ab5ef9544f52ad533837867c4930fd4dd3213e18 -ae2ca622e0e218b1bd54bd60e01d4cddfc2e9b64c6c99e79ab2c3e52cbefa598 -434213d475b6292190b89be95b3c6660133e1b498bd7ff2fd14aab2aca0dffaf -62d9df30c19ca0e949007dcf8453e70e60a519674d305523d33bfc3119037236 -19cc4ab1707db2c4984c6d4fb4310932e9ede7808cfc7d343a7fda08068966d4 -7877d7de7c0f5ffbfaae5666be3bdb48de31c5ab6bcfa7d35816e5862bc4a13c -ecf2355935040fac37141f7bef7e58f7b025e187df3950edfd6cea20d0649071 -442b2916ebce5f4d3ce055efdabf1c2dc348ac0ae6777f679e2f62a0a3ee9124 -7fc855bfc6f0c337a74c44ea1f5dd32ce6183a4c80a6b967861f6101c28b72da -d6aa1128f196627e24179c18f384e27cf7f81f43138381d177f93f8082cc9d56 -1b3c99f1bea073a1a81f8bcea131e3587b397937c4029d486fe6842a709558f7 -43cd16c8f0a5e4fbb3e522663b82e2544a6fecefd3d8a2b222301fd4988c0136 -859e86087fad63292bc4187412731a966710ca9ccb86329560d64be31ca4b526 -82245c1a487046ad21dd9a270e3fae72fecdcf9608784f649a25474034ac744d -44e14e72d02ff17b2252aa5273de3ba3cd71a95070a9fed0dff80653b3d346c7 -56119529e5bcb6011d341e368827cddf22d4f99f1781829df808507e2b4ceb13 -211b08f55444e75a005639a20c33706f8985f3308c08f77e72dbfbe049ae8177 -c2da2e62eb58f0fbb369f5bab0fff49f9d4765f931fe66f8aa107d8116becdfb -466d282527bab6fa29721678837cb46d60148a7fd9cae63d6aa634d23ee21161 -ef9e834520f367903a65bef7996ab77d37ba97aeb2a7a8c3502aac988e7a0430 -9d67a06db4a90714fd1a933402df0830026920bf1f71cb0379bda8714415c9bc -e7795fa4ebc37e819b3d8ee65375bfdd6b36bda41b7791864389e9b589919ee6 -2872bac2e221b28150d3024a984033899e5372ab474b9b4494f7bb4331b6213e -7953565f35d2ea6da212956dab01571cbeeef86293c58a259860e294f69730e6 -f141680cf75d40e829f9679e98341fd1e0817cb8e40cd6c4fa691ac691fb59df -b78e87add951eac41ad1b4f4fa45d2e346e0fa73157a7d2b2df89ea56a80e885 -9e0d0331d216db4f1b95d662bad40e472f21bbe05576ce4a2d27af01880f438a -30c17bc65fb460ac1b3e01aa43aa3677ba05a437fcca3ce4c2864d99c701d79e -3a199dbc7e2f00be8d4347f96b61ba0f88e90b49d412d0ed162e82715ea04c27 -af3feb0a7b3e4dd17c875a51e9bbed3c9e10eaabeec0f029d94fa90d60605b52 -2dcff539fbc323e7f0e1cbfc1a192a44345efc070bd5d5939d9f4383897704f0 -e785126abd9f582f1afe88a727784afdac3dca49892c6beb52cb1adee18034e8 -e88a441890175575951fd87594b63751e69165496d566bd23c8db4b9239bbaa9 -ef5058f5b51c74cf70632f88f1a05e1b40078c183ea8433427f63a5f68a1b81c -bd46625b8ba2cf713c001cca4c74a186f93aaa3869a517dd64f1e81c71823239 -1934faea604cf4d9ddf974fb09c5786bde05978bb25209b5c7648602dd62c32c -61ec4b5ce1177185354dd5cdf15540121b6d82457ff3111db1aab1889fb0e3c8 -38cbc7a671ba16a4bc567d9cdd427205e8f4de7edc64c00bb6080071130b43d3 -6e7919a5b7c29c68ac505ff107d1e2ab66a3417612ba2f461548f1e72c702a19 -7a6311dae649e46768d85d759281429b97a35379b84c763d35cfd434a4e3bbb8 -4c6e5ee8dff3a7449bec14c785bce1d4c617217ee6315fda000f0c54d1054e80 -c8f9f452daaa465f633ffc3eeda9c76e7a77024eaf39bd5bc9562fa44f3da9ae -7e665a33bd22aae6dbc1d9efab63741e30775eeffb819ff933342c8e6b978f8a -2aa20c2f2810072c4f2437e7cc13861002ab6d5ee84a6f80549683a34da3cec9 -e3471d112332ea260153836fa24e22eec0cdb0a5b3b0773cfd237daa67c55aa4 -cbf1cc30f43183a93bf7d7068ead32ac8064bb1f0a8bb61cf5472bcab360cf71 -b61c3443eae4f1ec7fc0d883559f8a2ff2522dcd7dad5f395e9ab2454cca6dad -07bb58bdeb1e54f75816dabea8d170974909b2fad53f9a69d97eb11ff20c6aef -eb6d76e9fa93c317115602db90359be638da383d9e01f6bdacb5ac5bd7c77d42 -d80646ace9f2384774610f63f97d70c4e81a2871be0a5b028c88afd82a3b6376 -5d5064a6786a829a6e6320120395b1541bfd6e3ec182d50982d7bec4140f146a -06890a79b85a6f20f9bf616f5f56e02752c5d177a48aa2f8ecb67e42e2314850 -d2109c0965a55d1e0f470371443991f9b8859ac70bd6f049dbf57ccc8e2e3c67 -eb8d1b4f36c660746008460ebc0f7284c802925206b968477a503dfa6879794e -7ed82fcc58443fa1d95fd561bc9d3a2ccb2bfa19916d8a88e6f7eff0ce0a7d4d -90c77f63bc75f3368f7a97dea9d9392e3f499ae4b8e53602636cd53ebdb42213 -c2668a3c618a76f6f5a96fc33c0e41ef620a63e3c52512c66b59f810c6b85923 -d81ff8618f42ee19b10d4d088bd6b784e4f9bd6bffe083161181b2f79b374fd4 -b846650d4b95b6c3e58449d8f0a201aec72d87588c54fbb3112045040109a3d2 -d98c778ed3fe07f54010773b628baf29ad3b91072fbdef7cde0b969d0b695bf2 -5d386c6b8647bfd55c169374c57d5bd8fb29af5c5a6718d7cee318a06ad35d96 -fbf879929e28bd43b583aff2769688e087b00ea95b28629a71c6ea847f988357 -da9e23422fe2ebc4c33f183679233e0d1d8150ec58ca6ca0bda2a529e6f6d146 -92010b1eda6360aac940ed23410455209383b68c3a1fd68a0ef92d16cd4deda9 -9dbedb1ce18a79817fb3d043f919f1b98c62ecc70dc27886b258428ae2d1075e -ef8c1225f96be5ee3c1b4e127d26bc2abc6d457333a0d5cce99dff00f3f41e0b -a9fd7bac9e96691cd316abe913a6edf95c6c5d37086cf3cb960b82684ce473ed -574fd8c6ca059bd679441c22e6c39376d3a33c8011361c834bbd7b87c345a9f0 -c6cc1328b5af926f763bebc13be92238da171124de119a097d65e5d623cbf157 -a4e93e250a6bc34bc54feb2889da3f5993eff0bf38ef6e440d0bdb405746aa70 -4e5de570b0347d52b25ae9e0ffd758b8d6da1a57e47289a26d0ed30e31474273 -c2315c74a39e6b26f558dec140d384cd3bbd7246bf46a0f7becce45fe0c343ce -78016204e814dccc58061d48ffc808423452985b12d28c94eaba89eda793f7b2 -8d9fde11f30434bdf73c48484a814ebe541f4e6eb817de43146ae4e04fa7129a -ec0e4b92ae22a1d2344375f68314d839aade59c4ac1d556538fd7a9f7ee9a139 -f3620952c6c45f7181a6448a807a1bf62cb59f440199297cbc8a360d0168c153 -7c6b3ba56dd0f7f104271138846a6f305f2c8a7536512c54a1c46232606a6649 -81a8083d59a4b5e8ca2cd0b70dd0b44bef1c2ae9ebcbaeecbc7c4bfb2ce309f7 -830ba06f3c8e79fddf737451a67d8c4425c51e11f832d99198c16dee864b4c9a -e48863f5a3cd0e6f3c5b31a6bff527bce260aefbc40b1d8065d2f88f97dd9ff4 -8b21d069ae8cebaa511f0d00c1da76207821859bb191d5f9261adff3e6417788 -5b493db49420f472496a8207d3f2d64fa3304de0e78d6259a626d8fdf81c51d0 -f81ef8c619507f0544ebd3aa8d1f200a5ce240a1171441438d6bbb19c0850bdf -4a0147baf4787513752e4e052a09d6b94bec96107e64f6b2692bedf2a38863e1 -15ac2564c0eb10fb923ef3d505f750bfb6407856406cc92e9b2a3a810fb49ef8 -e8f445c2e32b30d352fba6fe345c8af241307e76c13ed376554b857b23f2b10e -9f4f1d6b25ee850d744332fb73349790426bc3adf811998f84f4721247ed9dc2 -cb33d343ed9fcbdd001d97708408a4885ef05908333546167859788124f50eaf -7f9cd5b7a9f4a77b2337f51569fe3fb45e41dc50394ec963851fef76ed67592c -bac68e378043d77137974cb61772228d63d46d92821662203dcc0dd1db375bd6 -95c9153c7226202ee545aa36b0bfba49bba59e918e3bcad377cb461d52442b9c -d159764090efaa0a887a12b0c9884d4eb0cbae8b2b5fe1d68b8b13abcde73223 -234063907a8012134dc42337f131ce012a98e582fcc50c9507c1f87b83d62dfc -bb951dd48c3fb078aaebfa25ae1908f87d97915d86bea53e23c2c4fd426210cb -a517ee3681183d327a5ab42c02977c3221213e76ed5f986ad6bcc14f50651367 -f142a4dc6379213974fb90a7be +1b2b9e8f09253b61177e95ea219474796072f4b363fe05fa7637750ee32abe88 +6f7c1368d9ce6c8e0c490dfce9b86d093c646a926013616599be4a08eeab1ef9 +4d9066aa43407ce8754ca1bb33035af23db30794e2d3368c4fa14ccccbdeaf01 +2caf3cd75f4a9430011661c1bf054a530ddc57f032ecffb56ef20be97a76074d +a40f2ab5f5ca4b83c12482c76211aebb54d996a3771a33008145b436f16e5100 +3c766da4e9fc3ac88ac60879f47b0d72099a606f615cd397a05aed4a92a6e86b +6a9685a3fce4cb303371639026c74f19dd67a353e70a7f40b4d317f830c0342a +9f2fec7a3304e4c4009e2bc3f0dcee97c8381bc7682c6d3f80d93a69ce5d74bb +b3ae9b016bca6cf044056c8ab210f7f1ab28c6b4c457d0184278951c4e2bd743 +41f9c9c8fafb9f11da77c2ce9f820e65ba3b7184d08598f9ecc956d38ffa3d71 +0ef485905434474fbb7cf4b43b193a537efe076c26a9251d45d06ff575a5b9a6 +20ec66effcfa67a9e089a1a78ab7331d3841898dd7476d70a2a97c8f6c283fae +4010a9eb770604ba65878fa2105d063a44c56e21bd4847b542af04cec1cfc7d5 +ec2b1ee2103bd35e162f2dc6d1f224925a0d7eb5b883a6eff782245605bb8fcc +1e0453694af4725205d9225ffa329bbdd4392fcccb8dac6a0e8be2059177757e +2fc359426f4e1ed2e19ca9b5311c2e77ef9f97618b0c337a906ff39926d2b0b7 +883abba6508102d9f4fb0387d88d82973b53718c98d58c9b83d2a62386b74c16 +9cb5c33dda965420dd78aa19ff23f88bd2355f93ebaca543d8b18ea36b4ee8fc +b5924e01f73a9501819be812383107d361fe8c805163a6957de6aa4af7fa6963 +e77ac8e5d39349be33448d2f6258da61aaf47917c66c7c5ae99a990b727c6c70 +20f14175225efea39202b489cb6623c51f41fe9a5f6d3be27796e51be6945774 +6cdc1ec49ed6114400f4724ecff05fe0bed476dd3d5650ce735475ff6f232456 +5918f9ed222319d2a544aa4a74be19f45cd466fcf191e7ea641ea38f9d3133f8 +872bafe19691dcdf0bce48ed6fd0e0ee9a81faa6dff8b239874ffe2072a73107 +0ffb5095f90a653a1690655a9b4287545138b8049e04eeb928256a05a73edf71 +4e0c8692f37cf1d7e3defd43b2b428f853f35bd79f3811fa7bf788d1c1cf4a61 +65b8eebc60521fac324403d3bca11817c9d15012e0be84e194435fd27361e68d +79b52b6c9a96c1a40596f048a31c49088b883ee21d9bd24b48e4d1e03e7378c0 +5b62dc00623f9c5dbe5087eb9122de23199ac72b491ff847674d6141ca7facd9 +6bdbfc373e1e1f87881fd7bc3a7d64292c55a687f3837424612103bd6be8fe2c +0b3f529ff61d27d3fe8cbb25636f48e6a41f205d04a802e50fd974cfa67f94ec +19c3ec32aa714e650af284926ec5f2e29bb880efc696d77d210536d7d1148ac9 +ea9263bc02d2ba97369f2ab531944e132484c3f2c2638b01fc97731f1b39a492 +4822b5265773a5e86a17a41e7346b7c4c48029f58450663e0d09836d75ca7f8a +d9a78eeea4f41976945501f32bb383455467d217777e642f32777bbd74cff9c7 +97041d0a982ab1c0d4999077201cc9ab52a92cf959cafd2e6790ab45f6927c7e +96f24481280a0242e823e22a4e32669bc829ef1b7ec3fa34e9cdd920b0f7e2c3 +8f138ee0922fbdd3d7bec614805aa562591c3969760019c54ede008db2c2f8af +bc66034e5810bc32c823b819eb39a15c0f25be8f2dfe5a01b90848a5adcc95de +49241dc602f4b71f8901fbb38725ee7ff097f769c017f16598b835a0b93cc6aa +c437310f1a7d586cc05048684af27ef3c09f72ac62adb2f4fe7f99d1340d27c4 +479c144afdc37e4131d8fc6479afbb1004ba15e3e5d0ee470b9811a0f51294c6 +dee3fa7431267cb6ec7a96c590ebc1cc7333a103eddc21219f392ddbea601d6d +dce7a8645953235a0ab6d46578e8e438ffc41be6b509b844b73e586131f694bf +f0ed77a7847f7c747410cbba2473f5869eda83ec8118d800f3b2a7b5ea03e16b +204962bc68ac47bcc5d29f88aee951c2452d22aa967d32c3f37a91ba88baad3d +bc74cf2c7fbf0c76faa4eb347390dd08303b439cb1f1a3363d265fec5734c81c +bf1af913f88820cc29f4a3b54c712e006e1d6bd993668999c3ad54676c71fda5 +e29df4c794a4fa812b13ad32b28bc57e05c7908b8334bd4fe842d57b04423fd0 +db3a43eb047f86eb925dfe31a012031f36d5f6099187724b0e2203ca1da764db +623d1e0a59b9fe47d7d4d67c241d297bc5a6641770f5e9f75c572675ae6e69e7 +ae37627c1e4d3ba60b95605da55c67c5f6ef7ae2049ea3d1246a0c03309ebd39 +951a398883fc919a711e8e891d914459d4296bc3a584610663af1c2ff053c137 +9f447f918ca55c5dd4a52a060d1725c26e6940371eb4fd9d254749d04ebc0f11 +06f62a30d3f714a33e4f65f4dd0b20daaa10aa02b9a6e6eeec07fd93d19f9c0a +6cd6bde1d7ccd1a973bf297fe6a8821e03a381c468b9adfde87a4b7f484a55ff +a5b83052ac23f4b3644234d935485f912cba1c84227a609b32509552ad1d7ce4 +6f564f7f9da1e131d9921befbf53cad1adfee699702cb6bc949688b30f0b4f3f +d3afc9caa04a796e5afe2aa8f8e14a7959731a74dc4b215d7ec095ebe86a3863 +ef6d7975c3d2edc2e7c2f5d2c8cfc5f6fda37368a54dc07a7026ebe9e2d290b1 +eedfe0322838aad2f5be5c299a658f47d0487584b1f9e7def39aaddd212138e0 +8a8d2479be76477e5193944353796d86aa5e2ebce0a453bae8cd9bc976a14910 +93b30d44f25a29808227330b98bb42bad91b4964f6832f2946b0ff1701853c49 +dc522636d5b7fb6ef764097a17da725c3af793585d24c91627f49e83271b7498 +cbd67abde015c94f5f24579852564ef01dc4ad98f15d522bd15fb9043b241350 +2b1f128d874c1d119798ebb0e11be341f78db622204aef7778aa81055bf4b7e8 +c455a6398d7d5dac94a5007b4f76265bc8875392b5354bd38ddc111dbb8b5b92 +15beaf72f041f17d55b49b81f3d1279bb7a5ccb1a9daaf125e79d5ad7dab0595 +9e694040bce7da09f795dd3cd508b405c6bd07cc7ee9bfe298156ff2620bc3cb +cc7b27d9618e04a2ee6e3744d7a344f6554e0baa2290b2082f996026adc420c6 +76ad5978868e062323522240a388179de4d224f19182ba7a35c3aa952844df49 +f6c532d429e5c86f89d1e697fce1b50861cca95504dd63423bf603b14459b7c6 +91bf64bed93e5ca158ed057c9bf9160f61584608ee366e3be548bf2dc46c219e +9e0acdbaaca1a5b02770bbf21dede6a80f3af65ae92a9089683dce3ec5e6ec68 +9de2dc208f7304afddf88f35e1f428dbe74e7042766346ec02e1eda87b8c246f +89a0eb22d1c6fdb17142af0c8c0b565ab6db819d2ae2bb3bad7c7778c53b2686 +72191116278357d8659bcc81753c2906eac08fc3fb966aa5ded522da2a5edf40 +9a3eeb5735617e77a7a77009cd38c2b62bcb89ab73052cce4526f4f02bbec777 +e6ca65c90ff5931dadf03da48afb8561fc2e71008fb1d1d4343512ada1b78e71 +0a10079f211faa5227eb0b30588e9e03fad6d901dca2b6bac956eb8cd2ccfad8 +80e8cb37e31fa6a8206f6a9a2a9e1cfff1205345019a0feaecde57fb0fa418c6 +f4cb83025e7180e50394f52064d8ea0383b80482e48ac91c24d10c7ddabe98b2 +13eaacad917275e916fc0803796efc1f9597f8952547d27dee1fad9ac1fa6d10 +27127514e0f2dcdf9ca30393cefc7cda027c85e53d10ce53796529fb13b079c2 +0c7402109235a0c25965b3b7d741e90e500ec2476c5dd11dfae57d6f57b218c4 +b9cce956161aff0a55a52eb58a59d7a62d90b110f9a0dd26b8c902122271a38b +7923957a15d11cf1427ce56323c7e4428d2ee1ec6b1c465be35668b0a7ac8eb8 +af1f080a993c3c74871e4b7bdb2602d07587aed96ddb05374c2aadaa24486f9a +831ba1179b2ea3602d071411f1756b58168f9ffb572d787b2ffe01bc07c04d48 +f893271ee576454a86a0c216b224e0de81d66ace456d352a5b2537eb96be26e0 +342e4165d30208448c9314ec962ac31ee36f887d0cf61a575444b31180850172 +10ce125407e77e5c63c947fa320845efd26c85ae8813a99e518d679137ae1dfa +9e9f19c49b461da073dc1be4a9d32f6ad62d05afdcdce4e33091132d471edcae +38607b7f5a17e7340b4e1a110bf7ed2bbbb9ad9b8ab909430f29f87b1db0a04f +a4a80796d144bc1875a846990df6fb3f14a1457be695a3cf1a5c16878d44be38 +107e327ec4096cd66caa90efb30bf9837ad04d995c4f9165b1ef14d394b71ff1 +281b0d67d4d3cd375c79603efa6e0830183be17f77e7d5423dbe0776fa1387d7 +df0dccfbda67f6ada4d87dc8c6325f0460690be677aa6db7e0250b5196b420d0 +cc8d66fec329d81a7584a5d001c2c3e42350eb22313f036b5ae64868fc6aeed9 +af95ec8f2aeefe4a95e69cc77f321fb7e7aeaa45b2f56d92d0956bf321ad859b +d2e2bbe984b17fe9303f13428a68d6a1959288ffb63d800c11ffb6226920324f +6517eb5373f2b8f058be35adbc7ff15a2b0a81683aea4ff11071451a49efd1cc +f15664182fc26672cf89416da86a3b8cfb45510e1ebbe11060963434bcb7581c +4816bbd63c6d79dbdca7dcf26a4217bff8060ad7955402af67fe4743997a028c +c33d49847b57712e0e23a1c5b72da33198426130a132be52890df4423fe21d4d +2625e646ce72588478bf941f1f74e875812f7d7ac9c54d0ddcd12178abf50bcf +f5131713cf9c42d0faf6cde696534896406a8a5234a8ac19bfd531ca934c35e1 +576099082701fce199811dd294cc46ca147d5a187c3737d3d128ee8d437a2afb +114183da45b49ddc768c31e35c395c3bf67a79f8b1ac292f38ab2ef721453256 +523e9dc08e80bedabece9bc9af135276c819140d7a0e966156dea6e2f7aae463 +c634c4de83feff86407b556651a455077d64b52c5ff4b80250d312dbdf83dc0e +b9ebd541aa9fbfddef1f775be0c411788b054aad44c85d8723ca7d2a6b00cca2 +4ac55e90ec48e4acc15be17b9544bb71ad967c4b8437470e4d020fc6e8677251 +92e2307b51148b2cf46fc1b7f2b149ebc1ebb02c33477b4c56e56a9f06566377 +d2de31c00d90ff5ddb509f8ed457e915c6fee8103da73b5d782bffad7f7c029e +12e1930e95fd7b7bb37c48b7cc48d99dc9aa79388c90bf6c7c0b83c7f7fc0935 +8fd5f673dcc906c7e0fa7711abe8258828289ef48a40723e39b7ec79f2d3822c +6f45a6ae0745413ce860467d7cc0aef52c680b8cf1767915d3550d9813b5bde7 +1c21b0f7b7119bb0e1eae6a7874ff0588adf14626d101b4e117c63f2e7a60627 +dc40cb9ab16032434469f390804b9039e21f1afc9380f26571e3b2c64a86c851 +74fc32a61b787769985079d60cf71131977accec6954da9032b1333396fd5450 +00e364e7e6a79bdbc9f1e842e222ca480f1f22089a38079692312519392296ef +08f00707ec53e1cf114795631e3b14687b9e351f1b7bd44d6f7d41ac91e8404d +8ae952c3c78e4a6bc9ad64ac1baeb952053c409cfad43a877a7c420006ce3e9e +0278a33cebd6d9d9737432c982165ed82c45d26f55c133162a41be27005cd6fd +e60cc41bc098314a5a1619dedc6bd9acc637f398219f9a3c543f8421ad4c4e58 +9265d23edb6cb45f2273a908ca416ad8c32c2992d9efa95d86e631ac8fad778f +ef9936c2dff4053cfb253c24c65bd20fd534d6509c0c141a358d4ad95bd9b5af +8abb5cacb94788cbf6c43bb54d52751d05a1a2e6848c33ab9b769ca9bccd8e3b +ee742c0d93ecba4c5c31c1d32a567d4213522f2a5687b014351cc01a42c14208 +69ef5852aa703ba076abcd4c6653fe6c4100bfbe047e34d4d6e9c62a6e5532e3 +f9ac9e7cac24e076546134c226f38ad0f51f8f2dd8501a001b5c0da65d9286eb +3560b947ee38fa27a502e87f8c99ffcd54b1d128096360be6c5b6f3e536c57e9 +1acffa0392e87026f5acadd1d81295d54155ac6154e247d95bad5d9ace11215a +e0ca996979f6dd8e94e7567ea17b8827ea4d5d5c9a8484ca568332bac134f993 +91505c7fbd8ba336f9c37d6dedd17261483c232995658b078fe8f1a312cf74ca +de87453964bc73a936a0ea09f74e9b0822b8336cc888f0f1f399061c342c8b18 +1d93b17a0afe2a2a69acf2f91ecbc8441db2aa35091968a0408b2abbfa35e4cc +77208f81b76a199312d8b3c3426e49e08f8359e6ceb694550f4b8fb113f2b977 +937eb20585083e72e0abd60e60ca4ac0f216b65b7a9bcbe1005c5b8bbddb702d +ca9da36f1fd416315266905f3ca5ed221be1ec496c5b16070bbe38ea094ae5ef +be93eb0eacb95603d7c36ba04f606a11ad22580b1ee5498ffae48f218108b774 +d71bde64b7de26f696d95abd3c13853aa368cd2582f2b03be9b7ac59e9bf0207 +df0ad55054c594811c5e89277d3804d058e1fa5419b15d11605066742d284108 +7411f111e7375c6710060d26e0b60f6aa8387f348cf2bcc5762c16ef320e24c1 +755f88376f5f2ec00b4121861518c97145a7105bd0d571454c177da407fbfbc3 +4a93ee4852b09cb436f682f9f84da4d61ecf72f8f801a548a9304f19163d6bb8 +12f5de6e1f2b4ccc494015627416d54877ee71221b95fe357bf67271242a8f17 +a4eb4be3b7a649c234524b2554a8fd24210b7acefdecb2198265167b8bb28593 +07ed7a654e9a6e2119e6dd14fb33faa084c71e930b8035952b87fe8b4a297dc0 +e4a89d17214cf1063caac03d4bdd5b4fd62bfa6897811c3494ec3018c558282c +2efa94538edde156727152eea21c6e3f88f68a0176aaee333b79e6b37344bfe2 +77292544c72d4023a3728c2e39d2841c2450465852d02503fe0a871700b470c1 +a73d8c1db644db39e9c1ce3ccbf2149625e915599ecc3091e15e0a74768ed5b1 +8271fc242e10bd83e73b4636cf874ca6e6d756e707e671d99fc43d61ce6bf80c +3a3be178d9f5d3cb32ca669cf99b70b10dad7d270d0cd85a9865d60df07fdd94 +cd 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -2623,11 +2670,11 @@ f142a4dc6379213974fb90a7be 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource -/F392_0 /ERVBFT+NimbusMonL-Bold 1 1 -[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash - /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron - /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity - /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle +/F440_0 /ZWXELK+NimbusMonL-Bold 1 1 +[ /.notdef/.notdef/fi/fl/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven @@ -2640,68 +2687,249 @@ cleartomark /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef - /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl - /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal - /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash - /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis - /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section - /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron - /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered - /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown - /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla - /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis - /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply - /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls - /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla - /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis - /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide - /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/bullet/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section + /currency/copyright/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl + /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet + /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown + /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent + /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron + /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef + /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef + /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef + /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont -%%BeginResource: font BZXIEB+CMSY10 -%!PS-AdobeFont-1.1: CMSY10 1.0 -%%CreationDate: 1991 Aug 15 07:20:57 -% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +%%BeginResource: font FRBTTO+CMSY10 +%!PS-AdobeFont-1.0: CMSY10 003.002 +%%Title: CMSY10 +%Version: 003.002 +%%CreationDate: Mon Jul 13 16:17:00 2009 +%%Creator: David M. Jones +%Copyright: Copyright (c) 1997, 2009 American Mathematical Society +%Copyright: (), with Reserved Font Name CMSY10. +% This Font Software is licensed under the SIL Open Font License, Version 1.1. +% This license is in the accompanying file OFL.txt, and is also +% available with a FAQ at: http://scripts.sil.org/OFL. +%%EndComments +FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup +/UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse 11 dict begin -/FontInfo 7 dict dup begin -/version (1.0) readonly def -/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /FRBTTO+CMSY10 def +/FontBBox {-29 -960 1116 775 }readonly def +/UniqueID 5096651 def +/PaintType 0 def +/FontInfo 9 dict dup begin +/version (003.002) readonly def +/Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSY10.) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def -/ItalicAngle -14.035 def +/ItalicAngle -14.04 def /isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def end readonly def -/FontName /BZXIEB+CMSY10 def -/PaintType 0 def -/FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 32 /arrowleft put readonly def -/FontBBox{-29 -960 1116 775}readonly def currentdict end currentfile eexec -d9d66f633b846a97b686a97e45a3d0aa052f09f9c8ade9d907c058b87e9b6964 -7d53359e51216774a4eaa1e2b58ec3176bd1184a633b951372b4198d4e8c5ef4 -a213acb58aa0a658908035bf2ed8531779838a960dfe2b27ea49c37156989c85 -e21b3abf72e39a89232cd9f4237fc80c9e64e8425aa3bef7ded60b122a52922a -221a37d9a807dd01161779dde7d31ff2b87f97c73d63eecdda4c49501773468a -27d1663e0b62f461f6e40a5d6676d1d12b51e641c1d4e8e2771864fc104f8cbf -5b78ec1d88228725f1c453a678f58a7e1b7bd7ca700717d288eb8da1f57c4f09 -0abf1d42c5ddd0c384c7e22f8f8047be1d4c1cc8e33368fb1ac82b4e96146730 -de3302b2e6b819cb6ae455b1af3187ffe8071aa57ef8a6616b9cb7941d44ec7a -71a7bb3df755178d7d2e4bb69859efa4bbc30bd6bb1531133fd4d9438ff99f09 -4ecc068a324d75b5f696b8688eeb2f17e5ed34ccd6d047a4e3806d000c199d7c -515db70a8d4f6146fe068dc1e5de8bc5703711da090312ba3fc00a08c453c609 -c627a8bd98d9e826f964721e92bbdc978e88eea0a9c14802ebcc41f810428fa8 -b9972032a01769a7c72d1a65276f414deedaf1d22be23f4705bf5ef31b6a3b69 -0c896320f09e9875b50220a5bdbbd57c041b5ea97f421685a7256b0d9755edbe -d05190dabf1c3dbf558258163c8231d89167a816bba55fb1f14ad04320ae381d -f783a9eacee8ae5c1838775fe2380bdd1f3afcccc96d2a2dfc999b52a6689c51 -af82b8d63205b339103134dac7e3c45e6693940276041bb07ebdb9b729e8ef0d -ee8bf450fa42551be65217fea902e28decc09580b504f0f52f1e8fc5ce7ac28d -c4e47f908fdaeba23827a97a0aa741aa7708f7bbfec6fa69cc4f7c3bd4 +d9d66f633b846ab284bcf8b0411b772de5cd06dfe1be899059c588357426d7a0 +7b684c079a47d271426064ad18cb9750d8a986d1d67c1b2aeef8ce785cc19c81 +de96489f740045c5e342f02da1c9f9f3c167651e646f1a67cf379789e311ef91 +511d0f605b045b279357d6fc8537c233e7aee6a4fdbe73e75a39eb206d20a6f6 +1021961b748d419ebeeb028b592124e174ca595c108e12725b9875544955cffd +028b698ef742bc8c19f979e35b8e99caddddc89cc6c59733f2a24bc3af36ad86 +1319147a4a219ecb92c71915919c4ab77300264235f643a995902219a56d8626 +de036037defbd3a2c6bb91c73375b5674e43810b4f7eccb675b36f35d63d9ec2 +def21c5fe49b54f92f0d18b89289682cb097244225af6400f6ca98efaf336c9f +c304161e2006b3bedbff4dd36fa7a8f7594c02dab68c077e83335ee6d018f860 +8d9a9131325d953d6c38c7e0a34236506c1e70cb6657dafc3c9520131a251350 +49034e216ae175cb232c2ef5a3c569ab581f936ef4e8b8c8bccac287f06f24ee +1d15d2819058bd9aebc4ea91b74935f6d411562a453674b14bd76fbf5f298f9e +8fd37f529f9e0450bbbe473b5a4039d8d0228f56330fa15411d7544ce700984e +09593a854180d3100e136beea91daedaac36cca03d82b83d953880307edbd0f0 +014451ec8f10b1e30b51c2f9055e906272f02f32085e4b9fbe5a6860a74e274a +74349069b6eb90fce84259d281f037d6de9f42fe557f5f13a87e5c9f668dfb8e +f5e7f4b5ef9f5841b3885a6c8994bfd27fe35fa3cc1dbd5ac68e1c98c0d0ecc3 +bd2795e77848b5faf604f01362ca473ac72284a56cabb68f35ba43ddc6158955 +5bc6614cbcf4b80872c2cc66b6f4f90c315bf73b34e481705ee8b54eef70fbaa +71424420120f27d8853933e3ad4d8026397b040c88567f440df538120d61d0b5 +8232d66e2e006866b60ae46c3f4bda16a2eb5b248bb88a11b3fa4770f0f6c31c +dd13bab11c2f4ac77a63f703a5824638fb765033dce02f584f36c879416fbfb1 +ee7eebe75d57711b44824db906885934dfa7f386b811a2598fd5cca2585045f0 +4cfd32e35f32b90badb9a96f48957b0a311778d21914c9ea27bfbc75197cbb6f +0df8f6fa574e1f1d529a4594f2a6ed99b98fd302f4fb2694e3986c1f46ff165c +7f4c1102526831ae1e469e62f1a6adcf7d2b876c0d43f85d20a6a5dbc2280884 +1c7666d56f832b66cf189c4debed1fb37df76c3f1c632ade8822eead5e7f52ac +e65daa6d86e410d469a7844baa4fc9d28e21490b8cb2d3b2fbe718f55211fe5f +74d3573b99bfccf198c775402823aa742acca713d30b55a09c7b7ce3f5f5517d +6133e546a86c0395bef3387804ac1b07a4d27492485741a8c2ade23bb321da56 +ded0fe0d43baca1483566fb397db76ba9eec923fc2b3941f3b949cb13dcbdc3e +2c84c6e3a7abbe5c22abf9b6959a17d152ed0576524395d8a5049c5144680a19 +0ed3405f2c9ec716cb9c0fbd6b12168d62666ce74149f8505e02aab39977d99a +13a66449c9487a6b2863f7338378fb901e8ac981ec53ca555049b3667b4bcea9 +cd731a850ceecd59afbca1ed2fec76c18fcf5ba1b9fbd81eb84c254fa140eb99 +48838693123cde50278e4aa3cbdb7f7691d52cc624b4226855a74d3ff4b3eb3f +e193702ad68437760ed7173ddb5031737de3470f9340a44e92355ef033958954 +e5b33866ba86201a7951a68783b94f2984b40dac3037d3e6d2250e850984470c +a4fa92527aa313f3f366e97b87d05e114468dcf43ce4a27b9999e24295cbead6 +7dfac0c6d99e7332662743f379dee2b05fc7aed3ae405d631e3893b16e1a3771 +278319e6014b88fc346b4f3d17edfeab40d6552092a8dc6c2cdd506f458bde17 +e66b02d4992a0e370871035bda2106ecf7fab7ced8e8d35c6fbb825ed724b726 +8ce5f3f25d11386c958fe4b773b9268484c12f90e2e25e299a2154e5c480610d +f302e1aceed9d0b3e11681bd5322a13b8fe895fc755e0053890a4135f2993642 +3d11dba2766edb9954e308ad998fb1cfbc2285d1f7a9135d2f06cd2d7f7d7b88 +d1c6c9409fd3962b8b1c9a690e01fda96361ce706ec9dbe3b4d3e0d57baa0d4e +a98200ef682573f9aae9f09e2000b9d7e14ea41682e4e5ac56dae4cec783bf61 +a99a5df4e83fd52c0c02edf26274a16c939868103691ff4f8876c25fa70652e9 +ccb3399053205e0350ed215170f709c1901bf7b97236f7bcc13ba5b35a96e8bf +c6e476d81e396b0c79118e16b5489279703b1a44c9d7e320936a19ed319cd03a +f052845dacdd9b627a47433f2225827c65dda57721e8b196cd368dcba55250e8 +24e6b7b93affbdd429c9bd8e4523d8e8a56427acc3e5bf1b2db9b60cc832002f +1bc52025f18e7d87d9bf1b8cd8dc170c6dcb85af5afc1ac4a24c0e38cfc0f4d9 +8d63cbf3b5cf6f14d902ac8a9b4c48a5d4ba4bdcf4f3b69e2998f507719e2bd7 +db63597995c5cdbba59f9b010a135f4dcc8cfd602d40b30730125606fd1b27f4 +9ccfb1d0f6a97453a8c9a40f643fddb1581504132883598385c4f76b4e57b559 +c0ed46d83ce8427db396e96bb3dbc307df52ed28dad5cf5e32d82510300241fc +fdec6d84bb008cce0fe96c7c6d836fd3c8eca9341951e5ba15ad84a1799d137c +938fda761f12ef2b7e90a49f1ec49445b5638ed4b2d903924dc6ebd72fadf61d +16eb74d88503fc48659a86d95043b4e9764eeee72247367d0ca6ec0dee079f9e +5db531a1411790c08c942b7ce7b028e4b956d5f1df8a47a8ac6c37824b661b57 +147ade729f5fed3dfb47227b27aa34cb86584d20a628bf18c395b186ef197a2f +dcb3b6d97ad24cc35a847cb98944011ec6342d0ff9e13045ed70b68a1a5a53fa +b8f341c7e187ac0888b3c8e119d8b841e494b9c1bd746cbeb1ce48fda15b0054 +817873ce4da21d8550892ab4a06565a98fa666a6be00776bda87181ef8483129 +3708a88f69228dd0c3ef8224301dd8fe81b4abc3563f69bf1212897af3e738c6 +c57cbfa53e64ff6a79549a8d81c3b5566dc7e697e11971a7cc6743ca1991f391 +efd8c0ba9a01397a05bbe5548843de7f2fc4747eba91c5988605a76f1d2aed97 +398cc672cfd5498ba16f6aaf55ed4bf613786aa1ba2e092c06cdf82b6231b0d6 +b2f10cc3499b6c444cef515a033381f7b6502d6e6ff4bcf2bd273cd059bddf06 +652dec312ff80e8c9f37818c2a453523976487f1a46f8e967b5d43aa3e24fe03 +46097a6721d0882aa36fba00d3056a8ad42d4efb81edcda5cdad6ff2388fc54b +775167dd8d709c2a315e130e822ed68a889dcec2ebb10c4c56897ef4c8fffcf8 +6d0d146c61ce0d5d2514ec2e22a66090bba95fae51b7691c7f1ae470c0f6c58e +1eca070773920235792e58838f031cd2cdae29f1e61ca254a1ed00a6f664314b +9fa26bababcc8a6add7faba2081b6e307a17aa47ae1de11f7189b78feb61a957 +51e9257a84d3184ab2b9d858a41aa2c23374497930c4bea32e04d32389c55b93 +23a41d83442345d482927070af462aaba8f5b1de9876ef724fd364ce6e376e0b +a411d2036639832aaf1bec583af5bee73ec7bc9a3a2acdde4c1d6602cd8d15c3 +39922661926a3b2b1d7b15bb30870929d0da419267c3b04b2aea81584bc202db +56b6277ad95af3cc411dda29096eeef6cf0bb3d554bc9411c39990db4ccedf0e +4aebeff2e95e4469a8fd5ba6f03a733c9ddcb832c221f114de5587fa7c9b0096 +2306f9355684eb66d1558aea7150817df7fcd27c3dff8c9abbbe47c2354f7c50 +c306e8739a39f1a71e8e7de4e5932a0a1d2b677041802cb02cc13d7c6aab3235 +1143c982379bf5d50c92ef96afb597d81c107f2ee92f46a81b1bc9b9cb30a296 +74529ce1ba8a022e221c77650c681a19bf0e5080a065e4d66d70f2ee4a876fb4 +40b0b1e29681ff5ff0ea41d27f33a7e25115e9bf421e56f47e24f03945a2ba16 +906a3d0a8b5d3f20abe89d7b7705af5f0f3533f7a546ee67d3bfb3349d4299e8 +e49bec41a8ab12e1bd71b2cff0cb0f1fdfc0ded134b5078a1e87a490d0ee31ae +506618d409acf32cd653c59f36f4e3bc051ca072a4a75b91ddc17660e00cbcb5 +b1fb8d17f4bf7f78f74724ff9f1b84a5eacf2e7da1b9ce0bcc94b7a817dccfbe +46cd999463b0b19a91823d18adc1662117011f2acbbdaa2e062fe77706c48952 +38ba2840d9d98b9a7a0d63b8bd40c34e26496d979edda33e5821c86d9565f1ca +40ce6c160e57ff22d2564348e8f89d38d46b17d591053c79f89c4e750d619407 +eaa5a8bdc52ea6c6ef02744eb4a5c4886c32b210b86b41495d8729174df80f7f +b653a2e6ff5996d96eb51a828d0606998fd526a82a5e8e1dc79127fc6340000f +e218fc26b7c97c3cdfcec5a497f7be1ed11aedb012ffead9aa2b94630ead80b6 +3ca17e79276dec733c9955e9813970215fbe02a751bcdaf5e427a64e9b47b4ef +e105983e0e02c5a8cdc06a5db4126ef333583e4aa17a3fd944ed803d4ef88501 +bd626e0d1d8d7b71176259283e22d9382ae88bbec9cd6ba87933f86fe28af800 +dc2080f38948e3c20d8f4477e2b9f85da4800cbd1b9015eb64a07b459215caa5 +c38b7781d919e199112e241556e1e7681a749cf67a6b246b6b245d34ebaf1504 +f06366b8a1faaf10bb4304579640f2cbf3fb339df697701f6c51afa09351e699 +890462e1a8152f70f301b5f3a01c549371be46d138045ffed5411192bf6eeb13 +51d407ffa26d4b8e7b267a3b3cd5bf9e06816df2e35b6937cccf16b4eb9ca3f1 +272a16fd71588054016ef2743c1bd58c6bf22f083fa9326d19299ecbcf66f4b9 +afed95e1e2a2f8792328e3af6025da7baa1b10a721bc511e9c2f302673df78b9 +f466e742ab2bacd5728bef45dfef5b74d1da674f4b1c8d51a324fa24b23d141a +e082d79c3fea6440336329105d33aa1a960eead51cd500252a4d7d481cc31a99 +e9a59e3b4364a3e19805c97270bd19b031146afd9f46111a10bf886385731d74 +95ed4727f7e2435c96ba702904ad29f606fe9c5f1f9a11a229b1d528b9fa9ba5 +b50b4d4dba0ab5b3840d71c67626b6afcaf743dfe5334e00b64c5a73b3775450 +757b911673bcbacfb0f8509e8b2b2d9dada9a1558b97b146f555f85022bb4bce +86862babbcd259be6537133f30ab2895f60869641b1b9a4cb43b676b0739c112 +2859492d908c6c60aef5ee3b60d515e7e641d008483ab4aea0e159481d623193 +b5e2bb48c77bb87783c7525e59d19a190e2c0aa02446a8d4964844d9f2561a3f +70f20779d197b91450de25463dbb82c2c7c6428706f6d9f6a1474bd85068b37e +4eb45bb80449ca5fea88804308f054167aded26609e7093cd396948cfc810160 +347c6d834531d64a27bcfde1dd24607d5209060f8207da7f5ca88011e24e326b +66a261f36f754a37339d7f10eab4f276e1eabff47f4bdb577b9c4dd3de333fd7 +8f8da94df25df93a57193b1411761f908510980558e23b0584421f920989a758 +138f2e50e1493b3f9f2154a488202e0bb77316ec03f6555de4ae83923dd1588a +fe0bfd9235b4c08a8072804d743e793daf862ae381624303be7e5e0dbd74c51b +4172b1a16c27b6f8c5a695fcf3015cf4f7d89fc91c4c8102eb83a15093263774 +740f02f675477a3b4b6734daf3d18d1e3bb7752922e9b33bfadc539596c276bd +cbf0fcf5437eb33fbf4a83bb2f92462236552eb0303ee70602f42bdc4b51d384 +301922cad3abd13deb81f173e9deed83786f4a5de1d7aa21cc77fc364fdd2e7d +8b9e8074ebcb7f3511f0a256e2cba9b32bac11a5b7acadc0fc1d378ab3557382 +9aaed6a9c679e7e5cac49307549f8c4335fc477267e25506c41035cc248f8797 +8c267cb08fb5bf8a087e95dd47aae4d8389e97ea0da1af064d76e5df286a1774 +a783e3df200df1cfa26ef1ed9b5dce5dc55102cc5718854fd8911a886d0e2e8c +a38eadf009525bbe17d0986f4e3c6a23e608fe2782e7c4bc31ad13d80ec03b7d +1f0ff0855c4d7f9d63d6283ad8658fb13ff68586e3135a99341e4b88678704a9 +c5e8a4c2a9e70f13408c9c54ac9420d52761f62225c64b7c60514b7de0a2c8e3 +f27544869c93890e7df32680fdc438392efdd6a7bbe7621a7642632b7f45bf2b +3f0cc935a688266c39f458b9503ed06e67f4094946e73a3fc27494d890065355 +4fce63c60e6a32436d5ba5e0ab4f373e816b57fa6ba5a2a9bd02cb58af2783b2 +ee1da6169c0f15c23c55a7b2d74edb384c6f646adb73d70e3310873e0c99231b +1af196d1742758956415392b4537b1f04ee4060899648c387bc55df28c6db99d +2f87190bc6f1109ebbd78e15a5641a76198b590286065996f6fe1f776f7013f4 +e999219945c4509d37463f6f18cfc46a500f39e2f2ad229bc16793428a9d8cce +c5d950ee8ef43b425e518f4fa99333f9bf2a420b33b383756ebb0324b7df49c6 +0eeaff9f5f4f0665fe60d40a1f9824c0df60827d2d3915512fc4a5e54db36580 +9e3fd8c1c7c9ead2b0b5011e10ec68e4035d8aa662f0bf09fde9bbeaab5fea32 +3cd1f8cd96c62b0410ec741cc2aab05bcf9cb188194aa1fea94f40a4254d9149 +82dee90d74a6b5d876068386d55c1ab92f62e3d1c3f24d564615ca3035ffce2b +6b49e53257393e66967da9b72010d0f8c4b6f4337487b6abffbaa16aaa86a6c3 +7c22a7b4e6f4ee90d60a9fc7c95b15d34c8a689f028e591215b329d86f35376b +15dffe9323257f0748925c002cac78ce7cf473af7378eda5489e3c464b11e3e4 +87d805cded68a70bb95a36d01885006d2cded168532d575a128f0e03ce4a1827 +b7b0f7ca3da8e4dc774ee59db3616caa3a8924f84f35df50e48477c35fd08945 +308a214bde3389d0cb225ee5d1f96771fe3930b16645c6283b70223dfeca6663 +d72e9b6b4773edd543cbeb81e38a094ff9f1eb6012ca08a77092987bb8dfa849 +361743964bfd43032f77b09d6d1407abdcca53d424ae51fb1ed1434cf4a2f391 +b81678987709e0bea61d8546b8de9b05260d7e2284e445933ecd867cb63b6004 +0fc50c76fb25f81fdaaf545bed63d6065def8265028a224797551a6a8ddfab06 +84798af0747678d53a7564519116755a795f14b254642293aaa3622be7c14f86 +5dd86caf78e0273677f2e33658b24310bf444b1e4f0719c187669b286740775d +66a65699cbc25bea7f7eeb8c3146f9e91e5e0f413376ac09c7e24f9b76d2af1c +b63201760c0a7afae554b8defacb30d9dd146223f69b015b9b7a79cf92d52404 +6531acdb6bd53597645241ec6028c585407b903d0579573ebff088e43efa91af +e77940e6c5ffb955e1fa083b949cb13dc3483bc7637b96f03c79426237a96c21 +26788fbaf00540a987d4ef95082d64a104dbbd75e4ea5c00c2cd02e622987ff7 +2775eeca7c15213edb33fb30b48d17c3bca35ed5ae941829d5992d7bb74f8fb9 +b04fd6fa321052a8c2b40f78c8e8eb081f8851c508f4774267d091e2bcfd53fd +bb9e9b22d7aa6c9b62f0f67a3bb9b1984979d55c45d705c1cbea897072a86b4d +0cb7400640c26526c0a03395986cc3ca897453f7e6c4251d81ed29e82f7052c7 +f8ded9c0aa221832b5750a9845659235f82bc4d9b073a75af2271a0814b1b9a7 +f598e0e7628851b21af4f0b0536c129f6ac5f62090191a7a0776190010de80e2 +7e252e134b7a5c4e14a18a84e7fce3f71645ea072ce3655632d2113d4d176f13 +29142d814a63c756e0a43ad21a55d932d1b83ec93188d7c893220fbf5157baa0 +834ffdf5d191342a4f7afbba2e63b8f36a6394ab5926fcdfdcd8d8cf138fecea +3deb371294591899b4f6f8c8f0ea2c41356eca49df468a952f9c3ffccc8a99e1 +0d5d61732eb44e2ae7b254bab320d13990ffcdb63f3d541ed21ae022e86ddf20 +1eac6701a072aaf27664dd4e7874c4e428682c44de9d9b14c25fa8c2e8760acd +79f11c13e198602be9d9573f6f04643b80abae1cb6269e00c8ab419d49c3606b +11b1f8f46e7977789b19ee83c5bc35bfc48da6d32dd4d16c1303b0799dfe98fa +0cf8531205195af9e992dac76c6cb79ef51865e6b012f29df6d3333daae56b36 +8ede2fc26a580344fdedcdf9c61366f5887fb1e7300f7898e38de35b4dac436d +c4f79f7b365cdf9b6a32d842b6f8494b7b6c91c122af116dd8a3c3c1a35a21a9 +509f5c0c8479c5e57b2c0e175fbb4a85d3b52c927a20fd0cfdf3e2273ec8726b +58c23b0d4f56d69ec2c59d8ce896ea7dd86cea423c2f7250170a09991fdba4f2 +40a6df094cd170ee83bab69d4b8706441730cf417284c8206c646b5105d592da +9274bc54d07e141fcdcd130e51bacc353ea2e99dfae63ecfb9138e0aaa07178e +de98a4f4d365375190585c8579e73929b840667afbc659f5ba4b9f25fe55c75a +2a42fe330a4b90f3a088202806baa50fa1e99fb32973f23819fba8 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -2712,7 +2940,7 @@ c4e47f908fdaeba23827a97a0aa741aa7708f7bbfec6fa69cc4f7c3bd4 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource -/F564_0 /BZXIEB+CMSY10 1 1 +/F548_0 /FRBTTO+CMSY10 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef @@ -2746,7 +2974,7 @@ cleartomark /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef] pdfMakeFont -%%BeginResource: font WWWUTU+NimbusRomNo9L-ReguItal +%%BeginResource: font AMYDOG+NimbusRomNo9L-ReguItal %!PS-AdobeFont-1.0: NimbusRomNo9L-ReguItal 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development @@ -2769,7 +2997,7 @@ pdfMakeFont /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def -/FontName /WWWUTU+NimbusRomNo9L-ReguItal def +/FontName /AMYDOG+NimbusRomNo9L-ReguItal def /PaintType 0 def /WMode 0 def /FontBBox {-169 -270 1010 924} readonly def @@ -2783,308 +3011,307 @@ d9d66f633b846a989b9974b0179fc6cc445bc2c03103c68570a7b354a4a280ae bf9665eea11c7d2329c1a211dd26bb372be5822f5ea70d99eb578c7befd44cdf 045a363056e5e1cc51525ea6fc061dcebb337208eff729802376a2801424f670 0e7e6397b28f15bc10b40012b0a3eaeb2693e8f7f627c4c9c7c6c5bff105c1e4 -1b2b9e8f09253b76040d268b80719e1b3f5a55ab7b8e134d4cb5abced39ac635 -da001e9934c198a7f9b9ed0028a85e9ae00421dfd8eaa3bb3b4b4ce45d209303 -237bd51809fe4d880900b1eeb236aca87b9ff6ebe6b994a60af5d67ccc42bd56 -77295c346eb4c62bdc1ef22ee07daad928dfb73455f091f32408ed6430b97417 -683af27a03718a156e3f6e7b6e4f2e8177503cd82ddbf4557a3ccff4c858ae7a -f7efed6cc521a28342436b953e4650b5792be85ea2f989eb6d986905a61fa38b -96e1bbc830b74469150fb0b598a794fd80d10870084a877273a9502c3456e5ef -74350e6e3be5863e8ba185eb59fb87b36566af71200b6ed389d1287d4e925e33 -b2383ed05d87d48586e698fbc5d562ed9d8a09ec3eaa1b1f300224af20c23f26 -a2eadc74562571da84b3914d1d80b127c6ff4706c7046bbb372a0013e0ab94f0 -c27946583871d272bf4f20fa84e89d745de7bba885cc09ba72e0f530ed4ef7d1 -864b3c67007ed98800284235372f0a70c912e21e851afbf812165b8df912cd1a -013e271f0b347967876c68ae4c4107ef8ad1f170916210034c66394a9d971b68 -fbfc1131e37fc178eb97c1b2a0f573add9d7c0bf944e6529734df8a7ef54485b -a3375cc30e9e328943733cbd352bc15b06c85bfb4a96994291c72a0eae84fb01 -0f1b24d0125fb8c16d60561df8bb7aa7ddfe9549afb70c1e89424214609fde41 -9a142892e30f02754fd234ceb3c59a2a04c06bab7ae40e8fdec50559b8347684 -391c750987802d5452c47c1e0b5f222de9a0eeafee19d796ff375a1e1ef0aeed -1bcac4f485fcaee18aec585d1a9d80f41871dda45fef1eae82c5893118987beb -4d9e345c27c7419fe65e4853b40537d822e34ff1e0bd2819d21ef607981259e8 -9f1040a2d708d7463858aa5381759ac49df4dddeb209a278fe60bd2508aca0f4 -6a249a05b652e4c7bf1b676943cdc4602910fa3ea7636985a10f637832a5abab -9c7a580d605929d6d7154506217252a755beb8462d30a798ffa9b26e500eab24 -7e9fd612c776ae60423995dc1852686cb041e66357a9acd4b6a4e9846b1dc803 -23dab6b7765205d82b50cc6394e725c19df00f7db427341d514047e4bc594efb -a262eb2c414e43d8acc9cb195d12f3b2a9748f38edb3ac3447d27d20d1e62bbe -22f6378e508f0cd6f17ef1c500407f6d442e92ef2e00b8de78660d87fd1c7209 -ea67cdb37076e1eaaed128814a948e27e1f2fa81fe54be6c57ef8c2b2e460f08 -6ff1bb529c9100b1d878dc9a077d21805e89d8b0fbc2a074e4b55a869c96fca7 -8117347b9cfa480ff4a37b34b040a99fba99942bd86ce4b46ff5c69babca7a3a -f5018da05556bff71ecc844b2b718598f0825cda3d19d714fb66472621113ad7 -bb240de7dfbd1f17ffd8f2ef4b85a8eb6e1bfdf26c7f98168197c02c4aa535c2 -0f9ef9b7cb7f1d174b2e94953f541c3b84d43366e0e00a028b98f990b4d01515 -3ccc2e1853473bb9b25857e4b8f9d6695ef332bd3baa9ee551a4b142defb7f03 -97cd075ef9cd41082ccbf63e849c48835e105923e725d41d2b5ee0c3f03a603a -161713216af97bd21aa87e3a80d75383603152011530b8abd2294d041e90a040 -f61baf86be97f8daa8326eb1a2b4511425785f35f75835683515af6cd0e73194 -2b25d5fa8c7e12ccde33aa193d61a35eba7f7e101843e35dfdf3e07a1442b0eb -f2a9084634736a21128843df49c84b1061d0826777a754076c4c3d0a68b32dba -ed4b5c0746ddecdd79fbcc7a4425eddaa7f49257148f05ff52ff6bac71cb65ca -8ad5869cc9fd7c4c194ae8d5d20a730a035234d8f9a6363e7a49fc22bbd34d08 -eb7fd43a678be52b95eccf029a6b18a512d30ceb0b6adf80ff1232dfda1a5752 -b5222edd9012b45cf0df0644b2e713afef21255a08232efbd5d5f7506bfd050a -f0daf55b5db595d29361f8253c26c37e09b4f87056edd8c90e0df4fc74072541 -8ad8ccea562e4ce72acc8e9f39284fca274c572ffec24ba30ef9db07054965bd -2205d717c9b3b0723061cd74ec688b915ab6689904d5762629c891f2fc0cdfb1 -8d8a4d2260dc93d7ac1107b197d7e8418bbacfc660d888697296b7cc6581024c -e583b0114ffe3b3a960d601ff23c0f633e2b85300042f717c4718c0547fd9b19 -e74d0e18f6908e4528065888c136dc8767b74025ef5faf470a272f57f548d738 -c5d2ff6def4366c1c08e0b09855e04ec3bbd8cb6b770f638ac7d852b7b2250f6 -cfbb5669c9112fbf73546a9c1e968a1e1a06128efee6422e41df1519c7346635 -31fea419bba8067c6d0e964143a0906762197b8de95502ae9bb54ced17de5ce8 -9d628716bf1e306aad09bd7f8cb2b7dae5bfa9ef53e716d5aa2ca014eae837c6 -c0f2d5f535ae93682e855b1bdd6ce955627284a4712f67c1d6de9f80d4dda43a -9fe34fe4fab544459a1dfa0d1383c50bb3e6c3df078acb88db37ecb38aaabbb3 -cc59d3fbe6a84f1f9521b6e05d0a0b2e0fceae8eeea4f41976945501f32bb383 -455467d21777796688e57ae9b7b392d167b63bfdc1102565649b53694f1eb3e8 -5ec2f094ab06d427b5e1e7412b3369336c766a7fc778190dd5aeebef9b6a034e -133314cb512667f1a4eef90a1251ca9e8aaf7966ec96004c09c4dfacbb0d4c45 -60d8df4183d3598fb9584a4433c9131f8602474f27e4916b43de80ed1d02f6e4 -d208b014c0a44d94ef709930eca646b2f07d8358d48d0a768b6f13492e3cb877 -fe38c58a7f5468af52ffc11b8c02bd91484cdc022abe678a7f2e298a7fad967a -2ea7dc427e6ac154766ca4ae15fd414a76064823f3145724184e30ec4f1494c8 -78f7f63edea60daf2448de8a79801ecfd86a06ef122451dd2380bb1a4256a7ea -806d131e66d5a6e3079f7c2d7c143e2879f5316ffebb1bfa166a088b8fa9cb7f -4a5f0875a8ff5d378e9e8205c6155ea85756475ca5149eb72643b4ae1f907c0c -fc8f63150cdc6209b1951af23ff68188360939501770eac39ed55dadc4dfb1c5 -b2ef39c93d0326a804f62e8f187a224444098835ff670ad55b49f3cd0aba2901 -293ae04427916ee14c81f4044a05d9c8ad14ad4b5567e8e0147780a0bd294c5a -10a50a5cc7656f901588419108d2570e804a5e590004008776c8cf20b56d5ef1 -fa32538c480bcc1955321f954008871ba180177dea952fefec536f6522582647 -bc205dd139a18d2a41956baa4b002169cf042ab2ebf91ff203dc2e2559171910 -2119e94673a275d73f3909d0834b170e2b62beedcca27afb44a35ac51dcb5719 -82706f101b216b4af3523974378a05c327702b132335ff288adf62578f30cdcc -cf826898361bd49238f368ae2182fbb631e375e903ed9efb911a047119b40830 -a39909494e86aee21694223df1a57ac8e5b4f0465d0868939ac77ccb448d3f58 -36631cebdc06bf2865c58437568cd734efbfa870214853232ccb48cc57c8c32e -97cdeb89cf5e0c032e81de377b368f7d57187f0828675a52382d41de6cd9fb52 -2a1ccfde3192c650fcd7d1f86db03c401e6eebd0d40bf23c10e021ed66bc5b7c -ae57d0905bd24925c8573f069139883bbde13df3ae05bec1771eddb9b003555f -9d69657ac718c065a32ef7ca8a1ff5880fc66196e8123050a47ebe4dd5c1a4a7 -40ce1cf340bf08021fceef8172d9cdeb063f4e4c2205ae4503c71aec1836f9bf -96ccd0a712e33407446ceab96221d7b3f4342fc74aafa802481acecee7243807 -390b2d12c844193560738e576d27b0f5a90b25e1b5a27de8a2c74b3303526191 -5ee0251065475f26bf0bbca5549f13e1357797a5728b46ba9570c095d938112c -b3ba212c26cd6bb569ea276e1d8397569f8d4c78528490187a172d2e30dd0228 -d69fdaa25fbdb477c88d52f0ba137280d68656036c17b8852b03c21621d0b21c -6c016f18cacfa9a998e972f40eda07278da54fe5119babf0145d6824f051cd63 -91bc93472f780f00e261dc74d6673da37d8d9291e25af279829f8d47bb524c19 -8b598ce1c576ac8542b5ead99b039ac2996a6d791a22a5d5bb0fa3eb65d1fa01 -401d5c7d44a9cfe082e9314ada6f4ac8ecea5be8e5a1cb6a1dba1c615e69ec9b -0f231b64ac31c545859f0195bb9b403121df7be1ea1488b413825d8e1d7afbfc -e5a8e1e52d9c3ea6de3ce75d013cb7396e825bac3a50d0bffd2d30c6f1c5dc0d -83c1b68dd8b6042382285812093db4c5d7f6eaa8a4acbeba794f63610456a641 -42fdfd0c4c5f0c4486a6170b7701ca64cd1408f686fbd2afb56ba307722b2bba -c542123f766171b43aae5ac053094a04ac4faa3cbdadcec81ab5aaac58d3a7b7 -1dbedcfe63d062b11dbcacefea89c6f8916389d3f7d93da89ebd8c37414c7db6 -d6512a4e8c76145ac170faf136a023b3c31cbae9775e436d6cb2835b77b56458 -6905d558a3cfab0f1f3426557a66bf775292df056cfaaca8c087b4c0bcc2aae1 -fa49f346602384f743be6b1aa26134ba2872366c17f1dd356221838a40be3a4d -0b8502a964d360ea9bc58e4ffbf283c8294679197faf5d23aad1c89c3da84902 -c95619fa0ab76ca0c7ae725a1c5d9c40e84cc84eba8fc95361f3a738ddbcb593 -b3110db2f69ecf9da21d788d36a1bf986e2dd78c9e62f643e6677f80991f90a0 -8bd35484fc4aef3243bc3b460f57bf6f0a503b57f84723738e1b94c3029520c1 -f8d787f99305ef87fe64293b5fbf0a378306459c022f4127f2e2207ba818aac4 -1c860b70833b92cb7228ab2c8f68d03b6ecb67d4f83cb160c170298e1bff339f -306505ea4fe86929f115b3c55c7fbdb7f09eb38f7c8ca86c9c89d9b92dae37a9 -5839a181e6e55835da3e81c8846980ec5c16646a31bbffe54a8505e005c9200c -cb2b476083d7e55e63648146e8e615d349ed779b787232605beb38346e3578bf -d043797edc00f6df91c9a02958ea01f55f00d576c8a8d236e81b59eaf96bdfe3 -4de4125a3893acea97aa8d6373b736d4cc0166095bbb75b7341f06d8e3fb732a -5539fa8a27abc1d82f1a86a76870450fdebbe889dd048cbf2f184dcca5377649 -9ca0053aa9a88ab4d6f279f8a3ba704ed057dc2a361d07e5af6c9c8ce4b08c05 -d06635afce1cd7fb1288df9ca1f9a556d1a120691297d8134214da14db45cdbf -5545abb75134d45257b1e373eaf23fb600370cf8e7de02e7211639b11f8fa0d5 -6627c5718f554ca3351ac95c04dbe894e20692065af2c7a9e239449df4a65917 -2e0fa2bd3ebffbffd9093569851a31db46c8c30c1fb8339a7f742a2c89212831 -15459844298972b8b06e2c699d6acaaf331a023047e5b2041fc39d830b0851a5 -8ef1e329b688034f9c91927cbaae2ec2c84f8502127055ade448d6dd7eea3aae -392dce03347141b3b85f3018b3396b9fb1e4a59c50d9e8b82610088575eec663 -5686e7234e72e4690ce386fcf9d16b54c9c692e9324427dee7e096b6d4c45501 -da2d0eda66a1f29e90c00fd2c62ae43a97f611794c4704d179ce0bd63ffc4f50 -ab3ca7086bf942283fb0d175888a13e5278aaaa25a26e3df4fbf13e64519ad94 -44af171207f3f89b369ccd6162c0ba1320d30d3a596d9f58976f94434c1fb773 -e70be87528a9bd5fb7e494e6cdba0a3cabab8dc2073ea7f5b956bf5d5ca1b258 -25a73e0824ce8d00f4c945c0afdc4b57f7c0162a14b30154b61ab030a73679af -d43e322a04fc7b3c814f3b2d07585eae6a5254b43bc836c6000bf23a56fbfbfe -8478f1cd00150ee39f0aad2c7ae3313b8d619b84ddd8cd3878a4b306950873da -9a592f520b7d7e0cf9b9c97d35139eef9c329763869e64d89a52fed016e1cd40 -4497359d9d4d6bb70222418282cd9ed7f12c16cc1aa6b3eea9c812b7c3910209 -2831b0f05e644f58e878c1eaa3d587c89b26db8b9952e0bead12c7db6aa5a042 -9e33012db0551fe6a589baa800905a7cb35d220efbb675a96444edd18ad89dbc -ebc4087162e977b4cc680a0e3490bfaf28a556c3bb9299935097e3e048679849 -a85ce906f55bdf564f3cca2b0a70b404d02520b77614e577231cb2310dde1ba5 -cea1ef926ad191c98a21ed76ebb8f407ea2ae2ff56014216abb118c0218590f5 -f3284f9a187a85b3f5091f05b21d747f6fe7384a27ae6a8ddb923df4f61900e9 -adb8be5d338613e1486d710e892b5b733061951d164ae233023a69e02457e90d -dfb6d8a53ea0a57f3c9e27614633ace3c6cf57dc8c81d0c079642c4a0745d281 -2bc6ac4587a56e65d6955e50f4380d94f9628c130102e2a3325d694865a0dd90 -01ab118f393fd86d01aedb5612fcb49e8b81fa6fadf7b69650fcef45a0a724d9 -ecf8ced5cf56913fb68a39c71350acd855433cc25b25ade198cda46bfccf1fac -f1c841a1e6058a73e26e580cb46384885c417799d92822689c2f58bc1e0a040a -9d7d3d73de3c18688d62581d54a0eadf9deffb3db34a9f052bce33d5fe8e8ae9 -78e4b0bdcc2a8ffdcaa5b4c0f4a0256d94364e70e1749dbc2b147d69ec539b47 -ef868ac4807f7ac1f01c93b3361942915581efc754453f221f4a70bb903ec310 -62cca7ac392f6f70b61f49822cfd65c668070babc1102322e4cf224902f0cc6e -26bb2c119c3c66434f4a85164c49ed51084a1f0795eb631f6d38123619cc5ced -c8c6908f380a4a3f7939d0b03187e448fa44333ed8d8c2504c3fce0235795d86 -f7a7bb423d1a7ca81b27b4f81c93ac95ba336a0d8e6bb90c96ae775ee34c07da -5cd019a73b7944424d242dd7d96ea0349307ed426fe0c7fb8b5cbe3d295a3069 -b975fafbe78109cab35ac2fa5154f66af9b9ea522cd4847408d1ce24cf7fc770 -4f222fedc962ff21d09aa2ae6cc1b14cfbcab5d0016607362d3c8f6347f7a54e -821327ddd475396b465b1bf5894703c6de1e9947e64867e68efb2620c7f46367 -c0c345f294b781943f0c96500688a08347b0272c60e5d6a7810a44c4e5654d09 -05931a57e1fe6ff7edd1e77a1e1c39070b49e4d72a62f06340f9a76d0553905b -35e5711434d25cc3b14557bbaf66a82a6ef543bbfd14c314ddee0ee99090482f -c1dd06eecf203ec9511a3ad6ccecdd1139ccf31dc72e407853d159c1622131df -f560bd84c30c58439b06aef79bf53ffaa90ab3727e59f164271a69c5bf36f0d8 -3f9c0099933b6bdfc2f613d4f3565dfbd0c85e8723491ead13697f8945f63a6a -612990613b54bb7a19c1d3a13c14f19694e3b1293293a51c64ebe436738eb61e -2ccef09ca77eeb35c7bf10db2a9b1eabbe4fb88ccefeae6359bf5e136ee974ea -a1a5c7152d54de8dfab89422943ad50e5884f330ad4078763ea071c6265e555d -a610d246133435db11c37e786302e3e8889ece1d9ec3670d82babfed7be2fb7e -fdb78e1b6e1c682b930f48bf0a28301b463a5ca77c368f7d57187f0828675a52 -382d41de6cd9fb522cf52d8792796fccac48d9528d6ba65cca775eea0d9e272c -084f8017bb4ff779b615a46518b256b2c43b27e28b988bf6b60d783d56905a5d -7794904c0cb95e2aa83512f47d2c393b778b7611053d31bbc4670c6ffe45ff25 -2b7064e4740e8895169607d57c89956b526a664b28a2a9f7c42d6a40c4a95aa6 -6be98967f52a855db02c498f141fd6afffc0a69b14bbd009a0c0f023d4d6706c -cc05401aa96d550b6ce0190281ba4cebf16acfa4fd94730cd977d6c120c124ba -ef8489e22a13c30552196e99046201ccff11cb3aff92a63e47a10a3a6433bfc0 -e77047453b71527f209c939d8516182ca5f0966ccbf971fede25e3fefd92cf8b -fd11ac59dff36c25aaa8c771a83d9cbb7dccb37f4f7572f11f702bc27ea9510b -a2d4baa94f5953beb927aaf2426421f0093c603bd63827e28f17d57cef476577 -c1f13eb8beeada42a1eb221cac3dccd5d84a6f74fa2b289c3cab6e2fc94dd92b -d96a015b218ca7facbe18f9c7a580610905847a649e4477773b87686f7f28b33 -24148f4213ccaac483b43be2a9763fdbbdbbd50a0f9d59fc31f5b7b2ac0f915a -89abd64d84faa62a4c3167fbbf651a6236ead6ad931c11435921cbdc4ed66f67 -fe83bc059fa0c625001ad5b3bf638293646d33076f3afafa8b8fd7307da5c53b -5845999c1624e9ed30cd48483403f9afdabbcbe80fa5025bea2cbc081e2b32c7 -42685421ce3d574a414b340075cb02e80d7427d4cc503ee02f5b33e509d76e0b -21b5d5a252757c4b7893dd9870f9371eca57ae78ac688ee28c31d597bc018496 -3fa54a8e160a77dc8b0627d7319885fb2ae0e2e2c9fbcde4b5a7acb04bf1e611 -b73b0dee3ac8f44c4ca15dbeca20c35a7a8805f3c22e6fba8e9b22722dd25ae3 -ba2dec2a0c9a13509f4c9fd3dba03ef6e49a632bf7de5ec45b64a1f4e3a36976 -1b7a9c7b95bd29b09b930b0d82f2c39f9bc3c24d99c58a664d4adedf7b74e13e -6d85e03e615a60a2aee9f790c6d0a2e6e82e6840e51b38c4579fb95337423fba -437d97ab42bafb1097b2e2952e86c88e94ba7020e83163b5d810de8f57625819 -d86d7ae834d7135e30f2e21dd061ff15f22de6c9243d2caaa5abf67abee3a6f5 -306273037adcd10e8f00818ee88ad2ea98d6b7f1ee7e3d1db49a57fa350664d6 -021078ee1ebfbdbe5aee9efab2acd9809ccfb180f8017a84ba6bfc1ba5940eca -3076c863f8d9df3e4afb32361acab13bacd3e465d094b64bece987be66fa501d -5deba893368ea3fdd3b3a4201d3bd68b3464ead10c6f0ddf513a630e0133fec8 -08630e4b3c8b0aad1bbeed508e7e03d41b3d060a92b1958407843e4cabd78d79 -ff72fc0e92f4903cfd05856f457dd15b1aab99c1d29804d2f3134c9817f45fd2 -efebb92545f056f4ca76ea74ad464cd041b7cbb8892f2dba833118b83e20c039 -99939ffc6cc50503bb871565797ec537e26eb622fd30303273748af2afd97e07 -a9c2a96f4ef8754dc3ea8f3348cb30d76bdaa84d2e933c94c99d13e74f19970f -5d2bd19712926e230dd02aeae6461edd83ac935ec2f420649f82d4160a072700 -10141602c3a6572740d8e97fd08e56b987062bb57237bbb3056a36e97e399a7a -cf9653743a9984ef36254d60772a0eedca800923461a3e4443a5ef469aefceec -aa1831e56b0d8ea6ccb76bb9dbb6ab7584ee268bdd0f5f0d57eddba9b97d74a2 -910f178f388a50fa32aad7b87b3235efcabd4b5009190d12e8c770f6e70dbe10 -e747e1984a1c41d701e6220b001fe25b9a677c996f8fd91bd40fa7e07f57e8bd -5d2381442b337924e56de4d18cdc352314caebf065f610b00b50302bae3ad612 -dad9059a3d7f3bd63827e28f17d57cef4a8cb8af1f080a993c3c74871e4b7bdb -2602d07587aed02aa783d80234b6eecc77d163847e63d3c9aa412d10acea7a5c -5ece5b893bb3031facee72701acd225d6b6a752cb2f84de3ceab2b97b606a0bf -c6874869a86e3a55a4e1d7abd94719f604ea68b1108ebb5bebc3ef465bdd2cdb -864ecfe0d6959d5114eaaf1612c970caa2c94729178e6af130a1df211a3795a9 -b5fb934e47f6c48155a19acce788036b4867f90d40c1e4ff7460399f1f08f98a -0aa3e0d8e354195a2563759dfe0183c8d67b449516ed8f5cf3288f7298d62092 -922f07027352bc7c9612cfca46f1cf2ed1417ab863c2615f2d26ee13d7a04a18 -8336ec9961e76af2f506e3db3d67a2a4fb2dbbb0ca34be6db9789a1cda607d9b -35f0eac47f488bbe74f8f04b49dc492ec8f096e6710ad59d248a0c98497541d8 -5f9134d5215b0a05fc29db1aa71e432a2c0b00106bf3124df0b72c144375a280 -9cc5ed8335b3e970eaad9178f43011b55d7f3e11d89be1058361893016254440 -353b88162a4e7913721092e05573497ed693f3120176dc08253d2356559041d8 -741a6b9c41f8eb695369633632ffc35a1e2e4ed6258f0a8eef0bf6bb028efed8 -a679be4bc197cc868255f748ca953312eef556d8fdae4e9706c3116e76140587 -db18492730a14e96c211fcd0aeb0d4324b1b4abd0150637c6c135fcca1823fde -20482dbbab536f87e1d3f0ac4b5154e33bfaade3ac4af8b8d2082658d35a251e -a0d718f702ed8d957555331c9593abbf64b2194dac9f098773ef4313cd8a48e7 -4d60513d6ee1c132e59ebf5dce2359b61efd16fb4cce810172abb3939e874792 -a862462c72895461ed4dd265abbf52c11c50e607fd3bebeff0397398f656066c -5f64fc4e67cf5f984fe818c9500cb10beadc1ac513c0c8e60701144b949ce67d -08cec1adeb70fb01f48abfea22412f4b07b710a8d774228ae156bfdd556c0f49 -bda072c0926a08150f77ee338b3b4303bd2186da21b89df804cd531c499ef953 -9b1ed325e5ef952af05cf67a9fe64b1af975c18348809161ad382debfde45495 -5b32472edf5098b6d1f8fc8807f81ee5be3659bd0f47542ee81e20cbaef168dd -4b991069cda2f850b1faa40e74fad79ed5f74a0fde1c060996a2280e9c9d21f5 -d23174d3ef4d9eb6e337d443cfccaeab8b0015e6427f9439c8473a1364faf782 -f58bd8bd775899092844ba570c427dff47b8cc4859fd9042ce78aa27ffea8b5a -c52be0d97cd01c7250a6eda489b5a17e23167239e0d7fd8f3429529ef02548e9 -b7bc1dcfc729600ff98d9f9b33ecdd10ff78baa313b7e35c51dfe8c6a17568fd -bfbd434860a8ef3821b336783fa328279c05b05aba37f8d26da43391c9cfbd71 -6b240148995a005448afbe45ef2c2853aa3c1cf3ba6434ec79e8dbacef443569 -8e6ef17bdf960e9a37f0b34f4aa39641492bcce95afe55d168e510f934288da7 -c61eb3e1a42f18abc608995cd8c9afcc591751bcd9759387d3924751b1a2c79a -0cf18b53d3ed8096e2c559dd001e8bf6824b3eedafedd8b89fa23f4aeed14435 -a7d05da7b0607edf2aab0816e866f6791e834bff5f5c6699edb97df199549d54 -3d039671a481d094352ec76d2f7e5119887ee3ad1117f749a85b3b6f37e3d25f -25397d1d019da9c5c6fbbfbaeb4fdf0a423f6394968f2eabc560f76e75b07b54 -a6d87328604fc86be37a1e8e5790eb845cca88bbc2e01eab28a6d6615229658b -7554a85064aacf698949e4f56f2bd61bd5af31bd6012ef0c1bb627cbeec71b52 -e99af95f699617a8462e14e144424a64e4c1cda80a13cf7b20929041b2df6686 -15c2f77a73f9cdbca33cd11188a9a608b240b27e7cfc5234fdad6db5d6565787 -d99f45709674690ee704de4ce6accc37343eaac02dd8ca368221d607c4ea24dc -05aaa5162120301a8fb4c3166ef0e813aab536200a8d54d3e0679cbad59cae0d -d9c251016336c63243b42f4a439af0f1b4d4cc3ee9c24dae5ec87c10b4b046eb -3877eae636101c3231319957690cf7cd562fb48e44abd46bfd8640de5348a01d -8389dbe26165729c3ea1023b354cc6b6928922cffb2df9ea60d853a74067b442 -a7d4938296e2ffdeee8b33dae2ecf5be2451fbe3829f9c1d45820c9849176a43 -22694f059367670d68ad12080a84603821f867ca37dc727c3c5254103af21cd9 -034f679aea5d4bc81366245725fa46cd671ac9251817e8abbe9f06f182b738e9 -05769b0d6a504170334d09bb7b809c249ca9678658b36fef98a0f8936cc9167f -31837fb2e92319b8e4df5168494fe90a12a88b93bae098fac2f3af2c087759cf -0fdc3d901e921222a19e53c654d13e52a6f272bd65e3deee14e3e59c6dd9b794 -dbd476ccd4deb50e94d207123a5bb6276e40177c13adee9227e283b51bdc8e50 -2af8d9f3d4cdf61a9bffdb5047aa305f7c61fbb49440b70993c9620020fadf15 -4b5248e8e2a6fd5638a447a593b320039eb53a709e992a481c0de5f19640c17f -cdcfacfbf7b5252c0274c53f6de78a11db640076e01a11be6a63c3a8be0e3fb0 -f0c1f40b379b80399771b0b23aa0fb934ee3184f0c18d5cb40285510a4eb92f1 -6f089ce3cf32b52add23b0f6a436637a17a71f90e8c91adeaff7eb97220a17b7 -354ea80c678e158c1ecd586f0e2e6d7ab5a179500d404e19a65db6c9568b0799 -330d69b254d29e704196964553817ab428be257c5d51aac61ee9cffcd3ec4615 -1d6e9992ad91a791d1c2465df24757dcbc64f3788b15868b905e53ccd04625c7 -f04fa267d68a6aeb59443ead9bc171f845b2b0d7ac7e788c21411a1d4b3935d6 -ef2093333ce092da5d06fcf6c1f1afc68db00cc1d0090f21046b54694f5162cc -cb07ac6e81a3b657871db0692cd70edcfb645c335167e08eb15caa6cbf6419b0 -1cb28d3beb8c5ab6c8f77663a2c258177a1feb9abb560e903b45a1d14644a08d -778a0db918b36ed5a2d6d409adf41a21b13211679094cf290c4652633d861e1e -2cf20b69ccdcf17ac7d4bc15febe037998b98c176369d225995e578f62f6e548 -049da929686caf8b58bf1baf99bfd7196c8084419d381078ad0bc6bffbe163de -15a4d0e6fb53208aff06f08967882b17c0696f060218ae037682036cb39365b7 -33d8c2b0f2414f3c919473a6abc8d419f70b541a62082602990c3c35a55217d5 -96fea82048181950779a3fc5f67bdad8df84e5433fa67bccd05ec886d857b789 -18ffbf083fa0b9f98cf5cfc9ae29d607d2ed11fa02131fd7c258431b20f7b113 -c316b7163644fdef029d33366200e9c4b5727940490a81aa139dddf9493f6b32 -0ee84950a6a549460032d0ba7fb3b2ded2e4028bd3ef456005bfc1456c681f25 -82dad6da15127a1ef14550d9557b86c2bc37440d538ee5146f320c9db07aed68 -70f6fa748a5b87fde0e3ef4cf1567e743eea26076ba668b46f3f7ad99f4df367 -fd40d87cca35267a09a3a33f8212655b747323e9d5f184cde766906f6f85ef2b -3ad0dc0edcd150e589dae9c0e19d464ad618c32e14a5dbcaa6ecbcd990cc49ad -c6de19129debd2de99b506adf4dbdea4ff1364e300447c9c0deda2cdf1d3648b -1a83bd4be46e1797fb5b6216077a54f12c7ace9c28320026a19492e58193d082 -c0b5473a5a603ce22ea377511b725ad9c23b1a1b906b465fa02d0fb620e23074 -66c9d077730916850cd2abcc2412a364f4a0efde3fb741dea91fbba138e74dcb -809627282be317d8f1dbb22220c9696bf39a27fc38aff90eaf458151a00a8a88 -9d4f5d933b1eee63054c65798ad32079ce573d53c620b6a0f81fd931b5a24707 -ebb30cf01b0c63b55ee8c08b805a9a45aea8aacf49982ce6d3e8726c6a122437 -1b9b116a56de605482449dabbb83d353ebdf355fcb8cde5658c699b8a55718a8 -6e051b42221dda48257e9f56d09f31a77630930abb0fce0d49ec9cb27c6ce480 -4c3b36d45ec195e7f78dc930370ed66cd4b6763085ec4c626693e69b39e993b1 -70b2289f29dcf94d5d2763a8211a92c40442371aa2f4297c9958c833421ee693 -a74b256e425979afe86b286bbda0983e14194250d9fecd03a8ba1fe615e93ae1 -d60d43f6858ea9cd47ddf88a1bfb5e90b60a28cdb269d9e1e43b0cf470a95b48 -aa5299e7159e7ccb18200914b93c3b0df79f181789fdfd6693613d0d42778883 -88847927f59d40f0cb5334f62eafe4f380076cfb7720174eceab1eb5050ea12c -e4293db115c4f9bd4d21910a69d566a706f5c0e1bcb344203503855e6643b125 -17b6db03c41f13a347ad39e47a46d626f8a31a163bda6d23264657b412bdec99 -c87a103d26 +1b2b9e8f09253b61177e95ea219474796072f4b363fe05fa7637750b770d7b13 +99fd7523816e22986f43b17ad2f9328028bba7f383ce5c429773b3d968b4307a +efc6f468433d2320871c85fc9a377c8146b0238e6386f2f010e4c23bf50f301c +95de2b4a559abd765880f5b3d8960d7c462f28339aec4978f261a05761583468 +b73b46da2852db1d9b0b53f6427551b6e87f1a1492a19dd774ccc6a1d0bf8d1f +afb24bc1b3a56e452791e8fb9206a2c9df1677e848a67c4dc754cd0833116c84 +25127a919ffae922f6ec724252ae53662f3eeab1dba230a6ab6ad98cf27afcb2 +6837487ece5214be13a113d27d5ec449ac017cc7f12ff7b731b6aea24462f3bf +e743debd18a99eda36d085ad3602ee939e3c2a40fb9551f4e5e904578e8df0ae +a6e10910d5205c917b45b0d0f44caa993ea6fc2e17ea43b83e62abb31717b3cf +d783d25486084caa1c642a4d9719906889510d7e60c8ba0b48b9d40222d36a01 +1aa4c8148ba57f165bb7181534df0a597bcd1df98fd644fd3e3a09a21bb018bf +637e620e494eeb843c575bdc71016214e19d0d3d030b8a9eaea88822ee97d8ba +ffbd2f522d3ac2f34927961e189b0c163c365ebb410088e95a5bd200e62bd5b5 +e846bdf4c127018a54a78bce6dc744c4c1aec0087df470d72e461c8079f1e8a5 +12794d770d391a02d428fccaaa4fc4ce3eefcf12b553d8fc59588b922565aba2 +c179b29dcecea5254dd73f388bb94a7ea4f16c0ea0278deaa11f2be56dadb4b0 +43bf781fb5151a4d2491bfa2d439082e8cf7a05cbc84393aa92f1d09af1e69f1 +692065dfb293c7d7bb552469bead4b1479ad1b75e552af4c162d37027dda9863 +5e1ff0b4c3ba9cdb41e9c292e901446d40a10906ca0c3f649f7968b4ffd2c653 +650bb2320e55fa19938e4c3775f286a05a1011cff4e4c7f353bfdd88ce318584 +799cd9350da919e462621dc3556b48bf53edce91940eab01870741f0fbbebd2b +c6a26e593fd78e7ab5d05af43231c262477a5309acf964c0fbc114419c98df24 +279612da5ae02b2db3eb07c329891aeab0da742593183a92a619912d6e53b33e +f9489dfb011045b4f20c79a7038e473f435dcc8dfed5b9071acab5a322d4e4b9 +f225eef68b8281688882693085432c16d81dbadaa3df3c2ed508a5547c4b8b18 +2cbe2aab5bfd98acf80d5927a07da8a3aa987a899e28e69a49aca9aa960b45b0 +53079246f09b1f8be89a5912784ef566497df949ac722c37b8b4c641f602217d +e1c7fcd757c04c263aa2a4a08d7e08055e5b922d850c2a898cf32baf2418e0a1 +fa6e54e2459ef6283fbcdd406b9079950669763106c9d8b16d0aac8815fe894b +e1c7af9702ca13b36325fdd90110f1b8a03ce3e7aff614a0a2b1b15a1041800b +b72ceea17cf4a939410c53d5bac0b89eeeb9e2f9cfc6bcdfd9a438c109784adf +9d2843fc809a040b9287f0c71d93f7c2b3273d39c5ed535a8e130b46d3c97f4d +e0bf14ef07eec07f1c747a6b5d294cf4d47ac12f1d9282d2de0f808a4c609e4a +0e2a68646e9583b6b9a75c95840bab3fe259ad8846a82af91f44923f25bac677 +3c8ad0a810731fafb0a95a5445b5800d0be0378909aec60f544c3e7438760b6b +feb2b9b16652caab36f65ac444ce9358670e060a90cc422043b8ea8f0b065446 +0b4ed94690003cc77027d8a3c0a06a48bccdf5d6d6770402b4f44ed2673b1329 +06d4f88bf12a3445794fc9db3f1bb4afb8d380def7dc1dc78624c748192fa321 +c96b32dc26b30e54dffe770165d1759d82a5542cfc4a772d8c2cadcd2e2fb1ca +1517ac15deb0bccf94ce83436e989adba2903489abb6b2eb9f977f3f4d690b31 +e8f6e27faa56bde2c4fd331ceb502ad286857dd67d898f8b86e13a98044f77c9 +ef13c7b14a754fd0e07c68a90940f3fe3594afe83c605102c08ccb046b807975 +e69c165c9b833f41da40d17653b80730495803061fe194ca599d53a3367ba3c2 +8db6183ae68f6564178dc0372c58a103da58de056b7b0f8795cccb1cbd4239ee +a2b6af7eeec2f7da99f12110e07d663dfbdc0645dbf9e051f91924855405f022 +13933f1c51af2ca7a39ae3204ed31d68b15f2b74914bf86548d87316170a909e +e9638b25282a209e9d8bbea3ecfa3ed46c2dba5cb3b38d8fadd66baf9417f5cb +6b3a9186e34d1710c011e3a16fe8f9dbc207edeaa72c2f7d4b7b7112bfdd1b0a +1330a7f88ee867f55c828a9154dda3c57b6e596b830b33ff636e46d8d00fb39e +cc497f82e037ae6f7975a36876d66694e3dfccdd4a5f9ee70883fde704969531 +9cf38a1bbe0c7fbea056326e41636e17d93850a1df92ee50089f30f3c4ade4d3 +07305271d998208c7ac0f998b96ab3e3e182e29b819fd861e52b04e00f9b6be0 +8f5766fa4f3557d0ccc9edf31bf84531d664fc186ae2e7f9c81fe8c4f9f1f2ae +3b9560c9df5fe69d969a0d6c120a6621bd68991fd5593f3197223c9f09613eb7 +1ae0c78d9ffad6be1e36df5885f657994ffb6eefb5e0949674c34768f001827f +12f1ba77ae821657e3e96f17de324f9355152cd28c7bc3bb93b0bd0d40d17d35 +2b303f2518e05cfdc4dfa697683ecbd6a949a2eab9cce57b8b14c53ba2265a49 +5c28d22dab35e36b5b02d2fc02738aa6fa7c4cc66c88f5bf25b2be88a4987cfd +39ca40be4ebe0174ba827e7dba9579fe52b869142fe488f9ea5cff30111d6400 +ac3cdd3e1476468fb113f2b977937e70b7214069a06007d987d0f3ade59460c4 +35361b9ee2378b0b2365178ce4fdaff19dc8e52a4eba7cea25387a2e330bea1f +dac191c9e385c837ee253220a279f05876328864c9c2248258814f7a16030c60 +5a0da56b130757b262ba58ab68340b32d30ba67ae01efd748994a6510bdfb15b +50c31f5dedaa1866ee9123cfc235591e6516e8210dc0157687a8f081c3aae846 +7481d16e8af6d8caa9c8596c801dd5948cf7361cafb8e01268eaf0cb40ae29d0 +de3bb879970e06fea94930ffce9d4a15ff822de7486a4023fb6bcf27d496e0a5 +2c73d409ed6aea6923de8e6ddcd7615d76b5af4f2be2cee210bb781fd622574e +042b2fa03ff6e45cbefae7dfb53447fc56da42938717098806352776208567e1 +f07e8372e0bd8a19332de3a09320e82dfb6ac58689a65ec1fb97808e3ecfc84c +1173378bbcabc629bb8d4f2642cfbe1bfa1a25137db295526810f349baa1e4fe +9bc755f32a1ed330171ada792e10540d41b177bffbd9b94c2c008ff74a20138b +eb2d0b23fcdc136e434d7fc5e7710559b91756ad1171ed3bae249960384eb4b8 +4ec4c71e91d872b1db3b7ee412aa9b4e66c8e5a03d5f1d98de47ab51dd77014c +2926ab5e994a095d9ee5fb336746bba506603279bfa91724f6cc868abb2ce5b2 +c145dae2b6128e6c913c8814a5a0b4134c30edc7f97908ddc6e7bb65cf8a58de +88ffab9273afe5819be1d31040559f763e95cfe230d48681d0b4103ebb92a3f8 +01177bde9bdd61e288e9c5dbd18163eac0a67899acfc1c386f8b261fabd320ab +89fe9be450e41549b3753c32e2cd3069e82101530513728dc24d8c2c25b06ae0 +91db97dcde55f701a63895445c0bcce07ccf4c82b318494f42c776d9482c8c19 +46fce4e987e770a4a7512b5276e36ec3072c6dc9812e56e11b34baaaf9bed596 +e52d1ac1768e8e0a8b20b94f320d56406f4ea3202920fe665809102ba71932b5 +51ad5c83f6f34b1e87272e8ac300761cb99c9104a20557c09df9cf7ac51625ab +05c5a60689321d8cef7eb8edd092b9feaba272a94e133aa84a9b7cded15c6824 +3f7ef11eee530323afe1153fbd6285b2302588252609824ed75c05416beae011 +98155779dec43c2e7fc92532951a1ce0dd6613afb3f9c73055f528f993a342c2 +3ea326391cb99feae1d61d95af36536b1c53d0a2c19709f7c85f07715f95a98a +cdb7722e297692fc187c000a9e64bdfb0c56852bf7ff946f932852d3931043f2 +60b7beabb6b6faf76bd8ff3f2a6fca03fb36ef04f59a9f67d26da5ddbc23bf20 +d82e99326a41155cfc7b4fedb80f69d361c31826743ec395b7aa83c10f9b5eed +80044f3c258d7e2052d2cfe08f6046189bd0022ad8e6e7890cd31848b2477ecd +095ba2ca9f4e9ad4bc8c7b2dae33d20d4cd01885c2f172052c1f8bcea593fff3 +4821540e79f626f4d7fa64c0bb4cc5485309e67071d0277a61369645ad3a4d8c +fbfb1722ef6011fa6b2095aa4e5b32746f64c16af093df2e9bc175409949d440 +795f6f2b72a69435be1621154ade8d4dfb1bfbb0e28da8f08c76cd0521ff176a +d2e7dd44916af6a1dfa3ecd6194189190b428cb56e2ef4a1bdc5d739ff1cbefc +39eac4b5934d3707bd30caf67adb3612b37056151b45e9eb73c3bde4b4350148 +23c3ea6ad5be04886842418ea1872bc169f92a890670fe0b8bdd86421400b49d +57e5ae8fdded5d706eebe573a5a172004e59b9c81fc990d2cf7036344c4335b1 +842a5c879354a84cc837d76b2babf981d4e60c857649054fc69fc59bf14aea72 +51210ac8babc95d58f4f3b497d5db3395a638fe339c5149f284b8dfd340c0b0c +1984d43b5951b7bdb82423182dce8af2baad5eb25e037c5d976b534a3459f742 +751b5ed1c5bbe4915a7b281d1b1c806c58bbf900d5ca092fe2119ce099e52872 +0e5c8231dd6d7ed8fa5d2c953bd8bdc13781119d2b31a94bf39948d4b3688e58 +8aeae48e2d66e17935058ed16528d28e50e37bbeb1d155450364517018b1b44d +bb0703befedb3681a2b609063302129628fcc24d88653589b431fb84e4ddb650 +c2f783594de613ebdad8a1324574cad1fd05a37844799928b4da778710e3a4cf +b85afd46ed46ccad840106074f69ae7c306abf4cead6c66f4fbc0fdeef002570 +25305004426efca887ed5b4f2ef6dcb912ff552089f383d270c1312811b510f4 +11622aab22c5add53e1979fa80a9ac5ab80b3255c901cda700904e4254725a18 +6925971163b35469c55ddf9d36d2e690c988678e2be17e2668807c0fee64d264 +5a8f26899ceae3abc5553bc58674333d43f27d0ead9297619e8169554512d7f2 +9984c12dd44285a3d8a75dd20ebdb5280b95471bcbe5473447fcf750c3b061ba +bf491a61adf487ccefc79cc514569978f12a7a3420ee046e1c28776c96c550e7 +fb0e2b46b3e57b2b8a6ae7d306fd0eaeb026beb5b13b8c980828f78905369fad +aa7ac9c3b91df9a4d1be00b3aea709995849ae4ece16c126b99c3d0fc0bdc084 +f8486d70022e0d5a8e50a27e9439e37d3bc175c3a3bb19914a4bded2feb81ec1 +fa7e274b027f4f4bfb331bf4fcb58fcdd1b999a775bd2a9002e846d7fe61c6d2 +e29fedf3121af6edcef90f23f54b128efad5fcc3e2236e1f9f59218994460d1a +f21eb9a2999501fc489873e9eafb986d9e9e780b4eddf332aa72697ec956f63a +4307133ed0fd2dfafe283677469b7b14b155b17a8da4a81cbce56da716149124 +bb3b20fa7a2b64b58d6eab90dbaff1d560e5e5492f17615b7308cf7670f09a04 +6115d454937c733ed45b1156c2e7d0ed43c093d6416b91533637d5d5f649bca5 +50a5ca5522b0f8362042caa30a4bc87a4a4339710e2de9b2c0c84baebedd073f +25cacf0e4c4bdba46f4c545e27d20536827ea4a4d5f5e19518fae6ba2d45b5e0 +b247f20752a795594d9ce548b5c0217ef480cc5a0be6794178fc7c017aa8a3bd +74686310f635ae6153d9e18a0514882d4ccfe9d7dae9f24b393985e8da776880 +1d9a6515ed7bfad3cabd1e13f2a9be17d42dda60f38dc5dd5412b03b938bed86 +0f9cc900eba7eb281e619edc39b5413af1e242ab56171d3a01203c76788d9024 +2f72c89b7adb10f5caf6851acd3a4369972f796d5a1a9816023f5a454dbf5bfa +5ea34c00df81a76fd79a0198e91ea01efbf7d89d78f9da5253250bb29770c4e8 +df955af85d48c33fbdff3845d6868920a3b09ceb0b7de798354e80d1f3ec05d6 +3ceeb37751ab5f9d5f7e682958235c0fb224551296108eeded2e000bf86193ad +5f290f698375727743a699633867f03f2d7801b18627f25628c0b65ace0e766e +ed22bae384ad0305bbba6a3cbb913641106259e2947e77caa437856febd8b604 +7621e8be93bf909cf3893cb2e0b4c75afabcac6ee9ebfa30dc6ba5e9bb572318 +ba844429bd3b5bec550ebf2b7a3776f11dcb71c930489a792bbad9f6a1679b6e +22a32048d0652fe2e3c1dfebce17cf97281087ed892b5d02d83a97dba1b3b221 +4f52eaa45592670902f979905281d7e92e9bbeebb909d5152f97aa49068d3b2e +8ce26b784b48936a3f8e569e5d96d8f3cf19335c7ca5f139815f26b62ef0be05 +2f436d3d7ad037451cef14021a15b0b10a07048ffd4cc4b4ca987cde5290318d +7100cdfb146fa044c694c79f3ff3ac98f1067bcdddc054cb3867af0b7e340e39 +81cc10ba0763901afa3f492590664fbddc6fe2ef568d6765579eaa5ff1501a1e +6b6b303c415557a70b4d60994b9841785a8791b51814f08ce8f0b048c690dc05 +fce223f392df0b93c030960e7a4717203c957f428fa52cf5d206eac92a7ec569 +b1353585ae6a14877eebbd8c402163bec563feab67ed764809e5205bc3f50fcb +557af616a430215a7f9915872478572a2335fa3817abd8ff113020f023c513b4 +202a3015e22d173b07d87e6d6eeeb3e0b0891c00831843c6a2613c15bfbcaf5a +8bad5d9e69a88eed3a1965e1876b223b74dedd8f16a2302c7f70ed7c8b5e60e2 +25c39cd88e4b559888007abc4f48955fe377c69b00be16bf9eec8248ebeb6808 +5a80b2f60ae03c29fa29b91f30efb4ca29bc51fb2bc09a7343d0b107ffd02a03 +b26ffb1c6b1d2b5adb3647d37bdb45420e8a115beadb142e3aeedbcc8d0ecd93 +8777fb9ee661d5db7088e3faf04e91f1865418e2723565fe2617d2d8e106a230 +a2dcb6a4502528d22457a4399cb7f9e4f788a03d6c8b5757cf59267fd86ac4f9 +21675f6da1a90156bbdfa77facf6df331491cd2cde707e509b8e5d03ba1b6781 +eacd2ac3eeabb5f5ac4d0d8f5b10676e7357557c23bd6412c625d7944302c969 +561c704f937fe5304e1704b20352a758d6237e52c4a356a08f9893743a5c20da +6a817899bb2edbadbf4234e1ece52b9b3f3e29095f0975259c931b67595f0ce0 +db8e4ccd5f6fdfdda07663d252bd05fd4ca58fa54a9fa6acceabd97f2313c59d +195cbc3bfb55f9050d5e3ec4e42f883635f18d17efb2a0ab333e09c2521705be +aa147b6717c816e57d38adfb2f4658249a3a345b337251b7537cd305c6424dbf +b204417f4c36086edaa8da348dc065aa5a7f68a0ad3e3676a7c240e76ddc8786 +96b56cd4e70c28c3009185ae13ad4e96c8522735074ad649cabf39201903e974 +12967a45b574790d727dc68222dff726fd162dbfee4964afbe6549abeead5264 +a033fb29e70f1d17fe58934bfdd5ee6defe6056ea4a0e39a39b7fc1a6da06713 +f952bc20c689bdddb94bd67997f60f31fa6239387089deee5b687455a5c06fa9 +fe941781f0d9835d8d020cc6286c2fb8ed5906eccffacadd71ee0b7c7b67d8c7 +aaa95f9cb24fd22bea989e0e0919a4ea35fac630a9090346da895bb5b6e1c1ba +ff90f1e16665998ab7612444979edefd96f1f701d13950e0ca2daa7787735fc8 +4b268e36cba6d7de0506dc5353f3d13ad666cba8f8c56e27e44b57873adee581 +fafd1f33a85b6169d4794b1d73940c134f11dfde03ccc5709f6d806cfffdb6fd +f9361520d0023ac6aa3c93b843d8cd8a652a665eb31d6b75d752e7679a9e1327 +d0adf92820acc78b0793b9f0307c776c201a408a883f99f9d2ade3960b1e62e2 +db5d6ca4115a028f87f77651c95bd71456ba087709827b05a80ff78746cd3c09 +72eec0baa7ebc8a05043e18e63517fb66e333973dfa6bc796af520e8efbae640 +a2f4b94f244d365b76fb3e229726dd7c61478dff4d616cdceaec1ad70d9cefd6 +0e9e6affa41f34b777da7174b3281acda204977bcedb3f5f9f0c5d77607237a6 +9d6780dd18cef875257fd719d237a35864498978239cc0933a9ad0fb8ac74f3d +869fab0c30e8001a2df0ada8f56de43c5e9a7dc78220720dae05f0fff948adf9 +0e8319eafa3fc8e936c9c040b1498e7eafc36f03bb4cd11a6fed37b7a8d05b1d +00b5f36799e9556526f5e5f2205dd641ee39a4bd6c8ec20a36473eadfe1a499e +88284d2fb544b7bdb637868345ae4b3dca6bc0754bad59df4558d2d608faf166 +68daeac6bfb73db431a3146628d371c2d158a1ba65c8d2d47ceec7addae77864 +042ef587a6d6c04dce664bf83492d164d2fc00c1313c220bfdd7a30dede201c5 +1e84d9573c79235a8d847d0a4c231fe009058f5848c775e343c61835c7c8e025 +44dbe77ccfff9e9c950ace49091771604234e586c1335904da22349a847ade3c +060aec69c2987eb1f3332d8b66e59be53edab3da137d59cc6efa0f579f8a1d03 +882c720c27834570c10bf892f79b30340ead8535881b11171b2040fb6637140b +e927369f803a4ff311d78d7e68f4b5f8628fdcfa2cc376442d78e6f47cb378eb +31f079902cd32d6aec688f02a7365b66797de1ea022afec2f3aae36fe01a3e5e +6cc49c79ca23dc10ed8071eea3a0f8924a0dcc610f842e4e30c1104f859ac970 +06c7490195599c65393be11269c8dd7247c96d632523256f59edeb144329b8da +b35303c922432e92394a95196dad464e35858f00e6a27320cf515b7b8af90d06 +82e89f09afb605862d14eab6a99218b3f66f11ea2f345629c402bd9aeb25e3e9 +8734a0ca4a814d824ee4ca5383c6eb8ff1458c767dd9b71530c5f01be2d2611c +f9644c28f3f52ac748749b54eb652f76630e3a62b63a3562a54144c306beddfd +557e154c7d4931bafe9a9136c3aae071b00e7204150cece0d45e10bd736b633c +8abf3817168828ba17b23c8ef8ee35119c43cd7fe068e1f016aadc734d4338d7 +8abd60567f307d6ec471f99b03cc7b5e8140dc07f726303c2185590f9f2224c1 +52bf01b038ae1e963098a309edf98ce5ba1ab235e1190ba23732e42841b2bf69 +36560701e1653df36a29c8c3254d402d0140f5ffeda15ded4728c176e3f39c35 +48b5a2be25266587b52bda256f255c940adddbfcaf37ba2500213239f12dc7e0 +0b61230190a4380917962c18effc6774f6db08b799c5966ca7133fadfd7e2b25 +75116286d1c2a40545f973870cbb5cf97691afe304ca7b586f198c426a71dfa8 +cedbe3d94bda4267b9b5ff1454ac7d54f59c5d94588bb274601cee186b9ee892 +5f359ec5bc402442bba33b2663d564461ca130d7f1405b0467027ec1e27bbec4 +8d51c674c81b66ec733c4c57410956520f9c16708aaee0d9ae34f1050f6412c7 +7a23c8c3364dad8e407319772c9b201c49b75dea4685566d9c912acdb47aece3 +f9786e47398891c07b0269e74e2eb935991c9d7a835eb88bc04eb2b195ddeb02 +38dcd1e4bb773e269ad58fa9e2f5482db94a661f065bfafee3ccc1c812e9fac3 +31fd70975e3a0c72d37207d6c90f998103a821c35734f0153950e5f72ff6a8ac +cb831f57267142dcc4079c915a4d01807fdc883e15a15b67e8cea1ef8d26e4fc +b55c69418d7a4dcef51473a037050cc43e204fc7de2392905800993bbccaf459 +3bd84187fd1c295d111867930dd068988631f5d0abb9adc48b7ca8134f8a3baf +3569f5ffbf19291022b3e13fdabbf0ddf64fef601cf97dc70ed2e4355de38f1c +0ca81966adfc95cf03e794d875025af92bbeaacd9ee58b49c3f0b67d72b13a0a +971076819781d91814c47a0a3b53f767b7630fb55df3d2706d834b127d56fc95 +b9b30ab934839b8324c9ee0147f0bbec998eb1b2939a2102c59c896b9f57c9b2 +fc138cfd94fd5c512bd83e30e8356e983cceb0de72224f78b3c8a98359e46f22 +c19ab808b70c4287397eade3b28a311244385d3d49fb80adc4f90f32366fcf42 +eaea8d05392164a48f03184563922bcbeb78376f512b9a289325a61c0c357e40 +bb3dbeebf870ec12ef096a8997bb6ec55251ad55bd881ebdda84056556380935 +b0b8eb1f74ef96bf02375a30dc53795da638252a12a2e9bc18bfd7ff5aa7a8f4 +4a6bb4a34f1c94a781a129fc975823bd16a6df7c5d75b7f6dff55ac5f82e3e2f +572f339f48024e93f0c59fb1fc95bacf7bf5fd7c683c9b159c3b5d937c3a2110 +e78889021ebbbbe76b1f984317d310ea61f7b5cdb4ed1754a35adc9c6924c3e0 +2e3b157261eea5092e0e7a914a259eea2b14192343680a18710db9f82e54c920 +369587bcdeed8f8acb72d2565ca89ea92b6b58bb861012ccab7270200ed5cef3 +9bdc58f4831161e8ce4ef5c6fc839deb8216482d906d60c1a3292de191b40c79 +85529eae01de8fadd442ec8bfa775366070a9e193138a4c6f6eca7ff554c57a0 +19346015d6ed5dfe8b9dd876a207e7247deaa1e42a41c3edccb32d47e5fa97c0 +9bf3f8324a366856d6c6df8f295da2a9164a99b6e66adf4247dd79bbf54525dd +bcf518651fd8b374cbca6ac532ed443a1c952ce148a67cc655d92b670ab76c64 +cba90089f1d252ab55d93cfd0ec1545e79b65c5337fc57e46ad6ddcf5ca56204 +867e467d3982d77c2e603fee7ec4b57bd8718e5be9203666459815b7428679b2 +134188b7c2c89f64b7426e0dde73f586a7a86a4cc4136bcd5b09b2482aaf3ea2 +6a9c99cdc852ae0a7262b57c06143f1a6528b02cdd69b9fd5edc635873997b4d +7c5644daa467783e154ad0a787e72bf5a627f712267198d9368b480a4e764627 +b268d7f1500b8e155615bf9e59bedc125774802dcbe33451e222f6a9ba24afc1 +92933742c74822f138baac4bddcfbf447dea77a4e913028db069e802014b5d57 +b0c7d6b7a727742eebb6a7c7a2231c94d63fbe66fa8030f3b378006027ceb4b2 +74d8d75d001c7b4d0225ec9cb04ca7f5e1668b44682847a8b14dda4ecd87fda2 +6b1694a2810f90537c403ff242d0accc8b73fa0088d668fb4fd50c4a0b0aafe3 +0dddc6e893c1bb127147fd1b35254e2ef659f023cd826cbf5e400dfba85f4df9 +f70b30a42df485bf5dd6c620e37c82bedef5841131716bc5eeb40aefec8c0379 +f9348a1d7ad0618a422d85300bc0f4208a5b4baf9dd1f568da943f0023eec988 +21187716ec2104282a7fed77b0c5b01e78d5d9d5d99994a9f232859ce68a62a9 +e6960f557f153d7101dd98b7836d7841d3180be3b34a99d4434af82db181de42 +e7f3fd86d86678ea86c4ea4d0af845955141ca4f9266f3ef69c2ce9b73ae1558 +9dd98a8a0802572fba00fc509918a64f1dcabd06286039e75042d53d472ae66e +38ecb6e6795e3dd12757255e786909f306fc17d14ed432f5107aac6cc50236b7 +d381ad2c4da239669d94cb276610a846e991f508a75e1a3a851be789b9a3f75b +f5d7dfde15eadd55e7710d79b5a4127b5e9f85f6bceace031aa9ad412541848d +59dd3f66886672db5d90f51fd15334eb973e64baa4181186cc3c090b2a5bbb70 +e9e1fd9420a31674e9e517b1dc0196fcb5624668785a65dfa60a0944386beda0 +66e2a3d871913d23001c0b5f22c4136fa48e6fbd636fe0bbc104cba53ecd15b7 +0034db9200070b7924ab31ea318cffc35cb44bbda45e04f64516b48bbaceed37 +56a2aaa5d5c0a2d06f71a5ca689c8c8afc991638fff960d060555d9ee7a13868 +434853e22d4d9aed6231039517aa713e67e7c08467c687a21bfb00e6c99c9b15 +51859fb8f437c77bca2b0fc97a36ee9b552645b83ddcd2ae48049085693c356c +53b214b9216d5466852340dbb92eadc60bb6225d9c08bb9f5e9f50e40dfb7c12 +2b5126c6e11393d04691831af2707bf11e0c4e887511a59442469df76bc8eb2e +d2e97d09b6b2f1b533ac64d85d454f57702af92cc88d5ddc46388d6c203ba06a +f57846d420ef1727d97d964da29018245d91f1e37e3e3f9f04e02d997b0c28fe +4c99293e87c978606c3a0c7ca1d121c60ac58fad627be407057eae2ebc2074dd +fd2bd9fb017ad048ead3d1243b7634701508034a934c81a9f63a05b7319676d7 +bb9af94fbe826f84d4149e81b46424e482c8c1c655affecb4393177d768eaa24 +a68a71e4faf578e57865b15f459315a26ddf6e39bd3d16958a3a8cbeab793eaa +533eaa3d89e78d292fe37f0c23e32abfd50b2c9fba8261331c66458340bb4cd5 +4e7a7cac3df5ca530fbffd93789357877ad2fe127377b899340416d6100e2165 +64c62ed803d484656ef5ff7587902285671f280de39228b9432ba46c3ecbdd23 +46222998ef3c528cec6da555eb72092d97664cf35ea21e31ffb70e8b8102ddf6 +0203d3dddaa7593a8dc0b1c6af796d891e80860e6bba501e4c38dd5c6b5a6f35 +a38ef0c7cd4ab7cce0e17fae913eec2572565070169cce8517c37b21699fe4d3 +58439dcec0066047253d42a74ba564d2fc7ccf34b3b4e77fbac09d950c3c134c +5671c64b9964c124d123a299d2070826fde61b7f637bf87739e7a0de70ef82af +c901821eabb31969a27596e9826dd506912d05918ddd2981d5fb153526683f83 +04bbb13678af6d8a65aaae58240688caf7a8419f7bacf078dae7495ab646fc40 +c9004cbabf4c76143e33fe49fed460a102129b9f6cdda0797e53df9b9db99890 +7dc89ecb49ee18cd7556b44b096c9337f6a5618b589c6d7c87ea0f292bb446fe +c901b120180e3b514e3e7e32e52028a30cfd6879068a68b7ef5db202f575a6f3 +52748c45a3509d747d672b446efd09b0dcab7b3f8808c011a0470eb5c9d8d632 +0f413186fdf227c7f9c45c403ef93db5fb63819de4ca368f1b9387dfb0f039e8 +2c47f56fa0d3073c901393803ae628eba7313821a01b07918efa4d901aca044e +90d0227813c537cdc2c906e44140bdcb8717e95b7597ad7c01b51b7dac732e65 +fa3870fe8865ae6dbc96b5a984e2e363c4b67a3a07fe4eb42044112ecfff74f4 +09329f03a55e1f57656f88a08e597bfccb97a2b0bc0c26db9aa5bc5f1d1bafa3 +65f32c6ae5de5f798233ed6878583d8335e8988021438e992be94f6b73608413 +b83693b45e539261664f851652bd9458e643bd60628d0acb48a0edd350749e13 +9e480bb10cfb50b4fa0e37348d2f5ebc3e3f3457128b9793ef1359076da9e92d +e3bbd59ccc0c0327867bd7895a19cb93fdcd6ef8d459ccabadb1e0bc6896b456 +b13cab755da348b349da1b485947a23d05e9bb5dfeb8300f8fef30d7f09d288f +681ee6e23d21f76f806440680e7913d323a264fd6d69d4be33527e050856f8d7 +20fcf33f81e5021271c2cefd7b1c6a2dc9e207140be0030fd866fb65e33cf5fb +8879dd70eed5e887537c45d136be8bb191bd9dc4cea400137903a12b66dcd359 +9b6c2e43306759110af0878c8f37c8daf847657c2bd68d5c3ca105b332d18d5e +03269eedc1ae92f4e45c79915981c1f32b5a39c46c358708460301ca4298bbb4 +5b91e0d45fd1de756c6885545bdf5bce1cd40bb0c92c481a629b0d8dafb6b895 +995c6777d9355af0b03720d3c7456ad60eaa5a80549bb54c0820e000eb30a3e6 +f81c1cdc55b70d902a432d13a233c63ae54f98718d6ddae3c6aabebc65760e59 +d87abb67a5171a4ec2b2377bb5a39f 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -3095,11 +3322,11 @@ c87a103d26 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource -/F637_0 /WWWUTU+NimbusRomNo9L-ReguItal 1 1 -[ /.notdef/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash - /ogonek/ring/.notdef/breve/minus/.notdef/Zcaron/zcaron - /caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity - /lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle +/F621_0 /AMYDOG+NimbusRomNo9L-ReguItal 1 1 +[ /.notdef/.notdef/fi/fl/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash /zero/one/two/three/four/five/six/seven @@ -3112,22 +3339,22 @@ cleartomark /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/.notdef - /Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl - /circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal - /.notdef/.notdef/.notdef/quotedblleft/quotedblright/bullet/endash/emdash - /tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis - /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section - /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron - /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered - /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown - /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla - /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis - /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply - /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls - /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla - /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis - /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide - /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/bullet/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section + /currency/copyright/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl + /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet + /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown + /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent + /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron + /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef + /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef + /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef + /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] pdfMakeFont 612 792 false pdfSetup %%EndSetup @@ -3149,30 +3376,24 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 756] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 463.019 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 2.4906 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -36] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -3193,11 +3414,10 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm [1 0 0 1 0 0] Tm 0 0 Td -117.436 701.916 Td -/F122_0 24.7902 Tf +117.435 701.916 Td +/F116_0 24.7902 Tf (bzip2) 63.3638 Tj -278 TJm (and) 44.077 Tj @@ -3208,8 +3428,7 @@ q 15 TJm (sion) 50.9687 Tj -278 TJm -(1.0.5) 55.1334 Tj -[1 0 0 1 72 696.784] cm +(1.0.6) 55.1334 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -3218,16 +3437,12 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -15.4939] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -681.29] cm -[1 0 0 1 0 0] Tm -0 0 Td -90.4929 661.631 Td -/F122_0 20.6585 Tf +90.493 661.631 Td +/F116_0 20.6585 Tf (A) 14.9154 Tj -278 TJm (pr) 20.6585 Tj @@ -3240,19 +3455,17 @@ q -10 TJm (y) 11.4861 Tj -278 TJm -(f) 6.87928 Tj +(f) 6.8793 Tj 20 TJm (or) 20.6585 Tj -278 TJm (data) 42.4739 Tj -278 TJm -(compression) 128.579 Tj -[1 0 0 1 72 657.035] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -144] cm +(compression) 128.5785 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -3265,12 +3478,9 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -513.035] cm -[1 0 0 1 0 0] Tm -0 0 Td 207.676 503.285 Td -/F122_0 11.9552 Tf -(J) 6.64709 Tj +/F116_0 11.9552 Tf +(J) 6.6471 Tj 20 TJm (ulian) 27.9034 Tj -278 TJm @@ -3284,8 +3494,7 @@ q 40 TJm (.bzip.or) 42.5127 Tj 15 TJm -(g) 7.30463 Tj -[1 0 0 1 72 500.625] cm +(g) 7.3046 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -3310,22 +3519,18 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -435.826] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 463.019 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -3352,20 +3557,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -3390,16 +3591,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -3412,12 +3603,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 140.398 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -140.398 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -3426,7 +3611,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -3435,35 +3619,43 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -13.9477] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -21.5542] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -3476,11 +3668,14 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 72 709.534 Td -/F122_0 14.3462 Tf +/F116_0 14.3462 Tf (bzip2) 36.6689 Tj -489 TJm (and) 25.5075 Tj @@ -3491,7 +3686,7 @@ Q 15 TJm (sion) 29.4958 Tj -488 TJm -(1.0.5:) 36.6832 Tj +(1.0.6:) 36.6832 Tj -766 TJm (A) 10.358 Tj -488 TJm @@ -3503,16 +3698,15 @@ Q -489 TJm (librar) 35.8798 Tj -10 TJm -(y) 7.97649 Tj +(y) 7.9765 Tj -488 TJm -(f) 4.77728 Tj +(f) 4.7773 Tj 20 TJm (or) 14.3462 Tj -489 TJm (data) 29.4958 Tj 72 692.319 Td (compression) 89.2907 Tj -[1 0 0 1 72 689.349] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -3529,11 +3723,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -689.349] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 680.364 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (by) 9.9626 Tj -250 TJm (Julian) 23.8007 Tj @@ -3543,7 +3734,6 @@ Q (w) 7.193 Tj 10 TJm (ard) 12.7222 Tj -[1 0 0 1 72 678.207] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -3556,36 +3746,44 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -678.207] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 668.409 Td -/F130_0 9.9626 Tf +72 663.427 Td +(V) 7.193 Tj +111 TJm +(ersion) 24.3486 Tj +-250 TJm +(1.0.6) 19.9252 Tj +-250 TJm +(of) 8.2988 Tj +-250 TJm +(6) 4.9813 Tj +-250 TJm +(September) 42.61 Tj +-250 TJm +(2010) 19.9252 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 651.472 Td (Cop) 16.6077 Tj 10 TJm (yright) 23.8007 Tj -[1 0 0 1 114.799 668.409] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -114.799 -668.409] cm -[1 0 0 1 0 0] Tm -0 0 Td -114.799 668.409 Td -/F130_0 9.9626 Tf -(\251) 7.57158 Tj -[1 0 0 1 122.371 668.409] cm +-250 TJm +(\251) 7.5716 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -122.371 -668.409] cm -[1 0 0 1 0 0] Tm -0 0 Td -124.861 668.409 Td -/F130_0 9.9626 Tf -(1996-2007) 43.1679 Tj +-250 TJm +(1996-2010) 43.1679 Tj -250 TJm (Julian) 23.8007 Tj -250 TJm @@ -3594,7 +3792,6 @@ Q (w) 7.193 Tj 10 TJm (ard) 12.7222 Tj -[1 0 0 1 72 666.252] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -3607,69 +3804,49 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -7.9701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -658.282] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 650.875 Td -/F130_0 7.9701 Tf +72 633.938 Td +/F122_0 7.9701 Tf (This) 14.1708 Tj -250 TJm (program,) 28.9952 Tj -[1 0 0 1 119.151 650.875] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -119.151 -650.875] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.151 650.875 Td -/F134_0 7.9701 Tf +119.151 633.938 Td +/F124_0 7.9701 Tf (bzip2) 23.9103 Tj -[1 0 0 1 143.061 650.875] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -143.061 -650.875] cm -[1 0 0 1 0 0] Tm -0 0 Td -143.061 650.875 Td -/F130_0 7.9701 Tf -(,) 1.99253 Tj +143.061 633.938 Td +/F122_0 7.9701 Tf +(,) 1.9925 Tj -250 TJm -(the) 9.73946 Tj +(the) 9.7395 Tj -250 TJm (associated) 32.7571 Tj -250 TJm (library) 21.2483 Tj -[1 0 0 1 216.768 650.875] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -216.768 -650.875] cm -[1 0 0 1 0 0] Tm -0 0 Td -216.768 650.875 Td -/F134_0 7.9701 Tf +216.768 633.938 Td +/F124_0 7.9701 Tf (libbzip2) 38.2565 Tj -[1 0 0 1 255.024 650.875] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -255.024 -650.875] cm -[1 0 0 1 0 0] Tm -0 0 Td -255.024 650.875 Td -/F130_0 7.9701 Tf -(,) 1.99253 Tj +255.025 633.938 Td +/F122_0 7.9701 Tf +(,) 1.9925 Tj -250 TJm (and) 11.5088 Tj -250 TJm @@ -3677,21 +3854,21 @@ Q -250 TJm (documentation,) 49.3668 Tj -250 TJm -(are) 9.73149 Tj +(are) 9.7315 Tj -250 TJm (cop) 11.5088 Tj 10 TJm (yright) 19.0406 Tj -250 TJm -(\251) 6.05728 Tj +(\251) 6.0573 Tj -250 TJm -(1996-2007) 34.5344 Tj +(1996-2010) 34.5344 Tj -250 TJm (Julian) 19.0406 Tj -250 TJm (Se) 7.9701 Tj 25 TJm -(w) 5.75441 Tj +(w) 5.7544 Tj 10 TJm (ard.) 12.1703 Tj -310 TJm @@ -3702,21 +3879,15 @@ Q (reserv) 19.471 Tj 15 TJm (ed.) 9.5163 Tj -[1 0 0 1 72 649.149] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -7.9701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -641.179] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 633.34 Td -/F130_0 7.9701 Tf +72 616.404 Td (Redistrib) 29.2264 Tj 20 TJm (ution) 16.3865 Tj @@ -3725,7 +3896,7 @@ Q -250 TJm (use) 10.6241 Tj -250 TJm -(in) 6.20074 Tj +(in) 6.2007 Tj -250 TJm (source) 20.802 Tj -250 TJm @@ -3737,13 +3908,13 @@ Q -250 TJm (with) 14.1708 Tj -250 TJm -(or) 6.63909 Tj +(or) 6.6391 Tj -250 TJm (without) 24.3566 Tj -250 TJm (modi\002cation,) 42.2894 Tj -250 TJm -(are) 9.73149 Tj +(are) 9.7315 Tj -250 TJm (permitted) 30.5494 Tj -250 TJm @@ -3751,9 +3922,9 @@ Q 15 TJm (vided) 17.7096 Tj -250 TJm -(that) 11.9551 Tj +(that) 11.9552 Tj -250 TJm -(the) 9.73946 Tj +(the) 9.7395 Tj -250 TJm (follo) 15.0555 Tj 25 TJm @@ -3761,55 +3932,41 @@ Q -250 TJm (conditions) 33.2114 Tj -250 TJm -(are) 9.73149 Tj +(are) 9.7315 Tj -250 TJm (met:) 14.1708 Tj -[1 0 0 1 72 631.615] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -23.7789] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 5.5791 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -77.5791 -607.836] cm -[1 0 0 1 0 0] Tm -0 0 Td -77.5791 607.836 Td -/F130_0 7.9701 Tf -(\225) 2.78954 Tj -[1 0 0 1 80.3686 607.836] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9926 0] cm +73.993 590.899 Td +(\225) 2.7895 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.594 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -83.9552 -607.836] cm -[1 0 0 1 0 0] Tm -0 0 Td -83.9552 607.836 Td -/F130_0 7.9701 Tf +-450 TJm (Redistrib) 29.2264 Tj 20 TJm (utions) 19.4869 Tj -250 TJm -(of) 6.63909 Tj +(of) 6.6391 Tj -250 TJm (source) 20.802 Tj -250 TJm @@ -3819,13 +3976,13 @@ Q -250 TJm (retain) 18.1479 Tj -250 TJm -(the) 9.73946 Tj +(the) 9.7395 Tj -250 TJm (abo) 11.5088 Tj 15 TJm -(v) 3.98505 Tj +(v) 3.9851 Tj 15 TJm -(e) 3.53872 Tj +(e) 3.5387 Tj -250 TJm (cop) 11.5088 Tj 10 TJm @@ -3835,15 +3992,15 @@ Q -250 TJm (this) 11.5168 Tj -250 TJm -(list) 9.74743 Tj +(list) 9.7474 Tj -250 TJm -(of) 6.63909 Tj +(of) 6.6391 Tj -250 TJm (conditions) 33.2114 Tj -250 TJm (and) 11.5088 Tj -250 TJm -(the) 9.73946 Tj +(the) 9.7395 Tj -250 TJm (follo) 15.0555 Tj 25 TJm @@ -3851,199 +4008,173 @@ Q -250 TJm (disclaimer) 33.2034 Tj 55 TJm -(.) 1.99253 Tj -[1 0 0 1 470.908 607.836] cm +(.) 1.9925 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -398.908 -17.5343] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 5.5791 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -77.5791 -590.302] cm -[1 0 0 1 0 0] Tm -0 0 Td -77.5791 590.302 Td -/F130_0 7.9701 Tf -(\225) 2.78954 Tj -[1 0 0 1 80.3686 590.302] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9926 0] cm +73.993 573.365 Td +(\225) 2.7895 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.594 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -83.9552 -590.302] cm -[1 0 0 1 0 0] Tm -0 0 Td -83.9552 590.302 Td -/F130_0 7.9701 Tf +-450 TJm (The) 12.3935 Tj --270 TJm +-285 TJm (origin) 19.0406 Tj --270 TJm -(of) 6.63909 Tj --270 TJm +-284 TJm +(of) 6.6391 Tj +-285 TJm (this) 11.5168 Tj --270 TJm +-285 TJm (softw) 17.7096 Tj 10 TJm -(are) 9.73149 Tj --270 TJm +(are) 9.7315 Tj +-284 TJm (must) 15.5018 Tj --270 TJm +-285 TJm (not) 10.1858 Tj --270 TJm -(be) 7.52377 Tj --270 TJm -(misrepresented;) 50.4667 Tj --279 TJm -(you) 11.9551 Tj --270 TJm +-285 TJm +(be) 7.5238 Tj +-285 TJm +(misrepresente) 44.2659 Tj +1 TJm +(d;) 6.2007 Tj +-303 TJm +(you) 11.9552 Tj +-284 TJm (must) 15.5018 Tj --270 TJm +-285 TJm (not) 10.1858 Tj --270 TJm +-285 TJm (claim) 17.7096 Tj --270 TJm -(that) 11.9551 Tj --270 TJm -(you) 11.9551 Tj --270 TJm +-284 TJm +(that) 11.9552 Tj +-285 TJm +(you) 11.9552 Tj +-285 TJm (wrote) 18.1479 Tj --270 TJm -(the) 9.73946 Tj --270 TJm +-284 TJm +(the) 9.7395 Tj +-285 TJm (original) 24.795 Tj --270 TJm +-285 TJm (softw) 17.7096 Tj 10 TJm (are.) 11.724 Tj --740 TJm -(If) 5.30809 Tj --270 TJm -(you) 11.9551 Tj --270 TJm +-828 TJm +(If) 5.3081 Tj +-285 TJm +(you) 11.9552 Tj +-285 TJm (use) 10.6241 Tj --270 TJm +-284 TJm (this) 11.5168 Tj --270 TJm +-285 TJm (softw) 17.7096 Tj 10 TJm -(are) 9.73149 Tj --270 TJm -(in) 6.20074 Tj --269 TJm -(a) 3.53872 Tj -83.9552 580.737 Td +(are) 9.7315 Tj +-285 TJm +(in) 6.2007 Tj +-284 TJm +(a) 3.5387 Tj +79.97 563.801 Td (product,) 26.3412 Tj -250 TJm -(an) 7.52377 Tj +(an) 7.5238 Tj -250 TJm (ackno) 19.0326 Tj 25 TJm (wledgment) 35.4191 Tj -250 TJm -(in) 6.20074 Tj +(in) 6.2007 Tj -250 TJm -(the) 9.73946 Tj +(the) 9.7395 Tj -250 TJm (product) 24.3487 Tj -250 TJm (documentation) 47.3743 Tj -250 TJm -(w) 5.75441 Tj +(w) 5.7544 Tj 10 TJm (ould) 14.1708 Tj -250 TJm -(be) 7.52377 Tj +(be) 7.5238 Tj -250 TJm (appreciated) 36.7342 Tj -250 TJm -(b) 3.98505 Tj +(b) 3.9851 Tj 20 TJm -(ut) 6.20074 Tj +(ut) 6.2007 Tj -250 TJm -(is) 5.31606 Tj +(is) 5.3161 Tj -250 TJm (not) 10.1858 Tj -250 TJm (required.) 28.5489 Tj -[1 0 0 1 403.817 580.737] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -331.817 -17.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 5.5791 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -77.5791 -563.203] cm -[1 0 0 1 0 0] Tm -0 0 Td -77.5791 563.203 Td -/F130_0 7.9701 Tf -(\225) 2.78954 Tj -[1 0 0 1 80.3686 563.203] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9926 0] cm +73.993 546.267 Td +(\225) 2.7895 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.594 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -83.9552 -563.203] cm -[1 0 0 1 0 0] Tm -0 0 Td -83.9552 563.203 Td -/F130_0 7.9701 Tf +-450 TJm (Altered) 23.9023 Tj -250 TJm (source) 20.802 Tj -250 TJm -(v) 3.98505 Tj +(v) 3.9851 Tj 15 TJm (ersions) 22.5793 Tj -250 TJm (must) 15.5018 Tj -250 TJm -(be) 7.52377 Tj +(be) 7.5238 Tj -250 TJm (plainly) 22.1409 Tj -250 TJm (mark) 16.3786 Tj 10 TJm -(ed) 7.52377 Tj +(ed) 7.5238 Tj -250 TJm -(as) 6.63909 Tj +(as) 6.6391 Tj -250 TJm (such,) 16.6017 Tj -250 TJm @@ -4053,69 +4184,55 @@ Q -250 TJm (not) 10.1858 Tj -250 TJm -(be) 7.52377 Tj +(be) 7.5238 Tj -250 TJm (misrepresented) 48.251 Tj -250 TJm -(as) 6.63909 Tj +(as) 6.6391 Tj -250 TJm (being) 17.7096 Tj -250 TJm -(the) 9.73946 Tj +(the) 9.7395 Tj -250 TJm (original) 24.795 Tj -250 TJm (softw) 17.7096 Tj 10 TJm (are.) 11.724 Tj -[1 0 0 1 464.405 563.203] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -392.405 -17.5343] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 5.5791 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -77.5791 -545.669] cm -[1 0 0 1 0 0] Tm -0 0 Td -77.5791 545.669 Td -/F130_0 7.9701 Tf -(\225) 2.78954 Tj -[1 0 0 1 80.3686 545.669] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9926 0] cm +73.993 528.733 Td +(\225) 2.7895 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.594 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -83.9552 -545.669] cm -[1 0 0 1 0 0] Tm -0 0 Td -83.9552 545.669 Td -/F130_0 7.9701 Tf +-450 TJm (The) 12.3935 Tj -250 TJm (name) 17.2632 Tj -250 TJm -(of) 6.63909 Tj +(of) 6.6391 Tj -250 TJm -(the) 9.73946 Tj +(the) 9.7395 Tj -250 TJm (author) 20.3636 Tj -250 TJm @@ -4123,15 +4240,15 @@ Q -250 TJm (not) 10.1858 Tj -250 TJm -(be) 7.52377 Tj +(be) 7.5238 Tj -250 TJm (used) 14.6092 Tj -250 TJm -(to) 6.20074 Tj +(to) 6.2007 Tj -250 TJm (endorse) 24.787 Tj -250 TJm -(or) 6.63909 Tj +(or) 6.6391 Tj -250 TJm (promote) 26.5643 Tj -250 TJm @@ -4139,9 +4256,9 @@ Q -250 TJm (deri) 12.3935 Tj 25 TJm -(v) 3.98505 Tj +(v) 3.9851 Tj 15 TJm -(ed) 7.52377 Tj +(ed) 7.5238 Tj -250 TJm (from) 15.4939 Tj -250 TJm @@ -4149,7 +4266,7 @@ Q -250 TJm (softw) 17.7096 Tj 10 TJm -(are) 9.73149 Tj +(are) 9.7315 Tj -250 TJm (without) 24.3566 Tj -250 TJm @@ -4160,32 +4277,26 @@ Q (written) 22.5793 Tj -250 TJm (permission.) 36.9733 Tj -[1 0 0 1 533.577 545.669] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -461.577 -9.6956] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -535.973] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 528.135 Td -/F130_0 7.9701 Tf +72 511.198 Td (THIS) 17.7096 Tj -401 TJm (SOFTW) 27.0107 Tj 120 TJm (ARE) 15.9402 Tj -401 TJm -(IS) 7.08542 Tj +(IS) 7.0854 Tj -400 TJm -(PR) 9.74743 Tj +(PR) 9.7474 Tj 40 TJm -(O) 5.75441 Tj +(O) 5.7544 Tj 50 TJm (VIDED) 24.787 Tj -401 TJm @@ -4193,7 +4304,7 @@ Q -401 TJm (THE) 15.4939 Tj -401 TJm -(A) 5.75441 Tj +(A) 5.7544 Tj 55 TJm (UTHOR) 27.449 Tj -401 TJm @@ -4211,31 +4322,31 @@ Q -401 TJm (IMPLIED) 32.3188 Tj -401 TJm -(W) 7.52377 Tj +(W) 7.5238 Tj 120 TJm (ARRANTIES,) 46.7128 Tj -401 TJm (INCLUDING,) 46.2585 Tj --400 TJm -(B) 5.31606 Tj -10 TJm +-401 TJm +(B) 5.3161 Tj +11 TJm (UT) 10.6241 Tj -72 518.571 Td +72 501.634 Td (NO) 11.5088 Tj 40 TJm -(T) 4.86973 Tj +(T) 4.8697 Tj -304 TJm (LIMITED) 32.7571 Tj -304 TJm -(T) 4.86973 Tj +(T) 4.8697 Tj 18 TJm -(O,) 7.74694 Tj +(O,) 7.7469 Tj -305 TJm (THE) 15.4939 Tj -304 TJm (IMPLIED) 32.3188 Tj -304 TJm -(W) 7.52377 Tj +(W) 7.5238 Tj 120 TJm (ARRANTIES) 44.7202 Tj -304 TJm @@ -4251,9 +4362,9 @@ Q -304 TJm (FOR) 15.5018 Tj -304 TJm -(A) 5.75441 Tj +(A) 5.7544 Tj -304 TJm -(P) 4.43138 Tj +(P) 4.4314 Tj 92 TJm (AR) 11.0705 Tj 60 TJm @@ -4263,13 +4374,13 @@ Q -304 TJm (ARE) 15.9402 Tj -305 TJm -(DI) 8.40846 Tj +(DIS) 12.8398 Tj 1 TJm -(S-) 7.08542 Tj -72 509.006 Td +(-) 2.654 Tj +72 492.07 Td (CLAIMED.) 38.2963 Tj -576 TJm -(IN) 8.40846 Tj +(IN) 8.4085 Tj -287 TJm (NO) 11.5088 Tj -288 TJm @@ -4279,7 +4390,7 @@ Q -288 TJm (THE) 15.4939 Tj -287 TJm -(A) 5.75441 Tj +(A) 5.7544 Tj 55 TJm (UTHOR) 27.449 Tj -288 TJm @@ -4293,11 +4404,11 @@ Q -287 TJm (DIRECT) 28.78 Tj 74 TJm -(,) 1.99253 Tj +(,) 1.9925 Tj -288 TJm (INDIRECT) 37.1885 Tj 74 TJm -(,) 1.99253 Tj +(,) 1.9925 Tj -288 TJm (INCIDENT) 37.6268 Tj 93 TJm @@ -4307,17 +4418,17 @@ Q -288 TJm (EXEMPLAR) 42.9509 Tj 65 TJm -(Y) 5.75441 Tj +(Y) 5.7544 Tj 129 TJm -(,) 1.99253 Tj -72 499.442 Td +(,) 1.9925 Tj +72 482.506 Td (OR) 11.0705 Tj -299 TJm (CONSEQ) 31.8804 Tj 10 TJm (UENTIAL) 34.5265 Tj -300 TJm -(D) 5.75441 Tj +(D) 5.7544 Tj 40 TJm (AMA) 18.5942 Tj 40 TJm @@ -4325,21 +4436,21 @@ Q -299 TJm (\(INCLUDING,) 48.9125 Tj -299 TJm -(B) 5.31606 Tj +(B) 5.3161 Tj 10 TJm (UT) 10.6241 Tj -299 TJm (NO) 11.5088 Tj 40 TJm -(T) 4.86973 Tj +(T) 4.8697 Tj -300 TJm (LIMITED) 32.7571 Tj -299 TJm -(T) 4.86973 Tj +(T) 4.8697 Tj 18 TJm -(O,) 7.74694 Tj +(O,) 7.7469 Tj -299 TJm -(PR) 9.74743 Tj +(PR) 9.7474 Tj 40 TJm (OCUREMENT) 49.59 Tj -299 TJm @@ -4355,31 +4466,31 @@ Q 80 TJm (VICES) 23.0256 Tj 1 TJm -(;) 2.21569 Tj -72 489.878 Td +(;) 2.2157 Tj +72 472.942 Td (LOSS) 19.4869 Tj -360 TJm (OF) 10.1858 Tj -360 TJm (USE,) 17.048 Tj -360 TJm -(D) 5.75441 Tj +(D) 5.7544 Tj 40 TJm -(A) 5.75441 Tj +(A) 5.7544 Tj 111 TJm -(T) 4.86973 Tj +(T) 4.8697 Tj 93 TJm -(A,) 7.74694 Tj +(A,) 7.7469 Tj -360 TJm (OR) 11.0705 Tj -359 TJm -(PR) 9.74743 Tj +(PR) 9.7474 Tj 40 TJm (OFITS;) 24.3566 Tj -360 TJm (OR) 11.0705 Tj -360 TJm -(B) 5.31606 Tj +(B) 5.3161 Tj 10 TJm (USINESS) 32.3267 Tj -360 TJm @@ -4403,39 +4514,41 @@ Q -360 TJm (THEOR) 26.5643 Tj 65 TJm -(Y) 5.75441 Tj +(Y) 5.7544 Tj -360 TJm (OF) 10.1858 Tj -360 TJm -(LIAB) 18.5942 Tj +(LIABI) 21.2483 Tj 1 TJm -(ILITY) 20.802 Tj +(LITY) 18.1479 Tj 128 TJm -(,) 1.99253 Tj -72 480.314 Td +(,) 1.9925 Tj +72 463.378 Td (WHETHER) 38.9578 Tj -247 TJm -(IN) 8.40846 Tj +(IN) 8.4085 Tj -247 TJm (CONTRA) 32.7651 Tj 40 TJm (CT) 10.1858 Tj 74 TJm -(,) 1.99253 Tj +(,) 1.9925 Tj -247 TJm (STRICT) 27.457 Tj -247 TJm (LIABILITY) 39.3962 Tj 129 TJm -(,) 1.99253 Tj --246 TJm -(OR) 11.0705 Tj +(,) 1.9925 Tj -247 TJm -(T) 4.86973 Tj +(O) 5.7544 Tj +1 TJm +(R) 5.3161 Tj +-247 TJm +(T) 4.8697 Tj 18 TJm (OR) 11.0705 Tj 60 TJm -(T) 4.86973 Tj +(T) 4.8697 Tj -247 TJm (\(INCLUDING) 46.92 Tj -247 TJm @@ -4443,7 +4556,7 @@ Q -247 TJm (OR) 11.0705 Tj -247 TJm -(O) 5.75441 Tj +(O) 5.7544 Tj 40 TJm (THER) 20.8099 Tj 55 TJm @@ -4451,18 +4564,18 @@ Q -247 TJm (ARISING) 32.3188 Tj -247 TJm -(IN) 8.40846 Tj +(IN) 8.4085 Tj -247 TJm (ANY) 17.2632 Tj -247 TJm -(W) 7.52377 Tj +(W) 7.5238 Tj 120 TJm -(A) 5.75441 Tj +(A) 5.7544 Tj 105 TJm -(Y) 5.75441 Tj +(Y) 5.7544 Tj -247 TJm (OUT) 16.3786 Tj -72 470.75 Td +72 453.814 Td (OF) 10.1858 Tj -250 TJm (THE) 15.4939 Tj @@ -4479,7 +4592,7 @@ Q -250 TJm (EVEN) 21.2483 Tj -250 TJm -(IF) 7.08542 Tj +(IF) 7.0854 Tj -250 TJm (AD) 11.5088 Tj 40 TJm @@ -4495,137 +4608,115 @@ Q -250 TJm (SUCH) 21.2563 Tj -250 TJm -(D) 5.75441 Tj +(D) 5.7544 Tj 40 TJm (AMA) 18.5942 Tj 40 TJm (GE.) 12.6167 Tj -[1 0 0 1 72 469.598] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -7.9701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -461.628] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 453.216 Td -/F130_0 7.9701 Tf -(P) 4.43138 Tj +72 436.279 Td +(P) 4.4314 Tj 92 TJm -(A) 5.75441 Tj +(A) 5.7544 Tj 111 TJm (TENTS:) 27.0107 Tj -296 TJm -(T) 4.86973 Tj +(T) 4.8697 Tj 80 TJm -(o) 3.98505 Tj +(o) 3.9851 Tj -295 TJm -(the) 9.73946 Tj +(the) 9.7395 Tj -296 TJm (best) 12.8398 Tj -295 TJm -(of) 6.63909 Tj +(of) 6.6391 Tj -296 TJm (my) 10.1858 Tj -295 TJm -(kno) 11.9551 Tj +(kno) 11.9552 Tj 25 TJm (wledge,) 25.0102 Tj -[1 0 0 1 208.544 453.216] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -208.544 -453.216] cm -[1 0 0 1 0 0] Tm -0 0 Td -208.544 453.216 Td -/F134_0 7.9701 Tf +208.544 436.279 Td +/F124_0 7.9701 Tf (bzip2) 23.9103 Tj -[1 0 0 1 232.454 453.216] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -232.454 -453.216] cm -[1 0 0 1 0 0] Tm -0 0 Td -234.81 453.216 Td -/F130_0 7.9701 Tf +234.81 436.279 Td +/F122_0 7.9701 Tf (and) 11.5088 Tj -[1 0 0 1 248.674 453.216] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -248.674 -453.216] cm -[1 0 0 1 0 0] Tm -0 0 Td -248.674 453.216 Td -/F134_0 7.9701 Tf +248.674 436.279 Td +/F124_0 7.9701 Tf (libbzip2) 38.2565 Tj -[1 0 0 1 286.931 453.216] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -286.931 -453.216] cm -[1 0 0 1 0 0] Tm -0 0 Td -289.286 453.216 Td -/F130_0 7.9701 Tf +289.286 436.279 Td +/F122_0 7.9701 Tf (do) 7.9701 Tj -296 TJm (not) 10.1858 Tj -295 TJm (use) 10.6241 Tj -296 TJm -(an) 7.52377 Tj +(an) 7.5238 Tj 15 TJm -(y) 3.98505 Tj +(y) 3.9851 Tj -295 TJm (patented) 27.0027 Tj -296 TJm (algorithms.) 36.0886 Tj -893 TJm -(Ho) 9.73946 Tj +(Ho) 9.7395 Tj 25 TJm -(we) 9.29314 Tj +(we) 9.2931 Tj 25 TJm -(v) 3.98505 Tj +(v) 3.9851 Tj 15 TJm -(er) 6.19277 Tj +(er) 6.1928 Tj 40 TJm -(,) 1.99253 Tj +(,) 1.9925 Tj -307 TJm -(I) 2.65404 Tj +(I) 2.654 Tj -295 TJm (do) 7.9701 Tj -296 TJm (not) 10.1858 Tj -295 TJm -(ha) 7.52377 Tj +(ha) 7.5238 Tj 20 TJm -(v) 3.98505 Tj +(v) 3.9851 Tj 15 TJm -(e) 3.53872 Tj +(e) 3.5387 Tj -296 TJm -(the) 9.73946 Tj +(the) 9.7395 Tj -295 TJm (resources) 30.0951 Tj -296 TJm -(to) 6.20074 Tj -72 443.652 Td +(to) 6.2007 Tj +72 426.715 Td (carry) 16.3706 Tj -250 TJm (out) 10.1858 Tj -250 TJm -(a) 3.53872 Tj +(a) 3.5387 Tj -250 TJm (patent) 19.4789 Tj -250 TJm @@ -4633,34 +4724,33 @@ Q -620 TJm (Therefore) 31.4181 Tj -250 TJm -(I) 2.65404 Tj +(I) 2.654 Tj -250 TJm (cannot) 21.2483 Tj -250 TJm -(gi) 6.20074 Tj +(gi) 6.2007 Tj 25 TJm -(v) 3.98505 Tj +(v) 3.9851 Tj 15 TJm -(e) 3.53872 Tj +(e) 3.5387 Tj -250 TJm -(an) 7.52377 Tj +(an) 7.5238 Tj 15 TJm -(y) 3.98505 Tj +(y) 3.9851 Tj -250 TJm (guarantee) 30.9798 Tj -250 TJm -(of) 6.63909 Tj +(of) 6.6391 Tj -250 TJm -(the) 9.73946 Tj +(the) 9.7395 Tj -250 TJm (abo) 11.5088 Tj 15 TJm -(v) 3.98505 Tj +(v) 3.9851 Tj 15 TJm -(e) 3.53872 Tj +(e) 3.5387 Tj -250 TJm (statement.) 32.5419 Tj -[1 0 0 1 72 441.926] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -4681,17 +4771,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -391.074] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -4716,16 +4799,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -4738,12 +4811,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 46.7993 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -46.7993 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -4752,7 +4819,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5986 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -4761,12 +4827,26 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -4793,20 +4873,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -4831,16 +4907,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -4853,12 +4919,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 140.398 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -140.398 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -4867,7 +4927,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -4876,35 +4935,47 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -13.9477] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm -/DeviceGray {} cs -[0] sc -/DeviceGray {} CS -[0] SC -[1 0 0 1 -468 -21.5542] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -4933,11 +5004,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm [1 0 0 1 0 0] Tm 0 0 Td 72 707.441 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (T) 10.5186 Tj 80 TJm (ab) 20.0904 Tj @@ -4947,7 +5017,6 @@ Q (of) 16.2513 Tj -278 TJm (Contents) 74.5943 Tj -[1 0 0 1 72 698.619] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -4968,223 +5037,199 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.7401] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -686.879] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 686.879 Td -/F130_0 9.9626 Tf -(1.) 7.47195 Tj +72 686.878 Td +/F122_0 9.9626 Tf +(1.) 7.472 Tj -310 TJm (Introduction) 49.2551 Tj -[1 0 0 1 131.815 686.879] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -136.796 -686.879] cm -[1 0 0 1 0 0] Tm -0 0 Td -145.733 686.879 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +145.733 686.878 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 686.879] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -686.879] cm -[1 0 0 1 0 0] Tm -0 0 Td -511.108 686.879 Td -/F130_0 9.9626 Tf +511.108 686.878 Td +/F122_0 9.9626 Tf (1) 4.9813 Tj -[1 0 0 1 516.09 686.879] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0996] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -5197,17 +5242,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8556] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -674.923] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 674.923 Td -/F130_0 9.9626 Tf -(2.) 7.47195 Tj +(2.) 7.472 Tj -310 TJm (Ho) 12.1743 Tj 25 TJm @@ -5218,200 +5266,180 @@ Q (use) 13.2801 Tj -250 TJm (bzip2) 22.1369 Tj -[1 0 0 1 152.318 674.923] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -157.3 -674.923] cm -[1 0 0 1 0 0] Tm -0 0 Td 167.054 674.923 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 674.923] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -674.923] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 674.923 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (2) 4.9813 Tj -[1 0 0 1 516.09 674.923] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -5428,231 +5456,214 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -662.968] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 662.968 Td -/F130_0 9.9626 Tf (2.1.) 14.9439 Tj -310 TJm (N) 7.193 Tj 35 TJm (AME) 22.1369 Tj -[1 0 0 1 119.014 662.968] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -123.995 -662.968] cm -[1 0 0 1 0 0] Tm -0 0 Td 132.691 662.968 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 662.968] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -662.968] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 662.968 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (2) 4.9813 Tj -[1 0 0 1 516.09 662.968] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -5665,221 +5676,204 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8556] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -651.013] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 651.013 Td -/F130_0 9.9626 Tf (2.2.) 14.9439 Tj -310 TJm (SYNOPSIS) 47.0534 Tj -[1 0 0 1 137.085 651.013] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -142.067 -651.013] cm -[1 0 0 1 0 0] Tm -0 0 Td 150.582 651.013 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 651.013] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -651.013] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 651.013 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (2) 4.9813 Tj -[1 0 0 1 516.09 651.013] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0996] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -5892,213 +5886,196 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8556] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -639.058] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 639.058 Td -/F130_0 9.9626 Tf (2.3.) 14.9439 Tj -310 TJm (DESCRIPTION) 64.7569 Tj -[1 0 0 1 154.789 639.058] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -159.77 -639.058] cm -[1 0 0 1 0 0] Tm -0 0 Td 168.29 639.058 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 639.058] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -639.058] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 639.058 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (3) 4.9813 Tj -[1 0 0 1 516.09 639.058] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -6111,223 +6088,206 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8557] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -627.103] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 627.103 Td -/F130_0 9.9626 Tf (2.4.) 14.9439 Tj -310 TJm (OPTIONS) 42.0621 Tj -[1 0 0 1 132.094 627.103] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -137.076 -627.103] cm -[1 0 0 1 0 0] Tm -0 0 Td 145.873 627.103 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 627.103] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -627.103] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 627.103 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (4) 4.9813 Tj -[1 0 0 1 516.09 627.103] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -6340,16 +6300,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8556] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -615.147] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 615.147 Td -/F130_0 9.9626 Tf (2.5.) 14.9439 Tj -310 TJm (MEMOR) 37.6387 Tj @@ -6361,176 +6324,156 @@ Q (A) 7.193 Tj 40 TJm (GEMENT) 41.5042 Tj -[1 0 0 1 207.9 615.147] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -212.881 -615.147] cm -[1 0 0 1 0 0] Tm -0 0 Td 221.412 615.147 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 615.147] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -615.147] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 615.147 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (5) 4.9813 Tj -[1 0 0 1 516.09 615.147] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0996] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -6543,16 +6486,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8556] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -603.192] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 603.192 Td -/F130_0 9.9626 Tf (2.6.) 14.9439 Tj -310 TJm (RECO) 26.5703 Tj @@ -6563,7 +6509,7 @@ Q 40 TJm (A) 7.193 Tj 111 TJm -(T) 6.08715 Tj +(T) 6.0871 Tj 93 TJm (A) 7.193 Tj -250 TJm @@ -6578,136 +6524,116 @@ Q (GED) 20.4731 Tj -250 TJm (FILES) 26.5703 Tj -[1 0 0 1 293.449 603.192] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -298.43 -603.192] cm -[1 0 0 1 0 0] Tm -0 0 Td 308.464 603.192 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 603.192] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -603.192] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 603.192 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (6) 4.9813 Tj -[1 0 0 1 516.09 603.192] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -6720,16 +6646,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8557] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -591.237] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 591.237 Td -/F130_0 9.9626 Tf (2.7.) 14.9439 Tj -310 TJm (PERFORMANCE) 73.6236 Tj @@ -6737,180 +6666,160 @@ Q (NO) 14.386 Tj 40 TJm (TES) 17.7135 Tj -[1 0 0 1 197.847 591.237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -202.829 -591.237] cm -[1 0 0 1 0 0] Tm -0 0 Td 211.958 591.237 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 591.237] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -591.237] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 591.237 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (6) 4.9813 Tj -[1 0 0 1 516.09 591.237] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -6923,16 +6832,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8557] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -579.282] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 579.282 Td -/F130_0 9.9626 Tf (2.8.) 14.9439 Tj -310 TJm (CA) 13.8381 Tj @@ -6940,208 +6852,188 @@ Q (VEA) 20.4731 Tj 111 TJm (TS) 11.6264 Tj -[1 0 0 1 133.519 579.282] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -138.5 -579.282] cm -[1 0 0 1 0 0] Tm -0 0 Td 148.799 579.282 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 579.282] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -579.282] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 579.282 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (7) 4.9813 Tj -[1 0 0 1 516.09 579.282] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -7154,225 +7046,208 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8556] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -567.327] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 567.327 Td -/F130_0 9.9626 Tf (2.9.) 14.9439 Tj -310 TJm (A) 7.193 Tj 55 TJm (UTHOR) 34.3112 Tj -[1 0 0 1 130.989 567.327] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -135.97 -567.327] cm -[1 0 0 1 0 0] Tm -0 0 Td 145.32 567.327 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 567.327] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -567.327] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 567.327 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (7) 4.9813 Tj -[1 0 0 1 516.09 567.327] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.2192] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -7389,205 +7264,183 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.736] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -555.372] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 555.372 Td -/F130_0 9.9626 Tf -(3.) 7.47195 Tj +(3.) 7.472 Tj -310 TJm (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 160.049 555.372] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -160.049 -555.372] cm -[1 0 0 1 0 0] Tm -0 0 Td 160.049 555.372 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 207.87 555.372] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -215.342 -555.372] cm -[1 0 0 1 0 0] Tm -0 0 Td 224.856 555.372 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 555.372] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -555.372] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 555.372 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (8) 4.9813 Tj -[1 0 0 1 516.09 555.372] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -7604,19 +7457,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -543.416] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 543.416 Td -/F130_0 9.9626 Tf (3.1.) 14.9439 Tj -310 TJm -(T) 6.08715 Tj +(T) 6.0871 Tj 80 TJm (op-le) 20.4731 Tj 25 TJm @@ -7625,194 +7481,174 @@ Q (el) 7.193 Tj -250 TJm (structure) 34.8591 Tj -[1 0 0 1 164.921 543.416] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -169.902 -543.416] cm -[1 0 0 1 0 0] Tm -0 0 Td 179.997 543.416 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 543.416] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -543.416] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 543.416 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (8) 4.9813 Tj -[1 0 0 1 516.09 543.416] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -7829,16 +7665,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -531.461] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 531.461 Td -/F130_0 9.9626 Tf (3.1.1.) 22.4159 Tj -310 TJm (Lo) 11.0684 Tj @@ -7850,188 +7689,168 @@ Q (el) 7.193 Tj -250 TJm (summary) 37.0808 Tj -[1 0 0 1 177.374 531.461] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -182.355 -531.461] cm -[1 0 0 1 0 0] Tm -0 0 Td 192.866 531.461 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 531.461] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -531.461] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 531.461 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (9) 4.9813 Tj -[1 0 0 1 516.09 531.461] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -8044,16 +7863,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -519.506] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 519.506 Td -/F130_0 9.9626 Tf (3.1.2.) 22.4159 Tj -310 TJm (High-le) 30.4357 Tj @@ -8063,188 +7885,168 @@ Q (el) 7.193 Tj -250 TJm (summary) 37.0808 Tj -[1 0 0 1 179.287 519.506] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -184.268 -519.506] cm -[1 0 0 1 0 0] Tm -0 0 Td 193.822 519.506 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 519.506] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -519.506] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 519.506 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (9) 4.9813 Tj -[1 0 0 1 516.09 519.506] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -8257,16 +8059,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -507.551] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 507.551 Td -/F130_0 9.9626 Tf (3.1.3.) 22.4159 Tj -310 TJm (Utility) 26.0223 Tj @@ -8274,178 +8079,158 @@ Q (functions) 37.0808 Tj -250 TJm (summary) 37.0808 Tj -[1 0 0 1 202.669 507.551] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -207.65 -507.551] cm -[1 0 0 1 0 0] Tm -0 0 Td 216.582 507.551 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 507.551] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -507.551] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 507.551 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (9) 4.9813 Tj -[1 0 0 1 516.09 507.551] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -8462,215 +8247,198 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -495.596] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 495.596 Td -/F130_0 9.9626 Tf (3.2.) 14.9439 Tj -310 TJm (Error) 21.0211 Tj -250 TJm (handling) 34.8691 Tj -[1 0 0 1 148.413 495.596] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -153.394 -495.596] cm -[1 0 0 1 0 0] Tm -0 0 Td 162.611 495.596 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 495.596] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -495.596] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 495.596 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (10) 9.9626 Tj -[1 0 0 1 516.09 495.596] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -8683,16 +8451,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -483.641] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 483.641 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 483.64 Td (3.3.) 14.9439 Tj -310 TJm (Lo) 11.0684 Tj @@ -8706,192 +8477,172 @@ Q (interf) 21.579 Tj 10 TJm (ace) 13.2702 Tj -[1 0 0 1 167.571 483.641] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -172.552 -483.641] cm -[1 0 0 1 0 0] Tm -0 0 Td -181.045 483.641 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +181.045 483.64 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 483.641] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -483.641] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 483.641 Td -/F130_0 9.9626 Tf +506.127 483.64 Td +/F122_0 9.9626 Tf (11) 9.9626 Tj -[1 0 0 1 516.09 483.641] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -8908,29 +8659,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8557] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -471.685] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 471.685 Td -/F130_0 9.9626 Tf (3.3.1.) 22.4159 Tj -[1 0 0 1 97.5043 471.685] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -471.685] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 471.685 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 205.101 471.685] cm +-310 TJm +(BZ2_bzCompressInit) 85.7879 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -8939,169 +8683,156 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +197.762 471.685 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -210.082 -471.685] cm -[1 0 0 1 0 0] Tm -0 0 Td -219.736 471.685 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 471.685] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -471.685] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 471.685 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (11) 9.9626 Tj -[1 0 0 1 516.09 471.685] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5341] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -9114,29 +8845,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -459.73] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 459.73 Td -/F130_0 9.9626 Tf (3.3.2.) 22.4159 Tj -[1 0 0 1 97.5043 459.73] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -459.73] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 459.73 Td -/F134_0 9.9626 Tf -(BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 181.19 459.73] cm +-310 TJm +(BZ2_bzCompress) 71.9499 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -9145,181 +8869,162 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +184.201 459.73 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -186.172 -459.73] cm -[1 0 0 1 0 0] Tm -0 0 Td -194.497 459.73 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 459.73] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -459.73] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 459.73 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (13) 9.9626 Tj -[1 0 0 1 516.09 459.73] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -9332,29 +9037,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -447.775] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 447.775 Td -/F130_0 9.9626 Tf (3.3.3.) 22.4159 Tj -[1 0 0 1 97.5043 447.775] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -447.775] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 447.775 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressEnd) 101.619 Tj -[1 0 0 1 199.123 447.775] cm +-310 TJm +(BZ2_bzCompressEnd) 87.9996 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -9363,171 +9061,156 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +198.868 447.775 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -204.105 -447.775] cm -[1 0 0 1 0 0] Tm -0 0 Td -214.533 447.775 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 447.775] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -447.775] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 447.775 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (16) 9.9626 Tj -[1 0 0 1 516.09 447.775] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -9540,29 +9223,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -435.82] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 435.82 Td -/F130_0 9.9626 Tf (3.3.4.) 22.4159 Tj -[1 0 0 1 97.5043 435.82] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -435.82] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 435.82 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompressInit) 119.551 Tj -[1 0 0 1 217.056 435.82] cm +-310 TJm +(BZ2_bzDecompressInit) 95.1827 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -9571,163 +9247,152 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +206.887 435.82 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -222.037 -435.82] cm -[1 0 0 1 0 0] Tm -0 0 Td -232.355 435.82 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 435.82] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -435.82] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 435.82 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (16) 9.9626 Tj -[1 0 0 1 516.09 435.82] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5341] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -9740,29 +9405,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -423.865] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 423.865 Td -/F130_0 9.9626 Tf (3.3.5.) 22.4159 Tj -[1 0 0 1 97.5043 423.865] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -423.865] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 423.865 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 193.146 423.865] cm +-310 TJm +(BZ2_bzDecompress) 81.3446 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -9771,175 +9429,158 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +193.326 423.865 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -198.127 -423.865] cm -[1 0 0 1 0 0] Tm -0 0 Td -207.116 423.865 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 423.865] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -423.865] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 423.865 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (17) 9.9626 Tj -[1 0 0 1 516.09 423.865] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -9952,29 +9593,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -411.91] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 411.91 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 411.909 Td (3.3.6.) 22.4159 Tj -[1 0 0 1 97.5043 411.91] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -411.91] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 411.91 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompressEnd) 113.574 Tj -[1 0 0 1 211.078 411.91] cm +-310 TJm +(BZ2_bzDecompressEnd) 97.3944 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -9983,167 +9617,150 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +210.207 411.909 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -216.06 -411.91] cm -[1 0 0 1 0 0] Tm -0 0 Td -224.938 411.91 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 411.91] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -411.91] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 411.91 Td -/F130_0 9.9626 Tf +506.127 411.909 Td +/F122_0 9.9626 Tf (18) 9.9626 Tj -[1 0 0 1 516.09 411.91] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -10160,16 +9777,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -399.954] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 399.954 Td -/F130_0 9.9626 Tf (3.4.) 14.9439 Tj -310 TJm (High-le) 30.4357 Tj @@ -10181,190 +9801,170 @@ Q (interf) 21.579 Tj 10 TJm (ace) 13.2702 Tj -[1 0 0 1 169.483 399.954] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -174.465 -399.954] cm -[1 0 0 1 0 0] Tm -0 0 Td 184.216 399.954 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 399.954] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -399.954] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 399.954 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (18) 9.9626 Tj -[1 0 0 1 516.09 399.954] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -10381,29 +9981,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -387.999] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 387.999 Td -/F130_0 9.9626 Tf (3.4.1.) 22.4159 Tj -[1 0 0 1 97.5043 387.999] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -387.999] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 387.999 Td -/F134_0 9.9626 Tf -(BZ2_bzReadOpen) 83.6858 Tj -[1 0 0 1 181.19 387.999] cm +-310 TJm +(BZ2_bzReadOpen) 74.1516 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -10412,181 +10005,162 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +185.302 387.999 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -186.172 -387.999] cm -[1 0 0 1 0 0] Tm -0 0 Td -194.497 387.999 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 387.999] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -387.999] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 387.999 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (19) 9.9626 Tj -[1 0 0 1 516.09 387.999] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -10599,29 +10173,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -376.044] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 376.044 Td -/F130_0 9.9626 Tf (3.4.2.) 22.4159 Tj -[1 0 0 1 97.5043 376.044] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -376.044] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 376.044 Td -/F134_0 9.9626 Tf -(BZ2_bzRead) 59.7756 Tj -[1 0 0 1 157.28 376.044] cm +-310 TJm +(BZ2_bzRead) 52.5726 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -10630,191 +10197,172 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +163.443 376.044 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -162.261 -376.044] cm -[1 0 0 1 0 0] Tm -0 0 Td -171.472 376.044 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 376.044] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -376.044] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 376.044 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (20) 9.9626 Tj -[1 0 0 1 516.09 376.044] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -10827,29 +10375,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.6452] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -364.089] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 364.089 Td -/F130_0 9.9626 Tf (3.4.3.) 22.4159 Tj -[1 0 0 1 97.5043 364.089] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -364.089] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 364.089 Td -/F134_0 9.9626 Tf -(BZ2_bzReadGetUnused) 113.574 Tj -[1 0 0 1 211.078 364.089] cm +-310 TJm +(BZ2_bzReadGetUnused) 97.3944 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -10858,167 +10399,150 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +210.207 364.089 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -216.06 -364.089] cm -[1 0 0 1 0 0] Tm -0 0 Td -224.938 364.089 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 364.089] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -364.089] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 364.089 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (21) 9.9626 Tj -[1 0 0 1 516.09 364.089] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -11031,29 +10555,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.6452] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -352.134] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 352.134 Td -/F130_0 9.9626 Tf (3.4.4.) 22.4159 Tj -[1 0 0 1 97.5043 352.134] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -352.134] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 352.134 Td -/F134_0 9.9626 Tf -(BZ2_bzReadClose) 89.6634 Tj -[1 0 0 1 187.168 352.134] cm +-310 TJm +(BZ2_bzReadClose) 75.2674 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -11062,177 +10579,160 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +188.074 352.134 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -192.149 -352.134] cm -[1 0 0 1 0 0] Tm -0 0 Td -201.914 352.134 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 352.134] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -352.134] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 352.134 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (22) 9.9626 Tj -[1 0 0 1 516.09 352.134] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -11245,29 +10745,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.6451] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -340.179] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 340.179 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 340.178 Td (3.4.5.) 22.4159 Tj -[1 0 0 1 97.5043 340.179] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -340.179] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 340.179 Td -/F134_0 9.9626 Tf -(BZ2_bzWriteOpen) 89.6634 Tj -[1 0 0 1 187.168 340.179] cm +-310 TJm +(BZ2_bzWriteOpen) 76.3633 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -11276,177 +10769,160 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +188.622 340.178 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -192.149 -340.179] cm -[1 0 0 1 0 0] Tm -0 0 Td -201.914 340.179 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 340.179] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -340.179] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 340.179 Td -/F130_0 9.9626 Tf +506.127 340.178 Td +/F122_0 9.9626 Tf (22) 9.9626 Tj -[1 0 0 1 516.09 340.179] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -11459,29 +10935,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -328.223] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 328.223 Td -/F130_0 9.9626 Tf (3.4.6.) 22.4159 Tj -[1 0 0 1 97.5043 328.223] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -328.223] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 328.223 Td -/F134_0 9.9626 Tf -(BZ2_bzWrite) 65.7532 Tj -[1 0 0 1 163.258 328.223] cm +-310 TJm +(BZ2_bzWrite) 54.7843 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -11490,189 +10959,170 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +166.763 328.223 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -168.239 -328.223] cm -[1 0 0 1 0 0] Tm -0 0 Td -176.675 328.223 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 328.223] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -328.223] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 328.223 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (23) 9.9626 Tj -[1 0 0 1 516.09 328.223] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -11685,29 +11135,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.6452] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -316.268] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 316.268 Td -/F130_0 9.9626 Tf (3.4.7.) 22.4159 Tj -[1 0 0 1 97.5043 316.268] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -316.268] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 316.268 Td -/F134_0 9.9626 Tf -(BZ2_bzWriteClose) 95.641 Tj -[1 0 0 1 193.146 316.268] cm +-310 TJm +(BZ2_bzWriteClose) 77.4791 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -11716,175 +11159,160 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +189.179 316.268 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -198.127 -316.268] cm -[1 0 0 1 0 0] Tm -0 0 Td -207.116 316.268 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 316.268] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -316.268] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 316.268 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (23) 9.9626 Tj -[1 0 0 1 516.09 316.268] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -11897,16 +11325,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.6451] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -304.313] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 304.313 Td -/F130_0 9.9626 Tf (3.4.8.) 22.4159 Tj -310 TJm (Handling) 37.0808 Tj @@ -11918,140 +11349,120 @@ Q (data) 16.5977 Tj -250 TJm (streams) 30.4357 Tj -[1 0 0 1 279.56 304.313] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -284.541 -304.313] cm -[1 0 0 1 0 0] Tm -0 0 Td 294.601 304.313 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 304.313] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -304.313] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 304.313 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (24) 9.9626 Tj -[1 0 0 1 516.09 304.313] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -12064,16 +11475,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -292.358] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 292.358 Td -/F130_0 9.9626 Tf (3.4.9.) 22.4159 Tj -310 TJm (Standard) 35.417 Tj @@ -12081,162 +11495,142 @@ Q (\002le-reading/writing) 77.4791 Tj -250 TJm (code) 18.8094 Tj -[1 0 0 1 234.19 292.358] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -239.172 -292.358] cm -[1 0 0 1 0 0] Tm -0 0 Td 247.564 292.358 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 292.358] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -292.358] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 292.358 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (25) 9.9626 Tj -[1 0 0 1 516.09 292.358] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -12253,211 +11647,194 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -280.403] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 280.403 Td -/F130_0 9.9626 Tf (3.5.) 14.9439 Tj -310 TJm (Utility) 26.0223 Tj -250 TJm (functions) 37.0808 Tj -[1 0 0 1 155.625 280.403] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -160.607 -280.403] cm -[1 0 0 1 0 0] Tm -0 0 Td 170.645 280.403 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 280.403] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -280.403] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 280.403 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (26) 9.9626 Tj -[1 0 0 1 516.09 280.403] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -12474,29 +11851,28 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -268.448] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 268.448 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 268.447 Td (3.5.1.) 22.4159 Tj -[1 0 0 1 97.5043 268.448] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -268.448] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 268.448 Td -/F134_0 9.9626 Tf -(BZ2_bzBuffToBuffCompress) 143.461 Tj -[1 0 0 1 240.966 268.448] cm +-310 TJm +(BZ2_bzBuf) 47.0434 Tj +25 TJm +(fT) 9.4047 Tj +80 TJm +(oBuf) 19.9252 Tj +25 TJm +(fCompress) 43.1679 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -12505,153 +11881,142 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +229.488 268.447 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -245.948 -268.448] cm -[1 0 0 1 0 0] Tm -0 0 Td -255.38 268.448 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 268.448] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -268.448] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 268.448 Td -/F130_0 9.9626 Tf +506.127 268.447 Td +/F122_0 9.9626 Tf (26) 9.9626 Tj -[1 0 0 1 516.09 268.448] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -12664,29 +12029,28 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -256.492] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 256.492 Td -/F130_0 9.9626 Tf (3.5.2.) 22.4159 Tj -[1 0 0 1 97.5043 256.492] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -256.492] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 256.492 Td -/F134_0 9.9626 Tf -(BZ2_bzBuffToBuffDecompress) 155.417 Tj -[1 0 0 1 252.922 256.492] cm +-310 TJm +(BZ2_bzBuf) 47.0434 Tj +25 TJm +(fT) 9.4047 Tj +80 TJm +(oBuf) 19.9252 Tj +25 TJm +(fDecompress) 52.5627 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -12695,147 +12059,138 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +238.613 256.492 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -257.903 -256.492] cm -[1 0 0 1 0 0] Tm -0 0 Td -267.999 256.492 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 256.492] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -256.492] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 256.492 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (27) 9.9626 Tj -[1 0 0 1 516.09 256.492] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -12852,207 +12207,176 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -244.537] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 244.537 Td -/F130_0 9.9626 Tf (3.6.) 14.9439 Tj -[1 0 0 1 90.0324 244.537] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -90.0324 -244.537] cm -[1 0 0 1 0 0] Tm -0 0 Td -90.0324 244.537 Td -/F134_0 9.9626 Tf -(zlib) 23.9102 Tj -[1 0 0 1 113.943 244.537] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -113.943 -244.537] cm -[1 0 0 1 0 0] Tm -0 0 Td -116.433 244.537 Td -/F130_0 9.9626 Tf +-310 TJm +(zlib) 14.9439 Tj +-250 TJm (compatibility) 53.1405 Tj -250 TJm (functions) 37.0808 Tj -[1 0 0 1 209.144 244.537] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -214.126 -244.537] cm -[1 0 0 1 0 0] Tm -0 0 Td -223.971 244.537 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +215.06 244.537 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 244.537] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -244.537] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 244.537 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (28) 9.9626 Tj -[1 0 0 1 516.09 244.537] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -13065,16 +12389,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -232.582] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 232.582 Td -/F130_0 9.9626 Tf (3.7.) 14.9439 Tj -310 TJm (Using) 23.8007 Tj @@ -13085,169 +12412,133 @@ Q -250 TJm (in) 7.7509 Tj -250 TJm -(a) 4.42339 Tj -[1 0 0 1 177.195 232.582] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -177.195 -232.582] cm -[1 0 0 1 0 0] Tm -0 0 Td -177.195 232.582 Td -/F134_0 9.9626 Tf -(stdio) 29.8878 Tj -[1 0 0 1 207.083 232.582] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -207.083 -232.582] cm -[1 0 0 1 0 0] Tm -0 0 Td -207.083 232.582 Td -/F130_0 9.9626 Tf -(-free) 18.7994 Tj +(a) 4.4234 Tj -250 TJm -(en) 9.40469 Tj +(stdio-free) 38.1767 Tj +-250 TJm +(en) 9.4047 Tj 40 TJm (vironment) 40.9562 Tj -[1 0 0 1 278.335 232.582] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -283.316 -232.582] cm -[1 0 0 1 0 0] Tm -0 0 Td -291.775 232.582 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +282.092 232.582 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 232.582] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -232.582] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 232.582 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (28) 9.9626 Tj -[1 0 0 1 516.09 232.582] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -13264,35 +12555,28 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -220.627] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 220.627 Td -/F130_0 9.9626 Tf (3.7.1.) 22.4159 Tj -310 TJm (Getting) 29.8878 Tj -250 TJm (rid) 11.0684 Tj -250 TJm -(of) 8.29885 Tj -[1 0 0 1 154.231 220.627] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -154.231 -220.627] cm -[1 0 0 1 0 0] Tm -0 0 Td -154.231 220.627 Td -/F134_0 9.9626 Tf -(stdio) 29.8878 Tj -[1 0 0 1 184.119 220.627] cm +(of) 8.2988 Tj +-250 TJm +(stdio) 19.3773 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -13301,179 +12585,160 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +188.492 220.627 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -189.1 -220.627] cm -[1 0 0 1 0 0] Tm -0 0 Td -198.175 220.627 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 220.627] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -220.627] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 220.627 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (29) 9.9626 Tj -[1 0 0 1 516.09 220.627] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -13486,16 +12751,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -208.672] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 208.672 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 208.671 Td (3.7.2.) 22.4159 Tj -310 TJm (Critical) 29.8878 Tj @@ -13503,182 +12771,162 @@ Q (error) 19.3573 Tj -250 TJm (handling) 34.8691 Tj -[1 0 0 1 186.599 208.672] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -191.58 -208.672] cm -[1 0 0 1 0 0] Tm -0 0 Td -201.629 208.672 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +201.629 208.671 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 208.672] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -208.672] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 208.672 Td -/F130_0 9.9626 Tf +506.127 208.671 Td +/F122_0 9.9626 Tf (29) 9.9626 Tj -[1 0 0 1 516.09 208.672] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -13695,205 +12943,188 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -196.717] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 196.717 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 196.716 Td (3.8.) 14.9439 Tj -310 TJm (Making) 30.9936 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm -(W) 9.40469 Tj +(W) 9.4047 Tj 40 TJm (indo) 17.7135 Tj 25 TJm (ws) 11.0684 Tj -250 TJm (DLL) 19.3673 Tj -[1 0 0 1 189.828 196.717] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -194.809 -196.717] cm -[1 0 0 1 0 0] Tm -0 0 Td -203.243 196.717 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +203.243 196.716 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 196.717] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -196.717] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 196.717 Td -/F130_0 9.9626 Tf +506.127 196.716 Td +/F122_0 9.9626 Tf (29) 9.9626 Tj -[1 0 0 1 516.09 196.717] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1569] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -13910,221 +13141,204 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -184.761] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 184.761 Td -/F130_0 9.9626 Tf -(4.) 7.47195 Tj +(4.) 7.472 Tj -310 TJm (Miscellanea) 48.1393 Tj -[1 0 0 1 130.699 184.761] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -135.68 -184.761] cm -[1 0 0 1 0 0] Tm -0 0 Td 144.898 184.761 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 184.761] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -184.761] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 184.761 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (31) 9.9626 Tj -[1 0 0 1 516.09 184.761] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -14141,21 +13355,24 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8557] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -172.806] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 172.806 Td -/F130_0 9.9626 Tf (4.1.) 14.9439 Tj -310 TJm (Limitations) 45.9475 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm @@ -14164,152 +13381,132 @@ Q (\002le) 12.7322 Tj -250 TJm (format) 26.5603 Tj -[1 0 0 1 255.231 172.806] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -260.212 -172.806] cm -[1 0 0 1 0 0] Tm -0 0 Td 269.154 172.806 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 172.806] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -172.806] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 172.806 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (31) 9.9626 Tj -[1 0 0 1 516.09 172.806] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -14322,211 +13519,194 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -160.851] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 160.851 Td -/F130_0 9.9626 Tf (4.2.) 14.9439 Tj -310 TJm (Portability) 42.0721 Tj -250 TJm (issues) 23.8007 Tj -[1 0 0 1 158.395 160.851] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -163.376 -160.851] cm -[1 0 0 1 0 0] Tm -0 0 Td 172.03 160.851 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 160.851] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -160.851] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 160.851 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (32) 9.9626 Tj -[1 0 0 1 516.09 160.851] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1569] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -14539,16 +13719,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -148.896] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 148.896 Td -/F130_0 9.9626 Tf (4.3.) 14.9439 Tj -310 TJm (Reporting) 39.8504 Tj @@ -14556,198 +13739,178 @@ Q (b) 4.9813 Tj 20 TJm (ugs) 13.8381 Tj -[1 0 0 1 150.993 148.896] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -155.975 -148.896] cm -[1 0 0 1 0 0] Tm -0 0 Td 166.115 148.896 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 148.896] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -148.896] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 148.896 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (32) 9.9626 Tj -[1 0 0 1 516.09 148.896] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -14760,16 +13923,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -136.941] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 136.941 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 136.94 Td (4.4.) 14.9439 Tj -310 TJm (Did) 14.9439 Tj @@ -14783,170 +13949,150 @@ Q (right) 18.8194 Tj -250 TJm (package?) 37.0609 Tj -[1 0 0 1 212.602 136.941] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 3.0884 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 3.0884 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -218.778 -136.941] cm -[1 0 0 1 0 0] Tm -0 0 Td -229.109 136.941 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +229.109 136.94 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 136.941] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -136.941] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 136.941 Td -/F130_0 9.9626 Tf +506.127 136.94 Td +/F122_0 9.9626 Tf (33) 9.9626 Tj -[1 0 0 1 516.09 136.941] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -14959,202 +14105,194 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -124.986] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 124.986 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 124.985 Td (4.5.) 14.9439 Tj -310 TJm (Further) 29.3299 Tj -250 TJm (Reading) 33.2053 Tj -[1 0 0 1 155.058 124.986] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -160.039 -124.986] cm -[1 0 0 1 0 0] Tm -0 0 Td -170.361 124.986 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +170.361 124.985 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 124.986] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -124.986] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 124.986 Td -/F130_0 9.9626 Tf +506.127 124.985 Td +/F122_0 9.9626 Tf (34) 9.9626 Tj -[1 0 0 1 516.09 124.986] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15163,7 +14301,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -444.09 -2.1569] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15172,22 +14309,14 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -62.0143] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15212,7 +14341,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15221,12 +14349,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15235,18 +14357,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 41.3997 -6.7546] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -494.668 -50.8518] cm -[1 0 0 1 0 0] Tm -0 0 Td -536.068 50.8518 Td -/F130_0 9.9626 Tf -(iii) 8.30881 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15255,7 +14365,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +536.068 50.852 Td +(iii) 8.3088 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15264,12 +14387,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS @@ -15278,7 +14399,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 4 4 +%%Page: 1 4 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -15296,20 +14417,12 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15334,16 +14447,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15356,12 +14459,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 140.398 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -140.398 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15370,7 +14467,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15379,35 +14475,47 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -13.9477] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -468 -21.5542] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15428,17 +14536,15 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm [1 0 0 1 0 0] Tm 0 0 Td 72 701.916 Td -/F122_0 24.7902 Tf +/F116_0 24.7902 Tf (1.) 20.675 Tj -278 TJm (Intr) 39.937 Tj 20 TJm -(oduction) 104.664 Tj -[1 0 0 1 72 701.606] cm +(oduction) 104.6642 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15459,7 +14565,6 @@ Q [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15468,22 +14573,15 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -691.643] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 679.998 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 101.888 679.998] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -101.888 -679.998] cm -[1 0 0 1 0 0] Tm -0 0 Td 104.507 679.998 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (compresses) 45.9276 Tj -263 TJm (\002les) 16.6077 Tj @@ -15516,7 +14614,7 @@ Q 72 668.043 Td (Compression) 52.5826 Tj -203 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -204 TJm (generally) 37.0708 Tj -203 TJm @@ -15534,7 +14632,7 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(ed) 9.40469 Tj +(ed) 9.4047 Tj -203 TJm (by) 9.9626 Tj -204 TJm @@ -15558,27 +14656,25 @@ Q -250 TJm (performance) 50.341 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm (PPM) 19.9352 Tj -250 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (amily) 22.6948 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (statistical) 37.6387 Tj -250 TJm (compressors.) 52.2937 Tj -[1 0 0 1 72 653.931] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15587,23 +14683,16 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -643.968] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 634.17 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 101.888 634.17] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -101.888 -634.17] cm -[1 0 0 1 0 0] Tm -0 0 Td -105.073 634.17 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +105.074 634.17 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -320 TJm (b) 4.9813 Tj 20 TJm @@ -15613,31 +14702,23 @@ Q -320 TJm (top) 12.7322 Tj -320 TJm -(of) 8.29885 Tj -[1 0 0 1 176.712 634.17] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -176.712 -634.17] cm -[1 0 0 1 0 0] Tm -0 0 Td 176.712 634.17 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 224.533 634.17] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -224.533 -634.17] cm -[1 0 0 1 0 0] Tm -0 0 Td 224.533 634.17 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -337 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -320 TJm (\003e) 9.9626 Tj 15 TJm @@ -15656,27 +14737,19 @@ Q (in) 7.7509 Tj -320 TJm (the) 12.1743 Tj -[1 0 0 1 449.816 634.17] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -449.816 -634.17] cm -[1 0 0 1 0 0] Tm -0 0 Td 449.816 634.17 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 479.704 634.17] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -479.704 -634.17] cm -[1 0 0 1 0 0] Tm -0 0 Td 482.889 634.17 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (format.) 29.0509 Tj -1039 TJm (This) 17.7135 Tj @@ -15723,15 +14796,15 @@ Q -1017 TJm (Most) 20.4831 Tj -316 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -316 TJm (the) 12.1743 Tj -317 TJm (manual) 29.3299 Tj -316 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj 72 610.259 Td -(de) 9.40469 Tj +(de) 9.4047 Tj 25 TJm (v) 4.9813 Tj 20 TJm @@ -15743,7 +14816,7 @@ Q -250 TJm (library) 26.5603 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -250 TJm (not) 12.7322 Tj -250 TJm @@ -15753,21 +14826,21 @@ Q -250 TJm (which) 24.3486 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (good) 19.9252 Tj -250 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 25 TJm (ws) 11.0684 Tj -250 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -250 TJm (your) 18.2614 Tj -250 TJm (interest) 29.3299 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (only) 17.7135 Tj -250 TJm @@ -15776,38 +14849,32 @@ Q (the) 12.1743 Tj -250 TJm (program.) 36.2439 Tj -[1 0 0 1 72 608.102] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -29.7236] cm -/DeviceGray {} cs -[0] sc -/DeviceGray {} CS -[0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -578.379] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 578.379 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 578.379] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 578.379 Td +(\225) 3.4869 Tj /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15816,21 +14883,20 @@ Q [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -86.944 -578.379] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 578.379 Td -/F130_0 9.9626 Tf +-450 TJm (Ho) 12.1743 Tj 25 TJm (w) 7.193 Tj --259 TJm +-278 TJm (to) 7.7509 Tj --260 TJm +-278 TJm (use) 13.2801 Tj --259 TJm +-277 TJm (bzip2) 22.1369 Tj -[1 0 0 1 156.985 578.379] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15843,13 +14909,8 @@ Q [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -156.985 -578.379] cm -[1 0 0 1 0 0] Tm -0 0 Td -159.57 578.379 Td -/F130_0 9.9626 Tf +-278 TJm ([2]) 11.6164 Tj -[1 0 0 1 171.186 578.379] cm /DeviceRGB {} cs [0 0 1] sc /DeviceRGB {} CS @@ -15858,77 +14919,65 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -171.186 -578.379] cm -[1 0 0 1 0 0] Tm -0 0 Td -173.771 578.379 Td -/F130_0 9.9626 Tf +-278 TJm (describes) 37.0708 Tj --259 TJm +-278 TJm (ho) 9.9626 Tj 25 TJm (w) 7.193 Tj --260 TJm +-278 TJm (to) 7.7509 Tj --259 TJm +-278 TJm (use) 13.2801 Tj -[1 0 0 1 259.119 578.379] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -259.119 -578.379] cm -[1 0 0 1 0 0] Tm -0 0 Td -259.119 578.379 Td -/F134_0 9.9626 Tf +256.282 578.379 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 289.007 578.379] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -289.007 -578.379] cm -[1 0 0 1 0 0] Tm -0 0 Td -289.007 578.379 Td -/F130_0 9.9626 Tf +286.17 578.379 Td +/F122_0 9.9626 Tf (;) 2.7696 Tj --264 TJm +-292 TJm (this) 14.396 Tj --260 TJm -(is) 6.64505 Tj --259 TJm +-278 TJm +(is) 6.6451 Tj +-277 TJm (the) 12.1743 Tj --260 TJm +-278 TJm (only) 17.7135 Tj --259 TJm +-278 TJm (part) 15.4918 Tj --259 TJm +-278 TJm (you) 14.9439 Tj --260 TJm +-278 TJm (need) 18.8094 Tj --259 TJm +-278 TJm (to) 7.7509 Tj --260 TJm +-277 TJm (read) 17.1456 Tj --259 TJm -(if) 6.08715 Tj --260 TJm +-278 TJm +(if) 6.0871 Tj +-278 TJm (you) 14.9439 Tj --259 TJm +-278 TJm (just) 14.396 Tj --260 TJm +-278 TJm (w) 7.193 Tj 10 TJm (ant) 12.1743 Tj --259 TJm +-277 TJm (to) 7.7509 Tj --260 TJm +-278 TJm (kno) 14.9439 Tj 25 TJm (w) 7.193 Tj -86.944 566.424 Td +81.963 566.424 Td (ho) 9.9626 Tj 25 TJm (w) 7.193 Tj @@ -15940,38 +14989,32 @@ Q (the) 12.1743 Tj -250 TJm (program.) 36.2439 Tj -[1 0 0 1 199.302 566.424] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -127.302 -21.9178] cm -/DeviceGray {} cs -[0] sc -/DeviceGray {} CS -[0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -544.506] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 544.506 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 544.506] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 544.506 Td +(\225) 3.4869 Tj /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -15980,17 +15023,16 @@ Q [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -86.944 -544.506] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 544.506 Td -/F130_0 9.9626 Tf +-450 TJm (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -250 TJm (libbzip2) 32.6574 Tj -[1 0 0 1 197.09 544.506] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16003,13 +15045,8 @@ Q [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -197.09 -544.506] cm -[1 0 0 1 0 0] Tm -0 0 Td -199.58 544.506 Td -/F130_0 9.9626 Tf +-250 TJm ([8]) 11.6164 Tj -[1 0 0 1 211.197 544.506] cm /DeviceRGB {} cs [0 0 1] sc /DeviceRGB {} CS @@ -16018,11 +15055,7 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -211.197 -544.506] cm -[1 0 0 1 0 0] Tm -0 0 Td -213.687 544.506 Td -/F130_0 9.9626 Tf +-250 TJm (describes) 37.0708 Tj -250 TJm (the) 12.1743 Tj @@ -16038,38 +15071,32 @@ Q (detail,) 24.6275 Tj -250 TJm (and) 14.386 Tj -[1 0 0 1 417.501 544.506] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -345.501 -21.9178] cm -/DeviceGray {} cs -[0] sc -/DeviceGray {} CS -[0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -522.588] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 522.588 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 522.588] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 2.4907 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 522.588 Td +(\225) 3.4869 Tj /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.9925 0] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16078,13 +15105,12 @@ Q [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -86.944 -522.588] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 522.588 Td -/F130_0 9.9626 Tf +-450 TJm (Miscellanea) 48.1393 Tj -[1 0 0 1 135.083 522.588] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16097,13 +15123,8 @@ Q [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -135.083 -522.588] cm -[1 0 0 1 0 0] Tm -0 0 Td -137.573 522.588 Td -/F130_0 9.9626 Tf +-250 TJm ([31]) 16.5977 Tj -[1 0 0 1 154.171 522.588] cm /DeviceRGB {} cs [0 0 1] sc /DeviceRGB {} CS @@ -16112,11 +15133,7 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -154.171 -522.588] cm -[1 0 0 1 0 0] Tm -0 0 Td -156.662 522.588 Td -/F130_0 9.9626 Tf +-250 TJm (records) 29.3199 Tj -250 TJm (some) 21.031 Tj @@ -16127,7 +15144,7 @@ Q -250 TJm (which) 24.3486 Tj -250 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -250 TJm (thought) 30.4457 Tj -250 TJm @@ -16135,29 +15152,21 @@ Q -250 TJm (to) 7.7509 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (recorded) 34.8492 Tj -250 TJm (some) 21.031 Tj 25 TJm (where.) 26.8293 Tj -[1 0 0 1 492.31 522.588] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -420.31 -471.736] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16182,7 +15191,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16191,12 +15199,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16205,18 +15207,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 43.0633 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.332 -50.8518] cm -[1 0 0 1 0 0] Tm -0 0 Td -539.395 50.8518 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +539.395 50.852 Td (1) 4.9813 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16225,7 +15229,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16234,12 +15237,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS @@ -16248,7 +15249,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 5 5 +%%Page: 2 5 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -16266,20 +15267,12 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16304,16 +15297,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16326,12 +15309,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 140.398 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -140.398 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16340,7 +15317,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16349,35 +15325,47 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -13.9477] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -21.5542] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16398,11 +15386,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm [1 0 0 1 0 0] Tm 0 0 Td 72 701.916 Td -/F122_0 24.7902 Tf +/F116_0 24.7902 Tf (2.) 20.675 Tj -278 TJm (Ho) 33.0453 Tj @@ -16414,7 +15401,6 @@ Q (use) 42.7135 Tj -278 TJm (bzip2) 63.3638 Tj -[1 0 0 1 72 696.784] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16435,7 +15421,6 @@ Q [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16448,16 +15433,12 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -14.944] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -671.877] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 656.35 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (T) 10.5186 Tj 80 TJm (ab) 20.0904 Tj @@ -16467,7 +15448,6 @@ Q (of) 16.2513 Tj -278 TJm (Contents) 74.5943 Tj -[1 0 0 1 72 647.528] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16488,231 +15468,207 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.7401] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -635.788] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 635.788 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (2.1.) 14.9439 Tj -310 TJm (N) 7.193 Tj 35 TJm (AME) 22.1369 Tj -[1 0 0 1 119.014 635.788] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -123.995 -635.788] cm -[1 0 0 1 0 0] Tm -0 0 Td 132.691 635.788 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 635.788] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -635.788] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 635.788 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (2) 4.9813 Tj -[1 0 0 1 516.09 635.788] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16725,221 +15681,204 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8556] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -623.832] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 623.832 Td -/F130_0 9.9626 Tf (2.2.) 14.9439 Tj -310 TJm (SYNOPSIS) 47.0534 Tj -[1 0 0 1 137.085 623.832] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -142.067 -623.832] cm -[1 0 0 1 0 0] Tm -0 0 Td 150.582 623.832 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 623.832] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -623.832] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 623.832 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (2) 4.9813 Tj -[1 0 0 1 516.09 623.832] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0996] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -16952,213 +15891,196 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8556] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -611.877] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 611.877 Td -/F130_0 9.9626 Tf (2.3.) 14.9439 Tj -310 TJm (DESCRIPTION) 64.7569 Tj -[1 0 0 1 154.789 611.877] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -159.77 -611.877] cm -[1 0 0 1 0 0] Tm -0 0 Td 168.29 611.877 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 611.877] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -611.877] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 611.877 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (3) 4.9813 Tj -[1 0 0 1 516.09 611.877] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -17171,223 +16093,206 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8557] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -599.922] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 599.922 Td -/F130_0 9.9626 Tf (2.4.) 14.9439 Tj -310 TJm (OPTIONS) 42.0621 Tj -[1 0 0 1 132.094 599.922] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -137.076 -599.922] cm -[1 0 0 1 0 0] Tm -0 0 Td 145.873 599.922 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 599.922] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -599.922] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 599.922 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (4) 4.9813 Tj -[1 0 0 1 516.09 599.922] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -17400,16 +16305,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8556] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -587.967] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 587.967 Td -/F130_0 9.9626 Tf (2.5.) 14.9439 Tj -310 TJm (MEMOR) 37.6387 Tj @@ -17421,176 +16329,156 @@ Q (A) 7.193 Tj 40 TJm (GEMENT) 41.5042 Tj -[1 0 0 1 207.9 587.967] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -212.881 -587.967] cm -[1 0 0 1 0 0] Tm -0 0 Td 221.412 587.967 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 587.967] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -587.967] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 587.967 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (5) 4.9813 Tj -[1 0 0 1 516.09 587.967] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0996] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -17603,16 +16491,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8556] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -576.012] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 576.012 Td -/F130_0 9.9626 Tf (2.6.) 14.9439 Tj -310 TJm (RECO) 26.5703 Tj @@ -17623,7 +16514,7 @@ Q 40 TJm (A) 7.193 Tj 111 TJm -(T) 6.08715 Tj +(T) 6.0871 Tj 93 TJm (A) 7.193 Tj -250 TJm @@ -17638,136 +16529,116 @@ Q (GED) 20.4731 Tj -250 TJm (FILES) 26.5703 Tj -[1 0 0 1 293.449 576.012] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -298.43 -576.012] cm -[1 0 0 1 0 0] Tm -0 0 Td 308.464 576.012 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 576.012] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -576.012] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 576.012 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (6) 4.9813 Tj -[1 0 0 1 516.09 576.012] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -17780,16 +16651,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8557] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -564.056] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 564.056 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 564.057 Td (2.7.) 14.9439 Tj -310 TJm (PERFORMANCE) 73.6236 Tj @@ -17797,180 +16671,160 @@ Q (NO) 14.386 Tj 40 TJm (TES) 17.7135 Tj -[1 0 0 1 197.847 564.056] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -202.829 -564.056] cm -[1 0 0 1 0 0] Tm -0 0 Td -211.958 564.056 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +211.958 564.057 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 564.056] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -564.056] cm -[1 0 0 1 0 0] Tm -0 0 Td -511.108 564.056 Td -/F130_0 9.9626 Tf +511.108 564.057 Td +/F122_0 9.9626 Tf (6) 4.9813 Tj -[1 0 0 1 516.09 564.056] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -17983,16 +16837,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8556] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -552.101] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 552.101 Td -/F130_0 9.9626 Tf (2.8.) 14.9439 Tj -310 TJm (CA) 13.8381 Tj @@ -18000,208 +16857,188 @@ Q (VEA) 20.4731 Tj 111 TJm (TS) 11.6264 Tj -[1 0 0 1 133.519 552.101] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -138.5 -552.101] cm -[1 0 0 1 0 0] Tm -0 0 Td 148.799 552.101 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 552.101] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -552.101] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 552.101 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (7) 4.9813 Tj -[1 0 0 1 516.09 552.101] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0996] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -18214,216 +17051,208 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8556] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -540.146] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 540.146 Td -/F130_0 9.9626 Tf (2.9.) 14.9439 Tj -310 TJm (A) 7.193 Tj 55 TJm (UTHOR) 34.3112 Tj -[1 0 0 1 130.989 540.146] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -135.97 -540.146] cm -[1 0 0 1 0 0] Tm -0 0 Td 145.32 540.146 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 540.146] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -540.146] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 540.146 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (7) 4.9813 Tj -[1 0 0 1 516.09 540.146] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -18432,62 +17261,47 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -444.09 -0.2191] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -520.002] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 508.266 Td -/F130_0 9.9626 Tf (This) 17.7135 Tj -250 TJm (chapter) 29.3199 Tj -250 TJm (contains) 33.2053 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (cop) 14.386 Tj 10 TJm (y) 4.9813 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -[1 0 0 1 213.837 508.266] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -213.837 -508.266] cm -[1 0 0 1 0 0] Tm -0 0 Td 213.837 508.266 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 243.725 508.266] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -243.725 -508.266] cm -[1 0 0 1 0 0] Tm -0 0 Td 246.215 508.266 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (man) 17.1556 Tj -250 TJm (page,) 21.3 Tj @@ -18497,7 +17311,6 @@ Q (nothing) 30.4457 Tj -250 TJm (else.) 17.9825 Tj -[1 0 0 1 72 506.109] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS @@ -18522,7 +17335,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -18531,15 +17343,11 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -496.146] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 473.513 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (2.1.) 34.4584 Tj -278 TJm (NAME) 60.8186 Tj -[1 0 0 1 72 473.513] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -18564,33 +17372,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -31.8804] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 6.9739 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -78.9739 -441.632] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 441.632 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 441.632] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -18599,47 +17380,51 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -441.632] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 441.632 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 441.632 Td +/F122_0 9.9626 Tf +(\225) 3.4869 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +82.461 441.632 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 116.832 441.632] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -116.832 -441.632] cm -[1 0 0 1 0 0] Tm -0 0 Td -116.832 441.632 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 121.813 441.632] cm +112.349 441.632 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -121.813 -441.632] cm -[1 0 0 1 0 0] Tm -0 0 Td -121.813 441.632 Td -/F134_0 9.9626 Tf +117.33 441.632 Td +/F124_0 9.9626 Tf (bunzip2) 41.8429 Tj -[1 0 0 1 163.656 441.632] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -163.656 -441.632] cm -[1 0 0 1 0 0] Tm -0 0 Td -166.147 441.632 Td -/F130_0 9.9626 Tf -(-) 3.31755 Tj +161.664 441.632 Td +/F122_0 9.9626 Tf +(-) 3.3175 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (block-sorting) 53.1305 Tj -250 TJm @@ -18647,41 +17432,9 @@ Q -250 TJm (compressor) 45.9276 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -250 TJm -(v1.0.4) 24.9065 Tj -[1 0 0 1 325.129 441.632] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -253.129 -21.9179] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 6.9739 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -78.9739 -419.715] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 419.715 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 419.715] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm +(v1.0.6) 24.9065 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -18690,23 +17443,38 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -419.715] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 419.715 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 419.715 Td +(\225) 3.4869 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +82.461 419.715 Td +/F124_0 9.9626 Tf (bzcat) 29.8878 Tj -[1 0 0 1 116.832 419.715] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -116.832 -419.715] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.322 419.715 Td -/F130_0 9.9626 Tf -(-) 3.31755 Tj +114.839 419.715 Td +/F122_0 9.9626 Tf +(-) 3.3175 Tj -250 TJm (decompresses) 55.3323 Tj -250 TJm @@ -18715,38 +17483,6 @@ Q (to) 7.7509 Tj -250 TJm (stdout) 24.3586 Tj -[1 0 0 1 236.651 419.715] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -164.651 -21.9178] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 6.9739 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -78.9739 -397.797] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 397.797 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 397.797] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -18755,23 +17491,38 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -397.797] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 397.797 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 397.797 Td +(\225) 3.4869 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +82.461 397.797 Td +/F124_0 9.9626 Tf (bzip2recover) 71.7307 Tj -[1 0 0 1 158.675 397.797] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -158.675 -397.797] cm -[1 0 0 1 0 0] Tm -0 0 Td -161.166 397.797 Td -/F130_0 9.9626 Tf -(-) 3.31755 Tj +156.682 397.797 Td +/F122_0 9.9626 Tf +(-) 3.3175 Tj -250 TJm (reco) 17.1456 Tj 15 TJm @@ -18788,12 +17539,10 @@ Q (bzip2) 22.1369 Tj -250 TJm (\002les) 16.6077 Tj -[1 0 0 1 323.545 397.797] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -251.545 -12.1195] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS @@ -18818,7 +17567,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -18827,15 +17575,11 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -375.715] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 353.081 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (2.2.) 34.4584 Tj -278 TJm -(SYNOPSIS) 105.627 Tj -[1 0 0 1 72 352.823] cm +(SYNOPSIS) 105.6269 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -18860,33 +17604,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -31.6223] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 6.9739 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -78.9739 -321.201] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 321.201 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 321.201] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -18895,67 +17612,47 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -321.201] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 321.201 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 321.201 Td +/F122_0 9.9626 Tf +(\225) 3.4869 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +82.461 321.201 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 116.832 321.201] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -116.832 -321.201] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.322 321.201 Td -/F130_0 9.9626 Tf -([) 3.31755 Tj +114.839 321.201 Td +/F122_0 9.9626 Tf +([) 3.3175 Tj -250 TJm (-cdfkqstvzVL123456789) 100.164 Tj -250 TJm -(]) 3.31755 Tj +(]) 3.3175 Tj -250 TJm -([) 3.31755 Tj +([) 3.3175 Tj -250 TJm (\002lenames) 38.1866 Tj -250 TJm -(...) 7.47195 Tj +(...) 7.472 Tj -620 TJm -(]) 3.31755 Tj -[1 0 0 1 297.045 321.201] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -225.045 -21.9178] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 6.9739 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -78.9739 -299.283] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 299.283 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 299.283] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm +(]) 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -18964,67 +17661,50 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -299.283] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 299.283 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 299.283 Td +(\225) 3.4869 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +82.461 299.283 Td +/F124_0 9.9626 Tf (bunzip2) 41.8429 Tj -[1 0 0 1 128.787 299.283] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -128.787 -299.283] cm -[1 0 0 1 0 0] Tm -0 0 Td -131.278 299.283 Td -/F130_0 9.9626 Tf -([) 3.31755 Tj +126.795 299.283 Td +/F122_0 9.9626 Tf +([) 3.3175 Tj -250 TJm (-fkvsVL) 33.7533 Tj -250 TJm -(]) 3.31755 Tj +(]) 3.3175 Tj -250 TJm -([) 3.31755 Tj +([) 3.3175 Tj -250 TJm (\002lenames) 38.1866 Tj -250 TJm -(...) 7.47195 Tj +(...) 7.472 Tj -620 TJm -(]) 3.31755 Tj -[1 0 0 1 242.589 299.283] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -170.589 -21.9178] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 6.9739 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -78.9739 -277.365] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 277.365 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 277.365] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm +(]) 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19033,67 +17713,50 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -277.365] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 277.365 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 277.365 Td +(\225) 3.4869 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +82.461 277.365 Td +/F124_0 9.9626 Tf (bzcat) 29.8878 Tj -[1 0 0 1 116.832 277.365] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -116.832 -277.365] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.322 277.365 Td -/F130_0 9.9626 Tf -([) 3.31755 Tj +114.839 277.365 Td +/F122_0 9.9626 Tf +([) 3.3175 Tj -250 TJm (-s) 7.193 Tj -250 TJm -(]) 3.31755 Tj +(]) 3.3175 Tj -250 TJm -([) 3.31755 Tj +([) 3.3175 Tj -250 TJm (\002lenames) 38.1866 Tj -250 TJm -(...) 7.47195 Tj +(...) 7.472 Tj -620 TJm -(]) 3.31755 Tj -[1 0 0 1 204.074 277.365] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -132.074 -21.9178] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 6.9739 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -78.9739 -255.447] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 255.447 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 255.447] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm +(]) 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19102,39 +17765,46 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -255.447] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 255.447 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 255.447 Td +(\225) 3.4869 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +82.461 255.447 Td +/F124_0 9.9626 Tf (bzip2recover) 71.7307 Tj -[1 0 0 1 158.675 255.447] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -158.675 -255.447] cm -[1 0 0 1 0 0] Tm -0 0 Td -161.166 255.447 Td -/F130_0 9.9626 Tf +156.683 255.447 Td +/F122_0 9.9626 Tf (\002lename) 34.3112 Tj -[1 0 0 1 195.476 255.447] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -123.477 -204.596] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19159,7 +17829,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19168,12 +17837,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19182,18 +17845,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 43.0633 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.332 -50.8519] cm -[1 0 0 1 0 0] Tm -0 0 Td -539.395 50.8519 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +539.395 50.852 Td (2) 4.9813 Tj -[1 0 0 1 453.269 50.8519] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19202,7 +17867,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19211,12 +17875,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19225,7 +17887,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 6 6 +%%Page: 3 6 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -19243,20 +17905,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19281,7 +17939,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19290,12 +17947,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19304,16 +17955,22 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 105.519 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -371.59 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 477.109 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Ho) 12.1743 Tj 25 TJm (w) 7.193 Tj @@ -19323,7 +17980,6 @@ q (use) 13.2801 Tj -250 TJm (bzip2) 22.1369 Tj -[1 0 0 1 266.071 747.089] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19332,7 +17988,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19341,35 +17996,31 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -21.5542] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS @@ -19402,15 +18053,13 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm [1 0 0 1 0 0] Tm 0 0 Td 72 704.93 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (2.3.) 34.4584 Tj -278 TJm -(DESCRIPTION) 141.18 Tj -[1 0 0 1 72 704.672] cm +(DESCRIPTION) 141.1802 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19435,7 +18084,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19444,22 +18092,15 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -694.709] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 683.012 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 101.888 683.012] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -101.888 -683.012] cm -[1 0 0 1 0 0] Tm -0 0 Td 104.56 683.012 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (compresses) 45.9276 Tj -268 TJm (\002les) 16.6077 Tj @@ -19489,18 +18130,12 @@ Q (Huf) 15.4918 Tj 25 TJm (fman) 20.4731 Tj --269 TJm -(c) 4.42339 Tj -1 TJm -(od) 9.9626 Tj --1 TJm -(i) 2.7696 Tj -1 TJm -(ng.) 12.4533 Tj +-268 TJm +(coding.) 29.6088 Tj 72 671.057 Td (Compression) 52.5826 Tj -203 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -204 TJm (generally) 37.0708 Tj -203 TJm @@ -19518,7 +18153,7 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(ed) 9.40469 Tj +(ed) 9.4047 Tj -203 TJm (by) 9.9626 Tj -204 TJm @@ -19542,36 +18177,30 @@ Q -250 TJm (performance) 50.341 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm (PPM) 19.9352 Tj -250 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (amily) 22.6948 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (statistical) 37.6387 Tj -250 TJm (compressors.) 52.2937 Tj -[1 0 0 1 72 656.945] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -646.982] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 637.184 Td -/F130_0 9.9626 Tf (The) 15.4918 Tj -250 TJm (command-line) 57.5539 Tj @@ -19592,31 +18221,23 @@ Q -250 TJm (those) 21.031 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (GNU) 21.579 Tj -[1 0 0 1 364.869 637.184] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -364.869 -637.184] cm -[1 0 0 1 0 0] Tm -0 0 Td 364.869 637.184 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (gzip) 23.9102 Tj -[1 0 0 1 388.779 637.184] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -388.779 -637.184] cm -[1 0 0 1 0 0] Tm -0 0 Td 388.779 637.184 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -250 TJm (b) 4.9813 Tj 20 TJm @@ -19631,12 +18252,6 @@ Q (not) 12.7322 Tj -250 TJm (identical.) 36.8018 Tj -[1 0 0 1 72 635.027] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19645,31 +18260,28 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -625.064] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 615.266 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 101.888 615.266] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -101.888 -615.266] cm -[1 0 0 1 0 0] Tm -0 0 Td 105.175 615.266 Td -/F130_0 9.9626 Tf -(e) 4.42339 Tj +/F122_0 9.9626 Tf +(e) 4.4234 Tj 15 TJm (xpects) 25.4544 Tj -330 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -330 TJm (list) 12.1843 Tj -330 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -330 TJm (\002le) 12.7322 Tj -329 TJm @@ -19691,13 +18303,13 @@ Q -330 TJm (\002le) 12.7322 Tj -330 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -330 TJm (replaced) 33.7433 Tj -330 TJm (by) 9.9626 Tj -330 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -330 TJm (compressed) 47.0334 Tj 72 603.311 Td @@ -19705,7 +18317,7 @@ Q 15 TJm (ersion) 24.3486 Tj -349 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -348 TJm (itself,) 22.4159 Tj -373 TJm @@ -19714,28 +18326,20 @@ Q (the) 12.1743 Tj -349 TJm (name) 21.579 Tj -[1 0 0 1 204.444 603.311] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -204.444 -603.311] cm -[1 0 0 1 0 0] Tm -0 0 Td 204.444 603.311 Td -/F134_0 9.9626 Tf -(original_name.bz2) 101.619 Tj -[1 0 0 1 306.063 603.311] cm +/F124_0 9.9626 Tf +(original_name.bz2) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -306.063 -603.311] cm -[1 0 0 1 0 0] Tm -0 0 Td 306.063 603.311 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -1212 TJm (Each) 19.9152 Tj -348 TJm @@ -19765,7 +18369,7 @@ Q 25 TJm (wnership) 36.5229 Tj -325 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -325 TJm (the) 12.1743 Tj -326 TJm @@ -19773,7 +18377,7 @@ Q -325 TJm (original,) 33.4843 Tj -344 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -325 TJm (that) 14.9439 Tj -325 TJm @@ -19783,7 +18387,7 @@ Q -325 TJm (can) 13.8281 Tj -326 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -325 TJm (correctly) 35.4071 Tj 72 579.4 Td @@ -19801,13 +18405,13 @@ Q -308 TJm (handling) 34.8691 Tj -308 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -307 TJm (nai) 12.1743 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -308 TJm (in) 7.7509 Tj -308 TJm @@ -19819,7 +18423,7 @@ Q -308 TJm (there) 19.9152 Tj -307 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -308 TJm (no) 9.9626 Tj -308 TJm @@ -19841,7 +18445,7 @@ Q 25 TJm (wnerships) 40.3983 Tj -333 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -334 TJm (dates) 20.4731 Tj -334 TJm @@ -19857,13 +18461,13 @@ Q -334 TJm (concepts,) 37.3498 Tj -355 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -333 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -334 TJm (serious) 28.224 Tj -334 TJm @@ -19877,15 +18481,9 @@ Q -250 TJm (such) 18.2614 Tj -250 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -250 TJm (MS-DOS.) 40.1294 Tj -[1 0 0 1 72 553.333] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -19894,44 +18492,33 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -543.371] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 533.572 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 101.888 533.572] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -101.888 -533.572] cm -[1 0 0 1 0 0] Tm -0 0 Td 104.379 533.572 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 121.255 533.572] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -121.255 -533.572] cm -[1 0 0 1 0 0] Tm -0 0 Td 121.255 533.572 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bunzip2) 41.8429 Tj -[1 0 0 1 163.098 533.572] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -163.098 -533.572] cm -[1 0 0 1 0 0] Tm -0 0 Td 165.589 533.572 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -250 TJm (by) 9.9626 Tj @@ -19948,13 +18535,13 @@ Q 15 TJm (erwrite) 28.2141 Tj -250 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xisting) 27.1282 Tj -250 TJm (\002les.) 19.0983 Tj -620 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -250 TJm (you) 14.9439 Tj -250 TJm @@ -19971,44 +18558,30 @@ Q (specify) 28.772 Tj -250 TJm (the) 12.1743 Tj -[1 0 0 1 495.977 533.572] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -495.977 -533.572] cm -[1 0 0 1 0 0] Tm -0 0 Td 495.977 533.572 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-f) 11.9551 Tj -[1 0 0 1 507.932 533.572] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -507.932 -533.572] cm -[1 0 0 1 0 0] Tm -0 0 Td 510.423 533.572 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\003ag.) 17.4346 Tj -[1 0 0 1 72 531.415] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -521.453] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 511.654 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj +(If) 6.6351 Tj -284 TJm (no) 9.9626 Tj -285 TJm @@ -20019,27 +18592,19 @@ Q (are) 12.1643 Tj -284 TJm (speci\002ed,) 37.9077 Tj -[1 0 0 1 193.935 511.654] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -193.935 -511.654] cm -[1 0 0 1 0 0] Tm -0 0 Td 193.935 511.654 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 223.823 511.654] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -223.823 -511.654] cm -[1 0 0 1 0 0] Tm -0 0 Td 226.655 511.654 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (compresses) 45.9276 Tj -284 TJm (from) 19.3673 Tj @@ -20054,32 +18619,24 @@ Q -285 TJm (output.) 27.9551 Tj -825 TJm -(In) 8.29885 Tj +(In) 8.2988 Tj -285 TJm (this) 14.396 Tj -284 TJm (case,) 19.6363 Tj -[1 0 0 1 491.778 511.654] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -491.778 -511.654] cm -[1 0 0 1 0 0] Tm -0 0 Td 491.778 511.654 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 521.666 511.654] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -521.666 -511.654] cm -[1 0 0 1 0 0] Tm -0 0 Td 524.499 511.654 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj 72 499.699 Td (decline) 28.772 Tj @@ -20094,11 +18651,11 @@ Q -250 TJm (to) 7.7509 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (terminal,) 35.696 Tj -250 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -250 TJm (this) 14.396 Tj -250 TJm @@ -20106,7 +18663,7 @@ Q 10 TJm (ould) 17.7135 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (entirely) 30.4357 Tj -250 TJm @@ -20117,12 +18674,6 @@ Q (therefore) 35.955 Tj -250 TJm (pointless.) 37.9177 Tj -[1 0 0 1 72 497.542] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -20131,47 +18682,36 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -487.58] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 477.781 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bunzip2) 41.8429 Tj -[1 0 0 1 113.843 477.781] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -113.843 -477.781] cm -[1 0 0 1 0 0] Tm -0 0 Td 116.176 477.781 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\(or) 11.6164 Tj -[1 0 0 1 130.125 477.781] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -130.125 -477.781] cm -[1 0 0 1 0 0] Tm -0 0 Td 130.125 477.781 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -600 TJm (-d) 11.9551 Tj -[1 0 0 1 177.946 477.781] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -177.946 -477.781] cm -[1 0 0 1 0 0] Tm -0 0 Td 177.946 477.781 Td -/F130_0 9.9626 Tf -(\)) 3.31755 Tj +/F122_0 9.9626 Tf +(\)) 3.3175 Tj -234 TJm (decompresses) 55.3323 Tj -234 TJm @@ -20192,30 +18732,22 @@ Q (created) 28.762 Tj -234 TJm (by) 9.9626 Tj -[1 0 0 1 445.012 477.781] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -445.012 -477.781] cm -[1 0 0 1 0 0] Tm -0 0 Td 445.012 477.781 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 474.9 477.781] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -474.9 -477.781] cm -[1 0 0 1 0 0] Tm -0 0 Td 477.233 477.781 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -234 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -234 TJm (detected) 33.1954 Tj 72 465.826 Td @@ -20227,34 +18759,26 @@ Q -287 TJm (and) 14.386 Tj -280 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -279 TJm (w) 7.193 Tj 10 TJm (arning) 25.4544 Tj -280 TJm (issued.) 27.3972 Tj -[1 0 0 1 216.033 465.826] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -216.033 -465.826] cm -[1 0 0 1 0 0] Tm -0 0 Td 216.033 465.826 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 245.921 465.826] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -245.921 -465.826] cm -[1 0 0 1 0 0] Tm -0 0 Td 248.705 465.826 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (attempts) 33.7633 Tj -279 TJm (to) 7.7509 Tj @@ -20277,7 +18801,7 @@ Q -280 TJm (that) 14.9439 Tj -279 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -280 TJm (the) 12.1743 Tj 72 453.871 Td @@ -20285,43 +18809,11 @@ Q -250 TJm (\002le) 12.7322 Tj -250 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -250 TJm (follo) 18.8194 Tj 25 TJm (ws:) 13.8381 Tj -[1 0 0 1 72 451.714] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -29.7236] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 6.9739 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -78.9739 -421.991] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 421.991 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 421.991] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -20330,35 +18822,45 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -421.991] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 421.991 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 421.991 Td +(\225) 3.4869 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +82.461 421.991 Td +/F124_0 9.9626 Tf (filename.bz2) 71.7307 Tj -[1 0 0 1 164.653 421.991] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -164.653 -421.991] cm -[1 0 0 1 0 0] Tm -0 0 Td -167.143 421.991 Td -/F130_0 9.9626 Tf +162.66 421.991 Td +/F122_0 9.9626 Tf (becomes) 34.8591 Tj -[1 0 0 1 204.493 421.991] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -204.493 -421.991] cm -[1 0 0 1 0 0] Tm -0 0 Td -204.493 421.991 Td -/F134_0 9.9626 Tf +200.01 421.991 Td +/F124_0 9.9626 Tf (filename) 47.8205 Tj -[1 0 0 1 252.313 421.991] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -20367,33 +18869,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -180.313 -21.9178] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 6.9739 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -78.9739 -400.073] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 400.073 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 400.073] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -20402,35 +18877,42 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -400.073] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 400.073 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 400.073 Td +/F122_0 9.9626 Tf +(\225) 3.4869 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +82.461 400.073 Td +/F124_0 9.9626 Tf (filename.bz) 65.7532 Tj -[1 0 0 1 158.675 400.073] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -158.675 -400.073] cm -[1 0 0 1 0 0] Tm -0 0 Td -161.166 400.073 Td -/F130_0 9.9626 Tf +156.682 400.073 Td +/F122_0 9.9626 Tf (becomes) 34.8591 Tj -[1 0 0 1 198.515 400.073] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -198.515 -400.073] cm -[1 0 0 1 0 0] Tm -0 0 Td -198.515 400.073 Td -/F134_0 9.9626 Tf +194.032 400.073 Td +/F124_0 9.9626 Tf (filename) 47.8205 Tj -[1 0 0 1 246.336 400.073] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -20439,33 +18921,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -174.336 -21.9178] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 6.9739 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -78.9739 -378.155] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 378.155 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 378.155] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -20474,35 +18929,42 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -378.155] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 378.155 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 378.155 Td +/F122_0 9.9626 Tf +(\225) 3.4869 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +82.461 378.155 Td +/F124_0 9.9626 Tf (filename.tbz2) 77.7083 Tj -[1 0 0 1 164.653 378.155] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -164.653 -378.155] cm -[1 0 0 1 0 0] Tm -0 0 Td -167.143 378.155 Td -/F130_0 9.9626 Tf +162.66 378.155 Td +/F122_0 9.9626 Tf (becomes) 34.8591 Tj -[1 0 0 1 204.493 378.155] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -204.493 -378.155] cm -[1 0 0 1 0 0] Tm -0 0 Td -204.493 378.155 Td -/F134_0 9.9626 Tf +200.01 378.155 Td +/F124_0 9.9626 Tf (filename.tar) 71.7307 Tj -[1 0 0 1 276.224 378.155] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -20511,33 +18973,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -204.224 -21.9178] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 6.9739 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -78.9739 -356.237] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 356.237 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 356.237] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -20546,35 +18981,42 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -356.237] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 356.237 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 356.237 Td +/F122_0 9.9626 Tf +(\225) 3.4869 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +82.461 356.237 Td +/F124_0 9.9626 Tf (filename.tbz) 71.7307 Tj -[1 0 0 1 164.653 356.237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -164.653 -356.237] cm -[1 0 0 1 0 0] Tm -0 0 Td -167.143 356.237 Td -/F130_0 9.9626 Tf +162.66 356.237 Td +/F122_0 9.9626 Tf (becomes) 34.8591 Tj -[1 0 0 1 204.493 356.237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -204.493 -356.237] cm -[1 0 0 1 0 0] Tm -0 0 Td -204.493 356.237 Td -/F134_0 9.9626 Tf +200.01 356.237 Td +/F124_0 9.9626 Tf (filename.tar) 71.7307 Tj -[1 0 0 1 276.224 356.237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -20583,33 +19025,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -204.224 -21.9178] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 6.9739 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -78.9739 -334.319] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 334.319 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 334.319] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -20618,35 +19033,42 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -334.319] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 334.319 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 334.319 Td +/F122_0 9.9626 Tf +(\225) 3.4869 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +82.461 334.319 Td +/F124_0 9.9626 Tf (anyothername) 71.7307 Tj -[1 0 0 1 164.653 334.319] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -164.653 -334.319] cm -[1 0 0 1 0 0] Tm -0 0 Td -167.143 334.319 Td -/F130_0 9.9626 Tf +162.66 334.319 Td +/F122_0 9.9626 Tf (becomes) 34.8591 Tj -[1 0 0 1 204.493 334.319] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -204.493 -334.319] cm -[1 0 0 1 0 0] Tm -0 0 Td -204.493 334.319 Td -/F134_0 9.9626 Tf +200.01 334.319 Td +/F124_0 9.9626 Tf (anyothername.out) 95.641 Tj -[1 0 0 1 300.134 334.319] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -20655,17 +19077,13 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -228.134 -11.4968] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -322.823] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 312.402 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj +/F122_0 9.9626 Tf +(If) 6.6351 Tj -342 TJm (the) 12.1743 Tj -342 TJm @@ -20673,135 +19091,97 @@ Q -342 TJm (does) 18.2614 Tj -342 TJm -(not) 12.7322 Tj --343 TJm +(n) 4.9813 Tj +-1 TJm +(ot) 7.7509 Tj +-342 TJm (end) 14.386 Tj -342 TJm (in) 7.7509 Tj -342 TJm (one) 14.386 Tj -342 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -342 TJm (the) 12.1743 Tj -342 TJm (recognised) 43.158 Tj -342 TJm (endings,) 33.4843 Tj -[1 0 0 1 309.305 312.402] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -309.305 -312.402] cm -[1 0 0 1 0 0] Tm -0 0 Td 309.305 312.402 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (.bz2) 23.9102 Tj -[1 0 0 1 333.215 312.402] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -333.215 -312.402] cm -[1 0 0 1 0 0] Tm -0 0 Td 333.215 312.402 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 339.344 312.402] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -339.344 -312.402] cm -[1 0 0 1 0 0] Tm -0 0 Td 339.344 312.402 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (.bz) 17.9327 Tj -[1 0 0 1 357.276 312.402] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -357.276 -312.402] cm -[1 0 0 1 0 0] Tm -0 0 Td 357.276 312.402 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 363.405 312.402] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -363.405 -312.402] cm -[1 0 0 1 0 0] Tm -0 0 Td 363.405 312.402 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (.tbz2) 29.8878 Tj -[1 0 0 1 393.293 312.402] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -393.293 -312.402] cm -[1 0 0 1 0 0] Tm -0 0 Td -396.701 312.402 Td -/F130_0 9.9626 Tf -(or) 8.29885 Tj -[1 0 0 1 408.409 312.402] cm +396.702 312.402 Td +/F122_0 9.9626 Tf +(or) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -408.409 -312.402] cm -[1 0 0 1 0 0] Tm -0 0 Td 408.409 312.402 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (.tbz) 23.9102 Tj -[1 0 0 1 432.319 312.402] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -432.319 -312.402] cm -[1 0 0 1 0 0] Tm -0 0 Td 432.319 312.402 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 438.448 312.402] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -438.448 -312.402] cm -[1 0 0 1 0 0] Tm -0 0 Td 438.448 312.402 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 468.336 312.402] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468.336 -312.402] cm -[1 0 0 1 0 0] Tm -0 0 Td 471.744 312.402 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (complains) 40.9562 Tj -342 TJm (that) 14.9439 Tj -342 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj 72 300.446 Td (cannot) 26.5603 Tj -250 TJm @@ -20811,7 +19191,7 @@ Q -250 TJm (name) 21.579 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm @@ -20830,43 +19210,29 @@ Q (name) 21.579 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 370.009 300.446] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -370.009 -300.446] cm -[1 0 0 1 0 0] Tm -0 0 Td 370.009 300.446 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (.out) 23.9102 Tj -[1 0 0 1 393.92 300.446] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -393.92 -300.446] cm -[1 0 0 1 0 0] Tm -0 0 Td 396.41 300.446 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (appended.) 40.6673 Tj -[1 0 0 1 72 298.29] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -288.327] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 278.529 Td -/F130_0 9.9626 Tf (As) 11.0684 Tj -250 TJm (with) 17.7135 Tj @@ -20894,12 +19260,6 @@ Q (standard) 33.7533 Tj -250 TJm (output.) 27.9551 Tj -[1 0 0 1 72 276.372] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -20908,47 +19268,44 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -266.409] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 256.611 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bunzip2) 41.8429 Tj -[1 0 0 1 113.843 256.611] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -113.843 -256.611] cm -[1 0 0 1 0 0] Tm -0 0 Td 116.409 256.611 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -257 TJm (correctly) 35.4071 Tj -258 TJm (decompress) 47.0334 Tj -257 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -258 TJm (\002le) 12.7322 Tj -257 TJm (which) 24.3486 Tj -258 TJm -(is) 6.64505 Tj --258 TJm +(is) 6.6451 Tj +-257 TJm (the) 12.1743 Tj --257 TJm -(concatenation) 55.3323 Tj -258 TJm -(of) 8.29885 Tj +(concatenation) 55.3323 Tj -257 TJm +(of) 8.2988 Tj +-258 TJm (tw) 9.9626 Tj 10 TJm (o) 4.9813 Tj -258 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -257 TJm (more) 20.4731 Tj -258 TJm @@ -20960,13 +19317,13 @@ Q -258 TJm (result) 22.1369 Tj -257 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj 72 244.656 Td (the) 12.1743 Tj -239 TJm (concatenation) 55.3323 Tj -238 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -239 TJm (the) 12.1743 Tj -239 TJm @@ -20982,31 +19339,23 @@ Q -238 TJm (testing) 26.5703 Tj -239 TJm -(\() 3.31755 Tj -[1 0 0 1 382.247 244.656] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -382.247 -244.656] cm -[1 0 0 1 0 0] Tm -0 0 Td 382.247 244.656 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-t) 11.9551 Tj -[1 0 0 1 394.202 244.656] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -394.202 -244.656] cm -[1 0 0 1 0 0] Tm -0 0 Td 394.202 244.656 Td -/F130_0 9.9626 Tf -(\)) 3.31755 Tj +/F122_0 9.9626 Tf +(\)) 3.3175 Tj -239 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -238 TJm (concatenated) 52.0048 Tj -239 TJm @@ -21014,26 +19363,20 @@ Q -239 TJm (\002les) 16.6077 Tj -239 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj 72 232.7 Td (also) 16.0497 Tj -250 TJm (supported.) 41.7831 Tj -[1 0 0 1 72 230.544] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -220.581] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 210.783 Td -/F130_0 9.9626 Tf (Y) 7.193 Tj 110 TJm (ou) 9.9626 Tj @@ -21044,7 +19387,7 @@ Q -399 TJm (compress) 37.6287 Tj -400 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -399 TJm (decompress) 47.0334 Tj -399 TJm @@ -21065,39 +19408,31 @@ Q (ving) 17.7135 Tj -399 TJm (the) 12.1743 Tj -[1 0 0 1 409.67 210.783] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -409.67 -210.783] cm -[1 0 0 1 0 0] Tm -0 0 Td 409.67 210.783 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-c) 11.9551 Tj -[1 0 0 1 421.625 210.783] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -421.625 -210.783] cm -[1 0 0 1 0 0] Tm -0 0 Td 425.602 210.783 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\003ag.) 17.4346 Tj -757 TJm (Multiple) 34.3212 Tj -400 TJm -(\002l) 8.30881 Tj +(\002l) 8.3088 Tj 1 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -400 TJm (may) 17.1556 Tj -399 TJm -(be) 9.40469 Tj -72 198.828 Td +(be) 9.4047 Tj +72 198.827 Td (compressed) 47.0334 Tj -367 TJm (and) 14.386 Tj @@ -21106,7 +19441,7 @@ Q -367 TJm (lik) 10.5205 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -367 TJm (this.) 16.8866 Tj -1321 TJm @@ -21128,7 +19463,7 @@ Q -1322 TJm (Compression) 52.5826 Tj -367 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj 72 186.872 Td (multiple) 33.2153 Tj -289 TJm @@ -21142,7 +19477,7 @@ Q -288 TJm (generates) 37.6188 Tj -289 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -289 TJm (stream) 26.5603 Tj -289 TJm @@ -21158,13 +19493,13 @@ Q -853 TJm (Such) 19.9252 Tj -289 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -289 TJm (stream) 26.5603 Tj 72 174.917 Td (can) 13.8281 Tj -391 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -391 TJm (decompressed) 56.4381 Tj -390 TJm @@ -21173,40 +19508,30 @@ Q (only) 17.7135 Tj -391 TJm (by) 9.9626 Tj -[1 0 0 1 238.116 174.917] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -238.116 -174.917] cm -[1 0 0 1 0 0] Tm -0 0 Td 238.116 174.917 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 268.004 174.917] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -268.004 -174.917] cm -[1 0 0 1 0 0] Tm -0 0 Td -271.897 174.917 Td -/F130_0 9.9626 Tf +271.898 174.917 Td +/F122_0 9.9626 Tf (v) 4.9813 Tj 15 TJm (ersion) 24.3486 Tj -391 TJm (0.9.0) 19.9252 Tj -391 TJm -(or) 8.29885 Tj --391 TJm -(l) 2.7696 Tj -1 TJm -(ater) 14.9339 Tj +(or) 8.2988 Tj +-390 TJm +(later) 17.7035 Tj 55 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -733 TJm (Earlier) 27.1082 Tj -391 TJm @@ -21214,28 +19539,20 @@ Q 15 TJm (ersions) 28.224 Tj -391 TJm -(of) 8.29885 Tj -[1 0 0 1 448.071 174.917] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -448.071 -174.917] cm -[1 0 0 1 0 0] Tm -0 0 Td 448.071 174.917 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 477.958 174.917] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -477.958 -174.917] cm -[1 0 0 1 0 0] Tm -0 0 Td 481.852 174.917 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -391 TJm (stop) 16.6077 Tj @@ -21255,12 +19572,6 @@ Q (the) 12.1743 Tj -250 TJm (stream.) 29.0509 Tj -[1 0 0 1 72 160.805] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -21269,47 +19580,36 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -150.843] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 141.044 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzcat) 29.8878 Tj -[1 0 0 1 101.888 141.044] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -101.888 -141.044] cm -[1 0 0 1 0 0] Tm -0 0 Td 104.379 141.044 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\(or) 11.6164 Tj -[1 0 0 1 118.486 141.044] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -118.486 -141.044] cm -[1 0 0 1 0 0] Tm -0 0 Td 118.486 141.044 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -600 TJm (-dc) 17.9327 Tj -[1 0 0 1 172.284 141.044] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -172.284 -141.044] cm -[1 0 0 1 0 0] Tm -0 0 Td 172.284 141.044 Td -/F130_0 9.9626 Tf -(\)) 3.31755 Tj +/F122_0 9.9626 Tf +(\)) 3.3175 Tj -250 TJm (decompresses) 55.3323 Tj -250 TJm @@ -21326,12 +19626,6 @@ Q (standard) 33.7533 Tj -250 TJm (output.) 27.9551 Tj -[1 0 0 1 72 138.887] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -21340,27 +19634,24 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -128.925] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 119.126 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 101.888 119.126] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -101.888 -119.126] cm -[1 0 0 1 0 0] Tm -0 0 Td 104.866 119.126 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -299 TJm (read) 17.1456 Tj -299 TJm -(ar) 7.74094 Tj +(ar) 7.7409 Tj 18 TJm (guments) 33.7633 Tj -299 TJm @@ -21368,57 +19659,41 @@ Q -299 TJm (the) 12.1743 Tj -299 TJm -(en) 9.40469 Tj +(en) 9.4047 Tj 40 TJm (vironment) 40.9562 Tj -298 TJm (v) 4.9813 Tj 25 TJm (ariables) 30.9837 Tj -[1 0 0 1 316.903 119.126] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -316.903 -119.126] cm -[1 0 0 1 0 0] Tm -0 0 Td 316.903 119.126 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZIP2) 29.8878 Tj -[1 0 0 1 346.791 119.126] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -346.791 -119.126] cm -[1 0 0 1 0 0] Tm -0 0 Td 349.769 119.126 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 367.133 119.126] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -367.133 -119.126] cm -[1 0 0 1 0 0] Tm -0 0 Td 367.133 119.126 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZIP) 23.9102 Tj -[1 0 0 1 391.043 119.126] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -391.043 -119.126] cm -[1 0 0 1 0 0] Tm -0 0 Td 391.043 119.126 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -299 TJm (in) 7.7509 Tj -299 TJm @@ -21426,7 +19701,7 @@ Q -299 TJm (order) 21.0211 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -311 TJm (and) 14.386 Tj -299 TJm @@ -21438,11 +19713,11 @@ Q 72 107.171 Td (before) 25.4445 Tj -250 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -250 TJm -(ar) 7.74094 Tj +(ar) 7.7409 Tj 18 TJm (guments) 33.7633 Tj -250 TJm @@ -21462,9 +19737,9 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (con) 14.386 Tj 40 TJm @@ -21474,7 +19749,7 @@ Q -250 TJm (w) 7.193 Tj 10 TJm -(ay) 9.40469 Tj +(ay) 9.4047 Tj -250 TJm (to) 7.7509 Tj -250 TJm @@ -21484,27 +19759,21 @@ Q 10 TJm (ault) 14.9439 Tj -250 TJm -(ar) 7.74094 Tj +(ar) 7.7409 Tj 18 TJm (guments.) 36.2539 Tj -[1 0 0 1 72 105.014] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -95.0517] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 85.2534 Td -/F130_0 9.9626 Tf +72 85.253 Td (Compression) 52.5826 Tj -294 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -294 TJm (al) 7.193 Tj 10 TJm @@ -21514,13 +19783,13 @@ Q -294 TJm (performed,) 43.9849 Tj -305 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(en) 9.40469 Tj +(en) 9.4047 Tj -294 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -294 TJm (the) 12.1743 Tj -294 TJm @@ -21528,7 +19797,7 @@ Q -294 TJm (\002le) 12.7322 Tj -293 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -294 TJm (slightly) 29.8978 Tj -294 TJm @@ -21544,12 +19813,12 @@ Q -884 TJm (Files) 19.3773 Tj -294 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -294 TJm (less) 14.9439 Tj -294 TJm (than) 17.1556 Tj -72 73.2982 Td +72 73.298 Td (about) 22.1369 Tj -246 TJm (one) 14.386 Tj @@ -21566,11 +19835,11 @@ Q -246 TJm (l) 2.7696 Tj 1 TJm -(ar) 7.74094 Tj +(ar) 7.7409 Tj 18 TJm (ger) 12.7222 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -247 TJm (since) 20.4731 Tj -246 TJm @@ -21582,7 +19851,7 @@ Q -246 TJm (has) 13.2801 Tj -246 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -246 TJm (constant) 33.2053 Tj -246 TJm @@ -21596,22 +19865,15 @@ Q -246 TJm (the) 12.1743 Tj -246 TJm -(re) 7.74094 Tj +(re) 7.7409 Tj 15 TJm (gion) 17.7135 Tj -246 TJm -(of) 8.29885 Tj -[1 0 0 1 72 50.8518] cm +(of) 8.2988 Tj /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -21636,7 +19898,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -21645,12 +19906,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -21659,18 +19914,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 43.0633 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.332 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -539.395 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +539.395 50.951 Td (3) 4.9813 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -21679,7 +19936,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -21688,12 +19944,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -21702,7 +19956,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 7 7 +%%Page: 4 7 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -21720,20 +19974,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -21758,7 +20008,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -21767,12 +20016,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -21781,16 +20024,22 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 105.519 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -371.59 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 477.109 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Ho) 12.1743 Tj 25 TJm (w) 7.193 Tj @@ -21800,7 +20049,6 @@ q (use) 13.2801 Tj -250 TJm (bzip2) 22.1369 Tj -[1 0 0 1 266.071 747.089] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -21809,7 +20057,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -21818,39 +20065,35 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -741.554] cm [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (50) 9.9626 Tj -264 TJm (bytes.) 23.5217 Tj @@ -21859,7 +20102,7 @@ Q -264 TJm (dat) 12.1743 Tj 1 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -264 TJm (\(including) 40.9562 Tj -264 TJm @@ -21867,7 +20110,7 @@ Q -264 TJm (output) 25.4644 Tj -263 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -264 TJm (most) 19.3773 Tj -264 TJm @@ -21875,7 +20118,7 @@ Q -263 TJm (compressors\)) 53.1206 Tj -264 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -264 TJm (coded) 23.7907 Tj -263 TJm @@ -21895,35 +20138,29 @@ Q 25 TJm (ving) 17.7135 Tj -264 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 72 698.082 Td -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xpansion) 35.9749 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (around) 27.6661 Tj -250 TJm (0.5%.) 23.2427 Tj -[1 0 0 1 72 695.925] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.8441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -686.081] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 676.283 Td -/F130_0 9.9626 Tf (As) 11.0684 Tj -268 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -268 TJm (self-check) 40.9363 Tj -269 TJm @@ -21932,27 +20169,19 @@ Q (your) 18.2614 Tj -268 TJm (protection,) 42.889 Tj -[1 0 0 1 217.273 676.283] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -217.273 -676.283] cm -[1 0 0 1 0 0] Tm -0 0 Td 217.273 676.283 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 247.161 676.283] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -247.161 -676.283] cm -[1 0 0 1 0 0] Tm -0 0 Td 249.833 676.283 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (uses) 17.1556 Tj -268 TJm (32-bit) 23.8007 Tj @@ -21963,7 +20192,7 @@ Q -268 TJm (mak) 17.1556 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -268 TJm (sure) 16.5977 Tj -268 TJm @@ -21977,13 +20206,13 @@ Q 15 TJm (ersion) 24.3486 Tj -268 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -268 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -268 TJm (\002le) 12.7322 Tj -269 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj 72 664.328 Td (identical) 34.3112 Tj -200 TJm @@ -21997,13 +20226,13 @@ Q -200 TJm (guards) 26.5603 Tj -199 TJm -(ag) 9.40469 Tj +(ag) 9.4047 Tj 5 TJm (ainst) 18.8194 Tj -200 TJm (corruption) 41.5042 Tj -199 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -200 TJm (the) 12.1743 Tj -200 TJm @@ -22013,7 +20242,7 @@ Q -210 TJm (and) 14.386 Tj -199 TJm -(ag) 9.40469 Tj +(ag) 9.4047 Tj 5 TJm (ainst) 18.8194 Tj -200 TJm @@ -22024,27 +20253,19 @@ Q (ugs) 13.8381 Tj -199 TJm (in) 7.7509 Tj -[1 0 0 1 510.112 664.328] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -510.112 -664.328] cm -[1 0 0 1 0 0] Tm -0 0 Td 510.112 664.328 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 540 664.328] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -664.328] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 652.373 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\(hopefully) 41.5042 Tj -275 TJm (v) 4.9813 Tj @@ -22059,7 +20280,7 @@ Q -275 TJm (chances) 31.5316 Tj -275 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -275 TJm (data) 16.5977 Tj -274 TJm @@ -22069,7 +20290,7 @@ Q -275 TJm (undetected) 43.158 Tj -274 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -275 TJm (microscopic,) 51.1878 Tj -281 TJm @@ -22095,7 +20316,7 @@ Q -795 TJm (Be) 11.0684 Tj -279 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 15 TJm (w) 7.193 Tj 10 TJm @@ -22115,9 +20336,9 @@ Q -279 TJm (decompression,) 62.2563 Tj -287 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -279 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -279 TJm (can) 13.8281 Tj -279 TJm @@ -22131,11 +20352,11 @@ Q -237 TJm (something) 41.5142 Tj -236 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -237 TJm (wrong.) 27.9451 Tj -611 TJm -(It) 6.08715 Tj +(It) 6.0871 Tj -237 TJm (can') 17.1456 Tj 18 TJm @@ -22149,7 +20370,7 @@ Q 15 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj -237 TJm (the) 12.1743 Tj -237 TJm @@ -22166,27 +20387,19 @@ Q (can) 13.8281 Tj -237 TJm (use) 13.2801 Tj -[1 0 0 1 458.159 628.462] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -458.159 -628.462] cm -[1 0 0 1 0 0] Tm -0 0 Td 458.159 628.462 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2recover) 71.7307 Tj -[1 0 0 1 529.89 628.462] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -529.89 -628.462] cm -[1 0 0 1 0 0] Tm -0 0 Td 532.249 628.462 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj 72 616.507 Td (try) 11.0684 Tj @@ -22197,7 +20410,7 @@ Q 15 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj -250 TJm (data) 16.5977 Tj -250 TJm @@ -22206,21 +20419,15 @@ Q (damaged) 35.965 Tj -250 TJm (\002les.) 19.0983 Tj -[1 0 0 1 72 614.35] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.8441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -604.506] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 594.708 Td -/F130_0 9.9626 Tf (Return) 27.1182 Tj -298 TJm (v) 4.9813 Tj @@ -22231,11 +20438,11 @@ Q -298 TJm (for) 11.6164 Tj -298 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -298 TJm (normal) 28.224 Tj -298 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xit,) 13.0112 Tj -310 TJm @@ -22243,7 +20450,7 @@ Q -298 TJm (for) 11.6164 Tj -297 TJm -(en) 9.40469 Tj +(en) 9.4047 Tj 40 TJm (vironmental) 48.1492 Tj -298 TJm @@ -22275,7 +20482,7 @@ Q 72 582.753 Td (indicate) 31.5416 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (corrupt) 28.772 Tj -250 TJm @@ -22287,7 +20494,7 @@ Q -250 TJm (for) 11.6164 Tj -250 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -250 TJm (internal) 30.4357 Tj -250 TJm @@ -22297,9 +20504,9 @@ Q -250 TJm (error) 19.3573 Tj -250 TJm -(\(e) 7.74094 Tj +(\(e) 7.7409 Tj 15 TJm -(g,) 7.47195 Tj +(g,) 7.472 Tj -250 TJm (b) 4.9813 Tj 20 TJm @@ -22308,31 +20515,22 @@ Q (which) 24.3486 Tj -250 TJm (caused) 27.1082 Tj -[1 0 0 1 443.065 582.753] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -443.065 -582.753] cm -[1 0 0 1 0 0] Tm -0 0 Td 443.065 582.753 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 472.953 582.753] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.953 -582.753] cm -[1 0 0 1 0 0] Tm -0 0 Td 475.444 582.753 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj -250 TJm (panic.) 24.0696 Tj -[1 0 0 1 72 580.596] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -22361,7 +20559,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.8441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -22370,15 +20567,11 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -570.752] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 548.118 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (2.4.) 34.4584 Tj -278 TJm (OPTIONS) 92.9839 Tj -[1 0 0 1 72 547.86] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -22403,12 +20596,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.8441] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.8441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -22421,25 +20608,15 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -528.172] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 516.475 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-c) 11.9551 Tj -600 TJm (--stdout) 47.8205 Tj -[1 0 0 1 137.753 516.475] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -68.2441 -0.1544] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -22456,14 +20633,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -516.32] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 504.52 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Compress) 39.8504 Tj -250 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm (decompress) 47.0334 Tj -250 TJm @@ -22472,21 +20654,6 @@ Q (standard) 33.7533 Tj -250 TJm (output.) 27.9551 Tj -[1 0 0 1 72 502.363] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.8664] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.8441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -22499,25 +20666,23 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -488.652] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 478.854 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-d) 11.9551 Tj -600 TJm (--decompress) 71.7307 Tj -[1 0 0 1 161.664 478.854] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4906 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -92.1544 -1.5341] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -22534,81 +20699,62 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -477.32] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 466.899 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +/F122_0 9.9626 Tf +(F) 5.5392 Tj 15 TJm (orce) 17.1456 Tj -296 TJm (decompression.) 62.2563 Tj -[1 0 0 1 200.214 466.899] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -200.214 -466.899] cm -[1 0 0 1 0 0] Tm -0 0 Td 200.214 466.899 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 230.102 466.899] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -230.102 -466.899] cm -[1 0 0 1 0 0] Tm -0 0 Td 230.102 466.899 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 235.659 466.899] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -235.659 -466.899] cm -[1 0 0 1 0 0] Tm -0 0 Td 235.659 466.899 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bunzip2) 41.8429 Tj -[1 0 0 1 277.502 466.899] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -277.502 -466.899] cm -[1 0 0 1 0 0] Tm -0 0 Td 280.454 466.899 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 297.791 466.899] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -297.791 -466.899] cm -[1 0 0 1 0 0] Tm -0 0 Td 297.791 466.899 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzcat) 29.8878 Tj -[1 0 0 1 327.679 466.899] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -327.679 -466.899] cm -[1 0 0 1 0 0] Tm -0 0 Td 330.631 466.899 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (are) 12.1643 Tj -296 TJm (really) 22.6848 Tj @@ -22635,9 +20781,9 @@ Q -303 TJm (tak) 12.1743 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -303 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -303 TJm (done) 19.3673 Tj -303 TJm @@ -22647,13 +20793,13 @@ Q -303 TJm (basis) 19.9252 Tj -303 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -303 TJm (which) 24.3486 Tj -303 TJm (name) 21.579 Tj -303 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -303 TJm (used.) 20.7521 Tj -939 TJm @@ -22680,21 +20826,6 @@ Q (to) 7.7509 Tj -250 TJm (decompress.) 49.5241 Tj -[1 0 0 1 72 440.832] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.8665] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.8441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -22707,25 +20838,23 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -427.121] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 417.323 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-z) 11.9551 Tj -600 TJm (--compress) 59.7756 Tj -[1 0 0 1 149.709 417.323] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -80.1993 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -22742,50 +20871,47 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -415.789] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 405.368 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (The) 15.4918 Tj -250 TJm (complement) 49.2551 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 187.969 405.368] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -187.969 -405.368] cm -[1 0 0 1 0 0] Tm -0 0 Td 187.969 405.368 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-d) 11.9551 Tj -[1 0 0 1 199.924 405.368] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -199.924 -405.368] cm -[1 0 0 1 0 0] Tm -0 0 Td 199.924 405.368 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (:) 2.7696 Tj -310 TJm (forces) 24.3386 Tj -250 TJm (compression,) 52.8516 Tj -250 TJm -(re) 7.74094 Tj +(re) 7.7409 Tj 15 TJm (g) 4.9813 Tj 5 TJm (ardless) 27.6661 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm @@ -22796,21 +20922,6 @@ Q (okation) 29.8878 Tj -250 TJm (name.) 24.0696 Tj -[1 0 0 1 72 403.211] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.8665] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.8441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -22823,25 +20934,23 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -389.5] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 379.702 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-t) 11.9551 Tj -600 TJm (--test) 35.8654 Tj -[1 0 0 1 125.798 379.702] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4906 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -56.2889 -0.1544] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -22858,18 +20967,23 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -379.548] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 367.747 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Check) 25.4544 Tj -270 TJm (inte) 14.9439 Tj 15 TJm (grity) 18.8194 Tj -271 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -270 TJm (the) 12.1743 Tj -271 TJm @@ -22895,12 +21009,12 @@ Q -270 TJm (performs) 35.965 Tj -270 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -271 TJm (trial) 16.0497 Tj -270 TJm (decompres-) 46.4755 Tj -108 355.791 Td +108 355.792 Td (sion) 16.6077 Tj -250 TJm (and) 14.386 Tj @@ -22909,30 +21023,15 @@ Q 25 TJm (ws) 11.0684 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 15 TJm (w) 7.193 Tj 10 TJm -(ay) 9.40469 Tj +(ay) 9.4047 Tj -250 TJm (the) 12.1743 Tj -250 TJm (result.) 24.6275 Tj -[1 0 0 1 72 353.635] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.8664] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.8441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -22945,25 +21044,23 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -339.924] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 330.126 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-f) 11.9551 Tj -600 TJm (--force) 41.8429 Tj -[1 0 0 1 131.776 330.126] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -62.2665 -0.1544] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -22980,12 +21077,17 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -329.971] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 318.171 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +/F122_0 9.9626 Tf +(F) 5.5392 Tj 15 TJm (orce) 17.1456 Tj -338 TJm @@ -22995,7 +21097,7 @@ Q 15 TJm (erwrite) 28.2141 Tj -339 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -338 TJm (output) 25.4644 Tj -338 TJm @@ -23003,28 +21105,20 @@ Q -1150 TJm (Normally) 38.1866 Tj 65 TJm -(,) 2.49065 Tj -[1 0 0 1 289.831 318.171] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -289.831 -318.171] cm -[1 0 0 1 0 0] Tm -0 0 Td 289.831 318.171 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 319.719 318.171] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -319.719 -318.171] cm -[1 0 0 1 0 0] Tm -0 0 Td 323.089 318.171 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -338 TJm (not) 12.7322 Tj @@ -23035,7 +21129,7 @@ Q 15 TJm (erwrite) 28.2141 Tj -338 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xisting) 27.1282 Tj -338 TJm @@ -23046,27 +21140,19 @@ Q (Also) 18.8194 Tj -339 TJm (forces) 24.3386 Tj -[1 0 0 1 108 306.215] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -108 -306.215] cm -[1 0 0 1 0 0] Tm -0 0 Td 108 306.215 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 137.888 306.215] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -137.888 -306.215] cm -[1 0 0 1 0 0] Tm -0 0 Td 140.379 306.215 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj -250 TJm (break) 22.1269 Tj @@ -23081,7 +21167,7 @@ Q -250 TJm (which) 24.3486 Tj -250 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -250 TJm (otherwise) 38.7346 Tj -250 TJm @@ -23092,12 +21178,6 @@ Q (t) 2.7696 Tj -250 TJm (do.) 12.4533 Tj -[1 0 0 1 72 304.681] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.8441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23106,22 +21186,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -294.837] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 284.416 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 137.888 284.416] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -137.888 -284.416] cm -[1 0 0 1 0 0] Tm -0 0 Td 141.211 284.416 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (normally) 35.9749 Tj -334 TJm (declines) 32.6474 Tj @@ -23138,11 +21215,11 @@ Q 18 TJm (t) 2.7696 Tj -334 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -333 TJm (the) 12.1743 Tj -334 TJm @@ -23154,32 +21231,24 @@ Q -333 TJm (bytes.) 23.5217 Tj -561 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -334 TJm (forced) 25.4445 Tj 108 272.461 Td -(\() 3.31755 Tj -[1 0 0 1 111.318 272.461] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -111.318 -272.461] cm -[1 0 0 1 0 0] Tm -0 0 Td 111.318 272.461 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-f) 11.9551 Tj -[1 0 0 1 123.273 272.461] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -123.273 -272.461] cm -[1 0 0 1 0 0] Tm -0 0 Td 123.273 272.461 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\),) 5.8082 Tj -250 TJm (ho) 9.9626 Tj @@ -23188,11 +21257,11 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -250 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -250 TJm (will) 15.5018 Tj -250 TJm @@ -23208,54 +21277,31 @@ Q -310 TJm (This) 17.7135 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (ho) 9.9626 Tj 25 TJm (w) 7.193 Tj -250 TJm (GNU) 21.579 Tj -[1 0 0 1 412.585 272.461] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -412.585 -272.461] cm -[1 0 0 1 0 0] Tm -0 0 Td 412.585 272.461 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (gzip) 23.9102 Tj -[1 0 0 1 436.496 272.461] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -436.496 -272.461] cm -[1 0 0 1 0 0] Tm -0 0 Td 438.986 272.461 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (beha) 18.8094 Tj 20 TJm (v) 4.9813 Tj 15 TJm (es.) 10.7895 Tj -[1 0 0 1 72 270.304] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.8665] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.8441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23268,25 +21314,23 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -256.594] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 246.795 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-k) 11.9551 Tj -600 TJm (--keep) 35.8654 Tj -[1 0 0 1 125.798 246.795] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4906 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -56.2889 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23303,11 +21347,16 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -245.261] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 234.84 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (K) 7.193 Tj 25 TJm (eep) 13.8281 Tj @@ -23326,24 +21375,9 @@ Q -250 TJm (compression) 50.3609 Tj -250 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm (decompression.) 62.2563 Tj -[1 0 0 1 72 232.683] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.8665] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.8441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23356,25 +21390,23 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -218.973] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 209.174 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-s) 11.9551 Tj -600 TJm (--small) 41.8429 Tj -[1 0 0 1 131.776 209.174] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -62.2665 -0.1544] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23391,11 +21423,16 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -209.02] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 197.219 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Reduce) 29.8778 Tj -347 TJm (memory) 33.2053 Tj @@ -23424,7 +21461,7 @@ Q 108 185.264 Td (using) 21.589 Tj -388 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -388 TJm (modi\002ed) 35.427 Tj -388 TJm @@ -23450,7 +21487,7 @@ Q -389 TJm (means) 25.4544 Tj -388 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -388 TJm @@ -23458,7 +21495,7 @@ Q -388 TJm (can) 13.8281 Tj -388 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj 108 173.309 Td (decompressed) 56.4381 Tj -250 TJm @@ -23466,11 +21503,11 @@ Q -250 TJm (2300k) 24.9065 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (memory) 33.2053 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -250 TJm (albeit) 22.1369 Tj -250 TJm @@ -23485,56 +21522,42 @@ Q (normal) 28.224 Tj -250 TJm (speed.) 25.1755 Tj -[1 0 0 1 72 171.152] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.8441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -161.308] cm -[1 0 0 1 0 0] Tm -0 0 Td 108 151.51 Td -/F130_0 9.9626 Tf (During) 28.224 Tj -252 TJm (compr) 25.4544 Tj 1 TJm (ession,) 27.3972 Tj -[1 0 0 1 194.09 151.51] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -194.09 -151.51] cm -[1 0 0 1 0 0] Tm -0 0 Td -194.09 151.51 Td -/F134_0 9.9626 Tf +194.091 151.51 Td +/F124_0 9.9626 Tf (-s) 11.9551 Tj -[1 0 0 1 206.046 151.51] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -206.046 -151.51] cm -[1 0 0 1 0 0] Tm -0 0 Td 208.551 151.51 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (selects) 26.5603 Tj --251 TJm -(a) 4.42339 Tj -252 TJm +(a) 4.4234 Tj +-251 TJm (block) 22.1369 Tj --251 TJm -(size) 15.4918 Tj -252 TJm -(of) 8.29885 Tj +(size) 15.4918 Tj +-251 TJm +(of) 8.2988 Tj -252 TJm (200k,) 22.4159 Tj -251 TJm @@ -23560,11 +21583,11 @@ Q 108 139.554 Td (the) 12.1743 Tj -287 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xpense) 27.6661 Tj -287 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -288 TJm (your) 18.2614 Tj -287 TJm @@ -23572,17 +21595,17 @@ Q -287 TJm (ratio.) 20.7521 Tj -843 TJm -(In) 8.29885 Tj +(In) 8.2988 Tj -287 TJm (short,) 22.4159 Tj -297 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -287 TJm (your) 18.2614 Tj -287 TJm (machine) 33.7533 Tj -287 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -287 TJm (lo) 7.7509 Tj 25 TJm @@ -23592,7 +21615,7 @@ Q -288 TJm (memory) 33.2053 Tj -287 TJm -(\(8) 8.29885 Tj +(\(8) 8.2988 Tj -287 TJm (me) 12.1743 Tj 15 TJm @@ -23600,51 +21623,42 @@ Q 5 TJm (abytes) 25.4544 Tj -287 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -287 TJm (less\),) 20.7521 Tj 108 127.599 Td (use) 13.2801 Tj -[1 0 0 1 123.771 127.599] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -123.771 -127.599] cm -[1 0 0 1 0 0] Tm -0 0 Td 123.771 127.599 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-s) 11.9551 Tj -[1 0 0 1 135.726 127.599] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -135.726 -127.599] cm -[1 0 0 1 0 0] Tm -0 0 Td -138.216 127.599 Td -/F130_0 9.9626 Tf +138.217 127.599 Td +/F122_0 9.9626 Tf (for) 11.6164 Tj -250 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm (erything.) 35.696 Tj -620 TJm (See) 14.386 Tj -[1 0 0 1 220.079 127.599] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -220.079 -127.599] cm -[1 0 0 1 0 0] Tm -0 0 Td -220.079 127.599 Td -/F130_0 9.9626 Tf +-250 TJm (MEMOR) 37.6387 Tj 65 TJm (Y) 7.193 Tj @@ -23654,7 +21668,10 @@ Q (A) 7.193 Tj 40 TJm (GEMENT) 41.5042 Tj -[1 0 0 1 337.946 127.599] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23667,13 +21684,8 @@ Q [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -337.946 -127.599] cm -[1 0 0 1 0 0] Tm -0 0 Td -340.437 127.599 Td -/F130_0 9.9626 Tf +-250 TJm ([5]) 11.6164 Tj -[1 0 0 1 352.053 127.599] cm /DeviceRGB {} cs [0 0 1] sc /DeviceRGB {} CS @@ -23682,31 +21694,12 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -352.053 -127.599] cm -[1 0 0 1 0 0] Tm -0 0 Td -354.544 127.599 Td -/F130_0 9.9626 Tf +-250 TJm (belo) 17.1556 Tj 25 TJm (w) 7.193 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 125.443] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.8665] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.8441] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23719,25 +21712,23 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -111.732] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 101.934 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 101.933 Td +/F124_0 9.9626 Tf (-q) 11.9551 Tj -600 TJm (--quiet) 41.8429 Tj -[1 0 0 1 131.776 101.934] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -62.2665 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23754,11 +21745,16 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -100.399] cm -[1 0 0 1 0 0] Tm -0 0 Td -108 89.9784 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +108 89.978 Td +/F122_0 9.9626 Tf (Suppress) 35.9749 Tj -221 TJm (non-essential) 52.5726 Tj @@ -23785,7 +21781,7 @@ Q -221 TJm (critical) 27.6661 Tj -221 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm @@ -23793,14 +21789,13 @@ Q -221 TJm (wi) 9.9626 Tj 1 TJm -(ll) 5.53921 Tj +(ll) 5.5392 Tj -221 TJm (not) 12.7322 Tj -108 78.0232 Td -(be) 9.40469 Tj +108 78.023 Td +(be) 9.4047 Tj -250 TJm (suppressed.) 46.2065 Tj -[1 0 0 1 72 75.8664] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23809,22 +21804,14 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -3.8664] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -21.1482] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23849,7 +21836,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23858,12 +21844,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23872,18 +21852,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 43.0633 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.332 -50.8518] cm -[1 0 0 1 0 0] Tm -0 0 Td -539.395 50.8518 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +539.395 50.852 Td (4) 4.9813 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23892,7 +21874,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23901,12 +21882,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23915,7 +21894,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 8 8 +%%Page: 5 8 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -23933,20 +21912,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23971,7 +21946,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23980,12 +21954,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -23994,16 +21962,22 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 105.519 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -371.59 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 477.109 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Ho) 12.1743 Tj 25 TJm (w) 7.193 Tj @@ -24013,7 +21987,6 @@ q (use) 13.2801 Tj -250 TJm (bzip2) 22.1369 Tj -[1 0 0 1 266.071 747.089] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -24022,7 +21995,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -24031,35 +22003,27 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -21.5542] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -24072,25 +22036,17 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-v) 11.9551 Tj -600 TJm (--verbose) 53.798 Tj -[1 0 0 1 143.731 710.037] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -74.2217 -0.1544] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -24107,18 +22063,23 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -709.883] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 698.082 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (V) 7.193 Tj 111 TJm (erbose) 26.0024 Tj -323 TJm (mode) 22.1369 Tj -322 TJm -(--) 6.63509 Tj +(--) 6.6351 Tj -323 TJm (sho) 13.8381 Tj 25 TJm @@ -24139,30 +22100,22 @@ Q (processed.) 41.7732 Tj -1056 TJm (Further) 29.3299 Tj -[1 0 0 1 430.015 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -430.015 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td 430.015 698.082 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-v) 11.9551 Tj -[1 0 0 1 441.97 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -441.97 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td 441.97 698.082 Td -/F130_0 9.9626 Tf -(') 3.31755 Tj +/F122_0 9.9626 Tf +(') 3.3175 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -323 TJm (increase) 32.6375 Tj -322 TJm @@ -24176,7 +22129,7 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(el,) 9.68365 Tj +(el,) 9.6836 Tj -250 TJm (spe) 13.2801 Tj 25 TJm @@ -24186,17 +22139,17 @@ Q -250 TJm (lots) 14.396 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (information) 47.0434 Tj -250 TJm (which) 24.3486 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (primarily) 37.0808 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (interest) 29.3299 Tj -250 TJm @@ -24205,21 +22158,6 @@ Q (diagnostic) 40.9562 Tj -250 TJm (purposes.) 37.9077 Tj -[1 0 0 1 72 683.97] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.985] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -24232,11 +22170,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -670.023] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 660.224 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-L) 11.9551 Tj -600 TJm (--license) 53.798 Tj @@ -24244,17 +22191,6 @@ Q (-V) 11.9551 Tj -600 TJm (--version) 53.798 Tj -[1 0 0 1 221.44 660.224] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -151.93 -0.1544] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -24271,11 +22207,16 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -660.07] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 648.269 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Display) 30.9936 Tj -250 TJm (the) 12.1743 Tj @@ -24295,21 +22236,6 @@ Q (and) 14.386 Tj -250 TJm (conditions.) 44.0048 Tj -[1 0 0 1 72 646.112] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.985] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -24322,97 +22248,76 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -632.165] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 622.366 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-1) 11.9551 Tj -[1 0 0 1 83.9552 622.366] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -83.9552 -622.366] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.4458 622.366 Td -/F130_0 9.9626 Tf +86.446 622.366 Td +/F122_0 9.9626 Tf (\(or) 11.6164 Tj -[1 0 0 1 100.553 622.366] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -100.553 -622.366] cm -[1 0 0 1 0 0] Tm -0 0 Td 100.553 622.366 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (--fast) 35.8654 Tj -[1 0 0 1 136.418 622.366] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -136.418 -622.366] cm -[1 0 0 1 0 0] Tm -0 0 Td 136.418 622.366 Td -/F130_0 9.9626 Tf -(\)) 3.31755 Tj +/F122_0 9.9626 Tf +(\)) 3.3175 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 152.468 622.366] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -152.468 -622.366] cm -[1 0 0 1 0 0] Tm -0 0 Td 152.468 622.366 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-9) 11.9551 Tj -[1 0 0 1 164.423 622.366] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -164.423 -622.366] cm -[1 0 0 1 0 0] Tm -0 0 Td 166.914 622.366 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\(or) 11.6164 Tj -[1 0 0 1 181.021 622.366] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -181.021 -622.366] cm -[1 0 0 1 0 0] Tm -0 0 Td 181.021 622.366 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-best) 29.8878 Tj -[1 0 0 1 210.909 622.366] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -210.909 -622.366] cm -[1 0 0 1 0 0] Tm -0 0 Td 210.909 622.366 Td -/F130_0 9.9626 Tf -(\)) 3.31755 Tj -[1 0 0 1 214.226 622.366] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -142.226 -1.7832] cm +/F122_0 9.9626 Tf +(\)) 3.3175 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -24429,11 +22334,7 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -620.583] cm -[1 0 0 1 0 0] Tm -0 0 Td 108 610.411 Td -/F130_0 9.9626 Tf (Set) 12.7322 Tj -288 TJm (the) 12.1743 Tj @@ -24446,13 +22347,13 @@ Q -288 TJm (100) 14.9439 Tj -289 TJm -(k,) 7.47195 Tj +(k,) 7.472 Tj -298 TJm (200) 14.9439 Tj -288 TJm (k) 4.9813 Tj -288 TJm -(...) 7.47195 Tj +(...) 7.472 Tj -850 TJm (900) 14.9439 Tj -288 TJm @@ -24466,7 +22367,7 @@ Q -289 TJm (no) 9.9626 Tj -288 TJm -(ef) 7.74094 Tj +(ef) 7.7409 Tj 25 TJm (fect) 14.9339 Tj -288 TJm @@ -24475,16 +22376,15 @@ Q (decompressing.) 62.2563 Tj -850 TJm (See) 14.386 Tj -[1 0 0 1 108 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -108 -598.456] cm -[1 0 0 1 0 0] Tm -0 0 Td 108 598.456 Td -/F130_0 9.9626 Tf (MEMOR) 37.6387 Tj 65 TJm (Y) 7.193 Tj @@ -24494,7 +22394,10 @@ Q (A) 7.193 Tj 40 TJm (GEMENT) 41.5042 Tj -[1 0 0 1 226.338 598.456] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -24507,13 +22410,8 @@ Q [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -226.338 -598.456] cm -[1 0 0 1 0 0] Tm -0 0 Td -229.3 598.456 Td -/F130_0 9.9626 Tf +-297 TJm ([5]) 11.6164 Tj -[1 0 0 1 240.916 598.456] cm /DeviceRGB {} cs [0 0 1] sc /DeviceRGB {} CS @@ -24522,61 +22420,41 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -240.916 -598.456] cm -[1 0 0 1 0 0] Tm -0 0 Td -243.878 598.456 Td -/F130_0 9.9626 Tf +-298 TJm (belo) 17.1556 Tj 25 TJm (w) 7.193 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -904 TJm (The) 15.4918 Tj -[1 0 0 1 297.278 598.456] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -297.278 -598.456] cm -[1 0 0 1 0 0] Tm -0 0 Td 297.278 598.456 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (--fast) 35.8654 Tj -[1 0 0 1 333.144 598.456] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -333.144 -598.456] cm -[1 0 0 1 0 0] Tm -0 0 Td 336.106 598.456 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 353.454 598.456] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -353.454 -598.456] cm -[1 0 0 1 0 0] Tm -0 0 Td 353.454 598.456 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (--best) 35.8654 Tj -[1 0 0 1 389.319 598.456] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -389.319 -598.456] cm -[1 0 0 1 0 0] Tm -0 0 Td 392.281 598.456 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (aliases) 26.5603 Tj -297 TJm (are) 12.1643 Tj @@ -24586,101 +22464,77 @@ Q (for) 11.6164 Tj -297 TJm (GNU) 21.579 Tj -[1 0 0 1 516.09 598.456] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -516.09 -598.456] cm -[1 0 0 1 0 0] Tm -0 0 Td 516.09 598.456 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (gzip) 23.9102 Tj -[1 0 0 1 540 598.456] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -598.456] cm -[1 0 0 1 0 0] Tm -0 0 Td 108 586.501 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (compatibility) 53.1405 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -356 TJm -(In) 8.29885 Tj +(In) 8.2988 Tj -265 TJm (particular) 38.1767 Tj 40 TJm -(,) 2.49065 Tj -[1 0 0 1 220.423 586.501] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -220.423 -586.501] cm -[1 0 0 1 0 0] Tm -0 0 Td 220.423 586.501 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (--fast) 35.8654 Tj -[1 0 0 1 256.288 586.501] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -256.288 -586.501] cm -[1 0 0 1 0 0] Tm -0 0 Td 258.932 586.501 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (doesn') 26.5603 Tj 18 TJm (t) 2.7696 Tj -265 TJm (mak) 17.1556 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -266 TJm (things) 24.3586 Tj -265 TJm (signi\002cantly) 49.2651 Tj -265 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (aster) 18.8094 Tj 55 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -712 TJm (And) 17.1556 Tj -[1 0 0 1 444.622 586.501] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -444.622 -586.501] cm -[1 0 0 1 0 0] Tm -0 0 Td 444.622 586.501 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (--best) 35.8654 Tj -[1 0 0 1 480.487 586.501] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -480.487 -586.501] cm -[1 0 0 1 0 0] Tm -0 0 Td 483.131 586.501 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (merely) 27.6661 Tj -265 TJm (selects) 26.5603 Tj -108 574.546 Td +108 574.545 Td (the) 12.1743 Tj -250 TJm (def) 12.7222 Tj @@ -24691,22 +22545,19 @@ Q 20 TJm (viour) 21.031 Tj 55 TJm -(.) 2.49065 Tj -[1 0 0 1 72 574.446] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.985] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm +(.) 2.4907 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -24719,23 +22570,9 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -560.498] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 548.643 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (--) 11.9551 Tj -[1 0 0 1 83.9552 548.643] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4906 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -14.4458 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -24752,12 +22589,17 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -548.643] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 536.688 Td -/F130_0 9.9626 Tf -(T) 6.08715 Tj +/F122_0 9.9626 Tf +(T) 6.0871 Tj 35 TJm (reats) 18.8094 Tj -261 TJm @@ -24765,23 +22607,23 @@ Q -261 TJm (subsequent) 44.2738 Tj -260 TJm -(ar) 7.74094 Tj +(ar) 7.7409 Tj 18 TJm (guments) 33.7633 Tj -261 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -261 TJm (\002le) 12.7322 Tj -261 TJm (names,) 27.9451 Tj -263 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(en) 9.40469 Tj +(en) 9.4047 Tj -261 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -261 TJm (the) 12.1743 Tj 15 TJm @@ -24791,15 +22633,15 @@ Q -261 TJm (with) 17.7135 Tj -261 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -261 TJm (dash.) 20.7521 Tj -685 TJm (This) 17.7135 Tj -260 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -261 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -261 TJm (you) 14.9439 Tj -261 TJm @@ -24813,62 +22655,51 @@ Q -250 TJm (names) 25.4544 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj 15 TJm (ginning) 30.4457 Tj -250 TJm (with) 17.7135 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (dash,) 20.7521 Tj -250 TJm (for) 11.6164 Tj -250 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xample:) 32.0995 Tj -[1 0 0 1 302.27 524.732] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -302.27 -524.732] cm -[1 0 0 1 0 0] Tm -0 0 Td 302.27 524.732 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -600 TJm (--) 11.9551 Tj -600 TJm (-myfilename) 65.7532 Tj -[1 0 0 1 421.821 524.732] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -421.821 -524.732] cm -[1 0 0 1 0 0] Tm -0 0 Td 421.821 524.732 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 522.576] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.985] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -24881,55 +22712,47 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -508.628] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 498.83 Td -/F134_0 9.9626 Tf -(--repetitive-fast) 101.619 Tj -[1 0 0 1 173.619 498.83] cm +/F124_0 9.9626 Tf +(--repetitive-fast) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -173.619 -498.83] cm -[1 0 0 1 0 0] Tm -0 0 Td -173.619 498.83 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 178.6 498.83] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +178.6 498.83 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -183.582 -498.83] cm -[1 0 0 1 0 0] Tm -0 0 Td -183.582 498.83 Td -/F134_0 9.9626 Tf -(--repetitive-best) 101.619 Tj -[1 0 0 1 285.2 498.83] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -215.691 -1.5342] cm +188.563 498.83 Td +/F124_0 9.9626 Tf +(--repetitive-best) 101.6185 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -24946,11 +22769,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -497.295] cm -[1 0 0 1 0 0] Tm -0 0 Td 108 486.874 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (These) 23.7907 Tj -207 TJm (\003ags) 18.8194 Tj @@ -24973,7 +22793,7 @@ Q 15 TJm (v) 4.9813 Tj 15 TJm -(e.) 6.91404 Tj +(e.) 6.914 Tj -591 TJm (The) 15.4918 Tj 15 TJm @@ -24985,11 +22805,7 @@ Q -207 TJm (some) 21.031 Tj -207 TJm -(c) 4.42339 Tj -1 TJm -(o) 4.9813 Tj --1 TJm -(a) 4.42339 Tj +(coa) 13.8281 Tj 1 TJm (rse) 11.6164 Tj -207 TJm @@ -24999,7 +22815,7 @@ Q 15 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj -207 TJm (the) 12.1743 Tj -206 TJm @@ -25007,7 +22823,7 @@ Q 20 TJm (viour) 21.031 Tj 108 474.919 Td -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -251 TJm @@ -25027,7 +22843,7 @@ Q -251 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -250 TJm (sometimes) 42.62 Tj -250 TJm @@ -25041,21 +22857,21 @@ Q 15 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -251 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -250 TJm (impro) 23.8007 Tj 15 TJm (v) 4.9813 Tj 15 TJm -(ed) 9.40469 Tj +(ed) 9.4047 Tj 108 462.964 Td (algorithm) 38.7446 Tj -250 TJm @@ -25072,7 +22888,6 @@ Q (v) 4.9813 Tj 25 TJm (ant.) 14.6649 Tj -[1 0 0 1 72 460.807] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -25081,12 +22896,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -3.985] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -25115,7 +22928,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -25124,11 +22936,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -436.897] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 414.264 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (2.5.) 34.4584 Tj -278 TJm (MEMOR) 79.184 Tj @@ -25138,7 +22947,6 @@ Q (MANA) 61.9548 Tj 50 TJm (GEMENT) 88.3771 Tj -[1 0 0 1 72 414.005] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -25163,7 +22971,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -25172,27 +22979,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -404.043] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 392.346 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 101.888 392.346] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -101.888 -392.346] cm -[1 0 0 1 0 0] Tm -0 0 Td 104.454 392.346 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (compresses) 45.9276 Tj -258 TJm (lar) 10.5105 Tj 18 TJm -(ge) 9.40469 Tj +(ge) 9.4047 Tj -257 TJm (\002les) 16.6077 Tj -258 TJm @@ -25206,7 +23006,7 @@ Q -258 TJm (size) 15.4918 Tj -258 TJm -(af) 7.74094 Tj +(af) 7.7409 Tj 25 TJm (fects) 18.8094 Tj -257 TJm @@ -25230,7 +23030,7 @@ Q -257 TJm (amount) 29.8878 Tj 72 380.391 Td -(of) 8.29885 Tj +(of) 8.2988 Tj -215 TJm (memory) 33.2053 Tj -215 TJm @@ -25247,49 +23047,33 @@ Q (The) 15.4918 Tj -215 TJm (\003ags) 18.8194 Tj -[1 0 0 1 337.719 380.391] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -337.719 -380.391] cm -[1 0 0 1 0 0] Tm -0 0 Td 337.719 380.391 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-1) 11.9551 Tj -[1 0 0 1 349.674 380.391] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -349.674 -380.391] cm -[1 0 0 1 0 0] Tm -0 0 Td 351.815 380.391 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (through) 30.9936 Tj -[1 0 0 1 384.95 380.391] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -384.95 -380.391] cm -[1 0 0 1 0 0] Tm -0 0 Td 384.95 380.391 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-9) 11.9551 Tj -[1 0 0 1 396.905 380.391] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -396.905 -380.391] cm -[1 0 0 1 0 0] Tm -0 0 Td 399.046 380.391 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (specify) 28.772 Tj -215 TJm (the) 12.1743 Tj @@ -25300,7 +23084,7 @@ Q -215 TJm (to) 7.7509 Tj -214 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -215 TJm (100,000) 32.3785 Tj 72 368.435 Td @@ -25324,7 +23108,7 @@ Q 15 TJm (ely) 12.1743 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -786 TJm (At) 9.9626 Tj -278 TJm @@ -25344,7 +23128,7 @@ Q -278 TJm (compression) 50.3609 Tj 72 356.48 Td -(is) 6.64505 Tj +(is) 6.6451 Tj -243 TJm (read) 17.1456 Tj -242 TJm @@ -25354,7 +23138,7 @@ Q -242 TJm (header) 26.5503 Tj -243 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -242 TJm (the) 12.1743 Tj -243 TJm @@ -25363,34 +23147,26 @@ Q (\002le,) 15.2229 Tj -244 TJm (and) 14.386 Tj -[1 0 0 1 275.174 356.48] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -275.174 -356.48] cm -[1 0 0 1 0 0] Tm -0 0 Td 275.174 356.48 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bunzip2) 41.8429 Tj -[1 0 0 1 317.017 356.48] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -317.017 -356.48] cm -[1 0 0 1 0 0] Tm -0 0 Td 319.433 356.48 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (then) 17.1556 Tj -243 TJm (all) 9.9626 Tj 1 TJm (o) 4.9813 Tj -1 TJm -(c) 4.42339 Tj +(c) 4.4234 Tj 1 TJm (ates) 15.4918 Tj -243 TJm @@ -25426,7 +23202,7 @@ Q -303 TJm (\002les,) 19.0983 Tj -317 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -303 TJm (follo) 18.8194 Tj 25 TJm @@ -25437,49 +23213,33 @@ Q (the) 12.1743 Tj -303 TJm (\003ags) 18.8194 Tj -[1 0 0 1 406.35 344.525] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -406.35 -344.525] cm -[1 0 0 1 0 0] Tm -0 0 Td 406.35 344.525 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-1) 11.9551 Tj -[1 0 0 1 418.305 344.525] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -418.305 -344.525] cm -[1 0 0 1 0 0] Tm -0 0 Td 421.327 344.525 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj -[1 0 0 1 432.1 344.525] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -432.1 -344.525] cm -[1 0 0 1 0 0] Tm -0 0 Td 432.1 344.525 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-9) 11.9551 Tj -[1 0 0 1 444.055 344.525] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -444.055 -344.525] cm -[1 0 0 1 0 0] Tm -0 0 Td 447.077 344.525 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (are) 12.1643 Tj -303 TJm (irrele) 21.0211 Tj @@ -25492,28 +23252,22 @@ Q -303 TJm (and) 14.386 Tj -303 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj 72 332.57 Td (ignored) 30.4357 Tj -250 TJm (during) 26.0123 Tj -250 TJm (decompression.) 62.2563 Tj -[1 0 0 1 72 330.413] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -320.45] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 310.652 Td -/F130_0 9.9626 Tf (Compression) 52.5826 Tj -250 TJm (and) 14.386 Tj @@ -25528,76 +23282,73 @@ Q -250 TJm (can) 13.8281 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (estimated) 38.1866 Tj -250 TJm (as:) 11.0684 Tj -[1 0 0 1 72 308.495] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -60.7721] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 59.7758 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 247.723] cm +0 0 468 59.776 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 56.1893] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -299.13] cm [1 0 0 1 0 0] Tm 0 0 Td -90 299.13 Td -/F134_0 9.9626 Tf +90 299.131 Td +/F124_0 9.9626 Tf (Compression:) 71.7307 Tj -1278 TJm (400k) 23.9102 Tj -426 TJm -(+) 5.97756 Tj +(+) 5.9776 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm -(8) 5.97756 Tj +(8) 5.9776 Tj -426 TJm -(x) 5.97756 Tj +(x) 5.9776 Tj -426 TJm (block) 29.8878 Tj -426 TJm (size) 23.9102 Tj -426 TJm -(\)) 5.97756 Tj +(\)) 5.9776 Tj 90 275.22 Td (Decompression:) 83.6858 Tj -426 TJm (100k) 23.9102 Tj -426 TJm -(+) 5.97756 Tj +(+) 5.9776 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm -(4) 5.97756 Tj +(4) 5.9776 Tj -426 TJm -(x) 5.97756 Tj +(x) 5.9776 Tj -426 TJm (block) 29.8878 Tj -426 TJm @@ -25609,25 +23360,23 @@ f 153.66 263.265 Td (100k) 23.9102 Tj -426 TJm -(+) 5.97756 Tj +(+) 5.9776 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (2.5) 17.9327 Tj -426 TJm -(x) 5.97756 Tj +(x) 5.9776 Tj -426 TJm (block) 29.8878 Tj -426 TJm (size) 23.9102 Tj -426 TJm -(\)) 5.97756 Tj -[1 0 0 1 72 247.723] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm +(\)) 5.9776 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -25636,16 +23385,12 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -237.761] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 225.805 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Lar) 13.8281 Tj 18 TJm (ger) 12.7222 Tj @@ -25658,7 +23403,7 @@ f 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -292 TJm (rapidly) 28.224 Tj -292 TJm @@ -25672,7 +23417,7 @@ f -871 TJm (Most) 20.4831 Tj -292 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -291 TJm (the) 12.1743 Tj -292 TJm @@ -25690,7 +23435,7 @@ f 10 TJm (o) 4.9813 Tj -292 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj 72 213.85 Td (three) 19.9152 Tj -232 TJm @@ -25698,15 +23443,15 @@ f -232 TJm (k) 4.9813 Tj -232 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -232 TJm (block) 22.1369 Tj -232 TJm (size,) 17.9825 Tj -235 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -232 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (act) 11.6164 Tj -232 TJm @@ -25723,36 +23468,28 @@ f (when) 21.579 Tj -231 TJm (using) 21.589 Tj -[1 0 0 1 354.025 213.85] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -354.025 -213.85] cm -[1 0 0 1 0 0] Tm -0 0 Td 354.025 213.85 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 383.913 213.85] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -383.913 -213.85] cm -[1 0 0 1 0 0] Tm -0 0 Td 386.223 213.85 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (on) 9.9626 Tj -232 TJm (small) 21.589 Tj -232 TJm (machines.) 40.1194 Tj -304 TJm -(It) 6.08715 Tj +(It) 6.0871 Tj -232 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -232 TJm (also) 16.0497 Tj -231 TJm @@ -25772,7 +23509,7 @@ f -250 TJm (requirement) 48.1393 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (set) 11.0684 Tj -250 TJm @@ -25788,29 +23525,23 @@ f -250 TJm (choice) 26.0024 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (block) 22.1369 Tj -250 TJm (size.) 17.9825 Tj -[1 0 0 1 72 199.738] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -189.776] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 179.977 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -388 TJm (\002les) 16.6077 Tj -389 TJm @@ -25829,27 +23560,19 @@ f (block) 22.1369 Tj -389 TJm (size,) 17.9825 Tj -[1 0 0 1 302.002 179.977] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -302.002 -179.977] cm -[1 0 0 1 0 0] Tm -0 0 Td 302.002 179.977 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bunzip2) 41.8429 Tj -[1 0 0 1 343.846 179.977] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -343.846 -179.977] cm -[1 0 0 1 0 0] Tm -0 0 Td -347.715 179.977 Td -/F130_0 9.9626 Tf +347.716 179.977 Td +/F122_0 9.9626 Tf (will) 15.5018 Tj -388 TJm (require) 28.2141 Tj @@ -25864,7 +23587,7 @@ f -389 TJm (decompress.) 49.5241 Tj 72 168.022 Td -(T) 6.08715 Tj +(T) 6.0871 Tj 80 TJm (o) 4.9813 Tj -424 TJm @@ -25872,19 +23595,19 @@ f -425 TJm (decompression) 59.7656 Tj -424 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -424 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -425 TJm -(\002l) 8.30881 Tj +(\002l) 8.3088 Tj 1 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -425 TJm (on) 9.9626 Tj -424 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -424 TJm (4) 4.9813 Tj -425 TJm @@ -25895,30 +23618,22 @@ f (abyte) 21.579 Tj -424 TJm (machine,) 36.2439 Tj -[1 0 0 1 348.272 168.022] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -348.272 -168.022] cm -[1 0 0 1 0 0] Tm -0 0 Td 348.272 168.022 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bunzip2) 41.8429 Tj -[1 0 0 1 390.115 168.022] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -390.115 -168.022] cm -[1 0 0 1 0 0] Tm -0 0 Td 394.342 168.022 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (has) 13.2801 Tj -424 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -425 TJm (option) 25.4644 Tj -424 TJm @@ -25936,11 +23651,11 @@ f -280 TJm (amount) 29.8878 Tj -281 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -281 TJm (memory) 33.2053 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -288 TJm (about) 22.1369 Tj -281 TJm @@ -25952,7 +23667,7 @@ f -280 TJm (speed) 22.6848 Tj -281 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -281 TJm (also) 16.0497 Tj -281 TJm @@ -25960,7 +23675,7 @@ f 15 TJm (ed,) 11.8953 Tj -288 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -281 TJm (you) 14.9439 Tj -281 TJm @@ -25978,7 +23693,7 @@ f -250 TJm (necessary) 38.7246 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -620 TJm (The) 15.4918 Tj -250 TJm @@ -25990,45 +23705,31 @@ f -250 TJm (\003ag) 14.9439 Tj -250 TJm -(is) 6.64505 Tj -[1 0 0 1 305.024 144.112] cm +(is) 6.6451 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -305.024 -144.112] cm -[1 0 0 1 0 0] Tm -0 0 Td 305.024 144.112 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-s) 11.9551 Tj -[1 0 0 1 316.979 144.112] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -316.979 -144.112] cm -[1 0 0 1 0 0] Tm -0 0 Td 316.979 144.112 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 141.955] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -131.992] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 122.194 Td -/F130_0 9.9626 Tf -(In) 8.29885 Tj +(In) 8.2988 Tj -204 TJm (general,) 31.8106 Tj -214 TJm @@ -26056,7 +23757,7 @@ f 25 TJm (w) 7.193 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -214 TJm (since) 20.4731 Tj -204 TJm @@ -26095,21 +23796,15 @@ f (block) 22.1369 Tj -250 TJm (size.) 17.9825 Tj -[1 0 0 1 72 108.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -98.1193] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 88.321 Td -/F130_0 9.9626 Tf (Another) 32.6474 Tj -296 TJm (signi\002cant) 41.5142 Tj @@ -26124,17 +23819,17 @@ f -296 TJm (which) 24.3486 Tj -296 TJm -(\002t) 8.30881 Tj +(\002t) 8.3088 Tj -296 TJm (in) 7.7509 Tj -296 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -295 TJm (single) 23.8007 Tj -296 TJm (block) 22.1369 Tj -296 TJm -(--) 6.63509 Tj +(--) 6.6351 Tj -296 TJm (that) 14.9439 Tj -296 TJm @@ -26152,11 +23847,11 @@ f -296 TJm (using) 21.589 Tj -296 TJm -(a) 4.42339 Tj -72 76.3658 Td +(a) 4.4234 Tj +72 76.366 Td (lar) 10.5105 Tj 18 TJm -(ge) 9.40469 Tj +(ge) 9.4047 Tj -290 TJm (block) 22.1369 Tj -290 TJm @@ -26166,7 +23861,7 @@ f -290 TJm (amount) 29.8878 Tj -290 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -290 TJm (real) 14.9339 Tj -290 TJm @@ -26174,7 +23869,7 @@ f -289 TJm (touched) 31.5416 Tj -290 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -290 TJm (proportional) 49.2551 Tj -290 TJm @@ -26184,7 +23879,7 @@ f -290 TJm (size) 15.4918 Tj -290 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -290 TJm (the) 12.1743 Tj -289 TJm @@ -26196,20 +23891,13 @@ f -290 TJm (\002le) 12.7322 Tj -290 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -290 TJm (smaller) 29.3299 Tj -[1 0 0 1 72 50.8518] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -26234,7 +23922,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -26243,12 +23930,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -26257,18 +23938,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 43.0633 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.332 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -539.395 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +539.395 50.951 Td (5) 4.9813 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -26277,7 +23960,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -26286,12 +23968,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -26300,7 +23980,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 9 9 +%%Page: 6 9 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -26318,20 +23998,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -26356,7 +24032,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -26365,12 +24040,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -26379,16 +24048,22 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 105.519 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -371.59 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 477.109 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Ho) 12.1743 Tj 25 TJm (w) 7.193 Tj @@ -26398,7 +24073,6 @@ q (use) 13.2801 Tj -250 TJm (bzip2) 22.1369 Tj -[1 0 0 1 266.071 747.089] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -26407,7 +24081,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -26416,56 +24089,52 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -741.554] cm [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (than) 17.1556 Tj -362 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -362 TJm (block.) 24.6275 Tj -1293 TJm -(F) 5.53921 Tj +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -362 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xample,) 31.8205 Tj -390 TJm (compressing) 50.3609 Tj -362 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -362 TJm (\002le) 12.7322 Tj -362 TJm @@ -26480,27 +24149,19 @@ Q (the) 12.1743 Tj -362 TJm (\003ag) 14.9439 Tj -[1 0 0 1 406.528 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -406.528 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 406.528 710.037 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-9) 11.9551 Tj -[1 0 0 1 418.483 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -418.483 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 422.09 710.037 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -362 TJm (cause) 22.1269 Tj @@ -26517,11 +24178,11 @@ Q -272 TJm (7600k) 24.9065 Tj -271 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -272 TJm (memory) 33.2053 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -277 TJm (b) 4.9813 Tj 20 TJm @@ -26533,7 +24194,7 @@ Q -271 TJm (400k) 19.9252 Tj -272 TJm -(+) 5.61891 Tj +(+) 5.6189 Tj -271 TJm (20000) 24.9065 Tj -272 TJm @@ -26541,19 +24202,19 @@ Q -271 TJm (8) 4.9813 Tj -272 TJm -(=) 5.61891 Tj +(=) 5.6189 Tj -271 TJm (560) 14.9439 Tj -272 TJm (kbytes) 26.0123 Tj -271 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -272 TJm -(it.) 8.02986 Tj +(it.) 8.0299 Tj -748 TJm (Similarly) 37.0908 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -277 TJm (the) 12.1743 Tj -272 TJm @@ -26575,7 +24236,7 @@ Q -250 TJm (100k) 19.9252 Tj -250 TJm -(+) 5.61891 Tj +(+) 5.6189 Tj -250 TJm (20000) 24.9065 Tj -250 TJm @@ -26583,31 +24244,25 @@ Q -250 TJm (4) 4.9813 Tj -250 TJm -(=) 5.61891 Tj +(=) 5.6189 Tj -250 TJm (180) 14.9439 Tj -250 TJm (kbytes.) 28.503 Tj -[1 0 0 1 72 683.97] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -674.008] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 664.209 Td -/F130_0 9.9626 Tf (Here) 19.3573 Tj -293 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -294 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -293 TJm (table) 19.3673 Tj -294 TJm @@ -26637,7 +24292,7 @@ Q -293 TJm (recorded) 34.8492 Tj -294 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -293 TJm (the) 12.1743 Tj -294 TJm @@ -26653,7 +24308,7 @@ Q -289 TJm (\002les) 16.6077 Tj -290 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -289 TJm (the) 12.1743 Tj -289 TJm @@ -26661,9 +24316,9 @@ Q 5 TJm (ary) 12.7222 Tj -289 TJm -(T) 6.08715 Tj +(T) 6.0871 Tj 70 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xt) 7.7509 Tj -289 TJm @@ -26685,7 +24340,7 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj 72 640.299 Td (some) 21.031 Tj -253 TJm @@ -26725,7 +24380,7 @@ Q 25 TJm (antage) 26.0024 Tj -253 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -253 TJm (lar) 10.5105 Tj 18 TJm @@ -26749,7 +24404,7 @@ Q -250 TJm (Corpus) 28.782 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (dominated) 42.0621 Tj -250 TJm @@ -26758,42 +24413,39 @@ Q (smaller) 29.3299 Tj -250 TJm (\002les.) 19.0983 Tj -[1 0 0 1 72 626.187] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -156.413] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 469.773] cm 0 0 468 155.417 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5865] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 151.831] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -616.822] cm [1 0 0 1 0 0] Tm 0 0 Td 123.952 616.822 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (Compress) 47.8205 Tj -1278 TJm (Decompress) 59.7756 Tj @@ -26813,7 +24465,7 @@ f (usage) 29.8878 Tj -2130 TJm (Size) 23.9102 Tj -94.244 580.956 Td +94.244 580.957 Td (-1) 11.9551 Tj -2556 TJm (1200k) 29.8878 Tj @@ -26903,12 +24555,6 @@ f (2350k) 29.8878 Tj -2556 TJm (828642) 35.8654 Tj -[1 0 0 1 72 469.773] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -26917,7 +24563,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS @@ -26942,7 +24591,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -26951,11 +24599,8 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -459.811] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 435.021 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (2.6.) 34.4584 Tj -278 TJm (RECO) 59.6824 Tj @@ -26981,7 +24626,6 @@ f (GED) 44.767 Tj 72 410.23 Td (FILES) 58.5462 Tj -[1 0 0 1 72 409.972] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -27006,7 +24650,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -27015,22 +24658,15 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -400.01] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 388.312 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 101.888 388.312] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -101.888 -388.312] cm -[1 0 0 1 0 0] Tm -0 0 Td 105.138 388.312 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (compresses) 45.9276 Tj -326 TJm (\002les) 16.6077 Tj @@ -27048,22 +24684,22 @@ f (Each) 19.9152 Tj -326 TJm (block) 22.1369 Tj --327 TJm -(is) 6.64505 Tj -326 TJm +(is) 6.6451 Tj +-327 TJm (handled) 31.5416 Tj -326 TJm (independently) 56.4481 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -1077 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -326 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -326 TJm (media) 24.3486 Tj -326 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj 72 376.357 Td (transmission) 50.3709 Tj -319 TJm @@ -27071,30 +24707,22 @@ f -318 TJm (causes) 26.0024 Tj -319 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -318 TJm (multi-block) 46.4955 Tj -[1 0 0 1 234.518 376.357] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -234.518 -376.357] cm -[1 0 0 1 0 0] Tm -0 0 Td -234.518 376.357 Td -/F134_0 9.9626 Tf +234.519 376.357 Td +/F124_0 9.9626 Tf (.bz2) 23.9102 Tj -[1 0 0 1 258.429 376.357] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -258.429 -376.357] cm -[1 0 0 1 0 0] Tm -0 0 Td 261.603 376.357 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\002le) 12.7322 Tj -319 TJm (to) 7.7509 Tj @@ -27103,11 +24731,13 @@ f -319 TJm (damaged,) 38.4556 Tj -336 TJm -(it) 5.53921 Tj --318 TJm +(i) 2.7696 Tj +1 TJm +(t) 2.7696 Tj +-319 TJm (may) 17.1556 Tj -319 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -318 TJm (possible) 32.6574 Tj -319 TJm @@ -27117,7 +24747,7 @@ f 15 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj -319 TJm (data) 16.5977 Tj -319 TJm @@ -27134,40 +24764,34 @@ f (the) 12.1743 Tj -250 TJm (\002le.) 15.2229 Tj -[1 0 0 1 72 362.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -352.283] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 342.484 Td -/F130_0 9.9626 Tf (The) 15.4918 Tj -358 TJm (compressed) 47.0334 Tj -357 TJm (representation) 56.4381 Tj -358 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -357 TJm (each) 18.2515 Tj -358 TJm (block) 22.1369 Tj -358 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -357 TJm (delimited) 37.6387 Tj -358 TJm (by) 9.9626 Tj -357 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -358 TJm (48-bit) 23.8007 Tj -358 TJm @@ -27177,9 +24801,9 @@ f -358 TJm (mak) 17.1556 Tj 10 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -357 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -358 TJm (possible) 32.6574 Tj -357 TJm @@ -27193,15 +24817,13 @@ f -286 TJm (boundaries) 43.7159 Tj -286 TJm -(wit) 12.7322 Tj -1 TJm -(h) 4.9813 Tj --286 TJm +(with) 17.7135 Tj +-285 TJm (reasonable) 42.6001 Tj -286 TJm (certainty) 34.8591 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -835 TJm (Each) 19.9152 Tj -285 TJm @@ -27211,7 +24833,7 @@ f -286 TJm (carries) 26.5503 Tj -286 TJm -(its) 9.41466 Tj +(its) 9.4147 Tj -285 TJm (o) 4.9813 Tj 25 TJm @@ -27221,7 +24843,7 @@ f -286 TJm (CRC,) 22.4258 Tj -286 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -285 TJm (damaged) 35.965 Tj -286 TJm @@ -27229,7 +24851,7 @@ f -286 TJm (can) 13.8281 Tj -286 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj 72 318.574 Td (distinguished) 53.1405 Tj -250 TJm @@ -27238,12 +24860,6 @@ f (undamaged) 45.9276 Tj -250 TJm (ones.) 20.7521 Tj -[1 0 0 1 72 316.417] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -27252,25 +24868,22 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -306.455] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 296.656 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2recover) 71.7307 Tj -[1 0 0 1 143.731 296.656] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -143.731 -296.656] cm -[1 0 0 1 0 0] Tm -0 0 Td 146.448 296.656 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -273 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -272 TJm (simple) 26.5703 Tj -273 TJm @@ -27280,7 +24893,7 @@ f -272 TJm (purpose) 31.5416 Tj -273 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -273 TJm (to) 7.7509 Tj -272 TJm @@ -27291,27 +24904,19 @@ f (blocks) 26.0123 Tj -272 TJm (in) 7.7509 Tj -[1 0 0 1 392.655 296.656] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -392.655 -296.656] cm -[1 0 0 1 0 0] Tm -0 0 Td 392.655 296.656 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (.bz2) 23.9102 Tj -[1 0 0 1 416.566 296.656] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -416.566 -296.656] cm -[1 0 0 1 0 0] Tm -0 0 Td 419.282 296.656 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\002les,) 19.0983 Tj -278 TJm (and) 14.386 Tj @@ -27325,33 +24930,27 @@ f (out) 12.7322 Tj 72 284.701 Td (into) 15.5018 Tj --254 TJm -(its) 9.41466 Tj +-255 TJm +(i) 2.7696 Tj +1 TJm +(ts) 6.6451 Tj -255 TJm (o) 4.9813 Tj 25 TJm (wn) 12.1743 Tj -[1 0 0 1 121.43 284.701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -121.43 -284.701] cm -[1 0 0 1 0 0] Tm -0 0 Td -121.43 284.701 Td -/F134_0 9.9626 Tf +121.429 284.701 Td +/F124_0 9.9626 Tf (.bz2) 23.9102 Tj -[1 0 0 1 145.34 284.701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -145.34 -284.701] cm -[1 0 0 1 0 0] Tm -0 0 Td 147.875 284.701 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\002le.) 15.2229 Tj -647 TJm (Y) 7.193 Tj @@ -27363,34 +24962,24 @@ f (then) 17.1556 Tj -255 TJm (use) 13.2801 Tj -[1 0 0 1 240.01 284.701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -240.01 -284.701] cm -[1 0 0 1 0 0] Tm -0 0 Td 240.01 284.701 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -600 TJm (-t) 11.9551 Tj -[1 0 0 1 287.831 284.701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -287.831 -284.701] cm -[1 0 0 1 0 0] Tm -0 0 Td 290.367 284.701 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj --255 TJm -(t) 2.7696 Tj -1 TJm -(est) 11.0684 Tj +-254 TJm +(test) 13.8381 Tj -255 TJm (the) 12.1743 Tj -254 TJm @@ -27398,7 +24987,7 @@ f 15 TJm (grity) 18.8194 Tj -255 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -254 TJm (the) 12.1743 Tj -255 TJm @@ -27417,12 +25006,6 @@ f (are) 12.1643 Tj -250 TJm (undamaged.) 48.4182 Tj -[1 0 0 1 72 270.589] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -27431,31 +25014,28 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -260.626] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 250.828 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2recover) 71.7307 Tj -[1 0 0 1 143.731 250.828] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -143.731 -250.828] cm -[1 0 0 1 0 0] Tm -0 0 Td 150.099 250.828 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (tak) 12.1743 Tj 10 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -639 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -639 TJm (single) 23.8007 Tj -639 TJm -(ar) 7.74094 Tj +(ar) 7.7409 Tj 18 TJm (gument,) 32.3785 Tj -737 TJm @@ -27463,7 +25043,7 @@ f -639 TJm (name) 21.579 Tj -639 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -639 TJm (the) 12.1743 Tj -639 TJm @@ -27475,57 +25055,43 @@ f -639 TJm (writes) 24.3486 Tj -639 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -639 TJm (number) 30.4357 Tj -639 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -640 TJm -(\002les) 16.6077 Tj -[1 0 0 1 72 238.873] cm +(\002) 5.5392 Tj +1 TJm +(les) 11.0684 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -238.873] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 238.873 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (rec0001file.bz2) 89.6634 Tj -[1 0 0 1 161.664 238.873] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -161.664 -238.873] cm -[1 0 0 1 0 0] Tm -0 0 Td 161.664 238.873 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 169.072 238.873] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -169.072 -238.873] cm -[1 0 0 1 0 0] Tm -0 0 Td 169.072 238.873 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (rec0002file.bz2) 89.6634 Tj -[1 0 0 1 258.736 238.873] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -258.736 -238.873] cm -[1 0 0 1 0 0] Tm -0 0 Td 258.736 238.873 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -494 TJm (etc,) 14.107 Tj -493 TJm @@ -27533,7 +25099,7 @@ f -445 TJm (the) 12.1743 Tj -445 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xtracted) 32.0895 Tj -445 TJm @@ -27549,7 +25115,7 @@ f 72 226.918 Td (designed) 35.417 Tj -337 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -337 TJm (that) 14.9439 Tj -337 TJm @@ -27557,7 +25123,7 @@ f -337 TJm (use) 13.2801 Tj -337 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -337 TJm (wildc) 22.1369 Tj 1 TJm @@ -27569,47 +25135,39 @@ f -337 TJm (processing) 42.61 Tj -337 TJm -(--) 6.63509 Tj +(--) 6.6351 Tj -337 TJm (for) 11.6164 Tj -337 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xample,) 31.8205 Tj -[1 0 0 1 396.538 226.918] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -396.538 -226.918] cm -[1 0 0 1 0 0] Tm -0 0 Td 396.538 226.918 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -600 TJm (-dc) 17.9327 Tj -600 TJm (rec) 17.9327 Tj 474.247 225.174 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 480.224 226.918 Td (file.bz2) 47.8205 Tj -600 TJm -(>) 5.97756 Tj -72 214.963 Td +(>) 5.9776 Tj +72 214.962 Td (recovered_data) 83.6858 Tj -[1 0 0 1 155.686 214.963] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -155.686 -214.963] cm -[1 0 0 1 0 0] Tm -0 0 Td -158.177 214.963 Td -/F130_0 9.9626 Tf -(--) 6.63509 Tj +158.177 214.962 Td +/F122_0 9.9626 Tf +(--) 6.6351 Tj -250 TJm (lists) 16.0597 Tj -250 TJm @@ -27625,13 +25183,11 @@ f -250 TJm (order) 21.0211 Tj 55 TJm -(.) 2.49065 Tj -[1 0 0 1 72 213.653] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9627] cm +(.) 2.4907 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -27640,27 +25196,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -203.69] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 193.045 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2recover) 71.7307 Tj -[1 0 0 1 143.731 193.045] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -143.731 -193.045] cm -[1 0 0 1 0 0] Tm -0 0 Td 145.93 193.045 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (should) 26.5703 Tj -221 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -220 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -221 TJm (most) 19.3773 Tj -221 TJm @@ -27672,31 +25221,23 @@ f -221 TJm (lar) 10.5105 Tj 18 TJm -(ge) 9.40469 Tj -[1 0 0 1 307.229 193.045] cm +(ge) 9.4047 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -307.229 -193.045] cm -[1 0 0 1 0 0] Tm -0 0 Td 307.229 193.045 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (.bz2) 23.9102 Tj -[1 0 0 1 331.14 193.045] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -331.14 -193.045] cm -[1 0 0 1 0 0] Tm -0 0 Td 333.338 193.045 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\002les,) 19.0983 Tj -227 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -220 TJm (these) 20.4731 Tj -221 TJm @@ -27710,19 +25251,19 @@ f -221 TJm (blocks.) 28.503 Tj -600 TJm -(It) 6.08715 Tj +(It) 6.0871 Tj -221 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -221 TJm (clearly) 27.1082 Tj -72 181.09 Td +72 181.089 Td (futile) 21.031 Tj -289 TJm (to) 7.7509 Tj -289 TJm (use) 13.2801 Tj -289 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -289 TJm (on) 9.9626 Tj -289 TJm @@ -27732,11 +25273,11 @@ f -290 TJm (\002les) 16.6077 Tj 1 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -299 TJm (since) 20.4731 Tj -289 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -290 TJm (damaged) 35.965 Tj -289 TJm @@ -27744,7 +25285,7 @@ f -289 TJm (cannot) 26.5603 Tj -289 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -289 TJm (reco) 17.1456 Tj 15 TJm @@ -27752,7 +25293,7 @@ f 15 TJm (ered.) 19.6363 Tj -854 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -289 TJm (you) 14.9439 Tj -290 TJm @@ -27761,8 +25302,8 @@ f (to) 7.7509 Tj -289 TJm (minimise) 37.0908 Tj -72 169.135 Td -(an) 9.40469 Tj +72 169.134 Td +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -320 TJm @@ -27776,7 +25317,7 @@ f -320 TJm (media) 24.3486 Tj -320 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -319 TJm (transmission) 50.3709 Tj -320 TJm @@ -27792,14 +25333,13 @@ f -319 TJm (with) 17.7135 Tj -320 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -320 TJm (smaller) 29.3299 Tj -320 TJm (block) 22.1369 Tj 72 157.179 Td (size.) 17.9825 Tj -[1 0 0 1 72 157.08] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -27828,7 +25368,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -27837,19 +25376,15 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -147.117] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 122.426 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (2.7.) 34.4584 Tj -278 TJm (PERFORMANCE) 161.818 Tj -278 TJm -(NO) 30.9877 Tj +(NO) 30.9878 Tj 40 TJm (TES) 40.1808 Tj -[1 0 0 1 72 122.168] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -27874,23 +25409,19 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -112.206] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 100.509 Td -/F130_0 9.9626 Tf +72 100.508 Td +/F122_0 9.9626 Tf (The) 15.4918 Tj -305 TJm (sorting) 27.6761 Tj -304 TJm (phase) 22.6848 Tj -305 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -304 TJm (compression) 50.3609 Tj -305 TJm @@ -27912,7 +25443,7 @@ f -947 TJm (Because) 33.1954 Tj -305 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -304 TJm (this,) 16.8866 Tj -319 TJm @@ -27923,12 +25454,12 @@ f (v) 4.9813 Tj 15 TJm (ery) 12.7222 Tj -72 88.5534 Td +72 88.553 Td (long) 17.7135 Tj -286 TJm (runs) 17.1556 Tj -285 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -286 TJm (repeated) 33.7433 Tj -285 TJm @@ -27936,7 +25467,7 @@ f -295 TJm (lik) 10.5205 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -286 TJm ("aabaabaabaab) 59.3771 Tj -285 TJm @@ -27944,7 +25475,7 @@ f -571 TJm (\(repeated) 37.0609 Tj -286 TJm -(se) 8.29885 Tj +(se) 8.2988 Tj 25 TJm (v) 4.9813 Tj 15 TJm @@ -27965,7 +25496,7 @@ f (slo) 11.6264 Tj 25 TJm (wly) 14.9439 Tj -72 76.5983 Td +72 76.598 Td (than) 17.1556 Tj -322 TJm (normal.) 30.7147 Tj @@ -27982,9 +25513,9 @@ f 15 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -322 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (are) 12.1643 Tj -321 TJm @@ -28013,17 +25544,10 @@ f (ratio) 18.2614 Tj -322 TJm (between) 33.1954 Tj -[1 0 0 1 72 50.8518] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28048,7 +25572,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28057,12 +25580,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28071,18 +25588,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 43.0633 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.332 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -539.395 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +539.395 50.951 Td (6) 4.9813 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28091,7 +25610,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28100,12 +25618,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28114,7 +25630,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 10 10 +%%Page: 7 10 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -28132,20 +25648,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28170,7 +25682,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28179,12 +25690,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28193,16 +25698,22 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 105.519 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -371.59 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 477.109 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Ho) 12.1743 Tj 25 TJm (w) 7.193 Tj @@ -28212,7 +25723,6 @@ q (use) 13.2801 Tj -250 TJm (bzip2) 22.1369 Tj -[1 0 0 1 266.071 747.089] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28221,7 +25731,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28230,46 +25739,42 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm -/DeviceGray {} cs -[0] sc -/DeviceGray {} CS -[0] SC -[1 0 0 1 -540 -741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (w) 7.193 Tj 10 TJm (orst-case) 35.4071 Tj -289 TJm (and) 14.386 Tj -290 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 15 TJm @@ -28279,23 +25784,23 @@ Q -290 TJm (time) 17.7135 Tj -289 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -290 TJm (in) 7.7509 Tj -289 TJm (the) 12.1743 Tj -290 TJm -(re) 7.74094 Tj +(re) 7.7409 Tj 15 TJm (gion) 17.7135 Tj -289 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -289 TJm (10:1.) 20.2042 Tj -857 TJm -(F) 5.53921 Tj +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -290 TJm (pre) 12.7222 Tj 25 TJm @@ -28311,13 +25816,13 @@ Q -289 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -290 TJm (more) 20.4731 Tj 72 698.082 Td (lik) 10.5205 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm (100:1.) 25.1855 Tj -620 TJm @@ -28330,27 +25835,19 @@ Q (use) 13.2801 Tj -250 TJm (the) 12.1743 Tj -[1 0 0 1 186.002 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -186.002 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td 186.002 698.082 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-vvvv) 29.8878 Tj -[1 0 0 1 215.889 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -215.889 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td 218.38 698.082 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (option) 25.4644 Tj -250 TJm (to) 7.7509 Tj @@ -28365,33 +25862,27 @@ Q -250 TJm (detail,) 24.6275 Tj -250 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -250 TJm (you) 14.9439 Tj -250 TJm (w) 7.193 Tj 10 TJm (ant.) 14.6649 Tj -[1 0 0 1 72 695.925] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -685.963] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 676.164 Td -/F130_0 9.9626 Tf (Decompression) 61.9773 Tj -250 TJm (speed) 22.6848 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (unaf) 17.7035 Tj 25 TJm @@ -28402,12 +25893,6 @@ Q (these) 20.4731 Tj -250 TJm (phenomena.) 48.4182 Tj -[1 0 0 1 72 674.007] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28416,27 +25901,24 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -664.045] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 654.247 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 101.888 654.247] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -101.888 -654.247] cm -[1 0 0 1 0 0] Tm -0 0 Td 104.863 654.247 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (usually) 28.782 Tj -299 TJm (allocates) 34.8591 Tj -298 TJm -(se) 8.29885 Tj +(se) 8.2988 Tj 25 TJm (v) 4.9813 Tj 15 TJm @@ -28448,7 +25930,7 @@ Q 5 TJm (abytes) 25.4544 Tj -298 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -299 TJm (memory) 33.2053 Tj -299 TJm @@ -28472,21 +25954,21 @@ Q 15 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj -299 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -298 TJm (in) 7.7509 Tj -299 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -298 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (airly) 18.2614 Tj -299 TJm (random) 30.4357 Tj 72 642.291 Td -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (ashion.) 28.503 Tj -743 TJm @@ -28508,7 +25990,7 @@ Q -271 TJm (decompressing,) 62.2563 Tj -275 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -271 TJm (lar) 10.5105 Tj 18 TJm @@ -28530,7 +26012,7 @@ Q -294 TJm (machine) 33.7533 Tj -295 TJm -(ca) 8.84679 Tj +(ca) 8.8468 Tj 1 TJm (n) 4.9813 Tj -295 TJm @@ -28542,7 +26024,7 @@ Q -442 TJm (Because) 33.1954 Tj -294 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -294 TJm (this,) 16.8866 Tj -306 TJm @@ -28566,17 +26048,17 @@ Q -294 TJm (rate) 14.9339 Tj 72 618.381 Td -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -253 TJm (been) 18.8094 Tj -253 TJm (observ) 26.5603 Tj 15 TJm -(ed) 9.40469 Tj +(ed) 9.4047 Tj -253 TJm (to) 7.7509 Tj -253 TJm @@ -28584,13 +26066,13 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -253 TJm (disproportionately) 73.0557 Tj -253 TJm (lar) 10.5105 Tj 18 TJm -(ge) 9.40469 Tj +(ge) 9.4047 Tj -253 TJm (performance) 50.341 Tj -253 TJm @@ -28600,30 +26082,22 @@ Q 15 TJm (ements.) 30.7147 Tj -639 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -253 TJm (imagine) 32.0995 Tj -[1 0 0 1 438.909 618.381] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -438.909 -618.381] cm -[1 0 0 1 0 0] Tm -0 0 Td 438.909 618.381 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 468.796 618.381] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468.796 -618.381] cm -[1 0 0 1 0 0] Tm -0 0 Td 471.318 618.381 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -253 TJm (perform) 32.0895 Tj @@ -28642,10 +26116,9 @@ Q -250 TJm (lar) 10.5105 Tj 18 TJm -(ge) 9.40469 Tj +(ge) 9.4047 Tj -250 TJm (caches.) 29.041 Tj -[1 0 0 1 72 604.269] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28674,7 +26147,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28683,11 +26155,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -594.306] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 571.673 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (2.8.) 34.4584 Tj -278 TJm (CA) 29.8309 Tj @@ -28695,7 +26164,6 @@ Q (VEA) 42.4739 Tj 90 TJm (TS) 26.4016 Tj -[1 0 0 1 72 571.415] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -28720,16 +26188,12 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -561.452] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 549.755 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (I/O) 13.2801 Tj -268 TJm (error) 19.3573 Tj @@ -28740,11 +26204,11 @@ Q -268 TJm (not) 12.7322 Tj -268 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -267 TJm (helpful) 28.224 Tj -268 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -268 TJm (the) 12.1743 Tj 15 TJm @@ -28753,27 +26217,19 @@ Q (could) 22.1369 Tj -268 TJm (be.) 11.8953 Tj -[1 0 0 1 293.313 549.755] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -293.313 -549.755] cm -[1 0 0 1 0 0] Tm -0 0 Td 293.313 549.755 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 323.201 549.755] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -323.201 -549.755] cm -[1 0 0 1 0 0] Tm -0 0 Td 325.868 549.755 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (tries) 17.1556 Tj -268 TJm (hard) 17.7035 Tj @@ -28788,13 +26244,13 @@ Q -267 TJm (and) 14.386 Tj -268 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xit) 10.5205 Tj -268 TJm (cleanly) 28.772 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -272 TJm (b) 4.9813 Tj 20 TJm @@ -28804,7 +26260,7 @@ Q 72 537.8 Td (details) 26.0123 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (what) 19.3673 Tj -250 TJm @@ -28812,7 +26268,7 @@ Q -250 TJm (problem) 33.2053 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (sometimes) 42.62 Tj -250 TJm @@ -28821,21 +26277,15 @@ Q (rather) 23.2328 Tj -250 TJm (misleading.) 46.2165 Tj -[1 0 0 1 72 535.643] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -525.681] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 515.882 Td -/F130_0 9.9626 Tf (This) 17.7135 Tj -280 TJm (manual) 29.3299 Tj @@ -28850,31 +26300,23 @@ Q 15 TJm (ersion) 24.3486 Tj -280 TJm -(1.0.5) 19.9252 Tj +(1.0.6) 19.9252 Tj -280 TJm -(of) 8.29885 Tj -[1 0 0 1 256.84 515.882] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -256.84 -515.882] cm -[1 0 0 1 0 0] Tm -0 0 Td 256.84 515.882 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 286.728 515.882] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -286.728 -515.882] cm -[1 0 0 1 0 0] Tm -0 0 Td 286.728 515.882 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -798 TJm (Compressed) 49.2551 Tj -280 TJm @@ -28890,7 +26332,7 @@ Q 15 TJm (ersion) 24.3486 Tj -280 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -280 TJm (entirely) 30.4357 Tj -279 TJm @@ -28952,7 +26394,7 @@ Q 25 TJm (wing) 19.9252 Tj -260 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xception:) 37.0808 Tj -330 TJm @@ -28964,7 +26406,7 @@ Q 15 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -260 TJm (can) 13.8281 Tj -260 TJm @@ -28988,7 +26430,7 @@ Q -250 TJm (this;) 17.1656 Tj -250 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -250 TJm (will) 15.5018 Tj -250 TJm @@ -29011,12 +26453,6 @@ Q (the) 12.1743 Tj -250 TJm (stream.) 29.0509 Tj -[1 0 0 1 72 477.86] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29025,22 +26461,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -467.897] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 458.099 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2recover) 71.7307 Tj -[1 0 0 1 143.731 458.099] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -143.731 -458.099] cm -[1 0 0 1 0 0] Tm -0 0 Td 146.174 458.099 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (v) 4.9813 Tj 15 TJm (ersions) 28.224 Tj @@ -29073,9 +26506,9 @@ Q -245 TJm (\002les,) 19.0983 Tj -246 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -245 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -245 TJm (could) 22.1369 Tj 72 446.144 Td @@ -29113,7 +26546,7 @@ Q 15 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -384 TJm (use) 13.2801 Tj -383 TJm @@ -29143,13 +26576,13 @@ Q -247 TJm (and) 14.386 Tj -245 TJm -(W) 9.40469 Tj +(W) 9.4047 Tj 40 TJm (indo) 17.7135 Tj 25 TJm (ws\).) 16.8766 Tj -309 TJm -(T) 6.08715 Tj +(T) 6.0871 Tj 80 TJm (o) 4.9813 Tj -245 TJm @@ -29157,33 +26590,25 @@ Q -245 TJm (whether) 32.0895 Tj -246 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -245 TJm (not) 12.7322 Tj -[1 0 0 1 468.269 434.189] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468.269 -434.189] cm -[1 0 0 1 0 0] Tm -0 0 Td 468.269 434.189 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2recover) 71.7307 Tj -[1 0 0 1 540 434.189] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -434.189] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 422.233 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -255 TJm (b) 4.9813 Tj 20 TJm @@ -29193,27 +26618,27 @@ Q -255 TJm (such) 18.2614 Tj -255 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -255 TJm (limitation,) 41.2452 Tj -256 TJm (run) 13.2801 Tj -255 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -255 TJm (without) 30.4457 Tj -255 TJm -(ar) 7.74094 Tj +(ar) 7.7409 Tj 18 TJm (guments.) 36.2539 Tj -325 TJm -(In) 8.29885 Tj +(In) 8.2988 Tj -255 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -256 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm @@ -29229,7 +26654,7 @@ Q -255 TJm (yourself) 32.6474 Tj -255 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -255 TJm (unlimited) 38.1966 Tj -255 TJm @@ -29237,7 +26662,7 @@ Q 15 TJm (ersion) 24.3486 Tj -255 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj 72 410.278 Td (you) 14.9439 Tj -250 TJm @@ -29245,37 +26670,29 @@ Q -250 TJm (recompile) 39.8404 Tj -250 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 176.318 410.278] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -176.318 -410.278] cm -[1 0 0 1 0 0] Tm -0 0 Td 176.318 410.278 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (MaybeUInt64) 65.7532 Tj -[1 0 0 1 242.071 410.278] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -242.071 -410.278] cm -[1 0 0 1 0 0] Tm -0 0 Td 244.562 410.278 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (set) 11.0684 Tj -250 TJm (to) 7.7509 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -250 TJm (unsigned) 35.9749 Tj -250 TJm @@ -29285,8 +26702,7 @@ Q 15 TJm (ger) 12.7222 Tj 55 TJm -(.) 2.49065 Tj -[1 0 0 1 72 408.121] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29315,7 +26731,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29324,17 +26739,13 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -398.159] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 375.525 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (2.9.) 34.4584 Tj -278 TJm (A) 14.9154 Tj 50 TJm (UTHOR) 73.441 Tj -[1 0 0 1 72 375.267] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29359,16 +26770,12 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -365.305] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 353.608 Td -/F130_0 9.9626 Tf +72 353.607 Td +/F122_0 9.9626 Tf (Julian) 23.8007 Tj -250 TJm (Se) 9.9626 Tj @@ -29376,37 +26783,27 @@ Q (w) 7.193 Tj 10 TJm (ard,) 15.2129 Tj -[1 0 0 1 132.801 353.608] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -132.801 -353.608] cm -[1 0 0 1 0 0] Tm -0 0 Td -132.801 353.608 Td -/F134_0 9.9626 Tf +132.801 353.607 Td +/F124_0 9.9626 Tf (jseward@bzip.org) 95.641 Tj -[1 0 0 1 228.443 353.608] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -156.443 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -342.111] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 331.69 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (The) 15.4918 Tj -299 TJm (ideas) 20.4731 Tj @@ -29414,31 +26811,25 @@ Q (embodied) 39.2925 Tj -299 TJm (in) 7.7509 Tj -[1 0 0 1 166.942 331.69] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -166.942 -331.69] cm -[1 0 0 1 0 0] Tm -0 0 Td 166.942 331.69 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 196.83 331.69] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -196.83 -331.69] cm -[1 0 0 1 0 0] Tm -0 0 Td 199.813 331.69 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (are) 12.1643 Tj -299 TJm -(due) 14.386 Tj --300 TJm +(du) 9.9626 Tj +-1 TJm +(e) 4.4234 Tj +-299 TJm (to) 7.7509 Tj -299 TJm (\(at) 10.5105 Tj @@ -29460,11 +26851,11 @@ Q (ws) 11.0684 Tj -299 TJm (and) 14.386 Tj --299 TJm +-300 TJm (Da) 11.6164 Tj 20 TJm (vid) 12.7322 Tj --300 TJm +-299 TJm (Wheeler) 33.7433 Tj -299 TJm (\(for) 14.9339 Tj @@ -29506,7 +26897,7 @@ Q (the) 12.1743 Tj -313 TJm (structured) 39.8404 Tj -72 307.78 Td +72 307.779 Td (coding) 27.1182 Tj -325 TJm (model) 24.9065 Tj @@ -29516,28 +26907,20 @@ Q (the) 12.1743 Tj -326 TJm (original) 30.9936 Tj -[1 0 0 1 191.156 307.779] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -191.156 -307.779] cm -[1 0 0 1 0 0] Tm -0 0 Td 191.156 307.779 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip) 23.9102 Tj -[1 0 0 1 215.067 307.779] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -215.067 -307.779] cm -[1 0 0 1 0 0] Tm -0 0 Td 215.067 307.779 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -344 TJm (and) 14.386 Tj -326 TJm @@ -29553,9 +26936,9 @@ Q -326 TJm (Mof) 17.1556 Tj 25 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm -(at,) 9.68365 Tj +(at,) 9.6836 Tj -344 TJm (Radford) 32.6474 Tj -325 TJm @@ -29565,7 +26948,7 @@ Q -325 TJm (Ian) 12.7222 Tj -326 TJm -(W) 9.40469 Tj +(W) 9.4047 Tj 40 TJm (itten) 17.7135 Tj -325 TJm @@ -29582,30 +26965,22 @@ Q (the) 12.1743 Tj -277 TJm (original) 30.9936 Tj -[1 0 0 1 214.171 295.824] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -214.171 -295.824] cm -[1 0 0 1 0 0] Tm -0 0 Td 214.171 295.824 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip) 23.9102 Tj -[1 0 0 1 238.082 295.824] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -238.082 -295.824] cm -[1 0 0 1 0 0] Tm -0 0 Td 238.082 295.824 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\).) 5.8082 Tj -782 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -277 TJm (am) 12.1743 Tj -276 TJm @@ -29649,7 +27024,7 @@ Q -330 TJm (sources) 29.8778 Tj -330 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -330 TJm (documentation.) 61.7083 Tj -1099 TJm @@ -29671,7 +27046,7 @@ Q 72 271.914 Td (for) 11.6164 Tj -271 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (aster) 18.8094 Tj -271 TJm @@ -29679,9 +27054,9 @@ Q -271 TJm (algorithms,) 45.1107 Tj -276 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -272 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -271 TJm (to) 7.7509 Tj -271 TJm @@ -29705,7 +27080,7 @@ Q 15 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -271 TJm (the) 12.1743 Tj -271 TJm @@ -29740,7 +27115,7 @@ Q (helped) 26.5603 Tj -340 TJm (with) 17.7135 Tj -72 248.004 Td +72 248.003 Td (portability) 41.5142 Tj -250 TJm (problems,) 39.5714 Tj @@ -29751,11 +27126,11 @@ Q -250 TJm (g) 4.9813 Tj 5 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm (advice) 26.0024 Tj -250 TJm @@ -29766,7 +27141,6 @@ Q (generally) 37.0708 Tj -250 TJm (helpful.) 30.7147 Tj -[1 0 0 1 72 245.847] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29775,17 +27149,10 @@ Q [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -194.995] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29810,7 +27177,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29819,12 +27185,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.5851] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29833,18 +27193,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 43.0633 -6.4855] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.332 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -539.395 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +539.395 50.951 Td (7) 4.9813 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29853,7 +27215,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29862,12 +27223,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS @@ -29876,7 +27235,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 11 11 +%%Page: 8 11 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -29894,20 +27253,12 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 4.3836 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29932,16 +27283,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29954,12 +27295,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 141.643 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -141.643 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29968,7 +27303,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -29977,35 +27311,47 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -13.9477] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 75.786 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -15.0365 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -21.5542] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -30026,35 +27372,28 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm [1 0 0 1 0 0] Tm 0 0 Td 72 701.916 Td -/F122_0 24.7902 Tf +/F116_0 24.7902 Tf (3.) 20.675 Tj -556 TJm (Pr) 26.1785 Tj 20 TJm -(ogramming) 134.983 Tj +(ogramming) 134.9826 Tj -278 TJm (with) 49.5804 Tj -[1 0 0 1 330.484 701.916] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -330.484 -701.916] cm -[1 0 0 1 0 0] Tm -0 0 Td 330.484 701.916 Td -/F392_0 24.7902 Tf +/F440_0 24.7902 Tf (libbzip2) 118.993 Tj -[1 0 0 1 449.477 701.916] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -377.477 -5.5156] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -30075,7 +27414,6 @@ Q [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -30088,16 +27426,12 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -14.9439] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -671.493] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 656.35 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (T) 10.5186 Tj 80 TJm (ab) 20.0904 Tj @@ -30107,7 +27441,6 @@ Q (of) 16.2513 Tj -278 TJm (Contents) 74.5943 Tj -[1 0 0 1 72 647.528] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -30128,19 +27461,15 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.7401] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -635.788] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 635.788 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (3.1.) 14.9439 Tj -310 TJm -(T) 6.08715 Tj +(T) 6.0871 Tj 80 TJm (op-le) 20.4731 Tj 25 TJm @@ -30149,194 +27478,174 @@ Q (el) 7.193 Tj -250 TJm (structure) 34.8591 Tj -[1 0 0 1 164.921 635.788] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -169.902 -635.788] cm -[1 0 0 1 0 0] Tm -0 0 Td 179.997 635.788 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 635.788] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -635.788] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 635.788 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (8) 4.9813 Tj -[1 0 0 1 516.09 635.788] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -30353,16 +27662,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -623.832] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 623.832 Td -/F130_0 9.9626 Tf (3.1.1.) 22.4159 Tj -310 TJm (Lo) 11.0684 Tj @@ -30374,188 +27686,168 @@ Q (el) 7.193 Tj -250 TJm (summary) 37.0808 Tj -[1 0 0 1 177.374 623.832] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -182.355 -623.832] cm -[1 0 0 1 0 0] Tm -0 0 Td 192.866 623.832 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 623.832] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -623.832] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 623.832 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (9) 4.9813 Tj -[1 0 0 1 516.09 623.832] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1569] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -30568,16 +27860,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -611.877] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 611.877 Td -/F130_0 9.9626 Tf (3.1.2.) 22.4159 Tj -310 TJm (High-le) 30.4357 Tj @@ -30587,188 +27882,168 @@ Q (el) 7.193 Tj -250 TJm (summary) 37.0808 Tj -[1 0 0 1 179.287 611.877] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -184.268 -611.877] cm -[1 0 0 1 0 0] Tm -0 0 Td 193.822 611.877 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 611.877] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -611.877] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 611.877 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (9) 4.9813 Tj -[1 0 0 1 516.09 611.877] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -30781,16 +28056,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -599.922] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 599.922 Td -/F130_0 9.9626 Tf (3.1.3.) 22.4159 Tj -310 TJm (Utility) 26.0223 Tj @@ -30798,178 +28076,158 @@ Q (functions) 37.0808 Tj -250 TJm (summary) 37.0808 Tj -[1 0 0 1 202.669 599.922] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -207.65 -599.922] cm -[1 0 0 1 0 0] Tm -0 0 Td 216.582 599.922 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 511.108 599.922] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.108 -599.922] cm -[1 0 0 1 0 0] Tm -0 0 Td 511.108 599.922 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (9) 4.9813 Tj -[1 0 0 1 516.09 599.922] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -30986,215 +28244,198 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -587.967] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 587.967 Td -/F130_0 9.9626 Tf (3.2.) 14.9439 Tj -310 TJm (Error) 21.0211 Tj -250 TJm (handling) 34.8691 Tj -[1 0 0 1 148.413 587.967] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -153.394 -587.967] cm -[1 0 0 1 0 0] Tm -0 0 Td 162.611 587.967 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 587.967] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -587.967] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 587.967 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (10) 9.9626 Tj -[1 0 0 1 516.09 587.967] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1569] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -31207,16 +28448,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -576.012] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 576.012 Td -/F130_0 9.9626 Tf (3.3.) 14.9439 Tj -310 TJm (Lo) 11.0684 Tj @@ -31230,192 +28474,172 @@ Q (interf) 21.579 Tj 10 TJm (ace) 13.2702 Tj -[1 0 0 1 167.571 576.012] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -172.552 -576.012] cm -[1 0 0 1 0 0] Tm -0 0 Td 181.045 576.012 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 576.012] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -576.012] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 576.012 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (11) 9.9626 Tj -[1 0 0 1 516.09 576.012] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -0.0995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -31432,29 +28656,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.8557] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -564.056] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 564.056 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 564.057 Td (3.3.1.) 22.4159 Tj -[1 0 0 1 97.5043 564.056] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -564.056] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 564.056 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 205.101 564.056] cm +-310 TJm +(BZ2_bzCompressInit) 85.7879 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -31463,169 +28680,156 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +197.762 564.057 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -210.082 -564.056] cm -[1 0 0 1 0 0] Tm -0 0 Td -219.736 564.056 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 564.056] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -564.056] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 564.056 Td -/F130_0 9.9626 Tf +506.127 564.057 Td +/F122_0 9.9626 Tf (11) 9.9626 Tj -[1 0 0 1 516.09 564.056] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5341] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -31638,29 +28842,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -552.101] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 552.101 Td -/F130_0 9.9626 Tf (3.3.2.) 22.4159 Tj -[1 0 0 1 97.5043 552.101] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -552.101] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 552.101 Td -/F134_0 9.9626 Tf -(BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 181.19 552.101] cm +-310 TJm +(BZ2_bzCompress) 71.9499 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -31669,181 +28866,162 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +184.201 552.101 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -186.172 -552.101] cm -[1 0 0 1 0 0] Tm -0 0 Td -194.497 552.101 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 552.101] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -552.101] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 552.101 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (13) 9.9626 Tj -[1 0 0 1 516.09 552.101] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -31856,29 +29034,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -540.146] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 540.146 Td -/F130_0 9.9626 Tf (3.3.3.) 22.4159 Tj -[1 0 0 1 97.5043 540.146] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -540.146] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 540.146 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressEnd) 101.619 Tj -[1 0 0 1 199.123 540.146] cm +-310 TJm +(BZ2_bzCompressEnd) 87.9996 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -31887,171 +29058,156 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +198.868 540.146 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -204.105 -540.146] cm -[1 0 0 1 0 0] Tm -0 0 Td -214.533 540.146 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 540.146] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -540.146] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 540.146 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (16) 9.9626 Tj -[1 0 0 1 516.09 540.146] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -32064,29 +29220,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -528.191] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 528.191 Td -/F130_0 9.9626 Tf (3.3.4.) 22.4159 Tj -[1 0 0 1 97.5043 528.191] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -528.191] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 528.191 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompressInit) 119.551 Tj -[1 0 0 1 217.056 528.191] cm +-310 TJm +(BZ2_bzDecompressInit) 95.1827 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -32095,163 +29244,152 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +206.887 528.191 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -222.037 -528.191] cm -[1 0 0 1 0 0] Tm -0 0 Td -232.355 528.191 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 528.191] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -528.191] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 528.191 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (16) 9.9626 Tj -[1 0 0 1 516.09 528.191] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5341] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -32264,29 +29402,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -516.236] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 516.236 Td -/F130_0 9.9626 Tf (3.3.5.) 22.4159 Tj -[1 0 0 1 97.5043 516.236] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -516.236] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 516.236 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 193.146 516.236] cm +-310 TJm +(BZ2_bzDecompress) 81.3446 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -32295,175 +29426,158 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +193.326 516.236 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -198.127 -516.236] cm -[1 0 0 1 0 0] Tm -0 0 Td -207.116 516.236 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 516.236] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -516.236] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 516.236 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (17) 9.9626 Tj -[1 0 0 1 516.09 516.236] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -32476,29 +29590,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -504.281] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 504.281 Td -/F130_0 9.9626 Tf (3.3.6.) 22.4159 Tj -[1 0 0 1 97.5043 504.281] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -504.281] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 504.281 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompressEnd) 113.574 Tj -[1 0 0 1 211.078 504.281] cm +-310 TJm +(BZ2_bzDecompressEnd) 97.3944 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -32507,167 +29614,150 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +210.207 504.281 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -216.06 -504.281] cm -[1 0 0 1 0 0] Tm -0 0 Td -224.938 504.281 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 504.281] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -504.281] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 504.281 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (18) 9.9626 Tj -[1 0 0 1 516.09 504.281] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -32684,16 +29774,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -492.325] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 492.325 Td -/F130_0 9.9626 Tf (3.4.) 14.9439 Tj -310 TJm (High-le) 30.4357 Tj @@ -32705,190 +29798,170 @@ Q (interf) 21.579 Tj 10 TJm (ace) 13.2702 Tj -[1 0 0 1 169.483 492.325] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -174.465 -492.325] cm -[1 0 0 1 0 0] Tm -0 0 Td 184.216 492.325 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 492.325] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -492.325] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 492.325 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (18) 9.9626 Tj -[1 0 0 1 516.09 492.325] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -32905,29 +29978,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -480.37] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 480.37 Td -/F130_0 9.9626 Tf (3.4.1.) 22.4159 Tj -[1 0 0 1 97.5043 480.37] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -480.37] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 480.37 Td -/F134_0 9.9626 Tf -(BZ2_bzReadOpen) 83.6858 Tj -[1 0 0 1 181.19 480.37] cm +-310 TJm +(BZ2_bzReadOpen) 74.1516 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -32936,181 +30002,162 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +185.302 480.37 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -186.172 -480.37] cm -[1 0 0 1 0 0] Tm -0 0 Td -194.497 480.37 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 480.37] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -480.37] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 480.37 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (19) 9.9626 Tj -[1 0 0 1 516.09 480.37] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -33123,29 +30170,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -468.415] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 468.415 Td -/F130_0 9.9626 Tf (3.4.2.) 22.4159 Tj -[1 0 0 1 97.5043 468.415] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -468.415] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 468.415 Td -/F134_0 9.9626 Tf -(BZ2_bzRead) 59.7756 Tj -[1 0 0 1 157.28 468.415] cm +-310 TJm +(BZ2_bzRead) 52.5726 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -33154,191 +30194,172 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +163.443 468.415 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -162.261 -468.415] cm -[1 0 0 1 0 0] Tm -0 0 Td -171.472 468.415 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 468.415] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -468.415] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 468.415 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (20) 9.9626 Tj -[1 0 0 1 516.09 468.415] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -33351,29 +30372,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.6452] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -456.46] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 456.46 Td -/F130_0 9.9626 Tf (3.4.3.) 22.4159 Tj -[1 0 0 1 97.5043 456.46] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -456.46] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 456.46 Td -/F134_0 9.9626 Tf -(BZ2_bzReadGetUnused) 113.574 Tj -[1 0 0 1 211.078 456.46] cm +-310 TJm +(BZ2_bzReadGetUnused) 97.3944 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -33382,167 +30396,150 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +210.207 456.46 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -216.06 -456.46] cm -[1 0 0 1 0 0] Tm -0 0 Td -224.938 456.46 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 456.46] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -456.46] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 456.46 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (21) 9.9626 Tj -[1 0 0 1 516.09 456.46] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -33555,29 +30552,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.6452] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -444.505] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 444.505 Td -/F130_0 9.9626 Tf (3.4.4.) 22.4159 Tj -[1 0 0 1 97.5043 444.505] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -444.505] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 444.505 Td -/F134_0 9.9626 Tf -(BZ2_bzReadClose) 89.6634 Tj -[1 0 0 1 187.168 444.505] cm +-310 TJm +(BZ2_bzReadClose) 75.2674 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -33586,177 +30576,160 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +188.074 444.505 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -192.149 -444.505] cm -[1 0 0 1 0 0] Tm -0 0 Td -201.914 444.505 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 444.505] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -444.505] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 444.505 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (22) 9.9626 Tj -[1 0 0 1 516.09 444.505] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -33769,29 +30742,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.6451] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -432.55] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 432.55 Td -/F130_0 9.9626 Tf (3.4.5.) 22.4159 Tj -[1 0 0 1 97.5043 432.55] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -432.55] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 432.55 Td -/F134_0 9.9626 Tf -(BZ2_bzWriteOpen) 89.6634 Tj -[1 0 0 1 187.168 432.55] cm +-310 TJm +(BZ2_bzWriteOpen) 76.3633 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -33800,177 +30766,160 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +188.622 432.55 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -192.149 -432.55] cm -[1 0 0 1 0 0] Tm -0 0 Td -201.914 432.55 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 432.55] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -432.55] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 432.55 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (22) 9.9626 Tj -[1 0 0 1 516.09 432.55] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -33983,29 +30932,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -420.594] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 420.594 Td -/F130_0 9.9626 Tf (3.4.6.) 22.4159 Tj -[1 0 0 1 97.5043 420.594] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -420.594] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 420.594 Td -/F134_0 9.9626 Tf -(BZ2_bzWrite) 65.7532 Tj -[1 0 0 1 163.258 420.594] cm +-310 TJm +(BZ2_bzWrite) 54.7843 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -34014,189 +30956,170 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +166.763 420.594 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -168.239 -420.594] cm -[1 0 0 1 0 0] Tm -0 0 Td -176.675 420.594 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 420.594] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -420.594] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 420.594 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (23) 9.9626 Tj -[1 0 0 1 516.09 420.594] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -34209,29 +31132,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.6452] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -408.639] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 408.639 Td -/F130_0 9.9626 Tf (3.4.7.) 22.4159 Tj -[1 0 0 1 97.5043 408.639] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -408.639] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 408.639 Td -/F134_0 9.9626 Tf -(BZ2_bzWriteClose) 95.641 Tj -[1 0 0 1 193.146 408.639] cm +-310 TJm +(BZ2_bzWriteClose) 77.4791 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -34240,175 +31156,160 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +189.179 408.639 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -198.127 -408.639] cm -[1 0 0 1 0 0] Tm -0 0 Td -207.116 408.639 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 408.639] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -408.639] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 408.639 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (23) 9.9626 Tj -[1 0 0 1 516.09 408.639] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -34421,16 +31322,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.6451] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -396.684] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 396.684 Td -/F130_0 9.9626 Tf (3.4.8.) 22.4159 Tj -310 TJm (Handling) 37.0808 Tj @@ -34442,140 +31346,120 @@ Q (data) 16.5977 Tj -250 TJm (streams) 30.4357 Tj -[1 0 0 1 279.56 396.684] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -284.541 -396.684] cm -[1 0 0 1 0 0] Tm -0 0 Td 294.601 396.684 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 396.684] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -396.684] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 396.684 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (24) 9.9626 Tj -[1 0 0 1 516.09 396.684] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -34588,16 +31472,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -384.729] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 384.729 Td -/F130_0 9.9626 Tf (3.4.9.) 22.4159 Tj -310 TJm (Standard) 35.417 Tj @@ -34605,162 +31492,142 @@ Q (\002le-reading/writing) 77.4791 Tj -250 TJm (code) 18.8094 Tj -[1 0 0 1 234.19 384.729] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -239.172 -384.729] cm -[1 0 0 1 0 0] Tm -0 0 Td 247.564 384.729 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 384.729] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -384.729] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 384.729 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (25) 9.9626 Tj -[1 0 0 1 516.09 384.729] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -34777,211 +31644,194 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -372.774] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 372.774 Td -/F130_0 9.9626 Tf (3.5.) 14.9439 Tj -310 TJm (Utility) 26.0223 Tj -250 TJm (functions) 37.0808 Tj -[1 0 0 1 155.625 372.774] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -160.607 -372.774] cm -[1 0 0 1 0 0] Tm -0 0 Td 170.645 372.774 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 372.774] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -372.774] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 372.774 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (26) 9.9626 Tj -[1 0 0 1 516.09 372.774] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -34998,29 +31848,28 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -360.819] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 360.819 Td -/F130_0 9.9626 Tf (3.5.1.) 22.4159 Tj -[1 0 0 1 97.5043 360.819] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -360.819] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 360.819 Td -/F134_0 9.9626 Tf -(BZ2_bzBuffToBuffCompress) 143.461 Tj -[1 0 0 1 240.966 360.819] cm +-310 TJm +(BZ2_bzBuf) 47.0434 Tj +25 TJm +(fT) 9.4047 Tj +80 TJm +(oBuf) 19.9252 Tj +25 TJm +(fCompress) 43.1679 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -35029,153 +31878,142 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +229.488 360.819 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -245.948 -360.819] cm -[1 0 0 1 0 0] Tm -0 0 Td -255.38 360.819 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 360.819] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -360.819] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 360.819 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (26) 9.9626 Tj -[1 0 0 1 516.09 360.819] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -35188,29 +32026,28 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -348.863] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 348.863 Td -/F130_0 9.9626 Tf (3.5.2.) 22.4159 Tj -[1 0 0 1 97.5043 348.863] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -97.5043 -348.863] cm -[1 0 0 1 0 0] Tm -0 0 Td -97.5043 348.863 Td -/F134_0 9.9626 Tf -(BZ2_bzBuffToBuffDecompress) 155.417 Tj -[1 0 0 1 252.922 348.863] cm +-310 TJm +(BZ2_bzBuf) 47.0434 Tj +25 TJm +(fT) 9.4047 Tj +80 TJm +(oBuf) 19.9252 Tj +25 TJm +(fDecompress) 52.5627 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -35219,147 +32056,138 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +238.613 348.863 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -257.903 -348.863] cm -[1 0 0 1 0 0] Tm -0 0 Td -267.999 348.863 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 348.863] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -348.863] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 348.863 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (27) 9.9626 Tj -[1 0 0 1 516.09 348.863] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -1.5342] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -35376,207 +32204,176 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -10.421] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -336.908] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 336.908 Td -/F130_0 9.9626 Tf (3.6.) 14.9439 Tj -[1 0 0 1 90.0324 336.908] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -90.0324 -336.908] cm -[1 0 0 1 0 0] Tm -0 0 Td -90.0324 336.908 Td -/F134_0 9.9626 Tf -(zlib) 23.9102 Tj -[1 0 0 1 113.943 336.908] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -113.943 -336.908] cm -[1 0 0 1 0 0] Tm -0 0 Td -116.433 336.908 Td -/F130_0 9.9626 Tf +-310 TJm +(zlib) 14.9439 Tj +-250 TJm (compatibility) 53.1405 Tj -250 TJm (functions) 37.0808 Tj -[1 0 0 1 209.144 336.908] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -214.126 -336.908] cm -[1 0 0 1 0 0] Tm -0 0 Td -223.971 336.908 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +215.06 336.908 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 336.908] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -336.908] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 336.908 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (28) 9.9626 Tj -[1 0 0 1 516.09 336.908] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -35589,16 +32386,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -324.953] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 324.953 Td -/F130_0 9.9626 Tf (3.7.) 14.9439 Tj -310 TJm (Using) 23.8007 Tj @@ -35609,169 +32409,133 @@ Q -250 TJm (in) 7.7509 Tj -250 TJm -(a) 4.42339 Tj -[1 0 0 1 177.195 324.953] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -177.195 -324.953] cm -[1 0 0 1 0 0] Tm -0 0 Td -177.195 324.953 Td -/F134_0 9.9626 Tf -(stdio) 29.8878 Tj -[1 0 0 1 207.083 324.953] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -207.083 -324.953] cm -[1 0 0 1 0 0] Tm -0 0 Td -207.083 324.953 Td -/F130_0 9.9626 Tf -(-free) 18.7994 Tj +(a) 4.4234 Tj -250 TJm -(en) 9.40469 Tj +(stdio-free) 38.1767 Tj +-250 TJm +(en) 9.4047 Tj 40 TJm (vironment) 40.9562 Tj -[1 0 0 1 278.335 324.953] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -283.316 -324.953] cm -[1 0 0 1 0 0] Tm -0 0 Td -291.775 324.953 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +282.092 324.953 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 324.953] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -324.953] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 324.953 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (28) 9.9626 Tj -[1 0 0 1 516.09 324.953] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1569] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -35788,35 +32552,28 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -312.998] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 312.998 Td -/F130_0 9.9626 Tf (3.7.1.) 22.4159 Tj -310 TJm (Getting) 29.8878 Tj -250 TJm (rid) 11.0684 Tj -250 TJm -(of) 8.29885 Tj -[1 0 0 1 154.231 312.998] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -154.231 -312.998] cm -[1 0 0 1 0 0] Tm -0 0 Td -154.231 312.998 Td -/F134_0 9.9626 Tf -(stdio) 29.8878 Tj -[1 0 0 1 184.119 312.998] cm +(of) 8.2988 Tj +-250 TJm +(stdio) 19.3773 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -35825,179 +32582,160 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm +188.492 312.998 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -189.1 -312.998] cm -[1 0 0 1 0 0] Tm -0 0 Td -198.175 312.998 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 312.998] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -506.127 -312.998] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 312.998 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (29) 9.9626 Tj -[1 0 0 1 516.09 312.998] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -36010,16 +32748,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -301.043] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 301.043 Td -/F130_0 9.9626 Tf (3.7.2.) 22.4159 Tj -310 TJm (Critical) 29.8878 Tj @@ -36027,182 +32768,162 @@ Q (error) 19.3573 Tj -250 TJm (handling) 34.8691 Tj -[1 0 0 1 186.599 301.043] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -191.58 -301.043] cm -[1 0 0 1 0 0] Tm -0 0 Td 201.629 301.043 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 301.043] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -301.043] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 301.043 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (29) 9.9626 Tj -[1 0 0 1 516.09 301.043] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -36219,196 +32940,188 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -289.088] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 289.088 Td -/F130_0 9.9626 Tf (3.8.) 14.9439 Tj -310 TJm (Making) 30.9936 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm -(W) 9.40469 Tj +(W) 9.4047 Tj 40 TJm (indo) 17.7135 Tj 25 TJm (ws) 11.0684 Tj -250 TJm (DLL) 19.3673 Tj -[1 0 0 1 189.828 289.088] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -194.809 -289.088] cm -[1 0 0 1 0 0] Tm -0 0 Td 203.243 289.088 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 289.088] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -289.088] cm -[1 0 0 1 0 0] Tm -0 0 Td 506.127 289.088 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (29) 9.9626 Tj -[1 0 0 1 516.09 289.088] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -36417,26 +33130,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -444.09 -2.1569] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -267.006] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 257.207 Td -/F130_0 9.9626 Tf (This) 17.7135 Tj -250 TJm (chapter) 29.3199 Tj @@ -36452,46 +33158,32 @@ Q (ace) 13.2702 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 282.448 257.207] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -282.448 -257.207] cm -[1 0 0 1 0 0] Tm -0 0 Td 282.448 257.207 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 330.269 257.207] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -330.269 -257.207] cm -[1 0 0 1 0 0] Tm -0 0 Td 330.269 257.207 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 255.05] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -245.088] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 235.289 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -273 TJm (general) 29.3199 Tj -272 TJm @@ -36517,7 +33209,7 @@ Q 50 TJm (d) 4.9813 Tj -272 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -273 TJm (well) 17.1556 Tj -273 TJm @@ -36526,16 +33218,15 @@ Q (to) 7.7509 Tj -250 TJm (read) 17.1456 Tj -[1 0 0 1 101.878 223.334] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -101.878 -223.334] cm -[1 0 0 1 0 0] Tm -0 0 Td -101.878 223.334 Td -/F130_0 9.9626 Tf +-250 TJm (Ho) 12.1743 Tj 25 TJm (w) 7.193 Tj @@ -36545,7 +33236,10 @@ Q (use) 13.2801 Tj -250 TJm (bzip2) 22.1369 Tj -[1 0 0 1 171.636 223.334] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -36558,13 +33252,8 @@ Q [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -171.636 -223.334] cm -[1 0 0 1 0 0] Tm -0 0 Td -174.126 223.334 Td -/F130_0 9.9626 Tf +-250 TJm ([2]) 11.6164 Tj -[1 0 0 1 185.743 223.334] cm /DeviceRGB {} cs [0 0 1] sc /DeviceRGB {} CS @@ -36573,15 +33262,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -185.743 -223.334] cm -[1 0 0 1 0 0] Tm -0 0 Td -188.233 223.334 Td -/F130_0 9.9626 Tf -(as) 8.29885 Tj +-250 TJm +(as) 8.2988 Tj -250 TJm (well.) 19.6462 Tj -[1 0 0 1 72 221.177] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS @@ -36606,7 +33290,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -36615,11 +33298,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -211.215] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 188.581 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (3.1.) 34.4584 Tj -278 TJm (T) 12.6223 Tj @@ -36629,7 +33309,6 @@ Q (vel) 28.7153 Tj -278 TJm (structure) 89.5339 Tj -[1 0 0 1 72 184.305] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -36654,7 +33333,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -36663,25 +33341,18 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -174.343] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 166.664 Td -/F134_0 9.9626 Tf +72 166.663 Td +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 119.821 166.664] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -119.821 -166.664] cm -[1 0 0 1 0 0] Tm -0 0 Td -123.608 166.664 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +123.608 166.663 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -380 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -380 TJm (\003e) 9.9626 Tj 15 TJm @@ -36702,27 +33373,19 @@ Q (in) 7.7509 Tj -380 TJm (the) 12.1743 Tj -[1 0 0 1 405.291 166.664] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -405.291 -166.664] cm -[1 0 0 1 0 0] Tm -0 0 Td -405.291 166.664 Td -/F134_0 9.9626 Tf +405.291 166.663 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 435.178 166.664] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -435.178 -166.664] cm -[1 0 0 1 0 0] Tm -0 0 Td -438.966 166.664 Td -/F130_0 9.9626 Tf +438.966 166.663 Td +/F122_0 9.9626 Tf (data) 16.5977 Tj -380 TJm (format.) 29.0509 Tj @@ -36731,23 +33394,23 @@ Q 72 154.708 Td (packaged) 37.6188 Tj -285 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -284 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -285 TJm (single) 23.8007 Tj -285 TJm (entity) 22.6948 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -293 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -285 TJm (helps) 21.031 Tj -285 TJm (to) 7.7509 Tj -284 TJm -(re) 7.74094 Tj +(re) 7.7409 Tj 15 TJm (g) 4.9813 Tj 5 TJm @@ -36757,7 +33420,7 @@ Q -285 TJm (library) 26.5603 Tj -284 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -285 TJm (three) 19.9152 Tj -285 TJm @@ -36804,56 +33467,42 @@ Q (utility) 23.8106 Tj -250 TJm (functions.) 39.5714 Tj -[1 0 0 1 72 140.596] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -130.634] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 120.835 Td -/F130_0 9.9626 Tf (The) 15.4918 Tj -349 TJm (structure) 34.8591 Tj -349 TJm -(of) 8.29885 Tj -[1 0 0 1 141.082 120.835] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -141.082 -120.835] cm -[1 0 0 1 0 0] Tm -0 0 Td 141.082 120.835 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 188.903 120.835] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -188.903 -120.835] cm -[1 0 0 1 0 0] Tm -0 0 Td 188.903 120.835 Td -/F130_0 9.9626 Tf -(') 3.31755 Tj +/F122_0 9.9626 Tf +(') 3.3175 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -349 TJm (interf) 21.579 Tj 10 TJm (aces) 17.1456 Tj -349 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -349 TJm (similar) 27.6761 Tj -349 TJm @@ -36861,13 +33510,13 @@ Q -349 TJm (that) 14.9439 Tj -349 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -349 TJm (Jean-loup) 38.7346 Tj -349 TJm (Gailly') 28.224 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -349 TJm (and) 14.386 Tj -349 TJm @@ -36875,53 +33524,39 @@ Q -349 TJm (Adler') 26.0024 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -349 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xcellent) 31.5416 Tj -[1 0 0 1 516.09 120.835] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -516.09 -120.835] cm -[1 0 0 1 0 0] Tm -0 0 Td 516.09 120.835 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (zlib) 23.9102 Tj -[1 0 0 1 540 120.835] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -120.835] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 108.88 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (library) 26.5603 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 106.723] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -96.7608] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 86.9624 Td -/F130_0 9.9626 Tf +72 86.962 Td (All) 12.7322 Tj -242 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xternally) 35.417 Tj -242 TJm @@ -36929,45 +33564,37 @@ Q -241 TJm (symbols) 33.2153 Tj -242 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -242 TJm (names) 25.4544 Tj -242 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj 15 TJm (ginning) 30.4457 Tj -[1 0 0 1 284.687 86.9624] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -284.687 -86.9624] cm -[1 0 0 1 0 0] Tm -0 0 Td -284.687 86.9624 Td -/F134_0 9.9626 Tf +284.687 86.962 Td +/F124_0 9.9626 Tf (BZ2_) 23.9102 Tj -[1 0 0 1 308.597 86.9624] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -308.597 -86.9624] cm -[1 0 0 1 0 0] Tm -0 0 Td -308.597 86.9624 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +308.597 86.962 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj -615 TJm (This) 17.7135 Tj -241 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -242 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 25 TJm (w) 7.193 Tj -242 TJm @@ -36983,41 +33610,33 @@ Q -242 TJm (intention) 35.427 Tj -242 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -241 TJm (to) 7.7509 Tj -242 TJm (minimise) 37.0908 Tj -72 75.0073 Td +72 75.007 Td (pollution) 35.9849 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm (namespaces) 47.5814 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (library) 26.5603 Tj -250 TJm (clients.) 28.503 Tj -[1 0 0 1 72 72.8505] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -21.9987] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 4.3836 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37042,7 +33661,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37051,12 +33669,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37065,18 +33677,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 43.0633 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -498.225 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -541.288 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +541.288 50.951 Td (8) 4.9813 Tj -[1 0 0 1 455.161 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37085,7 +33699,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5986 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37094,12 +33707,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -15.0366 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37108,7 +33719,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 12 12 +%%Page: 9 12 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -37126,20 +33737,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 4.3836 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37164,7 +33771,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37173,12 +33779,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37187,36 +33787,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -344.462 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 420.96 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 498.449 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -498.449 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 498.449 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 546.269 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37225,7 +33821,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37234,98 +33829,88 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 75.786 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -15.0365 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -21.5542] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F130_0 9.9626 Tf -(T) 6.08715 Tj +/F122_0 9.9626 Tf +(T) 6.0871 Tj 80 TJm (o) 4.9813 Tj -250 TJm (use) 13.2801 Tj -250 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -250 TJm (part) 15.4918 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm (library) 26.5603 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -250 TJm (you) 14.9439 Tj -250 TJm (need) 18.8094 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 240.567 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -240.567 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 240.567 710.037 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (#include) 47.8205 Tj -600 TJm () 53.798 Tj -[1 0 0 1 348.163 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -348.163 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 350.654 710.037 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (into) 15.5018 Tj -250 TJm (your) 18.2614 Tj -250 TJm (sources.) 32.3685 Tj -[1 0 0 1 72 707.88] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37350,7 +33935,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37359,11 +33943,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -697.918] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 679.416 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.1.1.) 43.0729 Tj -278 TJm (Lo) 21.0372 Tj @@ -37374,8 +33955,7 @@ Q -278 TJm (summar) 66.9679 Tj -10 TJm -(y) 9.57176 Tj -[1 0 0 1 72 675.853] cm +(y) 9.5718 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -37400,16 +33980,12 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -665.89] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 657.498 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (This) 17.7135 Tj -212 TJm (interf) 21.579 Tj @@ -37438,11 +34014,11 @@ Q -212 TJm (memory) 33.2053 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -595 TJm (There') 26.5503 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -212 TJm (no) 9.9626 Tj -212 TJm @@ -37460,9 +34036,9 @@ Q -220 TJm (streams) 30.4357 Tj -213 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -213 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -213 TJm @@ -37482,9 +34058,9 @@ Q 10 TJm (ork.) 15.7708 Tj -595 TJm -(In) 8.29885 Tj +(In) 8.2988 Tj -213 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (act,) 14.107 Tj -221 TJm @@ -37492,7 +34068,7 @@ Q -213 TJm (part) 15.4918 Tj -213 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -213 TJm (the) 12.1743 Tj -213 TJm @@ -37500,7 +34076,7 @@ Q 72 633.588 Td (can) 13.8281 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (compiled) 37.0808 Tj -250 TJm @@ -37508,35 +34084,27 @@ Q -250 TJm (inclusion) 36.5329 Tj -250 TJm -(of) 8.29885 Tj -[1 0 0 1 222.534 633.588] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -222.534 -633.588] cm -[1 0 0 1 0 0] Tm -0 0 Td 222.534 633.588 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (stdio.h) 41.8429 Tj -[1 0 0 1 264.377 633.588] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -264.377 -633.588] cm -[1 0 0 1 0 0] Tm -0 0 Td 264.377 633.588 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -250 TJm (which) 24.3486 Tj -250 TJm (may) 17.1556 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (helpful) 28.224 Tj -250 TJm @@ -37545,21 +34113,15 @@ Q (embedded) 40.9463 Tj -250 TJm (applications.) 50.6399 Tj -[1 0 0 1 72 631.431] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -621.469] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 611.67 Td -/F130_0 9.9626 Tf (The) 15.4918 Tj -250 TJm (lo) 7.7509 Tj @@ -37572,7 +34134,7 @@ Q -250 TJm (part) 15.4918 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm @@ -37590,33 +34152,27 @@ Q -250 TJm (and) 14.386 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (therefore) 35.955 Tj -250 TJm (thread-safe.) 46.7445 Tj -[1 0 0 1 72 609.513] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -599.551] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 589.752 Td -/F130_0 9.9626 Tf (Six) 13.2901 Tj -875 TJm (routines) 32.0995 Tj -876 TJm (mak) 17.1556 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -875 TJm (up) 9.9626 Tj -876 TJm @@ -37635,177 +34191,121 @@ Q (interf) 21.579 Tj 10 TJm (ace:) 16.0398 Tj -[1 0 0 1 308.791 589.752] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -308.791 -589.752] cm -[1 0 0 1 0 0] Tm -0 0 Td 308.791 589.752 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 416.387 589.752] cm +/F124_0 9.9626 Tf +(BZ2_bzCompressInit) 107.5961 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -416.387 -589.752] cm -[1 0 0 1 0 0] Tm -0 0 Td 416.387 589.752 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 429.158 589.752] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -429.158 -589.752] cm -[1 0 0 1 0 0] Tm -0 0 Td 429.158 589.752 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 512.844 589.752] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -512.844 -589.752] cm -[1 0 0 1 0 0] Tm -0 0 Td 512.844 589.752 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -1032 TJm (and) 14.386 Tj -[1 0 0 1 72 577.797] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -577.797] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 577.797 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressEnd) 101.619 Tj -[1 0 0 1 173.619 577.797] cm +/F124_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -173.619 -577.797] cm -[1 0 0 1 0 0] Tm -0 0 Td 186.15 577.797 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (for) 11.6164 Tj -1258 TJm (compression,) 52.8516 Tj -1510 TJm (and) 14.386 Tj -1257 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -1258 TJm (corresponding) 56.996 Tj -1258 TJm (trio) 13.8381 Tj -[1 0 0 1 417.958 577.797] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -417.958 -577.797] cm -[1 0 0 1 0 0] Tm -0 0 Td 417.958 577.797 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompressInit) 119.551 Tj -[1 0 0 1 537.509 577.797] cm +/F124_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.5512 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -537.509 -577.797] cm -[1 0 0 1 0 0] Tm -0 0 Td 537.509 577.797 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 72 565.842] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -565.842] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 565.842 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 167.641 565.842] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -167.641 -565.842] cm -[1 0 0 1 0 0] Tm -0 0 Td 172.707 565.842 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 192.158 565.842] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -192.158 -565.842] cm -[1 0 0 1 0 0] Tm -0 0 Td 192.158 565.842 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompressEnd) 113.574 Tj -[1 0 0 1 305.732 565.842] cm +/F124_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.5736 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -305.732 -565.842] cm -[1 0 0 1 0 0] Tm -0 0 Td 310.798 565.842 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (for) 11.6164 Tj -508 TJm (decompression.) 62.2563 Tj -2171 TJm (The) 15.4918 Tj -[1 0 0 1 431.918 565.842] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -431.918 -565.842] cm -[1 0 0 1 0 0] Tm -0 0 Td 431.918 564.099 Td -/F134_0 9.9626 Tf -(*) 5.97756 Tj +/F124_0 9.9626 Tf +(*) 5.9776 Tj 437.895 565.842 Td (Init) 23.9102 Tj -[1 0 0 1 461.805 565.842] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -461.805 -565.842] cm -[1 0 0 1 0 0] Tm -0 0 Td 466.871 565.842 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (functions) 37.0808 Tj -508 TJm (allocate) 30.9837 Tj @@ -37814,7 +34314,7 @@ Q -574 TJm (for) 11.6164 Tj -573 TJm -(compression/decompression) 112.896 Tj +(compression/decompression) 112.8962 Tj -574 TJm (and) 14.386 Tj -574 TJm @@ -37827,29 +34327,21 @@ Q (whilst) 24.3586 Tj -574 TJm (the) 12.1743 Tj -[1 0 0 1 419.502 553.887] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -419.502 -553.887] cm -[1 0 0 1 0 0] Tm -0 0 Td -419.502 552.144 Td -/F134_0 9.9626 Tf -(*) 5.97756 Tj +419.503 552.143 Td +/F124_0 9.9626 Tf +(*) 5.9776 Tj 425.48 553.887 Td (End) 17.9327 Tj -[1 0 0 1 443.413 553.887] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -443.413 -553.887] cm -[1 0 0 1 0 0] Tm -0 0 Td 449.128 553.887 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (functions) 37.0808 Tj -574 TJm (close) 20.4731 Tj @@ -37866,22 +34358,16 @@ Q -250 TJm (memory) 33.2053 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 539.775] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -529.812] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 520.014 Td -/F130_0 9.9626 Tf (The) 15.4918 Tj -303 TJm (real) 14.9339 Tj @@ -37890,55 +34376,39 @@ Q 10 TJm (ork) 13.2801 Tj -303 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -303 TJm (done) 19.3673 Tj -303 TJm (by) 9.9626 Tj -[1 0 0 1 176.892 520.014] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -176.892 -520.014] cm -[1 0 0 1 0 0] Tm -0 0 Td 176.892 520.014 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 260.578 520.014] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -260.578 -520.014] cm -[1 0 0 1 0 0] Tm -0 0 Td 263.598 520.014 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 281.003 520.014] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -281.003 -520.014] cm -[1 0 0 1 0 0] Tm -0 0 Td 281.003 520.014 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 376.645 520.014] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -376.645 -520.014] cm -[1 0 0 1 0 0] Tm -0 0 Td 376.645 520.014 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -939 TJm (These) 23.7907 Tj -303 TJm @@ -37952,7 +34422,7 @@ Q 72 508.059 Td (from) 19.3673 Tj -205 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -205 TJm (user) 16.5977 Tj 20 TJm @@ -37962,13 +34432,13 @@ Q -206 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -205 TJm (to) 7.7509 Tj -205 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -205 TJm (user) 16.5977 Tj 20 TJm @@ -37978,25 +34448,25 @@ Q -205 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj 55 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -591 TJm (These) 23.7907 Tj -205 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fers) 14.9339 Tj -205 TJm (can) 13.8281 Tj -205 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -205 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -205 TJm @@ -38006,7 +34476,7 @@ Q -206 TJm (quantities) 38.7446 Tj -205 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj 72 496.104 Td (data) 16.5977 Tj -258 TJm @@ -38030,9 +34500,9 @@ Q -667 TJm (This) 17.7135 Tj -258 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -258 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -257 TJm (\003e) 9.9626 Tj 15 TJm @@ -38044,7 +34514,7 @@ Q 25 TJm (wing) 19.9252 Tj -258 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -258 TJm (consumer) 38.7346 Tj 20 TJm @@ -38052,30 +34522,29 @@ Q 72 484.148 Td (style) 18.8194 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (acti) 14.386 Tj 25 TJm (vity) 15.5018 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -250 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm (producer) 35.4071 Tj 20 TJm (-push,) 24.6275 Tj -250 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (mixture) 30.9936 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (both.) 20.2042 Tj -[1 0 0 1 72 481.992] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -38104,7 +34573,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -38113,11 +34581,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -472.029] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 453.527 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.1.2.) 43.0729 Tj -278 TJm (High-le) 58.343 Tj @@ -38126,8 +34591,7 @@ Q -278 TJm (summar) 66.9679 Tj -10 TJm -(y) 9.57176 Tj -[1 0 0 1 72 449.697] cm +(y) 9.5718 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -38152,16 +34616,12 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -439.734] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 431.61 Td -/F130_0 9.9626 Tf +72 431.609 Td +/F122_0 9.9626 Tf (This) 17.7135 Tj -284 TJm (interf) 21.579 Tj @@ -38196,7 +34656,7 @@ Q -284 TJm (to) 7.7509 Tj -284 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (acilitate) 31.5416 Tj -284 TJm @@ -38207,53 +34667,37 @@ Q (writ) 16.0497 Tj 1 TJm (ing) 12.7322 Tj -[1 0 0 1 510.112 431.61] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -510.112 -431.61] cm -[1 0 0 1 0 0] Tm -0 0 Td -510.112 431.61 Td -/F134_0 9.9626 Tf +510.112 431.609 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 540 431.61] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -431.61] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 419.654 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (format) 26.5603 Tj -347 TJm (\002les) 16.6077 Tj -346 TJm -(\() 3.31755 Tj -[1 0 0 1 125.391 419.654] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -125.391 -419.654] cm -[1 0 0 1 0 0] Tm -0 0 Td 125.391 419.654 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (.bz2) 23.9102 Tj -[1 0 0 1 149.301 419.654] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -149.301 -419.654] cm -[1 0 0 1 0 0] Tm -0 0 Td 152.754 419.654 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\002les\).) 22.4159 Tj -1200 TJm (The) 15.4918 Tj @@ -38268,7 +34712,7 @@ Q -347 TJm (to) 7.7509 Tj -346 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (acilitate) 31.5416 Tj -347 TJm @@ -38281,32 +34725,24 @@ Q (which) 24.3486 Tj -346 TJm (the) 12.1743 Tj -[1 0 0 1 460.049 419.654] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -460.049 -419.654] cm -[1 0 0 1 0 0] Tm -0 0 Td 460.049 419.654 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 489.937 419.654] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -489.937 -419.654] cm -[1 0 0 1 0 0] Tm -0 0 Td 493.39 419.654 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (data) 16.5977 Tj -347 TJm (stream) 26.5603 Tj 72 407.699 Td -(is) 6.64505 Tj +(is) 6.6451 Tj -339 TJm (embedded) 40.9463 Tj -339 TJm @@ -38324,40 +34760,30 @@ Q -339 TJm (structure,) 37.3498 Tj -361 TJm -(or) 8.29885 Tj --339 TJm -(wh) 12.1743 Tj --1 TJm -(e) 4.42339 Tj +(or) 8.2988 Tj +-340 TJm +(wher) 19.9152 Tj 1 TJm -(re) 7.74094 Tj +(e) 4.4234 Tj -340 TJm (there) 19.9152 Tj -339 TJm (are) 12.1643 Tj -339 TJm (multiple) 33.2153 Tj -[1 0 0 1 400.941 407.699] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -400.941 -407.699] cm -[1 0 0 1 0 0] Tm -0 0 Td 400.941 407.699 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 430.829 407.699] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -430.829 -407.699] cm -[1 0 0 1 0 0] Tm -0 0 Td 434.207 407.699 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (data) 16.5977 Tj -339 TJm (streams) 30.4357 Tj @@ -38365,213 +34791,145 @@ Q (concatenated) 52.0048 Tj 72 395.744 Td (end-to-end.) 45.6486 Tj -[1 0 0 1 72 395.644] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -385.682] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 373.826 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -332 TJm (reading) 29.8778 Tj -333 TJm (\002les,) 19.0983 Tj -[1 0 0 1 144.803 373.826] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -144.803 -373.826] cm -[1 0 0 1 0 0] Tm -0 0 Td 144.803 373.826 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzReadOpen) 83.6858 Tj -[1 0 0 1 228.489 373.826] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -228.489 -373.826] cm -[1 0 0 1 0 0] Tm -0 0 Td 228.489 373.826 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 234.496 373.826] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -234.496 -373.826] cm -[1 0 0 1 0 0] Tm -0 0 Td 234.496 373.826 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -[1 0 0 1 294.272 373.826] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -294.272 -373.826] cm -[1 0 0 1 0 0] Tm -0 0 Td 294.272 373.826 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 300.279 373.826] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -300.279 -373.826] cm -[1 0 0 1 0 0] Tm -0 0 Td 300.279 373.826 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzReadClose) 89.6634 Tj -[1 0 0 1 389.942 373.826] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -389.942 -373.826] cm -[1 0 0 1 0 0] Tm -0 0 Td 393.253 373.826 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 410.951 373.826] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -410.951 -373.826] cm -[1 0 0 1 0 0] Tm -0 0 Td 410.951 373.826 Td -/F134_0 9.9626 Tf -(BZ2_bzReadGetUnused) 113.574 Tj -[1 0 0 1 524.525 373.826] cm +/F124_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.5736 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -524.525 -373.826] cm -[1 0 0 1 0 0] Tm -0 0 Td 527.836 373.826 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (are) 12.1643 Tj 72 361.871 Td (supplied.) 36.2539 Tj -620 TJm -(F) 5.53921 Tj +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm (writing) 28.782 Tj -250 TJm (\002les,) 19.0983 Tj -[1 0 0 1 183.471 361.871] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -183.471 -361.871] cm -[1 0 0 1 0 0] Tm -0 0 Td 183.471 361.871 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzWriteOpen) 89.6634 Tj -[1 0 0 1 273.135 361.871] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -273.135 -361.871] cm -[1 0 0 1 0 0] Tm -0 0 Td 273.135 361.871 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 278.116 361.871] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -278.116 -361.871] cm -[1 0 0 1 0 0] Tm -0 0 Td 278.116 361.871 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzWrite) 65.7532 Tj -[1 0 0 1 343.869 361.871] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -343.869 -361.871] cm -[1 0 0 1 0 0] Tm -0 0 Td 346.36 361.871 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 363.237 361.871] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -363.237 -361.871] cm -[1 0 0 1 0 0] Tm -0 0 Td 363.237 361.871 Td -/F134_0 9.9626 Tf -(BZ2_bzWriteFinish) 101.619 Tj -[1 0 0 1 464.856 361.871] cm +/F124_0 9.9626 Tf +(BZ2_bzWriteFinish) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -464.856 -361.871] cm -[1 0 0 1 0 0] Tm -0 0 Td 467.346 361.871 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (are) 12.1643 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 25 TJm (ailable.) 29.0509 Tj -[1 0 0 1 72 359.714] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -349.751] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 339.953 Td -/F130_0 9.9626 Tf (As) 11.0684 Tj -374 TJm (with) 17.7135 Tj @@ -38588,7 +34946,7 @@ Q -374 TJm (library) 26.5603 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -405 TJm (no) 9.9626 Tj -374 TJm @@ -38602,17 +34960,17 @@ Q -374 TJm (used) 18.2614 Tj -374 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -374 TJm (the) 12.1743 Tj -374 TJm (library) 26.5603 Tj -375 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -374 TJm (per) 12.7222 Tj -374 TJm -(se) 8.29885 Tj +(se) 8.2988 Tj -374 TJm (thread-safe.) 46.7445 Tj -1365 TJm @@ -38622,11 +34980,11 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -406 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -374 TJm (I/O) 13.2801 Tj 72 327.998 Td @@ -38638,7 +34996,7 @@ Q -267 TJm (reading) 29.8778 Tj -267 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -267 TJm (writing) 28.782 Tj -267 TJm @@ -38654,36 +35012,28 @@ Q -267 TJm (may) 17.1556 Tj -267 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -267 TJm (to) 7.7509 Tj -267 TJm (consult) 28.782 Tj -[1 0 0 1 457.199 327.998] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -457.199 -327.998] cm -[1 0 0 1 0 0] Tm -0 0 Td 457.199 327.998 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (errno) 29.8878 Tj -[1 0 0 1 487.087 327.998] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -487.087 -327.998] cm -[1 0 0 1 0 0] Tm -0 0 Td 489.748 327.998 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj -267 TJm (determine) 39.8404 Tj @@ -38692,15 +35042,15 @@ Q -366 TJm (cause) 22.1269 Tj -365 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -366 TJm (the) 12.1743 Tj -365 TJm (error) 19.3573 Tj 55 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -1314 TJm -(In) 8.29885 Tj +(In) 8.2988 Tj -366 TJm (that) 14.9439 Tj -365 TJm @@ -38712,9 +35062,9 @@ Q -366 TJm (need) 18.8094 Tj -365 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -366 TJm -(C) 6.64505 Tj +(C) 6.6451 Tj -365 TJm (library) 26.5603 Tj -366 TJm @@ -38723,64 +35073,50 @@ Q (correctly) 35.4071 Tj -365 TJm (supports) 33.7633 Tj -[1 0 0 1 431.668 316.043] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -431.668 -316.043] cm -[1 0 0 1 0 0] Tm -0 0 Td 431.668 316.043 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (errno) 29.8878 Tj -[1 0 0 1 461.556 316.043] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -461.556 -316.043] cm -[1 0 0 1 0 0] Tm -0 0 Td 465.199 316.043 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (in) 7.7509 Tj -366 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -365 TJm (multithreaded) 55.3422 Tj 72 304.088 Td -(en) 9.40469 Tj +(en) 9.4047 Tj 40 TJm (vironment.) 43.4469 Tj -[1 0 0 1 72 303.988] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -294.025] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 282.17 Td -/F130_0 9.9626 Tf -(T) 6.08715 Tj +(T) 6.0871 Tj 80 TJm (o) 4.9813 Tj -243 TJm (mak) 17.1556 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -243 TJm (the) 12.1743 Tj -242 TJm (library) 26.5603 Tj -243 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -243 TJm (little) 18.2714 Tj -242 TJm @@ -38791,53 +35127,37 @@ Q (more) 20.4731 Tj -243 TJm (portable,) 35.1381 Tj -[1 0 0 1 289.263 282.17] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -289.263 -282.17] cm -[1 0 0 1 0 0] Tm -0 0 Td 289.263 282.17 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzReadOpen) 83.6858 Tj -[1 0 0 1 372.949 282.17] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -372.949 -282.17] cm -[1 0 0 1 0 0] Tm -0 0 Td 375.368 282.17 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 392.172 282.17] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -392.172 -282.17] cm -[1 0 0 1 0 0] Tm -0 0 Td 392.172 282.17 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzWriteOpen) 89.6634 Tj -[1 0 0 1 481.836 282.17] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -481.836 -282.17] cm -[1 0 0 1 0 0] Tm -0 0 Td 484.254 282.17 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (require) 28.2141 Tj -243 TJm (you) 14.9439 Tj --242 TJm +-243 TJm (to) 7.7509 Tj 72 270.215 Td (pass) 17.1556 Tj @@ -38848,39 +35168,31 @@ Q -247 TJm (handles) 30.4357 Tj -247 TJm -(\() 3.31755 Tj -[1 0 0 1 165.421 270.215] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -165.421 -270.215] cm -[1 0 0 1 0 0] Tm -0 0 Td 165.421 270.215 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (FILE) 23.9102 Tj 189.331 268.471 Td -(*) 5.97756 Tj -[1 0 0 1 195.309 270.215] cm +(*) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -195.309 -270.215] cm -[1 0 0 1 0 0] Tm -0 0 Td 195.309 270.215 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (s\)) 7.193 Tj -247 TJm (which) 24.3486 Tj -248 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -247 TJm (pre) 12.7222 Tj 25 TJm @@ -38894,7 +35206,7 @@ Q -247 TJm (reading) 29.8778 Tj -247 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -248 TJm (writing) 28.782 Tj -247 TJm @@ -38904,16 +35216,16 @@ Q 15 TJm (ely) 12.1743 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -618 TJm (That) 18.2614 Tj -248 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 20 TJm (oids) 16.6077 Tj -72 258.26 Td +72 258.259 Td (portability) 41.5142 Tj -272 TJm (problems) 37.0808 Tj @@ -38942,9 +35254,9 @@ Q -273 TJm (much) 22.1369 Tj -272 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -273 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -272 TJm (imposition) 42.63 Tj -272 TJm @@ -38954,8 +35266,7 @@ Q 72 246.304 Td (programmer) 49.2451 Tj 55 TJm -(.) 2.49065 Tj -[1 0 0 1 72 244.147] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -38984,7 +35295,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -38993,11 +35303,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -234.185] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 215.683 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.1.3.) 43.0729 Tj -278 TJm (Utility) 47.8244 Tj @@ -39006,8 +35313,7 @@ Q -278 TJm (summar) 66.9679 Tj -10 TJm -(y) 9.57176 Tj -[1 0 0 1 72 212.12] cm +(y) 9.5718 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39032,19 +35338,15 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -202.157] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 193.765 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +/F122_0 9.9626 Tf +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -273 TJm (v) 4.9813 Tj 15 TJm @@ -39053,49 +35355,33 @@ Q (simple) 26.5703 Tj -273 TJm (needs,) 25.1755 Tj -[1 0 0 1 165.929 193.765] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -165.929 -193.765] cm -[1 0 0 1 0 0] Tm -0 0 Td 165.929 193.765 Td -/F134_0 9.9626 Tf -(BZ2_bzBuffToBuffCompress) 143.461 Tj -[1 0 0 1 309.391 193.765] cm +/F124_0 9.9626 Tf +(BZ2_bzBuffToBuffCompress) 143.4614 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -309.391 -193.765] cm -[1 0 0 1 0 0] Tm -0 0 Td 312.112 193.765 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 329.219 193.765] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -329.219 -193.765] cm -[1 0 0 1 0 0] Tm -0 0 Td 329.219 193.765 Td -/F134_0 9.9626 Tf -(BZ2_bzBuffToBuffDecompress) 155.417 Tj -[1 0 0 1 484.636 193.765] cm +/F124_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.4166 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -484.636 -193.765] cm -[1 0 0 1 0 0] Tm -0 0 Td 487.357 193.765 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (are) 12.1643 Tj -273 TJm (pro) 13.2801 Tj @@ -39118,7 +35404,7 @@ Q -374 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -373 TJm @@ -39128,13 +35414,13 @@ Q -374 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -373 TJm (in) 7.7509 Tj -374 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -373 TJm (single) 23.8007 Tj -374 TJm @@ -39162,7 +35448,7 @@ Q -343 TJm (memory-to-memory) 80.7967 Tj -344 TJm -(compression/decompression) 112.896 Tj +(compression/decompression) 112.8962 Tj -343 TJm (requirements) 52.0147 Tj -344 TJm @@ -39174,7 +35460,7 @@ Q 15 TJm (esting) 23.8007 Tj 72 157.9 Td -(ef) 7.74094 Tj +(ef) 7.7409 Tj 25 TJm (fort) 14.386 Tj -250 TJm @@ -39209,50 +35495,36 @@ Q (interf) 21.579 Tj 10 TJm (ace.) 15.7608 Tj -[1 0 0 1 72 155.743] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -145.78] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 135.982 Td -/F130_0 9.9626 Tf (Y) 7.193 Tj 110 TJm (oshioka) 30.9936 Tj -423 TJm (Tsuneo) 29.3299 Tj -422 TJm -(\() 3.31755 Tj -[1 0 0 1 150.16 135.982] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -150.16 -135.982] cm -[1 0 0 1 0 0] Tm -0 0 Td -150.16 135.982 Td -/F134_0 9.9626 Tf -(tsuneo@rr.iij4u.or.jp) 125.529 Tj -[1 0 0 1 275.69 135.982] cm +150.161 135.982 Td +/F124_0 9.9626 Tf +(tsuneo@rr.iij4u.or.jp) 125.5288 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -275.69 -135.982] cm -[1 0 0 1 0 0] Tm -0 0 Td 275.69 135.982 Td -/F130_0 9.9626 Tf -(\)) 3.31755 Tj +/F122_0 9.9626 Tf +(\)) 3.3175 Tj -423 TJm (has) 13.2801 Tj -422 TJm @@ -39270,195 +35542,131 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -423 TJm (better) 22.6848 Tj -[1 0 0 1 476.462 135.982] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -476.462 -135.982] cm -[1 0 0 1 0 0] Tm -0 0 Td 476.462 135.982 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (zlib) 23.9102 Tj -[1 0 0 1 500.372 135.982] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -500.372 -135.982] cm -[1 0 0 1 0 0] Tm -0 0 Td 504.583 135.982 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (compati-) 35.417 Tj 72 124.027 Td (bility) 21.041 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -1446 TJm (These) 23.7907 Tj -388 TJm (functions) 37.0808 Tj -387 TJm (are) 12.1643 Tj -[1 0 0 1 193.913 124.027] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -193.913 -124.027] cm -[1 0 0 1 0 0] Tm -0 0 Td -193.913 124.027 Td -/F134_0 9.9626 Tf +193.914 124.027 Td +/F124_0 9.9626 Tf (BZ2_bzopen) 59.7756 Tj -[1 0 0 1 253.689 124.027] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -253.689 -124.027] cm -[1 0 0 1 0 0] Tm -0 0 Td 253.689 124.027 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 260.385 124.027] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -260.385 -124.027] cm -[1 0 0 1 0 0] Tm -0 0 Td 260.385 124.027 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzread) 59.7756 Tj -[1 0 0 1 320.161 124.027] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -320.161 -124.027] cm -[1 0 0 1 0 0] Tm -0 0 Td 320.161 124.027 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 326.857 124.027] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -326.857 -124.027] cm -[1 0 0 1 0 0] Tm -0 0 Td 326.857 124.027 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzwrite) 65.7532 Tj -[1 0 0 1 392.611 124.027] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -392.611 -124.027] cm -[1 0 0 1 0 0] Tm -0 0 Td 392.611 124.027 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 399.306 124.027] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -399.306 -124.027] cm -[1 0 0 1 0 0] Tm -0 0 Td -399.306 124.027 Td -/F134_0 9.9626 Tf +399.307 124.027 Td +/F124_0 9.9626 Tf (BZ2_bzflush) 65.7532 Tj -[1 0 0 1 465.06 124.027] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -465.06 -124.027] cm -[1 0 0 1 0 0] Tm -0 0 Td 465.06 124.027 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 471.756 124.027] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -471.756 -124.027] cm -[1 0 0 1 0 0] Tm -0 0 Td 471.756 124.027 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzclose) 65.7532 Tj -[1 0 0 1 537.509 124.027] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -537.509 -124.027] cm -[1 0 0 1 0 0] Tm -0 0 Td 537.509 124.027 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 72 112.072] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -112.072] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 112.072 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzerror) 65.7532 Tj -[1 0 0 1 137.753 112.072] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -137.753 -112.072] cm -[1 0 0 1 0 0] Tm -0 0 Td 140.408 112.072 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 157.449 112.072] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -157.449 -112.072] cm -[1 0 0 1 0 0] Tm -0 0 Td 157.449 112.072 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzlibVersion) 95.641 Tj -[1 0 0 1 253.091 112.072] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -253.091 -112.072] cm -[1 0 0 1 0 0] Tm -0 0 Td 253.091 112.072 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -719 TJm (Y) 7.193 Tj 110 TJm @@ -39487,12 +35695,12 @@ Q (\002le) 12.7322 Tj -267 TJm (reading) 29.8778 Tj -72 100.117 Td +72 100.116 Td (and) 14.386 Tj -270 TJm -(wri) 13.2801 Tj +(writ) 16.0497 Tj 1 TJm -(ting,) 17.9925 Tj +(ing,) 15.2229 Tj -275 TJm (than) 17.1556 Tj -269 TJm @@ -39522,31 +35730,31 @@ Q -269 TJm (\(yet\)) 18.8094 Tj -270 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj 25 TJm (\002cially) 27.6761 Tj -269 TJm (part) 15.4918 Tj -270 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -269 TJm (the) 12.1743 Tj -270 TJm (library) 26.5603 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -274 TJm (and) 14.386 Tj -270 TJm (are) 12.1643 Tj -72 88.1614 Td +72 88.161 Td (minimally) 40.9662 Tj -291 TJm (documented) 48.6972 Tj -291 TJm (here.) 19.6363 Tj -867 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -291 TJm (the) 12.1743 Tj 15 TJm @@ -39570,7 +35778,7 @@ Q -291 TJm (pieces.) 27.3872 Tj -433 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -291 TJm (hope) 19.3673 Tj -291 TJm @@ -39583,26 +35791,18 @@ Q (properly) 33.7533 Tj -291 TJm (when) 21.579 Tj -72 76.2062 Td +72 76.206 Td (time) 17.7135 Tj -250 TJm (permits.) 32.3785 Tj -[1 0 0 1 72 74.0494] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -23.1976] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 4.3836 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39627,7 +35827,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39636,12 +35835,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.9737] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39650,18 +35843,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 43.0633 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -498.225 -51.071] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 541.288 51.071 Td -/F130_0 9.9626 Tf (9) 4.9813 Tj -[1 0 0 1 455.161 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39670,7 +35865,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5986 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39679,12 +35873,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -15.0366 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39693,7 +35885,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 13 13 +%%Page: 10 13 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -39711,20 +35903,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39749,7 +35937,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39758,12 +35945,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39772,36 +35953,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39810,7 +35987,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39819,44 +35995,43 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -21.5542] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Y) 7.193 Tj 110 TJm (oshioka) 30.9936 Tj @@ -39881,24 +36056,23 @@ Q -250 TJm (to) 7.7509 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (b) 4.9813 Tj 20 TJm (uilt) 13.2901 Tj -250 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm -(W) 9.40469 Tj +(W) 9.4047 Tj 40 TJm (indo) 17.7135 Tj 25 TJm (ws) 11.0684 Tj -250 TJm (DLL.) 21.8579 Tj -[1 0 0 1 72 707.88] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39931,7 +36105,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7436] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39940,11 +36113,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -698.137] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 675.504 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (3.2.) 34.4584 Tj -278 TJm (Err) 29.8515 Tj @@ -39952,7 +36122,6 @@ Q (or) 20.6585 Tj -278 TJm (handling) 86.084 Tj -[1 0 0 1 72 670.907] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -39977,21 +36146,17 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7436] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -661.164] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 653.805 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (The) 15.4918 Tj -214 TJm (library) 26.5603 Tj -215 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -214 TJm (designed) 35.417 Tj -215 TJm @@ -40001,7 +36166,7 @@ Q 15 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj -215 TJm (cleanly) 28.772 Tj -214 TJm @@ -40021,7 +36186,7 @@ Q -214 TJm (situation) 34.3212 Tj -215 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -214 TJm (decompressing) 59.7656 Tj -215 TJm @@ -40039,7 +36204,7 @@ Q -274 TJm (that) 14.9439 Tj -274 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -274 TJm (can) 13.8281 Tj -274 TJm @@ -40053,7 +36218,7 @@ Q -274 TJm (this,) 16.8866 Tj -280 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -274 TJm (you) 14.9439 Tj -274 TJm @@ -40067,9 +36232,9 @@ Q -274 TJm (add) 14.386 Tj -274 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -275 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj 1 TJm (ignal) 19.9252 Tj -275 TJm @@ -40079,17 +36244,17 @@ Q -274 TJm (catch) 21.0211 Tj -274 TJm -(se) 8.29885 Tj +(se) 8.2988 Tj 15 TJm (gmentation) 44.8317 Tj -72 629.894 Td +72 629.895 Td (violations) 39.3025 Tj -273 TJm (during) 26.0123 Tj -273 TJm (decompression) 59.7656 Tj -273 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -273 TJm (you) 14.9439 Tj -273 TJm @@ -40103,13 +36268,13 @@ Q -274 TJm (paranoid.) 37.3498 Tj -758 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -273 TJm (w) 7.193 Tj 10 TJm (ould) 17.7135 Tj -273 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -273 TJm (interested) 38.7346 Tj -273 TJm @@ -40127,7 +36292,7 @@ Q 20 TJm (ustness) 28.782 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm @@ -40140,21 +36305,15 @@ Q (compressed) 47.0334 Tj -250 TJm (data.) 19.0883 Tj -[1 0 0 1 72 615.783] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7436] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -606.039] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 596.241 Td -/F130_0 9.9626 Tf (V) 7.193 Tj 111 TJm (ersion) 24.3486 Tj @@ -40175,7 +36334,7 @@ Q -252 TJm (than) 17.1556 Tj -251 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -251 TJm @@ -40187,7 +36346,7 @@ Q 15 TJm (ersion.) 26.8392 Tj -626 TJm -(In) 8.29885 Tj +(In) 8.2988 Tj 40 TJm (v) 4.9813 Tj 15 TJm @@ -40201,7 +36360,7 @@ Q 111 TJm (algrind) 28.224 Tj -251 TJm -(\(a) 7.74094 Tj +(\(a) 7.7409 Tj -252 TJm (tool) 15.5018 Tj -251 TJm @@ -40229,15 +36388,15 @@ Q -422 TJm (the) 12.1743 Tj -422 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 1 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (w) 7.193 Tj -422 TJm (\002les) 16.6077 Tj -422 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -421 TJm (tested,) 25.7334 Tj -464 TJm @@ -40261,17 +36420,17 @@ Q -342 TJm (properly) 33.7533 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -365 TJm (with) 17.7135 Tj -341 TJm (no) 9.9626 Tj -342 TJm -(se) 8.29885 Tj +(se) 8.2988 Tj 15 TJm (gmentation) 44.8317 Tj -342 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (aults,) 21.31 Tj -365 TJm @@ -40279,7 +36438,7 @@ Q -341 TJm (uses) 17.1556 Tj -342 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -342 TJm (uninitialised) 49.2651 Tj -342 TJm @@ -40289,13 +36448,13 @@ Q -342 TJm (out) 12.7322 Tj -342 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -342 TJm (range) 22.1269 Tj 72 560.375 Td (reads) 21.0211 Tj -261 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -260 TJm (writes,) 26.8392 Tj -263 TJm @@ -40305,7 +36464,7 @@ Q -261 TJm (in\002nit) 23.8106 Tj 1 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -261 TJm (looping) 30.4457 Tj -261 TJm @@ -40315,13 +36474,13 @@ Q -261 TJm (decompressor) 55.3323 Tj 55 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -342 TJm (So) 10.5205 Tj -260 TJm -(it') 8.85675 Tj +(it') 8.8568 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -261 TJm (certainly) 34.8591 Tj -260 TJm @@ -40333,7 +36492,7 @@ Q -263 TJm (although) 34.8691 Tj -261 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -260 TJm (w) 7.193 Tj 10 TJm @@ -40343,64 +36502,48 @@ Q -261 TJm (claim) 22.1369 Tj 72 548.42 Td -(it) 5.53921 Tj +(it) 5.5392 Tj -250 TJm (to) 7.7509 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (totally) 25.4644 Tj -250 TJm (bombproof.) 46.7644 Tj -[1 0 0 1 72 546.263] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7436] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -536.519] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 526.721 Td -/F130_0 9.9626 Tf (The) 15.4918 Tj -282 TJm (\002le) 12.7322 Tj -[1 0 0 1 105.84 526.721] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -105.84 -526.721] cm -[1 0 0 1 0 0] Tm -0 0 Td 105.84 526.721 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzlib.h) 41.8429 Tj -[1 0 0 1 147.683 526.721] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -147.683 -526.721] cm -[1 0 0 1 0 0] Tm -0 0 Td 150.491 526.721 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (contains) 33.2053 Tj -282 TJm (all) 9.9626 Tj -282 TJm (de\002nitions) 42.0721 Tj -282 TJm -(nee) 13.8281 Tj -1 TJm -(ded) 14.386 Tj --282 TJm +(needed) 28.2141 Tj +-281 TJm (to) 7.7509 Tj -282 TJm (use) 13.2801 Tj @@ -40409,13 +36552,13 @@ Q -282 TJm (library) 26.5603 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -811 TJm -(In) 8.29885 Tj +(In) 8.2988 Tj -282 TJm (particular) 38.1767 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -290 TJm (you) 14.9439 Tj -282 TJm @@ -40426,66 +36569,44 @@ Q (not) 12.7322 Tj -282 TJm (include) 29.3299 Tj -[1 0 0 1 72 514.766] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -514.766] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 514.766 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzlib_private.h) 89.6634 Tj -[1 0 0 1 161.664 514.766] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -161.664 -514.766] cm -[1 0 0 1 0 0] Tm -0 0 Td 161.664 514.766 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 513.232] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7436] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -503.488] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 493.067 Td -/F130_0 9.9626 Tf -(In) 8.29885 Tj -[1 0 0 1 82.8075 493.067] cm +(In) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -82.8075 -493.067] cm -[1 0 0 1 0 0] Tm -0 0 Td -82.8075 493.067 Td -/F134_0 9.9626 Tf +82.807 493.067 Td +/F124_0 9.9626 Tf (bzlib.h) 41.8429 Tj -[1 0 0 1 124.651 493.067] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -124.651 -493.067] cm -[1 0 0 1 0 0] Tm -0 0 Td 124.651 493.067 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -252 TJm (the) 12.1743 Tj -252 TJm @@ -40511,27 +36632,27 @@ Q -252 TJm (list) 12.1843 Tj -251 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -252 TJm (not) 12.7322 Tj -252 TJm (intended) 34.3112 Tj -252 TJm -(as) 8.29885 Tj --252 TJm -(an) 9.40469 Tj +(as) 8.2988 Tj -251 TJm -(e) 4.42339 Tj +(an) 9.4047 Tj +-252 TJm +(e) 4.4234 Tj 15 TJm (xhausti) 28.782 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -252 TJm (description) 44.2738 Tj -252 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj 72 481.112 Td (the) 12.1743 Tj -236 TJm @@ -40541,13 +36662,13 @@ Q -237 TJm (which) 24.3486 Tj -236 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -236 TJm (gi) 7.7509 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(en) 9.40469 Tj +(en) 9.4047 Tj -236 TJm (v) 4.9813 Tj 25 TJm @@ -40555,11 +36676,11 @@ Q -236 TJm (may) 17.1556 Tj -237 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -236 TJm (returned) 33.1954 Tj -236 TJm -(--) 6.63509 Tj +(--) 6.6351 Tj -236 TJm (those) 21.031 Tj -236 TJm @@ -40571,19 +36692,19 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(en) 9.40469 Tj +(en) 9.4047 Tj -236 TJm (later) 17.7035 Tj 55 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -305 TJm (Rather) 26.5603 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -239 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -236 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -237 TJm (intended) 34.3112 Tj -236 TJm @@ -40593,7 +36714,7 @@ Q 40 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (y) 4.9813 Tj -266 TJm @@ -40603,7 +36724,7 @@ Q -266 TJm (meaning) 34.3112 Tj -265 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -266 TJm (each) 18.2515 Tj -266 TJm @@ -40617,11 +36738,11 @@ Q -265 TJm (\002rst) 15.5018 Tj -266 TJm -(\002) 5.53921 Tj +(\002) 5.5392 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -265 TJm (actions) 28.224 Tj -266 TJm @@ -40639,22 +36760,11 @@ Q -266 TJm (denote) 26.5603 Tj -265 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -266 TJm (error) 19.3573 Tj 72 457.202 Td (situation.) 36.8118 Tj -[1 0 0 1 72 457.102] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.7436] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.7435] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -40667,23 +36777,17 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -437.615] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 425.76 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 425.759 Td +/F124_0 9.9626 Tf (BZ_OK) 29.8878 Tj -[1 0 0 1 101.888 425.76] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -32.3786 -1.3101] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -40700,11 +36804,16 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -424.449] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 413.804 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (The) 15.4918 Tj -250 TJm (requested) 38.1767 Tj @@ -40713,28 +36822,25 @@ Q -250 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -250 TJm (completed) 41.5042 Tj -250 TJm (successfully) 48.6972 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 411.648] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.766] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.7436] cm +(.) 2.4907 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -40747,27 +36853,13 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -398.138] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 388.34 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_RUN_OK,) 59.7756 Tj -600 TJm (BZ_FLUSH_OK,) 71.7307 Tj -600 TJm (BZ_FINISH_OK) 71.7307 Tj -[1 0 0 1 287.193 388.34] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -217.684 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -40784,67 +36876,61 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -387.03] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 376.384 Td -/F130_0 9.9626 Tf -(In) 8.29885 Tj -[1 0 0 1 118.79 376.384] cm +/F122_0 9.9626 Tf +(In) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -118.79 -376.384] cm -[1 0 0 1 0 0] Tm -0 0 Td -118.79 376.384 Td -/F134_0 9.9626 Tf +118.789 376.384 Td +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 202.476 376.384] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -202.476 -376.384] cm -[1 0 0 1 0 0] Tm -0 0 Td 202.476 376.384 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -250 TJm (the) 12.1743 Tj -250 TJm (requested) 38.1767 Tj -250 TJm -(\003ush/\002nish/nothing-special) 108.493 Tj +(\003ush/\002nish/nothing-special) 108.4927 Tj -250 TJm (action) 24.3486 Tj -250 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -250 TJm (completed) 41.5042 Tj -250 TJm (successfully) 48.6972 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 374.228] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.7659] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.7436] cm +(.) 2.4907 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -40857,23 +36943,9 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -360.718] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 350.92 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 149.709 350.92] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -80.1993 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -40890,24 +36962,29 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -349.61] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 338.965 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Compression) 52.5826 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (data) 16.5977 Tj -250 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -250 TJm (completed,) 43.9948 Tj -250 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm @@ -40919,14 +36996,13 @@ Q -250 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -250 TJm (detected) 33.1954 Tj -250 TJm (during) 26.0123 Tj -250 TJm (decompression.) 62.2563 Tj -[1 0 0 1 72 336.808] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -40935,26 +37011,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -3.7659] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7436] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7436] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -313.555] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 303.756 Td -/F130_0 9.9626 Tf (The) 15.4918 Tj -250 TJm (follo) 18.8194 Tj @@ -40969,26 +37038,15 @@ Q -250 TJm (indicate) 31.5416 Tj -250 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -250 TJm (error) 19.3573 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (some) 21.031 Tj -250 TJm (kind.) 20.2042 Tj -[1 0 0 1 72 301.6] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.7436] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.7436] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -41001,23 +37059,17 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -282.112] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 272.314 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_CONFIG_ERROR) 89.6634 Tj -[1 0 0 1 161.664 272.314] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4906 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -92.1544 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -41034,11 +37086,16 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -271.004] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 260.359 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Indicates) 35.965 Tj -386 TJm (that) 14.9439 Tj @@ -41061,9 +37118,9 @@ Q -385 TJm (platform) 34.3112 Tj -386 TJm -(--) 6.63509 Tj +(--) 6.6351 Tj -386 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -386 TJm (major) 23.2427 Tj -385 TJm @@ -41071,92 +37128,68 @@ Q -386 TJm (error) 19.3573 Tj 55 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj 108 248.404 Td (Speci\002cally) 47.0434 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -481 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -435 TJm (means) 25.4544 Tj -435 TJm (that) 14.9439 Tj -[1 0 0 1 220.614 248.404] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -220.614 -248.404] cm -[1 0 0 1 0 0] Tm -0 0 Td 220.614 248.404 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (sizeof\(char\)) 71.7307 Tj -[1 0 0 1 292.345 248.404] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -292.345 -248.404] cm -[1 0 0 1 0 0] Tm -0 0 Td 292.345 248.404 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 299.628 248.404] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -299.628 -248.404] cm -[1 0 0 1 0 0] Tm -0 0 Td 299.628 248.404 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (sizeof\(short\)) 77.7083 Tj -[1 0 0 1 377.337 248.404] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -377.337 -248.404] cm -[1 0 0 1 0 0] Tm -0 0 Td 381.669 248.404 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 400.388 248.404] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -400.388 -248.404] cm -[1 0 0 1 0 0] Tm -0 0 Td 400.388 248.404 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (sizeof\(int\)) 65.7532 Tj -[1 0 0 1 466.141 248.404] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -466.141 -248.404] cm -[1 0 0 1 0 0] Tm -0 0 Td 470.474 248.404 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (are) 12.1643 Tj -435 TJm (not) 12.7322 Tj -435 TJm -(1,) 7.47195 Tj +(1,) 7.472 Tj -481 TJm (2) 4.9813 Tj -435 TJm (and) 14.386 Tj -108 236.449 Td +108 236.448 Td (4) 4.9813 Tj -389 TJm (respecti) 30.9837 Tj @@ -41165,9 +37198,9 @@ Q 15 TJm (ely) 12.1743 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -424 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -390 TJm (the) 12.1743 Tj 15 TJm @@ -41215,117 +37248,85 @@ Q -293 TJm (model) 24.9065 Tj -292 TJm -(--) 6.63509 Tj +(--) 6.6351 Tj -292 TJm (that) 14.9439 Tj -292 TJm (is,) 9.1357 Tj -303 TJm (where) 24.3386 Tj -[1 0 0 1 355.279 224.493] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -355.279 -224.493] cm -[1 0 0 1 0 0] Tm -0 0 Td 355.279 224.493 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (sizeof\(long\)) 71.7307 Tj -[1 0 0 1 427.01 224.493] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -427.01 -224.493] cm -[1 0 0 1 0 0] Tm -0 0 Td 429.92 224.493 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 447.217 224.493] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -447.217 -224.493] cm -[1 0 0 1 0 0] Tm -0 0 Td 447.217 224.493 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (sizeof\(void) 65.7532 Tj 512.97 222.75 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 518.948 224.493 Td -(\)) 5.97756 Tj -[1 0 0 1 524.925 224.493] cm +(\)) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -524.925 -224.493] cm -[1 0 0 1 0 0] Tm -0 0 Td 527.836 224.493 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (are) 12.1643 Tj 108 212.538 Td -(8.) 7.47195 Tj +(8.) 7.472 Tj -620 TJm (Under) 24.8965 Tj -250 TJm (LP64,) 24.0796 Tj -[1 0 0 1 175.606 212.538] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -175.606 -212.538] cm -[1 0 0 1 0 0] Tm -0 0 Td 175.606 212.538 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (sizeof\(int\)) 65.7532 Tj -[1 0 0 1 241.36 212.538] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -241.36 -212.538] cm -[1 0 0 1 0 0] Tm -0 0 Td 243.85 212.538 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -250 TJm (still) 14.9539 Tj -250 TJm -(4,) 7.47195 Tj +(4,) 7.472 Tj -250 TJm -(so) 8.85675 Tj -[1 0 0 1 291.74 212.538] cm +(so) 8.8568 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -291.74 -212.538] cm -[1 0 0 1 0 0] Tm -0 0 Td 291.74 212.538 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 339.56 212.538] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -339.56 -212.538] cm -[1 0 0 1 0 0] Tm -0 0 Td -339.56 212.538 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +339.561 212.538 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj -250 TJm (which) 24.3486 Tj -250 TJm @@ -41336,76 +37337,24 @@ Q (use) 13.2801 Tj -250 TJm (the) 12.1743 Tj -[1 0 0 1 433.458 212.538] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -433.458 -212.538] cm -[1 0 0 1 0 0] Tm -0 0 Td 433.458 212.538 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (long) 23.9102 Tj -[1 0 0 1 457.368 212.538] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -457.368 -212.538] cm -[1 0 0 1 0 0] Tm -0 0 Td 459.859 212.538 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (type,) 19.6462 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (OK.) 16.8766 Tj -[1 0 0 1 72 210.381] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.7659] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.7436] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -72 -196.872] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 187.074 Td -/F134_0 9.9626 Tf -(BZ_SEQUENCE_ERROR) 101.619 Tj -[1 0 0 1 173.619 187.074] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -104.11 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -41422,11 +37371,43 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -185.764] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 187.073 Td +/F124_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.6185 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 175.118 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (When) 23.7907 Tj -291 TJm (using) 21.589 Tj @@ -41435,11 +37416,11 @@ Q -291 TJm (library) 26.5603 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -300 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -291 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -290 TJm (important) 38.7446 Tj -291 TJm @@ -41467,9 +37448,9 @@ Q -290 TJm (structures) 38.7346 Tj 108 163.163 Td -(\(b) 8.29885 Tj +(\(b) 8.2988 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fers) 14.9339 Tj -206 TJm @@ -41482,37 +37463,29 @@ Q (correct) 27.6562 Tj -206 TJm (states.) 24.6275 Tj -[1 0 0 1 239.409 163.163] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -239.409 -163.163] cm -[1 0 0 1 0 0] Tm -0 0 Td 239.409 163.163 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 287.23 163.163] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -287.23 -163.163] cm -[1 0 0 1 0 0] Tm -0 0 Td 289.278 163.163 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (checks) 27.1082 Tj -206 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -205 TJm (much) 22.1369 Tj -206 TJm -(as) 8.29885 Tj --205 TJm -(it) 5.53921 Tj +(as) 8.2988 Tj -206 TJm +(it) 5.5392 Tj +-205 TJm (can) 13.8281 Tj -206 TJm (to) 7.7509 Tj @@ -41521,35 +37494,27 @@ Q -206 TJm (this) 14.396 Tj -206 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -205 TJm (happening,) 43.9948 Tj -215 TJm (and) 14.386 Tj -205 TJm (returns) 27.6661 Tj -[1 0 0 1 108 151.208] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -108 -151.208] cm -[1 0 0 1 0 0] Tm -0 0 Td 108 151.208 Td -/F134_0 9.9626 Tf -(BZ_SEQUENCE_ERROR) 101.619 Tj -[1 0 0 1 209.619 151.208] cm +/F124_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -209.619 -151.208] cm -[1 0 0 1 0 0] Tm -0 0 Td 213.27 151.208 Td -/F130_0 9.9626 Tf -(if) 6.08715 Tj +/F122_0 9.9626 Tf +(if) 6.0871 Tj -367 TJm (not.) 15.2229 Tj -659 TJm @@ -41569,7 +37534,7 @@ Q -366 TJm (semantics,) 41.7831 Tj -396 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -367 TJm (detailed) 31.5416 Tj 108 139.253 Td @@ -41577,21 +37542,21 @@ Q 25 TJm (w) 7.193 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -250 TJm (should) 26.5703 Tj -250 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj -250 TJm (recei) 19.3573 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm (this) 14.396 Tj -250 TJm @@ -41601,9 +37566,9 @@ Q -250 TJm (such) 18.2614 Tj -250 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -250 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm @@ -41630,21 +37595,6 @@ Q (estig) 18.8194 Tj 5 TJm (ate.) 14.107 Tj -[1 0 0 1 72 137.096] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.7659] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.7436] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -41657,23 +37607,21 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -123.587] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 113.788 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_PARAM_ERROR) 83.6858 Tj -[1 0 0 1 155.686 113.788] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4906 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -86.1768 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -41690,36 +37638,41 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -112.478] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 101.833 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Returned) 36.5229 Tj -434 TJm (when) 21.579 Tj -434 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -434 TJm (parameter) 39.8305 Tj -434 TJm (to) 7.7509 Tj -434 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -433 TJm (function) 33.2053 Tj -434 TJm (call) 14.386 Tj -434 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -434 TJm (out) 12.7322 Tj -434 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -434 TJm (range) 22.1269 Tj -434 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -434 TJm (otherwise) 38.7346 Tj -434 TJm @@ -41728,36 +37681,28 @@ Q (incorrect.) 37.8977 Tj -1723 TJm (As) 11.0684 Tj -108 89.8778 Td +108 89.878 Td (with) 17.7135 Tj -[1 0 0 1 131.644 89.8778] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -131.644 -89.8778] cm -[1 0 0 1 0 0] Tm -0 0 Td -131.644 89.8778 Td -/F134_0 9.9626 Tf -(BZ_SEQUENCE_ERROR) 101.619 Tj -[1 0 0 1 233.263 89.8778] cm +131.644 89.878 Td +/F124_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -233.263 -89.8778] cm -[1 0 0 1 0 0] Tm -0 0 Td -233.263 89.8778 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +233.263 89.878 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj -595 TJm (this) 14.396 Tj -596 TJm (denotes) 30.4357 Tj -595 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -595 TJm (b) 4.9813 Tj 20 TJm @@ -41776,58 +37721,42 @@ Q (distinction) 42.0721 Tj -595 TJm (between) 33.1954 Tj -[1 0 0 1 108 77.9227] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -108 -77.9227] cm -[1 0 0 1 0 0] Tm -0 0 Td -108 77.9227 Td -/F134_0 9.9626 Tf +108 77.923 Td +/F124_0 9.9626 Tf (BZ_PARAM_ERROR) 83.6858 Tj -[1 0 0 1 191.686 77.9227] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -191.686 -77.9227] cm -[1 0 0 1 0 0] Tm -0 0 Td -194.177 77.9227 Td -/F130_0 9.9626 Tf +194.177 77.923 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 211.053 77.9227] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -211.053 -77.9227] cm -[1 0 0 1 0 0] Tm -0 0 Td -211.053 77.9227 Td -/F134_0 9.9626 Tf -(BZ_SEQUENCE_ERROR) 101.619 Tj -[1 0 0 1 312.672 77.9227] cm +211.054 77.923 Td +/F124_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -312.672 -77.9227] cm -[1 0 0 1 0 0] Tm -0 0 Td -315.163 77.9227 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +315.163 77.923 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (bit) 10.5205 Tj -250 TJm (hazy) 18.8094 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -250 TJm (b) 4.9813 Tj 20 TJm @@ -41840,7 +37769,6 @@ Q (orth) 16.0497 Tj -250 TJm (making.) 32.3785 Tj -[1 0 0 1 72 75.7659] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -41849,22 +37777,14 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -3.7659] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -21.1482] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -41889,7 +37809,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -41898,12 +37817,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -41912,18 +37825,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (10) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -41932,7 +37847,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -41941,12 +37855,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -41955,7 +37867,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 14 14 +%%Page: 11 14 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -41973,20 +37885,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -42011,7 +37919,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -42020,12 +37927,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -42034,36 +37935,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -42072,7 +37969,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -42081,35 +37977,31 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -21.5542] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -42122,23 +38014,15 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_MEM_ERROR) 71.7307 Tj -[1 0 0 1 143.731 710.037] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -74.2217 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -42155,16 +38039,21 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -708.727] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 698.082 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Returned) 36.5229 Tj -228 TJm (when) 21.579 Tj -227 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -228 TJm (request) 28.772 Tj -227 TJm @@ -42174,7 +38063,7 @@ Q -228 TJm (memory) 33.2053 Tj -227 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (ailed.) 21.8579 Tj -605 TJm @@ -42186,7 +38075,7 @@ Q -227 TJm (quantity) 32.6574 Tj -228 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -227 TJm (memory) 33.2053 Tj -228 TJm @@ -42196,13 +38085,13 @@ Q -227 TJm (decompress) 47.0334 Tj 108 686.127 Td -(a) 4.42339 Tj +(a) 4.4234 Tj -351 TJm (stream) 26.5603 Tj -352 TJm (cannot) 26.5603 Tj -351 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -352 TJm (determined) 44.8217 Tj -351 TJm @@ -42212,7 +38101,7 @@ Q -351 TJm (stream') 29.8778 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -351 TJm (header) 26.5503 Tj -352 TJm @@ -42223,84 +38112,60 @@ Q (read.) 19.6363 Tj -1228 TJm (So) 10.5205 Tj -[1 0 0 1 426.471 686.127] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -426.471 -686.127] cm -[1 0 0 1 0 0] Tm -0 0 Td 426.471 686.127 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 522.113 686.127] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -522.113 -686.127] cm -[1 0 0 1 0 0] Tm -0 0 Td 525.614 686.127 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 108 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -108 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td 108 674.172 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -[1 0 0 1 167.776 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -167.776 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td 172.13 674.172 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (may) 17.1556 Tj -437 TJm (return) 23.7907 Tj -[1 0 0 1 221.784 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -221.784 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td 221.784 674.172 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_MEM_ERROR) 71.7307 Tj -[1 0 0 1 293.515 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -293.515 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td 297.867 674.172 Td -/F130_0 9.9626 Tf -(e) 4.42339 Tj +/F122_0 9.9626 Tf +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(en) 9.40469 Tj +(en) 9.4047 Tj -437 TJm (though) 27.6761 Tj -437 TJm (some) 21.031 Tj -437 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -437 TJm (the) 12.1743 Tj -437 TJm @@ -42318,7 +38183,7 @@ Q -479 TJm (same) 20.4731 Tj -478 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -479 TJm (not) 12.7322 Tj -478 TJm @@ -42329,99 +38194,72 @@ Q (compression;) 53.1305 Tj -593 TJm (once) 18.8094 Tj -[1 0 0 1 301.675 662.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -301.675 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td 301.675 662.217 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 409.271 662.217] cm +/F124_0 9.9626 Tf +(BZ2_bzCompressInit) 107.5961 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -409.271 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td 414.04 662.217 Td -/F130_0 9.9626 Tf -(or) 8.29885 Tj -[1 0 0 1 427.107 662.217] cm +/F122_0 9.9626 Tf +(or) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -427.107 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td 427.107 662.217 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzWriteOpen) 89.6634 Tj -[1 0 0 1 516.771 662.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -516.771 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td 521.539 662.217 Td -/F130_0 9.9626 Tf -(ha) 9.40469 Tj +/F122_0 9.9626 Tf +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj -108 650.262 Td +(e) 4.4234 Tj +108 650.261 Td (successfully) 48.6972 Tj -250 TJm (completed,) 43.9948 Tj -[1 0 0 1 205.672 650.261] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -205.672 -650.261] cm -[1 0 0 1 0 0] Tm -0 0 Td 205.672 650.261 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_MEM_ERROR) 71.7307 Tj -[1 0 0 1 277.403 650.261] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -277.403 -650.261] cm -[1 0 0 1 0 0] Tm -0 0 Td 279.894 650.261 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (cannot) 26.5603 Tj -250 TJm (occur) 22.1269 Tj 55 TJm -(.) 2.49065 Tj -[1 0 0 1 72 648.105] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.985] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm +(.) 2.4907 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -42434,23 +38272,9 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -634.157] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 624.359 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_DATA_ERROR) 77.7083 Tj -[1 0 0 1 149.709 624.359] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -80.1993 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -42467,16 +38291,21 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -623.049] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 612.404 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Returned) 36.5229 Tj -266 TJm (when) 21.579 Tj -265 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -266 TJm (data) 16.5977 Tj -265 TJm @@ -42486,7 +38315,7 @@ Q -266 TJm (error) 19.3573 Tj -266 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -265 TJm (detected) 33.1954 Tj -266 TJm @@ -42500,7 +38329,7 @@ Q 1 TJm (y) 4.9813 Tj 64 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -269 TJm (this) 14.396 Tj -266 TJm @@ -42534,7 +38363,7 @@ Q 25 TJm (alue) 16.5977 Tj -222 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -223 TJm (also) 16.0497 Tj -222 TJm @@ -42544,9 +38373,9 @@ Q -222 TJm (detection) 36.5229 Tj -223 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -222 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -222 TJm @@ -42561,21 +38390,6 @@ Q (compressed) 47.0334 Tj -250 TJm (data.) 19.0883 Tj -[1 0 0 1 72 586.336] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.985] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -42588,23 +38402,29 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -572.389] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 562.59 Td -/F134_0 9.9626 Tf -(BZ_DATA_ERROR_MAGIC) 113.574 Tj -[1 0 0 1 185.574 562.59] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -116.065 -1.31] cm +/F124_0 9.9626 Tf +(BZ_DATA_ERROR_MAGIC) 113.5736 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -42621,52 +38441,39 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -561.28] cm -[1 0 0 1 0 0] Tm -0 0 Td 108 550.635 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (As) 11.0684 Tj -306 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -306 TJm (special) 27.6661 Tj -306 TJm (case) 17.1456 Tj -307 TJm -(of) 8.29885 Tj -[1 0 0 1 191.852 550.635] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -191.852 -550.635] cm -[1 0 0 1 0 0] Tm -0 0 Td 191.852 550.635 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_DATA_ERROR) 77.7083 Tj -[1 0 0 1 269.561 550.635] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -269.561 -550.635] cm -[1 0 0 1 0 0] Tm -0 0 Td 269.561 550.635 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -306 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -306 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -306 TJm (sometimes) 42.62 Tj --307 TJm -(usef) 16.5977 Tj -1 TJm -(ul) 7.7509 Tj +-306 TJm +(useful) 24.3486 Tj -307 TJm (to) 7.7509 Tj -306 TJm @@ -42698,48 +38505,25 @@ Q -250 TJm (bytes) 21.031 Tj -250 TJm -(\() 3.31755 Tj -[1 0 0 1 261.562 538.68] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -261.562 -538.68] cm -[1 0 0 1 0 0] Tm -0 0 Td 261.562 538.68 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf ('B') 17.9327 Tj -600 TJm ('Z') 17.9327 Tj -600 TJm ('h') 17.9327 Tj -[1 0 0 1 327.316 538.68] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -327.316 -538.68] cm -[1 0 0 1 0 0] Tm -0 0 Td 327.316 538.68 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\).) 5.8082 Tj -[1 0 0 1 72 536.523] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.985] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -42752,23 +38536,21 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -522.576] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 512.777 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_IO_ERROR) 65.7532 Tj -[1 0 0 1 137.753 512.777] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -68.2441 -1.3101] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -42785,70 +38567,59 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -511.467] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 500.822 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Returned) 36.5229 Tj -233 TJm (by) 9.9626 Tj -[1 0 0 1 159.123 500.822] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -159.123 -500.822] cm -[1 0 0 1 0 0] Tm -0 0 Td 159.123 500.822 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -[1 0 0 1 218.899 500.822] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -218.899 -500.822] cm -[1 0 0 1 0 0] Tm -0 0 Td 221.218 500.822 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 237.923 500.822] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -237.923 -500.822] cm -[1 0 0 1 0 0] Tm -0 0 Td -237.923 500.822 Td -/F134_0 9.9626 Tf +237.922 500.822 Td +/F124_0 9.9626 Tf (BZ2_bzWrite) 65.7532 Tj -[1 0 0 1 303.676 500.822] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -303.676 -500.822] cm -[1 0 0 1 0 0] Tm -0 0 Td 305.995 500.822 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (when) 21.579 Tj -233 TJm (there) 19.9152 Tj -232 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -233 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -233 TJm (error) 19.3573 Tj -233 TJm (reading) 29.8778 Tj -232 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -233 TJm (writing) 28.782 Tj -233 TJm @@ -42863,49 +38634,33 @@ Q (and) 14.386 Tj -357 TJm (by) 9.9626 Tj -[1 0 0 1 158.511 488.867] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -158.511 -488.867] cm -[1 0 0 1 0 0] Tm -0 0 Td 158.511 488.867 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzReadOpen) 83.6858 Tj -[1 0 0 1 242.197 488.867] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -242.197 -488.867] cm -[1 0 0 1 0 0] Tm -0 0 Td 245.755 488.867 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 263.698 488.867] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -263.698 -488.867] cm -[1 0 0 1 0 0] Tm -0 0 Td 263.698 488.867 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzWriteOpen) 89.6634 Tj -[1 0 0 1 353.362 488.867] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -353.362 -488.867] cm -[1 0 0 1 0 0] Tm -0 0 Td 356.92 488.867 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (for) 11.6164 Tj -357 TJm (attempts) 33.7633 Tj @@ -42914,7 +38669,7 @@ Q -357 TJm (use) 13.2801 Tj -357 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -357 TJm (\002le) 12.7322 Tj -357 TJm @@ -42929,60 +38684,44 @@ Q (indicator) 35.417 Tj -260 TJm (\(viz,) 17.9825 Tj -[1 0 0 1 166.603 476.912] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -166.603 -476.912] cm -[1 0 0 1 0 0] Tm -0 0 Td 166.603 476.912 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (ferror\(f\)) 53.798 Tj -[1 0 0 1 220.401 476.912] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -220.401 -476.912] cm -[1 0 0 1 0 0] Tm -0 0 Td 220.401 476.912 Td -/F130_0 9.9626 Tf -(\)) 3.31755 Tj +/F122_0 9.9626 Tf +(\)) 3.3175 Tj -260 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -260 TJm (set.) 13.5591 Tj --679 TJm +-680 TJm (On) 12.1743 Tj --260 TJm +-259 TJm (receipt) 27.1082 Tj -260 TJm -(of) 8.29885 Tj -[1 0 0 1 311.223 476.912] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -311.223 -476.912] cm -[1 0 0 1 0 0] Tm -0 0 Td 311.223 476.912 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_IO_ERROR) 65.7532 Tj -[1 0 0 1 376.976 476.912] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -376.976 -476.912] cm -[1 0 0 1 0 0] Tm -0 0 Td 376.976 476.912 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -260 TJm (the) 12.1743 Tj -260 TJm @@ -42991,49 +38730,33 @@ Q (should) 26.5703 Tj -260 TJm (consult) 28.782 Tj -[1 0 0 1 482.068 476.912] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -482.068 -476.912] cm -[1 0 0 1 0 0] Tm -0 0 Td 482.068 476.912 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (errno) 29.8878 Tj -[1 0 0 1 511.956 476.912] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.956 -476.912] cm -[1 0 0 1 0 0] Tm -0 0 Td 514.546 476.912 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and/or) 25.4544 Tj -[1 0 0 1 108 464.957] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -108 -464.957] cm -[1 0 0 1 0 0] Tm -0 0 Td -108 464.957 Td -/F134_0 9.9626 Tf +108 464.956 Td +/F124_0 9.9626 Tf (perror) 35.8654 Tj -[1 0 0 1 143.865 464.957] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -143.865 -464.957] cm -[1 0 0 1 0 0] Tm -0 0 Td -146.356 464.957 Td -/F130_0 9.9626 Tf +146.356 464.956 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj -250 TJm (acquire) 29.3199 Tj @@ -43049,21 +38772,6 @@ Q (the) 12.1743 Tj -250 TJm (problem.) 35.696 Tj -[1 0 0 1 72 462.8] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.9849] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43076,23 +38784,29 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -448.852] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 439.054 Td -/F134_0 9.9626 Tf -(BZ_UNEXPECTED_EOF) 101.619 Tj -[1 0 0 1 173.619 439.054] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -104.11 -1.31] cm +/F124_0 9.9626 Tf +(BZ_UNEXPECTED_EOF) 101.6185 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43109,35 +38823,24 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -437.744] cm -[1 0 0 1 0 0] Tm -0 0 Td 108 427.099 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Returned) 36.5229 Tj -250 TJm (by) 9.9626 Tj -[1 0 0 1 159.467 427.099] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -159.467 -427.099] cm -[1 0 0 1 0 0] Tm -0 0 Td 159.467 427.099 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -[1 0 0 1 219.242 427.099] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -219.242 -427.099] cm -[1 0 0 1 0 0] Tm -0 0 Td 221.733 427.099 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (when) 21.579 Tj -250 TJm (the) 12.1743 Tj @@ -43156,28 +38859,13 @@ Q -250 TJm (end) 14.386 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (stream) 26.5603 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (detected.) 35.686 Tj -[1 0 0 1 72 424.942] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -3.985] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43190,23 +38878,21 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -410.994] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 401.196 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_OUTBUFF_FULL) 89.6634 Tj -[1 0 0 1 161.664 401.196] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4906 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -92.1544 -1.31] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43223,63 +38909,52 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -399.886] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 108 389.241 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Returned) 36.5229 Tj -258 TJm (by) 9.9626 Tj -[1 0 0 1 159.632 389.241] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -159.632 -389.241] cm -[1 0 0 1 0 0] Tm -0 0 Td 159.632 389.241 Td -/F134_0 9.9626 Tf -(BZ2_bzBuffToBuffCompress) 143.461 Tj -[1 0 0 1 303.094 389.241] cm +/F124_0 9.9626 Tf +(BZ2_bzBuffToBuffCompress) 143.4614 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -303.094 -389.241] cm -[1 0 0 1 0 0] Tm -0 0 Td 305.668 389.241 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 322.627 389.241] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -322.627 -389.241] cm -[1 0 0 1 0 0] Tm -0 0 Td 322.627 389.241 Td -/F134_0 9.9626 Tf -(BZ2_bzBuffToBuffDecompress) 155.417 Tj -[1 0 0 1 478.044 389.241] cm +/F124_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.4166 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -478.044 -389.241] cm -[1 0 0 1 0 0] Tm -0 0 Td -480.618 389.241 Td -/F130_0 9.9626 Tf +480.617 389.241 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj -258 TJm (indicate) 31.5416 Tj -259 TJm (that) 14.9439 Tj -108 377.286 Td +108 377.285 Td (the) 12.1743 Tj -250 TJm (output) 25.4644 Tj @@ -43290,7 +38965,7 @@ Q -250 TJm (not) 12.7322 Tj -250 TJm -(\002t) 8.30881 Tj +(\002t) 8.3088 Tj -250 TJm (into) 15.5018 Tj -250 TJm @@ -43300,14 +38975,13 @@ Q -250 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -250 TJm (pro) 13.2801 Tj 15 TJm (vided.) 24.6275 Tj -[1 0 0 1 72 375.129] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43316,12 +38990,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -3.985] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43350,7 +39022,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43359,11 +39030,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -351.218] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 328.585 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (3.3.) 34.4584 Tj -278 TJm (Lo) 25.2447 Tj @@ -43373,7 +39041,6 @@ Q (vel) 28.7153 Tj -278 TJm (interface) 86.1046 Tj -[1 0 0 1 72 328.327] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43418,7 +39085,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43427,29 +39093,11 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -318.364] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 297.964 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.3.1.) 43.0729 Tj -[1 0 0 1 119.858 297.964] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -297.964] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 297.964 Td -/F392_0 17.2154 Tf -(BZ2_bzCompressInit) 185.926 Tj -[1 0 0 1 305.785 297.964] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -233.785 -2.3327] cm +-278 TJm +(BZ2_bzCompressInit) 171.2244 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43474,17 +39122,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -244.779] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43509,7 +39150,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43518,12 +39158,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43532,18 +39166,21 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.8518] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.8518 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.852 Td +/F122_0 9.9626 Tf (11) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43552,7 +39189,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43561,12 +39197,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43575,7 +39209,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 15 15 +%%Page: 12 15 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -43593,20 +39227,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43631,7 +39261,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43640,12 +39269,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43654,36 +39277,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43692,7 +39311,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43701,175 +39319,174 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -296.523] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 445.031] cm 0 0 468 274.969 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 271.382] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -711.631] cm [1 0 0 1 0 0] Tm 0 0 Td 90 711.631 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (typedef) 41.8429 Tj -426 TJm (struct) 35.8654 Tj -426 TJm -({) 5.97756 Tj -98.4879 699.676 Td +({) 5.9776 Tj +98.488 699.676 Td (char) 23.9102 Tj 126.642 697.933 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 132.62 699.676 Td (next_in;) 47.8205 Tj -98.4879 687.721 Td +98.488 687.721 Td (unsigned) 47.8205 Tj -426 TJm (int) 17.9327 Tj -426 TJm (avail_in;) 53.798 Tj -98.4879 675.766 Td +98.488 675.766 Td (unsigned) 47.8205 Tj -426 TJm (int) 17.9327 Tj -426 TJm (total_in_lo32;) 83.6858 Tj -98.4879 663.811 Td +98.488 663.811 Td (unsigned) 47.8205 Tj -426 TJm (int) 17.9327 Tj -426 TJm (total_in_hi32;) 83.6858 Tj -98.4879 639.9 Td +98.488 639.9 Td (char) 23.9102 Tj 126.642 638.157 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 132.62 639.9 Td (next_out;) 53.798 Tj -98.4879 627.945 Td +98.488 627.945 Td (unsigned) 47.8205 Tj -426 TJm (int) 17.9327 Tj -426 TJm (avail_out;) 59.7756 Tj -98.4879 615.99 Td +98.488 615.99 Td (unsigned) 47.8205 Tj -426 TJm (int) 17.9327 Tj -426 TJm (total_out_lo32;) 89.6634 Tj -98.4879 604.035 Td +98.488 604.035 Td (unsigned) 47.8205 Tj -426 TJm (int) 17.9327 Tj -426 TJm (total_out_hi32;) 89.6634 Tj -98.4879 580.125 Td +98.488 580.124 Td (void) 23.9102 Tj 126.642 578.381 Td -(*) 5.97756 Tj -132.62 580.125 Td +(*) 5.9776 Tj +132.62 580.124 Td (state;) 35.8654 Tj -98.4879 556.214 Td +98.488 556.214 Td (void) 23.9102 Tj 126.642 554.471 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 132.62 556.214 Td -(\() 5.97756 Tj +(\() 5.9776 Tj 138.597 554.471 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 144.575 556.214 Td (bzalloc\)\(void) 77.7083 Tj -226.527 554.471 Td -(*) 5.97756 Tj +226.528 554.471 Td +(*) 5.9776 Tj 232.505 556.214 Td (,int,int\);) 59.7756 Tj -98.4879 544.259 Td +98.488 544.259 Td (void) 23.9102 Tj -426 TJm -(\() 5.97756 Tj -132.62 542.516 Td -(*) 5.97756 Tj +(\() 5.9776 Tj +132.62 542.515 Td +(*) 5.9776 Tj 138.597 544.259 Td (bzfree\)\(void) 71.7307 Tj -214.572 542.516 Td -(*) 5.97756 Tj +214.572 542.515 Td +(*) 5.9776 Tj 220.55 544.259 Td (,void) 29.8878 Tj -254.682 542.516 Td -(*) 5.97756 Tj +254.682 542.515 Td +(*) 5.9776 Tj 260.659 544.259 Td (\);) 11.9551 Tj -98.4879 532.304 Td +98.488 532.304 Td (void) 23.9102 Tj 126.642 530.56 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 132.62 532.304 Td (opaque;) 41.8429 Tj -89.9999 520.349 Td -(}) 5.97756 Tj +90 520.349 Td +(}) 5.9776 Tj -426 TJm (bz_stream;) 59.7756 Tj -89.9999 496.438 Td +90 496.438 Td (int) 17.9327 Tj -426 TJm -(BZ2_bzCompressInit) 107.596 Tj +(BZ2_bzCompressInit) 107.5961 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (bz_stream) 53.798 Tj 292.281 494.695 Td -(*) 5.97756 Tj -298.258 496.438 Td +(*) 5.9776 Tj +298.259 496.438 Td (strm,) 29.8878 Tj 196.099 484.483 Td (int) 17.9327 Tj @@ -43885,12 +39502,6 @@ f (workFactor) 59.7756 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 445.031] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -43899,16 +39510,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -435.068] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 423.113 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Prepares) 34.3012 Tj -356 TJm (for) 11.6164 Tj @@ -43916,27 +39527,19 @@ f (compression.) 52.8516 Tj -1256 TJm (The) 15.4918 Tj -[1 0 0 1 209.409 423.113] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -209.409 -423.113] cm -[1 0 0 1 0 0] Tm -0 0 Td -209.409 423.113 Td -/F134_0 9.9626 Tf +209.41 423.113 Td +/F124_0 9.9626 Tf (bz_stream) 53.798 Tj -[1 0 0 1 263.208 423.113] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -263.208 -423.113] cm -[1 0 0 1 0 0] Tm -0 0 Td 266.754 423.113 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (structure) 34.8591 Tj -356 TJm (holds) 21.589 Tj @@ -43957,35 +39560,27 @@ f 25 TJm (vity) 15.5018 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -1256 TJm (A) 7.193 Tj -[1 0 0 1 72 411.158] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -411.158] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 411.158 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bz_stream) 53.798 Tj -[1 0 0 1 125.798 411.158] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -125.798 -411.158] cm -[1 0 0 1 0 0] Tm -0 0 Td 128.581 411.158 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (structure) 34.8591 Tj -279 TJm (should) 26.5703 Tj -280 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -279 TJm (allocated) 35.965 Tj -279 TJm @@ -44005,35 +39600,27 @@ f -279 TJm (\002elds) 21.589 Tj -279 TJm -(of) 8.29885 Tj -[1 0 0 1 431.939 411.158] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -431.939 -411.158] cm -[1 0 0 1 0 0] Tm -0 0 Td 431.939 411.158 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bz_stream) 53.798 Tj -[1 0 0 1 485.738 411.158] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -485.738 -411.158] cm -[1 0 0 1 0 0] Tm -0 0 Td 488.52 411.158 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (comprise) 36.5229 Tj -279 TJm (the) 12.1743 Tj 72 399.203 Td (entirety) 30.4357 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm @@ -44042,30 +39629,22 @@ f (-visible) 29.8878 Tj -250 TJm (data.) 19.0883 Tj -[1 0 0 1 204.422 399.203] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -204.422 -399.203] cm -[1 0 0 1 0 0] Tm -0 0 Td 204.422 399.203 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (state) 29.8878 Tj -[1 0 0 1 234.31 399.203] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -234.31 -399.203] cm -[1 0 0 1 0 0] Tm -0 0 Td 236.8 399.203 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (pointer) 28.224 Tj -250 TJm @@ -44088,21 +39667,15 @@ f (for) 11.6164 Tj -250 TJm (compression.) 52.8516 Tj -[1 0 0 1 72 397.046] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -387.083] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 377.285 Td -/F130_0 9.9626 Tf (Custom) 31.0036 Tj -372 TJm (memory) 33.2053 Tj @@ -44116,114 +39689,82 @@ f (via) 12.1743 Tj -372 TJm (\002elds) 21.589 Tj -[1 0 0 1 288.908 377.285] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -288.908 -377.285] cm -[1 0 0 1 0 0] Tm -0 0 Td 288.908 377.285 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzalloc) 41.8429 Tj -[1 0 0 1 330.751 377.285] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -330.751 -377.285] cm -[1 0 0 1 0 0] Tm -0 0 Td 330.751 377.285 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 337.253 377.285] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -337.253 -377.285] cm -[1 0 0 1 0 0] Tm -0 0 Td 337.253 377.285 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzfree) 35.8654 Tj -[1 0 0 1 373.118 377.285] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -373.118 -377.285] cm -[1 0 0 1 0 0] Tm -0 0 Td 373.118 377.285 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -403 TJm (and) 14.386 Tj -[1 0 0 1 397.714 377.285] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -397.714 -377.285] cm -[1 0 0 1 0 0] Tm -0 0 Td 397.714 377.285 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (opaque) 35.8654 Tj -[1 0 0 1 433.579 377.285] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -433.579 -377.285] cm -[1 0 0 1 0 0] Tm -0 0 Td 433.579 377.285 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -1353 TJm (The) 15.4918 Tj -372 TJm (v) 4.9813 Tj 25 TJm (alue) 16.5977 Tj -[1 0 0 1 493.782 377.285] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.782 -377.285] cm -[1 0 0 1 0 0] Tm -0 0 Td 493.782 377.285 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (opaque) 35.8654 Tj -[1 0 0 1 529.648 377.285] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -529.648 -377.285] cm -[1 0 0 1 0 0] Tm -0 0 Td 533.355 377.285 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj 72 365.33 Td (passed) 26.5603 Tj -306 TJm (to) 7.7509 Tj -306 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -306 TJm (the) 12.1743 Tj -306 TJm (\002rst) 15.5018 Tj -306 TJm -(ar) 7.74094 Tj +(ar) 7.7409 Tj 18 TJm (gument) 29.8878 Tj -306 TJm @@ -44234,56 +39775,40 @@ f (calls) 18.2614 Tj -305 TJm (to) 7.7509 Tj -[1 0 0 1 253.941 365.33] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -253.941 -365.33] cm -[1 0 0 1 0 0] Tm -0 0 Td 253.941 365.33 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzalloc) 41.8429 Tj -[1 0 0 1 295.784 365.33] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -295.784 -365.33] cm -[1 0 0 1 0 0] Tm -0 0 Td 298.832 365.33 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 316.266 365.33] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -316.266 -365.33] cm -[1 0 0 1 0 0] Tm -0 0 Td 316.266 365.33 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzfree) 35.8654 Tj -[1 0 0 1 352.132 365.33] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -352.132 -365.33] cm -[1 0 0 1 0 0] Tm -0 0 Td 352.132 365.33 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -320 TJm (b) 4.9813 Tj 20 TJm (ut) 7.7509 Tj -306 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -306 TJm (otherwise) 38.7346 Tj -306 TJm @@ -44295,45 +39820,37 @@ f -306 TJm (library) 26.5603 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -955 TJm (The) 15.4918 Tj 72 353.375 Td (call) 14.386 Tj -[1 0 0 1 89.4309 353.375] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -89.4309 -353.375] cm -[1 0 0 1 0 0] Tm -0 0 Td -89.4309 353.375 Td -/F134_0 9.9626 Tf +89.431 353.375 Td +/F124_0 9.9626 Tf (bzalloc) 41.8429 Tj -600 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -600 TJm (opaque,) 41.8429 Tj -600 TJm (n,) 11.9551 Tj -600 TJm -(m) 5.97756 Tj +(m) 5.9776 Tj -600 TJm -(\)) 5.97756 Tj -[1 0 0 1 232.893 353.375] cm +(\)) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -232.893 -353.375] cm -[1 0 0 1 0 0] Tm -0 0 Td 235.938 353.375 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -306 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xpected) 30.9837 Tj -305 TJm @@ -44341,94 +39858,70 @@ f -306 TJm (return) 23.7907 Tj -306 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -305 TJm (pointer) 28.224 Tj -[1 0 0 1 360.3 353.375] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -360.3 -353.375] cm -[1 0 0 1 0 0] Tm -0 0 Td 360.3 353.375 Td -/F134_0 9.9626 Tf -(p) 5.97756 Tj -[1 0 0 1 366.277 353.375] cm +/F124_0 9.9626 Tf +(p) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -366.277 -353.375] cm -[1 0 0 1 0 0] Tm -0 0 Td 369.322 353.375 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj -[1 0 0 1 380.118 353.375] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -380.118 -353.375] cm -[1 0 0 1 0 0] Tm -0 0 Td 380.118 353.375 Td -/F134_0 9.9626 Tf -(n) 5.97756 Tj +/F124_0 9.9626 Tf +(n) 5.9776 Tj 392.073 351.631 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 404.029 353.375 Td -(m) 5.97756 Tj -[1 0 0 1 410.006 353.375] cm +(m) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -410.006 -353.375] cm -[1 0 0 1 0 0] Tm -0 0 Td 413.051 353.375 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (bytes) 21.031 Tj -306 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -305 TJm (memory) 33.2053 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -320 TJm (and) 14.386 Tj -[1 0 0 1 504.135 353.375] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -504.135 -353.375] cm -[1 0 0 1 0 0] Tm -0 0 Td 504.135 353.375 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzfree) 35.8654 Tj 72 341.42 Td -(\() 5.97756 Tj +(\() 5.9776 Tj -600 TJm (opaque,) 41.8429 Tj -600 TJm -(p) 5.97756 Tj +(p) 5.9776 Tj -600 TJm -(\)) 5.97756 Tj -[1 0 0 1 149.709 341.42] cm +(\)) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -149.709 -341.42] cm -[1 0 0 1 0 0] Tm -0 0 Td 152.199 341.42 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (should) 26.5703 Tj -250 TJm (free) 15.4819 Tj @@ -44437,23 +39930,17 @@ f -250 TJm (memory) 33.2053 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 339.263] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -329.3] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 319.502 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj +(If) 6.6351 Tj -280 TJm (you) 14.9439 Tj -280 TJm @@ -44469,7 +39956,7 @@ f -280 TJm (use) 13.2801 Tj -280 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -280 TJm (custom) 28.782 Tj -280 TJm @@ -44477,102 +39964,70 @@ f -279 TJm (allocator) 34.8591 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -288 TJm (set) 11.0684 Tj -[1 0 0 1 299.9 319.502] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -299.9 -319.502] cm -[1 0 0 1 0 0] Tm -0 0 Td 299.9 319.502 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzalloc) 41.8429 Tj -[1 0 0 1 341.743 319.502] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -341.743 -319.502] cm -[1 0 0 1 0 0] Tm -0 0 Td 341.743 319.502 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 347.096 319.502] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -347.096 -319.502] cm -[1 0 0 1 0 0] Tm -0 0 Td 347.096 319.502 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzfree) 35.8654 Tj -[1 0 0 1 382.961 319.502] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -382.961 -319.502] cm -[1 0 0 1 0 0] Tm -0 0 Td 385.749 319.502 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 402.923 319.502] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -402.923 -319.502] cm -[1 0 0 1 0 0] Tm -0 0 Td 402.923 319.502 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (opaque) 35.8654 Tj -[1 0 0 1 438.788 319.502] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -438.788 -319.502] cm -[1 0 0 1 0 0] Tm -0 0 Td 441.576 319.502 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj -[1 0 0 1 452.115 319.502] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -452.115 -319.502] cm -[1 0 0 1 0 0] Tm -0 0 Td 452.115 319.502 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (NULL) 23.9102 Tj -[1 0 0 1 476.025 319.502] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -476.025 -319.502] cm -[1 0 0 1 0 0] Tm -0 0 Td 476.025 319.502 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -280 TJm (and) 14.386 Tj -280 TJm (the) 12.1743 Tj --279 TJm +-280 TJm (library) 26.5603 Tj 72 307.547 Td (will) 15.5018 Tj @@ -44584,168 +40039,114 @@ f (the) 12.1743 Tj -250 TJm (standard) 33.7533 Tj -[1 0 0 1 176.318 307.547] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -176.318 -307.547] cm -[1 0 0 1 0 0] Tm -0 0 Td 176.318 307.547 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (malloc) 35.8654 Tj -[1 0 0 1 212.183 307.547] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -212.183 -307.547] cm -[1 0 0 1 0 0] Tm -0 0 Td 214.674 307.547 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (/) 2.7696 Tj -[1 0 0 1 219.934 307.547] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -219.934 -307.547] cm -[1 0 0 1 0 0] Tm -0 0 Td 219.934 307.547 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (free) 23.9102 Tj -[1 0 0 1 243.844 307.547] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -243.844 -307.547] cm -[1 0 0 1 0 0] Tm -0 0 Td 246.335 307.547 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (routines.) 34.5901 Tj -[1 0 0 1 72 307.392] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -297.43] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 285.629 Td -/F130_0 9.9626 Tf (Before) 27.1082 Tj -362 TJm (calling) 27.1182 Tj -[1 0 0 1 133.438 285.629] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -133.438 -285.629] cm -[1 0 0 1 0 0] Tm -0 0 Td 133.438 285.629 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 241.035 285.629] cm +/F124_0 9.9626 Tf +(BZ2_bzCompressInit) 107.5961 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -241.035 -285.629] cm -[1 0 0 1 0 0] Tm -0 0 Td 241.035 285.629 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -390 TJm (\002elds) 21.589 Tj -[1 0 0 1 272.606 285.629] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -272.606 -285.629] cm -[1 0 0 1 0 0] Tm -0 0 Td 272.606 285.629 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzalloc) 41.8429 Tj -[1 0 0 1 314.449 285.629] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -314.449 -285.629] cm -[1 0 0 1 0 0] Tm -0 0 Td 314.449 285.629 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 320.825 285.629] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -320.825 -285.629] cm -[1 0 0 1 0 0] Tm -0 0 Td 320.825 285.629 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzfree) 35.8654 Tj -[1 0 0 1 356.69 285.629] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -356.69 -285.629] cm -[1 0 0 1 0 0] Tm -0 0 Td 360.296 285.629 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 378.288 285.629] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -378.288 -285.629] cm -[1 0 0 1 0 0] Tm -0 0 Td -378.288 285.629 Td -/F134_0 9.9626 Tf +378.289 285.629 Td +/F124_0 9.9626 Tf (opaque) 35.8654 Tj -[1 0 0 1 414.154 285.629] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -414.154 -285.629] cm -[1 0 0 1 0 0] Tm -0 0 Td 417.76 285.629 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (should) 26.5703 Tj -362 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -362 TJm (\002lled) 20.4831 Tj -362 TJm (appropriately) 53.1206 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj 72 273.674 Td -(as) 8.29885 Tj +(as) 8.2988 Tj -322 TJm (just) 14.396 Tj -323 TJm @@ -44763,11 +40164,11 @@ f -322 TJm (will) 15.5018 Tj -323 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -322 TJm (been) 18.8094 Tj -323 TJm @@ -44778,100 +40179,68 @@ f (initialised,) 41.7931 Tj -340 TJm (and) 14.386 Tj -[1 0 0 1 459.801 273.674] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -459.801 -273.674] cm -[1 0 0 1 0 0] Tm -0 0 Td 459.801 273.674 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (total_in_lo32) 77.7083 Tj -[1 0 0 1 537.509 273.674] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -537.509 -273.674] cm -[1 0 0 1 0 0] Tm -0 0 Td 537.509 273.674 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 72 261.718] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -261.718] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 261.718 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (total_in_hi32) 77.7083 Tj -[1 0 0 1 149.709 261.718] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -149.709 -261.718] cm -[1 0 0 1 0 0] Tm -0 0 Td 149.709 261.718 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 155.006 261.718] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -155.006 -261.718] cm -[1 0 0 1 0 0] Tm -0 0 Td 155.006 261.718 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (total_out_lo32) 83.6858 Tj -[1 0 0 1 238.692 261.718] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -238.692 -261.718] cm -[1 0 0 1 0 0] Tm -0 0 Td 241.435 261.718 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 258.564 261.718] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -258.564 -261.718] cm -[1 0 0 1 0 0] Tm -0 0 Td 258.564 261.718 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (total_out_hi32) 83.6858 Tj -[1 0 0 1 342.25 261.718] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.25 -261.718] cm -[1 0 0 1 0 0] Tm -0 0 Td 344.994 261.718 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -275 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -276 TJm (been) 18.8094 Tj -275 TJm @@ -44884,9 +40253,9 @@ f (These) 23.7907 Tj -275 TJm (four) 16.5977 Tj --276 TJm -(\002elds) 21.589 Tj -275 TJm +(\002elds) 21.589 Tj +-276 TJm (are) 12.1643 Tj 72 249.763 Td (used) 18.2614 Tj @@ -44905,7 +40274,7 @@ f -340 TJm (caller) 22.1269 Tj -339 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -340 TJm (the) 12.1743 Tj -339 TJm @@ -44913,7 +40282,7 @@ f -340 TJm (amount) 29.8878 Tj -339 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -340 TJm (data) 16.5977 Tj -340 TJm @@ -44925,13 +40294,13 @@ f -339 TJm (out) 12.7322 Tj -340 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -339 TJm (the) 12.1743 Tj -340 TJm (library) 26.5603 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -362 TJm (respecti) 30.9837 Tj 25 TJm @@ -44939,7 +40308,7 @@ f 15 TJm (ely) 12.1743 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj 72 237.808 Td (Y) 7.193 Tj 110 TJm @@ -44959,7 +40328,7 @@ f -1378 TJm (As) 11.0684 Tj -377 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -376 TJm (v) 4.9813 Tj 15 TJm @@ -44975,11 +40344,11 @@ f -377 TJm (maintained,) 46.7644 Tj -408 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(en) 9.40469 Tj +(en) 9.4047 Tj -376 TJm (on) 9.9626 Tj -376 TJm @@ -44990,27 +40359,19 @@ f (using) 21.589 Tj -371 TJm (the) 12.1743 Tj -[1 0 0 1 113.148 225.853] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -113.148 -225.853] cm -[1 0 0 1 0 0] Tm -0 0 Td 113.148 225.853 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (_hi32) 29.8878 Tj -[1 0 0 1 143.036 225.853] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -143.036 -225.853] cm -[1 0 0 1 0 0] Tm -0 0 Td 146.729 225.853 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\002elds) 21.589 Tj -371 TJm (to) 7.7509 Tj @@ -45025,7 +40386,7 @@ f -371 TJm (bits) 14.396 Tj -370 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -371 TJm (the) 12.1743 Tj -371 TJm @@ -45035,7 +40396,7 @@ f -400 TJm (for) 11.6164 Tj -371 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xample,) 31.8205 Tj -401 TJm @@ -45045,82 +40406,60 @@ f -370 TJm (amount) 29.8878 Tj -371 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -370 TJm (data) 16.5977 Tj -371 TJm (in) 7.7509 Tj -371 TJm -(is) 6.64505 Tj -[1 0 0 1 72 213.898] cm +(is) 6.6451 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -213.898] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 213.898 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (\(total_in_hi32) 83.6858 Tj -600 TJm (<<) 11.9551 Tj -600 TJm (32\)) 17.9327 Tj -600 TJm -(+) 5.97756 Tj +(+) 5.9776 Tj -600 TJm (total_in_lo32) 77.7083 Tj -[1 0 0 1 293.171 213.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -293.171 -213.898] cm -[1 0 0 1 0 0] Tm -0 0 Td 293.171 213.898 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 212.588] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -202.625] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 191.98 Td -/F130_0 9.9626 Tf -(P) 5.53921 Tj +(P) 5.5392 Tj 15 TJm (arameter) 34.8492 Tj -[1 0 0 1 115.367 191.98] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -115.367 -191.98] cm -[1 0 0 1 0 0] Tm -0 0 Td 115.367 191.98 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (blockSize100k) 77.7083 Tj -[1 0 0 1 193.076 191.98] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -193.076 -191.98] cm -[1 0 0 1 0 0] Tm -0 0 Td -196.204 191.98 Td -/F130_0 9.9626 Tf +196.205 191.98 Td +/F122_0 9.9626 Tf (speci\002es) 34.3112 Tj -314 TJm (the) 12.1743 Tj @@ -45131,7 +40470,7 @@ f -314 TJm (to) 7.7509 Tj -314 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -314 TJm (used) 18.2614 Tj -314 TJm @@ -45139,17 +40478,21 @@ f -314 TJm (compression.) 52.8516 Tj -1004 TJm -(It) 6.08715 Tj +(It) 6.0871 Tj -314 TJm (should) 26.5703 Tj -314 TJm -(be) 9.40469 Tj --315 TJm -(a) 4.42339 Tj +(be) 9.4047 Tj -314 TJm +(a) 4.4234 Tj +-315 TJm (v) 4.9813 Tj 25 TJm -(alue) 16.5977 Tj +(al) 7.193 Tj +1 TJm +(u) 4.9813 Tj +-1 TJm +(e) 4.4234 Tj -314 TJm (between) 33.1954 Tj -314 TJm @@ -45163,7 +40506,7 @@ f 25 TJm (v) 4.9813 Tj 15 TJm -(e,) 6.91404 Tj +(e,) 6.914 Tj -299 TJm (and) 14.386 Tj -289 TJm @@ -45177,7 +40520,7 @@ f -289 TJm (used) 18.2614 Tj -289 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -289 TJm (100000) 29.8878 Tj -289 TJm @@ -45193,7 +40536,7 @@ f 25 TJm (v) 4.9813 Tj 15 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -289 TJm (the) 12.1743 Tj -289 TJm @@ -45207,61 +40550,47 @@ f -289 TJm (tak) 12.1743 Tj 10 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -289 TJm (most) 19.3773 Tj 72 168.07 Td (memory) 33.2053 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 165.913] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -155.95] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 146.152 Td -/F130_0 9.9626 Tf -(P) 5.53921 Tj +(P) 5.5392 Tj 15 TJm (arameter) 34.8492 Tj -[1 0 0 1 115.095 146.152] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -115.095 -146.152] cm -[1 0 0 1 0 0] Tm -0 0 Td 115.095 146.152 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (verbosity) 53.798 Tj -[1 0 0 1 168.893 146.152] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -168.893 -146.152] cm -[1 0 0 1 0 0] Tm -0 0 Td 171.75 146.152 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (should) 26.5703 Tj -287 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -286 TJm (set) 11.0684 Tj -287 TJm (to) 7.7509 Tj -287 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -287 TJm (number) 30.4357 Tj -286 TJm @@ -45277,11 +40606,11 @@ f 25 TJm (v) 4.9813 Tj 15 TJm -(e.) 6.91404 Tj +(e.) 6.914 Tj -841 TJm (0) 4.9813 Tj -286 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -287 TJm (silent,) 24.0796 Tj -296 TJm @@ -45295,7 +40624,7 @@ f 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 72 134.197 Td (increasingly) 48.6972 Tj -342 TJm @@ -45309,7 +40638,7 @@ f -342 TJm (output.) 27.9551 Tj -1173 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -343 TJm (the) 12.1743 Tj -342 TJm @@ -45322,31 +40651,23 @@ f (compiled) 37.0808 Tj -342 TJm (with) 17.7135 Tj -[1 0 0 1 446.429 134.197] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -446.429 -134.197] cm -[1 0 0 1 0 0] Tm -0 0 Td 446.429 134.197 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-DBZ_NO_STDIO) 77.7083 Tj -[1 0 0 1 524.138 134.197] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -524.138 -134.197] cm -[1 0 0 1 0 0] Tm -0 0 Td 524.138 134.197 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -342 TJm (no) 9.9626 Tj -72 122.242 Td +72 122.241 Td (such) 18.2614 Tj -250 TJm (output) 25.4644 Tj @@ -45357,7 +40678,7 @@ f -250 TJm (for) 11.6164 Tj -250 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -250 TJm @@ -45366,45 +40687,31 @@ f (erbosity) 32.0995 Tj -250 TJm (setting.) 29.0609 Tj -[1 0 0 1 72 120.085] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -110.122] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 100.324 Td -/F130_0 9.9626 Tf -(P) 5.53921 Tj +(P) 5.5392 Tj 15 TJm (arameter) 34.8492 Tj -[1 0 0 1 116.619 100.324] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -116.619 -100.324] cm -[1 0 0 1 0 0] Tm -0 0 Td 116.619 100.324 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (workFactor) 59.7756 Tj -[1 0 0 1 176.394 100.324] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -176.394 -100.324] cm -[1 0 0 1 0 0] Tm -0 0 Td 180.775 100.324 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (controls) 32.0995 Tj -440 TJm (ho) 9.9626 Tj @@ -45414,14 +40721,14 @@ f (the) 12.1743 Tj -440 TJm (compression) 50.3609 Tj --440 TJm -(phase) 22.6848 Tj -439 TJm +(phase) 22.6848 Tj +-440 TJm (beha) 18.8094 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -440 TJm (when) 21.579 Tj -439 TJm @@ -45436,18 +40743,18 @@ f (case,) 19.6363 Tj -487 TJm (highly) 25.4644 Tj -72 88.3686 Td +72 88.368 Td (repetiti) 28.224 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(e,) 6.91404 Tj +(e,) 6.914 Tj -433 TJm (input) 20.4831 Tj -396 TJm (data.) 19.0883 Tj -1496 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -396 TJm (compression) 50.3609 Tj -396 TJm @@ -45469,7 +40776,7 @@ f 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -396 TJm (data,) 19.0883 Tj -432 TJm @@ -45480,17 +40787,10 @@ f (switches) 34.3112 Tj -396 TJm (from) 19.3673 Tj -[1 0 0 1 72 50.8518] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -45515,7 +40815,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -45524,12 +40823,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -45538,18 +40831,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.8518] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.8518 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.852 Td (12) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -45558,7 +40853,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -45567,12 +40861,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -45581,7 +40873,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 16 16 +%%Page: 13 16 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -45599,20 +40891,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -45637,7 +40925,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -45646,12 +40933,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -45660,36 +40941,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -45698,7 +40975,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -45707,39 +40983,39 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -741.554] cm [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (the) 12.1743 Tj -255 TJm (standard) 33.7533 Tj @@ -45750,9 +41026,9 @@ Q -254 TJm (to) 7.7509 Tj -255 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -255 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (allback) 28.772 Tj -254 TJm @@ -45760,11 +41036,11 @@ Q -648 TJm (The) 15.4918 Tj -255 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (allback) 28.772 Tj -254 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -255 TJm (slo) 11.6264 Tj 25 TJm @@ -45782,13 +41058,13 @@ Q -255 TJm (perhaps) 30.9837 Tj 72 698.082 Td -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (actor) 19.9152 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (three,) 22.4059 Tj -250 TJm @@ -45806,11 +41082,11 @@ Q 20 TJm (v) 4.9813 Tj 15 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -250 TJm (reasonably) 43.158 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -250 TJm (no) 9.9626 Tj -250 TJm @@ -45825,21 +41101,15 @@ Q (the) 12.1743 Tj -250 TJm (input.) 22.9738 Tj -[1 0 0 1 72 695.925] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9617] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -685.964] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 676.165 Td -/F130_0 9.9626 Tf +72 676.268 Td (Lo) 11.0684 Tj 25 TJm (wer) 14.9339 Tj @@ -45848,37 +41118,29 @@ Q 25 TJm (alues) 20.4731 Tj -239 TJm -(of) 8.29885 Tj -[1 0 0 1 138.421 676.165] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -138.421 -676.165] cm -[1 0 0 1 0 0] Tm -0 0 Td -138.421 676.165 Td -/F134_0 9.9626 Tf +138.421 676.268 Td +/F124_0 9.9626 Tf (workFactor) 59.7756 Tj -[1 0 0 1 198.197 676.165] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -198.197 -676.165] cm -[1 0 0 1 0 0] Tm -0 0 Td -200.585 676.165 Td -/F130_0 9.9626 Tf +200.585 676.268 Td +/F122_0 9.9626 Tf (reduce) 26.5503 Tj -240 TJm (the) 12.1743 Tj -239 TJm (amount) 29.8878 Tj -240 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -240 TJm -(ef) 7.74094 Tj +(ef) 7.7409 Tj 25 TJm (fort) 14.386 Tj -239 TJm @@ -45887,10 +41149,12 @@ Q (standard) 33.7533 Tj -240 TJm (algorithm) 38.7446 Tj --239 TJm -(will) 15.5018 Tj -240 TJm -(e) 4.42339 Tj +(wi) 9.9626 Tj +1 TJm +(ll) 5.5392 Tj +-240 TJm +(e) 4.4234 Tj 15 TJm (xpend) 24.3486 Tj -240 TJm @@ -45901,8 +41165,8 @@ Q (to) 7.7509 Tj -240 TJm (the) 12.1743 Tj -72 664.21 Td -(f) 3.31755 Tj +72 664.313 Td +(f) 3.3175 Tj 10 TJm (allback.) 31.2626 Tj -618 TJm @@ -45926,7 +41190,7 @@ Q 25 TJm (w) 7.193 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -248 TJm (and) 14.386 Tj -247 TJm @@ -45938,7 +41202,7 @@ Q -248 TJm (will) 15.5018 Tj -247 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -248 TJm (handled) 31.5416 Tj -247 TJm @@ -45946,15 +41210,15 @@ Q -248 TJm (the) 12.1743 Tj -247 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (allback) 28.772 Tj -248 TJm (algorithm) 38.7446 Tj -72 652.255 Td +72 652.358 Td (and) 14.386 Tj -308 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -308 TJm (compress) 37.6287 Tj -308 TJm @@ -45964,7 +41228,7 @@ Q 25 TJm (wly) 14.9439 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -322 TJm (too) 12.7322 Tj -309 TJm @@ -45974,7 +41238,7 @@ Q -308 TJm (your) 18.2614 Tj -309 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 15 TJm @@ -45999,7 +41263,7 @@ Q (lar) 10.5105 Tj 18 TJm (ge.) 11.8953 Tj -72 640.3 Td +72 640.402 Td (The) 15.4918 Tj -250 TJm (def) 12.7222 Tj @@ -46010,7 +41274,7 @@ Q 25 TJm (alue) 16.5977 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (30) 9.9626 Tj -250 TJm @@ -46018,7 +41282,7 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -250 TJm (reasonable) 42.6001 Tj -250 TJm @@ -46030,32 +41294,26 @@ Q 15 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (wide) 19.3673 Tj -250 TJm (range) 22.1269 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (circumstances.) 58.9288 Tj -[1 0 0 1 72 638.143] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9617] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -628.181] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 618.383 Td -/F130_0 9.9626 Tf +72 618.588 Td (Allo) 17.7135 Tj 25 TJm (w) 7.193 Tj @@ -46080,13 +41338,13 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(e.) 6.91404 Tj +(e.) 6.914 Tj -620 TJm (0) 4.9813 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (special) 27.6661 Tj -250 TJm @@ -46112,24 +41370,18 @@ Q 25 TJm (alue) 16.5977 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (30.) 12.4533 Tj -[1 0 0 1 72 616.226] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9617] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -606.265] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 596.466 Td -/F130_0 9.9626 Tf +72 596.774 Td (Note) 19.3673 Tj -250 TJm (that) 14.9439 Tj @@ -46142,55 +41394,49 @@ Q -250 TJm (generated) 38.7246 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (the) 12.1743 Tj -250 TJm (same) 20.4731 Tj -250 TJm -(re) 7.74094 Tj +(re) 7.7409 Tj 15 TJm (g) 4.9813 Tj 5 TJm (ardless) 27.6661 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (whether) 32.0895 Tj -250 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm (not) 12.7322 Tj -250 TJm (the) 12.1743 Tj -250 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (allback) 28.772 Tj -250 TJm (algorithm) 38.7446 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (used.) 20.7521 Tj -[1 0 0 1 72 594.309] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9617] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -584.348] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 574.549 Td -/F130_0 9.9626 Tf +72 574.96 Td (Be) 11.0684 Tj -303 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 15 TJm (w) 7.193 Tj 10 TJm @@ -46218,39 +41464,39 @@ Q 15 TJm (ersions) 28.224 Tj -303 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -303 TJm (the) 12.1743 Tj -304 TJm (library) 26.5603 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -938 TJm -(In) 8.29885 Tj +(In) 8.2988 Tj -303 TJm (principle) 35.417 Tj -303 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -304 TJm (should) 26.5703 Tj -303 TJm -(be) 9.40469 Tj -72 562.594 Td +(be) 9.4047 Tj +72 563.005 Td (possible) 32.6574 Tj -270 TJm (to) 7.7509 Tj -270 TJm -(de) 9.40469 Tj +(de) 9.4047 Tj 25 TJm (vise) 16.0497 Tj -270 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -270 TJm (good) 19.9252 Tj -270 TJm (w) 7.193 Tj 10 TJm -(ay) 9.40469 Tj +(ay) 9.4047 Tj -270 TJm (to) 7.7509 Tj -271 TJm @@ -46270,11 +41516,9 @@ Q -740 TJm (Such) 19.9252 Tj -270 TJm -(a) 4.42339 Tj --271 TJm -(m) 7.7509 Tj -1 TJm -(echanism) 37.6287 Tj +(a) 4.4234 Tj +-270 TJm +(mechanism) 45.3796 Tj -271 TJm (w) 7.193 Tj 10 TJm @@ -46283,25 +41527,19 @@ Q (render) 25.4445 Tj -270 TJm (the) 12.1743 Tj -72 550.639 Td +72 551.049 Td (parameter) 39.8305 Tj -250 TJm (obsolete.) 35.696 Tj -[1 0 0 1 72 548.482] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9616] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -538.521] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 528.722 Td -/F130_0 9.9626 Tf +72 529.235 Td (Possible) 33.2153 Tj -250 TJm (return) 23.7907 Tj @@ -46309,44 +41547,41 @@ Q (v) 4.9813 Tj 25 TJm (alues:) 23.2427 Tj -[1 0 0 1 72 528.623] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -144.458] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 384.677] cm 0 0 468 143.462 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 139.875] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -519.258] cm [1 0 0 1 0 0] Tm 0 0 Td -90 519.258 Td -/F134_0 9.9626 Tf +90 519.771 Td +/F124_0 9.9626 Tf (BZ_CONFIG_ERROR) 89.6634 Tj -98.4879 507.303 Td +98.488 507.816 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -46358,9 +41593,9 @@ f (been) 23.9102 Tj -426 TJm (mis-compiled) 71.7307 Tj -90 495.348 Td +90 495.86 Td (BZ_PARAM_ERROR) 83.6858 Tj -98.4879 483.392 Td +98.488 483.905 Td (if) 11.9551 Tj -426 TJm (strm) 23.9102 Tj @@ -46368,57 +41603,57 @@ f (is) 11.9551 Tj -426 TJm (NULL) 23.9102 Tj -98.4879 471.437 Td +98.488 471.95 Td (or) 11.9551 Tj -426 TJm (blockSize) 53.798 Tj -426 TJm -(<) 5.97756 Tj +(<) 5.9776 Tj -426 TJm -(1) 5.97756 Tj +(1) 5.9776 Tj -426 TJm (or) 11.9551 Tj -426 TJm (blockSize) 53.798 Tj -426 TJm -(>) 5.97756 Tj +(>) 5.9776 Tj -426 TJm -(9) 5.97756 Tj -98.4879 459.482 Td +(9) 5.9776 Tj +98.488 459.995 Td (or) 11.9551 Tj -426 TJm (verbosity) 53.798 Tj -426 TJm -(<) 5.97756 Tj +(<) 5.9776 Tj -426 TJm -(0) 5.97756 Tj +(0) 5.9776 Tj -426 TJm (or) 11.9551 Tj -426 TJm (verbosity) 53.798 Tj -426 TJm -(>) 5.97756 Tj +(>) 5.9776 Tj -426 TJm -(4) 5.97756 Tj -98.4879 447.527 Td +(4) 5.9776 Tj +98.488 448.04 Td (or) 11.9551 Tj -426 TJm (workFactor) 59.7756 Tj -426 TJm -(<) 5.97756 Tj +(<) 5.9776 Tj -426 TJm -(0) 5.97756 Tj +(0) 5.9776 Tj -426 TJm (or) 11.9551 Tj -426 TJm (workFactor) 59.7756 Tj -426 TJm -(>) 5.97756 Tj +(>) 5.9776 Tj -426 TJm (250) 17.9327 Tj -90 435.572 Td +90 436.085 Td (BZ_MEM_ERROR) 71.7307 Tj -98.4879 423.617 Td +98.488 424.129 Td (if) 11.9551 Tj -426 TJm (not) 17.9327 Tj @@ -46430,16 +41665,10 @@ f (is) 11.9551 Tj -426 TJm (available) 53.798 Tj -90 411.661 Td +90 412.174 Td (BZ_OK) 29.8878 Tj -98.4879 399.706 Td +98.488 400.219 Td (otherwise) 53.798 Tj -[1 0 0 1 72 384.165] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -46448,65 +41677,62 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5482] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -374.203] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 362.248 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 362.863 Td +/F122_0 9.9626 Tf (Allo) 17.7135 Tj 25 TJm (w) 7.193 Tj 10 TJm (able) 16.5977 Tj -250 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 15 TJm (xt) 7.7509 Tj -250 TJm (actions:) 30.9936 Tj -[1 0 0 1 72 362.148] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -48.8169] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 47.8207 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 313.947] cm +0 0 468 47.821 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 44.2341] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -352.783] cm [1 0 0 1 0 0] Tm 0 0 Td -90 352.783 Td -/F134_0 9.9626 Tf +90 353.399 Td +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -98.4879 340.828 Td +98.488 341.444 Td (if) 11.9551 Tj -426 TJm (BZ_OK) 29.8878 Tj @@ -46514,7 +41740,7 @@ f (is) 11.9551 Tj -426 TJm (returned) 47.8205 Tj -98.4879 328.873 Td +98.488 329.488 Td (no) 11.9551 Tj -426 TJm (specific) 47.8205 Tj @@ -46530,21 +41756,6 @@ f (of) 11.9551 Tj -426 TJm (error) 29.8878 Tj -[1 0 0 1 72 313.331] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -46569,7 +41780,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9616] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -46578,29 +41788,23 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -303.37] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 282.711 Td -/F122_0 17.2154 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 283.429 Td +/F116_0 17.2154 Tf (3.3.2.) 43.0729 Tj -[1 0 0 1 119.858 282.711] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -282.711] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 282.711 Td -/F392_0 17.2154 Tf -(BZ2_bzCompress) 144.609 Tj -[1 0 0 1 264.468 282.711] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -192.468 -2.3327] cm +-278 TJm +(BZ2_bzCompress) 145.4013 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -46625,47 +41829,45 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 254.959] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3685] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -271.014] cm [1 0 0 1 0 0] Tm 0 0 Td -90 271.014 Td -/F134_0 9.9626 Tf +90 270.501 Td +/F124_0 9.9626 Tf (int) 17.9327 Tj -426 TJm (BZ2_bzCompress) 83.6858 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (bz_stream) 53.798 Tj -268.371 269.27 Td -(*) 5.97756 Tj -274.348 271.014 Td +268.371 268.757 Td +(*) 5.9776 Tj +274.348 270.501 Td (strm,) 29.8878 Tj -426 TJm (int) 17.9327 Tj @@ -46673,12 +41875,6 @@ f (action) 35.8654 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 255.472] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -46687,16 +41883,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5482] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -245.51] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 233.555 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 233.145 Td +/F122_0 9.9626 Tf (Pro) 13.8381 Tj 15 TJm (vides) 21.031 Tj @@ -46711,7 +41907,7 @@ f -222 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -221 TJm @@ -46723,7 +41919,7 @@ f -221 TJm (library) 26.5603 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -601 TJm (The) 15.4918 Tj -222 TJm @@ -46739,34 +41935,26 @@ f -222 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fers,) 17.4246 Tj -227 TJm (and) 14.386 Tj -222 TJm (calls) 18.2614 Tj -[1 0 0 1 72 221.6] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -221.6] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 221.6 Td -/F134_0 9.9626 Tf +72 221.19 Td +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 155.686 221.6] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -155.686 -221.6] cm -[1 0 0 1 0 0] Tm -0 0 Td -158.177 221.6 Td -/F130_0 9.9626 Tf +158.177 221.19 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj -250 TJm (transfer) 30.4258 Tj @@ -46776,21 +41964,15 @@ f (between) 33.1954 Tj -250 TJm (them.) 22.4159 Tj -[1 0 0 1 72 220.066] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9617] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -210.104] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 199.683 Td -/F130_0 9.9626 Tf +72 199.375 Td (Before) 27.1082 Tj -212 TJm (each) 18.2515 Tj @@ -46798,49 +41980,33 @@ f (call) 14.386 Tj -212 TJm (to) 7.7509 Tj -[1 0 0 1 147.961 199.683] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -147.961 -199.683] cm -[1 0 0 1 0 0] Tm -0 0 Td -147.961 199.683 Td -/F134_0 9.9626 Tf +147.961 199.375 Td +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 231.647 199.683] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -231.647 -199.683] cm -[1 0 0 1 0 0] Tm -0 0 Td -231.647 199.683 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 236.329 199.683] cm +231.647 199.375 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -236.329 -199.683] cm -[1 0 0 1 0 0] Tm -0 0 Td -236.329 199.683 Td -/F134_0 9.9626 Tf +236.329 199.375 Td +/F124_0 9.9626 Tf (next_in) 41.8429 Tj -[1 0 0 1 278.172 199.683] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -278.172 -199.683] cm -[1 0 0 1 0 0] Tm -0 0 Td -280.288 199.683 Td -/F130_0 9.9626 Tf +280.288 199.375 Td +/F122_0 9.9626 Tf (should) 26.5703 Tj -212 TJm (point) 20.4831 Tj @@ -46852,35 +42018,27 @@ f (data) 16.5977 Tj -212 TJm (to) 7.7509 Tj --212 TJm -(be) 9.40469 Tj -213 TJm +(be) 9.4047 Tj +-212 TJm (compressed,) 49.5241 Tj -220 TJm (and) 14.386 Tj -[1 0 0 1 463.493 199.683] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -463.493 -199.683] cm -[1 0 0 1 0 0] Tm -0 0 Td -463.493 199.683 Td -/F134_0 9.9626 Tf +463.493 199.375 Td +/F124_0 9.9626 Tf (avail_in) 47.8205 Tj -[1 0 0 1 511.314 199.683] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.314 -199.683] cm -[1 0 0 1 0 0] Tm -0 0 Td -513.43 199.683 Td -/F130_0 9.9626 Tf +513.43 199.375 Td +/F122_0 9.9626 Tf (should) 26.5703 Tj -72 187.728 Td +72 187.42 Td (indicate) 31.5416 Tj -246 TJm (ho) 9.9626 Tj @@ -46889,7 +42047,7 @@ f -247 TJm (m) 7.7509 Tj 1 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 14 TJm (y) 4.9813 Tj -246 TJm @@ -46902,93 +42060,61 @@ f (may) 17.1556 Tj -246 TJm (read.) 19.6363 Tj -[1 0 0 1 259.242 187.728] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -259.242 -187.728] cm -[1 0 0 1 0 0] Tm -0 0 Td -259.242 187.728 Td -/F134_0 9.9626 Tf +259.242 187.42 Td +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 342.929 187.728] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.929 -187.728] cm -[1 0 0 1 0 0] Tm -0 0 Td -345.382 187.728 Td -/F130_0 9.9626 Tf +345.382 187.42 Td +/F122_0 9.9626 Tf (updates) 30.4357 Tj -[1 0 0 1 378.271 187.728] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -378.271 -187.728] cm -[1 0 0 1 0 0] Tm -0 0 Td -378.271 187.728 Td -/F134_0 9.9626 Tf +378.271 187.42 Td +/F124_0 9.9626 Tf (next_in) 41.8429 Tj -[1 0 0 1 420.114 187.728] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -420.114 -187.728] cm -[1 0 0 1 0 0] Tm -0 0 Td -420.114 187.728 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 425.066 187.728] cm +420.114 187.42 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -425.066 -187.728] cm -[1 0 0 1 0 0] Tm -0 0 Td -425.066 187.728 Td -/F134_0 9.9626 Tf +425.066 187.42 Td +/F124_0 9.9626 Tf (avail_in) 47.8205 Tj -[1 0 0 1 472.886 187.728] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.886 -187.728] cm -[1 0 0 1 0 0] Tm -0 0 Td -475.34 187.728 Td -/F130_0 9.9626 Tf +475.34 187.42 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 492.179 187.728] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -492.179 -187.728] cm -[1 0 0 1 0 0] Tm -0 0 Td -492.179 187.728 Td -/F134_0 9.9626 Tf +492.179 187.42 Td +/F124_0 9.9626 Tf (total_in) 47.8205 Tj -[1 0 0 1 540 187.728] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -187.728] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 175.773 Td -/F130_0 9.9626 Tf +72 175.465 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj -250 TJm (re\003ect) 24.8965 Tj @@ -46997,65 +42123,51 @@ f -250 TJm (number) 30.4357 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (bytes) 21.031 Tj -250 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -250 TJm (has) 13.2801 Tj -250 TJm (read.) 19.6363 Tj -[1 0 0 1 72 173.616] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9616] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -163.654] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 153.856 Td -/F130_0 9.9626 Tf +72 153.651 Td (Similarly) 37.0908 Tj 65 TJm -(,) 2.49065 Tj -[1 0 0 1 113.611 153.856] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -113.611 -153.856] cm -[1 0 0 1 0 0] Tm -0 0 Td -113.611 153.856 Td -/F134_0 9.9626 Tf +113.611 153.651 Td +/F124_0 9.9626 Tf (next_out) 47.8205 Tj -[1 0 0 1 161.432 153.856] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -161.432 -153.856] cm -[1 0 0 1 0 0] Tm -0 0 Td -164.072 153.856 Td -/F130_0 9.9626 Tf +164.072 153.651 Td +/F122_0 9.9626 Tf (should) 26.5703 Tj -265 TJm (point) 20.4831 Tj -265 TJm (to) 7.7509 Tj -265 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -265 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -265 TJm @@ -47069,38 +42181,30 @@ f -265 TJm (data) 16.5977 Tj -265 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -265 TJm (to) 7.7509 Tj -265 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -265 TJm (placed,) 28.493 Tj -269 TJm (with) 17.7135 Tj -[1 0 0 1 464.742 153.856] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -464.742 -153.856] cm -[1 0 0 1 0 0] Tm -0 0 Td -464.742 153.856 Td -/F134_0 9.9626 Tf +464.742 153.651 Td +/F124_0 9.9626 Tf (avail_out) 53.798 Tj -[1 0 0 1 518.54 153.856] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -518.54 -153.856] cm -[1 0 0 1 0 0] Tm -0 0 Td -521.181 153.856 Td -/F130_0 9.9626 Tf +521.181 153.651 Td +/F122_0 9.9626 Tf (indi-) 18.8194 Tj -72 141.901 Td +72 141.696 Td (cating) 24.3486 Tj -209 TJm (ho) 9.9626 Tj @@ -47113,100 +42217,68 @@ f -209 TJm (space) 22.1269 Tj -209 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -210 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 25 TJm (ailable.) 29.0509 Tj -[1 0 0 1 243.087 141.901] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -243.087 -141.901] cm -[1 0 0 1 0 0] Tm -0 0 Td -243.087 141.901 Td -/F134_0 9.9626 Tf +243.087 141.696 Td +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 326.773 141.901] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -326.773 -141.901] cm -[1 0 0 1 0 0] Tm -0 0 Td -328.856 141.901 Td -/F130_0 9.9626 Tf +328.856 141.696 Td +/F122_0 9.9626 Tf (updates) 30.4357 Tj -[1 0 0 1 361.375 141.901] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -361.375 -141.901] cm -[1 0 0 1 0 0] Tm -0 0 Td -361.375 141.901 Td -/F134_0 9.9626 Tf +361.375 141.696 Td +/F124_0 9.9626 Tf (next_out) 47.8205 Tj -[1 0 0 1 409.196 141.901] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -409.196 -141.901] cm -[1 0 0 1 0 0] Tm -0 0 Td -409.196 141.901 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 413.851 141.901] cm +409.196 141.696 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -413.851 -141.901] cm -[1 0 0 1 0 0] Tm -0 0 Td -413.851 141.901 Td -/F134_0 9.9626 Tf +413.851 141.696 Td +/F124_0 9.9626 Tf (avail_out) 53.798 Tj -[1 0 0 1 467.649 141.901] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -467.649 -141.901] cm -[1 0 0 1 0 0] Tm -0 0 Td -469.732 141.901 Td -/F130_0 9.9626 Tf +469.732 141.696 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 486.202 141.901] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -486.202 -141.901] cm -[1 0 0 1 0 0] Tm -0 0 Td -486.202 141.901 Td -/F134_0 9.9626 Tf +486.202 141.696 Td +/F124_0 9.9626 Tf (total_out) 53.798 Tj -[1 0 0 1 540 141.901] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -141.901] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 129.946 Td -/F130_0 9.9626 Tf +72 129.74 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj -250 TJm (re\003ect) 24.8965 Tj @@ -47215,26 +42287,20 @@ f -250 TJm (number) 30.4357 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (bytes) 21.031 Tj -250 TJm (output.) 27.9551 Tj -[1 0 0 1 72 127.789] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9617] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -117.827] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 108.029 Td -/F130_0 9.9626 Tf +72 107.926 Td (Y) 7.193 Tj 110 TJm (ou) 9.9626 Tj @@ -47251,27 +42317,27 @@ f 15 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -272 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -272 TJm (little) 18.2714 Tj -272 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -272 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -272 TJm (much) 22.1369 Tj -271 TJm (data) 16.5977 Tj -272 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -272 TJm (you) 14.9439 Tj -272 TJm (lik) 10.5205 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -272 TJm (on) 9.9626 Tj -272 TJm @@ -47279,39 +42345,31 @@ f -272 TJm (call) 14.386 Tj -272 TJm -(of) 8.29885 Tj -[1 0 0 1 399.123 108.029] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -399.123 -108.029] cm -[1 0 0 1 0 0] Tm -0 0 Td -399.123 108.029 Td -/F134_0 9.9626 Tf +399.123 107.926 Td +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 482.809 108.029] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -482.809 -108.029] cm -[1 0 0 1 0 0] Tm -0 0 Td -482.809 108.029 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +482.809 107.926 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj -752 TJm -(In) 8.29885 Tj +(In) 8.2988 Tj -272 TJm (the) 12.1743 Tj -272 TJm (limit,) 21.32 Tj -72 96.0736 Td -(it) 5.53921 Tj +72 95.971 Td +(it) 5.5392 Tj -266 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -265 TJm (acceptable) 42.0422 Tj -266 TJm @@ -47325,7 +42383,7 @@ f 15 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -266 TJm (data) 16.5977 Tj -266 TJm @@ -47335,7 +42393,7 @@ f -266 TJm (at) 7.193 Tj -266 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -266 TJm (time,) 20.2042 Tj -269 TJm @@ -47347,7 +42405,7 @@ f 10 TJm (ould) 17.7135 Tj -265 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -266 TJm (terribly) 29.3299 Tj -266 TJm @@ -47360,7 +42418,7 @@ f (ou) 9.9626 Tj -266 TJm (should) 26.5703 Tj -72 84.1184 Td +72 84.016 Td (al) 7.193 Tj 10 TJm (w) 7.193 Tj @@ -47379,15 +42437,15 @@ f -250 TJm (byte) 17.1556 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (output) 25.4644 Tj -250 TJm (space) 22.1269 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 25 TJm @@ -47398,27 +42456,18 @@ f (each) 18.2515 Tj -250 TJm (call.) 16.8766 Tj -[1 0 0 1 72 81.9616] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9616] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -21.1482] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -47443,7 +42492,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -47452,12 +42500,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -47466,18 +42508,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (13) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -47486,7 +42530,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -47495,12 +42538,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -47509,7 +42550,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 17 17 +%%Page: 14 17 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -47527,20 +42568,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -47565,7 +42602,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -47574,12 +42610,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -47588,36 +42618,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -47626,7 +42652,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -47635,108 +42660,94 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -741.554] cm [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (A) 7.193 Tj -250 TJm (second) 27.6661 Tj -250 TJm (purpose) 31.5416 Tj -250 TJm -(of) 8.29885 Tj -[1 0 0 1 156.662 710.037] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -156.662 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 156.662 710.037 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 240.348 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -240.348 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 242.839 710.037 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -250 TJm (to) 7.7509 Tj -250 TJm (request) 28.772 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (change) 28.2141 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (mode) 22.1369 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm (compressed) 47.0334 Tj -250 TJm (stream.) 29.0509 Tj -[1 0 0 1 72 707.88] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -697.918] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 688.12 Td -/F130_0 9.9626 Tf (Conceptually) 53.1305 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -217 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -210 TJm (compressed) 47.0334 Tj -209 TJm @@ -47744,13 +42755,13 @@ Q -209 TJm (can) 13.8281 Tj -209 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -210 TJm (in) 7.7509 Tj -209 TJm (one) 14.386 Tj -209 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -209 TJm (four) 16.5977 Tj -210 TJm @@ -47758,7 +42769,7 @@ Q -289 TJm (IDLE,) 25.1755 Tj -209 TJm -(R) 6.64505 Tj +(R) 6.6451 Tj 40 TJm (UNNING,) 41.7732 Tj -210 TJm @@ -47774,29 +42785,21 @@ Q -264 TJm (initialisation) 49.823 Tj -263 TJm -(\() 3.31755 Tj -[1 0 0 1 146.434 676.164] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -146.434 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td 146.434 676.164 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 254.031 676.164] cm +/F124_0 9.9626 Tf +(BZ2_bzCompressInit) 107.5961 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -254.031 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td 254.031 676.164 Td -/F130_0 9.9626 Tf -(\)) 3.31755 Tj +/F122_0 9.9626 Tf +(\)) 3.3175 Tj -264 TJm (and) 14.386 Tj -263 TJm @@ -47804,101 +42807,79 @@ Q -264 TJm (termination) 45.9375 Tj -264 TJm -(\() 3.31755 Tj -[1 0 0 1 349.75 676.164] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -349.75 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td 349.75 676.164 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressEnd) 101.619 Tj -[1 0 0 1 451.369 676.164] cm +/F124_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -451.369 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td 451.369 676.164 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\),) 5.8082 Tj -267 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -264 TJm (stream) 26.5603 Tj -264 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -263 TJm -(re) 7.74094 Tj +(re) 7.7409 Tj 15 TJm (g) 4.9813 Tj 5 TJm (arded) 22.1269 Tj 72 664.209 Td -(as) 8.29885 Tj +(as) 8.2988 Tj -250 TJm (IDLE.) 25.1755 Tj -[1 0 0 1 72 664.11] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -654.147] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 642.291 Td -/F130_0 9.9626 Tf (Upon) 22.1369 Tj -389 TJm (initialisation) 49.823 Tj -390 TJm -(\() 3.31755 Tj -[1 0 0 1 155.036 642.291] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -155.036 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td 155.036 642.291 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 262.632 642.291] cm +/F124_0 9.9626 Tf +(BZ2_bzCompressInit) 107.5961 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -262.632 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td 262.632 642.291 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\),) 5.8082 Tj -424 TJm (the) 12.1743 Tj -390 TJm (stream) 26.5603 Tj -389 TJm -(is) 6.64505 Tj --389 TJm -(placed) 26.0024 Tj +(is) 6.6451 Tj -390 TJm +(placed) 26.0024 Tj +-389 TJm (in) 7.7509 Tj -389 TJm (the) 12.1743 Tj -390 TJm -(R) 6.64505 Tj +(R) 6.6451 Tj 40 TJm (UNNING) 39.2825 Tj -389 TJm @@ -47909,65 +42890,51 @@ Q (calls) 18.2614 Tj 72 630.336 Td (to) 7.7509 Tj -[1 0 0 1 83.818 630.336] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -83.818 -630.336] cm -[1 0 0 1 0 0] Tm -0 0 Td 83.818 630.336 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 167.504 630.336] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -167.504 -630.336] cm -[1 0 0 1 0 0] Tm -0 0 Td 171.571 630.336 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (should) 26.5703 Tj -408 TJm (pass) 17.1556 Tj -[1 0 0 1 223.431 630.336] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -223.431 -630.336] cm -[1 0 0 1 0 0] Tm -0 0 Td 223.431 630.336 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_RUN) 35.8654 Tj -[1 0 0 1 259.297 630.336] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -259.297 -630.336] cm -[1 0 0 1 0 0] Tm -0 0 Td -263.363 630.336 Td -/F130_0 9.9626 Tf -(as) 8.29885 Tj +263.362 630.336 Td +/F122_0 9.9626 Tf +(as) 8.2988 Tj -408 TJm (the) 12.1743 Tj --408 TJm -(requested) 38.1767 Tj +-409 TJm +(request) 28.772 Tj +1 TJm +(ed) 9.4047 Tj -409 TJm (action;) 27.1182 Tj -487 TJm (other) 20.4731 Tj -408 TJm (actions) 28.224 Tj --408 TJm -(are) 12.1643 Tj -409 TJm +(are) 12.1643 Tj +-408 TJm (ille) 12.7322 Tj 15 TJm (g) 4.9813 Tj @@ -47981,43 +42948,29 @@ Q (result) 22.1369 Tj -409 TJm (in) 7.7509 Tj -[1 0 0 1 72 618.381] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -618.381] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 618.381 Td -/F134_0 9.9626 Tf -(BZ_SEQUENCE_ERROR) 101.619 Tj -[1 0 0 1 173.619 618.381] cm +/F124_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -173.619 -618.381] cm -[1 0 0 1 0 0] Tm -0 0 Td 173.619 618.381 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 617.071] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -607.108] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 596.463 Td -/F130_0 9.9626 Tf (At) 9.9626 Tj -279 TJm (some) 21.031 Tj @@ -48032,11 +42985,11 @@ Q -279 TJm (will) 15.5018 Tj -279 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -278 TJm (pro) 13.2801 Tj 14 TJm @@ -48052,7 +43005,7 @@ Q -279 TJm (data) 16.5977 Tj -279 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -279 TJm (w) 7.193 Tj 10 TJm @@ -48060,7 +43013,7 @@ Q -279 TJm (to.) 10.2416 Tj -793 TJm -(It) 6.08715 Tj +(It) 6.0871 Tj -279 TJm (will) 15.5018 Tj -279 TJm @@ -48076,11 +43029,11 @@ Q -279 TJm (up) 9.9626 Tj -279 TJm -(--) 6.63509 Tj +(--) 6.6351 Tj 72 584.508 Td (in) 7.7509 Tj -287 TJm -(ef) 7.74094 Tj +(ef) 7.7409 Tj 25 TJm (fect,) 17.4246 Tj -297 TJm @@ -48094,58 +43047,50 @@ Q -288 TJm (process) 29.8778 Tj -287 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -288 TJm (data) 16.5977 Tj -287 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -287 TJm (might) 23.2527 Tj -288 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -287 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fered) 20.4632 Tj -288 TJm (internally) 38.1866 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -844 TJm -(In) 8.29885 Tj +(In) 8.2988 Tj -288 TJm (this) 14.396 Tj -287 TJm (state,) 20.7521 Tj -[1 0 0 1 456.314 584.508] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -456.314 -584.508] cm -[1 0 0 1 0 0] Tm -0 0 Td 456.314 584.508 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 540 584.508] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -584.508] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 572.553 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -258 TJm (no) 9.9626 Tj @@ -48161,34 +43106,26 @@ Q (data) 16.5977 Tj -258 TJm (from) 19.3673 Tj -[1 0 0 1 234.207 572.553] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -234.207 -572.553] cm -[1 0 0 1 0 0] Tm -0 0 Td -234.207 572.553 Td -/F134_0 9.9626 Tf +234.208 572.553 Td +/F124_0 9.9626 Tf (next_in) 41.8429 Tj -[1 0 0 1 276.051 572.553] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -276.051 -572.553] cm -[1 0 0 1 0 0] Tm -0 0 Td 276.051 572.553 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -260 TJm (b) 4.9813 Tj 20 TJm (ut) 7.7509 Tj -257 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -258 TJm (will) 15.5018 Tj -258 TJm @@ -48203,28 +43140,20 @@ Q (data) 16.5977 Tj -258 TJm (to) 7.7509 Tj -[1 0 0 1 407.082 572.553] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -407.082 -572.553] cm -[1 0 0 1 0 0] Tm -0 0 Td 407.082 572.553 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (next_out) 47.8205 Tj -[1 0 0 1 454.902 572.553] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -454.902 -572.553] cm -[1 0 0 1 0 0] Tm -0 0 Td 454.902 572.553 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -666 TJm (Because) 33.1954 Tj -258 TJm @@ -48234,7 +43163,7 @@ Q 72 560.598 Td (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -228 TJm @@ -48248,13 +43177,13 @@ Q -228 TJm (can) 13.8281 Tj -228 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -228 TJm (arbitrarily) 39.8404 Tj -229 TJm (sma) 16.0497 Tj 1 TJm -(ll,) 8.02986 Tj +(ll,) 8.0299 Tj -233 TJm (the) 12.1743 Tj -228 TJm @@ -48266,56 +43195,42 @@ Q -228 TJm (necessarily) 44.2638 Tj -228 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -228 TJm (done) 19.3673 Tj -228 TJm (with) 17.7135 Tj -229 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -228 TJm (single) 23.8007 Tj -72 548.643 Td +72 548.642 Td (call) 14.386 Tj -250 TJm -(of) 8.29885 Tj -[1 0 0 1 99.6659 548.643] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -99.6659 -548.643] cm -[1 0 0 1 0 0] Tm -0 0 Td -99.6659 548.643 Td -/F134_0 9.9626 Tf +99.666 548.642 Td +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 183.352 548.643] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -183.352 -548.643] cm -[1 0 0 1 0 0] Tm -0 0 Td -183.352 548.643 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 547.108] cm +183.352 548.642 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -537.146] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 526.725 Td -/F130_0 9.9626 Tf (Instead,) 31.2626 Tj -346 TJm (the) 12.1743 Tj @@ -48325,56 +43240,42 @@ Q (program) 33.7533 Tj -327 TJm (passes) 25.4544 Tj -[1 0 0 1 218.231 526.725] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -218.231 -526.725] cm -[1 0 0 1 0 0] Tm -0 0 Td 218.231 526.725 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_FINISH) 53.798 Tj -[1 0 0 1 272.029 526.725] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -272.029 -526.725] cm -[1 0 0 1 0 0] Tm -0 0 Td 275.284 526.725 Td -/F130_0 9.9626 Tf -(as) 8.29885 Tj +/F122_0 9.9626 Tf +(as) 8.2988 Tj -327 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj +-327 TJm +(acti) 14.386 Tj +1 TJm +(on) 9.9626 Tj -327 TJm -(action) 24.3486 Tj --326 TJm (to) 7.7509 Tj -[1 0 0 1 338.108 526.725] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -338.108 -526.725] cm -[1 0 0 1 0 0] Tm -0 0 Td -338.108 526.725 Td -/F134_0 9.9626 Tf +338.109 526.725 Td +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 421.795 526.725] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -421.795 -526.725] cm -[1 0 0 1 0 0] Tm -0 0 Td 421.795 526.725 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -1081 TJm (This) 17.7135 Tj -326 TJm @@ -48384,7 +43285,7 @@ Q -327 TJm (stream') 29.8778 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj 72 514.77 Td (state) 18.2614 Tj -291 TJm @@ -48401,34 +43302,26 @@ Q (input) 20.4831 Tj -291 TJm (\(ie,) 13.0012 Tj -[1 0 0 1 264.452 514.77] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -264.452 -514.77] cm -[1 0 0 1 0 0] Tm -0 0 Td 264.452 514.77 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (next_in[0) 53.798 Tj -600 TJm (..) 11.9551 Tj -1200 TJm (avail_in-1]) 65.7532 Tj -[1 0 0 1 413.892 514.77] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -413.892 -514.77] cm -[1 0 0 1 0 0] Tm -0 0 Td 413.892 514.77 Td -/F130_0 9.9626 Tf -(\)) 3.31755 Tj +/F122_0 9.9626 Tf +(\)) 3.3175 Tj -291 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -290 TJm (compressed) 47.0334 Tj -291 TJm @@ -48444,13 +43337,13 @@ Q -421 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj 55 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -1646 TJm -(T) 6.08715 Tj +(T) 6.0871 Tj 80 TJm (o) 4.9813 Tj -421 TJm @@ -48458,31 +43351,23 @@ Q -422 TJm (this) 14.396 Tj 1 TJm -(,) 2.49065 Tj -[1 0 0 1 222.339 502.814] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -222.339 -502.814] cm -[1 0 0 1 0 0] Tm -0 0 Td 222.339 502.814 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 306.025 502.814] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -306.025 -502.814] cm -[1 0 0 1 0 0] Tm -0 0 Td 310.22 502.814 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (must) 19.3773 Tj -421 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -421 TJm (called) 23.7907 Tj -421 TJm @@ -48507,50 +43392,34 @@ Q (that) 14.9439 Tj -380 TJm (point,) 22.9738 Tj -[1 0 0 1 188.346 490.859] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -188.346 -490.859] cm -[1 0 0 1 0 0] Tm -0 0 Td 188.346 490.859 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 272.033 490.859] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -272.033 -490.859] cm -[1 0 0 1 0 0] Tm -0 0 Td 275.813 490.859 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (returns) 27.6661 Tj -[1 0 0 1 307.259 490.859] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -307.259 -490.859] cm -[1 0 0 1 0 0] Tm -0 0 Td 307.259 490.859 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 384.968 490.859] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -384.968 -490.859] cm -[1 0 0 1 0 0] Tm -0 0 Td 384.968 490.859 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -379 TJm (and) 14.386 Tj -380 TJm @@ -48558,11 +43427,11 @@ Q -379 TJm (stream') 29.8778 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -380 TJm (state) 18.2614 Tj -379 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -380 TJm (set) 11.0684 Tj -379 TJm @@ -48571,56 +43440,42 @@ Q (to) 7.7509 Tj 72 478.904 Td (IDLE.) 25.1755 Tj -[1 0 0 1 99.6662 478.904] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -99.6662 -478.904] cm -[1 0 0 1 0 0] Tm -0 0 Td -99.6662 478.904 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressEnd) 101.619 Tj -[1 0 0 1 201.285 478.904] cm +99.666 478.904 Td +/F124_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -201.285 -478.904] cm -[1 0 0 1 0 0] Tm -0 0 Td 203.776 478.904 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (should) 26.5703 Tj -250 TJm (then) 17.1556 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (called.) 26.2813 Tj -[1 0 0 1 72 477.37] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -467.407] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 456.986 Td -/F130_0 9.9626 Tf (Just) 15.5018 Tj -380 TJm (to) 7.7509 Tj -380 TJm (mak) 17.1556 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -379 TJm (sure) 16.5977 Tj -380 TJm @@ -48642,41 +43497,33 @@ Q -380 TJm (mak) 17.1556 Tj 10 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -379 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -380 TJm (note) 17.1556 Tj -380 TJm -(of) 8.29885 Tj -[1 0 0 1 415.708 456.986] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -415.708 -456.986] cm -[1 0 0 1 0 0] Tm -0 0 Td 415.708 456.986 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (avail_in) 47.8205 Tj -[1 0 0 1 463.528 456.986] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -463.528 -456.986] cm -[1 0 0 1 0 0] Tm -0 0 Td 467.312 456.986 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (at) 7.193 Tj -380 TJm (the) 12.1743 Tj -380 TJm (time) 17.7135 Tj -379 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -380 TJm (the) 12.1743 Tj 72 445.031 Td @@ -48687,54 +43534,38 @@ Q (t) 2.7696 Tj 1 TJm (o) 4.9813 Tj -[1 0 0 1 118.179 445.031] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -118.179 -445.031] cm -[1 0 0 1 0 0] Tm -0 0 Td 118.179 445.031 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 201.865 445.031] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -201.865 -445.031] cm -[1 0 0 1 0 0] Tm -0 0 Td 204.713 445.031 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (which) 24.3486 Tj -286 TJm (has) 13.2801 Tj -[1 0 0 1 248.035 445.031] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -248.035 -445.031] cm -[1 0 0 1 0 0] Tm -0 0 Td 248.035 445.031 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_FINISH) 53.798 Tj -[1 0 0 1 301.833 445.031] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -301.833 -445.031] cm -[1 0 0 1 0 0] Tm -0 0 Td 304.68 445.031 Td -/F130_0 9.9626 Tf -(as) 8.29885 Tj +/F122_0 9.9626 Tf +(as) 8.2988 Tj -286 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -286 TJm (action) 24.3486 Tj -285 TJm @@ -48754,7 +43585,7 @@ Q -286 TJm (announced) 43.158 Tj -285 TJm -(its) 9.41466 Tj +(its) 9.4147 Tj 72 433.076 Td (intention) 35.427 Tj -292 TJm @@ -48764,7 +43595,7 @@ Q -291 TJm (supply) 26.5703 Tj -292 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -292 TJm @@ -48786,61 +43617,45 @@ Q -292 TJm (that) 14.9439 Tj -292 TJm -(of) 8.29885 Tj -[1 0 0 1 392.862 433.076] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -392.862 -433.076] cm -[1 0 0 1 0 0] Tm -0 0 Td 392.862 433.076 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (avail_in) 47.8205 Tj -[1 0 0 1 440.682 433.076] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -440.682 -433.076] cm -[1 0 0 1 0 0] Tm -0 0 Td 443.589 433.076 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (o) 4.9813 Tj 15 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj -292 TJm (subsequent) 44.2738 Tj -292 TJm (calls) 18.2614 Tj -291 TJm (to) 7.7509 Tj -[1 0 0 1 72 421.121] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -421.121] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 421.121 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 155.686 421.121] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -155.686 -421.121] cm -[1 0 0 1 0 0] Tm -0 0 Td 155.686 421.121 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -247 TJm (the) 12.1743 Tj -247 TJm @@ -48850,13 +43665,17 @@ Q -247 TJm (detect) 23.7907 Tj -246 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -247 TJm -(att) 9.9626 Tj +(attem) 22.1369 Tj 1 TJm -(empts) 23.8007 Tj +(p) 4.9813 Tj +-1 TJm +(t) 2.7696 Tj +1 TJm +(s) 3.8755 Tj -247 TJm (to) 7.7509 Tj -246 TJm @@ -48884,73 +43703,59 @@ Q -246 TJm (this) 14.396 Tj -247 TJm -(is) 6.64505 Tj -72 409.166 Td +(is) 6.6451 Tj +72 409.165 Td (detected) 33.1954 Tj -250 TJm (will) 15.5018 Tj -250 TJm (return) 23.7907 Tj -[1 0 0 1 151.959 409.166] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -151.959 -409.166] cm -[1 0 0 1 0 0] Tm -0 0 Td -151.959 409.166 Td -/F134_0 9.9626 Tf -(BZ_SEQUENCE_ERROR) 101.619 Tj -[1 0 0 1 253.578 409.166] cm +151.959 409.165 Td +/F124_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -253.578 -409.166] cm -[1 0 0 1 0 0] Tm -0 0 Td -253.578 409.166 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +253.578 409.165 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj -500 TJm (This) 17.7135 Tj -250 TJm (indicates) 35.417 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (programming) 54.2364 Tj -250 TJm (mistak) 26.5703 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm (which) 24.3486 Tj -250 TJm (should) 26.5703 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (corrected.) 39.5515 Tj -[1 0 0 1 72 407.009] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -397.046] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 387.248 Td -/F130_0 9.9626 Tf (Instead) 28.772 Tj -224 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -223 TJm (asking) 26.0123 Tj -224 TJm @@ -48967,32 +43772,24 @@ Q (may) 17.1556 Tj -224 TJm (ask) 13.2801 Tj -[1 0 0 1 293.282 387.248] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -293.282 -387.248] cm -[1 0 0 1 0 0] Tm -0 0 Td 293.282 387.248 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 376.968 387.248] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -376.968 -387.248] cm -[1 0 0 1 0 0] Tm -0 0 Td 379.196 387.248 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj -224 TJm (tak) 12.1743 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -223 TJm (all) 9.9626 Tj -224 TJm @@ -49004,7 +43801,7 @@ Q -229 TJm (compress) 37.6287 Tj 72 375.293 Td -(it) 5.53921 Tj +(it) 5.5392 Tj -278 TJm (and) 14.386 Tj -278 TJm @@ -49026,11 +43823,11 @@ Q -1 TJm (i) 2.7696 Tj 1 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -278 TJm (could) 22.1369 Tj -278 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -278 TJm (useful) 24.3486 Tj -278 TJm @@ -49041,12 +43838,12 @@ Q (control) 28.224 Tj -278 TJm (purposes.) 37.9077 Tj -72 363.338 Td +72 363.337 Td (The) 15.4918 Tj -328 TJm (mechanism) 45.3796 Tj -328 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -328 TJm (analogous) 40.3983 Tj -328 TJm @@ -49059,62 +43856,46 @@ Q (\002nishing:) 37.6487 Tj -466 TJm (call) 14.386 Tj -[1 0 0 1 297.049 363.337] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -297.049 -363.337] cm -[1 0 0 1 0 0] Tm -0 0 Td 297.049 363.337 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 380.735 363.337] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -380.735 -363.337] cm -[1 0 0 1 0 0] Tm -0 0 Td 384.003 363.337 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (with) 17.7135 Tj -328 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -328 TJm (action) 24.3486 Tj -328 TJm -(of) 8.29885 Tj -[1 0 0 1 456.841 363.337] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -456.841 -363.337] cm -[1 0 0 1 0 0] Tm -0 0 Td 456.841 363.337 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_FLUSH) 47.8205 Tj -[1 0 0 1 504.662 363.337] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -504.662 -363.337] cm -[1 0 0 1 0 0] Tm -0 0 Td 504.662 363.337 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -328 TJm (remo) 20.4731 Tj 15 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 72 351.382 Td (output) 25.4644 Tj -445 TJm @@ -49127,27 +43908,19 @@ Q (with) 17.7135 Tj -445 TJm (the) 12.1743 Tj -[1 0 0 1 213.94 351.382] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -213.94 -351.382] cm -[1 0 0 1 0 0] Tm -0 0 Td 213.94 351.382 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_FLUSH) 47.8205 Tj -[1 0 0 1 261.761 351.382] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -261.761 -351.382] cm -[1 0 0 1 0 0] Tm -0 0 Td 266.195 351.382 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (action) 24.3486 Tj -445 TJm (until) 18.2714 Tj @@ -49157,28 +43930,20 @@ Q (v) 4.9813 Tj 25 TJm (alue) 16.5977 Tj -[1 0 0 1 360.062 351.382] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -360.062 -351.382] cm -[1 0 0 1 0 0] Tm -0 0 Td 360.062 351.382 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_RUN) 35.8654 Tj -[1 0 0 1 395.928 351.382] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -395.928 -351.382] cm -[1 0 0 1 0 0] Tm -0 0 Td 400.362 351.382 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -445 TJm (returned.) 35.686 Tj -1792 TJm @@ -49187,30 +43952,22 @@ Q (with) 17.7135 Tj -445 TJm (\002nishing,) 37.3697 Tj -[1 0 0 1 72 339.427] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -339.427] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 339.427 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 155.686 339.427] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -155.686 -339.427] cm -[1 0 0 1 0 0] Tm -0 0 Td 158.177 339.427 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (detects) 27.6661 Tj -250 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -250 TJm @@ -49236,31 +43993,25 @@ Q -250 TJm (has) 13.2801 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj 15 TJm (gun.) 17.4346 Tj -[1 0 0 1 72 337.27] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -327.308] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 317.509 Td -/F130_0 9.9626 Tf (Once) 21.0211 Tj -250 TJm (the) 12.1743 Tj -250 TJm (\003ush) 19.3773 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (complete,) 39.0135 Tj -250 TJm @@ -49276,26 +44027,20 @@ Q -250 TJm (normal) 28.224 Tj -250 TJm -(R) 6.64505 Tj +(R) 6.6451 Tj 40 TJm (UNNING) 39.2825 Tj -250 TJm (state.) 20.7521 Tj -[1 0 0 1 72 315.353] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -305.39] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 295.591 Td -/F130_0 9.9626 Tf (This) 17.7135 Tj -344 TJm (all) 9.9626 Tj @@ -49306,7 +44051,7 @@ Q -344 TJm (comple) 29.3299 Tj 15 TJm -(x,) 7.47195 Tj +(x,) 7.472 Tj -367 TJm (b) 4.9813 Tj 20 TJm @@ -49318,13 +44063,13 @@ Q -344 TJm (really) 22.6848 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -1182 TJm (Here') 22.6749 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -344 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -344 TJm (table) 19.3673 Tj -343 TJm @@ -49358,7 +44103,7 @@ Q -275 TJm (will) 15.5018 Tj -274 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -275 TJm (tak) 12.1743 Tj 10 TJm @@ -49368,7 +44113,7 @@ Q -275 TJm (the) 12.1743 Tj -274 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 15 TJm (xt) 7.7509 Tj -275 TJm @@ -49402,7 +44147,7 @@ Q 18 TJm (t) 2.7696 Tj 72 271.681 Td -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xplicitly) 33.2153 Tj -347 TJm @@ -49416,7 +44161,7 @@ Q -347 TJm (stream) 26.5603 Tj -348 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -347 TJm (in,) 10.2416 Tj -372 TJm @@ -49434,13 +44179,13 @@ Q -347 TJm (to) 7.7509 Tj -348 TJm -(--) 6.63509 Tj +(--) 6.6351 Tj -347 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -348 TJm (can) 13.8281 Tj -347 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -347 TJm (inferred) 31.5316 Tj -348 TJm @@ -49455,44 +44200,28 @@ Q (returned) 33.1954 Tj -348 TJm (by) 9.9626 Tj -[1 0 0 1 72 259.726] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -259.726] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 259.726 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 155.686 259.726] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -155.686 -259.726] cm -[1 0 0 1 0 0] Tm -0 0 Td 155.686 259.726 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 258.192] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -207.34] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -49517,7 +44246,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -49526,12 +44254,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -49540,18 +44262,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.8518] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.8518 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.852 Td (14) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -49560,7 +44284,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -49569,12 +44292,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -49583,7 +44304,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 18 18 +%%Page: 15 18 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -49601,20 +44322,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -49639,7 +44356,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -49648,12 +44364,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -49662,36 +44372,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -49700,7 +44406,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -49709,67 +44414,66 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -595.402] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 146.152] cm 0 0 468 573.848 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 570.261] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -711.631] cm [1 0 0 1 0 0] Tm 0 0 Td 90 711.631 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (IDLE/any) 47.8205 Tj -98.4879 699.676 Td +98.488 699.676 Td (Illegal.) 47.8205 Tj -852 TJm (IDLE) 23.9102 Tj @@ -49782,24 +44486,24 @@ f -426 TJm (after) 29.8878 Tj -426 TJm -(BZ2_bzCompressEnd) 101.619 Tj +(BZ2_bzCompressEnd) 101.6185 Tj -426 TJm (or) 11.9551 Tj -98.4879 687.721 Td +98.488 687.721 Td (before) 35.8654 Tj -426 TJm -(BZ2_bzCompressInit.) 113.574 Tj -98.4879 675.766 Td +(BZ2_bzCompressInit.) 113.5736 Tj +98.488 675.766 Td (Return) 35.8654 Tj -426 TJm (value) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm -(BZ_SEQUENCE_ERROR) 101.619 Tj +(BZ_SEQUENCE_ERROR) 101.6185 Tj 90 651.856 Td (RUNNING/BZ_RUN) 83.6858 Tj -98.4879 639.9 Td +98.488 639.9 Td (Compress) 47.8205 Tj -426 TJm (from) 23.9102 Tj @@ -49817,25 +44521,25 @@ f (as) 11.9551 Tj -426 TJm (possible.) 53.798 Tj -98.4879 627.945 Td +98.488 627.945 Td (Next) 23.9102 Tj -426 TJm (state) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (RUNNING) 41.8429 Tj -98.4879 615.99 Td +98.488 615.99 Td (Return) 35.8654 Tj -426 TJm (value) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (BZ_RUN_OK) 53.798 Tj 90 592.08 Td (RUNNING/BZ_FLUSH) 95.641 Tj -98.4879 580.125 Td +98.488 580.124 Td (Remember) 47.8205 Tj -426 TJm (current) 41.8429 Tj @@ -49851,7 +44555,7 @@ f (from) 23.9102 Tj -426 TJm (next_in) 41.8429 Tj -98.4879 568.169 Td +98.488 568.169 Td (to) 11.9551 Tj -426 TJm (next_out) 47.8205 Tj @@ -49877,25 +44581,25 @@ f (more) 23.9102 Tj -426 TJm (input.) 35.8654 Tj -98.4879 556.214 Td +98.488 556.214 Td (Next) 23.9102 Tj -426 TJm (state) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (FLUSHING) 47.8205 Tj -98.4879 544.259 Td +98.488 544.259 Td (Return) 35.8654 Tj -426 TJm (value) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (BZ_FLUSH_OK) 65.7532 Tj 90 520.349 Td -(RUNNING/BZ_FINISH) 101.619 Tj -98.4879 508.394 Td +(RUNNING/BZ_FINISH) 101.6185 Tj +98.488 508.393 Td (Remember) 47.8205 Tj -426 TJm (current) 41.8429 Tj @@ -49911,7 +44615,7 @@ f (from) 23.9102 Tj -426 TJm (next_in) 41.8429 Tj -98.4879 496.438 Td +98.488 496.438 Td (to) 11.9551 Tj -426 TJm (next_out) 47.8205 Tj @@ -49937,25 +44641,25 @@ f (more) 23.9102 Tj -426 TJm (input.) 35.8654 Tj -98.4879 484.483 Td +98.488 484.483 Td (Next) 23.9102 Tj -426 TJm (state) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (FINISHING) 53.798 Tj -98.4879 472.528 Td +98.488 472.528 Td (Return) 35.8654 Tj -426 TJm (value) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (BZ_FINISH_OK) 71.7307 Tj 90 448.618 Td -(FLUSHING/BZ_FLUSH) 101.619 Tj -98.4879 436.663 Td +(FLUSHING/BZ_FLUSH) 101.6185 Tj +98.488 436.662 Td (Compress) 47.8205 Tj -426 TJm (from) 23.9102 Tj @@ -49973,7 +44677,7 @@ f (as) 11.9551 Tj -426 TJm (possible,) 53.798 Tj -98.4879 424.707 Td +98.488 424.707 Td (but) 17.9327 Tj -426 TJm (do) 11.9551 Tj @@ -49987,7 +44691,7 @@ f (more) 23.9102 Tj -426 TJm (input.) 35.8654 Tj -98.4879 412.752 Td +98.488 412.752 Td (If) 11.9551 Tj -426 TJm (all) 17.9327 Tj @@ -50011,7 +44715,7 @@ f (all) 17.9327 Tj -426 TJm (compressed) 59.7756 Tj -98.4879 400.797 Td +98.488 400.797 Td (output) 35.8654 Tj -426 TJm (has) 17.9327 Tj @@ -50024,7 +44728,7 @@ f -426 TJm (state) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (RUNNING;) 47.8205 Tj -426 TJm @@ -50032,17 +44736,17 @@ f -426 TJm (value) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (BZ_RUN_OK) 53.798 Tj -98.4879 376.887 Td +98.488 376.887 Td (else) 23.9102 Tj -106.976 364.932 Td +106.976 364.931 Td (Next) 23.9102 Tj -426 TJm (state) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (FLUSHING;) 53.798 Tj -426 TJm @@ -50050,24 +44754,24 @@ f -426 TJm (value) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (BZ_FLUSH_OK) 65.7532 Tj 90 341.021 Td (FLUSHING/other) 83.6858 Tj -98.4879 329.066 Td +98.488 329.066 Td (Illegal.) 47.8205 Tj -98.4879 317.111 Td +98.488 317.111 Td (Return) 35.8654 Tj -426 TJm (value) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm -(BZ_SEQUENCE_ERROR) 101.619 Tj -90 293.201 Td -(FINISHING/BZ_FINISH) 113.574 Tj -98.4879 281.245 Td +(BZ_SEQUENCE_ERROR) 101.6185 Tj +90 293.2 Td +(FINISHING/BZ_FINISH) 113.5736 Tj +98.488 281.245 Td (Compress) 47.8205 Tj -426 TJm (from) 23.9102 Tj @@ -50085,7 +44789,7 @@ f (as) 11.9551 Tj -426 TJm (possible,) 53.798 Tj -98.4879 269.29 Td +98.488 269.29 Td (but) 17.9327 Tj -426 TJm (to) 11.9551 Tj @@ -50099,7 +44803,7 @@ f (more) 23.9102 Tj -426 TJm (input.) 35.8654 Tj -98.4879 257.335 Td +98.488 257.335 Td (If) 11.9551 Tj -426 TJm (all) 17.9327 Tj @@ -50123,7 +44827,7 @@ f (all) 17.9327 Tj -426 TJm (compressed) 59.7756 Tj -98.4879 245.38 Td +98.488 245.38 Td (output) 35.8654 Tj -426 TJm (has) 17.9327 Tj @@ -50131,12 +44835,12 @@ f (been) 23.9102 Tj -426 TJm (removed) 41.8429 Tj -106.976 233.425 Td +106.976 233.424 Td (Next) 23.9102 Tj -426 TJm (state) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (IDLE;) 29.8878 Tj -426 TJm @@ -50144,17 +44848,17 @@ f -426 TJm (value) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (BZ_STREAM_END) 77.7083 Tj -98.4879 221.47 Td +98.488 221.469 Td (else) 23.9102 Tj 106.976 209.514 Td (Next) 23.9102 Tj -426 TJm (state) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (FINISHING;) 59.7756 Tj -426 TJm @@ -50162,27 +44866,25 @@ f -426 TJm (value) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (BZ_FINISH_OK) 71.7307 Tj 90 185.604 Td (FINISHING/other) 89.6634 Tj -98.4879 173.649 Td +98.488 173.649 Td (Illegal.) 47.8205 Tj -98.4879 161.694 Td +98.488 161.693 Td (Return) 35.8654 Tj -426 TJm (value) 29.8878 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm -(BZ_SEQUENCE_ERROR) 101.619 Tj -[1 0 0 1 72 146.152] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm +(BZ_SEQUENCE_ERROR) 101.6185 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -50191,16 +44893,12 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -136.189] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 124.234 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (That) 18.2614 Tj -250 TJm (still) 14.9539 Tj @@ -50209,11 +44907,11 @@ f -250 TJm (complicated?) 53.1206 Tj -620 TJm -(W) 9.40469 Tj +(W) 9.4047 Tj 80 TJm (ell,) 12.4533 Tj -250 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (air) 10.5105 Tj -250 TJm @@ -50225,7 +44923,7 @@ f -250 TJm (sequence) 36.5129 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (calls) 18.2614 Tj -250 TJm @@ -50233,99 +44931,69 @@ f -250 TJm (compressing) 50.3609 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (load) 17.1556 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (data) 16.5977 Tj -250 TJm -(is:) 9.41466 Tj -[1 0 0 1 72 122.077] cm +(is:) 9.4147 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -29.7236] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 7.3724 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -79.3724 -92.3537] cm -[1 0 0 1 0 0] Tm -0 0 Td -79.3724 92.3537 Td -/F130_0 9.9626 Tf -(1.) 7.47195 Tj -[1 0 0 1 86.8444 92.3537] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 3.0884 0] cm +74.491 92.353 Td +(1.) 7.472 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -91.9253 -92.3537] cm -[1 0 0 1 0 0] Tm -0 0 Td -91.9253 92.3537 Td -/F130_0 9.9626 Tf +-510 TJm (Get) 14.386 Tj -250 TJm (started) 26.5603 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 158.056 92.3537] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -158.056 -92.3537] cm -[1 0 0 1 0 0] Tm -0 0 Td -158.056 92.3537 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 265.653 92.3537] cm +153.175 92.353 Td +/F124_0 9.9626 Tf +(BZ2_bzCompressInit) 107.5961 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -265.653 -92.3537] cm -[1 0 0 1 0 0] Tm -0 0 Td -265.653 92.3537 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 268.144 92.3537] cm +260.771 92.353 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -196.144 -41.5019] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.893 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -50350,7 +45018,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -50359,12 +45026,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8542] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -50373,18 +45034,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (15) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -50393,7 +45056,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -50402,12 +45064,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -50416,7 +45076,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 19 19 +%%Page: 16 19 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -50434,20 +45094,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -50472,7 +45128,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -50481,12 +45136,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -50495,36 +45144,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -50533,7 +45178,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -50542,328 +45186,251 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -31.5168] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 7.3724 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -79.3724 -710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td -79.3724 710.037 Td -/F130_0 9.9626 Tf -(2.) 7.47195 Tj -[1 0 0 1 86.8444 710.037] cm +74.491 710.037 Td +/F122_0 9.9626 Tf +(2.) 7.472 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 3.0884 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -91.9253 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td -91.9253 710.037 Td -/F130_0 9.9626 Tf +-510 TJm (Sho) 15.5018 Tj 15 TJm (v) 4.9813 Tj 15 TJm (el) 7.193 Tj --240 TJm +-267 TJm (data) 16.5977 Tj --240 TJm +-268 TJm (in) 7.7509 Tj --241 TJm +-267 TJm (and) 14.386 Tj --240 TJm +-268 TJm (shlurp) 24.9065 Tj --240 TJm +-267 TJm (out) 12.7322 Tj --240 TJm -(its) 9.41466 Tj --240 TJm +-268 TJm +(its) 9.4147 Tj +-267 TJm (compressed) 47.0334 Tj --241 TJm +-267 TJm (form) 19.3673 Tj --240 TJm +-268 TJm (using) 21.589 Tj --240 TJm +-267 TJm (zero) 17.1456 Tj --240 TJm -(or) 8.29885 Tj --240 TJm +-268 TJm +(or) 8.2988 Tj +-267 TJm (more) 20.4731 Tj --241 TJm -(calls) 18.2614 Tj --240 TJm -(of) 8.29885 Tj -[1 0 0 1 401.454 710.037] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -401.454 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td -401.454 710.037 Td -/F134_0 9.9626 Tf -(BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 485.14 710.037] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -485.14 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td -487.533 710.037 Td -/F130_0 9.9626 Tf -(with) 17.7135 Tj --240 TJm -(action) 24.3486 Tj --240 TJm -(=) 5.61891 Tj -[1 0 0 1 91.9253 698.082] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -91.9253 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td -91.9253 698.082 Td -/F134_0 9.9626 Tf -(BZ_RUN) 35.8654 Tj -[1 0 0 1 127.791 698.082] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -127.791 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td -127.791 698.082 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 130.281 698.082] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -58.2814 -21.9178] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 7.3724 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -79.3724 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td -79.3724 676.164 Td -/F130_0 9.9626 Tf -(3.) 7.47195 Tj -[1 0 0 1 86.8444 676.164] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 3.0884 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -91.9253 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td -91.9253 676.164 Td -/F130_0 9.9626 Tf -(Finish) 24.9165 Tj --242 TJm -(up.) 12.4533 Tj --307 TJm -(Repeatedly) 44.8217 Tj --241 TJm +-268 TJm (call) 14.386 Tj -[1 0 0 1 198.784 676.164] cm +1 TJm +(s) 3.8755 Tj +-268 TJm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -198.784 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td -198.784 676.164 Td -/F134_0 9.9626 Tf +400.64 710.037 Td +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 282.471 676.164] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -282.471 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td -284.878 676.164 Td -/F130_0 9.9626 Tf +486.991 710.037 Td +/F122_0 9.9626 Tf (with) 17.7135 Tj --242 TJm +-267 TJm (action) 24.3486 Tj --241 TJm -(=) 5.61891 Tj -[1 0 0 1 339.78 676.164] cm +-268 TJm +(=) 5.6189 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -339.78 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td -339.78 676.164 Td -/F134_0 9.9626 Tf +83.955 698.082 Td +/F124_0 9.9626 Tf +(BZ_RUN) 35.8654 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +119.821 698.082 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 676.164 Td +(3.) 7.472 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +-510 TJm +(Finish) 24.9165 Tj +-276 TJm +(up.) 12.4533 Tj +-387 TJm +(Repeatedly) 44.8217 Tj +-276 TJm +(call) 14.386 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +195.722 676.164 Td +/F124_0 9.9626 Tf +(BZ2_bzCompress) 83.6858 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +282.156 676.164 Td +/F122_0 9.9626 Tf +(with) 17.7135 Tj +-276 TJm +(action) 24.3486 Tj +-276 TJm +(=) 5.6189 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +338.079 676.164 Td +/F124_0 9.9626 Tf (BZ_FINISH) 53.798 Tj -[1 0 0 1 393.579 676.164] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -393.579 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td -393.579 676.164 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj --242 TJm +391.877 676.164 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj +-276 TJm (cop) 14.386 Tj 10 TJm (ying) 17.7135 Tj --241 TJm +-276 TJm (out) 12.7322 Tj --242 TJm +-275 TJm (the) 12.1743 Tj --242 TJm -(compres) 33.7533 Tj -1 TJm -(sed) 13.2801 Tj --242 TJm +-276 TJm +(compressed) 47.0334 Tj +-276 TJm (output,) 27.9551 Tj -91.9253 664.209 Td +83.955 664.209 Td (until) 18.2714 Tj -[1 0 0 1 112.687 664.209] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -112.687 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td -112.687 664.209 Td -/F134_0 9.9626 Tf +104.717 664.209 Td +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 190.396 664.209] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -190.396 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td -192.886 664.209 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +184.916 664.209 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -250 TJm (returned.) 35.686 Tj -[1 0 0 1 237.708 664.209] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -165.708 -21.9178] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 7.3724 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -79.3724 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -79.3724 642.291 Td -/F130_0 9.9626 Tf -(4.) 7.47195 Tj -[1 0 0 1 86.8444 642.291] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 3.0884 0] cm +74.491 642.291 Td +(4.) 7.472 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -91.9253 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -91.9253 642.291 Td -/F130_0 9.9626 Tf +-510 TJm (Close) 22.6948 Tj -250 TJm (up) 9.9626 Tj @@ -50875,44 +45442,30 @@ Q (home.) 24.6275 Tj -620 TJm (Call) 16.6077 Tj -[1 0 0 1 208.796 642.291] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -208.796 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -208.796 642.291 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressEnd) 101.619 Tj -[1 0 0 1 310.415 642.291] cm +203.914 642.291 Td +/F124_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -310.415 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -310.415 642.291 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 312.906 642.291] cm +305.533 642.291 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -240.906 -12.1195] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -630.172] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 620.374 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj +(If) 6.6351 Tj -269 TJm (the) 12.1743 Tj -270 TJm @@ -50938,7 +45491,7 @@ Q -269 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -270 TJm @@ -50958,36 +45511,28 @@ Q -270 TJm (calls) 18.2614 Tj -269 TJm -(of) 8.29885 Tj -[1 0 0 1 456.314 620.374] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -456.314 -620.374] cm -[1 0 0 1 0 0] Tm -0 0 Td 456.314 620.374 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj 72 608.418 Td -(\() 5.97756 Tj +(\() 5.9776 Tj -600 TJm (...,) 23.9102 Tj -600 TJm (BZ_RUN) 35.8654 Tj -600 TJm -(\)) 5.97756 Tj -[1 0 0 1 161.664 608.418] cm +(\)) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -161.664 -608.418] cm -[1 0 0 1 0 0] Tm -0 0 Td 164.154 608.418 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -250 TJm (just) 14.396 Tj @@ -50995,84 +45540,62 @@ Q (do) 9.9626 Tj -250 TJm (the) 12.1743 Tj -[1 0 0 1 225.036 608.418] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -225.036 -608.418] cm -[1 0 0 1 0 0] Tm -0 0 Td 225.036 608.418 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -600 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -600 TJm (...,) 23.9102 Tj -600 TJm (BZ_FINISH) 53.798 Tj -600 TJm -(\)) 5.97756 Tj -[1 0 0 1 422.296 608.418] cm +(\)) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -422.296 -608.418] cm -[1 0 0 1 0 0] Tm -0 0 Td 424.786 608.418 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (calls.) 20.7521 Tj -[1 0 0 1 72 606.262] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -596.299] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 586.501 Td -/F130_0 9.9626 Tf (All) 12.7322 Tj -278 TJm (required) 33.1954 Tj -277 TJm (memory) 33.2053 Tj -278 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -277 TJm (allocated) 35.965 Tj -278 TJm (by) 9.9626 Tj -[1 0 0 1 220.295 586.501] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -220.295 -586.501] cm -[1 0 0 1 0 0] Tm -0 0 Td 220.295 586.501 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 327.891 586.501] cm +/F124_0 9.9626 Tf +(BZ2_bzCompressInit) 107.5961 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -327.891 -586.501] cm -[1 0 0 1 0 0] Tm -0 0 Td 327.891 586.501 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -785 TJm (The) 15.4918 Tj -278 TJm @@ -51084,7 +45607,7 @@ Q -277 TJm (accept) 25.4445 Tj -278 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -277 TJm @@ -51108,7 +45631,7 @@ Q -238 TJm (get) 12.1743 Tj -238 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -237 TJm @@ -51123,33 +45646,25 @@ Q (from) 19.3673 Tj -237 TJm (the) 12.1743 Tj -[1 0 0 1 339.287 574.545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -339.287 -574.545] cm -[1 0 0 1 0 0] Tm -0 0 Td 339.287 574.545 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 422.973 574.545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -422.973 -574.545] cm -[1 0 0 1 0 0] Tm -0 0 Td 425.342 574.545 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (calls.) 20.7521 Tj -612 TJm -(If) 6.63509 Tj --238 TJm -(you) 14.9439 Tj +(If) 6.6351 Tj -237 TJm +(you) 14.9439 Tj +-238 TJm (do,) 12.4533 Tj -240 TJm (the) 12.1743 Tj @@ -51158,35 +45673,27 @@ Q -238 TJm (will) 15.5018 Tj -238 TJm -(be) 9.40469 Tj -[1 0 0 1 72 562.59] cm +(be) 9.4047 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -562.59] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 562.59 Td -/F134_0 9.9626 Tf -(BZ_SEQUENCE_ERROR) 101.619 Tj -[1 0 0 1 173.619 562.59] cm +/F124_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -173.619 -562.59] cm -[1 0 0 1 0 0] Tm -0 0 Td 173.619 562.59 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -250 TJm (and) 14.386 Tj -250 TJm (indicate) 31.5416 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (b) 4.9813 Tj 20 TJm @@ -51197,24 +45704,18 @@ Q (your) 18.2614 Tj -250 TJm (programming.) 56.727 Tj -[1 0 0 1 72 560.433] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -550.471] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 540.673 Td -/F130_0 9.9626 Tf -(T) 6.08715 Tj +72 540.672 Td +(T) 6.0871 Tj 35 TJm -(ri) 6.08715 Tj +(ri) 6.0871 Tj 25 TJm (vial) 14.9439 Tj -250 TJm @@ -51227,44 +45728,41 @@ Q (v) 4.9813 Tj 25 TJm (alues:) 23.2427 Tj -[1 0 0 1 72 538.516] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -36.8617] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 35.8655 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 501.654] cm +0 0 468 35.866 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 32.2789] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -529.151] cm [1 0 0 1 0 0] Tm 0 0 Td 90 529.151 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_PARAM_ERROR) 83.6858 Tj -98.4879 517.196 Td +98.488 517.196 Td (if) 11.9551 Tj -426 TJm (strm) 23.9102 Tj @@ -51280,21 +45778,6 @@ f (is) 11.9551 Tj -426 TJm (NULL) 23.9102 Tj -[1 0 0 1 72 501.654] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -51319,7 +45802,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -51328,29 +45810,23 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -491.691] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 471.033 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.3.3.) 43.0729 Tj -[1 0 0 1 119.858 471.033] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -471.033] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 471.033 Td -/F392_0 17.2154 Tf -(BZ2_bzCompressEnd) 175.597 Tj -[1 0 0 1 295.455 471.033] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -223.455 -2.3326] cm +-278 TJm +(BZ2_bzCompressEnd) 177.9212 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -51375,56 +45851,48 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 442.563] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -459.335] cm [1 0 0 1 0 0] Tm 0 0 Td -90 459.335 Td -/F134_0 9.9626 Tf +90 458.104 Td +/F124_0 9.9626 Tf (int) 17.9327 Tj -426 TJm -(BZ2_bzCompressEnd) 101.619 Tj +(BZ2_bzCompressEnd) 101.6185 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (bz_stream) 53.798 Tj -286.303 457.592 Td -(*) 5.97756 Tj -292.281 459.335 Td +286.303 456.361 Td +(*) 5.9776 Tj +292.281 458.104 Td (strm) 23.9102 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 443.793] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -51433,16 +45901,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5493] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -433.831] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 421.876 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 420.645 Td +/F122_0 9.9626 Tf (Releases) 34.8591 Tj -250 TJm (all) 9.9626 Tj @@ -51453,26 +45921,20 @@ f -250 TJm (with) 17.7135 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (compression) 50.3609 Tj -250 TJm (stream.) 29.0509 Tj -[1 0 0 1 72 419.719] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -409.756] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 399.958 Td -/F130_0 9.9626 Tf +72 398.727 Td (Possible) 33.2153 Tj -250 TJm (return) 23.7907 Tj @@ -51480,42 +45942,39 @@ f (v) 4.9813 Tj 25 TJm (alues:) 23.2427 Tj -[1 0 0 1 72 399.858] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -36.8618] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 35.8655 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 361.766] cm +0 0 468 35.866 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 32.2789] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -390.493] cm [1 0 0 1 0 0] Tm 0 0 Td -90 390.493 Td -/F134_0 9.9626 Tf +90 389.263 Td +/F124_0 9.9626 Tf (BZ_PARAM_ERROR) 83.6858 Tj -852 TJm (if) 11.9551 Tj @@ -51533,25 +45992,10 @@ f (is) 11.9551 Tj -426 TJm (NULL) 23.9102 Tj -90 378.538 Td +90 377.307 Td (BZ_OK) 29.8878 Tj -4686 TJm (otherwise) 53.798 Tj -[1 0 0 1 72 362.996] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -51576,7 +46020,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -51585,29 +46028,23 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -353.034] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 332.375 Td -/F122_0 17.2154 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 331.145 Td +/F116_0 17.2154 Tf (3.3.4.) 43.0729 Tj -[1 0 0 1 119.858 332.375] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -332.375] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 332.375 Td -/F392_0 17.2154 Tf -(BZ2_bzDecompressInit) 206.585 Tj -[1 0 0 1 326.443 332.375] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -254.443 -2.3327] cm +-278 TJm +(BZ2_bzDecompressInit) 190.3679 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -51632,47 +46069,45 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 302.674] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3685] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -320.678] cm [1 0 0 1 0 0] Tm 0 0 Td -90 320.678 Td -/F134_0 9.9626 Tf +90 318.216 Td +/F124_0 9.9626 Tf (int) 17.9327 Tj -426 TJm -(BZ2_bzDecompressInit) 119.551 Tj +(BZ2_bzDecompressInit) 119.5512 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (bz_stream) 53.798 Tj -304.236 318.934 Td -(*) 5.97756 Tj -310.214 320.678 Td +304.236 316.473 Td +(*) 5.9776 Tj +310.214 318.216 Td (strm,) 29.8878 Tj -426 TJm (int) 17.9327 Tj @@ -51684,12 +46119,6 @@ f (small) 29.8878 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 305.136] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -51698,16 +46127,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -295.173] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 283.218 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 280.757 Td +/F122_0 9.9626 Tf (Prepares) 34.3012 Tj -351 TJm (for) 11.6164 Tj @@ -51717,61 +46146,45 @@ f (As) 11.0684 Tj -351 TJm (with) 17.7135 Tj -[1 0 0 1 235.177 283.218] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -235.177 -283.218] cm -[1 0 0 1 0 0] Tm -0 0 Td -235.177 283.218 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 342.773 283.218] cm +235.177 280.757 Td +/F124_0 9.9626 Tf +(BZ2_bzCompressInit) 107.5961 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.773 -283.218] cm -[1 0 0 1 0 0] Tm -0 0 Td -342.773 283.218 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +342.773 280.757 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj -377 TJm -(a) 4.42339 Tj -[1 0 0 1 356.937 283.218] cm +(a) 4.4234 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -356.937 -283.218] cm -[1 0 0 1 0 0] Tm -0 0 Td -356.937 283.218 Td -/F134_0 9.9626 Tf +356.937 280.757 Td +/F124_0 9.9626 Tf (bz_stream) 53.798 Tj -[1 0 0 1 410.736 283.218] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -410.736 -283.218] cm -[1 0 0 1 0 0] Tm -0 0 Td -414.235 283.218 Td -/F130_0 9.9626 Tf +414.235 280.757 Td +/F122_0 9.9626 Tf (record) 25.4445 Tj -351 TJm (should) 26.5703 Tj -351 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -352 TJm (allocated) 35.965 Tj -351 TJm (and) 14.386 Tj -72 271.263 Td +72 268.801 Td (initialised) 39.3025 Tj -306 TJm (before) 25.4445 Tj @@ -51781,80 +46194,56 @@ f (call.) 16.8766 Tj -953 TJm (Fields) 24.3586 Tj -[1 0 0 1 211.833 271.263] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -211.833 -271.263] cm -[1 0 0 1 0 0] Tm -0 0 Td -211.833 271.263 Td -/F134_0 9.9626 Tf +211.833 268.801 Td +/F124_0 9.9626 Tf (bzalloc) 41.8429 Tj -[1 0 0 1 253.676 271.263] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -253.676 -271.263] cm -[1 0 0 1 0 0] Tm -0 0 Td -253.676 271.263 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 259.35 271.263] cm +253.676 268.801 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -259.35 -271.263] cm -[1 0 0 1 0 0] Tm -0 0 Td -259.35 271.263 Td -/F134_0 9.9626 Tf +259.35 268.801 Td +/F124_0 9.9626 Tf (bzfree) 35.8654 Tj -[1 0 0 1 295.215 271.263] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -295.215 -271.263] cm -[1 0 0 1 0 0] Tm -0 0 Td -298.26 271.263 Td -/F130_0 9.9626 Tf +298.26 268.801 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 315.69 271.263] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -315.69 -271.263] cm -[1 0 0 1 0 0] Tm -0 0 Td -315.69 271.263 Td -/F134_0 9.9626 Tf +315.69 268.801 Td +/F124_0 9.9626 Tf (opaque) 35.8654 Tj -[1 0 0 1 351.556 271.263] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -351.556 -271.263] cm -[1 0 0 1 0 0] Tm -0 0 Td -354.6 271.263 Td -/F130_0 9.9626 Tf +354.6 268.801 Td +/F122_0 9.9626 Tf (should) 26.5703 Tj -306 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -305 TJm (set) 11.0684 Tj -306 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -305 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -306 TJm (custom) 28.782 Tj -305 TJm @@ -51862,82 +46251,58 @@ f -306 TJm (allocator) 34.8591 Tj -306 TJm -(is) 6.64505 Tj -72 259.308 Td +(is) 6.6451 Tj +72 256.846 Td (required,) 35.686 Tj -350 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -331 TJm (made) 21.579 Tj -[1 0 0 1 147.635 259.308] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -147.635 -259.308] cm -[1 0 0 1 0 0] Tm -0 0 Td -147.635 259.308 Td -/F134_0 9.9626 Tf +147.635 256.846 Td +/F124_0 9.9626 Tf (NULL) 23.9102 Tj -[1 0 0 1 171.546 259.308] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -171.546 -259.308] cm -[1 0 0 1 0 0] Tm -0 0 Td -174.835 259.308 Td -/F130_0 9.9626 Tf +174.836 256.846 Td +/F122_0 9.9626 Tf (for) 11.6164 Tj -330 TJm (the) 12.1743 Tj -331 TJm (normal) 28.224 Tj -[1 0 0 1 236.722 259.308] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -236.722 -259.308] cm -[1 0 0 1 0 0] Tm -0 0 Td -236.722 259.308 Td -/F134_0 9.9626 Tf +236.722 256.846 Td +/F124_0 9.9626 Tf (malloc) 35.8654 Tj -[1 0 0 1 272.587 259.308] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -272.587 -259.308] cm -[1 0 0 1 0 0] Tm -0 0 Td -275.878 259.308 Td -/F130_0 9.9626 Tf +275.878 256.846 Td +/F122_0 9.9626 Tf (/) 2.7696 Tj -[1 0 0 1 281.938 259.308] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -281.938 -259.308] cm -[1 0 0 1 0 0] Tm -0 0 Td -281.938 259.308 Td -/F134_0 9.9626 Tf +281.938 256.846 Td +/F124_0 9.9626 Tf (free) 23.9102 Tj -[1 0 0 1 305.848 259.308] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -305.848 -259.308] cm -[1 0 0 1 0 0] Tm -0 0 Td -309.139 259.308 Td -/F130_0 9.9626 Tf +309.139 256.846 Td +/F122_0 9.9626 Tf (routines.) 34.5901 Tj -1102 TJm (Upon) 22.1369 Tj @@ -51952,175 +46317,123 @@ f -330 TJm (will) 15.5018 Tj -330 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -331 TJm (been) 18.8094 Tj -72 247.353 Td +72 244.891 Td (initialised,) 41.7931 Tj -250 TJm (and) 14.386 Tj -[1 0 0 1 133.16 247.353] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -133.16 -247.353] cm -[1 0 0 1 0 0] Tm -0 0 Td -133.16 247.353 Td -/F134_0 9.9626 Tf +133.16 244.891 Td +/F124_0 9.9626 Tf (total_in) 47.8205 Tj -[1 0 0 1 180.98 247.353] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -180.98 -247.353] cm -[1 0 0 1 0 0] Tm -0 0 Td -183.471 247.353 Td -/F130_0 9.9626 Tf +183.471 244.891 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 200.348 247.353] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -200.348 -247.353] cm -[1 0 0 1 0 0] Tm -0 0 Td -200.348 247.353 Td -/F134_0 9.9626 Tf +200.348 244.891 Td +/F124_0 9.9626 Tf (total_out) 53.798 Tj -[1 0 0 1 254.146 247.353] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -254.146 -247.353] cm -[1 0 0 1 0 0] Tm -0 0 Td -256.637 247.353 Td -/F130_0 9.9626 Tf +256.637 244.891 Td +/F122_0 9.9626 Tf (will) 15.5018 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (zero.) 19.6363 Tj -[1 0 0 1 72 245.913] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -235.951] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 225.435 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +72 222.973 Td +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm (meaning) 34.3112 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (parameter) 39.8305 Tj -[1 0 0 1 192.756 225.435] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -192.756 -225.435] cm -[1 0 0 1 0 0] Tm -0 0 Td -192.756 225.435 Td -/F134_0 9.9626 Tf +192.756 222.973 Td +/F124_0 9.9626 Tf (verbosity) 53.798 Tj -[1 0 0 1 246.554 225.435] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -246.554 -225.435] cm -[1 0 0 1 0 0] Tm -0 0 Td -246.554 225.435 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +246.554 222.973 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj -250 TJm (see) 12.7222 Tj -[1 0 0 1 266.748 225.435] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -266.748 -225.435] cm -[1 0 0 1 0 0] Tm -0 0 Td -266.748 225.435 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 374.345 225.435] cm +266.748 222.973 Td +/F124_0 9.9626 Tf +(BZ2_bzCompressInit) 107.5961 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -374.345 -225.435] cm -[1 0 0 1 0 0] Tm -0 0 Td -374.345 225.435 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 223.278] cm +374.345 222.973 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -213.315] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 203.517 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj -[1 0 0 1 81.4975 203.517] cm +72 201.055 Td +(If) 6.6351 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -81.4975 -203.517] cm -[1 0 0 1 0 0] Tm -0 0 Td -81.4975 203.517 Td -/F134_0 9.9626 Tf +81.497 201.055 Td +/F124_0 9.9626 Tf (small) 29.8878 Tj -[1 0 0 1 111.385 203.517] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -111.385 -203.517] cm -[1 0 0 1 0 0] Tm -0 0 Td -114.248 203.517 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +114.248 201.055 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -287 TJm (nonzero,) 34.5802 Tj -297 TJm @@ -52128,17 +46441,19 @@ f -287 TJm (library) 26.5603 Tj -288 TJm -(will) 15.5018 Tj --287 TJm +(wil) 12.7322 Tj +1 TJm +(l) 2.7696 Tj +-288 TJm (use) 13.2801 Tj -287 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -287 TJm (alternati) 32.6474 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -288 TJm (decompression) 59.7656 Tj -287 TJm @@ -52159,10 +46474,10 @@ f (at) 7.193 Tj -287 TJm (the) 12.1743 Tj -72 191.562 Td +72 189.1 Td (cost) 16.0497 Tj -289 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -290 TJm (decompressing) 59.7656 Tj -289 TJm @@ -52195,7 +46510,7 @@ f (requirement) 48.1393 Tj -290 TJm (drops) 22.1369 Tj -72 179.607 Td +72 177.145 Td (to) 7.7509 Tj -250 TJm (around) 27.6661 Tj @@ -52203,16 +46518,15 @@ f (2300k\).) 30.7147 Tj -620 TJm (See) 14.386 Tj -[1 0 0 1 166.166 179.607] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -166.166 -179.607] cm -[1 0 0 1 0 0] Tm -0 0 Td -166.166 179.607 Td -/F130_0 9.9626 Tf +-250 TJm (Ho) 12.1743 Tj 25 TJm (w) 7.193 Tj @@ -52222,7 +46536,10 @@ f (use) 13.2801 Tj -250 TJm (bzip2) 22.1369 Tj -[1 0 0 1 235.924 179.607] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52235,13 +46552,8 @@ f [0 0 1] sc /DeviceRGB {} CS [0 0 1] SC -[1 0 0 1 -235.924 -179.607] cm -[1 0 0 1 0 0] Tm -0 0 Td -238.415 179.607 Td -/F130_0 9.9626 Tf +-250 TJm ([2]) 11.6164 Tj -[1 0 0 1 250.031 179.607] cm /DeviceRGB {} cs [0 0 1] sc /DeviceRGB {} CS @@ -52250,11 +46562,7 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -250.031 -179.607] cm -[1 0 0 1 0 0] Tm -0 0 Td -252.522 179.607 Td -/F130_0 9.9626 Tf +-250 TJm (for) 11.6164 Tj -250 TJm (more) 20.4731 Tj @@ -52266,21 +46574,15 @@ f (memory) 33.2053 Tj -250 TJm (management.) 53.3995 Tj -[1 0 0 1 72 177.45] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -167.487] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 157.689 Td -/F130_0 9.9626 Tf +72 155.227 Td (Note) 19.3673 Tj -289 TJm (that) 14.9439 Tj @@ -52289,7 +46591,7 @@ f -289 TJm (amount) 29.8878 Tj -289 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -289 TJm (memory) 33.2053 Tj -290 TJm @@ -52299,13 +46601,13 @@ f -289 TJm (decompress) 47.0334 Tj -289 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -290 TJm (stream) 26.5603 Tj -289 TJm (cannot) 26.5603 Tj -289 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -289 TJm (determined) 44.8217 Tj -290 TJm @@ -52315,116 +46617,86 @@ f -289 TJm (stream') 29.8778 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -289 TJm (header) 26.5503 Tj -290 TJm (has) 13.2801 Tj -72 145.734 Td +72 143.272 Td (been) 18.8094 Tj -342 TJm (read,) 19.6363 Tj -366 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -342 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(en) 9.40469 Tj +(en) 9.4047 Tj -342 TJm -(if) 6.08715 Tj -[1 0 0 1 161.081 145.734] cm +(if) 6.0871 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -161.081 -145.734] cm -[1 0 0 1 0 0] Tm -0 0 Td -161.081 145.734 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompressInit) 119.551 Tj -[1 0 0 1 280.633 145.734] cm +161.081 143.272 Td +/F124_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.5512 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -280.633 -145.734] cm -[1 0 0 1 0 0] Tm -0 0 Td -284.043 145.734 Td -/F130_0 9.9626 Tf +284.043 143.272 Td +/F122_0 9.9626 Tf (succeeds,) 37.8977 Tj -365 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -343 TJm (subsequent) 44.2738 Tj -[1 0 0 1 381.098 145.734] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -381.098 -145.734] cm -[1 0 0 1 0 0] Tm -0 0 Td -381.098 145.734 Td -/F134_0 9.9626 Tf +381.098 143.272 Td +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 476.739 145.734] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -476.739 -145.734] cm -[1 0 0 1 0 0] Tm -0 0 Td -480.149 145.734 Td -/F130_0 9.9626 Tf +480.149 143.272 Td +/F122_0 9.9626 Tf (could) 22.1369 Tj -342 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (ail) 9.9626 Tj -343 TJm (with) 17.7135 Tj -[1 0 0 1 72 133.779] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -133.779] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 133.779 Td -/F134_0 9.9626 Tf +72 131.317 Td +/F124_0 9.9626 Tf (BZ_MEM_ERROR) 71.7307 Tj -[1 0 0 1 143.731 133.779] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -143.731 -133.779] cm -[1 0 0 1 0 0] Tm -0 0 Td -143.731 133.779 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 132.469] cm +143.731 131.317 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -122.506] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 111.861 Td -/F130_0 9.9626 Tf +72 109.399 Td (Possible) 33.2153 Tj -250 TJm (return) 23.7907 Tj @@ -52432,22 +46704,14 @@ f (v) 4.9813 Tj 25 TJm (alues:) 23.2427 Tj -[1 0 0 1 72 111.761] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -60.9095] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52472,7 +46736,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52481,12 +46744,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52495,18 +46752,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (16) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52515,7 +46774,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52524,12 +46782,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52538,7 +46794,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 20 20 +%%Page: 17 20 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -52556,20 +46812,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52594,7 +46846,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52603,12 +46854,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52617,36 +46862,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52655,7 +46896,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52664,67 +46904,66 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -117.195] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 95.6413 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 624.359] cm +0 0 468 95.641 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 92.0547] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -711.631] cm [1 0 0 1 0 0] Tm 0 0 Td 90 711.631 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_CONFIG_ERROR) 89.6634 Tj -98.4879 699.676 Td +98.488 699.676 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -52738,16 +46977,16 @@ f (mis-compiled) 71.7307 Tj 90 687.721 Td (BZ_PARAM_ERROR) 83.6858 Tj -98.4879 675.766 Td +98.488 675.766 Td (if) 11.9551 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (small) 29.8878 Tj -426 TJm (!=) 11.9551 Tj -426 TJm -(0) 5.97756 Tj +(0) 5.9776 Tj -426 TJm (&&) 11.9551 Tj -426 TJm @@ -52755,28 +46994,28 @@ f -426 TJm (!=) 11.9551 Tj -426 TJm -(1) 5.97756 Tj +(1) 5.9776 Tj -426 TJm -(\)) 5.97756 Tj -98.4879 663.811 Td +(\)) 5.9776 Tj +98.488 663.811 Td (or) 11.9551 Tj -426 TJm (\(verbosity) 59.7756 Tj -426 TJm (<;) 11.9551 Tj -426 TJm -(0) 5.97756 Tj +(0) 5.9776 Tj -426 TJm (||) 11.9551 Tj -426 TJm (verbosity) 53.798 Tj -426 TJm -(>) 5.97756 Tj +(>) 5.9776 Tj -426 TJm (4\)) 11.9551 Tj 90 651.856 Td (BZ_MEM_ERROR) 71.7307 Tj -98.4879 639.9 Td +98.488 639.9 Td (if) 11.9551 Tj -426 TJm (insufficient) 71.7307 Tj @@ -52786,12 +47025,6 @@ f (is) 11.9551 Tj -426 TJm (available) 53.798 Tj -[1 0 0 1 72 624.359] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5865] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52800,65 +47033,62 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -614.396] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 602.441 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Allo) 17.7135 Tj 25 TJm (w) 7.193 Tj 10 TJm (able) 16.5977 Tj -250 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 15 TJm (xt) 7.7509 Tj -250 TJm (actions:) 30.9936 Tj -[1 0 0 1 72 602.341] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -48.8169] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 47.8207 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 553.524] cm +0 0 468 47.821 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 44.2341] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -592.976] cm [1 0 0 1 0 0] Tm 0 0 Td 90 592.976 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -98.4879 581.021 Td +98.488 581.021 Td (if) 11.9551 Tj -426 TJm (BZ_OK) 29.8878 Tj @@ -52866,7 +47096,7 @@ f (was) 17.9327 Tj -426 TJm (returned) 47.8205 Tj -98.4879 569.066 Td +98.488 569.066 Td (no) 11.9551 Tj -426 TJm (specific) 47.8205 Tj @@ -52882,21 +47112,6 @@ f (of) 11.9551 Tj -426 TJm (error) 29.8878 Tj -[1 0 0 1 72 553.524] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52921,7 +47136,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52930,29 +47144,23 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -543.562] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 522.903 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.3.5.) 43.0729 Tj -[1 0 0 1 119.858 522.903] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -522.903] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 522.903 Td -/F392_0 17.2154 Tf -(BZ2_bzDecompress) 165.268 Tj -[1 0 0 1 285.126 522.903] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -213.126 -2.3327] cm +-278 TJm +(BZ2_bzDecompress) 164.5448 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -52977,56 +47185,48 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 494.433] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3685] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -511.206] cm [1 0 0 1 0 0] Tm 0 0 Td -90 511.206 Td -/F134_0 9.9626 Tf +90 509.975 Td +/F124_0 9.9626 Tf (int) 17.9327 Tj -426 TJm (BZ2_bzDecompress) 95.641 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (bz_stream) 53.798 Tj -280.326 509.462 Td -(*) 5.97756 Tj -286.303 511.206 Td +280.326 508.231 Td +(*) 5.9776 Tj +286.303 509.975 Td (strm) 23.9102 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 495.664] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -53035,16 +47235,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -485.701] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 473.746 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 472.515 Td +/F122_0 9.9626 Tf (Pro) 13.8381 Tj 15 TJm (vides) 21.031 Tj @@ -53059,7 +47259,7 @@ f -301 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -301 TJm @@ -53071,7 +47271,7 @@ f -302 TJm (library) 26.5603 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -928 TJm (The) 15.4918 Tj -301 TJm @@ -53087,34 +47287,26 @@ f -301 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fers,) 17.4246 Tj -315 TJm (and) 14.386 Tj -72 461.791 Td +72 460.56 Td (uses) 17.1556 Tj -[1 0 0 1 91.6461 461.791] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -91.6461 -461.791] cm -[1 0 0 1 0 0] Tm -0 0 Td -91.6461 461.791 Td -/F134_0 9.9626 Tf +91.646 460.56 Td +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 187.287 461.791] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -187.287 -461.791] cm -[1 0 0 1 0 0] Tm -0 0 Td -189.778 461.791 Td -/F130_0 9.9626 Tf +189.778 460.56 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj -250 TJm (transfer) 30.4258 Tj @@ -53124,21 +47316,15 @@ f (between) 33.1954 Tj -250 TJm (them.) 22.4159 Tj -[1 0 0 1 72 460.257] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -450.294] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 439.873 Td -/F130_0 9.9626 Tf +72 438.642 Td (Before) 27.1082 Tj -498 TJm (each) 18.2515 Tj @@ -53146,49 +47332,33 @@ f (call) 14.386 Tj -498 TJm (to) 7.7509 Tj -[1 0 0 1 159.356 439.873] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -159.356 -439.873] cm -[1 0 0 1 0 0] Tm -0 0 Td -159.356 439.873 Td -/F134_0 9.9626 Tf +159.356 438.642 Td +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 254.997 439.873] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -254.997 -439.873] cm -[1 0 0 1 0 0] Tm -0 0 Td -254.997 439.873 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 263.071 439.873] cm +254.997 438.642 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -263.071 -439.873] cm -[1 0 0 1 0 0] Tm -0 0 Td -263.071 439.873 Td -/F134_0 9.9626 Tf +263.071 438.642 Td +/F124_0 9.9626 Tf (next_in) 41.8429 Tj -[1 0 0 1 304.914 439.873] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -304.914 -439.873] cm -[1 0 0 1 0 0] Tm -0 0 Td -309.879 439.873 Td -/F130_0 9.9626 Tf +309.879 438.642 Td +/F122_0 9.9626 Tf (should) 26.5703 Tj -498 TJm (point) 20.4831 Tj @@ -53202,27 +47372,19 @@ f (data,) 19.0883 Tj -560 TJm (and) 14.386 Tj -[1 0 0 1 492.179 439.873] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -492.179 -439.873] cm -[1 0 0 1 0 0] Tm -0 0 Td -492.179 439.873 Td -/F134_0 9.9626 Tf +492.179 438.642 Td +/F124_0 9.9626 Tf (avail_in) 47.8205 Tj -[1 0 0 1 540 439.873] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -439.873] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 427.918 Td -/F130_0 9.9626 Tf +72 426.687 Td +/F122_0 9.9626 Tf (should) 26.5703 Tj -308 TJm (indicate) 31.5416 Tj @@ -53244,93 +47406,61 @@ f (may) 17.1556 Tj -309 TJm (read.) 19.6363 Tj -[1 0 0 1 294.955 427.918] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -294.955 -427.918] cm -[1 0 0 1 0 0] Tm -0 0 Td -294.955 427.918 Td -/F134_0 9.9626 Tf +294.955 426.687 Td +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 390.597 427.918] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -390.597 -427.918] cm -[1 0 0 1 0 0] Tm -0 0 Td -393.667 427.918 Td -/F130_0 9.9626 Tf +393.667 426.687 Td +/F122_0 9.9626 Tf (updates) 30.4357 Tj -[1 0 0 1 427.173 427.918] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -427.173 -427.918] cm -[1 0 0 1 0 0] Tm -0 0 Td -427.173 427.918 Td -/F134_0 9.9626 Tf +427.173 426.687 Td +/F124_0 9.9626 Tf (next_in) 41.8429 Tj -[1 0 0 1 469.016 427.918] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -469.016 -427.918] cm -[1 0 0 1 0 0] Tm -0 0 Td -469.016 427.918 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 474.723 427.918] cm +469.016 426.687 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -474.723 -427.918] cm -[1 0 0 1 0 0] Tm -0 0 Td -474.723 427.918 Td -/F134_0 9.9626 Tf +474.723 426.687 Td +/F124_0 9.9626 Tf (avail_in) 47.8205 Tj -[1 0 0 1 522.543 427.918] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -522.543 -427.918] cm -[1 0 0 1 0 0] Tm -0 0 Td -525.614 427.918 Td -/F130_0 9.9626 Tf +525.614 426.687 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 72 415.963] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -415.963] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 415.963 Td -/F134_0 9.9626 Tf +72 414.732 Td +/F124_0 9.9626 Tf (total_in) 47.8205 Tj -[1 0 0 1 119.821 415.963] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -119.821 -415.963] cm -[1 0 0 1 0 0] Tm -0 0 Td -122.311 415.963 Td -/F130_0 9.9626 Tf +122.311 414.732 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj -250 TJm (re\003ect) 24.8965 Tj @@ -53339,69 +47469,57 @@ f -250 TJm (number) 30.4357 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (bytes) 21.031 Tj -250 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -250 TJm (has) 13.2801 Tj -250 TJm (read.) 19.6363 Tj -[1 0 0 1 72 413.806] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -403.843] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 394.045 Td -/F130_0 9.9626 Tf +72 392.814 Td (Similarly) 37.0908 Tj 65 TJm -(,) 2.49065 Tj -[1 0 0 1 113.799 394.045] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -113.799 -394.045] cm -[1 0 0 1 0 0] Tm -0 0 Td -113.799 394.045 Td -/F134_0 9.9626 Tf +113.799 392.814 Td +/F124_0 9.9626 Tf (next_out) 47.8205 Tj -[1 0 0 1 161.62 394.045] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -161.62 -394.045] cm -[1 0 0 1 0 0] Tm -0 0 Td -164.41 394.045 Td -/F130_0 9.9626 Tf +164.41 392.814 Td +/F122_0 9.9626 Tf (should) 26.5703 Tj -280 TJm (point) 20.4831 Tj -280 TJm (to) 7.7509 Tj -280 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -280 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj --280 TJm -(in) 7.7509 Tj +-281 TJm +(i) 2.7696 Tj +1 TJm +(n) 4.9813 Tj -281 TJm (which) 24.3486 Tj -280 TJm @@ -53411,36 +47529,28 @@ f -280 TJm (output) 25.4644 Tj -280 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -280 TJm (to) 7.7509 Tj -280 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -280 TJm (placed,) 28.493 Tj -288 TJm (with) 17.7135 Tj -[1 0 0 1 486.202 394.045] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -486.202 -394.045] cm -[1 0 0 1 0 0] Tm -0 0 Td -486.202 394.045 Td -/F134_0 9.9626 Tf +486.202 392.814 Td +/F124_0 9.9626 Tf (avail_out) 53.798 Tj -[1 0 0 1 540 394.045] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -394.045] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 382.09 Td -/F130_0 9.9626 Tf +72 380.859 Td +/F122_0 9.9626 Tf (indicating) 39.8504 Tj -525 TJm (ho) 9.9626 Tj @@ -53453,100 +47563,68 @@ f -524 TJm (space) 22.1269 Tj -525 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -525 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 25 TJm (ailable.) 29.0509 Tj -[1 0 0 1 285.792 382.09] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -285.792 -382.09] cm -[1 0 0 1 0 0] Tm -0 0 Td -285.792 382.09 Td -/F134_0 9.9626 Tf +285.792 380.859 Td +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 369.478 382.09] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -369.478 -382.09] cm -[1 0 0 1 0 0] Tm -0 0 Td -374.705 382.09 Td -/F130_0 9.9626 Tf +374.705 380.859 Td +/F122_0 9.9626 Tf (updates) 30.4357 Tj -[1 0 0 1 410.367 382.09] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -410.367 -382.09] cm -[1 0 0 1 0 0] Tm -0 0 Td -410.367 382.09 Td -/F134_0 9.9626 Tf +410.367 380.859 Td +/F124_0 9.9626 Tf (next_out) 47.8205 Tj -[1 0 0 1 458.188 382.09] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -458.188 -382.09] cm -[1 0 0 1 0 0] Tm -0 0 Td -458.188 382.09 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 466.589 382.09] cm +458.188 380.859 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -466.589 -382.09] cm -[1 0 0 1 0 0] Tm -0 0 Td -466.589 382.09 Td -/F134_0 9.9626 Tf +466.589 380.859 Td +/F124_0 9.9626 Tf (avail_out) 53.798 Tj -[1 0 0 1 520.387 382.09] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -520.387 -382.09] cm -[1 0 0 1 0 0] Tm -0 0 Td -525.614 382.09 Td -/F130_0 9.9626 Tf +525.614 380.859 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 72 370.135] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -370.135] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 370.135 Td -/F134_0 9.9626 Tf +72 368.904 Td +/F124_0 9.9626 Tf (total_out) 53.798 Tj -[1 0 0 1 125.798 370.135] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -125.798 -370.135] cm -[1 0 0 1 0 0] Tm -0 0 Td -128.289 370.135 Td -/F130_0 9.9626 Tf +128.289 368.904 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj -250 TJm (re\003ect) 24.8965 Tj @@ -53555,26 +47633,20 @@ f -250 TJm (number) 30.4357 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (bytes) 21.031 Tj -250 TJm (output.) 27.9551 Tj -[1 0 0 1 72 367.978] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -358.015] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 348.217 Td -/F130_0 9.9626 Tf +72 346.986 Td (Y) 7.193 Tj 110 TJm (ou) 9.9626 Tj @@ -53591,27 +47663,27 @@ f 15 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -320 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -321 TJm (little) 18.2714 Tj -320 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -320 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -321 TJm (much) 22.1369 Tj -320 TJm (data) 16.5977 Tj -321 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -320 TJm (you) 14.9439 Tj -321 TJm (lik) 10.5205 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -320 TJm (on) 9.9626 Tj -320 TJm @@ -53619,39 +47691,31 @@ f -321 TJm (call) 14.386 Tj -320 TJm -(of) 8.29885 Tj -[1 0 0 1 407.816 348.217] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -407.816 -348.217] cm -[1 0 0 1 0 0] Tm -0 0 Td -407.816 348.217 Td -/F134_0 9.9626 Tf +407.816 346.986 Td +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 503.457 348.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -503.457 -348.217] cm -[1 0 0 1 0 0] Tm -0 0 Td -503.457 348.217 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +503.457 346.986 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj -1043 TJm -(In) 8.29885 Tj +(In) 8.2988 Tj -320 TJm (the) 12.1743 Tj -72 336.262 Td +72 335.031 Td (limit,) 21.32 Tj -295 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -286 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -287 TJm (acceptable) 42.0422 Tj -286 TJm @@ -53665,7 +47729,7 @@ f 15 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -286 TJm (data) 16.5977 Tj -286 TJm @@ -53675,7 +47739,7 @@ f -287 TJm (at) 7.193 Tj -286 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -286 TJm (time,) 20.2042 Tj -295 TJm @@ -53687,7 +47751,7 @@ f 10 TJm (ould) 17.7135 Tj -286 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -286 TJm (terribly) 29.3299 Tj -286 TJm @@ -53698,7 +47762,7 @@ f (Y) 7.193 Tj 110 TJm (ou) 9.9626 Tj -72 324.306 Td +72 323.076 Td (should) 26.5703 Tj -250 TJm (al) 7.193 Tj @@ -53719,15 +47783,15 @@ f -250 TJm (byte) 17.1556 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (output) 25.4644 Tj -250 TJm (space) 22.1269 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 25 TJm @@ -53738,87 +47802,59 @@ f (each) 18.2515 Tj -250 TJm (call.) 16.8766 Tj -[1 0 0 1 72 322.15] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -312.187] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 302.389 Td -/F130_0 9.9626 Tf +72 301.158 Td (Use) 15.4918 Tj -250 TJm -(of) 8.29885 Tj -[1 0 0 1 100.772 302.389] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -100.772 -302.389] cm -[1 0 0 1 0 0] Tm -0 0 Td -100.772 302.389 Td -/F134_0 9.9626 Tf +100.772 301.158 Td +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 196.413 302.389] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -196.413 -302.389] cm -[1 0 0 1 0 0] Tm -0 0 Td -198.904 302.389 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +198.904 301.158 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -250 TJm (simpler) 29.8878 Tj -250 TJm (than) 17.1556 Tj -[1 0 0 1 260.064 302.389] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -260.064 -302.389] cm -[1 0 0 1 0 0] Tm -0 0 Td -260.064 302.389 Td -/F134_0 9.9626 Tf +260.064 301.158 Td +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 343.75 302.389] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -343.75 -302.389] cm -[1 0 0 1 0 0] Tm -0 0 Td -343.75 302.389 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 300.232] cm +343.75 301.158 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -290.269] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 280.471 Td -/F130_0 9.9626 Tf +72 279.24 Td (Y) 7.193 Tj 110 TJm (ou) 9.9626 Tj @@ -53837,11 +47873,11 @@ f 15 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -347 TJm (output) 25.4644 Tj -346 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -346 TJm (described) 38.1767 Tj -346 TJm @@ -53849,178 +47885,130 @@ f 15 TJm (v) 4.9813 Tj 15 TJm -(e,) 6.91404 Tj +(e,) 6.914 Tj -371 TJm (and) 14.386 Tj -346 TJm (repeatedly) 41.4942 Tj -346 TJm (call) 14.386 Tj -[1 0 0 1 422.638 280.471] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -422.638 -280.471] cm -[1 0 0 1 0 0] Tm -0 0 Td -422.638 280.471 Td -/F134_0 9.9626 Tf +422.638 279.24 Td +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 518.279 280.471] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -518.279 -280.471] cm -[1 0 0 1 0 0] Tm -0 0 Td -521.729 280.471 Td -/F130_0 9.9626 Tf +521.729 279.24 Td +/F122_0 9.9626 Tf (until) 18.2714 Tj -[1 0 0 1 72 268.516] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -268.516] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 268.516 Td -/F134_0 9.9626 Tf +72 267.285 Td +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 149.709 268.516] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -149.709 -268.516] cm -[1 0 0 1 0 0] Tm -0 0 Td -152.314 268.516 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +152.314 267.285 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -262 TJm (returned.) 35.686 Tj -344 TJm (Appearance) 47.5714 Tj -262 TJm -(of) 8.29885 Tj -[1 0 0 1 261.767 268.516] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -261.767 -268.516] cm -[1 0 0 1 0 0] Tm -0 0 Td -261.767 268.516 Td -/F134_0 9.9626 Tf +261.767 267.285 Td +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 339.475 268.516] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -339.475 -268.516] cm -[1 0 0 1 0 0] Tm -0 0 Td -342.081 268.516 Td -/F130_0 9.9626 Tf +342.081 267.285 Td +/F122_0 9.9626 Tf (denotes) 30.4357 Tj -262 TJm (that) 14.9439 Tj -[1 0 0 1 392.672 268.516] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -392.672 -268.516] cm -[1 0 0 1 0 0] Tm -0 0 Td -392.672 268.516 Td -/F134_0 9.9626 Tf +392.672 267.285 Td +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 488.313 268.516] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -488.313 -268.516] cm -[1 0 0 1 0 0] Tm -0 0 Td -490.919 268.516 Td -/F130_0 9.9626 Tf +490.919 267.285 Td +/F122_0 9.9626 Tf (has) 13.2801 Tj -262 TJm (detected) 33.1954 Tj -72 256.561 Td +72 255.33 Td (the) 12.1743 Tj -212 TJm (logical) 27.1182 Tj -212 TJm (end) 14.386 Tj -211 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -212 TJm (the) 12.1743 Tj -212 TJm (compressed) 47.0334 Tj -212 TJm (stream.) 29.0509 Tj -[1 0 0 1 237.858 256.561] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -237.858 -256.561] cm -[1 0 0 1 0 0] Tm -0 0 Td -237.858 256.561 Td -/F134_0 9.9626 Tf +237.858 255.33 Td +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 333.499 256.561] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -333.499 -256.561] cm -[1 0 0 1 0 0] Tm -0 0 Td -335.609 256.561 Td -/F130_0 9.9626 Tf +335.609 255.33 Td +/F122_0 9.9626 Tf (will) 15.5018 Tj -212 TJm (not) 12.7322 Tj -212 TJm (produce) 32.0895 Tj -[1 0 0 1 402.263 256.561] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -402.263 -256.561] cm -[1 0 0 1 0 0] Tm -0 0 Td -402.263 256.561 Td -/F134_0 9.9626 Tf +402.263 255.33 Td +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 479.972 256.561] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -479.972 -256.561] cm -[1 0 0 1 0 0] Tm -0 0 Td -482.082 256.561 Td -/F130_0 9.9626 Tf +482.082 255.33 Td +/F122_0 9.9626 Tf (until) 18.2714 Tj -212 TJm (all) 9.9626 Tj -212 TJm (output) 25.4644 Tj -72 244.605 Td +72 243.375 Td (data) 16.5977 Tj -256 TJm (has) 13.2801 Tj @@ -54037,36 +48025,28 @@ f -256 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -257 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -256 TJm (once) 18.8094 Tj -[1 0 0 1 278.978 244.605] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -278.978 -244.605] cm -[1 0 0 1 0 0] Tm -0 0 Td -278.978 244.605 Td -/F134_0 9.9626 Tf +278.979 243.375 Td +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 356.687 244.605] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -356.687 -244.605] cm -[1 0 0 1 0 0] Tm -0 0 Td -359.236 244.605 Td -/F130_0 9.9626 Tf +359.236 243.375 Td +/F122_0 9.9626 Tf (appears,) 32.9164 Tj -257 TJm (you) 14.9439 Tj @@ -54076,19 +48056,19 @@ f (guaranteed) 43.7059 Tj -256 TJm (to) 7.7509 Tj --256 TJm -(ha) 9.40469 Tj +-255 TJm +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj --255 TJm -(a) 4.42339 Tj +(e) 4.4234 Tj +-256 TJm +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 25 TJm (ailable) 26.5603 Tj -72 232.65 Td +72 231.419 Td (all) 9.9626 Tj -250 TJm (the) 12.1743 Tj @@ -54098,56 +48078,42 @@ f (output,) 27.9551 Tj -250 TJm (and) 14.386 Tj -[1 0 0 1 205.369 232.65] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -205.369 -232.65] cm -[1 0 0 1 0 0] Tm -0 0 Td -205.369 232.65 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompressEnd) 113.574 Tj -[1 0 0 1 318.943 232.65] cm +205.369 231.419 Td +/F124_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.5736 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -318.943 -232.65] cm -[1 0 0 1 0 0] Tm -0 0 Td -321.433 232.65 Td -/F130_0 9.9626 Tf +321.433 231.419 Td +/F122_0 9.9626 Tf (can) 13.8281 Tj -250 TJm (safely) 23.7907 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (called.) 26.2813 Tj -[1 0 0 1 72 230.493] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -220.531] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 210.732 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj +72 209.502 Td +(If) 6.6351 Tj -250 TJm (case) 17.1456 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -250 TJm (error) 19.3573 Tj -250 TJm @@ -54162,27 +48128,19 @@ f (should) 26.5703 Tj -250 TJm (call) 14.386 Tj -[1 0 0 1 261.259 210.732] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -261.259 -210.732] cm -[1 0 0 1 0 0] Tm -0 0 Td -261.259 210.732 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompressEnd) 113.574 Tj -[1 0 0 1 374.833 210.732] cm +261.259 209.502 Td +/F124_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.5736 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -374.833 -210.732] cm -[1 0 0 1 0 0] Tm -0 0 Td -377.323 210.732 Td -/F130_0 9.9626 Tf +377.323 209.502 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj -250 TJm (clean) 21.0211 Tj @@ -54195,22 +48153,16 @@ f -250 TJm (memory) 33.2053 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 208.576] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -198.613] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 188.815 Td -/F130_0 9.9626 Tf +72 187.584 Td (Possible) 33.2153 Tj -250 TJm (return) 23.7907 Tj @@ -54218,22 +48170,14 @@ f (v) 4.9813 Tj 25 TJm (alues:) 23.2427 Tj -[1 0 0 1 72 188.715] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -137.863] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54258,7 +48202,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54267,12 +48210,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54281,18 +48218,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (17) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54301,7 +48240,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54310,12 +48248,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54324,7 +48260,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 21 21 +%%Page: 18 21 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -54342,20 +48278,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54380,7 +48312,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54389,12 +48320,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54403,36 +48328,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54441,7 +48362,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54450,67 +48370,66 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -200.882] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 540.672] cm 0 0 468 179.328 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 175.741] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -711.631] cm [1 0 0 1 0 0] Tm 0 0 Td 90 711.631 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_PARAM_ERROR) 83.6858 Tj -98.4879 699.676 Td +98.488 699.676 Td (if) 11.9551 Tj -426 TJm (strm) 23.9102 Tj @@ -54526,20 +48445,20 @@ f (is) 11.9551 Tj -426 TJm (NULL) 23.9102 Tj -98.4879 687.721 Td +98.488 687.721 Td (or) 11.9551 Tj -426 TJm (strm->avail_out) 89.6634 Tj -426 TJm -(<) 5.97756 Tj +(<) 5.9776 Tj -426 TJm -(1) 5.97756 Tj +(1) 5.9776 Tj 90 675.766 Td (BZ_DATA_ERROR) 77.7083 Tj -98.4879 663.811 Td +98.488 663.811 Td (if) 11.9551 Tj -426 TJm -(a) 5.97756 Tj +(a) 5.9776 Tj -426 TJm (data) 23.9102 Tj -426 TJm @@ -54559,8 +48478,8 @@ f -426 TJm (stream) 35.8654 Tj 90 651.856 Td -(BZ_DATA_ERROR_MAGIC) 113.574 Tj -98.4879 639.9 Td +(BZ_DATA_ERROR_MAGIC) 113.5736 Tj +98.488 639.9 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -54584,7 +48503,7 @@ f (bytes) 29.8878 Tj 90 627.945 Td (BZ_MEM_ERROR) 71.7307 Tj -98.4879 615.99 Td +98.488 615.99 Td (if) 11.9551 Tj -426 TJm (there) 29.8878 Tj @@ -54598,7 +48517,7 @@ f (available) 53.798 Tj 90 604.035 Td (BZ_STREAM_END) 77.7083 Tj -98.4879 592.08 Td +98.488 592.08 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -54622,7 +48541,7 @@ f (and) 17.9327 Tj -426 TJm (all) 17.9327 Tj -98.4879 580.125 Td +98.488 580.124 Td (output) 35.8654 Tj -426 TJm (in) 11.9551 Tj @@ -54637,19 +48556,13 @@ f -426 TJm (s-->avail_out) 77.7083 Tj -426 TJm -(>) 5.97756 Tj +(>) 5.9776 Tj -426 TJm -(0) 5.97756 Tj +(0) 5.9776 Tj 90 568.169 Td (BZ_OK) 29.8878 Tj -98.4879 556.214 Td +98.488 556.214 Td (otherwise) 53.798 Tj -[1 0 0 1 72 540.673] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54658,65 +48571,62 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -530.71] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 518.755 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Allo) 17.7135 Tj 25 TJm (w) 7.193 Tj 10 TJm (able) 16.5977 Tj -250 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 15 TJm (xt) 7.7509 Tj -250 TJm (actions:) 30.9936 Tj -[1 0 0 1 72 518.655] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -60.7721] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 59.7758 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 457.883] cm +0 0 468 59.776 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 56.1892] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -509.29] cm [1 0 0 1 0 0] Tm 0 0 Td 90 509.29 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -98.4879 497.335 Td +98.488 497.335 Td (if) 11.9551 Tj -426 TJm (BZ_OK) 29.8878 Tj @@ -54725,24 +48635,9 @@ f -426 TJm (returned) 47.8205 Tj 90 485.38 Td -(BZ2_bzDecompressEnd) 113.574 Tj -98.4879 473.425 Td +(BZ2_bzDecompressEnd) 113.5736 Tj +98.488 473.425 Td (otherwise) 53.798 Tj -[1 0 0 1 72 457.883] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54767,7 +48662,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54776,29 +48670,23 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -447.92] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 427.262 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.3.6.) 43.0729 Tj -[1 0 0 1 119.858 427.262] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -427.262] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 427.262 Td -/F392_0 17.2154 Tf -(BZ2_bzDecompressEnd) 196.256 Tj -[1 0 0 1 316.114 427.262] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -244.114 -2.3326] cm +-278 TJm +(BZ2_bzDecompressEnd) 197.0647 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54823,56 +48711,48 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 398.792] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -415.564] cm [1 0 0 1 0 0] Tm 0 0 Td -90 415.564 Td -/F134_0 9.9626 Tf +90 414.334 Td +/F124_0 9.9626 Tf (int) 17.9327 Tj -426 TJm -(BZ2_bzDecompressEnd) 113.574 Tj +(BZ2_bzDecompressEnd) 113.5736 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (bz_stream) 53.798 Tj -298.259 413.821 Td -(*) 5.97756 Tj -304.236 415.564 Td +298.259 412.59 Td +(*) 5.9776 Tj +304.236 414.334 Td (strm) 23.9102 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 400.023] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54881,16 +48761,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -390.06] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 378.105 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 376.874 Td +/F122_0 9.9626 Tf (Releases) 34.8591 Tj -250 TJm (all) 9.9626 Tj @@ -54901,26 +48781,20 @@ f -250 TJm (with) 17.7135 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (decompression) 59.7656 Tj -250 TJm (stream.) 29.0509 Tj -[1 0 0 1 72 375.948] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -365.985] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 356.187 Td -/F130_0 9.9626 Tf +72 354.956 Td (Possible) 33.2153 Tj -250 TJm (return) 23.7907 Tj @@ -54928,44 +48802,41 @@ f (v) 4.9813 Tj 25 TJm (alues:) 23.2427 Tj -[1 0 0 1 72 356.087] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -60.7721] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 59.7758 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 294.085] cm +0 0 468 59.776 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 56.1893] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -346.723] cm [1 0 0 1 0 0] Tm 0 0 Td -90 346.723 Td -/F134_0 9.9626 Tf +90 345.492 Td +/F124_0 9.9626 Tf (BZ_PARAM_ERROR) 83.6858 Tj -98.4879 334.767 Td +98.488 333.537 Td (if) 11.9551 Tj -426 TJm (strm) 23.9102 Tj @@ -54981,16 +48852,10 @@ f (is) 11.9551 Tj -426 TJm (NULL) 23.9102 Tj -90 322.812 Td +90 321.581 Td (BZ_OK) 29.8878 Tj -98.4879 310.857 Td +98.488 309.626 Td (otherwise) 53.798 Tj -[1 0 0 1 72 295.315] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -54999,70 +48864,61 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -285.353] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 273.397 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 272.167 Td +/F122_0 9.9626 Tf (Allo) 17.7135 Tj 25 TJm (w) 7.193 Tj 10 TJm (able) 16.5977 Tj -250 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 15 TJm (xt) 7.7509 Tj -250 TJm (actions:) 30.9936 Tj -[1 0 0 1 72 273.298] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 247.161] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -263.933] cm [1 0 0 1 0 0] Tm 0 0 Td -98.4879 263.933 Td -/F134_0 9.9626 Tf +98.488 262.702 Td +/F124_0 9.9626 Tf (None.) 29.8878 Tj -[1 0 0 1 72 248.391] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55071,7 +48927,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55100,7 +48959,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55109,11 +48967,8 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -238.429] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 213.639 Td -/F122_0 20.6585 Tf +72 212.408 Td +/F116_0 20.6585 Tf (3.4.) 34.4584 Tj -278 TJm (High-le) 70.0117 Tj @@ -55121,7 +48976,6 @@ f (vel) 28.7153 Tj -278 TJm (interface) 86.1046 Tj -[1 0 0 1 72 209.042] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55146,16 +49000,12 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -199.08] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 191.721 Td -/F130_0 9.9626 Tf +72 190.49 Td +/F122_0 9.9626 Tf (This) 17.7135 Tj -250 TJm (interf) 21.579 Tj @@ -55175,27 +49025,19 @@ f (and) 14.386 Tj -250 TJm (writing) 28.782 Tj -[1 0 0 1 300.292 191.721] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -300.292 -191.721] cm -[1 0 0 1 0 0] Tm -0 0 Td -300.292 191.721 Td -/F134_0 9.9626 Tf +300.292 190.49 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 330.18 191.721] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -330.18 -191.721] cm -[1 0 0 1 0 0] Tm -0 0 Td -332.67 191.721 Td -/F130_0 9.9626 Tf +332.67 190.49 Td +/F122_0 9.9626 Tf (format) 26.5603 Tj -250 TJm (\002les.) 19.0983 Tj @@ -55207,445 +49049,347 @@ f (general) 29.3199 Tj -250 TJm (points.) 26.8492 Tj -[1 0 0 1 72 189.564] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -29.7236] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -159.84] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 159.84 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 159.84] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +74.491 158.609 Td +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -159.84] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 159.84 Td -/F130_0 9.9626 Tf +-450 TJm (All) 12.7322 Tj --332 TJm -(of) 8.29885 Tj --331 TJm +-353 TJm +(of) 8.2988 Tj +-352 TJm (the) 12.1743 Tj --332 TJm +-353 TJm (functions) 37.0808 Tj --332 TJm +-352 TJm (tak) 12.1743 Tj 10 TJm -(e) 4.42339 Tj --331 TJm -(an) 9.40469 Tj -[1 0 0 1 202.958 159.84] cm +(e) 4.4234 Tj +-353 TJm +(an) 9.4047 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -202.958 -159.84] cm -[1 0 0 1 0 0] Tm -0 0 Td -202.958 159.84 Td -/F134_0 9.9626 Tf +199.726 158.609 Td +/F124_0 9.9626 Tf (int) 17.9327 Tj -220.891 158.097 Td -(*) 5.97756 Tj -[1 0 0 1 226.868 159.84] cm +217.658 156.866 Td +(*) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -226.868 -159.84] cm -[1 0 0 1 0 0] Tm -0 0 Td -230.172 159.84 Td -/F130_0 9.9626 Tf +227.149 158.609 Td +/F122_0 9.9626 Tf (\002rst) 15.5018 Tj --332 TJm -(ar) 7.74094 Tj +-353 TJm +(ar) 7.7409 Tj 18 TJm (gument,) 32.3785 Tj -[1 0 0 1 292.426 159.84] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -292.426 -159.84] cm -[1 0 0 1 0 0] Tm -0 0 Td -292.426 159.84 Td -/F134_0 9.9626 Tf +289.871 158.609 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 334.269 159.84] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -334.269 -159.84] cm -[1 0 0 1 0 0] Tm -0 0 Td -334.269 159.84 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj --1110 TJm +331.715 158.609 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj +-1236 TJm (After) 21.0211 Tj --332 TJm +-352 TJm (each) 18.2515 Tj --331 TJm +-353 TJm (call,) 16.8766 Tj -[1 0 0 1 414.083 159.84] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -414.083 -159.84] cm -[1 0 0 1 0 0] Tm -0 0 Td -414.083 159.84 Td -/F134_0 9.9626 Tf +413.457 158.609 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 455.926 159.84] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -455.926 -159.84] cm -[1 0 0 1 0 0] Tm -0 0 Td -459.23 159.84 Td -/F130_0 9.9626 Tf +458.813 158.609 Td +/F122_0 9.9626 Tf (should) 26.5703 Tj --332 TJm -(be) 9.40469 Tj --331 TJm +-353 TJm +(be) 9.4047 Tj +-352 TJm (consulted) 38.1866 Tj -86.944 147.885 Td +81.963 146.654 Td (\002rst) 15.5018 Tj --349 TJm +-371 TJm (to) 7.7509 Tj --349 TJm +-371 TJm (determine) 39.8404 Tj --348 TJm +-372 TJm (the) 12.1743 Tj --349 TJm +-371 TJm (outcome) 34.3112 Tj --349 TJm -(of) 8.29885 Tj --349 TJm +-371 TJm +(of) 8.2988 Tj +-371 TJm (the) 12.1743 Tj --348 TJm +-372 TJm (call.) 16.8766 Tj --1213 TJm -(If) 6.63509 Tj -[1 0 0 1 280.386 147.885] cm +-1347 TJm +(If) 6.6351 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -280.386 -147.885] cm -[1 0 0 1 0 0] Tm -0 0 Td -280.386 147.885 Td -/F134_0 9.9626 Tf +278.539 146.654 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 322.229 147.885] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -322.229 -147.885] cm -[1 0 0 1 0 0] Tm -0 0 Td -325.704 147.885 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj -[1 0 0 1 335.824 147.885] cm +324.081 146.654 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -335.824 -147.885] cm -[1 0 0 1 0 0] Tm -0 0 Td -335.824 147.885 Td -/F134_0 9.9626 Tf +334.424 146.654 Td +/F124_0 9.9626 Tf (BZ_OK) 29.8878 Tj -[1 0 0 1 365.711 147.885] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -365.711 -147.885] cm -[1 0 0 1 0 0] Tm -0 0 Td -365.711 147.885 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj --349 TJm +364.312 146.654 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj +-371 TJm (the) 12.1743 Tj --349 TJm +-372 TJm (call) 14.386 Tj --348 TJm +-371 TJm (completed) 41.5042 Tj --349 TJm +-371 TJm (successfully) 48.6972 Tj 65 TJm -(,) 2.49065 Tj --374 TJm +(,) 2.4907 Tj +-402 TJm (and) 14.386 Tj --348 TJm +-371 TJm (only) 17.7135 Tj -86.944 135.93 Td +81.963 134.699 Td (then) 17.1556 Tj --271 TJm +-292 TJm (should) 26.5703 Tj --270 TJm +-293 TJm (the) 12.1743 Tj --271 TJm +-292 TJm (return) 23.7907 Tj --270 TJm +-292 TJm (v) 4.9813 Tj 25 TJm (alue) 16.5977 Tj --271 TJm -(of) 8.29885 Tj --271 TJm +-293 TJm +(of) 8.2988 Tj +-292 TJm (the) 12.1743 Tj --270 TJm +-292 TJm (function) 33.2053 Tj --271 TJm -(\(if) 9.40469 Tj --270 TJm -(an) 9.40469 Tj +-293 TJm +(\(if) 9.4047 Tj +-292 TJm +(an) 9.4047 Tj 15 TJm -(y\)) 8.29885 Tj --271 TJm -(be) 9.40469 Tj --271 TJm -(cons) 18.2614 Tj -1 TJm -(u) 4.9813 Tj --1 TJm -(l) 2.7696 Tj -1 TJm -(ted.) 14.6649 Tj --744 TJm -(If) 6.63509 Tj -[1 0 0 1 365.077 135.93] cm +(y\)) 8.2988 Tj +-292 TJm +(be) 9.4047 Tj +-293 TJm +(consulted.) 40.6773 Tj +-874 TJm +(If) 6.6351 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -365.077 -135.93] cm -[1 0 0 1 0 0] Tm -0 0 Td -365.077 135.93 Td -/F134_0 9.9626 Tf +363.994 134.699 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 406.92 135.93] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -406.92 -135.93] cm -[1 0 0 1 0 0] Tm -0 0 Td -409.616 135.93 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj -[1 0 0 1 418.956 135.93] cm +408.749 134.699 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -418.956 -135.93] cm -[1 0 0 1 0 0] Tm -0 0 Td -418.956 135.93 Td -/F134_0 9.9626 Tf +418.307 134.699 Td +/F124_0 9.9626 Tf (BZ_IO_ERROR) 65.7532 Tj -[1 0 0 1 484.71 135.93] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -484.71 -135.93] cm -[1 0 0 1 0 0] Tm -0 0 Td -484.71 135.93 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj --271 TJm +484.06 134.699 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj +-292 TJm (there) 19.9152 Tj --270 TJm +-293 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj --271 TJm -(an) 9.40469 Tj -86.944 123.975 Td +(as) 8.2988 Tj +-292 TJm +(an) 9.4047 Tj +81.963 122.744 Td (error) 19.3573 Tj --246 TJm -(reading/writing) 61.4294 Tj --245 TJm +-279 TJm +(reading/writ) 48.6972 Tj +1 TJm +(ing) 12.7322 Tj +-279 TJm (the) 12.1743 Tj --246 TJm +-279 TJm (underlying) 43.1679 Tj --246 TJm +-278 TJm (compressed) 47.0334 Tj --245 TJm +-279 TJm (\002le,) 15.2229 Tj --247 TJm +-285 TJm (and) 14.386 Tj --245 TJm +-279 TJm (you) 14.9439 Tj --246 TJm +-279 TJm (should) 26.5703 Tj --246 TJm +-278 TJm (then) 17.1556 Tj --245 TJm +-279 TJm (consult) 28.782 Tj -[1 0 0 1 414.096 123.975] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -414.096 -123.975] cm -[1 0 0 1 0 0] Tm -0 0 Td -414.096 123.975 Td -/F134_0 9.9626 Tf +412.785 122.744 Td +/F124_0 9.9626 Tf (errno) 29.8878 Tj -[1 0 0 1 443.984 123.975] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -443.984 -123.975] cm -[1 0 0 1 0 0] Tm -0 0 Td -446.432 123.975 Td -/F130_0 9.9626 Tf +445.448 122.744 Td +/F122_0 9.9626 Tf (/) 2.7696 Tj -[1 0 0 1 451.649 123.975] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -451.649 -123.975] cm -[1 0 0 1 0 0] Tm -0 0 Td -451.649 123.975 Td -/F134_0 9.9626 Tf +450.993 122.744 Td +/F124_0 9.9626 Tf (perror) 35.8654 Tj -[1 0 0 1 487.514 123.975] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -487.514 -123.975] cm -[1 0 0 1 0 0] Tm -0 0 Td -489.962 123.975 Td -/F130_0 9.9626 Tf +489.634 122.744 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj --246 TJm +-279 TJm (determine) 39.8404 Tj -86.944 112.02 Td +81.963 110.789 Td (the) 12.1743 Tj --356 TJm +-376 TJm (cause) 22.1269 Tj --356 TJm -(of) 8.29885 Tj --355 TJm +-376 TJm +(of) 8.2988 Tj +-377 TJm (the) 12.1743 Tj --356 TJm +-376 TJm (dif) 11.0684 Tj 25 TJm (\002culty) 25.4644 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 206.528 112.02] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -206.528 -112.02] cm -[1 0 0 1 0 0] Tm -0 0 Td -206.528 112.02 Td -/F134_0 9.9626 Tf +203.58 110.789 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 248.371 112.02] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -248.371 -112.02] cm -[1 0 0 1 0 0] Tm -0 0 Td -251.916 112.02 Td -/F130_0 9.9626 Tf +249.171 110.789 Td +/F122_0 9.9626 Tf (may) 17.1556 Tj --356 TJm +-376 TJm (also) 16.0497 Tj --356 TJm -(be) 9.40469 Tj --355 TJm +-376 TJm +(be) 9.4047 Tj +-377 TJm (set) 11.0684 Tj --356 TJm +-376 TJm (to) 7.7509 Tj --356 TJm +-376 TJm (v) 4.9813 Tj 25 TJm (arious) 24.3486 Tj --356 TJm +-376 TJm (other) 20.4731 Tj --356 TJm +-377 TJm (v) 4.9813 Tj 25 TJm (alues;) 23.2427 Tj --408 TJm +-439 TJm (precise) 28.2141 Tj --356 TJm +-376 TJm (details) 26.0123 Tj --356 TJm +-376 TJm (are) 12.1643 Tj --356 TJm +-377 TJm (gi) 7.7509 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(en) 9.40469 Tj --356 TJm +(en) 9.4047 Tj +-376 TJm (on) 9.9626 Tj --356 TJm -(a) 4.42339 Tj -86.944 100.064 Td +-376 TJm +(a) 4.4234 Tj +81.963 98.834 Td (per) 12.7222 Tj 20 TJm (-function) 36.5229 Tj @@ -55656,23 +49400,15 @@ f 25 TJm (w) 7.193 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 186.839 100.064] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -114.838 -49.2126] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55697,7 +49433,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55706,12 +49441,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55720,18 +49449,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (18) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55740,7 +49471,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55749,12 +49479,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55763,7 +49491,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 22 22 +%%Page: 19 22 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -55781,20 +49509,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55819,7 +49543,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55828,12 +49551,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55842,36 +49559,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55880,7 +49593,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -55889,447 +49601,348 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -31.5168] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td -78.9739 710.037 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 710.037] cm +74.491 710.037 Td +/F122_0 9.9626 Tf +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm +-450 TJm +(If) 6.6351 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 710.037 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj -[1 0 0 1 95.9576 710.037] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -95.9576 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td -95.9576 710.037 Td -/F134_0 9.9626 Tf +91.793 710.037 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 137.801 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -137.801 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td -140.179 710.037 Td -/F130_0 9.9626 Tf +136.332 710.037 Td +/F122_0 9.9626 Tf (indicates) 35.417 Tj --239 TJm -(an) 9.40469 Tj --238 TJm +-271 TJm +(an) 9.4047 Tj +-270 TJm (error) 19.3573 Tj --239 TJm +-271 TJm (\(ie,) 13.0012 Tj --241 TJm -(an) 9.40469 Tj +-276 TJm +(an) 9.4047 Tj 15 TJm (ything) 25.4644 Tj --239 TJm -(e) 4.42339 Tj +-271 TJm +(e) 4.4234 Tj 15 TJm (xcept) 21.579 Tj -[1 0 0 1 292.225 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -292.225 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td -292.225 710.037 Td -/F134_0 9.9626 Tf +290.317 710.037 Td +/F124_0 9.9626 Tf (BZ_OK) 29.8878 Tj -[1 0 0 1 322.113 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -322.113 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td -324.492 710.037 Td -/F130_0 9.9626 Tf +322.901 710.037 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 341.256 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -341.256 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td -341.256 710.037 Td -/F134_0 9.9626 Tf +339.984 710.037 Td +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 418.965 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -418.965 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td -418.965 710.037 Td -/F130_0 9.9626 Tf +417.693 710.037 Td +/F122_0 9.9626 Tf (\),) 5.8082 Tj --239 TJm +-271 TJm (you) 14.9439 Tj --239 TJm +-270 TJm (should) 26.5703 Tj --238 TJm +-271 TJm (immediately) 49.813 Tj --239 TJm +-271 TJm (call) 14.386 Tj -[1 0 0 1 86.944 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 698.082 Td -/F134_0 9.9626 Tf +81.963 698.082 Td +/F124_0 9.9626 Tf (BZ2_bzReadClose) 89.6634 Tj -[1 0 0 1 176.608 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -176.608 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td -179.343 698.082 Td -/F130_0 9.9626 Tf +173.971 698.082 Td +/F122_0 9.9626 Tf (\(or) 11.6164 Tj -[1 0 0 1 193.695 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -193.695 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td -193.695 698.082 Td -/F134_0 9.9626 Tf +187.932 698.082 Td +/F124_0 9.9626 Tf (BZ2_bzWriteClose) 95.641 Tj -[1 0 0 1 289.337 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -289.337 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td -289.337 698.082 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj --281 TJm +283.573 698.082 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj +-238 TJm (depending) 41.5042 Tj --274 TJm +-236 TJm (on) 9.9626 Tj --275 TJm +-235 TJm (whether) 32.0895 Tj --274 TJm +-235 TJm (you) 14.9439 Tj --275 TJm +-236 TJm (are) 12.1643 Tj --275 TJm +-235 TJm (attempting) 42.62 Tj --274 TJm +-235 TJm (to) 7.7509 Tj --275 TJm +-236 TJm (read) 17.1456 Tj --274 TJm -(or) 8.29885 Tj --275 TJm +-235 TJm +(or) 8.2988 Tj +-235 TJm (to) 7.7509 Tj --274 TJm +-236 TJm (write\)) 23.7907 Tj -86.944 686.127 Td +-235 TJm (to) 7.7509 Tj --242 TJm +81.963 686.127 Td (free) 15.4819 Tj --242 TJm +-309 TJm (up) 9.9626 Tj --241 TJm +-309 TJm (all) 9.9626 Tj --242 TJm +-309 TJm (resources) 37.6188 Tj --242 TJm +-310 TJm (associated) 40.9463 Tj --242 TJm -(wi) 9.9626 Tj -1 TJm -(th) 7.7509 Tj --242 TJm +-309 TJm +(with) 17.7135 Tj +-309 TJm (the) 12.1743 Tj --242 TJm +-309 TJm (stream.) 29.0509 Tj --614 TJm +-975 TJm (Once) 21.0211 Tj --242 TJm -(an) 9.40469 Tj --242 TJm +-309 TJm +(an) 9.4047 Tj +-310 TJm (error) 19.3573 Tj --242 TJm +-309 TJm (has) 13.2801 Tj --242 TJm +-309 TJm (been) 18.8094 Tj --241 TJm +-309 TJm (indicated,) 39.0135 Tj --244 TJm +-324 TJm (beha) 18.8094 Tj 20 TJm (viour) 21.031 Tj --241 TJm -(of) 8.29885 Tj --242 TJm +-309 TJm +(of) 8.2988 Tj +-309 TJm (all) 9.9626 Tj --242 TJm +-310 TJm (calls) 18.2614 Tj --242 TJm -(e) 4.42339 Tj +-309 TJm +(e) 4.4234 Tj 15 TJm (xcept) 21.579 Tj -[1 0 0 1 86.944 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 674.172 Td -/F134_0 9.9626 Tf +81.963 674.172 Td +/F124_0 9.9626 Tf (BZ2_bzReadClose) 89.6634 Tj -[1 0 0 1 176.608 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -176.608 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td -179.705 674.172 Td -/F130_0 9.9626 Tf -(\() 3.31755 Tj -[1 0 0 1 183.022 674.172] cm +175.035 674.172 Td +/F122_0 9.9626 Tf +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -183.022 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td -183.022 674.172 Td -/F134_0 9.9626 Tf +178.352 674.172 Td +/F124_0 9.9626 Tf (BZ2_bzWriteClose) 95.641 Tj -[1 0 0 1 278.664 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -278.664 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td -278.664 674.172 Td -/F130_0 9.9626 Tf -(\)) 3.31755 Tj --311 TJm -(is) 6.64505 Tj --311 TJm +273.994 674.172 Td +/F122_0 9.9626 Tf +(\)) 3.3175 Tj +-342 TJm +(is) 6.6451 Tj +-342 TJm (unde\002ned.) 41.7831 Tj --985 TJm +-1173 TJm (The) 15.4918 Tj --311 TJm +-342 TJm (implication) 45.3896 Tj --310 TJm -(is) 6.64505 Tj --311 TJm +-342 TJm +(is) 6.6451 Tj +-342 TJm (that) 14.9439 Tj --311 TJm +-342 TJm (\(1\)) 11.6164 Tj -[1 0 0 1 455.988 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -455.988 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td -455.988 674.172 Td -/F134_0 9.9626 Tf +455.366 674.172 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 497.831 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -497.831 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td -500.928 674.172 Td -/F130_0 9.9626 Tf +500.617 674.172 Td +/F122_0 9.9626 Tf (should) 26.5703 Tj --311 TJm -(be) 9.40469 Tj -86.944 662.217 Td +-342 TJm +(be) 9.4047 Tj +81.963 662.217 Td (check) 23.2328 Tj 10 TJm -(ed) 9.40469 Tj --291 TJm +(ed) 9.4047 Tj +-331 TJm (after) 18.2515 Tj --291 TJm +-331 TJm (each) 18.2515 Tj --291 TJm +-331 TJm (call,) 16.8766 Tj --301 TJm +-351 TJm (and) 14.386 Tj --291 TJm +-331 TJm (\(2\)) 11.6164 Tj --291 TJm -(if) 6.08715 Tj -[1 0 0 1 225.347 662.217] cm +-331 TJm +(if) 6.0871 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -225.347 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td -225.347 662.217 Td -/F134_0 9.9626 Tf +223.255 662.217 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 267.19 662.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -267.19 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td -270.09 662.217 Td -/F130_0 9.9626 Tf +268.396 662.217 Td +/F122_0 9.9626 Tf (indicates) 35.417 Tj --291 TJm -(an) 9.40469 Tj --291 TJm +-331 TJm +(an) 9.4047 Tj +-331 TJm (error) 19.3573 Tj 40 TJm -(,) 2.49065 Tj -[1 0 0 1 345.161 662.217] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -345.161 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td -345.161 662.217 Td -/F134_0 9.9626 Tf +344.762 662.217 Td +/F124_0 9.9626 Tf (BZ2_bzReadClose) 89.6634 Tj -[1 0 0 1 434.824 662.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -434.824 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td 437.724 662.217 Td -/F130_0 9.9626 Tf -(\() 3.31755 Tj -[1 0 0 1 441.041 662.217] cm +/F122_0 9.9626 Tf +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -441.041 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td 441.041 662.217 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzWriteClose) 95.641 Tj -[1 0 0 1 536.683 662.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -536.683 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td -536.683 662.217 Td -/F130_0 9.9626 Tf -(\)) 3.31755 Tj -86.944 650.262 Td +536.682 662.217 Td +/F122_0 9.9626 Tf +(\)) 3.3175 Tj +81.963 650.261 Td (should) 26.5703 Tj -250 TJm (then) 17.1556 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (called) 23.7907 Tj -250 TJm @@ -56338,183 +49951,147 @@ Q (clean) 21.0211 Tj -250 TJm (up.) 12.4533 Tj -[1 0 0 1 220.034 650.261] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -148.034 -21.9178] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -628.344] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 628.344 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 628.344] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +74.491 628.344 Td +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -628.344] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 628.344 Td -/F130_0 9.9626 Tf +-450 TJm (The) 15.4918 Tj -[1 0 0 1 106.362 628.344] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -106.362 -628.344] cm -[1 0 0 1 0 0] Tm -0 0 Td -106.362 628.344 Td -/F134_0 9.9626 Tf +100.186 628.344 Td +/F124_0 9.9626 Tf (FILE) 23.9102 Tj -130.273 626.6 Td -(*) 5.97756 Tj -[1 0 0 1 136.25 628.344] cm +124.097 626.6 Td +(*) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -136.25 -628.344] cm -[1 0 0 1 0 0] Tm -0 0 Td -140.177 628.344 Td -/F130_0 9.9626 Tf -(ar) 7.74094 Tj +132.308 628.344 Td +/F122_0 9.9626 Tf +(ar) 7.7409 Tj 18 TJm (guments) 33.7633 Tj --394 TJm +-224 TJm (passed) 26.5603 Tj --394 TJm +-224 TJm (to) 7.7509 Tj -[1 0 0 1 227.592 628.344] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -227.592 -628.344] cm -[1 0 0 1 0 0] Tm -0 0 Td -227.592 628.344 Td -/F134_0 9.9626 Tf +214.645 628.344 Td +/F124_0 9.9626 Tf (BZ2_bzReadOpen) 83.6858 Tj -[1 0 0 1 311.278 628.344] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -311.278 -628.344] cm -[1 0 0 1 0 0] Tm -0 0 Td -315.205 628.344 Td -/F130_0 9.9626 Tf +300.565 628.344 Td +/F122_0 9.9626 Tf (/) 2.7696 Tj -[1 0 0 1 321.901 628.344] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -321.901 -628.344] cm -[1 0 0 1 0 0] Tm -0 0 Td -321.901 628.344 Td -/F134_0 9.9626 Tf +305.569 628.344 Td +/F124_0 9.9626 Tf (BZ2_bzWriteOpen) 89.6634 Tj -[1 0 0 1 411.565 628.344] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -411.565 -628.344] cm -[1 0 0 1 0 0] Tm -0 0 Td -415.491 628.344 Td -/F130_0 9.9626 Tf +397.466 628.344 Td +/F122_0 9.9626 Tf (should) 26.5703 Tj --394 TJm -(be) 9.40469 Tj --394 TJm +-224 TJm +(be) 9.4047 Tj +-224 TJm (set) 11.0684 Tj --394 TJm +-225 TJm (to) 7.7509 Tj --394 TJm +-224 TJm (binary) 25.4544 Tj --395 TJm +-224 TJm (mode.) 24.6275 Tj -86.944 616.389 Td +-603 TJm (Most) 20.4831 Tj --229 TJm +81.963 616.389 Td (Unix) 19.9252 Tj --229 TJm +-269 TJm (systems) 31.5516 Tj --228 TJm +-270 TJm (will) 15.5018 Tj --229 TJm +-269 TJm (do) 9.9626 Tj --229 TJm +-269 TJm (this) 14.396 Tj --229 TJm +-270 TJm (by) 9.9626 Tj --229 TJm +-269 TJm (def) 12.7222 Tj 10 TJm (ault,) 17.4346 Tj --233 TJm +-274 TJm (b) 4.9813 Tj 20 TJm (ut) 7.7509 Tj --229 TJm -(other) 20.4731 Tj --229 TJm +-270 TJm +(ot) 7.7509 Tj +1 TJm +(her) 12.7222 Tj +-270 TJm (platforms,) 40.6773 Tj --233 TJm +-274 TJm (including) 37.6387 Tj --229 TJm -(W) 9.40469 Tj +-269 TJm +(W) 9.4047 Tj 40 TJm (indo) 17.7135 Tj 25 TJm (ws) 11.0684 Tj --228 TJm +-270 TJm (and) 14.386 Tj --229 TJm +-269 TJm (Mac,) 20.1942 Tj --233 TJm +-274 TJm (will) 15.5018 Tj --229 TJm +-270 TJm (not.) 15.2229 Tj --606 TJm -(If) 6.63509 Tj --229 TJm +-736 TJm +(If) 6.6351 Tj +-269 TJm (you) 14.9439 Tj --229 TJm +-269 TJm (omit) 18.2714 Tj -86.944 604.433 Td +-270 TJm (this,) 16.8866 Tj --250 TJm +81.963 604.433 Td (you) 14.9439 Tj -250 TJm (may) 17.1556 Tj @@ -56533,128 +50110,98 @@ Q -250 TJm (to) 7.7509 Tj -250 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 25 TJm (w) 7.193 Tj -250 TJm (platforms.) 40.6773 Tj -[1 0 0 1 372.66 604.433] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -300.66 -21.9178] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -582.516] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 582.516 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 582.516] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +74.491 582.516 Td +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -582.516] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 582.516 Td -/F130_0 9.9626 Tf +-450 TJm (Memory) 34.3112 Tj --348 TJm +-369 TJm (allocation) 39.2925 Tj --348 TJm +-370 TJm (requests) 32.6474 Tj --348 TJm +-369 TJm (are) 12.1643 Tj --348 TJm +-370 TJm (handled) 31.5416 Tj --348 TJm +-369 TJm (by) 9.9626 Tj -[1 0 0 1 267.67 582.516] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -267.67 -582.516] cm -[1 0 0 1 0 0] Tm -0 0 Td -267.67 582.516 Td -/F134_0 9.9626 Tf +264.468 582.516 Td +/F124_0 9.9626 Tf (malloc) 35.8654 Tj -[1 0 0 1 303.535 582.516] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -303.535 -582.516] cm -[1 0 0 1 0 0] Tm -0 0 Td -307.003 582.516 Td -/F130_0 9.9626 Tf +304.014 582.516 Td +/F122_0 9.9626 Tf (/) 2.7696 Tj -[1 0 0 1 313.241 582.516] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -313.241 -582.516] cm -[1 0 0 1 0 0] Tm -0 0 Td -313.241 582.516 Td -/F134_0 9.9626 Tf +310.465 582.516 Td +/F124_0 9.9626 Tf (free) 23.9102 Tj -[1 0 0 1 337.151 582.516] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -337.151 -582.516] cm -[1 0 0 1 0 0] Tm -0 0 Td -337.151 582.516 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj --1209 TJm +334.376 582.516 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj +-1337 TJm (At) 9.9626 Tj --348 TJm +-370 TJm (present) 28.772 Tj --348 TJm +-369 TJm (there) 19.9152 Tj --348 TJm -(is) 6.64505 Tj --348 TJm +-370 TJm +(is) 6.6451 Tj +-369 TJm (no) 9.9626 Tj --348 TJm -(f) 3.31755 Tj +-370 TJm +(f) 3.3175 Tj 10 TJm (acility) 24.9065 Tj --348 TJm +-369 TJm (for) 11.6164 Tj --348 TJm +-370 TJm (user) 16.5977 Tj 20 TJm (-de\002ned) 32.6474 Tj -86.944 570.56 Td +81.963 570.56 Td (memory) 33.2053 Tj -250 TJm (allocators) 38.7346 Tj @@ -56673,17 +50220,11 @@ Q -250 TJm (easily) 23.2427 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (added,) 26.2813 Tj -250 TJm (though\).) 33.4843 Tj -[1 0 0 1 387.165 570.56] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -315.165 -12.1195] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -56704,7 +50245,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -56713,29 +50253,15 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -548.478] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 529.977 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.4.1.) 43.0729 Tj -[1 0 0 1 119.858 529.977] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -529.977] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 529.977 Td -/F392_0 17.2154 Tf -(BZ2_bzReadOpen) 144.609 Tj -[1 0 0 1 264.468 529.977] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -192.468 -2.3327] cm +-278 TJm +(BZ2_bzReadOpen) 147.3122 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -56760,61 +50286,59 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -72.7272] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 453.686] cm 0 0 468 71.731 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 68.1444] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -518.279] cm [1 0 0 1 0 0] Tm 0 0 Td -90 518.279 Td -/F134_0 9.9626 Tf +90 517.048 Td +/F124_0 9.9626 Tf (typedef) 41.8429 Tj -426 TJm (void) 23.9102 Tj -426 TJm (BZFILE;) 41.8429 Tj -90 494.369 Td +90 493.138 Td (BZFILE) 35.8654 Tj -130.109 492.625 Td -(*) 5.97756 Tj -136.087 494.369 Td +130.109 491.394 Td +(*) 5.9776 Tj +136.087 493.138 Td (BZ2_bzReadOpen\() 89.6634 Tj -426 TJm (int) 17.9327 Tj -252.171 492.625 Td -(*) 5.97756 Tj -258.149 494.369 Td +252.171 491.394 Td +(*) 5.9776 Tj +258.149 493.138 Td (bzerror,) 47.8205 Tj -426 TJm (FILE) 23.9102 Tj -338.368 492.625 Td -(*) 5.97756 Tj -344.346 494.369 Td +338.368 491.394 Td +(*) 5.9776 Tj +344.346 493.138 Td (f,) 11.9551 Tj -191.855 482.414 Td +191.855 481.183 Td (int) 17.9327 Tj -426 TJm (verbosity,) 59.7756 Tj @@ -56822,11 +50346,11 @@ f (int) 17.9327 Tj -426 TJm (small,) 35.8654 Tj -191.855 470.458 Td +191.855 469.228 Td (void) 23.9102 Tj -220.01 468.715 Td -(*) 5.97756 Tj -225.987 470.458 Td +220.01 467.484 Td +(*) 5.9776 Tj +225.987 469.228 Td (unused,) 41.8429 Tj -426 TJm (int) 17.9327 Tj @@ -56834,12 +50358,6 @@ f (nUnused) 41.8429 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 454.917] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -56848,16 +50366,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -444.954] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 432.999 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 431.768 Td +/F122_0 9.9626 Tf (Prepare) 30.4258 Tj -290 TJm (to) 7.7509 Tj @@ -56873,65 +50391,49 @@ f (\002le) 12.7322 Tj -289 TJm (handle) 26.5603 Tj -[1 0 0 1 272.697 432.999] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -272.697 -432.999] cm -[1 0 0 1 0 0] Tm -0 0 Td -272.697 432.999 Td -/F134_0 9.9626 Tf -(f) 5.97756 Tj -[1 0 0 1 278.675 432.999] cm +272.697 431.768 Td +/F124_0 9.9626 Tf +(f) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -278.675 -432.999] cm -[1 0 0 1 0 0] Tm -0 0 Td -278.675 432.999 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 285.439 432.999] cm +278.675 431.768 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -285.439 -432.999] cm -[1 0 0 1 0 0] Tm -0 0 Td -285.439 432.999 Td -/F134_0 9.9626 Tf -(f) 5.97756 Tj -[1 0 0 1 291.417 432.999] cm +285.439 431.768 Td +/F124_0 9.9626 Tf +(f) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -291.417 -432.999] cm -[1 0 0 1 0 0] Tm -0 0 Td -294.303 432.999 Td -/F130_0 9.9626 Tf +294.302 431.768 Td +/F122_0 9.9626 Tf (should) 26.5703 Tj -290 TJm (refer) 18.7994 Tj -289 TJm (to) 7.7509 Tj -290 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -290 TJm (\002le) 12.7322 Tj -289 TJm (which) 24.3486 Tj -290 TJm (has) 13.2801 Tj --289 TJm -(been) 18.8094 Tj -290 TJm +(been) 18.8094 Tj +-289 TJm (opened) 28.772 Tj -290 TJm (for) 11.6164 Tj @@ -56939,7 +50441,7 @@ f (reading,) 32.3685 Tj -300 TJm (and) 14.386 Tj -72 421.044 Td +72 419.813 Td (for) 11.6164 Tj -306 TJm (which) 24.3486 Tj @@ -56950,115 +50452,93 @@ f -306 TJm (indicator) 35.417 Tj -305 TJm -(\() 3.31755 Tj -[1 0 0 1 193.457 421.044] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -193.457 -421.044] cm -[1 0 0 1 0 0] Tm -0 0 Td -193.457 421.044 Td -/F134_0 9.9626 Tf +193.457 419.813 Td +/F124_0 9.9626 Tf (ferror\(f\)) 53.798 Tj -[1 0 0 1 247.255 421.044] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -247.255 -421.044] cm -[1 0 0 1 0 0] Tm -0 0 Td -247.255 421.044 Td -/F130_0 9.9626 Tf +247.255 419.813 Td +/F122_0 9.9626 Tf (\)is) 9.9626 Tj -306 TJm (not) 12.7322 Tj -305 TJm (set.) 13.5591 Tj -954 TJm -(If) 6.63509 Tj -[1 0 0 1 308.784 421.044] cm +(If) 6.6351 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -308.784 -421.044] cm -[1 0 0 1 0 0] Tm -0 0 Td -308.784 421.044 Td -/F134_0 9.9626 Tf +308.784 419.813 Td +/F124_0 9.9626 Tf (small) 29.8878 Tj -[1 0 0 1 338.671 421.044] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -338.671 -421.044] cm -[1 0 0 1 0 0] Tm -0 0 Td -341.717 421.044 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +341.717 419.813 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -306 TJm -(1,) 7.47195 Tj +(1,) 7.472 Tj -319 TJm (the) 12.1743 Tj -306 TJm (library) 26.5603 Tj -306 TJm -(will) 15.5018 Tj --305 TJm +(wil) 12.7322 Tj +1 TJm +(l) 2.7696 Tj +-306 TJm (try) 11.0684 Tj -306 TJm (to) 7.7509 Tj --306 TJm -(dec) 13.8281 Tj -1 TJm -(ompress) 33.2053 Tj +-305 TJm +(decompress) 47.0334 Tj -306 TJm (using) 21.589 Tj -306 TJm (less) 14.9439 Tj -72 409.089 Td +72 407.858 Td (memory) 33.2053 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -250 TJm (at) 7.193 Tj -250 TJm (the) 12.1743 Tj -250 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xpense) 27.6661 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (speed.) 25.1755 Tj -[1 0 0 1 72 406.932] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -396.969] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 387.171 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +72 385.94 Td +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -227 TJm (reasons) 29.8778 Tj -227 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xplained) 34.3112 Tj -228 TJm @@ -57066,86 +50546,62 @@ f 25 TJm (w) 7.193 Tj 65 TJm -(,) 2.49065 Tj -[1 0 0 1 189.193 387.171] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -189.193 -387.171] cm -[1 0 0 1 0 0] Tm -0 0 Td -189.193 387.171 Td -/F134_0 9.9626 Tf +189.193 385.94 Td +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -[1 0 0 1 248.969 387.171] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -248.969 -387.171] cm -[1 0 0 1 0 0] Tm -0 0 Td -251.232 387.171 Td -/F130_0 9.9626 Tf +251.232 385.94 Td +/F122_0 9.9626 Tf (will) 15.5018 Tj -227 TJm (decompress) 47.0334 Tj -227 TJm (the) 12.1743 Tj -[1 0 0 1 332.732 387.171] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -332.732 -387.171] cm -[1 0 0 1 0 0] Tm -0 0 Td -332.732 387.171 Td -/F134_0 9.9626 Tf +332.732 385.94 Td +/F124_0 9.9626 Tf (nUnused) 41.8429 Tj -[1 0 0 1 374.575 387.171] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -374.575 -387.171] cm -[1 0 0 1 0 0] Tm -0 0 Td -376.838 387.171 Td -/F130_0 9.9626 Tf +376.838 385.94 Td +/F122_0 9.9626 Tf (bytes) 21.031 Tj -227 TJm (starting) 29.8878 Tj -227 TJm (at) 7.193 Tj -[1 0 0 1 441.74 387.171] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -441.74 -387.171] cm -[1 0 0 1 0 0] Tm -0 0 Td -441.74 387.171 Td -/F134_0 9.9626 Tf +441.74 385.94 Td +/F124_0 9.9626 Tf (unused) 35.8654 Tj -[1 0 0 1 477.605 387.171] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -477.605 -387.171] cm -[1 0 0 1 0 0] Tm -0 0 Td -477.605 387.171 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +477.605 385.94 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj -232 TJm (before) 25.4445 Tj -227 TJm (starting) 29.8878 Tj -72 375.216 Td +72 373.985 Td (to) 7.7509 Tj -280 TJm (read) 17.1456 Tj @@ -57155,296 +50611,212 @@ f (the) 12.1743 Tj -279 TJm (\002le) 12.7322 Tj -[1 0 0 1 155.094 375.215] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -155.094 -375.215] cm -[1 0 0 1 0 0] Tm -0 0 Td -155.094 375.215 Td -/F134_0 9.9626 Tf -(f) 5.97756 Tj -[1 0 0 1 161.072 375.215] cm +155.094 373.985 Td +/F124_0 9.9626 Tf +(f) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -161.072 -375.215] cm -[1 0 0 1 0 0] Tm -0 0 Td -161.072 375.215 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +161.072 373.985 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj -797 TJm (At) 9.9626 Tj -280 TJm (most) 19.3773 Tj -[1 0 0 1 206.414 375.215] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -206.414 -375.215] cm -[1 0 0 1 0 0] Tm -0 0 Td -206.414 375.215 Td -/F134_0 9.9626 Tf +206.414 373.985 Td +/F124_0 9.9626 Tf (BZ_MAX_UNUSED) 77.7083 Tj -[1 0 0 1 284.122 375.215] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -284.122 -375.215] cm -[1 0 0 1 0 0] Tm -0 0 Td -286.907 375.215 Td -/F130_0 9.9626 Tf +286.907 373.985 Td +/F122_0 9.9626 Tf (bytes) 21.031 Tj -280 TJm (may) 17.1556 Tj -279 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -280 TJm (supplied) 33.7633 Tj -279 TJm (lik) 10.5205 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -280 TJm (this.) 16.8866 Tj -797 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -279 TJm (this) 14.396 Tj -280 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (acility) 24.9065 Tj -279 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -280 TJm (not) 12.7322 Tj -279 TJm (required,) 35.686 Tj -72 363.26 Td +72 362.03 Td (you) 14.9439 Tj -250 TJm (should) 26.5703 Tj -250 TJm (pass) 17.1556 Tj -[1 0 0 1 138.141 363.26] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -138.141 -363.26] cm -[1 0 0 1 0 0] Tm -0 0 Td -138.141 363.26 Td -/F134_0 9.9626 Tf +138.141 362.03 Td +/F124_0 9.9626 Tf (NULL) 23.9102 Tj -[1 0 0 1 162.052 363.26] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -162.052 -363.26] cm -[1 0 0 1 0 0] Tm -0 0 Td -164.542 363.26 Td -/F130_0 9.9626 Tf +164.542 362.03 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 181.419 363.26] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -181.419 -363.26] cm -[1 0 0 1 0 0] Tm -0 0 Td -181.419 363.26 Td -/F134_0 9.9626 Tf -(0) 5.97756 Tj -[1 0 0 1 187.397 363.26] cm +181.419 362.03 Td +/F124_0 9.9626 Tf +(0) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -187.397 -363.26] cm -[1 0 0 1 0 0] Tm -0 0 Td -189.887 363.26 Td -/F130_0 9.9626 Tf +189.887 362.03 Td +/F122_0 9.9626 Tf (for) 11.6164 Tj -[1 0 0 1 203.994 363.26] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -203.994 -363.26] cm -[1 0 0 1 0 0] Tm -0 0 Td -203.994 363.26 Td -/F134_0 9.9626 Tf +203.994 362.03 Td +/F124_0 9.9626 Tf (unused) 35.8654 Tj -[1 0 0 1 239.86 363.26] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -239.86 -363.26] cm -[1 0 0 1 0 0] Tm -0 0 Td -242.351 363.26 Td -/F130_0 9.9626 Tf +242.35 362.03 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -250 TJm (n) 4.9813 Tj -[1 0 0 1 264.208 363.26] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -264.208 -363.26] cm -[1 0 0 1 0 0] Tm -0 0 Td -264.208 363.26 Td -/F134_0 9.9626 Tf +264.208 362.03 Td +/F124_0 9.9626 Tf (Unused) 35.8654 Tj -[1 0 0 1 300.074 363.26] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -300.074 -363.26] cm -[1 0 0 1 0 0] Tm -0 0 Td -302.565 363.26 Td -/F130_0 9.9626 Tf +302.565 362.03 Td +/F122_0 9.9626 Tf (respecti) 30.9837 Tj 25 TJm (v) 4.9813 Tj 15 TJm (ely) 12.1743 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 361.103] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -351.141] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 341.343 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +72 340.112 Td +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm (meaning) 34.3112 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (parameters) 43.7059 Tj -[1 0 0 1 196.631 341.343] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -196.631 -341.343] cm -[1 0 0 1 0 0] Tm -0 0 Td -196.631 341.343 Td -/F134_0 9.9626 Tf +196.631 340.112 Td +/F124_0 9.9626 Tf (small) 29.8878 Tj -[1 0 0 1 226.519 341.343] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -226.519 -341.343] cm -[1 0 0 1 0 0] Tm -0 0 Td -229.01 341.343 Td -/F130_0 9.9626 Tf +229.01 340.112 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 245.887 341.343] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -245.887 -341.343] cm -[1 0 0 1 0 0] Tm -0 0 Td -245.887 341.343 Td -/F134_0 9.9626 Tf +245.887 340.112 Td +/F124_0 9.9626 Tf (verbosity) 53.798 Tj -[1 0 0 1 299.685 341.343] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -299.685 -341.343] cm -[1 0 0 1 0 0] Tm -0 0 Td -299.685 341.343 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +299.685 340.112 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj -250 TJm (see) 12.7222 Tj -[1 0 0 1 319.879 341.343] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -319.879 -341.343] cm -[1 0 0 1 0 0] Tm -0 0 Td -319.879 341.343 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompressInit) 119.551 Tj -[1 0 0 1 439.431 341.343] cm +319.879 340.112 Td +/F124_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.5512 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -439.431 -341.343] cm -[1 0 0 1 0 0] Tm -0 0 Td -439.431 341.343 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 339.186] cm +439.431 340.112 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -329.223] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 319.425 Td -/F130_0 9.9626 Tf +72 318.194 Td (The) 15.4918 Tj -402 TJm (amount) 29.8878 Tj -402 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -402 TJm (memory) 33.2053 Tj -402 TJm @@ -57454,13 +50826,13 @@ f -402 TJm (decompress) 47.0334 Tj -402 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -401 TJm (\002le) 12.7322 Tj -402 TJm (cannot) 26.5603 Tj -402 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -402 TJm (determined) 44.8217 Tj -402 TJm @@ -57470,7 +50842,7 @@ f -402 TJm (\002le') 16.0497 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -402 TJm (header) 26.5503 Tj -402 TJm @@ -57479,196 +50851,147 @@ f (been) 18.8094 Tj -402 TJm (read.) 19.6363 Tj -72 307.47 Td +72 306.239 Td (So) 10.5205 Tj -492 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -491 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -492 TJm (possible) 32.6574 Tj -492 TJm (that) 14.9439 Tj -[1 0 0 1 166.797 307.47] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -166.797 -307.47] cm -[1 0 0 1 0 0] Tm -0 0 Td -166.797 307.47 Td -/F134_0 9.9626 Tf +166.797 306.239 Td +/F124_0 9.9626 Tf (BZ2_bzReadOpen) 83.6858 Tj -[1 0 0 1 250.483 307.47] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -250.483 -307.47] cm -[1 0 0 1 0 0] Tm -0 0 Td -255.381 307.47 Td -/F130_0 9.9626 Tf +255.381 306.239 Td +/F122_0 9.9626 Tf (returns) 27.6661 Tj -[1 0 0 1 287.945 307.47] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -287.945 -307.47] cm -[1 0 0 1 0 0] Tm -0 0 Td -287.945 307.47 Td -/F134_0 9.9626 Tf +287.946 306.239 Td +/F124_0 9.9626 Tf (BZ_OK) 29.8878 Tj -[1 0 0 1 317.833 307.47] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -317.833 -307.47] cm -[1 0 0 1 0 0] Tm -0 0 Td -322.729 307.47 Td -/F130_0 9.9626 Tf +322.729 306.239 Td +/F122_0 9.9626 Tf (b) 4.9813 Tj 20 TJm (ut) 7.7509 Tj -492 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -491 TJm (subsequent) 44.2738 Tj -492 TJm (call) 14.386 Tj -492 TJm -(of) 8.29885 Tj -[1 0 0 1 431.135 307.47] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -431.135 -307.47] cm -[1 0 0 1 0 0] Tm -0 0 Td -431.135 307.47 Td -/F134_0 9.9626 Tf +431.135 306.239 Td +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -[1 0 0 1 490.911 307.47] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -490.911 -307.47] cm -[1 0 0 1 0 0] Tm -0 0 Td -495.81 307.47 Td -/F130_0 9.9626 Tf +495.81 306.239 Td +/F122_0 9.9626 Tf (will) 15.5018 Tj -492 TJm (return) 23.7907 Tj -[1 0 0 1 72 295.514] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -295.514] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 295.514 Td -/F134_0 9.9626 Tf +72 294.284 Td +/F124_0 9.9626 Tf (BZ_MEM_ERROR) 71.7307 Tj -[1 0 0 1 143.731 295.514] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -143.731 -295.514] cm -[1 0 0 1 0 0] Tm -0 0 Td -143.731 295.514 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 294.204] cm +143.731 294.284 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -284.242] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 273.597 Td -/F130_0 9.9626 Tf +72 272.366 Td (Possible) 33.2153 Tj -250 TJm (assignments) 48.7072 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 169.144 273.597] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -169.144 -273.597] cm -[1 0 0 1 0 0] Tm -0 0 Td -169.144 273.597 Td -/F134_0 9.9626 Tf +169.144 272.366 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 210.987 273.597] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -210.987 -273.597] cm -[1 0 0 1 0 0] Tm -0 0 Td -210.987 273.597 Td -/F130_0 9.9626 Tf +210.987 272.366 Td +/F122_0 9.9626 Tf (:) 2.7696 Tj -[1 0 0 1 72 271.44] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -168.369] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 101.84] cm 0 0 468 167.372 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 163.786] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -262.075] cm [1 0 0 1 0 0] Tm 0 0 Td -90 262.075 Td -/F134_0 9.9626 Tf +90 260.844 Td +/F124_0 9.9626 Tf (BZ_CONFIG_ERROR) 89.6634 Tj -98.4879 250.12 Td +98.488 248.889 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -57680,17 +51003,17 @@ f (been) 23.9102 Tj -426 TJm (mis-compiled) 71.7307 Tj -90 238.165 Td +90 236.934 Td (BZ_PARAM_ERROR) 83.6858 Tj -98.4879 226.209 Td +98.488 224.979 Td (if) 11.9551 Tj -426 TJm -(f) 5.97756 Tj +(f) 5.9776 Tj -426 TJm (is) 11.9551 Tj -426 TJm (NULL) 23.9102 Tj -98.4879 214.254 Td +98.488 213.023 Td (or) 11.9551 Tj -426 TJm (small) 29.8878 Tj @@ -57699,15 +51022,15 @@ f -426 TJm (neither) 41.8429 Tj -426 TJm -(0) 5.97756 Tj +(0) 5.9776 Tj -426 TJm (nor) 17.9327 Tj -426 TJm -(1) 5.97756 Tj -98.4879 202.299 Td +(1) 5.9776 Tj +98.488 201.068 Td (or) 11.9551 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (unused) 35.8654 Tj -426 TJm @@ -57721,13 +51044,13 @@ f -426 TJm (!=) 11.9551 Tj -426 TJm -(0) 5.97756 Tj +(0) 5.9776 Tj -426 TJm -(\)) 5.97756 Tj -98.4879 190.344 Td +(\)) 5.9776 Tj +98.488 189.113 Td (or) 11.9551 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (unused) 35.8654 Tj -426 TJm @@ -57747,10 +51070,10 @@ f -426 TJm (BZ_MAX_UNUSED\)) 83.6858 Tj -426 TJm -(\)) 5.97756 Tj -90 178.389 Td +(\)) 5.9776 Tj +90 177.158 Td (BZ_IO_ERROR) 65.7532 Tj -98.4879 166.434 Td +98.488 165.203 Td (if) 11.9551 Tj -426 TJm (ferror\(f\)) 53.798 Tj @@ -57758,9 +51081,9 @@ f (is) 11.9551 Tj -426 TJm (nonzero) 41.8429 Tj -90 154.478 Td +90 153.248 Td (BZ_MEM_ERROR) 71.7307 Tj -98.4879 142.523 Td +98.488 141.292 Td (if) 11.9551 Tj -426 TJm (insufficient) 71.7307 Tj @@ -57770,16 +51093,10 @@ f (is) 11.9551 Tj -426 TJm (available) 53.798 Tj -90 130.568 Td +90 129.337 Td (BZ_OK) 29.8878 Tj -98.4879 118.613 Td +98.488 117.382 Td (otherwise.) 59.7756 Tj -[1 0 0 1 72 103.071] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -57788,16 +51105,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -93.1085] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 81.1533 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 79.922 Td +/F122_0 9.9626 Tf (Possible) 33.2153 Tj -250 TJm (return) 23.7907 Tj @@ -57805,22 +51122,14 @@ f (v) 4.9813 Tj 25 TJm (alues:) 23.2427 Tj -[1 0 0 1 72 81.0538] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -30.202] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -57845,7 +51154,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -57854,12 +51162,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.9737] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -57868,18 +51170,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -51.071] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 534.414 51.071 Td -/F130_0 9.9626 Tf (19) 9.9626 Tj -[1 0 0 1 453.269 50.8519] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -57888,7 +51192,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -57897,12 +51200,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -57911,7 +51212,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 23 23 +%%Page: 20 23 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -57929,20 +51230,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -57967,7 +51264,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -57976,12 +51272,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -57990,36 +51280,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -58028,7 +51314,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -58037,65 +51322,64 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -81.33] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 59.7758 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 660.224] cm +0 0 468 59.776 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 56.1892] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -711.631] cm [1 0 0 1 0 0] Tm 0 0 Td 90 711.631 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (Pointer) 41.8429 Tj -426 TJm (to) 11.9551 Tj @@ -58105,7 +51389,7 @@ f (abstract) 47.8205 Tj -426 TJm (BZFILE) 35.8654 Tj -98.4879 699.676 Td +98.488 699.676 Td (if) 11.9551 Tj -426 TJm (bzerror) 41.8429 Tj @@ -58115,14 +51399,8 @@ f (BZ_OK) 29.8878 Tj 90 687.721 Td (NULL) 23.9102 Tj -98.4879 675.766 Td +98.488 675.766 Td (otherwise) 53.798 Tj -[1 0 0 1 72 660.224] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -58131,65 +51409,62 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5493] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -650.261] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 638.306 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Allo) 17.7135 Tj 25 TJm (w) 7.193 Tj 10 TJm (able) 16.5977 Tj -250 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 15 TJm (xt) 7.7509 Tj -250 TJm (actions:) 30.9936 Tj -[1 0 0 1 72 638.207] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -60.7721] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 59.7758 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 577.435] cm +0 0 468 59.776 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 56.1893] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -628.842] cm [1 0 0 1 0 0] Tm 0 0 Td 90 628.842 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -98.4879 616.887 Td +98.488 616.887 Td (if) 11.9551 Tj -426 TJm (bzerror) 41.8429 Tj @@ -58199,23 +51474,8 @@ f (BZ_OK) 29.8878 Tj 90 604.932 Td (BZ2_bzClose) 65.7532 Tj -98.4879 592.976 Td +98.488 592.976 Td (otherwise) 53.798 Tj -[1 0 0 1 72 577.435] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -58240,7 +51500,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -58249,29 +51508,23 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -567.472] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 546.813 Td -/F122_0 17.2154 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 546.814 Td +/F116_0 17.2154 Tf (3.4.2.) 43.0729 Tj -[1 0 0 1 119.858 546.813] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -546.813] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 546.813 Td -/F392_0 17.2154 Tf -(BZ2_bzRead) 103.292 Tj -[1 0 0 1 223.15 546.813] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -151.15 -2.3326] cm +-278 TJm +(BZ2_bzRead) 103.3096 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -58296,59 +51549,57 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 519.841] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -535.116] cm [1 0 0 1 0 0] Tm 0 0 Td -90 535.116 Td -/F134_0 9.9626 Tf +90 535.383 Td +/F124_0 9.9626 Tf (int) 17.9327 Tj -426 TJm (BZ2_bzRead) 59.7756 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (int) 17.9327 Tj -208.595 533.373 Td -(*) 5.97756 Tj -214.572 535.116 Td +208.595 533.639 Td +(*) 5.9776 Tj +214.572 535.383 Td (bzerror,) 47.8205 Tj -426 TJm (BZFILE) 35.8654 Tj -306.747 533.373 Td -(*) 5.97756 Tj -312.724 535.116 Td +306.747 533.639 Td +(*) 5.9776 Tj +312.724 535.383 Td (b,) 11.9551 Tj -426 TJm (void) 23.9102 Tj -357.077 533.373 Td -(*) 5.97756 Tj -363.055 535.116 Td +357.078 533.639 Td +(*) 5.9776 Tj +363.055 535.383 Td (buf,) 23.9102 Tj -426 TJm (int) 17.9327 Tj @@ -58356,12 +51607,6 @@ f (len) 17.9327 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 519.574] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -58370,42 +51615,34 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -509.612] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 497.656 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 497.923 Td +/F122_0 9.9626 Tf (Reads) 24.3486 Tj -285 TJm (up) 9.9626 Tj -284 TJm (to) 7.7509 Tj -[1 0 0 1 122.569 497.656] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -122.569 -497.656] cm -[1 0 0 1 0 0] Tm -0 0 Td -122.569 497.656 Td -/F134_0 9.9626 Tf +122.569 497.923 Td +/F124_0 9.9626 Tf (len) 17.9327 Tj -[1 0 0 1 140.501 497.656] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -140.501 -497.656] cm -[1 0 0 1 0 0] Tm -0 0 Td -143.337 497.656 Td -/F130_0 9.9626 Tf +143.337 497.923 Td +/F122_0 9.9626 Tf (\(uncompressed\)) 63.6311 Tj -285 TJm (bytes) 21.031 Tj @@ -58417,60 +51654,44 @@ f (compressed) 47.0334 Tj -285 TJm (\002le) 12.7322 Tj -[1 0 0 1 336.319 497.656] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -336.319 -497.656] cm -[1 0 0 1 0 0] Tm -0 0 Td -336.319 497.656 Td -/F134_0 9.9626 Tf -(b) 5.97756 Tj -[1 0 0 1 342.296 497.656] cm +336.319 497.923 Td +/F124_0 9.9626 Tf +(b) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.296 -497.656] cm -[1 0 0 1 0 0] Tm -0 0 Td -345.132 497.656 Td -/F130_0 9.9626 Tf +345.132 497.923 Td +/F122_0 9.9626 Tf (into) 15.5018 Tj -285 TJm (the) 12.1743 Tj -284 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -[1 0 0 1 405.205 497.656] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -405.205 -497.656] cm -[1 0 0 1 0 0] Tm -0 0 Td -405.205 497.656 Td -/F134_0 9.9626 Tf +405.205 497.923 Td +/F124_0 9.9626 Tf (buf) 17.9327 Tj -[1 0 0 1 423.137 497.656] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -423.137 -497.656] cm -[1 0 0 1 0 0] Tm -0 0 Td -423.137 497.656 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +423.137 497.923 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj -828 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -284 TJm (the) 12.1743 Tj -285 TJm @@ -58478,73 +51699,57 @@ f -285 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -284 TJm (successful,) 43.4369 Tj -[1 0 0 1 72 485.701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -485.701] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 485.701 Td -/F134_0 9.9626 Tf +72 485.968 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 113.843 485.701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -113.843 -485.701] cm -[1 0 0 1 0 0] Tm -0 0 Td -117.36 485.701 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +117.36 485.968 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -353 TJm (set) 11.0684 Tj -353 TJm (to) 7.7509 Tj -[1 0 0 1 153.374 485.701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -153.374 -485.701] cm -[1 0 0 1 0 0] Tm -0 0 Td -153.374 485.701 Td -/F134_0 9.9626 Tf +153.374 485.968 Td +/F124_0 9.9626 Tf (BZ_OK) 29.8878 Tj -[1 0 0 1 183.262 485.701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -183.262 -485.701] cm -[1 0 0 1 0 0] Tm -0 0 Td -186.778 485.701 Td -/F130_0 9.9626 Tf +186.778 485.968 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -353 TJm (the) 12.1743 Tj -353 TJm (number) 30.4357 Tj -353 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -353 TJm (bytes) 21.031 Tj -353 TJm (read) 17.1456 Tj -353 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -353 TJm (returned.) 35.686 Tj -1238 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -353 TJm (the) 12.1743 Tj -353 TJm @@ -58554,59 +51759,43 @@ f -353 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -353 TJm (detected,) 35.686 Tj -[1 0 0 1 72 473.746] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -473.746] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 473.746 Td -/F134_0 9.9626 Tf +72 474.013 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 113.843 473.746] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -113.843 -473.746] cm -[1 0 0 1 0 0] Tm -0 0 Td -116.795 473.746 Td -/F130_0 9.9626 Tf +116.795 474.013 Td +/F122_0 9.9626 Tf (will) 15.5018 Tj -296 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -297 TJm (set) 11.0684 Tj -296 TJm (to) 7.7509 Tj -[1 0 0 1 172.329 473.746] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -172.329 -473.746] cm -[1 0 0 1 0 0] Tm -0 0 Td -172.329 473.746 Td -/F134_0 9.9626 Tf +172.328 474.013 Td +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 250.037 473.746] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -250.037 -473.746] cm -[1 0 0 1 0 0] Tm -0 0 Td -250.037 473.746 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +250.037 474.013 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj -296 TJm (and) 14.386 Tj -297 TJm @@ -58614,57 +51803,43 @@ f -296 TJm (number) 30.4357 Tj -296 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -297 TJm (bytes) 21.031 Tj -296 TJm (read) 17.1456 Tj -296 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -296 TJm (returned.) 35.686 Tj -898 TJm (All) 12.7322 Tj -297 TJm (other) 20.4731 Tj -[1 0 0 1 470 473.746] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -470 -473.746] cm -[1 0 0 1 0 0] Tm -0 0 Td -470 473.746 Td -/F134_0 9.9626 Tf +470 474.013 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 511.843 473.746] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -511.843 -473.746] cm -[1 0 0 1 0 0] Tm -0 0 Td -514.795 473.746 Td -/F130_0 9.9626 Tf +514.795 474.013 Td +/F122_0 9.9626 Tf (v) 4.9813 Tj 25 TJm (alues) 20.4731 Tj -72 461.791 Td +72 462.058 Td (denote) 26.5603 Tj -250 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -250 TJm (error) 19.3573 Tj 55 TJm -(.) 2.49065 Tj -[1 0 0 1 72 461.691] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -58673,46 +51848,35 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -451.729] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 439.873 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 440.14 Td +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -[1 0 0 1 131.776 439.873] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -131.776 -439.873] cm -[1 0 0 1 0 0] Tm -0 0 Td -134.224 439.873 Td -/F130_0 9.9626 Tf +134.224 440.14 Td +/F122_0 9.9626 Tf (will) 15.5018 Tj -246 TJm (supply) 26.5703 Tj -[1 0 0 1 181.193 439.873] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -181.193 -439.873] cm -[1 0 0 1 0 0] Tm -0 0 Td -181.193 439.873 Td -/F134_0 9.9626 Tf +181.193 440.14 Td +/F124_0 9.9626 Tf (len) 17.9327 Tj -[1 0 0 1 199.126 439.873] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -199.126 -439.873] cm -[1 0 0 1 0 0] Tm -0 0 Td -201.575 439.873 Td -/F130_0 9.9626 Tf +201.575 440.14 Td +/F122_0 9.9626 Tf (bytes,) 23.5217 Tj -247 TJm (unless) 24.9065 Tj @@ -58725,27 +51889,27 @@ f -246 TJm (end) 14.386 Tj -245 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -246 TJm (detected) 33.1954 Tj -246 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -246 TJm -(an) 9.40469 Tj --246 TJm -(error) 19.3573 Tj +(an) 9.4047 Tj -245 TJm +(error) 19.3573 Tj +-246 TJm (occurs.) 28.493 Tj -617 TJm (Because) 33.1954 Tj -246 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -246 TJm (this,) 16.8866 Tj -247 TJm -(it) 5.53921 Tj -72 427.918 Td -(is) 6.64505 Tj +(it) 5.5392 Tj +72 428.185 Td +(is) 6.6451 Tj -231 TJm (possible) 32.6574 Tj -231 TJm @@ -58769,13 +51933,13 @@ f -231 TJm (number) 30.4357 Tj -231 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -231 TJm (bytes) 21.031 Tj -231 TJm (returned) 33.1954 Tj -231 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -231 TJm (less) 14.9439 Tj -231 TJm @@ -58786,7 +51950,7 @@ f (number) 30.4357 Tj -231 TJm (requested.) 40.6673 Tj -72 415.963 Td +72 416.23 Td (Ne) 11.6164 Tj 25 TJm (v) 4.9813 Tj @@ -58795,15 +51959,15 @@ f -309 TJm (this) 14.396 Tj -297 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -298 TJm -(re) 7.74094 Tj +(re) 7.7409 Tj 15 TJm (g) 4.9813 Tj 5 TJm (arded) 22.1269 Tj -297 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -297 TJm (inadvisable;) 48.1492 Tj -321 TJm @@ -58814,30 +51978,22 @@ f (instead) 28.224 Tj -297 TJm (check) 23.2328 Tj -[1 0 0 1 360.631 415.963] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -360.631 -415.963] cm -[1 0 0 1 0 0] Tm -0 0 Td -360.631 415.963 Td -/F134_0 9.9626 Tf +360.631 416.23 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 402.475 415.963] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -402.475 -415.963] cm -[1 0 0 1 0 0] Tm -0 0 Td -405.437 415.963 Td -/F130_0 9.9626 Tf +405.437 416.23 Td +/F122_0 9.9626 Tf (after) 18.2515 Tj -297 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm @@ -58854,67 +52010,45 @@ f (out) 12.7322 Tj -297 TJm (for) 11.6164 Tj -[1 0 0 1 72 404.008] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -404.008] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 404.008 Td -/F134_0 9.9626 Tf +72 404.275 Td +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 149.709 404.008] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -149.709 -404.008] cm -[1 0 0 1 0 0] Tm -0 0 Td -149.709 404.008 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 402.698] cm +149.709 404.275 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -392.735] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 382.09 Td -/F130_0 9.9626 Tf +72 382.357 Td (Internally) 38.7346 Tj 65 TJm -(,) 2.49065 Tj -[1 0 0 1 117.541 382.09] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -117.541 -382.09] cm -[1 0 0 1 0 0] Tm -0 0 Td -117.541 382.09 Td -/F134_0 9.9626 Tf +117.541 382.357 Td +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -[1 0 0 1 177.317 382.09] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -177.317 -382.09] cm -[1 0 0 1 0 0] Tm -0 0 Td -181.786 382.09 Td -/F130_0 9.9626 Tf +181.786 382.357 Td +/F122_0 9.9626 Tf (copies) 25.4544 Tj -449 TJm (data) 16.5977 Tj @@ -58926,46 +52060,38 @@ f (compressed) 47.0334 Tj -449 TJm (\002le) 12.7322 Tj --448 TJm -(in) 7.7509 Tj -449 TJm +(in) 7.7509 Tj +-448 TJm (chunks) 28.224 Tj -449 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -448 TJm (size) 15.4918 Tj -[1 0 0 1 419.602 382.09] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -419.602 -382.09] cm -[1 0 0 1 0 0] Tm -0 0 Td -419.602 382.09 Td -/F134_0 9.9626 Tf +419.602 382.357 Td +/F124_0 9.9626 Tf (BZ_MAX_UNUSED) 77.7083 Tj -[1 0 0 1 497.31 382.09] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -497.31 -382.09] cm -[1 0 0 1 0 0] Tm -0 0 Td -501.778 382.09 Td -/F130_0 9.9626 Tf +501.778 382.357 Td +/F122_0 9.9626 Tf (bytes) 21.031 Tj -449 TJm (be-) 12.7222 Tj -72 370.135 Td +72 370.402 Td (fore) 16.0398 Tj -414 TJm (decompressing) 59.7656 Tj -414 TJm -(it.) 8.02986 Tj +(it.) 8.0299 Tj -1605 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -415 TJm (the) 12.1743 Tj -414 TJm @@ -58992,27 +52118,19 @@ f (logical) 27.1182 Tj -414 TJm (end-of-stream,) 58.3709 Tj -[1 0 0 1 72 358.18] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -358.18] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 358.18 Td -/F134_0 9.9626 Tf +72 358.446 Td +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -[1 0 0 1 131.776 358.18] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -131.776 -358.18] cm -[1 0 0 1 0 0] Tm -0 0 Td -134.749 358.18 Td -/F130_0 9.9626 Tf +134.749 358.446 Td +/F122_0 9.9626 Tf (will) 15.5018 Tj -298 TJm (almost) 26.5703 Tj @@ -59023,46 +52141,38 @@ f -299 TJm (some) 21.031 Tj -298 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -299 TJm (the) 12.1743 Tj -298 TJm (trailing) 28.782 Tj --298 TJm -(data) 16.5977 Tj -299 TJm +(data) 16.5977 Tj +-298 TJm (before) 25.4445 Tj -298 TJm (signalling) 39.3025 Tj -[1 0 0 1 413.162 358.18] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -413.162 -358.18] cm -[1 0 0 1 0 0] Tm -0 0 Td -413.162 358.18 Td -/F134_0 9.9626 Tf +413.162 358.446 Td +/F124_0 9.9626 Tf (BZ_SEQUENCE_END) 89.6634 Tj -[1 0 0 1 502.826 358.18] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -502.826 -358.18] cm -[1 0 0 1 0 0] Tm -0 0 Td -502.826 358.18 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +502.826 358.446 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj -597 TJm -(T) 6.08715 Tj +(T) 6.0871 Tj 80 TJm (o) 4.9813 Tj -298 TJm (col-) 15.4918 Tj -72 346.224 Td +72 346.491 Td (lect) 14.386 Tj -242 TJm (the) 12.1743 Tj @@ -59078,136 +52188,90 @@ f (data) 16.5977 Tj -242 TJm (once) 18.8094 Tj -[1 0 0 1 208.759 346.224] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -208.759 -346.224] cm -[1 0 0 1 0 0] Tm -0 0 Td -208.759 346.224 Td -/F134_0 9.9626 Tf +208.759 346.491 Td +/F124_0 9.9626 Tf (BZ_SEQUENCE_END) 89.6634 Tj -[1 0 0 1 298.423 346.224] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -298.423 -346.224] cm -[1 0 0 1 0 0] Tm -0 0 Td -300.835 346.224 Td -/F130_0 9.9626 Tf +300.835 346.491 Td +/F122_0 9.9626 Tf (has) 13.2801 Tj -242 TJm (appeared,) 38.4457 Tj -244 TJm (call) 14.386 Tj -[1 0 0 1 374.201 346.224] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -374.201 -346.224] cm -[1 0 0 1 0 0] Tm -0 0 Td -374.201 346.224 Td -/F134_0 9.9626 Tf -(BZ2_bzReadGetUnused) 113.574 Tj -[1 0 0 1 487.775 346.224] cm +374.201 346.491 Td +/F124_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.5736 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -487.775 -346.224] cm -[1 0 0 1 0 0] Tm -0 0 Td -490.188 346.224 Td -/F130_0 9.9626 Tf +490.188 346.491 Td +/F122_0 9.9626 Tf (immediately) 49.813 Tj -72 334.269 Td +72 334.536 Td (before) 25.4445 Tj -[1 0 0 1 99.935 334.269] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -99.935 -334.269] cm -[1 0 0 1 0 0] Tm -0 0 Td -99.935 334.269 Td -/F134_0 9.9626 Tf +99.935 334.536 Td +/F124_0 9.9626 Tf (BZ2_bzReadClose) 89.6634 Tj -[1 0 0 1 189.599 334.269] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -189.599 -334.269] cm -[1 0 0 1 0 0] Tm -0 0 Td -189.599 334.269 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 332.959] cm +189.599 334.536 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -322.996] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 312.351 Td -/F130_0 9.9626 Tf +72 312.618 Td (Possible) 33.2153 Tj -250 TJm (assignments) 48.7072 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 169.144 312.351] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -169.144 -312.351] cm -[1 0 0 1 0 0] Tm -0 0 Td -169.144 312.351 Td -/F134_0 9.9626 Tf +169.144 312.618 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 210.987 312.351] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -210.987 -312.351] cm -[1 0 0 1 0 0] Tm -0 0 Td -210.987 312.351 Td -/F130_0 9.9626 Tf +210.987 312.618 Td +/F122_0 9.9626 Tf (:) 2.7696 Tj -[1 0 0 1 72 310.195] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -259.343] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59232,7 +52296,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59241,12 +52304,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59255,18 +52312,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (20) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59275,7 +52334,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59284,12 +52342,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59298,7 +52354,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 24 24 +%%Page: 21 24 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -59316,20 +52372,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59354,7 +52406,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59363,12 +52414,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59377,36 +52422,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59415,7 +52456,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59424,70 +52464,69 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -284.568] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 456.986] cm 0 0 468 263.014 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 259.427] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -711.631] cm [1 0 0 1 0 0] Tm 0 0 Td 90 711.631 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_PARAM_ERROR) 83.6858 Tj -98.4879 699.676 Td +98.488 699.676 Td (if) 11.9551 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (is) 11.9551 Tj -426 TJm @@ -59505,15 +52544,15 @@ f -426 TJm (len) 17.9327 Tj -426 TJm -(<) 5.97756 Tj +(<) 5.9776 Tj -426 TJm -(0) 5.97756 Tj +(0) 5.9776 Tj 90 687.721 Td -(BZ_SEQUENCE_ERROR) 101.619 Tj -98.4879 675.766 Td +(BZ_SEQUENCE_ERROR) 101.6185 Tj +98.488 675.766 Td (if) 11.9551 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (was) 17.9327 Tj -426 TJm @@ -59524,7 +52563,7 @@ f (BZ2_bzWriteOpen) 89.6634 Tj 90 663.811 Td (BZ_IO_ERROR) 65.7532 Tj -98.4879 651.856 Td +98.488 651.856 Td (if) 11.9551 Tj -426 TJm (there) 29.8878 Tj @@ -59545,8 +52584,8 @@ f -426 TJm (file) 23.9102 Tj 90 639.9 Td -(BZ_UNEXPECTED_EOF) 101.619 Tj -98.4879 627.945 Td +(BZ_UNEXPECTED_EOF) 101.6185 Tj +98.488 627.945 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -59558,7 +52597,7 @@ f (ended) 29.8878 Tj -426 TJm (before) 35.8654 Tj -98.4879 615.99 Td +98.488 615.99 Td (the) 17.9327 Tj -426 TJm (logical) 41.8429 Tj @@ -59570,10 +52609,10 @@ f (detected) 47.8205 Tj 90 604.035 Td (BZ_DATA_ERROR) 77.7083 Tj -98.4879 592.08 Td +98.488 592.08 Td (if) 11.9551 Tj -426 TJm -(a) 5.97756 Tj +(a) 5.9776 Tj -426 TJm (data) 23.9102 Tj -426 TJm @@ -59592,9 +52631,9 @@ f (compressed) 59.7756 Tj -426 TJm (stream) 35.8654 Tj -90 580.125 Td -(BZ_DATA_ERROR_MAGIC) 113.574 Tj -98.4879 568.169 Td +90 580.124 Td +(BZ_DATA_ERROR_MAGIC) 113.5736 Tj +98.488 568.169 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -59616,14 +52655,14 @@ f (header) 35.8654 Tj -426 TJm (bytes) 29.8878 Tj -98.4879 556.214 Td +98.488 556.214 Td (\(ie,) 23.9102 Tj -426 TJm (is) 11.9551 Tj -426 TJm (not) 17.9327 Tj -426 TJm -(a) 5.97756 Tj +(a) 5.9776 Tj -426 TJm (bzip2) 29.8878 Tj -426 TJm @@ -59636,8 +52675,8 @@ f (is) 11.9551 Tj -426 TJm (really) 35.8654 Tj -98.4879 544.259 Td -(a) 5.97756 Tj +98.488 544.259 Td +(a) 5.9776 Tj -426 TJm (special) 41.8429 Tj -426 TJm @@ -59648,7 +52687,7 @@ f (BZ_DATA_ERROR.) 83.6858 Tj 90 532.304 Td (BZ_MEM_ERROR) 71.7307 Tj -98.4879 520.349 Td +98.488 520.349 Td (if) 11.9551 Tj -426 TJm (insufficient) 71.7307 Tj @@ -59658,9 +52697,9 @@ f (was) 17.9327 Tj -426 TJm (available) 53.798 Tj -90 508.394 Td +90 508.393 Td (BZ_STREAM_END) 77.7083 Tj -98.4879 496.438 Td +98.488 496.438 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -59678,14 +52717,8 @@ f (detected.) 53.798 Tj 90 484.483 Td (BZ_OK) 29.8878 Tj -98.4879 472.528 Td +98.488 472.528 Td (otherwise.) 59.7756 Tj -[1 0 0 1 72 456.986] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59694,16 +52727,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -447.024] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 435.068 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Possible) 33.2153 Tj -250 TJm (return) 23.7907 Tj @@ -59711,42 +52744,39 @@ f (v) 4.9813 Tj 25 TJm (alues:) 23.2427 Tj -[1 0 0 1 72 434.969] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -60.7721] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 59.7758 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 374.197] cm +0 0 468 59.776 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 56.1893] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -425.604] cm [1 0 0 1 0 0] Tm 0 0 Td 90 425.604 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (number) 35.8654 Tj -426 TJm (of) 11.9551 Tj @@ -59754,7 +52784,7 @@ f (bytes) 29.8878 Tj -426 TJm (read) 23.9102 Tj -98.4879 413.649 Td +98.488 413.649 Td (if) 11.9551 Tj -426 TJm (bzerror) 41.8429 Tj @@ -59768,14 +52798,8 @@ f (BZ_STREAM_END) 77.7083 Tj 90 401.694 Td (undefined) 53.798 Tj -98.4879 389.739 Td +98.488 389.739 Td (otherwise) 53.798 Tj -[1 0 0 1 72 374.197] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59784,63 +52808,60 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -364.234] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 352.279 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Allo) 17.7135 Tj 25 TJm (w) 7.193 Tj 10 TJm (able) 16.5977 Tj -250 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 15 TJm (xt) 7.7509 Tj -250 TJm (actions:) 30.9936 Tj -[1 0 0 1 72 352.18] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -84.6825] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 83.6862 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 267.497] cm +0 0 468 83.686 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 80.0996] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -342.815] cm [1 0 0 1 0 0] Tm 0 0 Td 90 342.815 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (collect) 41.8429 Tj -426 TJm (data) 23.9102 Tj @@ -59856,7 +52877,7 @@ f (or) 11.9551 Tj -426 TJm (BZ2_bzReadClose) 89.6634 Tj -98.4879 330.859 Td +98.488 330.859 Td (if) 11.9551 Tj -426 TJm (bzerror) 41.8429 Tj @@ -59879,8 +52900,8 @@ f -426 TJm (or) 11.9551 Tj -426 TJm -(BZ2_bzReadGetUnused) 113.574 Tj -98.4879 306.949 Td +(BZ2_bzReadGetUnused) 113.5736 Tj +98.488 306.949 Td (if) 11.9551 Tj -426 TJm (bzerror) 41.8429 Tj @@ -59890,23 +52911,8 @@ f (BZ_SEQUENCE_END) 89.6634 Tj 90 294.994 Td (BZ2_bzReadClose) 89.6634 Tj -98.4879 283.039 Td +98.488 283.039 Td (otherwise) 53.798 Tj -[1 0 0 1 72 267.497] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59931,7 +52937,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59940,29 +52945,25 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -257.534] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 236.876 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.4.3.) 43.0729 Tj -[1 0 0 1 119.858 236.876] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -236.876] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 236.876 Td -/F392_0 17.2154 Tf -(BZ2_bzReadGetUnused) 196.256 Tj -[1 0 0 1 316.114 236.876] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -244.114 -2.3327] cm +-278 TJm +(BZ2_bzReadGetUn) 154.9558 Tj +10 TJm +(used) 40.1807 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -59987,72 +52988,64 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -36.8617] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 35.8655 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 197.948] cm +0 0 468 35.866 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 32.2789] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -225.178] cm [1 0 0 1 0 0] Tm 0 0 Td -90 225.178 Td -/F134_0 9.9626 Tf +90 225.445 Td +/F124_0 9.9626 Tf (void) 23.9102 Tj -426 TJm -(BZ2_bzReadGetUnused\() 119.551 Tj +(BZ2_bzReadGetUnused\() 119.5512 Tj -426 TJm (int) 17.9327 Tj -259.883 223.435 Td -(*) 5.97756 Tj -270.104 225.178 Td +259.883 223.702 Td +(*) 5.9776 Tj +270.104 225.445 Td (bzerror,) 47.8205 Tj -426 TJm (BZFILE) 35.8654 Tj -362.278 223.435 Td -(*) 5.97756 Tj -368.256 225.178 Td +362.278 223.702 Td +(*) 5.9776 Tj +368.256 225.445 Td (b,) 11.9551 Tj -200.343 213.223 Td +200.343 213.49 Td (void) 23.9102 Tj -224.254 211.48 Td +224.254 211.747 Td (**) 11.9551 Tj -240.453 213.223 Td +240.453 213.49 Td (unused,) 41.8429 Tj -426 TJm (int) 17.9327 Tj -304.473 211.48 Td -(*) 5.97756 Tj -314.694 213.223 Td +304.473 211.747 Td +(*) 5.9776 Tj +314.694 213.49 Td (nUnused) 41.8429 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 197.681] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60061,16 +53054,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -187.719] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 175.764 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 176.031 Td +/F122_0 9.9626 Tf (Returns) 30.9936 Tj -435 TJm (data) 16.5977 Tj @@ -60079,7 +53072,7 @@ f -435 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -435 TJm (read) 17.1456 Tj -435 TJm @@ -60097,7 +53090,7 @@ f -435 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -435 TJm (not) 12.7322 Tj -435 TJm @@ -60114,30 +53107,22 @@ f (logical) 27.1182 Tj -435 TJm (end-of-stream.) 58.3709 Tj -[1 0 0 1 72 163.809] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -163.809] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 162.065 Td -/F134_0 9.9626 Tf -(*) 5.97756 Tj -77.9776 163.809 Td +72 162.332 Td +/F124_0 9.9626 Tf +(*) 5.9776 Tj +77.978 164.075 Td (unused) 35.8654 Tj -[1 0 0 1 113.843 163.809] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -113.843 -163.809] cm -[1 0 0 1 0 0] Tm -0 0 Td -117.2 163.809 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +117.2 164.075 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -337 TJm (set) 11.0684 Tj -337 TJm @@ -60147,146 +53132,108 @@ f -337 TJm (address) 29.8778 Tj -337 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -336 TJm (the) 12.1743 Tj -337 TJm (data,) 19.0883 Tj -359 TJm (and) 14.386 Tj -[1 0 0 1 269.089 163.809] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -269.089 -163.809] cm -[1 0 0 1 0 0] Tm -0 0 Td -269.089 162.065 Td -/F134_0 9.9626 Tf -(*) 5.97756 Tj -275.067 163.809 Td +269.089 162.332 Td +/F124_0 9.9626 Tf +(*) 5.9776 Tj +275.067 164.075 Td (nUnused) 41.8429 Tj -[1 0 0 1 316.91 163.809] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -316.91 -163.809] cm -[1 0 0 1 0 0] Tm -0 0 Td -320.267 163.809 Td -/F130_0 9.9626 Tf +320.267 164.075 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj -337 TJm (the) 12.1743 Tj -337 TJm (number) 30.4357 Tj -337 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -337 TJm (bytes.) 23.5217 Tj -[1 0 0 1 427.247 163.809] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -427.247 -163.809] cm -[1 0 0 1 0 0] Tm -0 0 Td -427.247 162.065 Td -/F134_0 9.9626 Tf -(*) 5.97756 Tj -433.225 163.809 Td +427.247 162.332 Td +/F124_0 9.9626 Tf +(*) 5.9776 Tj +433.225 164.075 Td (nUnused) 41.8429 Tj -[1 0 0 1 475.068 163.809] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -475.068 -163.809] cm -[1 0 0 1 0 0] Tm -0 0 Td -478.425 163.809 Td -/F130_0 9.9626 Tf +478.425 164.075 Td +/F122_0 9.9626 Tf (will) 15.5018 Tj -337 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -337 TJm (set) 11.0684 Tj -337 TJm (to) 7.7509 Tj -337 TJm -(a) 4.42339 Tj -72 151.853 Td +(a) 4.4234 Tj +72 152.12 Td (v) 4.9813 Tj 25 TJm (alue) 16.5977 Tj -250 TJm (between) 33.1954 Tj -[1 0 0 1 131.506 151.853] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -131.506 -151.853] cm -[1 0 0 1 0 0] Tm -0 0 Td -131.506 151.853 Td -/F134_0 9.9626 Tf -(0) 5.97756 Tj -[1 0 0 1 137.484 151.853] cm +131.506 152.12 Td +/F124_0 9.9626 Tf +(0) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -137.484 -151.853] cm -[1 0 0 1 0 0] Tm -0 0 Td -139.975 151.853 Td -/F130_0 9.9626 Tf +139.975 152.12 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 156.851 151.853] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -156.851 -151.853] cm -[1 0 0 1 0 0] Tm -0 0 Td -156.851 151.853 Td -/F134_0 9.9626 Tf +156.851 152.12 Td +/F124_0 9.9626 Tf (BZ_MAX_UNUSED) 77.7083 Tj -[1 0 0 1 234.56 151.853] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -234.56 -151.853] cm -[1 0 0 1 0 0] Tm -0 0 Td -237.05 151.853 Td -/F130_0 9.9626 Tf +237.05 152.12 Td +/F122_0 9.9626 Tf (inclusi) 26.5703 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(e.) 6.91404 Tj -[1 0 0 1 72 150.543] cm +(e.) 6.914 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -140.581] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 129.935 Td -/F130_0 9.9626 Tf +72 130.202 Td (This) 17.7135 Tj -882 TJm (function) 33.2053 Tj @@ -60295,141 +53242,95 @@ f -882 TJm (only) 17.7135 Tj -883 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -882 TJm (called) 23.7907 Tj -883 TJm (once) 18.8094 Tj -[1 0 0 1 271.332 129.935] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -271.332 -129.935] cm -[1 0 0 1 0 0] Tm -0 0 Td -271.332 129.935 Td -/F134_0 9.9626 Tf +271.332 130.202 Td +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -[1 0 0 1 331.108 129.935] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -331.108 -129.935] cm -[1 0 0 1 0 0] Tm -0 0 Td -339.9 129.935 Td -/F130_0 9.9626 Tf +339.9 130.202 Td +/F122_0 9.9626 Tf (has) 13.2801 Tj -882 TJm (signalled) 35.9749 Tj -[1 0 0 1 406.737 129.935] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -406.737 -129.935] cm -[1 0 0 1 0 0] Tm -0 0 Td -406.737 129.935 Td -/F134_0 9.9626 Tf +406.737 130.202 Td +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 484.446 129.935] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -484.446 -129.935] cm -[1 0 0 1 0 0] Tm -0 0 Td -493.231 129.935 Td -/F130_0 9.9626 Tf +493.231 130.202 Td +/F122_0 9.9626 Tf (b) 4.9813 Tj 20 TJm (ut) 7.7509 Tj -882 TJm (before) 25.4445 Tj -[1 0 0 1 72 117.98] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -117.98] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 117.98 Td -/F134_0 9.9626 Tf +72 118.247 Td +/F124_0 9.9626 Tf (BZ2_bzReadClose) 89.6634 Tj -[1 0 0 1 161.664 117.98] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -161.664 -117.98] cm -[1 0 0 1 0 0] Tm -0 0 Td -161.664 117.98 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 116.67] cm +161.664 118.247 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -106.708] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 96.0625 Td -/F130_0 9.9626 Tf +72 96.329 Td (Possible) 33.2153 Tj -250 TJm (assignments) 48.7072 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 169.144 96.0625] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -169.144 -96.0625] cm -[1 0 0 1 0 0] Tm -0 0 Td -169.144 96.0625 Td -/F134_0 9.9626 Tf +169.144 96.329 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 210.987 96.0625] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -210.987 -96.0625] cm -[1 0 0 1 0 0] Tm -0 0 Td -210.987 96.0625 Td -/F130_0 9.9626 Tf +210.987 96.329 Td +/F122_0 9.9626 Tf (:) 2.7696 Tj -[1 0 0 1 72 93.9057] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -43.0539] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60454,7 +53355,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60463,12 +53363,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60477,18 +53371,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.8518] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.8518 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.852 Td (21) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60497,7 +53393,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60506,12 +53401,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60520,7 +53413,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 25 25 +%%Page: 22 25 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -60538,20 +53431,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60576,7 +53465,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60585,12 +53473,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60599,36 +53481,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60637,7 +53515,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60646,75 +53523,74 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -129.151] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 612.403] cm 0 0 468 107.597 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 104.01] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -711.631] cm [1 0 0 1 0 0] Tm 0 0 Td 90 711.631 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_PARAM_ERROR) 83.6858 Tj -98.4879 699.676 Td +98.488 699.676 Td (if) 11.9551 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (is) 11.9551 Tj -426 TJm (NULL) 23.9102 Tj -98.4879 687.721 Td +98.488 687.721 Td (or) 11.9551 Tj -426 TJm (unused) 35.8654 Tj @@ -60731,8 +53607,8 @@ f -426 TJm (NULL) 23.9102 Tj 90 675.766 Td -(BZ_SEQUENCE_ERROR) 101.619 Tj -98.4879 663.811 Td +(BZ_SEQUENCE_ERROR) 101.6185 Tj +98.488 663.811 Td (if) 11.9551 Tj -426 TJm (BZ_STREAM_END) 77.7083 Tj @@ -60744,12 +53620,12 @@ f (been) 23.9102 Tj -426 TJm (signalled) 53.798 Tj -98.4879 651.856 Td +98.488 651.856 Td (or) 11.9551 Tj -426 TJm (if) 11.9551 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (was) 17.9327 Tj -426 TJm @@ -60760,14 +53636,8 @@ f (BZ2_bzWriteOpen) 89.6634 Tj 90 639.9 Td (BZ_OK) 29.8878 Tj -98.4879 627.945 Td +98.488 627.945 Td (otherwise) 53.798 Tj -[1 0 0 1 72 612.404] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60776,79 +53646,61 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -602.441] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 590.486 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Allo) 17.7135 Tj 25 TJm (w) 7.193 Tj 10 TJm (able) 16.5977 Tj -250 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 15 TJm (xt) 7.7509 Tj -250 TJm (actions:) 30.9936 Tj -[1 0 0 1 72 590.386] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 565.48] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3238] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -581.021] cm [1 0 0 1 0 0] Tm 0 0 Td 90 581.021 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzReadClose) 89.6634 Tj -[1 0 0 1 72 565.48] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60873,7 +53725,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60882,29 +53733,23 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -555.517] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 534.858 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.4.4.) 43.0729 Tj -[1 0 0 1 119.858 534.858] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -534.858] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 534.858 Td -/F392_0 17.2154 Tf -(BZ2_bzReadClose) 154.939 Tj -[1 0 0 1 274.797 534.858] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -202.797 -2.3327] cm +-278 TJm +(BZ2_bzReadClose) 150.1871 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60929,62 +53774,54 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 507.886] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3685] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -523.161] cm [1 0 0 1 0 0] Tm 0 0 Td -90 523.161 Td -/F134_0 9.9626 Tf +90 523.428 Td +/F124_0 9.9626 Tf (void) 23.9102 Tj -426 TJm (BZ2_bzReadClose) 89.6634 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (int) 17.9327 Tj -244.46 521.417 Td -(*) 5.97756 Tj -250.438 523.161 Td +244.46 521.684 Td +(*) 5.9776 Tj +250.438 523.428 Td (bzerror,) 47.8205 Tj -426 TJm (BZFILE) 35.8654 Tj -342.612 521.417 Td -(*) 5.97756 Tj -348.59 523.161 Td -(b) 5.97756 Tj +342.612 521.684 Td +(*) 5.9776 Tj +348.59 523.428 Td +(b) 5.9776 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 507.619] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -60993,16 +53830,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -497.656] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 485.701 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 485.968 Td +/F122_0 9.9626 Tf (Releases) 34.8591 Tj -430 TJm (all) 9.9626 Tj @@ -61018,86 +53855,62 @@ f (compressed) 47.0334 Tj -430 TJm (\002le) 12.7322 Tj -[1 0 0 1 304.352 485.701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -304.352 -485.701] cm -[1 0 0 1 0 0] Tm -0 0 Td -304.352 485.701 Td -/F134_0 9.9626 Tf -(b) 5.97756 Tj -[1 0 0 1 310.33 485.701] cm +304.352 485.968 Td +/F124_0 9.9626 Tf +(b) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -310.33 -485.701] cm -[1 0 0 1 0 0] Tm -0 0 Td -310.33 485.701 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 321.276 485.701] cm +310.33 485.968 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -321.276 -485.701] cm -[1 0 0 1 0 0] Tm -0 0 Td -321.276 485.701 Td -/F134_0 9.9626 Tf +321.276 485.968 Td +/F124_0 9.9626 Tf (BZ2_bzReadClose) 89.6634 Tj -[1 0 0 1 410.94 485.701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -410.94 -485.701] cm -[1 0 0 1 0 0] Tm -0 0 Td -415.22 485.701 Td -/F130_0 9.9626 Tf +415.22 485.968 Td +/F122_0 9.9626 Tf (does) 18.2614 Tj -430 TJm (not) 12.7322 Tj -429 TJm (call) 14.386 Tj -[1 0 0 1 473.438 485.701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -473.438 -485.701] cm -[1 0 0 1 0 0] Tm -0 0 Td -473.438 485.701 Td -/F134_0 9.9626 Tf +473.438 485.968 Td +/F124_0 9.9626 Tf (fclose) 35.8654 Tj -[1 0 0 1 509.304 485.701] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -509.304 -485.701] cm -[1 0 0 1 0 0] Tm -0 0 Td -513.584 485.701 Td -/F130_0 9.9626 Tf +513.583 485.968 Td +/F122_0 9.9626 Tf (on) 9.9626 Tj -430 TJm (the) 12.1743 Tj -72 473.746 Td +72 474.013 Td (underlying) 43.1679 Tj -264 TJm (\002le) 12.7322 Tj -264 TJm (handle,) 29.0509 Tj -267 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -264 TJm (you) 14.9439 Tj -264 TJm @@ -61109,40 +53922,32 @@ f -264 TJm (yourself) 32.6474 Tj -264 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -263 TJm (appropriate.) 47.8603 Tj -[1 0 0 1 348.653 473.746] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -348.653 -473.746] cm -[1 0 0 1 0 0] Tm -0 0 Td -348.653 473.746 Td -/F134_0 9.9626 Tf +348.653 474.013 Td +/F124_0 9.9626 Tf (BZ2_bzReadClose) 89.6634 Tj -[1 0 0 1 438.317 473.746] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -438.317 -473.746] cm -[1 0 0 1 0 0] Tm -0 0 Td -440.946 473.746 Td -/F130_0 9.9626 Tf +440.946 474.013 Td +/F122_0 9.9626 Tf (should) 26.5703 Tj -264 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -264 TJm (called) 23.7907 Tj -264 TJm (to) 7.7509 Tj -264 TJm (clean) 21.0211 Tj -72 461.791 Td +72 462.058 Td (up) 9.9626 Tj -250 TJm (after) 18.2515 Tj @@ -61152,89 +53957,72 @@ f (error) 19.3573 Tj -250 TJm (situations.) 40.6873 Tj -[1 0 0 1 72 459.634] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -449.671] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 439.873 Td -/F130_0 9.9626 Tf +72 440.14 Td (Possible) 33.2153 Tj -250 TJm (assignments) 48.7072 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 169.144 439.873] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -169.144 -439.873] cm -[1 0 0 1 0 0] Tm -0 0 Td -169.144 439.873 Td -/F134_0 9.9626 Tf +169.144 440.14 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 210.987 439.873] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -210.987 -439.873] cm -[1 0 0 1 0 0] Tm -0 0 Td -210.987 439.873 Td -/F130_0 9.9626 Tf +210.987 440.14 Td +/F122_0 9.9626 Tf (:) 2.7696 Tj -[1 0 0 1 72 437.716] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -60.7721] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 59.7758 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 377.211] cm +0 0 468 59.776 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 56.1893] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -428.351] cm [1 0 0 1 0 0] Tm 0 0 Td -90 428.351 Td -/F134_0 9.9626 Tf -(BZ_SEQUENCE_ERROR) 101.619 Tj -98.4879 416.396 Td +90 428.618 Td +/F124_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.6185 Tj +98.488 416.663 Td (if) 11.9551 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (was) 17.9327 Tj -426 TJm @@ -61243,16 +54031,10 @@ f (with) 23.9102 Tj -426 TJm (BZ2_bzOpenWrite) 89.6634 Tj -90 404.441 Td +90 404.708 Td (BZ_OK) 29.8878 Tj -98.4879 392.486 Td +98.488 392.753 Td (otherwise) 53.798 Tj -[1 0 0 1 72 376.944] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -61261,79 +54043,61 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -366.982] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 355.026 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 355.293 Td +/F122_0 9.9626 Tf (Allo) 17.7135 Tj 25 TJm (w) 7.193 Tj 10 TJm (able) 16.5977 Tj -250 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 15 TJm (xt) 7.7509 Tj -250 TJm (actions:) 30.9936 Tj -[1 0 0 1 72 354.927] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 330.287] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -345.562] cm [1 0 0 1 0 0] Tm 0 0 Td -90 345.562 Td -/F134_0 9.9626 Tf +90 345.829 Td +/F124_0 9.9626 Tf (none) 23.9102 Tj -[1 0 0 1 72 330.02] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -61358,7 +54122,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -61367,29 +54130,23 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -320.058] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 299.399 Td -/F122_0 17.2154 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 299.666 Td +/F116_0 17.2154 Tf (3.4.5.) 43.0729 Tj -[1 0 0 1 119.858 299.399] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -299.399] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 299.399 Td -/F392_0 17.2154 Tf -(BZ2_bzWriteOpen) 154.939 Tj -[1 0 0 1 274.797 299.399] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -202.797 -2.3327] cm +-278 TJm +(BZ2_bzWriteOpen) 148.259 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -61414,55 +54171,53 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -48.8169] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 47.8207 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 247.286] cm +0 0 468 47.821 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 44.2341] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -287.702] cm [1 0 0 1 0 0] Tm 0 0 Td -90 287.702 Td -/F134_0 9.9626 Tf +90 286.738 Td +/F124_0 9.9626 Tf (BZFILE) 35.8654 Tj -130.109 285.958 Td -(*) 5.97756 Tj -136.087 287.702 Td +130.109 284.994 Td +(*) 5.9776 Tj +136.087 286.738 Td (BZ2_bzWriteOpen\() 95.641 Tj -426 TJm (int) 17.9327 Tj -258.149 285.958 Td -(*) 5.97756 Tj -264.127 287.702 Td +258.149 284.994 Td +(*) 5.9776 Tj +264.127 286.738 Td (bzerror,) 47.8205 Tj -426 TJm (FILE) 23.9102 Tj -344.346 285.958 Td -(*) 5.97756 Tj -350.323 287.702 Td +344.346 284.994 Td +(*) 5.9776 Tj +350.323 286.738 Td (f,) 11.9551 Tj -196.099 275.746 Td +196.099 274.783 Td (int) 17.9327 Tj -426 TJm (blockSize100k,) 83.6858 Tj @@ -61470,18 +54225,12 @@ f (int) 17.9327 Tj -426 TJm (verbosity,) 59.7756 Tj -196.099 263.791 Td +196.099 262.827 Td (int) 17.9327 Tj -426 TJm (workFactor) 59.7756 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 248.249] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -61490,16 +54239,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -238.287] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 226.332 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 225.368 Td +/F122_0 9.9626 Tf (Prepare) 30.4258 Tj -268 TJm (to) 7.7509 Tj @@ -61515,56 +54264,40 @@ f (\002le) 12.7322 Tj -268 TJm (handle) 26.5603 Tj -[1 0 0 1 262.72 226.332] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -262.72 -226.332] cm -[1 0 0 1 0 0] Tm -0 0 Td -262.72 226.332 Td -/F134_0 9.9626 Tf -(f) 5.97756 Tj -[1 0 0 1 268.698 226.332] cm +262.72 225.368 Td +/F124_0 9.9626 Tf +(f) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -268.698 -226.332] cm -[1 0 0 1 0 0] Tm -0 0 Td -268.698 226.332 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 274.829 226.332] cm +268.698 225.368 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -274.829 -226.332] cm -[1 0 0 1 0 0] Tm -0 0 Td -274.829 226.332 Td -/F134_0 9.9626 Tf -(f) 5.97756 Tj -[1 0 0 1 280.807 226.332] cm +274.829 225.368 Td +/F124_0 9.9626 Tf +(f) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -280.807 -226.332] cm -[1 0 0 1 0 0] Tm -0 0 Td -283.481 226.332 Td -/F130_0 9.9626 Tf +283.481 225.368 Td +/F122_0 9.9626 Tf (should) 26.5703 Tj -268 TJm (refer) 18.7994 Tj -269 TJm (to) 7.7509 Tj -268 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -269 TJm (\002le) 12.7322 Tj -268 TJm @@ -61583,7 +54316,7 @@ f (and) 14.386 Tj -268 TJm (for) 11.6164 Tj -72 214.377 Td +72 213.413 Td (which) 24.3486 Tj -250 TJm (the) 12.1743 Tj @@ -61592,171 +54325,119 @@ f -250 TJm (indicator) 35.417 Tj -250 TJm -(\() 3.31755 Tj -[1 0 0 1 176.577 214.376] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -176.577 -214.376] cm -[1 0 0 1 0 0] Tm -0 0 Td -176.577 214.376 Td -/F134_0 9.9626 Tf +176.577 213.413 Td +/F124_0 9.9626 Tf (ferror\(f\)) 53.798 Tj -[1 0 0 1 230.375 214.376] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -230.375 -214.376] cm -[1 0 0 1 0 0] Tm -0 0 Td -230.375 214.376 Td -/F130_0 9.9626 Tf +230.375 213.413 Td +/F122_0 9.9626 Tf (\)is) 9.9626 Tj -250 TJm (not) 12.7322 Tj -250 TJm (set.) 13.5591 Tj -[1 0 0 1 72 212.593] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -202.631] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 192.459 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +72 191.495 Td +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -223 TJm (the) 12.1743 Tj -224 TJm (meaning) 34.3112 Tj -223 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -224 TJm (parameters) 43.7059 Tj -[1 0 0 1 195.306 192.459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -195.306 -192.459] cm -[1 0 0 1 0 0] Tm -0 0 Td -195.306 192.459 Td -/F134_0 9.9626 Tf +195.306 191.495 Td +/F124_0 9.9626 Tf (blockSize100k) 77.7083 Tj -[1 0 0 1 273.015 192.459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -273.015 -192.459] cm -[1 0 0 1 0 0] Tm -0 0 Td -273.015 192.459 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 277.784 192.459] cm +273.015 191.495 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -277.784 -192.459] cm -[1 0 0 1 0 0] Tm -0 0 Td -277.784 192.459 Td -/F134_0 9.9626 Tf +277.784 191.495 Td +/F124_0 9.9626 Tf (verbosity) 53.798 Tj -[1 0 0 1 331.583 192.459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -331.583 -192.459] cm -[1 0 0 1 0 0] Tm -0 0 Td -333.808 192.459 Td -/F130_0 9.9626 Tf +333.808 191.495 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 350.42 192.459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -350.42 -192.459] cm -[1 0 0 1 0 0] Tm -0 0 Td -350.42 192.459 Td -/F134_0 9.9626 Tf +350.42 191.495 Td +/F124_0 9.9626 Tf (workFactor) 59.7756 Tj -[1 0 0 1 410.196 192.459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -410.196 -192.459] cm -[1 0 0 1 0 0] Tm -0 0 Td -410.196 192.459 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +410.196 191.495 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj -229 TJm (see) 12.7222 Tj -[1 0 0 1 429.913 192.459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -429.913 -192.459] cm -[1 0 0 1 0 0] Tm -0 0 Td -429.913 192.459 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 537.509 192.459] cm +429.913 191.495 Td +/F124_0 9.9626 Tf +(BZ2_bzCompressInit) 107.5961 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -537.509 -192.459] cm -[1 0 0 1 0 0] Tm -0 0 Td -537.509 192.459 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 190.302] cm +537.509 191.495 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -180.339] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 170.541 Td -/F130_0 9.9626 Tf +72 169.577 Td (All) 12.7322 Tj -382 TJm (required) 33.1954 Tj -382 TJm (memory) 33.2053 Tj -382 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -382 TJm (allocated) 35.965 Tj -383 TJm @@ -61766,9 +54447,9 @@ f -382 TJm (stage,) 22.9638 Tj -415 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -382 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -382 TJm (the) 12.1743 Tj -382 TJm @@ -61778,123 +54459,85 @@ f -382 TJm (successfully) 48.6972 Tj 65 TJm -(,) 2.49065 Tj -[1 0 0 1 424.691 170.541] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -424.691 -170.541] cm -[1 0 0 1 0 0] Tm -0 0 Td -424.691 170.541 Td -/F134_0 9.9626 Tf +424.691 169.577 Td +/F124_0 9.9626 Tf (BZ_MEM_ERROR) 71.7307 Tj -[1 0 0 1 496.422 170.541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.422 -170.541] cm -[1 0 0 1 0 0] Tm -0 0 Td -500.228 170.541 Td -/F130_0 9.9626 Tf +500.228 169.577 Td +/F122_0 9.9626 Tf (cannot) 26.5603 Tj -382 TJm -(be) 9.40469 Tj -72 158.586 Td +(be) 9.4047 Tj +72 157.622 Td (signalled) 35.9749 Tj -250 TJm (by) 9.9626 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (subsequent) 44.2738 Tj -250 TJm (call) 14.386 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 203.715 158.586] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -203.715 -158.586] cm -[1 0 0 1 0 0] Tm -0 0 Td -203.715 158.586 Td -/F134_0 9.9626 Tf +203.715 157.622 Td +/F124_0 9.9626 Tf (BZ2_bzWrite) 65.7532 Tj -[1 0 0 1 269.468 158.586] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -269.468 -158.586] cm -[1 0 0 1 0 0] Tm -0 0 Td -269.468 158.586 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 156.429] cm +269.468 157.622 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -146.466] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 136.668 Td -/F130_0 9.9626 Tf +72 135.704 Td (Possible) 33.2153 Tj -250 TJm (assignments) 48.7072 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 169.144 136.668] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -169.144 -136.668] cm -[1 0 0 1 0 0] Tm -0 0 Td -169.144 136.668 Td -/F134_0 9.9626 Tf +169.144 135.704 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 210.987 136.668] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -210.987 -136.668] cm -[1 0 0 1 0 0] Tm -0 0 Td -210.987 136.668 Td -/F130_0 9.9626 Tf +210.987 135.704 Td +/F122_0 9.9626 Tf (:) 2.7696 Tj -[1 0 0 1 72 134.511] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -83.6593] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -61919,7 +54562,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -61928,12 +54570,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -61942,18 +54578,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.8518] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.8518 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.852 Td (22) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -61962,7 +54600,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -61971,12 +54608,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -61985,7 +54620,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 26 26 +%%Page: 23 26 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -62003,20 +54638,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62041,7 +54672,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62050,12 +54680,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62064,36 +54688,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62102,7 +54722,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62111,67 +54730,66 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -165.016] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 576.538] cm 0 0 468 143.462 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 139.875] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -711.631] cm [1 0 0 1 0 0] Tm 0 0 Td 90 711.631 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_CONFIG_ERROR) 89.6634 Tj -98.4879 699.676 Td +98.488 699.676 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -62185,33 +54803,33 @@ f (mis-compiled) 71.7307 Tj 90 687.721 Td (BZ_PARAM_ERROR) 83.6858 Tj -98.4879 675.766 Td +98.488 675.766 Td (if) 11.9551 Tj -426 TJm -(f) 5.97756 Tj +(f) 5.9776 Tj -426 TJm (is) 11.9551 Tj -426 TJm (NULL) 23.9102 Tj -98.4879 663.811 Td +98.488 663.811 Td (or) 11.9551 Tj -426 TJm (blockSize100k) 77.7083 Tj -426 TJm -(<) 5.97756 Tj +(<) 5.9776 Tj -426 TJm -(1) 5.97756 Tj +(1) 5.9776 Tj -426 TJm (or) 11.9551 Tj -426 TJm (blockSize100k) 77.7083 Tj -426 TJm -(>) 5.97756 Tj +(>) 5.9776 Tj -426 TJm -(9) 5.97756 Tj +(9) 5.9776 Tj 90 651.856 Td (BZ_IO_ERROR) 65.7532 Tj -98.4879 639.9 Td +98.488 639.9 Td (if) 11.9551 Tj -426 TJm (ferror\(f\)) 53.798 Tj @@ -62221,7 +54839,7 @@ f (nonzero) 41.8429 Tj 90 627.945 Td (BZ_MEM_ERROR) 71.7307 Tj -98.4879 615.99 Td +98.488 615.99 Td (if) 11.9551 Tj -426 TJm (insufficient) 71.7307 Tj @@ -62233,14 +54851,8 @@ f (available) 53.798 Tj 90 604.035 Td (BZ_OK) 29.8878 Tj -98.4879 592.08 Td +98.488 592.08 Td (otherwise) 53.798 Tj -[1 0 0 1 72 576.538] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62249,16 +54861,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -566.575] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 554.62 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Possible) 33.2153 Tj -250 TJm (return) 23.7907 Tj @@ -62266,42 +54878,39 @@ f (v) 4.9813 Tj 25 TJm (alues:) 23.2427 Tj -[1 0 0 1 72 554.521] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -60.7721] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 59.7758 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 493.749] cm +0 0 468 59.776 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 56.1892] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -545.156] cm [1 0 0 1 0 0] Tm 0 0 Td 90 545.156 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (Pointer) 41.8429 Tj -426 TJm (to) 11.9551 Tj @@ -62311,7 +54920,7 @@ f (abstract) 47.8205 Tj -426 TJm (BZFILE) 35.8654 Tj -98.4879 533.201 Td +98.488 533.201 Td (if) 11.9551 Tj -426 TJm (bzerror) 41.8429 Tj @@ -62321,14 +54930,8 @@ f (BZ_OK) 29.8878 Tj 90 521.245 Td (NULL) 23.9102 Tj -98.4879 509.29 Td +98.488 509.29 Td (otherwise) 53.798 Tj -[1 0 0 1 72 493.748] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62337,65 +54940,62 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -483.786] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 471.831 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Allo) 17.7135 Tj 25 TJm (w) 7.193 Tj 10 TJm (able) 16.5977 Tj -250 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 15 TJm (xt) 7.7509 Tj -250 TJm (actions:) 30.9936 Tj -[1 0 0 1 72 471.731] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -84.6825] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 83.6862 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 387.049] cm +0 0 468 83.686 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 80.0996] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -462.366] cm [1 0 0 1 0 0] Tm 0 0 Td 90 462.366 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzWrite) 65.7532 Tj -98.4879 450.411 Td +98.488 450.411 Td (if) 11.9551 Tj -426 TJm (bzerror) 41.8429 Tj @@ -62403,7 +55003,7 @@ f (is) 11.9551 Tj -426 TJm (BZ_OK) 29.8878 Tj -98.4879 438.456 Td +98.488 438.456 Td (\(you) 23.9102 Tj -426 TJm (could) 29.8878 Tj @@ -62414,7 +55014,7 @@ f -426 TJm (to) 11.9551 Tj -426 TJm -(BZ2_bzWriteClose,) 101.619 Tj +(BZ2_bzWriteClose,) 101.6185 Tj -426 TJm (but) 17.9327 Tj -426 TJm @@ -62425,34 +55025,19 @@ f (be) 11.9551 Tj -426 TJm (pretty) 35.8654 Tj -485.505 434.212 Td -/F564_0 9.9626 Tf +485.506 434.212 Td +/F548_0 9.9626 Tf ( ) 9.9626 Tj 493.808 434.212 Td -/F147_0 9.9626 Tf -(-) 2.7696 Tj +/F230_0 9.9626 Tf +(-) 2.7676 Tj 90 426.501 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (pointless\)) 59.7756 Tj 90 414.546 Td (BZ2_bzWriteClose) 95.641 Tj -98.4879 402.59 Td +98.488 402.59 Td (otherwise) 53.798 Tj -[1 0 0 1 72 387.049] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62477,7 +55062,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62486,29 +55070,23 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -377.086] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 356.428 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.4.6.) 43.0729 Tj -[1 0 0 1 119.858 356.428] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -356.428] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 356.428 Td -/F392_0 17.2154 Tf -(BZ2_bzWrite) 113.622 Tj -[1 0 0 1 233.48 356.428] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -161.48 -2.3327] cm +-278 TJm +(BZ2_bzWrite) 104.2565 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62533,59 +55111,57 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 329.455] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3685] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -344.73] cm [1 0 0 1 0 0] Tm 0 0 Td -90 344.73 Td -/F134_0 9.9626 Tf +90 344.997 Td +/F124_0 9.9626 Tf (void) 23.9102 Tj -426 TJm (BZ2_bzWrite) 65.7532 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (int) 17.9327 Tj -220.55 342.987 Td -(*) 5.97756 Tj -226.528 344.73 Td +220.55 343.254 Td +(*) 5.9776 Tj +226.528 344.997 Td (bzerror,) 47.8205 Tj -426 TJm (BZFILE) 35.8654 Tj -318.702 342.987 Td -(*) 5.97756 Tj -324.679 344.73 Td +318.702 343.254 Td +(*) 5.9776 Tj +324.679 344.997 Td (b,) 11.9551 Tj -426 TJm (void) 23.9102 Tj -369.033 342.987 Td -(*) 5.97756 Tj -375.01 344.73 Td +369.033 343.254 Td +(*) 5.9776 Tj +375.01 344.997 Td (buf,) 23.9102 Tj -426 TJm (int) 17.9327 Tj @@ -62593,12 +55169,6 @@ f (len) 17.9327 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 329.188] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62607,38 +55177,30 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -319.226] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 307.27 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 307.537 Td +/F122_0 9.9626 Tf (Absorbs) 33.2053 Tj -[1 0 0 1 107.696 307.27] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -107.696 -307.27] cm -[1 0 0 1 0 0] Tm -0 0 Td -107.696 307.27 Td -/F134_0 9.9626 Tf +107.696 307.537 Td +/F124_0 9.9626 Tf (len) 17.9327 Tj -[1 0 0 1 125.629 307.27] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -125.629 -307.27] cm -[1 0 0 1 0 0] Tm -0 0 Td -128.119 307.27 Td -/F130_0 9.9626 Tf +128.119 307.537 Td +/F122_0 9.9626 Tf (bytes) 21.031 Tj -250 TJm (from) 19.3673 Tj @@ -62647,33 +55209,25 @@ f -250 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -[1 0 0 1 214.544 307.27] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -214.544 -307.27] cm -[1 0 0 1 0 0] Tm -0 0 Td -214.544 307.27 Td -/F134_0 9.9626 Tf +214.544 307.537 Td +/F124_0 9.9626 Tf (buf) 17.9327 Tj -[1 0 0 1 232.477 307.27] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -232.477 -307.27] cm -[1 0 0 1 0 0] Tm -0 0 Td -232.477 307.27 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +232.477 307.537 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj -250 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm @@ -62681,7 +55235,7 @@ f -250 TJm (to) 7.7509 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (compressed) 47.0334 Tj -250 TJm @@ -62694,89 +55248,72 @@ f (the) 12.1743 Tj -250 TJm (\002le.) 15.2229 Tj -[1 0 0 1 72 305.114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -295.151] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 285.353 Td -/F130_0 9.9626 Tf +72 285.62 Td (Possible) 33.2153 Tj -250 TJm (assignments) 48.7072 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 169.144 285.353] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -169.144 -285.353] cm -[1 0 0 1 0 0] Tm -0 0 Td -169.144 285.353 Td -/F134_0 9.9626 Tf +169.144 285.62 Td +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 210.987 285.353] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -210.987 -285.353] cm -[1 0 0 1 0 0] Tm -0 0 Td -210.987 285.353 Td -/F130_0 9.9626 Tf +210.987 285.62 Td +/F122_0 9.9626 Tf (:) 2.7696 Tj -[1 0 0 1 72 283.196] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -108.593] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 174.87] cm 0 0 468 107.597 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 104.01] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -273.831] cm [1 0 0 1 0 0] Tm 0 0 Td -90 273.831 Td -/F134_0 9.9626 Tf +90 274.098 Td +/F124_0 9.9626 Tf (BZ_PARAM_ERROR) 83.6858 Tj -98.4879 261.876 Td +98.488 262.143 Td (if) 11.9551 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (is) 11.9551 Tj -426 TJm @@ -62794,15 +55331,15 @@ f -426 TJm (len) 17.9327 Tj -426 TJm -(<) 5.97756 Tj +(<) 5.9776 Tj -426 TJm -(0) 5.97756 Tj -90 249.921 Td -(BZ_SEQUENCE_ERROR) 101.619 Tj -98.4879 237.965 Td +(0) 5.9776 Tj +90 250.188 Td +(BZ_SEQUENCE_ERROR) 101.6185 Tj +98.488 238.232 Td (if) 11.9551 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (was) 17.9327 Tj -426 TJm @@ -62811,9 +55348,9 @@ f (with) 23.9102 Tj -426 TJm (BZ2_bzReadOpen) 83.6858 Tj -90 226.01 Td +90 226.277 Td (BZ_IO_ERROR) 65.7532 Tj -98.4879 214.055 Td +98.488 214.322 Td (if) 11.9551 Tj -426 TJm (there) 29.8878 Tj @@ -62831,25 +55368,10 @@ f (compressed) 59.7756 Tj -426 TJm (file.) 29.8878 Tj -90 202.1 Td +90 202.367 Td (BZ_OK) 29.8878 Tj -98.4879 190.145 Td +98.488 190.412 Td (otherwise) 53.798 Tj -[1 0 0 1 72 174.603] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62874,7 +55396,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62883,29 +55404,23 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -164.64] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 143.982 Td -/F122_0 17.2154 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 144.249 Td +/F116_0 17.2154 Tf (3.4.7.) 43.0729 Tj -[1 0 0 1 119.858 143.982] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -143.982] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 143.982 Td -/F392_0 17.2154 Tf -(BZ2_bzWriteClose) 165.268 Tj -[1 0 0 1 285.126 143.982] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -213.126 -2.3326] cm +-278 TJm +(BZ2_bzWriteClose) 151.134 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62930,17 +55445,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -90.7975] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62965,7 +55473,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62974,12 +55481,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -62988,18 +55489,21 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td +/F122_0 9.9626 Tf (23) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -63008,7 +55512,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -63017,12 +55520,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -63031,7 +55532,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 27 27 +%%Page: 24 27 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -63049,20 +55550,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -63087,7 +55584,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -63096,12 +55592,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -63110,36 +55600,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -63148,7 +55634,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -63157,78 +55642,77 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -165.016] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 576.538] cm 0 0 468 143.462 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 139.875] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -711.631] cm [1 0 0 1 0 0] Tm 0 0 Td 90 711.631 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (void) 23.9102 Tj -426 TJm -(BZ2_bzWriteClose\() 101.619 Tj +(BZ2_bzWriteClose\() 101.6185 Tj -426 TJm (int) 17.9327 Tj 246.194 709.888 Td -(*) 5.97756 Tj -252.171 711.631 Td +(*) 5.9776 Tj +252.172 711.631 Td (bzerror,) 47.8205 Tj -426 TJm (BZFILE) 35.8654 Tj 340.102 709.888 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 350.323 711.631 Td (f,) 11.9551 Tj 187.611 699.676 Td @@ -63240,15 +55724,15 @@ f -426 TJm (int) 17.9327 Tj 257.609 685.978 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 267.83 687.721 Td (nbytes_in,) 59.7756 Tj 187.611 675.766 Td (unsigned) 47.8205 Tj -426 TJm (int) 17.9327 Tj -257.609 674.023 Td -(*) 5.97756 Tj +257.609 674.022 Td +(*) 5.9776 Tj 267.83 675.766 Td (nbytes_out) 59.7756 Tj -426 TJm @@ -63256,17 +55740,17 @@ f 90 651.856 Td (void) 23.9102 Tj -426 TJm -(BZ2_bzWriteClose64\() 113.574 Tj +(BZ2_bzWriteClose64\() 113.5736 Tj -426 TJm (int) 17.9327 Tj 258.149 650.112 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 264.127 651.856 Td (bzerror,) 47.8205 Tj -426 TJm (BZFILE) 35.8654 Tj 352.057 650.112 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 362.278 651.856 Td (f,) 11.9551 Tj 196.099 639.9 Td @@ -63278,7 +55762,7 @@ f -426 TJm (int) 17.9327 Tj 266.097 626.202 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 276.318 627.945 Td (nbytes_in_lo32,) 89.6634 Tj 196.099 615.99 Td @@ -63286,15 +55770,15 @@ f -426 TJm (int) 17.9327 Tj 266.097 614.247 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 276.318 615.99 Td (nbytes_in_hi32,) 89.6634 Tj 196.099 604.035 Td (unsigned) 47.8205 Tj -426 TJm (int) 17.9327 Tj -266.097 602.292 Td -(*) 5.97756 Tj +266.097 602.291 Td +(*) 5.9776 Tj 276.318 604.035 Td (nbytes_out_lo32,) 95.641 Tj 196.099 592.08 Td @@ -63302,17 +55786,11 @@ f -426 TJm (int) 17.9327 Tj 266.097 590.336 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 276.318 592.08 Td (nbytes_out_hi32) 89.6634 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 576.538] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -63321,16 +55799,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -566.575] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 554.62 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Compresses) 48.1492 Tj -403 TJm (and) 14.386 Tj @@ -63344,44 +55822,34 @@ f (compressed) 47.0334 Tj -403 TJm (\002le) 12.7322 Tj --403 TJm -(a) 4.42339 Tj -1 TJm -(ll) 5.53921 Tj +-402 TJm +(all) 9.9626 Tj -403 TJm (data) 16.5977 Tj -403 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -402 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm -(ar) 7.74094 Tj +(ar) 7.7409 Tj -403 TJm (supplied) 33.7633 Tj -403 TJm (by) 9.9626 Tj -[1 0 0 1 384.152 554.62] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -384.152 -554.62] cm -[1 0 0 1 0 0] Tm -0 0 Td 384.152 554.62 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzWrite) 65.7532 Tj -[1 0 0 1 449.906 554.62] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -449.906 -554.62] cm -[1 0 0 1 0 0] Tm -0 0 Td 449.906 554.62 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -768 TJm (The) 15.4918 Tj -403 TJm @@ -63401,41 +55869,33 @@ f -352 TJm (written,) 30.7147 Tj -378 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -352 TJm (subsequent) 44.2738 Tj -352 TJm (calls) 18.2614 Tj -352 TJm (to) 7.7509 Tj -[1 0 0 1 300.456 542.665] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -300.456 -542.665] cm -[1 0 0 1 0 0] Tm -0 0 Td 300.456 542.665 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzWrite) 65.7532 Tj -[1 0 0 1 366.209 542.665] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -366.209 -542.665] cm -[1 0 0 1 0 0] Tm -0 0 Td 369.718 542.665 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (are) 12.1643 Tj -352 TJm (ille) 12.7322 Tj 15 TJm (g) 4.9813 Tj 5 TJm -(al.) 9.68365 Tj +(al.) 9.6836 Tj -1234 TJm (All) 12.7322 Tj -352 TJm @@ -63450,52 +55910,36 @@ f (compressed) 47.0334 Tj -250 TJm (\002le) 12.7322 Tj -[1 0 0 1 151.411 530.71] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -151.411 -530.71] cm -[1 0 0 1 0 0] Tm -0 0 Td 151.411 530.71 Td -/F134_0 9.9626 Tf -(b) 5.97756 Tj -[1 0 0 1 157.389 530.71] cm +/F124_0 9.9626 Tf +(b) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -157.389 -530.71] cm -[1 0 0 1 0 0] Tm -0 0 Td -159.879 530.71 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +159.88 530.71 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -250 TJm (released.) 35.1281 Tj -[1 0 0 1 207.231 530.71] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -207.231 -530.71] cm -[1 0 0 1 0 0] Tm -0 0 Td 207.231 530.71 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (fflush) 35.8654 Tj -[1 0 0 1 243.097 530.71] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -243.097 -530.71] cm -[1 0 0 1 0 0] Tm -0 0 Td 245.587 530.71 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -250 TJm (called) 23.7907 Tj -250 TJm @@ -63511,73 +55955,51 @@ f 20 TJm (ut) 7.7509 Tj -250 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (not) 12.7322 Tj -[1 0 0 1 422.771 530.71] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -422.771 -530.71] cm -[1 0 0 1 0 0] Tm -0 0 Td 422.771 530.71 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (fclose) 35.8654 Tj -[1 0 0 1 458.636 530.71] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -458.636 -530.71] cm -[1 0 0 1 0 0] Tm -0 0 Td 458.636 530.71 Td -/F130_0 9.9626 Tf -(') 3.31755 Tj +/F122_0 9.9626 Tf +(') 3.3175 Tj 50 TJm -(d.) 7.47195 Tj -[1 0 0 1 72 528.553] cm +(d.) 7.472 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -518.59] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 508.792 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj -[1 0 0 1 81.5743 508.792] cm +(If) 6.6351 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -81.5743 -508.792] cm -[1 0 0 1 0 0] Tm -0 0 Td -81.5743 508.792 Td -/F134_0 9.9626 Tf +81.574 508.792 Td +/F124_0 9.9626 Tf (BZ2_bzWriteClose) 95.641 Tj -[1 0 0 1 177.216 508.792] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -177.216 -508.792] cm -[1 0 0 1 0 0] Tm -0 0 Td 180.155 508.792 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -295 TJm (called) 23.7907 Tj -295 TJm @@ -63589,11 +56011,11 @@ f -295 TJm (after) 18.2515 Tj -295 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -295 TJm (error) 19.3573 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -306 TJm (the) 12.1743 Tj -295 TJm @@ -63601,7 +56023,7 @@ f -295 TJm (action) 24.3486 Tj -295 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -295 TJm (to) 7.7509 Tj -295 TJm @@ -63611,7 +56033,7 @@ f -295 TJm (memory) 33.2053 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -891 TJm (The) 15.4918 Tj -295 TJm @@ -63635,7 +56057,7 @@ f -289 TJm (calls,) 20.7521 Tj -299 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -289 TJm (this) 14.396 Tj -289 TJm @@ -63643,17 +56065,17 @@ f -289 TJm (will) 15.5018 Tj -289 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -289 TJm (detected) 33.1954 Tj -289 TJm (automatically) 54.2364 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -427 TJm (There) 23.2328 Tj -289 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -289 TJm (no) 9.9626 Tj -289 TJm @@ -63672,27 +56094,19 @@ f (nor) 13.2801 Tj -263 TJm (to) 7.7509 Tj -[1 0 0 1 258.308 484.882] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -258.308 -484.882] cm -[1 0 0 1 0 0] Tm -0 0 Td 258.308 484.882 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (fflush) 35.8654 Tj -[1 0 0 1 294.173 484.882] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -294.173 -484.882] cm -[1 0 0 1 0 0] Tm -0 0 Td 296.79 484.882 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (the) 12.1743 Tj -263 TJm (compressed) 47.0334 Tj @@ -63717,11 +56131,11 @@ f -262 TJm (happen) 28.772 Tj 72 472.926 Td -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(en) 9.40469 Tj +(en) 9.4047 Tj -250 TJm (in) 7.7509 Tj -250 TJm @@ -63729,19 +56143,19 @@ f -250 TJm (case) 17.1456 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (no) 9.9626 Tj -250 TJm (error) 19.3573 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -250 TJm (by) 9.9626 Tj -250 TJm (passing) 29.8878 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (nonzero) 32.0895 Tj -250 TJm @@ -63750,100 +56164,70 @@ f (alue) 16.5977 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 305.014 472.926] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -305.014 -472.926] cm -[1 0 0 1 0 0] Tm -0 0 Td -305.014 472.926 Td -/F134_0 9.9626 Tf +305.015 472.926 Td +/F124_0 9.9626 Tf (abandon) 41.8429 Tj -[1 0 0 1 346.858 472.926] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -346.858 -472.926] cm -[1 0 0 1 0 0] Tm -0 0 Td 346.858 472.926 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 470.77] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -460.807] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 451.009 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj -[1 0 0 1 80.5974 451.009] cm +(If) 6.6351 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -80.5974 -451.009] cm -[1 0 0 1 0 0] Tm -0 0 Td -80.5974 451.009 Td -/F134_0 9.9626 Tf +80.597 451.009 Td +/F124_0 9.9626 Tf (nbytes_in) 53.798 Tj -[1 0 0 1 134.396 451.009] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -134.396 -451.009] cm -[1 0 0 1 0 0] Tm -0 0 Td 136.358 451.009 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -197 TJm (non-null,) 36.2539 Tj -[1 0 0 1 183.287 451.009] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -183.287 -451.009] cm -[1 0 0 1 0 0] Tm -0 0 Td 183.287 449.265 Td -/F134_0 9.9626 Tf -(*) 5.97756 Tj +/F124_0 9.9626 Tf +(*) 5.9776 Tj 189.265 451.009 Td (nbytes_in) 53.798 Tj -[1 0 0 1 243.063 451.009] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -243.063 -451.009] cm -[1 0 0 1 0 0] Tm -0 0 Td 245.025 451.009 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -197 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -197 TJm (set) 11.0684 Tj -197 TJm (to) 7.7509 Tj -197 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -197 TJm (the) 12.1743 Tj -197 TJm @@ -63853,7 +56237,7 @@ f 20 TJm (olume) 24.9065 Tj -197 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -197 TJm (uncompressed) 56.996 Tj -197 TJm @@ -63863,31 +56247,23 @@ f -584 TJm (Similarly) 37.0908 Tj 65 TJm -(,) 2.49065 Tj -[1 0 0 1 72 439.053] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -439.053] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 439.053 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (nbytes_out) 59.7756 Tj -[1 0 0 1 131.776 439.053] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -131.776 -439.053] cm -[1 0 0 1 0 0] Tm -0 0 Td 134.716 439.053 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -295 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -295 TJm (set) 11.0684 Tj -295 TJm @@ -63900,57 +56276,49 @@ f (v) 4.9813 Tj 20 TJm (olume) 24.9065 Tj --296 TJm -(of) 8.29885 Tj -295 TJm +(of) 8.2988 Tj +-296 TJm (compressed) 47.0334 Tj -295 TJm (data) 16.5977 Tj -295 TJm (written.) 30.7147 Tj -890 TJm -(F) 5.53921 Tj +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -295 TJm (compatibility) 53.1405 Tj -295 TJm (with) 17.7135 Tj -295 TJm (older) 20.4731 Tj --296 TJm +-295 TJm (v) 4.9813 Tj 15 TJm (ersions) 28.224 Tj --295 TJm -(of) 8.29885 Tj +-296 TJm +(of) 8.2988 Tj 72 427.098 Td (the) 12.1743 Tj -283 TJm (library) 26.5603 Tj 65 TJm -(,) 2.49065 Tj -[1 0 0 1 118.294 427.098] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -118.294 -427.098] cm -[1 0 0 1 0 0] Tm -0 0 Td 118.294 427.098 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzWriteClose) 95.641 Tj -[1 0 0 1 213.936 427.098] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -213.936 -427.098] cm -[1 0 0 1 0 0] Tm -0 0 Td 216.753 427.098 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (only) 17.7135 Tj -283 TJm (yields) 23.8007 Tj @@ -63965,35 +56333,27 @@ f -283 TJm (bits) 14.396 Tj -283 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -283 TJm (these) 20.4731 Tj -282 TJm (counts.) 28.503 Tj -817 TJm (Use) 15.4918 Tj -[1 0 0 1 423.499 427.098] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -423.499 -427.098] cm -[1 0 0 1 0 0] Tm -0 0 Td 423.499 427.098 Td -/F134_0 9.9626 Tf -(BZ2_bzWriteClose64) 107.596 Tj -[1 0 0 1 531.095 427.098] cm +/F124_0 9.9626 Tf +(BZ2_bzWriteClose64) 107.5961 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -531.095 -427.098] cm -[1 0 0 1 0 0] Tm -0 0 Td 533.913 427.098 Td -/F130_0 9.9626 Tf -(if) 6.08715 Tj +/F122_0 9.9626 Tf +(if) 6.0871 Tj 72 415.143 Td (you) 14.9439 Tj -250 TJm @@ -64026,89 +56386,72 @@ f (absolutely) 40.9562 Tj -250 TJm (identical.) 36.8018 Tj -[1 0 0 1 72 412.986] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -403.024] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 393.225 Td -/F130_0 9.9626 Tf (Possible) 33.2153 Tj -250 TJm (assignments) 48.7072 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 169.144 393.225] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -169.144 -393.225] cm -[1 0 0 1 0 0] Tm -0 0 Td 169.144 393.225 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzerror) 41.8429 Tj -[1 0 0 1 210.987 393.225] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -210.987 -393.225] cm -[1 0 0 1 0 0] Tm -0 0 Td 210.987 393.225 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (:) 2.7696 Tj -[1 0 0 1 72 391.069] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -84.6825] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 83.6862 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 306.386] cm +0 0 468 83.686 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 80.0996] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -381.704] cm [1 0 0 1 0 0] Tm 0 0 Td 90 381.704 Td -/F134_0 9.9626 Tf -(BZ_SEQUENCE_ERROR) 101.619 Tj -98.4879 369.748 Td +/F124_0 9.9626 Tf +(BZ_SEQUENCE_ERROR) 101.6185 Tj +98.488 369.749 Td (if) 11.9551 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (was) 17.9327 Tj -426 TJm @@ -64119,7 +56462,7 @@ f (BZ2_bzReadOpen) 83.6858 Tj 90 357.793 Td (BZ_IO_ERROR) 65.7532 Tj -98.4879 345.838 Td +98.488 345.838 Td (if) 11.9551 Tj -426 TJm (there) 29.8878 Tj @@ -64139,23 +56482,8 @@ f (file) 23.9102 Tj 90 333.883 Td (BZ_OK) 29.8878 Tj -98.4879 321.928 Td +98.488 321.928 Td (otherwise) 53.798 Tj -[1 0 0 1 72 306.386] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -64180,7 +56508,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -64189,11 +56516,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -296.423] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 275.765 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.4.8.) 43.0729 Tj -278 TJm (Handling) 73.6475 Tj @@ -64202,12 +56538,11 @@ f 10 TJm (ded) 30.609 Tj -278 TJm -(compressed) 101.416 Tj +(compressed) 101.4159 Tj -278 TJm (data) 35.3949 Tj -278 TJm (streams) 66.0211 Tj -[1 0 0 1 72 271.935] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -64232,16 +56567,12 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -261.972] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 253.847 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (The) 15.4918 Tj -203 TJm (high-le) 28.224 Tj @@ -64252,34 +56583,26 @@ f -203 TJm (library) 26.5603 Tj -203 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (acilitates) 35.417 Tj -203 TJm (use) 13.2801 Tj -203 TJm -(of) 8.29885 Tj -[1 0 0 1 226.404 253.847] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -226.404 -253.847] cm -[1 0 0 1 0 0] Tm -0 0 Td 226.404 253.847 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 256.292 253.847] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -256.292 -253.847] cm -[1 0 0 1 0 0] Tm -0 0 Td 258.316 253.847 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (data) 16.5977 Tj -203 TJm (streams) 30.4357 Tj @@ -64292,10 +56615,10 @@ f -203 TJm (part) 15.4918 Tj -203 TJm -(of) 8.29885 Tj --204 TJm -(a) 4.42339 Tj +(of) 8.2988 Tj -203 TJm +(a) 4.4234 Tj +-204 TJm (surrounding,) 50.6399 Tj -212 TJm (lar) 10.5105 Tj @@ -64305,466 +56628,392 @@ f (data) 16.5977 Tj -203 TJm (stream.) 29.0509 Tj -[1 0 0 1 72 251.69] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -29.7236] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -221.967] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 221.967 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 221.967] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +74.491 221.967 Td +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -221.967] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 221.967 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +-450 TJm +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj --240 TJm +(or) 8.2988 Tj +-264 TJm (writing,) 31.2726 Tj --243 TJm +-267 TJm (the) 12.1743 Tj --240 TJm +-264 TJm (library) 26.5603 Tj --241 TJm +-264 TJm (tak) 12.1743 Tj 10 TJm -(es) 8.29885 Tj --240 TJm -(an) 9.40469 Tj --241 TJm +(es) 8.2988 Tj +-264 TJm +(an) 9.4047 Tj +-264 TJm (open) 19.3673 Tj --240 TJm +-264 TJm (\002le) 12.7322 Tj --241 TJm +-264 TJm (handle,) 29.0509 Tj --242 TJm +-267 TJm (writes) 24.3486 Tj --241 TJm -(compres) 33.7533 Tj -1 TJm -(sed) 13.2801 Tj --241 TJm +-264 TJm +(compressed) 47.0334 Tj +-264 TJm (data) 16.5977 Tj --240 TJm +-264 TJm (to) 7.7509 Tj --241 TJm -(it,) 8.02986 Tj -[1 0 0 1 398.926 221.967] cm +-264 TJm +(it,) 8.0299 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -398.926 -221.967] cm -[1 0 0 1 0 0] Tm -0 0 Td -398.926 221.967 Td -/F134_0 9.9626 Tf +397.758 221.967 Td +/F124_0 9.9626 Tf (fflush) 35.8654 Tj -[1 0 0 1 434.791 221.967] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -434.791 -221.967] cm -[1 0 0 1 0 0] Tm -0 0 Td -434.791 221.967 Td -/F130_0 9.9626 Tf -(es) 8.29885 Tj --240 TJm -(it) 5.53921 Tj --241 TJm +433.624 221.967 Td +/F122_0 9.9626 Tf +(es) 8.2988 Tj +-264 TJm +(it) 5.5392 Tj +-264 TJm (b) 4.9813 Tj 20 TJm (ut) 7.7509 Tj --240 TJm +-264 TJm (does) 18.2614 Tj --241 TJm +-264 TJm (not) 12.7322 Tj -[1 0 0 1 504.135 221.967] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -504.135 -221.967] cm -[1 0 0 1 0 0] Tm -0 0 Td 504.135 221.967 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (fclose) 35.8654 Tj -[1 0 0 1 540 221.967] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -221.967] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 210.011 Td -/F130_0 9.9626 Tf -(it.) 8.02986 Tj --610 TJm +81.963 210.012 Td +/F122_0 9.9626 Tf +(it.) 8.0299 Tj +-675 TJm (The) 15.4918 Tj --235 TJm +-259 TJm (calling) 27.1182 Tj --235 TJm -(application) 44.2738 Tj --235 TJm +-260 TJm +(a) 4.4234 Tj +1 TJm +(pp) 9.9626 Tj +-1 TJm +(l) 2.7696 Tj +1 TJm +(ication) 27.1182 Tj +-260 TJm (can) 13.8281 Tj --235 TJm +-259 TJm (write) 20.4731 Tj --235 TJm -(its) 9.41466 Tj --235 TJm +-259 TJm +(its) 9.4147 Tj +-259 TJm (o) 4.9813 Tj 25 TJm (wn) 12.1743 Tj --235 TJm +-259 TJm (data) 16.5977 Tj --235 TJm +-260 TJm (before) 25.4445 Tj --235 TJm +-259 TJm (and) 14.386 Tj --235 TJm +-259 TJm (after) 18.2515 Tj --235 TJm +-259 TJm (the) 12.1743 Tj --235 TJm +-259 TJm (compressed) 47.0334 Tj --235 TJm -(data) 16.5977 Tj --235 TJm +-260 TJm +(dat) 12.1743 Tj +1 TJm +(a) 4.4234 Tj +-260 TJm (stream,) 29.0509 Tj --238 TJm +-261 TJm (using) 21.589 Tj --235 TJm +-259 TJm (that) 14.9439 Tj --235 TJm -(same) 20.4731 Tj --235 TJm +-260 TJm +(sam) 16.0497 Tj +1 TJm +(e) 4.4234 Tj +-260 TJm (\002le) 12.7322 Tj -86.944 198.056 Td +81.963 198.056 Td (handle.) 29.0509 Tj -[1 0 0 1 115.995 198.056] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -43.9948 -21.9178] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -176.139] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 176.139 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 176.139] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +74.491 176.139 Td +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -176.139] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 176.139 Td -/F130_0 9.9626 Tf +-450 TJm (Reading) 33.2053 Tj --236 TJm -(is) 6.64505 Tj --236 TJm +-258 TJm +(is) 6.6451 Tj +-259 TJm (more) 20.4731 Tj --236 TJm +-258 TJm (comple) 29.3299 Tj 15 TJm -(x,) 7.47195 Tj --238 TJm +(x,) 7.472 Tj +-261 TJm (and) 14.386 Tj --236 TJm +-258 TJm (the) 12.1743 Tj --236 TJm -(f) 3.31755 Tj +-258 TJm +(f) 3.3175 Tj 10 TJm (acilities) 30.9936 Tj --236 TJm +-259 TJm (are) 12.1643 Tj --236 TJm +-258 TJm (not) 12.7322 Tj --235 TJm -(as) 8.29885 Tj --236 TJm +-258 TJm +(as) 8.2988 Tj +-259 TJm (general) 29.3199 Tj --236 TJm -(as) 8.29885 Tj --236 TJm +-258 TJm +(as) 8.2988 Tj +-259 TJm (the) 12.1743 Tj 15 TJm (y) 4.9813 Tj --236 TJm +-258 TJm (could) 22.1369 Tj --236 TJm -(be) 9.40469 Tj --236 TJm +-258 TJm +(be) 9.4047 Tj +-259 TJm (since) 20.4731 Tj --235 TJm +-258 TJm (generality) 39.8404 Tj --236 TJm -(is) 6.64505 Tj --236 TJm +-259 TJm +(is) 6.6451 Tj +-258 TJm (hard) 17.7035 Tj --236 TJm +-258 TJm (to) 7.7509 Tj --236 TJm +-259 TJm (reconcile) 36.5129 Tj -86.944 164.183 Td +81.963 164.183 Td (with) 17.7135 Tj --404 TJm -(ef) 7.74094 Tj +-432 TJm +(ef) 7.7409 Tj 25 TJm (\002cienc) 26.5603 Tj 15 TJm (y) 4.9813 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 164.811 164.183] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -164.811 -164.183] cm -[1 0 0 1 0 0] Tm -0 0 Td -164.811 164.183 Td -/F134_0 9.9626 Tf +161.767 164.183 Td +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -[1 0 0 1 224.587 164.183] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -224.587 -164.183] cm -[1 0 0 1 0 0] Tm -0 0 Td -228.614 164.183 Td -/F130_0 9.9626 Tf +225.847 164.183 Td +/F122_0 9.9626 Tf (reads) 21.0211 Tj --404 TJm +-432 TJm (from) 19.3673 Tj --405 TJm +-432 TJm (the) 12.1743 Tj --404 TJm +-432 TJm (compressed) 47.0334 Tj --404 TJm +-432 TJm (\002le) 12.7322 Tj --404 TJm +-432 TJm (in) 7.7509 Tj --405 TJm +-432 TJm (blocks) 26.0123 Tj --404 TJm -(of) 8.29885 Tj --404 TJm +-432 TJm +(of) 8.2988 Tj +-432 TJm (size) 15.4918 Tj -[1 0 0 1 434.744 164.183] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -434.744 -164.183] cm -[1 0 0 1 0 0] Tm -0 0 Td -434.744 164.183 Td -/F134_0 9.9626 Tf +434.467 164.183 Td +/F124_0 9.9626 Tf (BZ_MAX_UNUSED) 77.7083 Tj -[1 0 0 1 512.452 164.183] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -512.452 -164.183] cm -[1 0 0 1 0 0] Tm -0 0 Td 516.479 164.183 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (bytes,) 23.5217 Tj -86.944 152.228 Td +81.963 152.228 Td (and) 14.386 Tj --413 TJm +-436 TJm (in) 7.7509 Tj --413 TJm +-435 TJm (doing) 22.6948 Tj --413 TJm -(so) 8.85675 Tj --413 TJm +-436 TJm +(so) 8.8568 Tj +-436 TJm (probably) 35.417 Tj --413 TJm +-436 TJm (will) 15.5018 Tj --413 TJm +-435 TJm (o) 4.9813 Tj 15 TJm (v) 4.9813 Tj 15 TJm (ershoot) 29.3299 Tj --413 TJm +-436 TJm (the) 12.1743 Tj --413 TJm +-436 TJm (logical) 27.1182 Tj --413 TJm +-435 TJm (end) 14.386 Tj --413 TJm -(of) 8.29885 Tj --413 TJm +-436 TJm +(of) 8.2988 Tj +-436 TJm (compressed) 47.0334 Tj --413 TJm -(stream.) 29.0509 Tj --1598 TJm -(T) 6.08715 Tj +-436 TJm +(s) 3.8755 Tj +1 TJm +(tream.) 25.1755 Tj +-1735 TJm +(T) 6.0871 Tj 80 TJm (o) 4.9813 Tj --413 TJm +-436 TJm (reco) 17.1456 Tj 15 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj --413 TJm +(er) 7.7409 Tj +-435 TJm (this) 14.396 Tj --413 TJm +-436 TJm (data) 16.5977 Tj --413 TJm +-436 TJm (once) 18.8094 Tj -86.944 140.273 Td +81.963 140.273 Td (decompression) 59.7656 Tj --252 TJm +-290 TJm (has) 13.2801 Tj --252 TJm +-289 TJm (ended,) 26.2813 Tj --253 TJm +-300 TJm (call) 14.386 Tj -[1 0 0 1 210.705 140.273] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -210.705 -140.273] cm -[1 0 0 1 0 0] Tm -0 0 Td -210.705 140.273 Td -/F134_0 9.9626 Tf -(BZ2_bzReadGetUnused) 113.574 Tj -[1 0 0 1 324.279 140.273] cm +207.321 140.273 Td +/F124_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.5736 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -324.279 -140.273] cm -[1 0 0 1 0 0] Tm -0 0 Td -326.789 140.273 Td -/F130_0 9.9626 Tf +323.782 140.273 Td +/F122_0 9.9626 Tf (after) 18.2515 Tj --252 TJm +-290 TJm (the) 12.1743 Tj --252 TJm +-289 TJm (last) 13.8381 Tj --252 TJm +-290 TJm (call) 14.386 Tj --252 TJm -(of) 8.29885 Tj -[1 0 0 1 406.291 140.273] cm +-290 TJm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -406.291 -140.273] cm -[1 0 0 1 0 0] Tm -0 0 Td -406.291 140.273 Td -/F134_0 9.9626 Tf +405.164 140.273 Td +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -[1 0 0 1 466.067 140.273] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -466.067 -140.273] cm -[1 0 0 1 0 0] Tm -0 0 Td -468.578 140.273 Td -/F130_0 9.9626 Tf +467.826 140.273 Td +/F122_0 9.9626 Tf (\(the) 15.4918 Tj --252 TJm +-290 TJm (one) 14.386 Tj --252 TJm +-290 TJm (returning) 36.5229 Tj -[1 0 0 1 86.944 128.318] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -128.318] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 128.318 Td -/F134_0 9.9626 Tf +81.963 128.318 Td +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 164.653 128.318] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -164.653 -128.318] cm -[1 0 0 1 0 0] Tm -0 0 Td -164.653 128.318 Td -/F130_0 9.9626 Tf -(\)) 3.31755 Tj +159.671 128.318 Td +/F122_0 9.9626 Tf +(\)) 3.3175 Tj -250 TJm (b) 4.9813 Tj 20 TJm @@ -64773,44 +57022,28 @@ f (before) 25.4445 Tj -250 TJm (calling) 27.1182 Tj -[1 0 0 1 243.028 128.318] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -243.028 -128.318] cm -[1 0 0 1 0 0] Tm -0 0 Td -243.028 128.318 Td -/F134_0 9.9626 Tf +238.047 128.318 Td +/F124_0 9.9626 Tf (BZ2_bzReadClose) 89.6634 Tj -[1 0 0 1 332.692 128.318] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -332.692 -128.318] cm -[1 0 0 1 0 0] Tm -0 0 Td -332.692 128.318 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 335.182 128.318] cm +327.71 128.318 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -263.182 -77.466] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -64835,7 +57068,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -64844,12 +57076,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -64858,18 +57084,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.8519] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.8518 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.852 Td (24) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -64878,7 +57106,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -64887,12 +57114,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -64901,7 +57126,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 28 28 +%%Page: 25 28 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -64919,20 +57144,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -64957,7 +57178,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -64966,12 +57186,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -64980,36 +57194,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -65018,7 +57228,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -65027,53 +57236,52 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -21.5542] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (This) 17.7135 Tj -271 TJm (mechanism) 45.3796 Tj -272 TJm (mak) 17.1556 Tj 10 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -271 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -271 TJm (easy) 17.7035 Tj -271 TJm @@ -65082,27 +57290,19 @@ Q (decompress) 47.0334 Tj -271 TJm (multiple) 33.2153 Tj -[1 0 0 1 293.312 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -293.312 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td -293.312 710.037 Td -/F134_0 9.9626 Tf +293.313 710.037 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 323.2 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -323.2 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 325.903 710.037 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (streams) 30.4357 Tj -271 TJm (placed) 26.0024 Tj @@ -65115,84 +57315,62 @@ Q -271 TJm (end) 14.386 Tj -271 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -272 TJm (one) 14.386 Tj -271 TJm (stream,) 29.0509 Tj 72 698.082 Td (when) 21.579 Tj -[1 0 0 1 96.1948 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -96.1948 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td -96.1948 698.082 Td -/F134_0 9.9626 Tf +96.195 698.082 Td +/F124_0 9.9626 Tf (BZ2_bzRead) 59.7756 Tj -[1 0 0 1 155.971 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -155.971 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td 158.586 698.082 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (returns) 27.6661 Tj -[1 0 0 1 188.868 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -188.868 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td 188.868 698.082 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 266.577 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -266.577 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td 266.577 698.082 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -263 TJm (call) 14.386 Tj -[1 0 0 1 288.685 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -288.685 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td 288.685 698.082 Td -/F134_0 9.9626 Tf -(BZ2_bzReadGetUnused) 113.574 Tj -[1 0 0 1 402.259 698.082] cm +/F124_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.5736 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -402.259 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td 404.875 698.082 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj -263 TJm -(collect) 26.5603 Tj --262 TJm +(coll) 14.9439 Tj +1 TJm +(ect) 11.6164 Tj +-263 TJm (the) 12.1743 Tj -263 TJm (unused) 28.224 Tj @@ -65203,7 +57381,7 @@ Q 10 TJm (y) 4.9813 Tj -262 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj 72 686.127 Td (into) 15.5018 Tj -265 TJm @@ -65215,7 +57393,7 @@ Q -265 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -265 TJm @@ -65233,11 +57411,11 @@ Q -265 TJm (start) 17.1556 Tj -265 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -265 TJm (the) 12.1743 Tj -265 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 15 TJm (xt) 7.7509 Tj -265 TJm @@ -65245,7 +57423,7 @@ Q -265 TJm (stream.) 29.0509 Tj -711 TJm -(T) 6.08715 Tj +(T) 6.0871 Tj 80 TJm (o) 4.9813 Tj -265 TJm @@ -65255,35 +57433,27 @@ Q 72 674.172 Td (that) 14.9439 Tj -246 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 15 TJm (xt) 7.7509 Tj -246 TJm (stream,) 29.0509 Tj -247 TJm (call) 14.386 Tj -[1 0 0 1 157.205 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -157.205 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td 157.205 674.172 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzReadOpen) 83.6858 Tj -[1 0 0 1 240.891 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -240.891 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td 243.344 674.172 Td -/F130_0 9.9626 Tf -(ag) 9.40469 Tj +/F122_0 9.9626 Tf +(ag) 9.4047 Tj 5 TJm (ain,) 14.6649 Tj -247 TJm @@ -65300,49 +57470,33 @@ Q (via) 12.1743 Tj -246 TJm (the) 12.1743 Tj -[1 0 0 1 405.967 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -405.967 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td 405.967 674.172 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (unused) 35.8654 Tj -[1 0 0 1 441.833 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -441.833 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td 444.286 674.172 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (/) 2.7696 Tj -[1 0 0 1 449.508 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -449.508 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td 449.508 674.172 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (nUnused) 41.8429 Tj -[1 0 0 1 491.351 674.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -491.351 -674.172] cm -[1 0 0 1 0 0] Tm -0 0 Td 493.804 674.172 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (parameters.) 46.1966 Tj 72 662.217 Td (K) 7.193 Tj @@ -65354,98 +57508,74 @@ Q (this) 14.396 Tj -264 TJm (until) 18.2714 Tj -[1 0 0 1 158.622 662.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -158.622 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td 158.622 662.217 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_STREAM_END) 77.7083 Tj -[1 0 0 1 236.33 662.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -236.33 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td 238.952 662.217 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (return) 23.7907 Tj -263 TJm (coincides) 37.6287 Tj -263 TJm (with) 17.7135 Tj --263 TJm -(the) 12.1743 Tj -264 TJm +(the) 12.1743 Tj +-263 TJm (ph) 9.9626 Tj 5 TJm (ysical) 23.2427 Tj -263 TJm (end) 14.386 Tj -263 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -263 TJm (\002le) 12.7322 Tj -263 TJm -(\() 3.31755 Tj -[1 0 0 1 423.125 662.217] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -423.125 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td -423.125 662.217 Td -/F134_0 9.9626 Tf +423.124 662.217 Td +/F124_0 9.9626 Tf (feof\(f\)) 41.8429 Tj -[1 0 0 1 464.968 662.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -464.968 -662.217] cm -[1 0 0 1 0 0] Tm -0 0 Td 464.968 662.217 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\).) 5.8082 Tj -699 TJm -(In) 8.29885 Tj +(In) 8.2988 Tj -263 TJm (this) 14.396 Tj -263 TJm (situation) 34.3212 Tj -[1 0 0 1 72 650.261] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -650.261] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 650.261 Td -/F134_0 9.9626 Tf -(BZ2_bzReadGetUnused) 113.574 Tj -[1 0 0 1 185.574 650.261] cm +/F124_0 9.9626 Tf +(BZ2_bzReadGetUnused) 113.5736 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -185.574 -650.261] cm -[1 0 0 1 0 0] Tm -0 0 Td 188.065 650.261 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (course) 26.0024 Tj -250 TJm @@ -65454,21 +57584,15 @@ Q (no) 9.9626 Tj -250 TJm (data.) 19.0883 Tj -[1 0 0 1 72 648.951] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -638.989] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 628.344 Td -/F130_0 9.9626 Tf (This) 17.7135 Tj -240 TJm (should) 26.5703 Tj @@ -65477,7 +57601,7 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -240 TJm (some) 21.031 Tj -241 TJm @@ -65503,17 +57627,17 @@ Q -240 TJm (can) 13.8281 Tj -241 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -240 TJm (used.) 20.7521 Tj -614 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -240 TJm (you) 14.9439 Tj -241 TJm (require) 28.2141 Tj -240 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xtra) 15.4918 Tj -241 TJm @@ -65523,17 +57647,17 @@ Q 1 TJm (lity) 13.2901 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -243 TJm (you') 18.2614 Tj 10 TJm -(ll) 5.53921 Tj +(ll) 5.5392 Tj -240 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -241 TJm (to) 7.7509 Tj 72 616.389 Td @@ -65568,7 +57692,6 @@ Q (interf) 21.579 Tj 10 TJm (ace.) 15.7608 Tj -[1 0 0 1 72 614.232] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -65597,7 +57720,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -65606,11 +57728,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -604.269] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 585.767 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.4.9.) 43.0729 Tj -278 TJm (Standar) 64.0929 Tj @@ -65620,7 +57739,6 @@ Q (\002le-reading/writing) 154.009 Tj -278 TJm (code) 40.1807 Tj -[1 0 0 1 72 581.937] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -65645,19 +57763,15 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -571.975] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 563.85 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Here') 22.6749 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -250 TJm (ho) 9.9626 Tj 25 TJm @@ -65673,56 +57787,53 @@ Q -250 TJm (to) 7.7509 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (compressed) 47.0334 Tj -250 TJm (\002le:) 15.5018 Tj -[1 0 0 1 72 561.693] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -371.606] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 190.086] cm 0 0 468 370.61 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 367.024] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -552.328] cm [1 0 0 1 0 0] Tm 0 0 Td 90 552.328 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (FILE) 23.9102 Tj 113.91 550.584 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 132.62 552.328 Td (f;) 11.9551 Tj 90 540.373 Td (BZFILE) 35.8654 Tj -125.865 538.629 Td -(*) 5.97756 Tj +125.866 538.629 Td +(*) 5.9776 Tj 136.087 540.373 Td (b;) 11.9551 Tj 90 528.418 Td @@ -65734,9 +57845,9 @@ f -1704 TJm (buf[) 23.9102 Tj -426 TJm -(/) 5.97756 Tj +(/) 5.9776 Tj 165.018 514.719 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 175.24 516.462 Td (whatever) 47.8205 Tj -426 TJm @@ -65746,9 +57857,9 @@ f -426 TJm (like) 23.9102 Tj 305.79 514.719 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 311.767 516.462 Td -(/) 5.97756 Tj +(/) 5.9776 Tj -426 TJm (];) 11.9551 Tj 90 504.507 Td @@ -65760,13 +57871,13 @@ f -2130 TJm (nWritten;) 53.798 Tj 90 468.642 Td -(f) 5.97756 Tj +(f) 5.9776 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (fopen) 29.8878 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm ("myfile.bz2",) 77.7083 Tj -426 TJm @@ -65776,31 +57887,31 @@ f 90 456.687 Td (if) 11.9551 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (!f) 11.9551 Tj -426 TJm -(\)) 5.97756 Tj +(\)) 5.9776 Tj -426 TJm -({) 5.97756 Tj +({) 5.9776 Tj 94.244 444.731 Td -(/) 5.97756 Tj +(/) 5.9776 Tj 100.222 442.988 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 110.443 444.731 Td (handle) 35.8654 Tj -426 TJm (error) 29.8878 Tj -184.685 442.988 Td -(*) 5.97756 Tj +184.684 442.988 Td +(*) 5.9776 Tj 190.662 444.731 Td -(/) 5.97756 Tj +(/) 5.9776 Tj 90 432.776 Td -(}) 5.97756 Tj +(}) 5.9776 Tj 90 420.821 Td -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (BZ2_bzWriteOpen\() 95.641 Tj -426 TJm @@ -65808,7 +57919,7 @@ f -426 TJm (f,) 11.9551 Tj -426 TJm -(9) 5.97756 Tj +(9) 5.9776 Tj -426 TJm (\);) 11.9551 Tj 90 408.866 Td @@ -65820,51 +57931,51 @@ f -426 TJm (BZ_OK\)) 35.8654 Tj -426 TJm -({) 5.97756 Tj +({) 5.9776 Tj 94.244 396.911 Td (BZ2_bzWriteClose) 95.641 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (\);) 11.9551 Tj -94.244 384.956 Td -(/) 5.97756 Tj +94.244 384.955 Td +(/) 5.9776 Tj 100.222 383.212 Td -(*) 5.97756 Tj -110.443 384.956 Td +(*) 5.9776 Tj +110.443 384.955 Td (handle) 35.8654 Tj -426 TJm (error) 29.8878 Tj -184.685 383.212 Td -(*) 5.97756 Tj -190.662 384.956 Td -(/) 5.97756 Tj +184.684 383.212 Td +(*) 5.9776 Tj +190.662 384.955 Td +(/) 5.9776 Tj 90 373 Td -(}) 5.97756 Tj +(}) 5.9776 Tj 90 349.09 Td (while) 29.8878 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm -(/) 5.97756 Tj -140.331 347.347 Td -(*) 5.97756 Tj +(/) 5.9776 Tj +140.331 347.346 Td +(*) 5.9776 Tj 150.553 349.09 Td (condition) 53.798 Tj -208.595 347.347 Td -(*) 5.97756 Tj +208.595 347.346 Td +(*) 5.9776 Tj 214.572 349.09 Td -(/) 5.97756 Tj +(/) 5.9776 Tj -426 TJm -(\)) 5.97756 Tj +(\)) 5.9776 Tj -426 TJm -({) 5.97756 Tj +({) 5.9776 Tj 94.244 337.135 Td -(/) 5.97756 Tj +(/) 5.9776 Tj 100.222 335.391 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 110.443 337.135 Td (get) 17.9327 Tj -426 TJm @@ -65886,17 +57997,17 @@ f -426 TJm (appropriately) 77.7083 Tj 421.874 335.391 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 427.852 337.135 Td -(/) 5.97756 Tj -94.2439 325.18 Td +(/) 5.9776 Tj +94.244 325.18 Td (nWritten) 47.8205 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (BZ2_bzWrite) 65.7532 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (&bzerror,) 53.798 Tj -426 TJm @@ -65907,7 +58018,7 @@ f (nBuf) 23.9102 Tj -426 TJm (\);) 11.9551 Tj -94.2439 313.225 Td +94.244 313.224 Td (if) 11.9551 Tj -426 TJm (\(bzerror) 47.8205 Tj @@ -65916,39 +58027,39 @@ f -426 TJm (BZ_IO_ERROR\)) 71.7307 Tj -426 TJm -({) 5.97756 Tj +({) 5.9776 Tj 102.732 301.269 Td (BZ2_bzWriteClose) 95.641 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (&bzerror,) 53.798 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (\);) 11.9551 Tj 102.732 289.314 Td -(/) 5.97756 Tj -108.709 287.571 Td -(*) 5.97756 Tj +(/) 5.9776 Tj +108.71 287.571 Td +(*) 5.9776 Tj 118.931 289.314 Td (handle) 35.8654 Tj -426 TJm (error) 29.8878 Tj 193.172 287.571 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 199.15 289.314 Td -(/) 5.97756 Tj -94.2439 277.359 Td -(}) 5.97756 Tj +(/) 5.9776 Tj +94.244 277.359 Td +(}) 5.9776 Tj 90 265.404 Td -(}) 5.97756 Tj -90 241.494 Td -(BZ2_bzWriteClose\() 101.619 Tj +(}) 5.9776 Tj +90 241.493 Td +(BZ2_bzWriteClose\() 101.6185 Tj -426 TJm (&bzerror,) 53.798 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (\);) 11.9551 Tj 90 229.538 Td @@ -65960,27 +58071,25 @@ f -426 TJm (BZ_IO_ERROR\)) 71.7307 Tj -426 TJm -({) 5.97756 Tj -94.2439 217.583 Td -(/) 5.97756 Tj -100.221 215.84 Td -(*) 5.97756 Tj +({) 5.9776 Tj +94.244 217.583 Td +(/) 5.9776 Tj +100.222 215.84 Td +(*) 5.9776 Tj 110.443 217.583 Td (handle) 35.8654 Tj -426 TJm (error) 29.8878 Tj 184.684 215.84 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 190.662 217.583 Td -(/) 5.97756 Tj -89.9999 205.628 Td -(}) 5.97756 Tj -[1 0 0 1 72 190.086] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm +(/) 5.9776 Tj +90 205.628 Td +(}) 5.9776 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -65989,16 +58098,12 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -180.124] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 168.168 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (And) 17.1556 Tj -250 TJm (to) 7.7509 Tj @@ -66007,27 +58112,19 @@ f -250 TJm (from) 19.3673 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (compressed) 47.0334 Tj -250 TJm (\002le:) 15.5018 Tj -[1 0 0 1 72 166.012] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -115.16] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66052,7 +58149,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66061,12 +58157,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66075,18 +58165,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9513] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9513 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (25) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66095,7 +58187,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66104,12 +58195,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66118,7 +58207,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 29 29 +%%Page: 26 29 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -66136,20 +58225,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66174,7 +58259,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66183,12 +58267,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66197,36 +58275,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66235,7 +58309,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66244,74 +58317,73 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -392.164] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 349.39] cm 0 0 468 370.61 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 367.024] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -711.631] cm [1 0 0 1 0 0] Tm 0 0 Td 90 711.631 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (FILE) 23.9102 Tj 113.91 709.888 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 132.62 711.631 Td (f;) 11.9551 Tj 90 699.676 Td (BZFILE) 35.8654 Tj -125.865 697.933 Td -(*) 5.97756 Tj +125.866 697.933 Td +(*) 5.9776 Tj 136.087 699.676 Td (b;) 11.9551 Tj 90 687.721 Td @@ -66323,9 +58395,9 @@ f -1704 TJm (buf[) 23.9102 Tj -426 TJm -(/) 5.97756 Tj -165.018 674.023 Td -(*) 5.97756 Tj +(/) 5.9776 Tj +165.018 674.022 Td +(*) 5.9776 Tj 175.24 675.766 Td (whatever) 47.8205 Tj -426 TJm @@ -66334,10 +58406,10 @@ f (you) 17.9327 Tj -426 TJm (like) 23.9102 Tj -305.79 674.023 Td -(*) 5.97756 Tj +305.79 674.022 Td +(*) 5.9776 Tj 311.767 675.766 Td -(/) 5.97756 Tj +(/) 5.9776 Tj -426 TJm (];) 11.9551 Tj 90 663.811 Td @@ -66349,13 +58421,13 @@ f -2130 TJm (nWritten;) 53.798 Tj 90 627.945 Td -(f) 5.97756 Tj +(f) 5.9776 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (fopen) 29.8878 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm ("myfile.bz2",) 77.7083 Tj -426 TJm @@ -66365,35 +58437,35 @@ f 90 615.99 Td (if) 11.9551 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (!f) 11.9551 Tj -426 TJm -(\)) 5.97756 Tj +(\)) 5.9776 Tj -426 TJm -({) 5.97756 Tj +({) 5.9776 Tj 98.488 604.035 Td -(/) 5.97756 Tj -104.466 602.292 Td -(*) 5.97756 Tj +(/) 5.9776 Tj +104.466 602.291 Td +(*) 5.9776 Tj 114.687 604.035 Td (handle) 35.8654 Tj -426 TJm (error) 29.8878 Tj -188.929 602.292 Td -(*) 5.97756 Tj +188.928 602.291 Td +(*) 5.9776 Tj 194.906 604.035 Td -(/) 5.97756 Tj +(/) 5.9776 Tj 90 592.08 Td -(}) 5.97756 Tj +(}) 5.9776 Tj 90 580.125 Td -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (BZ2_bzReadOpen) 83.6858 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (&bzerror,) 53.798 Tj -426 TJm @@ -66403,13 +58475,13 @@ f -426 TJm (NULL,) 29.8878 Tj -426 TJm -(0) 5.97756 Tj +(0) 5.9776 Tj -426 TJm (\);) 11.9551 Tj 90 568.169 Td (if) 11.9551 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (bzerror) 41.8429 Tj -426 TJm @@ -66417,43 +58489,43 @@ f -426 TJm (BZ_OK) 29.8878 Tj -426 TJm -(\)) 5.97756 Tj +(\)) 5.9776 Tj -426 TJm -({) 5.97756 Tj +({) 5.9776 Tj 98.488 556.214 Td (BZ2_bzReadClose) 89.6634 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (&bzerror,) 53.798 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (\);) 11.9551 Tj 98.488 544.259 Td -(/) 5.97756 Tj +(/) 5.9776 Tj 104.466 542.516 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 114.687 544.259 Td (handle) 35.8654 Tj -426 TJm (error) 29.8878 Tj -188.929 542.516 Td -(*) 5.97756 Tj +188.928 542.516 Td +(*) 5.9776 Tj 194.906 544.259 Td -(/) 5.97756 Tj +(/) 5.9776 Tj 90 532.304 Td -(}) 5.97756 Tj -90 508.394 Td +(}) 5.9776 Tj +90 508.393 Td (bzerror) 41.8429 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (BZ_OK;) 35.8654 Tj 90 496.438 Td (while) 29.8878 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (bzerror) 41.8429 Tj -426 TJm @@ -66463,9 +58535,9 @@ f -426 TJm (&&) 11.9551 Tj -426 TJm -(/) 5.97756 Tj +(/) 5.9776 Tj 252.948 494.695 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 263.17 496.438 Td (arbitrary) 53.798 Tj -426 TJm @@ -66473,19 +58545,19 @@ f -426 TJm (conditions) 59.7756 Tj 419.364 494.695 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 425.341 496.438 Td (/\)) 11.9551 Tj -426 TJm -({) 5.97756 Tj +({) 5.9776 Tj 98.488 484.483 Td (nBuf) 23.9102 Tj -426 TJm -(=) 5.97756 Tj +(=) 5.9776 Tj -426 TJm (BZ2_bzRead) 59.7756 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (&bzerror,) 53.798 Tj -426 TJm @@ -66493,9 +58565,9 @@ f -426 TJm (buf,) 23.9102 Tj -426 TJm -(/) 5.97756 Tj +(/) 5.9776 Tj 319.478 482.74 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 329.7 484.483 Td (size) 23.9102 Tj -426 TJm @@ -66503,15 +58575,15 @@ f -426 TJm (buf) 17.9327 Tj 396.23 482.74 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 402.208 484.483 Td -(/) 5.97756 Tj +(/) 5.9776 Tj -426 TJm (\);) 11.9551 Tj 98.488 472.528 Td (if) 11.9551 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (bzerror) 41.8429 Tj -426 TJm @@ -66519,13 +58591,13 @@ f -426 TJm (BZ_OK) 29.8878 Tj -426 TJm -(\)) 5.97756 Tj +(\)) 5.9776 Tj -426 TJm -({) 5.97756 Tj +({) 5.9776 Tj 106.976 460.573 Td -(/) 5.97756 Tj +(/) 5.9776 Tj 112.953 458.829 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 123.175 460.573 Td (do) 11.9551 Tj -426 TJm @@ -66539,17 +58611,17 @@ f -426 TJm (nBuf-1]) 41.8429 Tj 321.989 458.829 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 327.966 460.573 Td -(/) 5.97756 Tj -98.4879 448.618 Td -(}) 5.97756 Tj -90 436.663 Td -(}) 5.97756 Tj +(/) 5.9776 Tj +98.488 448.618 Td +(}) 5.9776 Tj +90 436.662 Td +(}) 5.9776 Tj 90 424.707 Td (if) 11.9551 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (bzerror) 41.8429 Tj -426 TJm @@ -66557,55 +58629,53 @@ f -426 TJm (BZ_STREAM_END) 77.7083 Tj -426 TJm -(\)) 5.97756 Tj +(\)) 5.9776 Tj -426 TJm -({) 5.97756 Tj +({) 5.9776 Tj 102.732 412.752 Td (BZ2_bzReadClose) 89.6634 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (&bzerror,) 53.798 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (\);) 11.9551 Tj 102.732 400.797 Td -(/) 5.97756 Tj -108.709 399.054 Td -(*) 5.97756 Tj +(/) 5.9776 Tj +108.71 399.053 Td +(*) 5.9776 Tj 118.931 400.797 Td (handle) 35.8654 Tj -426 TJm (error) 29.8878 Tj -193.172 399.054 Td -(*) 5.97756 Tj +193.172 399.053 Td +(*) 5.9776 Tj 199.15 400.797 Td -(/) 5.97756 Tj +(/) 5.9776 Tj 90 388.842 Td -(}) 5.97756 Tj +(}) 5.9776 Tj -426 TJm (else) 23.9102 Tj -426 TJm -({) 5.97756 Tj +({) 5.9776 Tj 102.732 376.887 Td (BZ2_bzReadClose) 89.6634 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (&bzerror,) 53.798 Tj -426 TJm -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (\);) 11.9551 Tj -90 364.932 Td -(}) 5.97756 Tj -[1 0 0 1 72 349.39] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm +90 364.931 Td +(}) 5.9776 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66614,7 +58684,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66643,7 +58712,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66652,17 +58720,13 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -339.427] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 314.637 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (3.5.) 34.4584 Tj -278 TJm (Utility) 57.3893 Tj -278 TJm (functions) 92.9633 Tj -[1 0 0 1 72 310.361] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66707,7 +58771,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66716,29 +58779,13 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -300.398] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 284.016 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.5.1.) 43.0729 Tj -[1 0 0 1 119.858 284.016] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -284.016] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 284.016 Td -/F392_0 17.2154 Tf -(BZ2_bzBuffToBuffCompress) 247.902 Tj -[1 0 0 1 367.76 284.016] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -295.76 -2.3327] cm +-278 TJm +(BZ2_bzBuffT) 106.1502 Tj +80 TJm +(oBuffCompress) 129.1155 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66763,86 +58810,78 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -96.6376] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 95.6413 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 183.815] cm +0 0 468 95.641 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 92.0548] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -272.318] cm [1 0 0 1 0 0] Tm 0 0 Td -90 272.318 Td -/F134_0 9.9626 Tf +90 271.087 Td +/F124_0 9.9626 Tf (int) 17.9327 Tj -426 TJm (BZ2_bzBuffToBuffCompress\() 149.439 Tj -426 TJm (char) 23.9102 Tj -289.771 270.575 Td -(*) 5.97756 Tj -333.944 272.318 Td +289.771 269.344 Td +(*) 5.9776 Tj +333.944 271.087 Td (dest,) 29.8878 Tj -217.319 260.363 Td +217.319 259.132 Td (unsigned) 47.8205 Tj -426 TJm (int) 17.9327 Tj -287.317 258.62 Td -(*) 5.97756 Tj -297.538 260.363 Td +287.317 257.389 Td +(*) 5.9776 Tj +297.538 259.132 Td (destLen,) 47.8205 Tj -217.319 248.408 Td +217.319 247.177 Td (char) 23.9102 Tj -241.23 246.664 Td -(*) 5.97756 Tj -285.403 248.408 Td +241.23 245.434 Td +(*) 5.9776 Tj +285.403 247.177 Td (source,) 41.8429 Tj -217.319 236.453 Td +217.319 235.222 Td (unsigned) 47.8205 Tj -426 TJm (int) 17.9327 Tj -852 TJm (sourceLen,) 59.7756 Tj -217.319 224.498 Td +217.319 223.267 Td (int) 17.9327 Tj -4686 TJm (blockSize100k,) 83.6858 Tj -217.319 212.542 Td +217.319 211.312 Td (int) 17.9327 Tj -4686 TJm (verbosity,) 59.7756 Tj -217.319 200.587 Td +217.319 199.356 Td (int) 17.9327 Tj -4686 TJm (workFactor) 59.7756 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 185.045] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -66851,16 +58890,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -175.083] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 163.128 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 161.897 Td +/F122_0 9.9626 Tf (Attempts) 36.5329 Tj -442 TJm (to) 7.7509 Tj @@ -66872,74 +58911,60 @@ f (data) 16.5977 Tj -442 TJm (in) 7.7509 Tj -[1 0 0 1 216.87 163.128] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -216.87 -163.128] cm -[1 0 0 1 0 0] Tm -0 0 Td -216.87 163.128 Td -/F134_0 9.9626 Tf +216.87 161.897 Td +/F124_0 9.9626 Tf (source[0) 47.8205 Tj -600 TJm (..) 11.9551 Tj -1200 TJm (sourceLen-1]) 71.7307 Tj -[1 0 0 1 366.31 163.128] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -366.31 -163.128] cm -[1 0 0 1 0 0] Tm -0 0 Td -370.715 163.128 Td -/F130_0 9.9626 Tf +370.715 161.897 Td +/F122_0 9.9626 Tf (into) 15.5018 Tj -442 TJm (the) 12.1743 Tj --442 TJm -(destination) 43.7259 Tj +-443 TJm +(dest) 16.0497 Tj +1 TJm +(ination) 27.6761 Tj -443 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj 40 TJm -(,) 2.49065 Tj -[1 0 0 1 486.202 163.128] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -486.202 -163.128] cm -[1 0 0 1 0 0] Tm -0 0 Td -486.202 163.128 Td -/F134_0 9.9626 Tf +486.202 161.897 Td +/F124_0 9.9626 Tf (dest[0) 35.8654 Tj -600 TJm (..) 11.9551 Tj -72 149.429 Td -(*) 5.97756 Tj -77.9776 151.173 Td +72 148.198 Td +(*) 5.9776 Tj +77.978 149.942 Td (destLen-1]) 59.7756 Tj -[1 0 0 1 137.753 151.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -137.753 -151.172] cm -[1 0 0 1 0 0] Tm -0 0 Td -137.753 151.172 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +137.753 149.942 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj -1393 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -379 TJm (the) 12.1743 Tj -379 TJm @@ -66947,39 +58972,31 @@ f -379 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -378 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -379 TJm (big) 12.7322 Tj -379 TJm (enough,) 31.8205 Tj -[1 0 0 1 318.486 151.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -318.486 -151.172] cm -[1 0 0 1 0 0] Tm -0 0 Td -318.486 149.429 Td -/F134_0 9.9626 Tf -(*) 5.97756 Tj -324.464 151.173 Td +318.487 148.198 Td +/F124_0 9.9626 Tf +(*) 5.9776 Tj +324.464 149.942 Td (destLen) 41.8429 Tj -[1 0 0 1 366.307 151.172] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -366.307 -151.172] cm -[1 0 0 1 0 0] Tm -0 0 Td -370.081 151.172 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +370.082 149.942 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -379 TJm (set) 11.0684 Tj -379 TJm @@ -66989,41 +59006,33 @@ f -379 TJm (size) 15.4918 Tj -379 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -379 TJm (the) 12.1743 Tj -379 TJm (compressed) 47.0334 Tj -379 TJm (data,) 19.0883 Tj -72 139.217 Td +72 137.986 Td (and) 14.386 Tj -[1 0 0 1 89.5273 139.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -89.5273 -139.217] cm -[1 0 0 1 0 0] Tm -0 0 Td -89.5273 139.217 Td -/F134_0 9.9626 Tf +89.527 137.986 Td +/F124_0 9.9626 Tf (BZ_OK) 29.8878 Tj -[1 0 0 1 119.415 139.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -119.415 -139.217] cm -[1 0 0 1 0 0] Tm -0 0 Td -122.556 139.217 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +122.556 137.986 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -315 TJm (returned.) 35.686 Tj -1012 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -315 TJm (the) 12.1743 Tj -316 TJm @@ -67038,73 +59047,51 @@ f (t) 2.7696 Tj -316 TJm (\002t,) 10.7995 Tj -[1 0 0 1 313.322 139.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -313.322 -139.217] cm -[1 0 0 1 0 0] Tm -0 0 Td -313.322 137.474 Td -/F134_0 9.9626 Tf -(*) 5.97756 Tj -319.3 139.217 Td +313.323 136.243 Td +/F124_0 9.9626 Tf +(*) 5.9776 Tj +319.3 137.986 Td (destLen) 41.8429 Tj -[1 0 0 1 361.143 139.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -361.143 -139.217] cm -[1 0 0 1 0 0] Tm -0 0 Td -364.284 139.217 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +364.285 137.986 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -315 TJm (unchanged,) 45.6486 Tj -332 TJm (and) 14.386 Tj -[1 0 0 1 440.551 139.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -440.551 -139.217] cm -[1 0 0 1 0 0] Tm -0 0 Td -440.551 139.217 Td -/F134_0 9.9626 Tf +440.551 137.986 Td +/F124_0 9.9626 Tf (BZ_OUTBUFF_FULL) 89.6634 Tj -[1 0 0 1 530.215 139.217] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -530.215 -139.217] cm -[1 0 0 1 0 0] Tm -0 0 Td -533.355 139.217 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj -72 127.262 Td +533.355 137.986 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj +72 126.031 Td (returned.) 35.686 Tj -[1 0 0 1 72 127.163] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -117.2] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 105.344 Td -/F130_0 9.9626 Tf +72 104.113 Td (Compression) 52.5826 Tj -297 TJm (in) 7.7509 Tj @@ -67113,13 +59100,13 @@ f -297 TJm (manner) 29.8778 Tj -297 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -297 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -297 TJm (one-shot) 34.3112 Tj -297 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm @@ -67129,7 +59116,7 @@ f -297 TJm (with) 17.7135 Tj -297 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -297 TJm (single) 23.8007 Tj -297 TJm @@ -67146,35 +59133,27 @@ f (resulting) 34.8691 Tj -297 TJm (compressed) 47.0334 Tj -72 93.3892 Td +72 92.158 Td (data) 16.5977 Tj -296 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -296 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -296 TJm (complete) 36.5229 Tj -[1 0 0 1 147.988 93.3892] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -147.988 -93.3892] cm -[1 0 0 1 0 0] Tm -0 0 Td -147.988 93.3892 Td -/F134_0 9.9626 Tf +147.988 92.158 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 177.875 93.3892] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -177.875 -93.3892] cm -[1 0 0 1 0 0] Tm -0 0 Td -180.825 93.3892 Td -/F130_0 9.9626 Tf +180.825 92.158 Td +/F122_0 9.9626 Tf (format) 26.5603 Tj -296 TJm (data) 16.5977 Tj @@ -67183,7 +59162,7 @@ f -897 TJm (There) 23.2328 Tj -296 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -296 TJm (no) 9.9626 Tj -296 TJm @@ -67203,15 +59182,15 @@ f 15 TJm (vide) 17.1556 Tj -296 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xtra) 15.4918 Tj -72 81.434 Td +72 80.203 Td (input) 20.4831 Tj -250 TJm (data.) 19.0883 Tj -620 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -250 TJm (you) 14.9439 Tj -250 TJm @@ -67223,7 +59202,7 @@ f -250 TJm (kind) 17.7135 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (mechanism,) 47.8703 Tj -250 TJm @@ -67242,22 +59221,14 @@ f (interf) 21.579 Tj 10 TJm (ace.) 15.7608 Tj -[1 0 0 1 72 79.2772] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -28.4254] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -67282,7 +59253,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -67291,12 +59261,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -67305,18 +59269,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (26) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -67325,7 +59291,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -67334,12 +59299,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -67348,7 +59311,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 30 30 +%%Page: 27 30 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -67366,20 +59329,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -67404,7 +59363,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -67413,12 +59371,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -67427,36 +59379,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -67465,7 +59413,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -67474,161 +59421,122 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -21.5542] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +/F122_0 9.9626 Tf +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -223 TJm (the) 12.1743 Tj -224 TJm (meaning) 34.3112 Tj -223 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -224 TJm (parameters) 43.7059 Tj -[1 0 0 1 195.306 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -195.306 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 195.306 710.037 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (blockSize100k) 77.7083 Tj -[1 0 0 1 273.015 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -273.015 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 273.015 710.037 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 277.784 710.037] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -277.784 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 277.784 710.037 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (verbosity) 53.798 Tj -[1 0 0 1 331.583 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -331.583 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 333.808 710.037 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 350.42 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -350.42 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 350.42 710.037 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (workFactor) 59.7756 Tj -[1 0 0 1 410.196 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -410.196 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 410.196 710.037 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -229 TJm (see) 12.7222 Tj -[1 0 0 1 429.913 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -429.913 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 429.913 710.037 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 537.509 710.037] cm +/F124_0 9.9626 Tf +(BZ2_bzCompressInit) 107.5961 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -537.509 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 537.509 710.037 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 707.88] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -697.918] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 688.12 Td -/F130_0 9.9626 Tf -(T) 6.08715 Tj +(T) 6.0871 Tj 80 TJm (o) 4.9813 Tj -410 TJm @@ -67644,33 +59552,33 @@ Q -410 TJm (will) 15.5018 Tj -410 TJm -(\002t) 8.30881 Tj +(\002t) 8.3088 Tj -410 TJm (in) 7.7509 Tj -410 TJm -(its) 9.41466 Tj +(its) 9.4147 Tj -410 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -450 TJm (allocate) 30.9837 Tj -410 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -410 TJm (output) 25.4644 Tj -410 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -411 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -410 TJm (size) 15.4918 Tj -410 TJm @@ -67694,17 +59602,11 @@ Q -250 TJm (hundred) 32.6474 Tj -250 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xtra) 15.4918 Tj -250 TJm (bytes.) 23.5217 Tj -[1 0 0 1 72 674.007] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -67713,22 +59615,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -664.045] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 654.247 Td -/F134_0 9.9626 Tf -(BZ2_bzBuffToBuffDecompress) 155.417 Tj -[1 0 0 1 227.417 654.247] cm +/F124_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.4166 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -227.417 -654.247] cm -[1 0 0 1 0 0] Tm -0 0 Td 230.553 654.247 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (will) 15.5018 Tj -315 TJm (not) 12.7322 Tj @@ -67739,53 +59638,45 @@ Q -315 TJm (at) 7.193 Tj -315 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -315 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj 15 TJm (yond) 19.9252 Tj -[1 0 0 1 362.484 654.247] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -362.484 -654.247] cm -[1 0 0 1 0 0] Tm -0 0 Td 362.484 654.247 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (dest[) 29.8878 Tj 392.372 652.503 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 398.349 654.247 Td (destLen]) 47.8205 Tj -[1 0 0 1 446.17 654.247] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -446.17 -654.247] cm -[1 0 0 1 0 0] Tm -0 0 Td 446.17 654.247 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -331 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(en) 9.40469 Tj +(en) 9.4047 Tj -315 TJm (in) 7.7509 Tj -315 TJm (case) 17.1456 Tj -314 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -315 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj 72 642.291 Td @@ -67797,22 +59688,16 @@ Q 25 TJm (w) 7.193 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 642.192] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -632.229] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 620.374 Td -/F130_0 9.9626 Tf (Possible) 33.2153 Tj -250 TJm (return) 23.7907 Tj @@ -67820,44 +59705,41 @@ Q (v) 4.9813 Tj 25 TJm (alues:) 23.2427 Tj -[1 0 0 1 72 620.274] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -168.369] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 451.905] cm 0 0 468 167.372 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 163.786] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -610.909] cm [1 0 0 1 0 0] Tm 0 0 Td 90 610.909 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_CONFIG_ERROR) 89.6634 Tj -98.4879 598.954 Td +98.488 598.954 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -67871,7 +59753,7 @@ f (mis-compiled) 71.7307 Tj 90 586.999 Td (BZ_PARAM_ERROR) 83.6858 Tj -98.4879 575.044 Td +98.488 575.044 Td (if) 11.9551 Tj -426 TJm (dest) 23.9102 Tj @@ -67887,57 +59769,57 @@ f (is) 11.9551 Tj -426 TJm (NULL) 23.9102 Tj -98.4879 563.088 Td +98.488 563.089 Td (or) 11.9551 Tj -426 TJm (blockSize100k) 77.7083 Tj -426 TJm -(<) 5.97756 Tj +(<) 5.9776 Tj -426 TJm -(1) 5.97756 Tj +(1) 5.9776 Tj -426 TJm (or) 11.9551 Tj -426 TJm (blockSize100k) 77.7083 Tj -426 TJm -(>) 5.97756 Tj +(>) 5.9776 Tj -426 TJm -(9) 5.97756 Tj -98.4879 551.133 Td +(9) 5.9776 Tj +98.488 551.133 Td (or) 11.9551 Tj -426 TJm (verbosity) 53.798 Tj -426 TJm -(<) 5.97756 Tj +(<) 5.9776 Tj -426 TJm -(0) 5.97756 Tj +(0) 5.9776 Tj -426 TJm (or) 11.9551 Tj -426 TJm (verbosity) 53.798 Tj -426 TJm -(>) 5.97756 Tj +(>) 5.9776 Tj -426 TJm -(4) 5.97756 Tj -98.4879 539.178 Td +(4) 5.9776 Tj +98.488 539.178 Td (or) 11.9551 Tj -426 TJm (workFactor) 59.7756 Tj -426 TJm -(<) 5.97756 Tj +(<) 5.9776 Tj -426 TJm -(0) 5.97756 Tj +(0) 5.9776 Tj -426 TJm (or) 11.9551 Tj -426 TJm (workFactor) 59.7756 Tj -426 TJm -(>) 5.97756 Tj +(>) 5.9776 Tj -426 TJm (250) 17.9327 Tj 90 527.223 Td (BZ_MEM_ERROR) 71.7307 Tj -98.4879 515.268 Td +98.488 515.268 Td (if) 11.9551 Tj -426 TJm (insufficient) 71.7307 Tj @@ -67949,7 +59831,7 @@ f (available) 53.798 Tj 90 503.313 Td (BZ_OUTBUFF_FULL) 89.6634 Tj -98.4879 491.357 Td +98.488 491.357 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -67966,28 +59848,13 @@ f -426 TJm (exceeds) 41.8429 Tj 341.655 489.614 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 347.633 491.357 Td (destLen) 41.8429 Tj 90 479.402 Td (BZ_OK) 29.8878 Tj -98.4879 467.447 Td +98.488 467.447 Td (otherwise) 53.798 Tj -[1 0 0 1 72 451.905] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -68012,7 +59879,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -68021,29 +59887,25 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -441.943] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 421.284 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.5.2.) 43.0729 Tj -[1 0 0 1 119.858 421.284] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -119.858 -421.284] cm -[1 0 0 1 0 0] Tm -0 0 Td -119.858 421.284 Td -/F392_0 17.2154 Tf -(BZ2_bzBuffToBuffDecompress) 268.56 Tj -[1 0 0 1 388.419 421.284] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -316.419 -2.3327] cm +-278 TJm +(BZ2_bzBuffT) 106.1502 Tj +80 TJm +(oBuffDecompress) 148.259 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -68068,82 +59930,74 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -84.6824] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 83.6862 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 333.038] cm +0 0 468 83.686 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 80.0996] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -409.587] cm [1 0 0 1 0 0] Tm 0 0 Td -90 409.587 Td -/F134_0 9.9626 Tf +90 408.356 Td +/F124_0 9.9626 Tf (int) 17.9327 Tj -426 TJm -(BZ2_bzBuffToBuffDecompress\() 161.394 Tj +(BZ2_bzBuffToBuffDecompress\() 161.3941 Tj -426 TJm (char) 23.9102 Tj -301.726 407.843 Td -(*) 5.97756 Tj -345.899 409.587 Td +301.726 406.612 Td +(*) 5.9776 Tj +345.899 408.356 Td (dest,) 29.8878 Tj -225.807 397.632 Td +225.807 396.401 Td (unsigned) 47.8205 Tj -426 TJm (int) 17.9327 Tj -295.805 395.888 Td -(*) 5.97756 Tj -306.026 397.632 Td +295.805 394.657 Td +(*) 5.9776 Tj +306.026 396.401 Td (destLen,) 47.8205 Tj -225.807 385.676 Td +225.807 384.446 Td (char) 23.9102 Tj -249.718 383.933 Td -(*) 5.97756 Tj -293.891 385.676 Td +249.717 382.702 Td +(*) 5.9776 Tj +293.891 384.446 Td (source,) 41.8429 Tj -225.807 373.721 Td +225.807 372.49 Td (unsigned) 47.8205 Tj -426 TJm (int) 17.9327 Tj -852 TJm (sourceLen,) 59.7756 Tj -225.807 361.766 Td +225.807 360.535 Td (int) 17.9327 Tj -4686 TJm (small,) 35.8654 Tj -225.807 349.811 Td +225.807 348.58 Td (int) 17.9327 Tj -4686 TJm (verbosity) 53.798 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 334.269] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -68152,16 +60006,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -324.306] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 312.351 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 311.12 Td +/F122_0 9.9626 Tf (Attempts) 36.5329 Tj -358 TJm (to) 7.7509 Tj @@ -68173,31 +60027,23 @@ f (data) 16.5977 Tj -359 TJm (in) 7.7509 Tj -[1 0 0 1 221.259 312.351] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -221.259 -312.351] cm -[1 0 0 1 0 0] Tm -0 0 Td -221.259 312.351 Td -/F134_0 9.9626 Tf +221.259 311.12 Td +/F124_0 9.9626 Tf (source[0) 47.8205 Tj -600 TJm (..) 11.9551 Tj -1200 TJm (sourceLen-1]) 71.7307 Tj -[1 0 0 1 370.698 312.351] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -370.698 -312.351] cm -[1 0 0 1 0 0] Tm -0 0 Td -374.268 312.351 Td -/F130_0 9.9626 Tf +374.268 311.12 Td +/F122_0 9.9626 Tf (into) 15.5018 Tj -358 TJm (the) 12.1743 Tj @@ -68206,41 +60052,33 @@ f -358 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj 40 TJm -(,) 2.49065 Tj -[1 0 0 1 486.202 312.351] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -486.202 -312.351] cm -[1 0 0 1 0 0] Tm -0 0 Td -486.202 312.351 Td -/F134_0 9.9626 Tf +486.202 311.12 Td +/F124_0 9.9626 Tf (dest[0) 35.8654 Tj -600 TJm (..) 11.9551 Tj -72 298.653 Td -(*) 5.97756 Tj -77.9776 300.396 Td +72 297.422 Td +(*) 5.9776 Tj +77.978 299.165 Td (destLen-1]) 59.7756 Tj -[1 0 0 1 137.753 300.396] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -137.753 -300.396] cm -[1 0 0 1 0 0] Tm -0 0 Td -137.753 300.396 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +137.753 299.165 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj -1123 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -334 TJm (the) 12.1743 Tj -334 TJm @@ -68248,39 +60086,31 @@ f -334 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -334 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -334 TJm (big) 12.7322 Tj -334 TJm (enough,) 31.8205 Tj -[1 0 0 1 312.554 300.396] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -312.554 -300.396] cm -[1 0 0 1 0 0] Tm -0 0 Td -312.554 298.653 Td -/F134_0 9.9626 Tf -(*) 5.97756 Tj -318.531 300.396 Td +312.554 297.422 Td +/F124_0 9.9626 Tf +(*) 5.9776 Tj +318.531 299.165 Td (destLen) 41.8429 Tj -[1 0 0 1 360.374 300.396] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -360.374 -300.396] cm -[1 0 0 1 0 0] Tm -0 0 Td -363.701 300.396 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +363.701 299.165 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -334 TJm (set) 11.0684 Tj -334 TJm @@ -68290,41 +60120,33 @@ f -334 TJm (size) 15.4918 Tj -333 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -334 TJm (the) 12.1743 Tj -334 TJm (uncompressed) 56.996 Tj -334 TJm (data,) 19.0883 Tj -72 288.441 Td +72 287.21 Td (and) 14.386 Tj -[1 0 0 1 89.5273 288.441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -89.5273 -288.441] cm -[1 0 0 1 0 0] Tm -0 0 Td -89.5273 288.441 Td -/F134_0 9.9626 Tf +89.527 287.21 Td +/F124_0 9.9626 Tf (BZ_OK) 29.8878 Tj -[1 0 0 1 119.415 288.441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -119.415 -288.441] cm -[1 0 0 1 0 0] Tm -0 0 Td -122.556 288.441 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +122.556 287.21 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -315 TJm (returned.) 35.686 Tj -1012 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -315 TJm (the) 12.1743 Tj -316 TJm @@ -68339,64 +60161,42 @@ f (t) 2.7696 Tj -316 TJm (\002t,) 10.7995 Tj -[1 0 0 1 313.322 288.441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -313.322 -288.441] cm -[1 0 0 1 0 0] Tm -0 0 Td -313.322 286.698 Td -/F134_0 9.9626 Tf -(*) 5.97756 Tj -319.3 288.441 Td +313.323 285.467 Td +/F124_0 9.9626 Tf +(*) 5.9776 Tj +319.3 287.21 Td (destLen) 41.8429 Tj -[1 0 0 1 361.143 288.441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -361.143 -288.441] cm -[1 0 0 1 0 0] Tm -0 0 Td -364.284 288.441 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +364.285 287.21 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -315 TJm (unchanged,) 45.6486 Tj -332 TJm (and) 14.386 Tj -[1 0 0 1 440.551 288.441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -440.551 -288.441] cm -[1 0 0 1 0 0] Tm -0 0 Td -440.551 288.441 Td -/F134_0 9.9626 Tf +440.551 287.21 Td +/F124_0 9.9626 Tf (BZ_OUTBUFF_FULL) 89.6634 Tj -[1 0 0 1 530.215 288.441] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -530.215 -288.441] cm -[1 0 0 1 0 0] Tm -0 0 Td -533.355 288.441 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj -72 276.486 Td +533.355 287.21 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj +72 275.255 Td (returned.) 35.686 Tj -[1 0 0 1 72 276.386] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -68405,23 +60205,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -266.424] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 254.568 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 253.337 Td +/F124_0 9.9626 Tf (source) 35.8654 Tj -[1 0 0 1 107.865 254.568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -107.865 -254.568] cm -[1 0 0 1 0 0] Tm -0 0 Td -110.981 254.568 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +110.981 253.337 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -313 TJm (assumed) 34.3112 Tj -312 TJm @@ -68429,67 +60226,51 @@ f -313 TJm (hold) 17.7135 Tj -313 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -313 TJm (complete) 36.5229 Tj -[1 0 0 1 237.04 254.568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -237.04 -254.568] cm -[1 0 0 1 0 0] Tm -0 0 Td -237.04 254.568 Td -/F134_0 9.9626 Tf +237.04 253.337 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 266.928 254.568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -266.928 -254.568] cm -[1 0 0 1 0 0] Tm -0 0 Td -270.044 254.568 Td -/F130_0 9.9626 Tf +270.044 253.337 Td +/F122_0 9.9626 Tf (format) 26.5603 Tj -313 TJm (data) 16.5977 Tj -312 TJm (stream.) 29.0509 Tj -[1 0 0 1 353.446 254.568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -353.446 -254.568] cm -[1 0 0 1 0 0] Tm -0 0 Td -353.446 254.568 Td -/F134_0 9.9626 Tf -(BZ2_bzBuffToBuffDecompress) 155.417 Tj -[1 0 0 1 508.863 254.568] cm +353.446 253.337 Td +/F124_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.4166 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -508.863 -254.568] cm -[1 0 0 1 0 0] Tm -0 0 Td -511.978 254.568 Td -/F130_0 9.9626 Tf +511.978 253.337 Td +/F122_0 9.9626 Tf (tries) 17.1556 Tj -313 TJm (to) 7.7509 Tj -72 242.613 Td +72 241.382 Td (decompress) 47.0334 Tj -250 TJm (the) 12.1743 Tj -250 TJm (entirety) 30.4357 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm @@ -68503,120 +60284,84 @@ f -250 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj 55 TJm -(.) 2.49065 Tj -[1 0 0 1 72 240.456] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -230.493] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 220.695 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +72 219.464 Td +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm (meaning) 34.3112 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (parameters) 43.7059 Tj -[1 0 0 1 196.631 220.695] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -196.631 -220.695] cm -[1 0 0 1 0 0] Tm -0 0 Td -196.631 220.695 Td -/F134_0 9.9626 Tf +196.631 219.464 Td +/F124_0 9.9626 Tf (small) 29.8878 Tj -[1 0 0 1 226.519 220.695] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -226.519 -220.695] cm -[1 0 0 1 0 0] Tm -0 0 Td -229.01 220.695 Td -/F130_0 9.9626 Tf +229.01 219.464 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 245.887 220.695] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -245.887 -220.695] cm -[1 0 0 1 0 0] Tm -0 0 Td -245.887 220.695 Td -/F134_0 9.9626 Tf +245.887 219.464 Td +/F124_0 9.9626 Tf (verbosity) 53.798 Tj -[1 0 0 1 299.685 220.695] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -299.685 -220.695] cm -[1 0 0 1 0 0] Tm -0 0 Td -299.685 220.695 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +299.685 219.464 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj -250 TJm (see) 12.7222 Tj -[1 0 0 1 319.879 220.695] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -319.879 -220.695] cm -[1 0 0 1 0 0] Tm -0 0 Td -319.879 220.695 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompressInit) 119.551 Tj -[1 0 0 1 439.431 220.695] cm +319.879 219.464 Td +/F124_0 9.9626 Tf +(BZ2_bzDecompressInit) 119.5512 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -439.431 -220.695] cm -[1 0 0 1 0 0] Tm -0 0 Td -439.431 220.695 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 218.538] cm +439.431 219.464 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -208.576] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 198.777 Td -/F130_0 9.9626 Tf +72 197.546 Td (Because) 33.1954 Tj -250 TJm (the) 12.1743 Tj @@ -68625,7 +60370,7 @@ f -250 TJm (ratio) 18.2614 Tj -249 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -249 TJm @@ -68635,7 +60380,7 @@ f -249 TJm (cannot) 26.5603 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (kno) 14.9439 Tj 25 TJm @@ -68649,7 +60394,7 @@ f -249 TJm (there) 19.9152 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -249 TJm (no) 9.9626 Tj -250 TJm @@ -68657,12 +60402,12 @@ f -250 TJm (w) 7.193 Tj 10 TJm -(ay) 9.40469 Tj +(ay) 9.4047 Tj -249 TJm (to) 7.7509 Tj -250 TJm (guarantee) 38.7246 Tj -72 186.822 Td +72 185.591 Td (that) 14.9439 Tj -286 TJm (the) 12.1743 Tj @@ -68671,13 +60416,13 @@ f -286 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -287 TJm (will) 15.5018 Tj -286 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -286 TJm (big) 12.7322 Tj -287 TJm @@ -68689,13 +60434,13 @@ f -287 TJm (may) 17.1556 Tj -286 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -287 TJm (course) 26.0024 Tj -286 TJm (mak) 17.1556 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -286 TJm (arrangements) 53.6685 Tj -287 TJm @@ -68713,8 +60458,8 @@ f -286 TJm (size) 15.4918 Tj -287 TJm -(of) 8.29885 Tj -72 174.867 Td +(of) 8.2988 Tj +72 173.636 Td (the) 12.1743 Tj -250 TJm (uncompressed) 56.996 Tj @@ -68727,13 +60472,13 @@ f -250 TJm (such) 18.2614 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (mechanism) 45.3796 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj 15 TJm (yond) 19.9252 Tj -250 TJm @@ -68741,19 +60486,13 @@ f -250 TJm (scope) 22.6848 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (this) 14.396 Tj -250 TJm (library) 26.5603 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 172.71] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9626] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -68762,22 +60501,19 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -162.747] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 152.949 Td -/F134_0 9.9626 Tf -(BZ2_bzBuffToBuffDecompress) 155.417 Tj -[1 0 0 1 227.417 152.949] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -227.417 -152.949] cm -[1 0 0 1 0 0] Tm -0 0 Td -230.553 152.949 Td -/F130_0 9.9626 Tf +72 151.718 Td +/F124_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.4166 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +230.553 151.718 Td +/F122_0 9.9626 Tf (will) 15.5018 Tj -315 TJm (not) 12.7322 Tj @@ -68788,56 +60524,48 @@ f -315 TJm (at) 7.193 Tj -315 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -315 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj 15 TJm (yond) 19.9252 Tj -[1 0 0 1 362.484 152.949] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -362.484 -152.949] cm -[1 0 0 1 0 0] Tm -0 0 Td -362.484 152.949 Td -/F134_0 9.9626 Tf +362.484 151.718 Td +/F124_0 9.9626 Tf (dest[) 29.8878 Tj -392.372 151.206 Td -(*) 5.97756 Tj -398.349 152.949 Td +392.372 149.975 Td +(*) 5.9776 Tj +398.349 151.718 Td (destLen]) 47.8205 Tj -[1 0 0 1 446.17 152.949] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -446.17 -152.949] cm -[1 0 0 1 0 0] Tm -0 0 Td -446.17 152.949 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +446.17 151.718 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj -331 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(en) 9.40469 Tj +(en) 9.4047 Tj -315 TJm (in) 7.7509 Tj -315 TJm (case) 17.1456 Tj -314 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -315 TJm (b) 4.9813 Tj 20 TJm -(uf) 8.29885 Tj +(uf) 8.2988 Tj 25 TJm (fer) 11.0585 Tj -72 140.994 Td +72 139.763 Td (o) 4.9813 Tj 15 TJm (v) 4.9813 Tj @@ -68846,22 +60574,16 @@ f 25 TJm (w) 7.193 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 140.894] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -130.932] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 119.076 Td -/F130_0 9.9626 Tf +72 117.845 Td (Possible) 33.2153 Tj -250 TJm (return) 23.7907 Tj @@ -68869,22 +60591,14 @@ f (v) 4.9813 Tj 25 TJm (alues:) 23.2427 Tj -[1 0 0 1 72 118.977] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -68.1248] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -68909,7 +60623,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -68918,12 +60631,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -68932,18 +60639,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (27) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -68952,7 +60661,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -68961,12 +60669,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -68975,7 +60681,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 31 31 +%%Page: 28 31 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -68993,20 +60699,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 4.3836 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -69031,7 +60733,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -69040,12 +60741,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -69054,36 +60749,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -344.462 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 420.96 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 498.449 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -498.449 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 498.449 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 546.269 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -69092,7 +60783,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -69101,67 +60791,66 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 75.786 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -15.0365 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -248.702] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 492.852] cm 0 0 468 227.148 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 223.562] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -711.631] cm [1 0 0 1 0 0] Tm 0 0 Td 90 711.631 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_CONFIG_ERROR) 89.6634 Tj -98.4879 699.676 Td +98.488 699.676 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -69175,7 +60864,7 @@ f (mis-compiled) 71.7307 Tj 90 687.721 Td (BZ_PARAM_ERROR) 83.6858 Tj -98.4879 675.766 Td +98.488 675.766 Td (if) 11.9551 Tj -426 TJm (dest) 23.9102 Tj @@ -69191,14 +60880,14 @@ f (is) 11.9551 Tj -426 TJm (NULL) 23.9102 Tj -98.4879 663.811 Td +98.488 663.811 Td (or) 11.9551 Tj -426 TJm (small) 29.8878 Tj -426 TJm (!=) 11.9551 Tj -426 TJm -(0) 5.97756 Tj +(0) 5.9776 Tj -426 TJm (&&) 11.9551 Tj -426 TJm @@ -69206,26 +60895,26 @@ f -426 TJm (!=) 11.9551 Tj -426 TJm -(1) 5.97756 Tj -98.4879 651.856 Td +(1) 5.9776 Tj +98.488 651.856 Td (or) 11.9551 Tj -426 TJm (verbosity) 53.798 Tj -426 TJm -(<) 5.97756 Tj +(<) 5.9776 Tj -426 TJm -(0) 5.97756 Tj +(0) 5.9776 Tj -426 TJm (or) 11.9551 Tj -426 TJm (verbosity) 53.798 Tj -426 TJm -(>) 5.97756 Tj +(>) 5.9776 Tj -426 TJm -(4) 5.97756 Tj +(4) 5.9776 Tj 90 639.9 Td (BZ_MEM_ERROR) 71.7307 Tj -98.4879 627.945 Td +98.488 627.945 Td (if) 11.9551 Tj -426 TJm (insufficient) 71.7307 Tj @@ -69237,7 +60926,7 @@ f (available) 53.798 Tj 90 615.99 Td (BZ_OUTBUFF_FULL) 89.6634 Tj -98.4879 604.035 Td +98.488 604.035 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -69254,15 +60943,15 @@ f -426 TJm (exceeds) 41.8429 Tj 341.655 602.291 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 347.633 604.035 Td (destLen) 41.8429 Tj 90 592.08 Td (BZ_DATA_ERROR) 77.7083 Tj -98.4879 580.125 Td +98.488 580.124 Td (if) 11.9551 Tj -426 TJm -(a) 5.97756 Tj +(a) 5.9776 Tj -426 TJm (data) 23.9102 Tj -426 TJm @@ -69282,8 +60971,8 @@ f -426 TJm (data) 23.9102 Tj 90 568.169 Td -(BZ_DATA_ERROR_MAGIC) 113.574 Tj -98.4879 556.214 Td +(BZ_DATA_ERROR_MAGIC) 113.5736 Tj +98.488 556.214 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -69306,8 +60995,8 @@ f -426 TJm (bytes) 29.8878 Tj 90 544.259 Td -(BZ_UNEXPECTED_EOF) 101.619 Tj -98.4879 532.304 Td +(BZ_UNEXPECTED_EOF) 101.6185 Tj +98.488 532.304 Td (if) 11.9551 Tj -426 TJm (the) 17.9327 Tj @@ -69321,14 +61010,8 @@ f (unexpectedly) 71.7307 Tj 90 520.349 Td (BZ_OK) 29.8878 Tj -98.4879 508.394 Td +98.488 508.393 Td (otherwise) 53.798 Tj -[1 0 0 1 72 492.852] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -69337,7 +61020,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -69366,7 +61052,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -69375,37 +61060,15 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -482.889] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 458.099 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (3.6.) 34.4584 Tj -[1 0 0 1 112.201 458.099] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -112.201 -458.099] cm -[1 0 0 1 0 0] Tm -0 0 Td -112.201 458.099 Td -/F392_0 20.6585 Tf -(zlib) 49.5804 Tj -[1 0 0 1 161.781 458.099] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -161.781 -458.099] cm -[1 0 0 1 0 0] Tm -0 0 Td -167.524 458.099 Td -/F122_0 20.6585 Tf -(compatibility) 127.422 Tj +-278 TJm +(zlib) 34.4377 Tj +-278 TJm +(compatibility) 127.4216 Tj -278 TJm (functions) 92.9633 Tj -[1 0 0 1 72 453.823] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -69430,16 +61093,12 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -443.86] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 436.181 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Y) 7.193 Tj 110 TJm (oshioka) 30.9936 Tj @@ -69462,198 +61121,132 @@ f 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -604 TJm (better) 22.6848 Tj -[1 0 0 1 356.347 436.181] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -356.347 -436.181] cm -[1 0 0 1 0 0] Tm -0 0 Td 356.347 436.181 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (zlib) 23.9102 Tj -[1 0 0 1 380.257 436.181] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -380.257 -436.181] cm -[1 0 0 1 0 0] Tm -0 0 Td 386.275 436.181 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (compatibility) 53.1405 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -1372 TJm (These) 23.7907 Tj -604 TJm (functions) 37.0808 Tj -604 TJm (are) 12.1643 Tj -[1 0 0 1 72 424.226] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -424.226] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 424.226 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzopen) 59.7756 Tj -[1 0 0 1 131.776 424.226] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -131.776 -424.226] cm -[1 0 0 1 0 0] Tm -0 0 Td 131.776 424.226 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 144.283 424.226] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -144.283 -424.226] cm -[1 0 0 1 0 0] Tm -0 0 Td 144.283 424.226 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzread) 59.7756 Tj -[1 0 0 1 204.059 424.226] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -204.059 -424.226] cm -[1 0 0 1 0 0] Tm -0 0 Td 204.059 424.226 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 216.566 424.226] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -216.566 -424.226] cm -[1 0 0 1 0 0] Tm -0 0 Td -216.566 424.226 Td -/F134_0 9.9626 Tf +216.567 424.226 Td +/F124_0 9.9626 Tf (BZ2_bzwrite) 65.7532 Tj -[1 0 0 1 282.32 424.226] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -282.32 -424.226] cm -[1 0 0 1 0 0] Tm -0 0 Td 282.32 424.226 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 294.827 424.226] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -294.827 -424.226] cm -[1 0 0 1 0 0] Tm -0 0 Td 294.827 424.226 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzflush) 65.7532 Tj -[1 0 0 1 360.581 424.226] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -360.581 -424.226] cm -[1 0 0 1 0 0] Tm -0 0 Td 360.581 424.226 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 373.088 424.226] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -373.088 -424.226] cm -[1 0 0 1 0 0] Tm -0 0 Td 373.088 424.226 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzclose) 65.7532 Tj -[1 0 0 1 438.842 424.226] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -438.842 -424.226] cm -[1 0 0 1 0 0] Tm -0 0 Td 438.842 424.226 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 451.349 424.226] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -451.349 -424.226] cm -[1 0 0 1 0 0] Tm -0 0 Td 451.349 424.226 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzerror) 65.7532 Tj -[1 0 0 1 517.102 424.226] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -517.102 -424.226] cm -[1 0 0 1 0 0] Tm -0 0 Td 525.614 424.226 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 72 412.271] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -412.271] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 412.271 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzlibVersion) 95.641 Tj -[1 0 0 1 167.641 412.271] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -167.641 -412.271] cm -[1 0 0 1 0 0] Tm -0 0 Td 167.641 412.271 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -1420 TJm -(Thes) 19.3673 Tj -1 TJm -(e) 4.42339 Tj --384 TJm +(These) 23.7907 Tj +-383 TJm (functions) 37.0808 Tj -383 TJm (are) 12.1643 Tj @@ -69662,21 +61255,21 @@ f -383 TJm (\(yet\)) 18.8094 Tj -384 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj 25 TJm (\002cially) 27.6761 Tj -383 TJm (part) 15.4918 Tj -383 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -383 TJm (the) 12.1743 Tj -384 TJm (library) 26.5603 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -1419 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -383 TJm (the) 12.1743 Tj 15 TJm @@ -69706,7 +61299,7 @@ f 15 TJm (ertheless,) 37.3498 Tj -250 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -250 TJm (think) 20.4831 Tj -250 TJm @@ -69719,42 +61312,39 @@ f (ork) 13.2801 Tj -250 TJm (ok.) 12.4533 Tj -[1 0 0 1 72 398.159] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -48.8169] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 47.8207 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 349.342] cm +0 0 468 47.821 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 44.2341] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -388.794] cm [1 0 0 1 0 0] Tm 0 0 Td 90 388.794 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (typedef) 41.8429 Tj -426 TJm (void) 23.9102 Tj @@ -69765,21 +61355,15 @@ f -426 TJm (char) 23.9102 Tj 152.286 363.14 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 162.508 364.884 Td (BZ2_bzlibVersion) 95.641 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (void) 23.9102 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 349.342] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -69788,19 +61372,19 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -339.379] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 327.424 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Returns) 30.9936 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (string) 22.6948 Tj -250 TJm @@ -69813,55 +61397,52 @@ f (v) 4.9813 Tj 15 TJm (ersion.) 26.8392 Tj -[1 0 0 1 72 325.267] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -36.8618] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 35.8655 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 288.405] cm +0 0 468 35.866 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 32.2789] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -315.902] cm [1 0 0 1 0 0] Tm 0 0 Td 90 315.902 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZFILE) 35.8654 Tj 130.109 314.159 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 140.331 315.902 Td (BZ2_bzopen) 59.7756 Tj -852 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (const) 29.8878 Tj -426 TJm (char) 23.9102 Tj 281.103 314.159 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 287.08 315.902 Td (path,) 29.8878 Tj -426 TJm @@ -69869,7 +61450,7 @@ f -426 TJm (char) 23.9102 Tj 383.498 314.159 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 389.476 315.902 Td (mode) 23.9102 Tj -426 TJm @@ -69877,11 +61458,11 @@ f 90 303.947 Td (BZFILE) 35.8654 Tj 130.109 302.204 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 140.331 303.947 Td (BZ2_bzdopen) 65.7532 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (int) 17.9327 Tj -3408 TJm @@ -69891,17 +61472,11 @@ f -426 TJm (char) 23.9102 Tj 369.629 302.204 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 375.607 303.947 Td (mode) 23.9102 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 288.405] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -69910,65 +61485,53 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -278.443] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 266.488 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Opens) 25.4544 Tj -243 TJm -(a) 4.42339 Tj -[1 0 0 1 106.713 266.488] cm +(a) 4.4234 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -106.713 -266.488] cm -[1 0 0 1 0 0] Tm -0 0 Td 106.713 266.488 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (.bz2) 23.9102 Tj -[1 0 0 1 130.624 266.488] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -130.624 -266.488] cm -[1 0 0 1 0 0] Tm -0 0 Td 133.041 266.488 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\002le) 12.7322 Tj -243 TJm (for) 11.6164 Tj -242 TJm (reading) 29.8778 Tj -243 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -243 TJm (writing,) 31.2726 Tj -244 TJm (using) 21.589 Tj -243 TJm -(ei) 7.193 Tj -1 TJm -(ther) 15.4918 Tj --243 TJm -(its) 9.41466 Tj +(either) 22.6848 Tj +-242 TJm +(its) 9.4147 Tj -243 TJm (name) 21.579 Tj +-243 TJm +(or) 8.2988 Tj -242 TJm -(o) 4.9813 Tj --1 TJm -(r) 3.31755 Tj --242 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -243 TJm (pre-e) 20.4632 Tj 15 TJm @@ -69978,106 +61541,87 @@ f -242 TJm (descriptor) 39.8404 Tj 55 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -615 TJm (Analogous) 43.1679 Tj -243 TJm (to) 7.7509 Tj -[1 0 0 1 510.112 266.488] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -510.112 -266.488] cm -[1 0 0 1 0 0] Tm -0 0 Td 510.112 266.488 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (fopen) 29.8878 Tj -[1 0 0 1 540 266.488] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -266.488] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 254.532 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 88.8767 254.532] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -88.8767 -254.532] cm -[1 0 0 1 0 0] Tm -0 0 Td -88.8767 254.532 Td -/F134_0 9.9626 Tf +88.877 254.532 Td +/F124_0 9.9626 Tf (fdopen) 35.8654 Tj -[1 0 0 1 124.742 254.532] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -124.742 -254.532] cm -[1 0 0 1 0 0] Tm -0 0 Td 124.742 254.532 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 252.998] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -36.8618] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 35.8655 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 216.137] cm +0 0 468 35.866 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 32.2789] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -243.633] cm [1 0 0 1 0 0] Tm 0 0 Td 90 243.633 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (int) 17.9327 Tj -426 TJm (BZ2_bzread) 59.7756 Tj -852 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (BZFILE) 35.8654 Tj 226.528 241.89 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 236.749 243.633 Td (b,) 11.9551 Tj -426 TJm (void) 23.9102 Tj 276.859 241.89 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 287.08 243.633 Td (buf,) 23.9102 Tj -426 TJm @@ -70091,17 +61635,17 @@ f -426 TJm (BZ2_bzwrite) 65.7532 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (BZFILE) 35.8654 Tj 228.261 229.935 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 238.483 231.678 Td (b,) 11.9551 Tj -426 TJm (void) 23.9102 Tj 278.592 229.935 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 288.814 231.678 Td (buf,) 23.9102 Tj -426 TJm @@ -70110,12 +61654,6 @@ f (len) 17.9327 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 216.136] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70124,146 +61662,119 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -206.174] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 194.219 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Reads/writes) 51.4668 Tj -250 TJm (data) 16.5977 Tj -250 TJm (from/to) 29.8878 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (pre) 12.7222 Tj 25 TJm (viously) 29.3399 Tj -250 TJm (opened) 28.772 Tj -[1 0 0 1 259.903 194.219] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -259.903 -194.219] cm -[1 0 0 1 0 0] Tm -0 0 Td 259.903 194.219 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZFILE) 35.8654 Tj -[1 0 0 1 295.769 194.219] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -295.769 -194.219] cm -[1 0 0 1 0 0] Tm -0 0 Td 295.769 194.219 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -500 TJm (Analogous) 43.1679 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 359.141 194.219] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -359.141 -194.219] cm -[1 0 0 1 0 0] Tm -0 0 Td 359.141 194.219 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (fread) 29.8878 Tj -[1 0 0 1 389.029 194.219] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -389.029 -194.219] cm -[1 0 0 1 0 0] Tm -0 0 Td 391.519 194.219 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 408.396 194.219] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -408.396 -194.219] cm -[1 0 0 1 0 0] Tm -0 0 Td 408.396 194.219 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (fwrite) 35.8654 Tj -[1 0 0 1 444.261 194.219] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -444.261 -194.219] cm -[1 0 0 1 0 0] Tm -0 0 Td 444.261 194.219 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 192.062] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -36.8618] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 35.8655 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 155.2] cm +0 0 468 35.866 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 32.2789] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -182.697] cm [1 0 0 1 0 0] Tm 0 0 Td 90 182.697 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (int) 17.9327 Tj -852 TJm (BZ2_bzflush) 65.7532 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (BZFILE) 35.8654 Tj 232.505 180.954 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 242.727 182.697 Td -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (\);) 11.9551 Tj 90 170.742 Td @@ -70271,21 +61782,15 @@ f -426 TJm (BZ2_bzclose) 65.7532 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (BZFILE) 35.8654 Tj 234.239 168.998 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 244.46 170.742 Td -(b) 5.97756 Tj +(b) 5.9776 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 155.2] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70294,62 +61799,46 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -145.237] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 133.282 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Flushes/closes) 57.5639 Tj -250 TJm -(a) 4.42339 Tj -[1 0 0 1 138.968 133.282] cm +(a) 4.4234 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -138.968 -133.282] cm -[1 0 0 1 0 0] Tm -0 0 Td 138.968 133.282 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZFILE) 35.8654 Tj -[1 0 0 1 174.833 133.282] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -174.833 -133.282] cm -[1 0 0 1 0 0] Tm -0 0 Td 174.833 133.282 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 179.815 133.282] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -179.815 -133.282] cm -[1 0 0 1 0 0] Tm -0 0 Td 179.815 133.282 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzflush) 65.7532 Tj -[1 0 0 1 245.568 133.282] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -245.568 -133.282] cm -[1 0 0 1 0 0] Tm -0 0 Td 248.059 133.282 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (doesn') 26.5603 Tj 18 TJm (t) 2.7696 Tj @@ -70358,122 +61847,97 @@ f -250 TJm (do) 9.9626 Tj -250 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (ything.) 27.9551 Tj -620 TJm (Analogous) 43.1679 Tj -250 TJm (to) 7.7509 Tj -[1 0 0 1 425.472 133.282] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -425.472 -133.282] cm -[1 0 0 1 0 0] Tm -0 0 Td 425.472 133.282 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (fflush) 35.8654 Tj -[1 0 0 1 461.338 133.282] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -461.338 -133.282] cm -[1 0 0 1 0 0] Tm -0 0 Td 463.828 133.282 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 480.705 133.282] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -480.705 -133.282] cm -[1 0 0 1 0 0] Tm -0 0 Td 480.705 133.282 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (fclose) 35.8654 Tj -[1 0 0 1 516.57 133.282] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -516.57 -133.282] cm -[1 0 0 1 0 0] Tm -0 0 Td 516.57 133.282 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 131.125] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 106.219] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3685] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -121.761] cm [1 0 0 1 0 0] Tm 0 0 Td 90 121.761 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (const) 29.8878 Tj -426 TJm (char) 23.9102 Tj 152.286 120.017 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 162.508 121.761 Td (BZ2_bzerror) 65.7532 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (BZFILE) 35.8654 Tj 282.836 120.017 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 288.814 121.761 Td (b,) 11.9551 Tj -426 TJm (int) 17.9327 Tj 327.19 120.017 Td -(*) 5.97756 Tj +(*) 5.9776 Tj 333.167 121.761 Td (errnum) 35.8654 Tj -426 TJm -(\)) 5.97756 Tj -[1 0 0 1 72 106.219] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm +(\)) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70482,19 +61946,19 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -96.2563] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 84.3011 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 84.301 Td +/F122_0 9.9626 Tf (Returns) 30.9936 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (string) 22.6948 Tj -250 TJm @@ -70510,68 +61974,51 @@ f -250 TJm (status) 22.6948 Tj -250 TJm -(of) 8.29885 Tj -[1 0 0 1 303.858 84.3011] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -303.858 -84.3011] cm -[1 0 0 1 0 0] Tm -0 0 Td -303.858 84.3011 Td -/F134_0 9.9626 Tf -(b) 5.97756 Tj -[1 0 0 1 309.835 84.3011] cm +303.858 84.301 Td +/F124_0 9.9626 Tf +(b) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -309.835 -84.3011] cm -[1 0 0 1 0 0] Tm -0 0 Td -309.835 84.3011 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +309.835 84.301 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj -250 TJm (and) 14.386 Tj -250 TJm (also) 16.0497 Tj -250 TJm (sets) 14.9439 Tj -[1 0 0 1 367.668 84.3011] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -367.668 -84.3011] cm -[1 0 0 1 0 0] Tm -0 0 Td -367.668 82.5576 Td -/F134_0 9.9626 Tf -(*) 5.97756 Tj -373.645 84.3011 Td +367.668 82.558 Td +/F124_0 9.9626 Tf +(*) 5.9776 Tj +373.645 84.301 Td (errnum) 35.8654 Tj -[1 0 0 1 409.511 84.3011] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -409.511 -84.3011] cm -[1 0 0 1 0 0] Tm -0 0 Td -412.001 84.3011 Td -/F130_0 9.9626 Tf +412.002 84.301 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj -250 TJm -(its) 9.41466 Tj +(its) 9.4147 Tj -250 TJm (numerical) 39.8404 Tj -250 TJm (v) 4.9813 Tj 25 TJm (alue.) 19.0883 Tj -[1 0 0 1 72 82.1443] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70600,7 +62047,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70609,17 +62055,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -21.3298] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 4.3836 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70644,7 +62083,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70653,12 +62091,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70667,18 +62099,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -495.734 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -536.307 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +536.307 50.951 Td (28) 9.9626 Tj -[1 0 0 1 455.161 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70687,7 +62121,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70696,12 +62129,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -15.0365 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70710,7 +62141,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 32 32 +%%Page: 29 32 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -70728,20 +62159,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70766,7 +62193,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70775,12 +62201,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70789,36 +62209,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70827,7 +62243,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70836,44 +62251,44 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -741.554] cm [1 0 0 1 0 0] Tm 0 0 Td 72 704.93 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (3.7.) 34.4584 Tj -278 TJm (Using) 57.3893 Tj -278 TJm -(the) 30.9877 Tj +(the) 30.9878 Tj -278 TJm (librar) 51.6669 Tj -10 TJm @@ -70882,35 +62297,14 @@ Q (in) 18.3654 Tj -278 TJm (a) 11.4861 Tj -[1 0 0 1 322.501 704.93] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -322.501 -704.93] cm -[1 0 0 1 0 0] Tm -0 0 Td -322.501 704.93 Td -/F392_0 20.6585 Tf -(stdio) 61.9755 Tj -[1 0 0 1 384.477 704.93] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -384.477 -704.93] cm -[1 0 0 1 0 0] Tm -0 0 Td -384.477 704.93 Td -/F122_0 20.6585 Tf -(-free) 44.767 Tj +-278 TJm +(stdio-free) 94.1201 Tj 72 680.139 Td (en) 24.1085 Tj 40 TJm (vir) 25.2653 Tj 20 TJm (onment) 74.5978 Tj -[1 0 0 1 72 679.881] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70955,7 +62349,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -70964,11 +62357,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -669.983] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 649.583 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.7.1.) 43.0729 Tj -278 TJm (Getting) 60.2539 Tj @@ -70976,23 +62366,8 @@ Q (rid) 22.0013 Tj -278 TJm (of) 16.2513 Tj -[1 0 0 1 232.721 649.583] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -232.721 -649.583] cm -[1 0 0 1 0 0] Tm -0 0 Td -232.721 649.583 Td -/F392_0 17.2154 Tf -(stdio) 51.6462 Tj -[1 0 0 1 284.367 649.583] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -212.367 -3.8303] cm +-278 TJm +(stdio) 41.1276 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -71017,19 +62392,15 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -635.855] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 627.73 Td -/F130_0 9.9626 Tf -(In) 8.29885 Tj +/F122_0 9.9626 Tf +(In) 8.2988 Tj -319 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -319 TJm (deeply) 26.5603 Tj -319 TJm @@ -71088,27 +62459,19 @@ Q (sor) 12.1743 Tj -328 TJm (symbol) 29.3399 Tj -[1 0 0 1 336.046 615.775] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -336.046 -615.775] cm -[1 0 0 1 0 0] Tm -0 0 Td -336.046 615.775 Td -/F134_0 9.9626 Tf +336.045 615.775 Td +/F124_0 9.9626 Tf (BZ_NO_STDIO) 65.7532 Tj -[1 0 0 1 401.799 615.775] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -401.799 -615.775] cm -[1 0 0 1 0 0] Tm -0 0 Td 405.057 615.775 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (de\002ned.) 31.8205 Tj -1083 TJm (Doing) 24.9065 Tj @@ -71119,11 +62482,11 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -327 TJm (you) 14.9439 Tj -327 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 72 603.819 Td (library) 26.5603 Tj -250 TJm @@ -71140,12 +62503,6 @@ Q (eight) 19.9252 Tj -250 TJm (functions:) 39.8504 Tj -[1 0 0 1 72 601.662] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -71154,181 +62511,126 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -591.764] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 581.966 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressInit) 107.596 Tj -[1 0 0 1 179.596 581.966] cm +/F124_0 9.9626 Tf +(BZ2_bzCompressInit) 107.5961 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -179.596 -581.966] cm -[1 0 0 1 0 0] Tm -0 0 Td -179.596 581.966 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 199.079 581.966] cm +179.597 581.966 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -199.079 -581.966] cm -[1 0 0 1 0 0] Tm -0 0 Td 199.079 581.966 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzCompress) 83.6858 Tj -[1 0 0 1 282.765 581.966] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -282.765 -581.966] cm -[1 0 0 1 0 0] Tm -0 0 Td 282.765 581.966 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 302.247 581.966] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -302.247 -581.966] cm -[1 0 0 1 0 0] Tm -0 0 Td 302.247 581.966 Td -/F134_0 9.9626 Tf -(BZ2_bzCompressEnd) 101.619 Tj -[1 0 0 1 403.866 581.966] cm +/F124_0 9.9626 Tf +(BZ2_bzCompressEnd) 101.6185 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 14.0915 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -417.958 -581.966] cm -[1 0 0 1 0 0] Tm -0 0 Td -417.958 581.966 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompressInit) 119.551 Tj -[1 0 0 1 537.509 581.966] cm +-1414 TJm +(BZ2_bzDe) 47.8205 Tj +-1 TJm +(compressInit) 71.7307 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -537.509 -581.966] cm -[1 0 0 1 0 0] Tm -0 0 Td 537.509 581.966 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 72 570.011] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -570.011] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 570.011 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ2_bzDecompress) 95.641 Tj -[1 0 0 1 167.641 570.011] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -167.641 -570.011] cm -[1 0 0 1 0 0] Tm -0 0 Td 167.641 570.011 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 172.144 570.011] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -172.144 -570.011] cm -[1 0 0 1 0 0] Tm -0 0 Td 172.144 570.011 Td -/F134_0 9.9626 Tf -(BZ2_bzDecompressEnd) 113.574 Tj -[1 0 0 1 285.719 570.011] cm +/F124_0 9.9626 Tf +(BZ2_bzDecompressEnd) 113.5736 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.8929 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -287.611 -570.011] cm -[1 0 0 1 0 0] Tm -0 0 Td -287.611 570.011 Td -/F134_0 9.9626 Tf -(BZ2_bzBuffToBuffCompress) 143.461 Tj -[1 0 0 1 431.073 570.011] cm +-190 TJm +(BZ2_bzBuffToBuffCompress) 143.4614 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -431.073 -570.011] cm -[1 0 0 1 0 0] Tm -0 0 Td 431.073 570.011 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 435.577 570.011] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -435.577 -570.011] cm -[1 0 0 1 0 0] Tm -0 0 Td 435.577 570.011 Td -/F134_0 9.9626 Tf -(BZ2_bzBuffToBuffDecompress) 155.417 Tj -[1 0 0 1 590.994 570.011] cm +/F124_0 9.9626 Tf +(BZ2_bzBuffToBuffDecompress) 155.4166 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -518.994 -1.5341] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.8981] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -558.579] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 548.158 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (When) 23.7907 Tj -250 TJm (compiled) 37.0808 Tj -250 TJm (lik) 10.5205 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm (this,) 16.8866 Tj -250 TJm @@ -71339,29 +62641,20 @@ Q (will) 15.5018 Tj -250 TJm (ignore) 25.4544 Tj -[1 0 0 1 272.526 548.158] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -272.526 -548.158] cm -[1 0 0 1 0 0] Tm -0 0 Td 272.526 548.158 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (verbosity) 53.798 Tj -[1 0 0 1 326.324 548.158] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -326.324 -548.158] cm -[1 0 0 1 0 0] Tm -0 0 Td 328.815 548.158 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (settings.) 32.9364 Tj -[1 0 0 1 72 546.001] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -71390,7 +62683,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -71399,11 +62691,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -536.103] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 517.601 Td -/F122_0 17.2154 Tf +/F116_0 17.2154 Tf (3.7.2.) 43.0729 Tj -278 TJm (Critical) 58.3602 Tj @@ -71413,7 +62702,6 @@ Q (or) 17.2154 Tj -278 TJm (handling) 71.7366 Tj -[1 0 0 1 72 513.771] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -71438,7 +62726,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -71447,29 +62734,22 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -503.873] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 495.748 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 119.821 495.748] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -119.821 -495.748] cm -[1 0 0 1 0 0] Tm -0 0 Td 124.529 495.748 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (contains) 33.2053 Tj -473 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -472 TJm (number) 30.4357 Tj -473 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -472 TJm (internal) 30.4357 Tj -473 TJm @@ -71487,15 +62767,15 @@ Q -473 TJm (say) 13.2801 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -528 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj -473 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -472 TJm (acti) 14.386 Tj 25 TJm @@ -71509,15 +62789,15 @@ Q 15 TJm (ertheless,) 37.3498 Tj -533 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -476 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -476 TJm (assertion) 35.417 Tj -476 TJm (should) 26.5703 Tj -476 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (ail,) 12.4533 Tj -532 TJm @@ -71531,7 +62811,7 @@ Q -476 TJm (whether) 32.0895 Tj -476 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -477 TJm (not) 12.7322 Tj -476 TJm @@ -71541,63 +62821,49 @@ Q -476 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -476 TJm (compiled) 37.0808 Tj -476 TJm (with) 17.7135 Tj -[1 0 0 1 72 471.838] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -471.838] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 471.838 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_NO_STDIO) 65.7532 Tj -[1 0 0 1 137.753 471.838] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -137.753 -471.838] cm -[1 0 0 1 0 0] Tm -0 0 Td 140.244 471.838 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (set.) 13.5591 Tj -[1 0 0 1 72 470.528] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -460.63] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 449.985 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (normal) 28.224 Tj -250 TJm (compile,) 34.5901 Tj -250 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -250 TJm (assertion) 35.417 Tj -250 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (ailure) 22.6848 Tj -250 TJm @@ -71606,7 +62872,6 @@ Q (the) 12.1743 Tj -250 TJm (message:) 36.5229 Tj -[1 0 0 1 72 447.828] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -71619,16 +62884,11 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -437.93] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 428.131 Td -/F130_0 9.9626 Tf (bzip2/libbzip2:) 60.3335 Tj -310 TJm (internal) 30.4357 Tj @@ -71637,68 +62897,62 @@ Q -250 TJm (number) 30.4357 Tj -250 TJm -(N.) 9.68365 Tj -[1 0 0 1 72 425.975] cm +(N.) 9.6836 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -416.077] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 406.278 Td -/F130_0 9.9626 Tf (This) 17.7135 Tj --332 TJm -(is) 6.64505 Tj --331 TJm -(a) 4.42339 Tj --332 TJm +-344 TJm +(is) 6.6451 Tj +-344 TJm +(a) 4.4234 Tj +-344 TJm (b) 4.9813 Tj 20 TJm (ug) 9.9626 Tj --332 TJm +-343 TJm (in) 7.7509 Tj --331 TJm +-344 TJm (bzip2/libbzip2,) 60.0546 Tj --352 TJm -(1.0.5) 19.9252 Tj --332 TJm -(of) 8.29885 Tj --332 TJm -(10) 9.9626 Tj --332 TJm -(December) 40.9363 Tj --331 TJm -(2007.) 22.4159 Tj --555 TJm +-368 TJm +(1.0.6) 19.9252 Tj +-343 TJm +(of) 8.2988 Tj +-344 TJm +(6) 4.9813 Tj +-344 TJm +(September) 42.61 Tj +-344 TJm +(2010.) 22.4159 Tj +-592 TJm (Please) 25.4544 Tj --332 TJm +-344 TJm (report) 23.7907 Tj --332 TJm -(it) 5.53921 Tj --331 TJm +-343 TJm +(it) 5.5392 Tj +-344 TJm (to) 7.7509 Tj --332 TJm +-344 TJm (me) 12.1743 Tj --332 TJm +-344 TJm (at:) 9.9626 Tj --473 TJm +-498 TJm (jse) 11.0684 Tj 25 TJm (w) 7.193 Tj 10 TJm (ard@bzip.or) 49.8429 Tj 18 TJm -(g.) 7.47195 Tj --1110 TJm -(If) 6.63509 Tj --332 TJm +(g.) 7.472 Tj +-1183 TJm +(If) 6.6351 Tj +-344 TJm (this) 14.396 Tj 72 394.323 Td (happened) 38.1767 Tj @@ -71721,9 +62975,9 @@ Q -297 TJm (libbzip2) 32.6574 Tj -298 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -297 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -297 TJm (component,) 46.7644 Tj -309 TJm @@ -71747,7 +63001,7 @@ Q -264 TJm (author\(s\)) 35.965 Tj -264 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -264 TJm (that) 14.9439 Tj -264 TJm @@ -71757,11 +63011,11 @@ Q -264 TJm (mak) 17.1556 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -264 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -264 TJm -(ef) 7.74094 Tj +(ef) 7.7409 Tj 25 TJm (fort) 14.386 Tj -264 TJm @@ -71787,7 +63041,7 @@ Q -264 TJm (reports) 27.6661 Tj -264 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 25 TJm (v) 4.9813 Tj 15 TJm @@ -71815,12 +63069,11 @@ Q 10 TJm (ard,) 15.2129 Tj -250 TJm -(10) 9.9626 Tj +(6) 4.9813 Tj -250 TJm -(December) 40.9363 Tj +(September) 42.61 Tj -250 TJm -(2007.) 22.4159 Tj -[1 0 0 1 72 368.256] cm +(2010.) 22.4159 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -71829,44 +63082,30 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.801] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -348.557] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 338.758 Td -/F130_0 9.9626 Tf (where) 24.3386 Tj -[1 0 0 1 98.8312 338.758] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -98.8312 -338.758] cm -[1 0 0 1 0 0] Tm -0 0 Td -98.8312 338.758 Td -/F134_0 9.9626 Tf -(N) 5.97756 Tj -[1 0 0 1 104.809 338.758] cm +98.831 338.758 Td +/F124_0 9.9626 Tf +(N) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -104.809 -338.758] cm -[1 0 0 1 0 0] Tm -0 0 Td -107.302 338.758 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +107.301 338.758 Td +/F122_0 9.9626 Tf +(is) 6.6451 Tj -250 TJm (some) 21.031 Tj -250 TJm @@ -71876,37 +63115,29 @@ Q -250 TJm (number) 30.4357 Tj 55 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -621 TJm -(If) 6.63509 Tj -[1 0 0 1 230.81 338.758] cm +(If) 6.6351 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -230.81 -338.758] cm -[1 0 0 1 0 0] Tm -0 0 Td 230.81 338.758 Td -/F134_0 9.9626 Tf -(N) 5.97756 Tj +/F124_0 9.9626 Tf +(N) 5.9776 Tj -600 TJm (==) 11.9551 Tj -600 TJm (1007) 23.9102 Tj -[1 0 0 1 284.608 338.758] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -284.608 -338.758] cm -[1 0 0 1 0 0] Tm -0 0 Td 284.608 338.758 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -250 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -250 TJm (also) 16.0497 Tj -251 TJm @@ -71914,7 +63145,7 @@ Q -250 TJm (some) 21.031 Tj -250 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xtra) 15.4918 Tj -250 TJm @@ -71934,7 +63165,7 @@ Q 72 326.803 Td (memory) 33.2053 Tj -425 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -424 TJm (often) 20.4731 Tj -425 TJm @@ -71950,9 +63181,9 @@ Q -834 TJm (\(This) 21.031 Tj -425 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -425 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -424 TJm (frequently-observ) 70.8241 Tj 15 TJm @@ -71965,12 +63196,6 @@ Q (ersions) 28.224 Tj 72 314.848 Td (1.0.0/1.0.1\).) 48.4282 Tj -[1 0 0 1 72 313.065] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -71979,77 +63204,60 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -303.167] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 292.995 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (exit\(3\)) 41.8429 Tj -[1 0 0 1 113.843 292.995] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -113.843 -292.995] cm -[1 0 0 1 0 0] Tm -0 0 Td 116.334 292.995 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -250 TJm (then) 17.1556 Tj -250 TJm (called.) 26.2813 Tj -[1 0 0 1 72 291.899] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.8981] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -282.001] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 271.142 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm -(a) 4.42339 Tj -[1 0 0 1 95.0933 271.142] cm +(a) 4.4234 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -95.0933 -271.142] cm -[1 0 0 1 0 0] Tm -0 0 Td -95.0933 271.142 Td -/F134_0 9.9626 Tf +95.093 271.142 Td +/F124_0 9.9626 Tf (stdio) 29.8878 Tj -[1 0 0 1 124.981 271.142] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -124.981 -271.142] cm -[1 0 0 1 0 0] Tm -0 0 Td 124.981 271.142 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (-free) 18.7994 Tj -250 TJm (library) 26.5603 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -250 TJm (assertion) 35.417 Tj -250 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (ailures) 26.5603 Tj -250 TJm @@ -72057,74 +63265,65 @@ Q -250 TJm (in) 7.7509 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (call) 14.386 Tj -250 TJm (to) 7.7509 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (function) 33.2053 Tj -250 TJm (declared) 33.7433 Tj -250 TJm (as:) 11.0684 Tj -[1 0 0 1 72 268.985] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 244.078] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3685] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -259.62] cm [1 0 0 1 0 0] Tm 0 0 Td 90 259.62 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (extern) 35.8654 Tj -426 TJm (void) 23.9102 Tj -426 TJm -(bz_internal_error) 101.619 Tj +(bz_internal_error) 101.6185 Tj -426 TJm -(\() 5.97756 Tj +(\() 5.9776 Tj -426 TJm (int) 17.9327 Tj -426 TJm (errcode) 41.8429 Tj -426 TJm (\);) 11.9551 Tj -[1 0 0 1 72 244.078] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72133,16 +63332,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.4846] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -234.18] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 222.225 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (The) 15.4918 Tj -250 TJm (rele) 14.9339 Tj @@ -72153,17 +63352,17 @@ f -250 TJm (code) 18.8094 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (passed) 26.5603 Tj -250 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (parameter) 39.8305 Tj 55 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -620 TJm (Y) 7.193 Tj 110 TJm @@ -72175,25 +63374,19 @@ f -250 TJm (such) 18.2614 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (function.) 35.696 Tj -[1 0 0 1 72 220.068] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -210.17] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 200.372 Td -/F130_0 9.9626 Tf -(In) 8.29885 Tj +(In) 8.2988 Tj -294 TJm (either) 22.6848 Tj -294 TJm @@ -72201,11 +63394,11 @@ f -306 TJm (once) 18.8094 Tj -294 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -294 TJm (assertion) 35.417 Tj -294 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (ailure) 22.6848 Tj -294 TJm @@ -72213,30 +63406,22 @@ f -295 TJm (occurred,) 37.3398 Tj -305 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -[1 0 0 1 306.541 200.372] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -306.541 -200.372] cm -[1 0 0 1 0 0] Tm -0 0 Td 306.541 200.372 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bz_stream) 53.798 Tj -[1 0 0 1 360.339 200.372] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -360.339 -200.372] cm -[1 0 0 1 0 0] Tm -0 0 Td 363.271 200.372 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (records) 29.3199 Tj -294 TJm (in) 7.7509 Tj @@ -72245,19 +63430,19 @@ f 20 TJm (olv) 12.7322 Tj 15 TJm -(ed) 9.40469 Tj +(ed) 9.4047 Tj -294 TJm (can) 13.8281 Tj -295 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -294 TJm -(re) 7.74094 Tj +(re) 7.7409 Tj 15 TJm (g) 4.9813 Tj 5 TJm (arded) 22.1269 Tj -294 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -294 TJm (in) 7.7509 Tj 40 TJm @@ -72286,30 +63471,24 @@ f (with) 17.7135 Tj -250 TJm (them.) 22.4159 Tj -[1 0 0 1 72 186.26] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -176.362] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 166.564 Td -/F130_0 9.9626 Tf (Y) 7.193 Tj 110 TJm (ou) 9.9626 Tj -299 TJm (may) 17.1556 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -310 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -299 TJm (course,) 28.493 Tj -311 TJm @@ -72331,7 +63510,7 @@ f -912 TJm (As) 11.0684 Tj -298 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -299 TJm (said) 16.0497 Tj -298 TJm @@ -72339,7 +63518,7 @@ f 15 TJm (v) 4.9813 Tj 15 TJm -(e,) 6.91404 Tj +(e,) 6.914 Tj -311 TJm (critical) 27.6661 Tj -299 TJm @@ -72350,7 +63529,7 @@ f (b) 4.9813 Tj 20 TJm (ugs) 13.8381 Tj -72 154.608 Td +72 154.609 Td (in) 7.7509 Tj -263 TJm (the) 12.1743 Tj @@ -72365,7 +63544,7 @@ f -263 TJm (occur) 22.1269 Tj 55 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -697 TJm (All) 12.7322 Tj -263 TJm @@ -72395,7 +63574,7 @@ f -250 TJm (can) 13.8281 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (reco) 17.1456 Tj 15 TJm @@ -72404,7 +63583,6 @@ f (ered) 17.1456 Tj -250 TJm (from.) 21.8579 Tj -[1 0 0 1 72 142.554] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72437,7 +63615,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72446,11 +63623,8 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -132.656] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 107.965 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (3.8.) 34.4584 Tj -278 TJm (Making) 71.1685 Tj @@ -72462,7 +63636,6 @@ f (ws) 27.5584 Tj -278 TJm (DLL) 40.1601 Tj -[1 0 0 1 72 103.369] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72487,16 +63660,12 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.898] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -93.4708] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 86.112 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Ev) 11.0684 Tj 15 TJm (erything) 33.2053 Tj @@ -72505,7 +63674,7 @@ f -327 TJm (to) 7.7509 Tj -328 TJm -(W) 9.40469 Tj +(W) 9.4047 Tj 40 TJm (indo) 17.7135 Tj 25 TJm @@ -72527,34 +63696,26 @@ f -328 TJm (Tsuneo) 29.3299 Tj -328 TJm -(\() 3.31755 Tj -[1 0 0 1 378.139 86.112] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -378.139 -86.112] cm -[1 0 0 1 0 0] Tm -0 0 Td 378.139 86.112 Td -/F134_0 9.9626 Tf -(tsuneo@rr.iij4u.or.jp) 125.529 Tj -[1 0 0 1 503.668 86.112] cm +/F124_0 9.9626 Tf +(tsuneo@rr.iij4u.or.jp) 125.5288 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -503.668 -86.112] cm -[1 0 0 1 0 0] Tm -0 0 Td 503.668 86.112 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\),) 5.8082 Tj -347 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -328 TJm (you) 14.9439 Tj -72 74.1568 Td +72 74.157 Td (should) 26.5703 Tj -250 TJm (send) 18.2614 Tj @@ -72567,7 +63728,7 @@ f -250 TJm (him) 15.5018 Tj -250 TJm -(\(b) 8.29885 Tj +(\(b) 8.2988 Tj 20 TJm (ut) 7.7509 Tj -250 TJm @@ -72576,44 +63737,28 @@ f (Cc:) 13.8381 Tj -310 TJm (me,) 14.6649 Tj -[1 0 0 1 287.958 74.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -287.958 -74.1568] cm -[1 0 0 1 0 0] Tm -0 0 Td -287.958 74.1568 Td -/F134_0 9.9626 Tf +287.958 74.157 Td +/F124_0 9.9626 Tf (jseward@bzip.org) 95.641 Tj -[1 0 0 1 383.6 74.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -383.6 -74.1568] cm -[1 0 0 1 0 0] Tm -0 0 Td -383.6 74.1568 Td -/F130_0 9.9626 Tf +383.6 74.157 Td +/F122_0 9.9626 Tf (\).) 5.8082 Tj -[1 0 0 1 72 72] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -21.1482] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72638,7 +63783,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72647,12 +63791,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.9738] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72661,18 +63799,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -51.071] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 534.414 51.071 Td -/F130_0 9.9626 Tf (29) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72681,7 +63821,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72690,12 +63829,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72704,7 +63841,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 33 33 +%%Page: 30 33 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -72722,20 +63859,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72760,7 +63893,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72769,12 +63901,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -8.9114] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 8.9114] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72783,36 +63909,32 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 76.4979 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -342.569 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 419.067 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Programming) 54.7943 Tj -250 TJm (with) 17.7135 Tj -[1 0 0 1 496.556 749.245] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -496.556 -749.245] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.556 749.245 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 544.376 749.245] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -278.305 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72821,7 +63943,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -72830,44 +63951,43 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -5.0363] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm -/DeviceGray {} cs -[0] sc -/DeviceGray {} CS -[0] SC -[1 0 0 1 -468 -21.5542] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (My) 13.8381 Tj -367 TJm (v) 4.9813 Tj @@ -72876,7 +63996,7 @@ Q -367 TJm (understanding) 56.4481 Tj -367 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -367 TJm (what) 19.3673 Tj -368 TJm @@ -72884,7 +64004,7 @@ Q -367 TJm (do) 9.9626 Tj -367 TJm -(is:) 9.41466 Tj +(is:) 9.4147 Tj -544 TJm (using) 21.589 Tj -367 TJm @@ -72903,28 +64023,20 @@ Q (project) 27.6661 Tj -367 TJm (\002le) 12.7322 Tj -[1 0 0 1 432.966 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -432.966 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 432.966 710.037 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbz2.dsp) 59.7756 Tj -[1 0 0 1 492.742 710.037] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -492.742 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td 492.742 710.037 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -396 TJm (and) 14.386 Tj -368 TJm @@ -72934,25 +64046,19 @@ Q 72 698.082 Td (That') 21.579 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -250 TJm (all.) 12.4533 Tj -[1 0 0 1 72 697.983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -688.02] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 676.164 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj +(If) 6.6351 Tj -284 TJm (you) 14.9439 Tj -284 TJm @@ -72976,11 +64082,11 @@ Q -293 TJm (mak) 17.1556 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -284 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -284 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 25 TJm (w) 7.193 Tj -284 TJm @@ -72991,182 +64097,118 @@ Q (these) 20.4731 Tj -284 TJm (\002les:) 19.3773 Tj -[1 0 0 1 424.505 676.164] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -424.505 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td 424.505 676.164 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (blocksort.c) 65.7532 Tj -[1 0 0 1 490.259 676.164] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -490.259 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td 490.259 676.164 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 495.666 676.164] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -495.666 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td 495.666 676.164 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzlib.c) 41.8429 Tj -[1 0 0 1 537.509 676.164] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -537.509 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td 537.509 676.164 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 72 664.209] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 664.209 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (compress.c) 59.7756 Tj -[1 0 0 1 131.776 664.209] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -131.776 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td 131.776 664.209 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 136.436 664.209] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -136.436 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td 136.436 664.209 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (crctable.c) 59.7756 Tj -[1 0 0 1 196.211 664.209] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -196.211 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td 196.211 664.209 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 200.871 664.209] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -200.871 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td 200.871 664.209 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (decompress.c) 71.7307 Tj -[1 0 0 1 272.602 664.209] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -272.602 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td 272.602 664.209 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 277.262 664.209] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -277.262 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td 277.262 664.209 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (huffman.c) 53.798 Tj -[1 0 0 1 331.06 664.209] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -331.06 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td 331.06 664.209 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 335.72 664.209] cm +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -335.72 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td 335.72 664.209 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (randtable.c) 65.7532 Tj -[1 0 0 1 401.473 664.209] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -401.473 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td 403.562 664.209 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 420.037 664.209] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -420.037 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td 420.037 664.209 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbz2.def) 59.7756 Tj -[1 0 0 1 479.812 664.209] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -479.812 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td 479.812 664.209 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -593 TJm (Y) 7.193 Tj 110 TJm @@ -73187,66 +64229,44 @@ Q (header) 26.5503 Tj -250 TJm (\002les) 16.6077 Tj -[1 0 0 1 190.415 652.254] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -190.415 -652.254] cm -[1 0 0 1 0 0] Tm -0 0 Td 190.415 652.254 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzlib.h) 41.8429 Tj -[1 0 0 1 232.258 652.254] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -232.258 -652.254] cm -[1 0 0 1 0 0] Tm -0 0 Td -234.748 652.254 Td -/F130_0 9.9626 Tf +234.749 652.254 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 251.625 652.254] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -251.625 -652.254] cm -[1 0 0 1 0 0] Tm -0 0 Td 251.625 652.254 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzlib_private.h) 89.6634 Tj -[1 0 0 1 341.289 652.254] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -341.289 -652.254] cm -[1 0 0 1 0 0] Tm -0 0 Td 341.289 652.254 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 650.72] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -640.757] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 630.336 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj +(If) 6.6351 Tj -250 TJm (you) 14.9439 Tj -250 TJm @@ -73273,70 +64293,48 @@ Q (proprocessor) 51.4568 Tj -250 TJm (symbol) 29.3399 Tj -[1 0 0 1 363.634 630.336] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -363.634 -630.336] cm -[1 0 0 1 0 0] Tm -0 0 Td 363.634 630.336 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (_WIN32) 35.8654 Tj -[1 0 0 1 399.5 630.336] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -399.5 -630.336] cm -[1 0 0 1 0 0] Tm -0 0 Td 399.5 630.336 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 628.179] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -618.217] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 608.418 Td -/F130_0 9.9626 Tf (Finally) 28.234 Tj 65 TJm -(,) 2.49065 Tj -[1 0 0 1 104.568 608.418] cm +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -104.568 -608.418] cm -[1 0 0 1 0 0] Tm -0 0 Td 104.568 608.418 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (dlltest.c) 53.798 Tj -[1 0 0 1 158.366 608.418] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -158.366 -608.418] cm -[1 0 0 1 0 0] Tm -0 0 Td 160.856 608.418 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (sample) 28.224 Tj -250 TJm @@ -73348,53 +64346,39 @@ Q -250 TJm (DLL.) 21.8579 Tj -500 TJm -(It) 6.08715 Tj +(It) 6.0871 Tj -250 TJm (has) 13.2801 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (project) 27.6661 Tj -250 TJm (\002le,) 15.2229 Tj -[1 0 0 1 388.58 608.418] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -388.58 -608.418] cm -[1 0 0 1 0 0] Tm -0 0 Td 388.58 608.418 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (dlltest.dsp) 65.7532 Tj -[1 0 0 1 454.333 608.418] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -454.333 -608.418] cm -[1 0 0 1 0 0] Tm -0 0 Td -454.333 608.418 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 606.262] cm +454.334 608.418 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -596.299] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 586.501 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj +(If) 6.6351 Tj -250 TJm (you) 14.9439 Tj -250 TJm @@ -73404,7 +64388,7 @@ Q 10 TJm (ant) 12.1743 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (mak) 17.1556 Tj 10 TJm @@ -73418,57 +64402,43 @@ Q -250 TJm (C,) 9.1357 Tj -250 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (look) 17.7135 Tj -250 TJm (at) 7.193 Tj -[1 0 0 1 292.212 586.501] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -292.212 -586.501] cm -[1 0 0 1 0 0] Tm -0 0 Td 292.212 586.501 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (makefile.msc) 71.7307 Tj -[1 0 0 1 363.943 586.501] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -363.943 -586.501] cm -[1 0 0 1 0 0] Tm -0 0 Td 363.943 586.501 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 584.344] cm +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -574.381] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 564.583 Td -/F130_0 9.9626 Tf (Be) 11.0684 Tj -291 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 15 TJm (w) 7.193 Tj 10 TJm @@ -73476,37 +64446,29 @@ Q -291 TJm (that) 14.9439 Tj -291 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -291 TJm (you) 14.9439 Tj -291 TJm (compile) 32.0995 Tj -[1 0 0 1 192.069 564.583] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -192.069 -564.583] cm -[1 0 0 1 0 0] Tm -0 0 Td -192.069 564.583 Td -/F134_0 9.9626 Tf +192.07 564.583 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 221.958 564.583] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -221.958 -564.583] cm -[1 0 0 1 0 0] Tm -0 0 Td 224.857 564.583 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (itself) 19.9252 Tj -291 TJm (on) 9.9626 Tj -291 TJm -(W) 9.40469 Tj +(W) 9.4047 Tj 40 TJm (in32,) 20.2042 Tj -301 TJm @@ -73515,84 +64477,60 @@ Q (must) 19.3773 Tj -291 TJm (set) 11.0684 Tj -[1 0 0 1 346.841 564.583] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -346.841 -564.583] cm -[1 0 0 1 0 0] Tm -0 0 Td -346.841 564.583 Td -/F134_0 9.9626 Tf +346.842 564.583 Td +/F124_0 9.9626 Tf (BZ_UNIX) 41.8429 Tj -[1 0 0 1 388.685 564.583] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -388.685 -564.583] cm -[1 0 0 1 0 0] Tm -0 0 Td -391.583 564.583 Td -/F130_0 9.9626 Tf +391.584 564.583 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj -291 TJm (0) 4.9813 Tj -291 TJm (and) 14.386 Tj -[1 0 0 1 427.399 564.583] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -427.399 -564.583] cm -[1 0 0 1 0 0] Tm -0 0 Td -427.399 564.583 Td -/F134_0 9.9626 Tf +427.4 564.583 Td +/F124_0 9.9626 Tf (BZ_LCCWIN32) 65.7532 Tj -[1 0 0 1 493.153 564.583] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.153 -564.583] cm -[1 0 0 1 0 0] Tm -0 0 Td 496.052 564.583 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj -291 TJm -(1,) 7.47195 Tj +(1,) 7.472 Tj -301 TJm (in) 7.7509 Tj -291 TJm (the) 12.1743 Tj 72 552.628 Td (\002le) 12.7322 Tj -[1 0 0 1 87.2227 552.628] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -87.2227 -552.628] cm -[1 0 0 1 0 0] Tm -0 0 Td -87.2227 552.628 Td -/F134_0 9.9626 Tf +87.223 552.628 Td +/F124_0 9.9626 Tf (bzip2.c) 41.8429 Tj -[1 0 0 1 129.066 552.628] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -129.066 -552.628] cm -[1 0 0 1 0 0] Tm -0 0 Td 129.066 552.628 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -250 TJm (before) 25.4445 Tj -250 TJm @@ -73618,25 +64556,19 @@ Q -250 TJm (correctly) 35.4071 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 550.471] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -540.508] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 530.71 Td -/F130_0 9.9626 Tf -(I) 3.31755 Tj +(I) 3.3175 Tj -250 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm @@ -73646,17 +64578,17 @@ Q -250 TJm (tried) 18.2614 Tj -250 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (this) 14.396 Tj -250 TJm (stuf) 14.9439 Tj 25 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj -250 TJm (myself,) 29.6088 Tj -250 TJm @@ -73664,14 +64596,13 @@ Q 20 TJm (ut) 7.7509 Tj -250 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -250 TJm (all) 9.9626 Tj -250 TJm (looks) 21.589 Tj -250 TJm (plausible.) 38.4656 Tj -[1 0 0 1 72 528.553] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -73680,17 +64611,10 @@ Q [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -477.701] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -73715,7 +64639,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -73724,12 +64647,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -73738,18 +64655,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (30) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -73758,7 +64677,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -73767,12 +64685,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS @@ -73781,7 +64697,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 34 34 +%%Page: 31 34 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -73799,20 +64715,12 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -73837,16 +64745,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -73859,12 +64757,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 140.398 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -140.398 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -73873,7 +64765,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -73882,35 +64773,47 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -13.9477] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -468 -21.5542] cm +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -73931,15 +64834,13 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -720] cm [1 0 0 1 0 0] Tm 0 0 Td 72 701.916 Td -/F122_0 24.7902 Tf +/F116_0 24.7902 Tf (4.) 20.675 Tj -278 TJm -(Miscellanea) 139.172 Tj -[1 0 0 1 72 701.606] cm +(Miscellanea) 139.1722 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -73960,7 +64861,6 @@ Q [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -9.1347] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -73973,16 +64873,12 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -14.1161] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -678.355] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 658.006 Td -/F122_0 17.2154 Tf +72 656.35 Td +/F116_0 17.2154 Tf (T) 10.5186 Tj 80 TJm (ab) 20.0904 Tj @@ -73992,7 +64888,6 @@ Q (of) 16.2513 Tj -278 TJm (Contents) 74.5943 Tj -[1 0 0 1 72 649.183] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -74013,21 +64908,17 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -11.7401] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -637.443] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 637.443 Td -/F130_0 9.9626 Tf +72 635.788 Td +/F122_0 9.9626 Tf (4.1.) 14.9439 Tj -310 TJm (Limitations) 45.9475 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm @@ -74036,152 +64927,132 @@ Q (\002le) 12.7322 Tj -250 TJm (format) 26.5603 Tj -[1 0 0 1 255.231 637.443] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -260.212 -637.443] cm -[1 0 0 1 0 0] Tm -0 0 Td -269.154 637.443 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +269.154 635.788 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 637.443] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -637.443] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 637.443 Td -/F130_0 9.9626 Tf +506.127 635.788 Td +/F122_0 9.9626 Tf (31) 9.9626 Tj -[1 0 0 1 516.09 637.443] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -74194,211 +65065,194 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -625.488] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 625.488 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 623.832 Td (4.2.) 14.9439 Tj -310 TJm (Portability) 42.0721 Tj -250 TJm (issues) 23.8007 Tj -[1 0 0 1 158.395 625.488] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -163.376 -625.488] cm -[1 0 0 1 0 0] Tm -0 0 Td -172.03 625.488 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +172.03 623.832 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 625.488] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -625.488] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 625.488 Td -/F130_0 9.9626 Tf +506.127 623.832 Td +/F122_0 9.9626 Tf (32) 9.9626 Tj -[1 0 0 1 516.09 625.488] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -74411,16 +65265,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -613.533] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 613.533 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 611.877 Td (4.3.) 14.9439 Tj -310 TJm (Reporting) 39.8504 Tj @@ -74428,198 +65285,178 @@ Q (b) 4.9813 Tj 20 TJm (ugs) 13.8381 Tj -[1 0 0 1 150.993 613.533] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -155.975 -613.533] cm -[1 0 0 1 0 0] Tm -0 0 Td -166.115 613.533 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +166.115 611.877 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 613.533] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -613.533] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 613.533 Td -/F130_0 9.9626 Tf +506.127 611.877 Td +/F122_0 9.9626 Tf (32) 9.9626 Tj -[1 0 0 1 516.09 613.533] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -74632,16 +65469,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7983] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -601.578] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 601.578 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 599.922 Td (4.4.) 14.9439 Tj -310 TJm (Did) 14.9439 Tj @@ -74655,170 +65495,150 @@ Q (right) 18.8194 Tj -250 TJm (package?) 37.0609 Tj -[1 0 0 1 212.602 601.578] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 3.0884 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 3.0884 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -218.778 -601.578] cm -[1 0 0 1 0 0] Tm -0 0 Td -229.109 601.578 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +229.109 599.922 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 601.578] cm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -601.578] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 601.578 Td -/F130_0 9.9626 Tf +506.127 599.922 Td +/F122_0 9.9626 Tf (33) 9.9626 Tj -[1 0 0 1 516.09 601.578] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -74831,202 +65651,194 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.7984] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -589.623] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 589.623 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +72 587.967 Td (4.5.) 14.9439 Tj -310 TJm (Further) 29.3299 Tj -250 TJm (Reading) 33.2053 Tj -[1 0 0 1 155.058 589.623] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4906 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -160.039 -589.623] cm -[1 0 0 1 0 0] Tm -0 0 Td -170.361 589.623 Td -/F147_0 9.9626 Tf -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +170.361 587.967 Td +/F230_0 9.9626 Tf +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj --166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -166 TJm -(:) 2.7696 Tj +(:) 2.7676 Tj -167 TJm -(:) 2.7696 Tj -[1 0 0 1 506.127 589.623] cm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-166 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj +-167 TJm +(:) 2.7676 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -506.127 -589.623] cm -[1 0 0 1 0 0] Tm -0 0 Td -506.127 589.623 Td -/F130_0 9.9626 Tf +506.127 587.967 Td +/F122_0 9.9626 Tf (34) 9.9626 Tj -[1 0 0 1 516.09 589.623] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -75035,26 +65847,19 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -444.09 -2.1568] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.1348] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -9.6315] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -568.7] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 558.901 Td -/F130_0 9.9626 Tf +72 556.086 Td (These) 23.7907 Tj -250 TJm (are) 12.1643 Tj @@ -75067,7 +65872,7 @@ Q -250 TJm (thoughts) 34.3212 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (mine.) 22.4159 Tj -620 TJm @@ -75083,8 +65888,7 @@ Q 25 TJm (ary) 12.7222 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 556.744] cm +(.) 2.4907 Tj /DeviceGray {} cs [0] sc /DeviceGray {} CS @@ -75109,7 +65913,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.6315] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -75118,27 +65921,23 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -547.113] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 524.48 Td -/F122_0 20.6585 Tf +72 521.334 Td +/F116_0 20.6585 Tf (4.1.) 34.4584 Tj -278 TJm -(Limitations) 110.192 Tj +(Limitations) 110.1924 Tj -278 TJm (of) 19.5016 Tj -278 TJm -(the) 30.9877 Tj +(the) 30.9878 Tj -278 TJm -(compressed) 121.699 Tj +(compressed) 121.6992 Tj -278 TJm (\002le) 29.8515 Tj -278 TJm -(f) 6.87928 Tj +(f) 6.8793 Tj 20 TJm (ormat) 57.3893 Tj -[1 0 0 1 72 520.203] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -75163,7 +65962,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.6315] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -75172,81 +65970,58 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -510.572] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 502.893 Td -/F134_0 9.9626 Tf +72 499.416 Td +/F124_0 9.9626 Tf (bzip2-1.0.X) 65.7532 Tj -[1 0 0 1 137.753 502.893] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -137.753 -502.893] cm -[1 0 0 1 0 0] Tm -0 0 Td -137.753 502.893 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj -[1 0 0 1 143.405 502.893] cm +137.753 499.416 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -143.405 -502.893] cm -[1 0 0 1 0 0] Tm -0 0 Td -143.405 502.893 Td -/F134_0 9.9626 Tf +143.405 499.416 Td +/F124_0 9.9626 Tf (0.9.5) 29.8878 Tj -[1 0 0 1 173.293 502.893] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -173.293 -502.893] cm -[1 0 0 1 0 0] Tm -0 0 Td -176.453 502.893 Td -/F130_0 9.9626 Tf +176.453 499.416 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 194 502.893] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -194 -502.893] cm -[1 0 0 1 0 0] Tm -0 0 Td -194 502.893 Td -/F134_0 9.9626 Tf +194 499.416 Td +/F124_0 9.9626 Tf (0.9.0) 29.8878 Tj -[1 0 0 1 223.888 502.893] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -223.888 -502.893] cm -[1 0 0 1 0 0] Tm -0 0 Td -227.048 502.893 Td -/F130_0 9.9626 Tf +227.048 499.416 Td +/F122_0 9.9626 Tf (use) 13.2801 Tj -317 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xactly) 24.3486 Tj --317 TJm -(the) 12.1743 Tj -318 TJm +(the) 12.1743 Tj +-317 TJm (same) 20.4731 Tj -317 TJm (\002le) 12.7322 Tj -317 TJm (format) 26.5603 Tj -317 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -318 TJm (the) 12.1743 Tj -317 TJm @@ -75255,36 +66030,28 @@ Q (v) 4.9813 Tj 15 TJm (ersion,) 26.8392 Tj -[1 0 0 1 455.801 502.893] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -455.801 -502.893] cm -[1 0 0 1 0 0] Tm -0 0 Td -455.801 502.893 Td -/F134_0 9.9626 Tf +455.801 499.416 Td +/F124_0 9.9626 Tf (bzip2-0.1) 53.798 Tj -[1 0 0 1 509.599 502.893] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -509.599 -502.893] cm -[1 0 0 1 0 0] Tm -0 0 Td -509.599 502.893 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj --1023 TJm +509.599 499.416 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj +-1024 TJm (This) 17.7135 Tj -72 490.938 Td +72 487.461 Td (decision) 33.2053 Tj -222 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -222 TJm (made) 21.579 Tj -222 TJm @@ -75294,11 +66061,11 @@ Q -222 TJm (interests) 33.2053 Tj -222 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -222 TJm (stability) 32.1095 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -601 TJm (Creating) 34.3112 Tj -222 TJm @@ -75319,7 +66086,7 @@ Q (ould) 17.7135 Tj -222 TJm (create) 23.7807 Tj -72 478.983 Td +72 475.505 Td (further) 27.1082 Tj -250 TJm (confusion) 39.2925 Tj @@ -75331,21 +66098,15 @@ Q (for) 11.6164 Tj -250 TJm (users.) 22.9638 Tj -[1 0 0 1 72 476.826] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.6315] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -467.194] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 457.396 Td -/F130_0 9.9626 Tf +72 453.588 Td (Ne) 11.6164 Tj 25 TJm (v) 4.9813 Tj @@ -75354,11 +66115,11 @@ Q -234 TJm (this) 14.396 Tj -229 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -230 TJm (not) 12.7322 Tj -229 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -230 TJm (painless) 32.0995 Tj -229 TJm @@ -75374,34 +66135,28 @@ Q 10 TJm (ork) 13.2801 Tj -230 TJm -(since) 20.4731 Tj --229 TJm +(sinc) 16.0497 Tj +1 TJm +(e) 4.4234 Tj +-230 TJm (the) 12.1743 Tj -230 TJm (release) 27.6562 Tj -229 TJm -(of) 8.29885 Tj -[1 0 0 1 407.317 457.396] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -407.317 -457.396] cm -[1 0 0 1 0 0] Tm -0 0 Td -407.317 457.396 Td -/F134_0 9.9626 Tf +407.317 453.588 Td +/F124_0 9.9626 Tf (bzip2-0.1) 53.798 Tj -[1 0 0 1 461.115 457.396] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -461.115 -457.396] cm -[1 0 0 1 0 0] Tm -0 0 Td -463.402 457.396 Td -/F130_0 9.9626 Tf +463.402 453.588 Td +/F122_0 9.9626 Tf (in) 7.7509 Tj -230 TJm (August) 28.782 Tj @@ -75409,7 +66164,7 @@ Q (1997) 19.9252 Tj -230 TJm (has) 13.2801 Tj -72 445.441 Td +72 441.632 Td (sho) 13.8381 Tj 25 TJm (wn) 12.1743 Tj @@ -75448,176 +66203,162 @@ Q -226 TJm (unnecessary) 48.6872 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -604 TJm (These) 23.7907 Tj -226 TJm (are:) 14.9339 Tj -[1 0 0 1 72 443.284] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -29.0613] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -414.222] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 414.222 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 414.222] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +74.491 409.752 Td +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -414.222] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 414.222 Td -/F130_0 9.9626 Tf +-450 TJm (The) 15.4918 Tj --265 TJm +-287 TJm (run-length) 41.5042 Tj --266 TJm +-287 TJm (encoder) 31.5316 Tj 40 TJm -(,) 2.49065 Tj --269 TJm +(,) 2.4907 Tj +-297 TJm (which) 24.3486 Tj --265 TJm -(is) 6.64505 Tj --265 TJm +-287 TJm +(is) 6.6451 Tj +-288 TJm (the) 12.1743 Tj --266 TJm +-287 TJm (\002rst) 15.5018 Tj --265 TJm -(of) 8.29885 Tj --265 TJm +-287 TJm +(of) 8.2988 Tj +-287 TJm (the) 12.1743 Tj --266 TJm +-288 TJm (compression) 50.3609 Tj --265 TJm +-287 TJm (transformations,) 65.0259 Tj --269 TJm -(is) 6.64505 Tj --265 TJm +-296 TJm +(is) 6.6451 Tj +-288 TJm (entirely) 30.4357 Tj --266 TJm +-287 TJm (irrele) 21.0211 Tj 25 TJm (v) 4.9813 Tj 25 TJm (ant.) 14.6649 Tj --711 TJm +-843 TJm (The) 15.4918 Tj --266 TJm +-288 TJm (original) 30.9936 Tj -86.944 402.267 Td +81.963 397.797 Td (purpose) 31.5416 Tj --301 TJm +-322 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj --301 TJm +(as) 8.2988 Tj +-322 TJm (to) 7.7509 Tj --301 TJm +-322 TJm (protect) 27.6661 Tj --301 TJm +-321 TJm (the) 12.1743 Tj --301 TJm +-322 TJm (sorting) 27.6761 Tj --301 TJm +-322 TJm (algorithm) 38.7446 Tj --301 TJm +-322 TJm (from) 19.3673 Tj --301 TJm +-322 TJm (the) 12.1743 Tj --301 TJm +-322 TJm (v) 4.9813 Tj 15 TJm (ery) 12.7222 Tj --301 TJm +-322 TJm (w) 7.193 Tj 10 TJm (orst) 14.9439 Tj --301 TJm +-321 TJm (case) 17.1456 Tj --301 TJm +-322 TJm (input:) 23.2527 Tj --412 TJm -(a) 4.42339 Tj --301 TJm +-454 TJm +(a) 4.4234 Tj +-322 TJm (string) 22.6948 Tj --301 TJm -(of) 8.29885 Tj --301 TJm +-322 TJm +(of) 8.2988 Tj +-322 TJm (repeated) 33.7433 Tj --301 TJm +-321 TJm (symbols.) 35.706 Tj --927 TJm +-1052 TJm (But) 14.396 Tj -86.944 390.312 Td +81.963 385.842 Td (algorithm) 38.7446 Tj --274 TJm +-229 TJm (steps) 19.9252 Tj --275 TJm +-230 TJm (Q6a) 16.5977 Tj --274 TJm +-229 TJm (and) 14.386 Tj --274 TJm +-230 TJm (Q6b) 17.1556 Tj --275 TJm +-229 TJm (in) 7.7509 Tj --274 TJm -(the) 12.1743 Tj --274 TJm +-230 TJm +(t) 2.7696 Tj +1 TJm +(he) 9.4047 Tj +-230 TJm (original) 30.9936 Tj --275 TJm +-229 TJm (Burro) 23.2427 Tj 25 TJm -(ws-Wheel) 40.3884 Tj -1 TJm -(er) 7.74094 Tj --275 TJm +(ws-Wheeler) 48.1293 Tj +-230 TJm (technical) 35.965 Tj --274 TJm +-229 TJm (report) 23.7907 Tj --274 TJm +-230 TJm (\(SRC-124\)) 43.7259 Tj --275 TJm +-229 TJm (sho) 13.8381 Tj 25 TJm (w) 7.193 Tj --274 TJm +-229 TJm (ho) 9.9626 Tj 25 TJm (w) 7.193 Tj --274 TJm +-230 TJm (repeats) 28.2141 Tj --275 TJm +-229 TJm (can) 13.8281 Tj -86.944 378.357 Td -(be) 9.40469 Tj --250 TJm +-230 TJm +(be) 9.4047 Tj +81.963 373.886 Td (handled) 31.5416 Tj -250 TJm (without) 30.4457 Tj @@ -75631,167 +66372,153 @@ Q (block) 22.1369 Tj -250 TJm (sorting.) 30.1668 Tj -[1 0 0 1 269.617 378.357] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -197.617 -21.5867] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -356.77] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 356.77 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 356.77] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +74.491 351.969 Td +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -356.77] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 356.77 Td -/F130_0 9.9626 Tf +-450 TJm (The) 15.4918 Tj --293 TJm +-315 TJm (randomisation) 57.006 Tj --293 TJm +-314 TJm (mechanism) 45.3796 Tj --293 TJm +-315 TJm (doesn') 26.5603 Tj 18 TJm (t) 2.7696 Tj --294 TJm +-314 TJm (really) 22.6848 Tj --293 TJm +-315 TJm (need) 18.8094 Tj --293 TJm +-315 TJm (to) 7.7509 Tj --293 TJm -(be) 9.40469 Tj --293 TJm +-314 TJm +(be) 9.4047 Tj +-315 TJm (there.) 22.4059 Tj --879 TJm +-1007 TJm (Udi) 14.9439 Tj --294 TJm +-315 TJm (Manber) 30.9837 Tj --293 TJm +-315 TJm (and) 14.386 Tj --293 TJm +-314 TJm (Gene) 21.0211 Tj --293 TJm +-315 TJm (Myers) 25.4544 Tj --293 TJm +-314 TJm (published) 38.7446 Tj --294 TJm -(a) 4.42339 Tj --293 TJm +-315 TJm +(a) 4.4234 Tj +-315 TJm (suf) 12.1743 Tj 25 TJm (\002x) 10.5205 Tj -86.944 344.815 Td +81.963 340.013 Td (array) 20.4632 Tj --238 TJm +-266 TJm (construction) 49.2551 Tj --239 TJm +-266 TJm (algorithm) 38.7446 Tj --238 TJm -(a) 4.42339 Tj --238 TJm -(fe) 7.74094 Tj +-266 TJm +(a) 4.4234 Tj +-266 TJm +(fe) 7.7409 Tj 25 TJm (w) 7.193 Tj --239 TJm +-266 TJm (years) 21.0211 Tj --238 TJm +-266 TJm (back,) 21.3 Tj --241 TJm +-269 TJm (which) 24.3486 Tj --238 TJm +-266 TJm (can) 13.8281 Tj --238 TJm -(be) 9.40469 Tj --239 TJm +-266 TJm +(be) 9.4047 Tj +-266 TJm (emplo) 24.9065 Tj 10 TJm (yed) 14.386 Tj --238 TJm +-266 TJm (to) 7.7509 Tj --238 TJm +-266 TJm (sort) 14.9439 Tj --239 TJm -(an) 9.40469 Tj +-266 TJm +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj --238 TJm +-266 TJm (block,) 24.6275 Tj --241 TJm +-270 TJm (no) 9.9626 Tj --238 TJm +-266 TJm (matter) 25.4544 Tj --238 TJm +-266 TJm (ho) 9.9626 Tj 25 TJm (w) 7.193 Tj --239 TJm +-266 TJm (repetiti) 28.224 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(e,) 6.91404 Tj -86.944 332.86 Td +(e,) 6.914 Tj +81.963 328.058 Td (in) 7.7509 Tj --229 TJm +-257 TJm (O\(N) 17.7035 Tj --230 TJm +-257 TJm (log) 12.7322 Tj --229 TJm +-257 TJm (N\)) 10.5105 Tj --230 TJm +-258 TJm (time.) 20.2042 Tj --606 TJm +-663 TJm (Subsequent) 45.9375 Tj --230 TJm +-257 TJm (w) 7.193 Tj 10 TJm (ork) 13.2801 Tj --229 TJm +-257 TJm (by) 9.9626 Tj --230 TJm +-257 TJm (K) 7.193 Tj 15 TJm (unihik) 25.4644 Tj 10 TJm (o) 4.9813 Tj --229 TJm +-257 TJm (Sadakane) 38.1767 Tj --229 TJm +-258 TJm (has) 13.2801 Tj --230 TJm +-257 TJm (produced) 37.0708 Tj --229 TJm -(a) 4.42339 Tj --230 TJm +-257 TJm +(a) 4.4234 Tj +-257 TJm (deri) 15.4918 Tj 25 TJm (v) 4.9813 Tj @@ -75800,16 +66527,16 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj --229 TJm +(e) 4.4234 Tj +-257 TJm (O\(N) 17.7035 Tj --230 TJm +-257 TJm (\(log) 16.0497 Tj --229 TJm +-258 TJm (N\)^2\)) 23.4818 Tj --230 TJm +-257 TJm (algorithm) 38.7446 Tj -86.944 320.905 Td +81.963 316.103 Td (which) 24.3486 Tj -250 TJm (usually) 28.782 Tj @@ -75823,207 +66550,187 @@ Q (-Myers) 28.772 Tj -250 TJm (algorithm.) 41.2352 Tj -[1 0 0 1 314.189 320.905] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -242.189 -11.7883] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -309.116] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 299.318 Td -/F130_0 9.9626 Tf -(I) 3.31755 Tj --248 TJm +81.963 294.185 Td +(I) 3.3175 Tj +-274 TJm (could) 22.1369 Tj --248 TJm -(ha) 9.40469 Tj +-274 TJm +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj --248 TJm +(e) 4.4234 Tj +-274 TJm (changed) 33.1954 Tj --248 TJm +-274 TJm (to) 7.7509 Tj --248 TJm +-274 TJm (Sadakane') 41.4942 Tj 55 TJm -(s) 3.87545 Tj --248 TJm +(s) 3.8755 Tj +-274 TJm (algorithm,) 41.2352 Tj --249 TJm +-280 TJm (b) 4.9813 Tj 20 TJm (ut) 7.7509 Tj --248 TJm -(I) 3.31755 Tj --248 TJm +-274 TJm +(I) 3.3175 Tj +-274 TJm (\002nd) 15.5018 Tj --248 TJm -(it) 5.53921 Tj --248 TJm +-274 TJm +(it) 5.5392 Tj +-274 TJm (to) 7.7509 Tj --248 TJm -(be) 9.40469 Tj --248 TJm +-274 TJm +(be) 9.4047 Tj +-274 TJm (slo) 11.6264 Tj 25 TJm (wer) 14.9339 Tj --248 TJm +-274 TJm (than) 17.1556 Tj -[1 0 0 1 392.444 299.318] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -392.444 -299.318] cm -[1 0 0 1 0 0] Tm -0 0 Td -392.444 299.318 Td -/F134_0 9.9626 Tf +391.407 294.185 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 422.332 299.318] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -422.332 -299.318] cm -[1 0 0 1 0 0] Tm -0 0 Td -422.332 299.318 Td -/F130_0 9.9626 Tf -(') 3.31755 Tj +421.295 294.185 Td +/F122_0 9.9626 Tf +(') 3.3175 Tj 55 TJm -(s) 3.87545 Tj --248 TJm -(e) 4.42339 Tj +(s) 3.8755 Tj +-274 TJm +(e) 4.4234 Tj 15 TJm (xisting) 27.1282 Tj --248 TJm +-274 TJm (algorithm) 38.7446 Tj --248 TJm +-274 TJm (for) 11.6164 Tj --248 TJm +-274 TJm (most) 19.3773 Tj -86.944 287.363 Td +81.963 282.23 Td (inputs,) 26.8492 Tj --370 TJm +-399 TJm (and) 14.386 Tj --345 TJm +-369 TJm (the) 12.1743 Tj --346 TJm +-369 TJm (randomisation) 57.006 Tj --346 TJm -(mechanism) 45.3796 Tj --345 TJm +-370 TJm +(me) 12.1743 Tj +1 TJm +(chanism) 33.2053 Tj +-370 TJm (protects) 31.5416 Tj --346 TJm +-369 TJm (adequately) 43.158 Tj --345 TJm -(ag) 9.40469 Tj +-369 TJm +(ag) 9.4047 Tj 5 TJm (ainst) 18.8194 Tj --346 TJm +-369 TJm (bad) 14.386 Tj --346 TJm +-369 TJm (cases.) 23.5117 Tj --1194 TJm -(I) 3.31755 Tj --345 TJm +-1336 TJm +(I) 3.3175 Tj +-369 TJm (didn') 21.031 Tj 18 TJm (t) 2.7696 Tj --346 TJm +-369 TJm (think) 20.4831 Tj --346 TJm -(it) 5.53921 Tj --345 TJm +-369 TJm +(it) 5.5392 Tj +-369 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj --346 TJm -(a) 4.42339 Tj --346 TJm +(as) 8.2988 Tj +-369 TJm +(a) 4.4234 Tj +-370 TJm (good) 19.9252 Tj -86.944 275.408 Td +81.963 270.275 Td (tradeof) 28.2141 Tj 25 TJm -(f) 3.31755 Tj --262 TJm +(f) 3.3175 Tj +-282 TJm (to) 7.7509 Tj --261 TJm +-283 TJm (mak) 17.1556 Tj 10 TJm -(e.) 6.91404 Tj --690 TJm -(P) 5.53921 Tj +(e.) 6.914 Tj +-815 TJm +(P) 5.5392 Tj 15 TJm (artly) 18.2614 Tj --262 TJm +-282 TJm (this) 14.396 Tj --261 TJm -(is) 6.64505 Tj --262 TJm +-282 TJm +(is) 6.6451 Tj +-283 TJm (due) 14.386 Tj --261 TJm +-282 TJm (to) 7.7509 Tj --262 TJm +-283 TJm (the) 12.1743 Tj --262 TJm -(f) 3.31755 Tj +-282 TJm +(f) 3.3175 Tj 10 TJm (act) 11.6164 Tj --261 TJm +-283 TJm (that) 14.9439 Tj --262 TJm -(I) 3.31755 Tj --261 TJm +-282 TJm +(I) 3.3175 Tj +-283 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj --262 TJm +(as) 8.2988 Tj +-282 TJm (not) 12.7322 Tj --262 TJm +-282 TJm (\003ooded) 29.8878 Tj --261 TJm +-283 TJm (with) 17.7135 Tj --262 TJm +-282 TJm (email) 22.1369 Tj --261 TJm +-283 TJm (complaints) 43.7259 Tj --262 TJm +-282 TJm (about) 22.1369 Tj -[1 0 0 1 479.557 275.408] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -479.557 -275.408] cm -[1 0 0 1 0 0] Tm -0 0 Td -479.557 275.408 Td -/F134_0 9.9626 Tf +479.557 270.275 Td +/F124_0 9.9626 Tf (bzip2-0.1) 53.798 Tj -[1 0 0 1 533.355 275.408] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -533.355 -275.408] cm -[1 0 0 1 0 0] Tm -0 0 Td -533.355 275.408 Td -/F130_0 9.9626 Tf -(') 3.31755 Tj +533.355 270.275 Td +/F122_0 9.9626 Tf +(') 3.3175 Tj 55 TJm -(s) 3.87545 Tj -86.944 263.453 Td +(s) 3.8755 Tj +81.963 258.32 Td (performance) 50.341 Tj -250 TJm (on) 9.9626 Tj @@ -76032,21 +66739,21 @@ Q 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm (data,) 19.0883 Tj -250 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -250 TJm (perhaps) 30.9837 Tj -250 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -250 TJm (isn') 14.9439 Tj 18 TJm (t) 2.7696 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (problem) 33.2053 Tj -250 TJm @@ -76055,334 +66762,308 @@ Q (real) 14.9339 Tj -250 TJm (inputs.) 26.8492 Tj -[1 0 0 1 72 261.296] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.6315] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -251.664] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 241.866 Td -/F130_0 9.9626 Tf +81.963 236.402 Td (Probably) 35.9749 Tj --289 TJm +-314 TJm (the) 12.1743 Tj --288 TJm +-315 TJm (best) 16.0497 Tj --289 TJm +-314 TJm (long-term) 39.2925 Tj --289 TJm +-314 TJm (solution,) 34.6001 Tj --298 TJm +-331 TJm (and) 14.386 Tj --289 TJm +-314 TJm (the) 12.1743 Tj --289 TJm +-314 TJm (one) 14.386 Tj --288 TJm -(I) 3.31755 Tj --289 TJm -(ha) 9.40469 Tj +-315 TJm +(I) 3.3175 Tj +-314 TJm +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj --289 TJm +(e) 4.4234 Tj +-314 TJm (incorporated) 50.351 Tj --288 TJm +-315 TJm (into) 15.5018 Tj --289 TJm +-314 TJm (0.9.5) 19.9252 Tj --289 TJm +-314 TJm (and) 14.386 Tj --288 TJm +-315 TJm (abo) 14.386 Tj 15 TJm (v) 4.9813 Tj -14 TJm -(e,) 6.91404 Tj --298 TJm -(is) 6.64505 Tj --289 TJm +15 TJm +(e,) 6.914 Tj +-330 TJm +(is) 6.6451 Tj +-315 TJm (to) 7.7509 Tj --288 TJm +-314 TJm (use) 13.2801 Tj --289 TJm +-314 TJm (the) 12.1743 Tj --289 TJm -(e) 4.42339 Tj +-315 TJm +(e) 4.4234 Tj 15 TJm (xisting) 27.1282 Tj -86.944 229.911 Td +81.963 224.447 Td (sorting) 27.6761 Tj --451 TJm +-206 TJm (algorithm) 38.7446 Tj --452 TJm +-206 TJm (initially) 31.0036 Tj 65 TJm -(,) 2.49065 Tj --501 TJm +(,) 2.4907 Tj +-215 TJm (and) 14.386 Tj --452 TJm -(f) 3.31755 Tj +-207 TJm +(f) 3.3175 Tj 10 TJm (all) 9.9626 Tj --451 TJm +-206 TJm (back) 18.8094 Tj --452 TJm +-206 TJm (to) 7.7509 Tj --451 TJm -(a) 4.42339 Tj --451 TJm +-206 TJm +(a) 4.4234 Tj +-207 TJm (O\(N) 17.7035 Tj --452 TJm +-206 TJm (\(log) 16.0497 Tj --451 TJm +-206 TJm (N\)^2\)) 23.4818 Tj --451 TJm +-206 TJm (algorithm) 38.7446 Tj --452 TJm -(if) 6.08715 Tj --451 TJm +-206 TJm +(if) 6.0871 Tj +-207 TJm (the) 12.1743 Tj --452 TJm +-206 TJm (standard) 33.7533 Tj --451 TJm +-206 TJm (algorithm) 38.7446 Tj --451 TJm +-206 TJm (gets) 16.0497 Tj --452 TJm +-206 TJm (into) 15.5018 Tj -86.944 217.956 Td +-207 TJm (dif) 11.0684 Tj 25 TJm (\002culties.) 34.0422 Tj -[1 0 0 1 72 217.856] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -21.4871] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -196.369] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 196.369 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 196.369] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +74.491 202.529 Td +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -196.369] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 196.369 Td -/F130_0 9.9626 Tf +-450 TJm (The) 15.4918 Tj --299 TJm +-321 TJm (compressed) 47.0334 Tj --299 TJm +-322 TJm (\002le) 12.7322 Tj --299 TJm +-321 TJm (format) 26.5603 Tj --299 TJm +-321 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj --300 TJm -(ne) 9.40469 Tj +(as) 8.2988 Tj +-322 TJm +(ne) 9.4047 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj --299 TJm +(er) 7.7409 Tj +-321 TJm (designed) 35.417 Tj --299 TJm +-321 TJm (to) 7.7509 Tj --299 TJm -(be) 9.40469 Tj --299 TJm +-322 TJm +(be) 9.4047 Tj +-321 TJm (handled) 31.5416 Tj --299 TJm +-321 TJm (by) 9.9626 Tj --299 TJm -(a) 4.42339 Tj --299 TJm +-322 TJm +(a) 4.4234 Tj +-321 TJm (library) 26.5603 Tj 65 TJm -(,) 2.49065 Tj --312 TJm +(,) 2.4907 Tj +-339 TJm (and) 14.386 Tj --299 TJm -(I) 3.31755 Tj --299 TJm -(ha) 9.40469 Tj +-322 TJm +(I) 3.3175 Tj +-321 TJm +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj --299 TJm +(e) 4.4234 Tj +-321 TJm (had) 14.386 Tj --299 TJm +-322 TJm (to) 7.7509 Tj --299 TJm +-321 TJm (jump) 20.4831 Tj --300 TJm +-321 TJm (though) 27.6761 Tj --299 TJm +-322 TJm (some) 21.031 Tj -86.944 184.414 Td +81.963 190.574 Td (hoops) 23.8007 Tj --278 TJm -(to) 7.7509 Tj --277 TJm +-299 TJm +(t) 2.7696 Tj +1 TJm +(o) 4.9813 Tj +-299 TJm (produce) 32.0895 Tj --278 TJm -(an) 9.40469 Tj --278 TJm -(ef) 7.74094 Tj +-299 TJm +(an) 9.4047 Tj +-298 TJm +(ef) 7.7409 Tj 25 TJm (\002cient) 24.9065 Tj --277 TJm +-299 TJm (implementation) 62.5452 Tj --278 TJm -(of) 8.29885 Tj --278 TJm +-298 TJm +(of) 8.2988 Tj +-299 TJm (decompression.) 62.2563 Tj --786 TJm -(It') 9.40469 Tj +-911 TJm +(It') 9.4047 Tj 55 TJm -(s) 3.87545 Tj --278 TJm -(a) 4.42339 Tj --277 TJm +(s) 3.8755 Tj +-298 TJm +(a) 4.4234 Tj +-299 TJm (bit) 10.5205 Tj --278 TJm +-298 TJm (hairy) 20.4731 Tj 65 TJm -(.) 2.49065 Tj --786 TJm -(T) 6.08715 Tj +(.) 2.4907 Tj +-912 TJm +(T) 6.0871 Tj 35 TJm -(ry) 8.29885 Tj --278 TJm +(ry) 8.2988 Tj +-298 TJm (passing) 29.8878 Tj -[1 0 0 1 468.269 184.414] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468.269 -184.414] cm -[1 0 0 1 0 0] Tm -0 0 Td -468.269 184.414 Td -/F134_0 9.9626 Tf +468.269 190.574 Td +/F124_0 9.9626 Tf (decompress.c) 71.7307 Tj -[1 0 0 1 540 184.414] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -184.414] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 172.459 Td -/F130_0 9.9626 Tf +81.963 178.619 Td +/F122_0 9.9626 Tf (through) 30.9936 Tj --268 TJm +-289 TJm (the) 12.1743 Tj --268 TJm -(C) 6.64505 Tj --268 TJm +-289 TJm +(C) 6.6451 Tj +-289 TJm (preprocessor) 50.8989 Tj --269 TJm +-289 TJm (and) 14.386 Tj --268 TJm +-289 TJm (you') 18.2614 Tj 10 TJm -(ll) 5.53921 Tj --268 TJm +(ll) 5.5392 Tj +-289 TJm (see) 12.7222 Tj --268 TJm +-289 TJm (what) 19.3673 Tj --268 TJm -(I) 3.31755 Tj --268 TJm +-289 TJm +(I) 3.3175 Tj +-289 TJm (mean.) 24.0696 Tj --729 TJm +-854 TJm (Much) 23.2427 Tj --268 TJm -(of) 8.29885 Tj --269 TJm +-289 TJm +(of) 8.2988 Tj +-289 TJm (this) 14.396 Tj --268 TJm +-289 TJm (comple) 29.3299 Tj 15 TJm (xity) 15.5018 Tj --268 TJm +-289 TJm (could) 22.1369 Tj --268 TJm -(ha) 9.40469 Tj +-289 TJm +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj --268 TJm +(e) 4.4234 Tj +-289 TJm (been) 18.8094 Tj --268 TJm -(a) 4.42339 Tj +-289 TJm +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 20 TJm (oided) 22.1369 Tj --269 TJm -(if) 6.08715 Tj --268 TJm +-289 TJm +(if) 6.0871 Tj +-289 TJm (the) 12.1743 Tj -86.944 160.503 Td +81.963 166.663 Td (compressed) 47.0334 Tj -250 TJm (size) 15.4918 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (each) 18.2515 Tj -250 TJm (block) 22.1369 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (data) 16.5977 Tj -250 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -250 TJm (recorded) 34.8492 Tj -250 TJm @@ -76393,47 +67074,33 @@ Q (data) 16.5977 Tj -250 TJm (stream.) 29.0509 Tj -[1 0 0 1 368.754 160.503] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -296.754 -21.5867] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -138.917] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 138.917 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 138.917] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +74.491 144.746 Td +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -138.917] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 138.917 Td -/F130_0 9.9626 Tf +-450 TJm (An) 12.1743 Tj -250 TJm (Adler) 22.6848 Tj @@ -76446,7 +67113,7 @@ Q -250 TJm (than) 17.1556 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (CRC32) 29.8978 Tj -250 TJm @@ -76456,39 +67123,33 @@ Q 10 TJm (ould) 17.7135 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (aster) 18.8094 Tj -250 TJm (to) 7.7509 Tj -250 TJm (compute.) 36.8018 Tj -[1 0 0 1 424.934 138.917] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -352.934 -11.7883] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -127.128] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 117.33 Td -/F130_0 9.9626 Tf -(It) 6.08715 Tj +72 122.828 Td +(It) 6.0871 Tj -349 TJm (w) 7.193 Tj 10 TJm (ould) 17.7135 Tj -349 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -349 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (air) 10.5105 Tj -348 TJm @@ -76499,38 +67160,30 @@ Q (that) 14.9439 Tj -349 TJm (the) 12.1743 Tj -[1 0 0 1 201.979 117.33] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -201.979 -117.33] cm -[1 0 0 1 0 0] Tm -0 0 Td -201.979 117.33 Td -/F134_0 9.9626 Tf +201.979 122.828 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 231.867 117.33] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -231.867 -117.33] cm -[1 0 0 1 0 0] Tm -0 0 Td -235.342 117.33 Td -/F130_0 9.9626 Tf +235.342 122.828 Td +/F122_0 9.9626 Tf (format) 26.5603 Tj -349 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -349 TJm (frozen) 25.4445 Tj -348 TJm (before) 25.4445 Tj -349 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -349 TJm (properly) 33.7533 Tj -349 TJm @@ -76543,29 +67196,23 @@ Q (the) 12.1743 Tj -349 TJm (performance) 50.341 Tj -72 105.375 Td +72 110.873 Td (consequences) 54.7744 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (doing) 22.6948 Tj -250 TJm (so.) 11.3474 Tj -[1 0 0 1 72 103.218] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.6315] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -93.5867] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 83.7883 Td -/F130_0 9.9626 Tf +72 88.955 Td (Impro) 24.3486 Tj 15 TJm (v) 4.9813 Tj @@ -76574,11 +67221,11 @@ Q -250 TJm (which) 24.3486 Tj -250 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -250 TJm (w) 7.193 Tj 10 TJm -(as) 8.29885 Tj +(as) 8.2988 Tj -250 TJm (able) 16.5977 Tj -250 TJm @@ -76603,22 +67250,14 @@ Q (format,) 29.0509 Tj -250 TJm (are:) 14.9339 Tj -[1 0 0 1 72 81.6315] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -30.7796] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -76643,7 +67282,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -76652,12 +67290,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -76666,18 +67298,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (31) 9.9626 Tj -[1 0 0 1 453.269 50.8519] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -76686,7 +67320,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -76695,12 +67328,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -76709,7 +67340,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 35 35 +%%Page: 32 35 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -76727,20 +67358,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -76765,7 +67392,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -76774,12 +67400,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -6.8541] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -76788,18 +67408,23 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 116.328 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -382.4 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 498.728 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Miscellanea) 48.1393 Tj -[1 0 0 1 266.071 749.146] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -76808,7 +67433,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -76817,105 +67441,92 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -7.0936] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -31.5168] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td -78.9739 710.037 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 710.037] cm +74.491 710.037 Td +/F122_0 9.9626 Tf +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -86.944 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 710.037 Td -/F130_0 9.9626 Tf +-450 TJm (Single) 25.4644 Tj --202 TJm +-234 TJm (array) 20.4632 Tj --201 TJm +-234 TJm (implementation) 62.5452 Tj --202 TJm -(of) 8.29885 Tj --202 TJm +-235 TJm +(of) 8.2988 Tj +-234 TJm (the) 12.1743 Tj --201 TJm +-234 TJm (in) 7.7509 Tj 40 TJm (v) 4.9813 Tj 15 TJm (erse) 16.0398 Tj --202 TJm +-234 TJm (BWT) 22.1369 Tj 74 TJm -(.) 2.49065 Tj --403 TJm +(.) 2.4907 Tj +-469 TJm (This) 17.7135 Tj --202 TJm +-234 TJm (signi\002cantly) 49.2651 Tj --201 TJm +-235 TJm (speeds) 26.5603 Tj --202 TJm +-234 TJm (up) 9.9626 Tj --202 TJm +-234 TJm (decompression,) 62.2563 Tj --211 TJm +-237 TJm (presumably) 46.4855 Tj --202 TJm +-235 TJm (because) 31.5316 Tj -86.944 698.082 Td -(it) 5.53921 Tj +81.963 698.082 Td +(it) 5.5392 Tj -250 TJm (reduces) 30.4258 Tj -250 TJm @@ -76923,139 +67534,93 @@ Q -250 TJm (number) 30.4357 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (cache) 22.6749 Tj -250 TJm (misses.) 29.0609 Tj -[1 0 0 1 240.496 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -168.496 -21.9178] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 676.164 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 676.164] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +74.491 676.164 Td +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -676.164] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 676.164 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +-450 TJm +(F) 5.5392 Tj 15 TJm (aster) 18.8094 Tj --314 TJm +-338 TJm (in) 7.7509 Tj 40 TJm (v) 4.9813 Tj 15 TJm (erse) 16.0398 Tj --315 TJm +-338 TJm (MTF) 20.4831 Tj --314 TJm +-338 TJm (transform) 38.7346 Tj --315 TJm +-338 TJm (for) 11.6164 Tj --314 TJm +-339 TJm (lar) 10.5105 Tj 18 TJm -(ge) 9.40469 Tj --315 TJm +(ge) 9.4047 Tj +-338 TJm (MTF) 20.4831 Tj --314 TJm +-338 TJm (v) 4.9813 Tj 25 TJm (alues.) 22.9638 Tj --504 TJm +-574 TJm (The) 15.4918 Tj --314 TJm -(ne) 9.40469 Tj +-338 TJm +(ne) 9.4047 Tj 25 TJm (w) 7.193 Tj --314 TJm +-339 TJm (implementation) 62.5452 Tj --315 TJm -(is) 6.64505 Tj --314 TJm +-338 TJm +(is) 6.6451 Tj +-338 TJm (based) 22.6848 Tj --315 TJm +-338 TJm (on) 9.9626 Tj --314 TJm +-338 TJm (the) 12.1743 Tj --315 TJm +-338 TJm (notion) 25.4644 Tj --314 TJm -(of) 8.29885 Tj --315 TJm +-339 TJm +(of) 8.2988 Tj +-338 TJm (sliding) 27.1282 Tj -86.944 664.209 Td +81.963 664.209 Td (blocks) 26.0123 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (v) 4.9813 Tj 25 TJm (alues.) 22.9638 Tj -[1 0 0 1 153.932 664.209] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -81.9321 -21.9178] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 6.9739 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -78.9739 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 642.291 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 642.291] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -77064,181 +67629,158 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 642.291 Td -/F134_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +74.491 642.291 Td +(\225) 3.4869 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +82.461 642.291 Td +/F124_0 9.9626 Tf (bzip2-0.9.0) 65.7532 Tj -[1 0 0 1 152.697 642.291] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -152.697 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -155.412 642.291 Td -/F130_0 9.9626 Tf +151.137 642.291 Td +/F122_0 9.9626 Tf (no) 9.9626 Tj 25 TJm (w) 7.193 Tj --272 TJm +-293 TJm (reads) 21.0211 Tj --273 TJm +-294 TJm (and) 14.386 Tj --272 TJm +-293 TJm (writes) 24.3486 Tj --273 TJm +-293 TJm (\002les) 16.6077 Tj --272 TJm +-294 TJm (with) 17.7135 Tj -[1 0 0 1 282.68 642.291] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -282.68 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -282.68 642.291 Td -/F134_0 9.9626 Tf +279.657 642.291 Td +/F124_0 9.9626 Tf (fread) 29.8878 Tj -[1 0 0 1 312.568 642.291] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -312.568 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -315.282 642.291 Td -/F130_0 9.9626 Tf +312.467 642.291 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 332.383 642.291] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -332.383 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -332.383 642.291 Td -/F134_0 9.9626 Tf +329.776 642.291 Td +/F124_0 9.9626 Tf (fwrite) 35.8654 Tj -[1 0 0 1 368.248 642.291] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -368.248 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -368.248 642.291 Td -/F130_0 9.9626 Tf +365.642 642.291 Td +/F122_0 9.9626 Tf (;) 2.7696 Tj --284 TJm +-315 TJm (v) 4.9813 Tj 15 TJm (ersion) 24.3486 Tj --272 TJm +-293 TJm (0.1) 12.4533 Tj --273 TJm +-294 TJm (used) 18.2614 Tj -[1 0 0 1 441.882 642.291] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -441.882 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -441.882 642.291 Td -/F134_0 9.9626 Tf +440.214 642.291 Td +/F124_0 9.9626 Tf (putc) 23.9102 Tj -[1 0 0 1 465.792 642.291] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -465.792 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -468.507 642.291 Td -/F130_0 9.9626 Tf +467.047 642.291 Td +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 485.607 642.291] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -485.607 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -485.607 642.291 Td -/F134_0 9.9626 Tf +484.356 642.291 Td +/F124_0 9.9626 Tf (getc) 23.9102 Tj -[1 0 0 1 509.517 642.291] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -509.517 -642.291] cm -[1 0 0 1 0 0] Tm -0 0 Td -509.517 642.291 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj --755 TJm +508.266 642.291 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj +-880 TJm (Duh!) 20.4731 Tj -86.944 630.336 Td -(W) 9.40469 Tj +81.963 630.336 Td +(W) 9.4047 Tj 80 TJm (ell,) 12.4533 Tj -250 TJm (you) 14.9439 Tj -250 TJm -(li) 5.53921 Tj +(li) 5.5392 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm (and) 14.386 Tj -250 TJm (learn.) 22.4059 Tj -[1 0 0 1 184.248 630.336] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -112.248 -12.1195] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -618.217] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 608.418 Td -/F130_0 9.9626 Tf (Further) 29.3299 Tj -304 TJm (ahead,) 25.7234 Tj -318 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -305 TJm (w) 7.193 Tj 10 TJm (ould) 17.7135 Tj -304 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -305 TJm (nice) 16.5977 Tj -304 TJm (to) 7.7509 Tj -305 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -304 TJm (able) 16.5977 Tj -304 TJm @@ -77266,14 +67808,13 @@ Q -304 TJm (design) 26.0123 Tj -305 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj 72 596.463 Td (compressed) 47.0334 Tj -250 TJm (\002le) 12.7322 Tj -250 TJm (formats.) 32.9264 Tj -[1 0 0 1 72 594.306] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -77302,7 +67843,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -77311,11 +67851,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -584.344] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 561.71 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (4.2.) 34.4584 Tj -278 TJm (P) 13.7792 Tj @@ -77325,7 +67862,6 @@ Q (tability) 66.5823 Tj -278 TJm (issues) 64.3099 Tj -[1 0 0 1 72 557.434] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -77350,29 +67886,25 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -547.472] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 539.793 Td -/F130_0 9.9626 Tf +72 539.792 Td +/F122_0 9.9626 Tf (After) 21.0211 Tj -250 TJm (some) 21.031 Tj -250 TJm (consideration,) 56.1691 Tj -250 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -250 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm (decided) 30.9837 Tj -250 TJm @@ -77383,42 +67915,28 @@ Q (use) 13.2801 Tj -250 TJm (GNU) 21.579 Tj -[1 0 0 1 303.231 539.793] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -303.231 -539.793] cm -[1 0 0 1 0 0] Tm -0 0 Td -303.231 539.793 Td -/F134_0 9.9626 Tf +303.231 539.792 Td +/F124_0 9.9626 Tf (autoconf) 47.8205 Tj -[1 0 0 1 351.052 539.793] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -351.052 -539.793] cm -[1 0 0 1 0 0] Tm -0 0 Td -353.542 539.793 Td -/F130_0 9.9626 Tf +353.542 539.792 Td +/F122_0 9.9626 Tf (to) 7.7509 Tj -250 TJm (con\002gure) 37.6287 Tj -250 TJm (0.9.5) 19.9252 Tj -250 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm (1.0.) 14.9439 Tj -[1 0 0 1 72 537.636] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -77427,23 +67945,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -527.673] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 517.875 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (autoconf) 47.8205 Tj -[1 0 0 1 119.821 517.875] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -119.821 -517.875] cm -[1 0 0 1 0 0] Tm -0 0 Td 119.821 517.875 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -502 TJm (admirable) 39.8404 Tj -452 TJm @@ -77455,7 +67970,7 @@ Q -452 TJm (though) 27.6761 Tj -452 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -452 TJm (is,) 9.1357 Tj -502 TJm @@ -77473,41 +67988,33 @@ Q -452 TJm (Unix-lik) 33.7633 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 72 505.92 Td (platforms.) 40.6773 Tj -1398 TJm (But) 14.396 Tj -[1 0 0 1 144.784 505.92] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -144.784 -505.92] cm -[1 0 0 1 0 0] Tm -0 0 Td 144.784 505.92 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 174.672 505.92] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -174.672 -505.92] cm -[1 0 0 1 0 0] Tm -0 0 Td 178.455 505.92 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (doesn') 26.5603 Tj 18 TJm (t) 2.7696 Tj -380 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -379 TJm (much) 22.1369 Tj -380 TJm @@ -77517,9 +68024,9 @@ Q -379 TJm (w) 7.193 Tj 10 TJm -(ay) 9.40469 Tj +(ay) 9.4047 Tj -380 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -380 TJm (portability) 41.5142 Tj -379 TJm @@ -77531,7 +68038,7 @@ Q -444 TJm (most) 19.3773 Tj -380 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -380 TJm (the) 12.1743 Tj -379 TJm @@ -77543,9 +68050,9 @@ Q -297 TJm (when) 21.579 Tj -296 TJm -(po) 9.9626 Tj +(p) 4.9813 Tj -1 TJm -(r) 3.31755 Tj +(or) 8.2988 Tj 1 TJm (ting) 15.5018 Tj -297 TJm @@ -77555,46 +68062,38 @@ Q -297 TJm (Mac,) 20.1942 Tj -308 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -297 TJm (to) 7.7509 Tj -297 TJm (Microsoft') 42.61 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -296 TJm (operating) 37.6287 Tj -297 TJm (systems.) 34.0422 Tj -[1 0 0 1 361.339 493.964] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -361.339 -493.964] cm -[1 0 0 1 0 0] Tm -0 0 Td 361.339 493.964 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (autoconf) 47.8205 Tj -[1 0 0 1 409.16 493.964] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -409.16 -493.964] cm -[1 0 0 1 0 0] Tm -0 0 Td 412.116 493.964 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (doesn') 26.5603 Tj 18 TJm (t) 2.7696 Tj -297 TJm (help) 17.1556 Tj --296 TJm -(in) 7.7509 Tj -297 TJm +(in) 7.7509 Tj +-296 TJm (those) 21.031 Tj -297 TJm (cases,) 23.5117 Tj @@ -77605,15 +68104,15 @@ Q -250 TJm (in) 7.7509 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (whole) 24.3486 Tj -250 TJm (load) 17.1556 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 25 TJm (w) 7.193 Tj -250 TJm @@ -77621,29 +68120,23 @@ Q 15 TJm (xity) 15.5018 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 479.852] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -469.89] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 460.091 Td -/F130_0 9.9626 Tf (Most) 20.4831 Tj -392 TJm (people) 26.5603 Tj -392 TJm (should) 26.5703 Tj -393 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -392 TJm (able) 16.5977 Tj -392 TJm @@ -77667,7 +68160,7 @@ Q -392 TJm (out-of-the-box,) 60.5925 Tj -428 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -392 TJm (to) 7.7509 Tj -393 TJm @@ -77675,83 +68168,69 @@ Q 72 448.136 Td (especially) 39.8404 Tj -250 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -250 TJm (you) 14.9439 Tj -250 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (v) 4.9813 Tj 15 TJm (ersion) 24.3486 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (GNU) 21.579 Tj -250 TJm -(C) 6.64505 Tj +(C) 6.6451 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 25 TJm (ailable.) 29.0509 Tj -[1 0 0 1 72 445.979] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -436.017] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 426.218 Td -/F130_0 9.9626 Tf (There) 23.2328 Tj -259 TJm (are) 12.1643 Tj -258 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -259 TJm (couple) 26.5603 Tj -258 TJm -(of) 8.29885 Tj -[1 0 0 1 159.561 426.218] cm +(of) 8.2988 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -159.561 -426.218] cm -[1 0 0 1 0 0] Tm -0 0 Td 159.561 426.218 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (__inline__) 59.7756 Tj -[1 0 0 1 219.337 426.218] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -219.337 -426.218] cm -[1 0 0 1 0 0] Tm -0 0 Td 221.913 426.218 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (directi) 25.4544 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -259 TJm (in) 7.7509 Tj -258 TJm @@ -77761,49 +68240,41 @@ Q -671 TJm (GNU) 21.579 Tj -259 TJm -(C) 6.64505 Tj +(C) 6.6451 Tj -258 TJm -(\() 3.31755 Tj -[1 0 0 1 352.587 426.218] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -352.587 -426.218] cm -[1 0 0 1 0 0] Tm -0 0 Td 352.587 426.218 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (gcc) 17.9327 Tj -[1 0 0 1 370.52 426.218] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -370.52 -426.218] cm -[1 0 0 1 0 0] Tm -0 0 Td 370.52 426.218 Td -/F130_0 9.9626 Tf -(\)) 3.31755 Tj +/F122_0 9.9626 Tf +(\)) 3.3175 Tj -259 TJm (should) 26.5703 Tj -258 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -259 TJm (able) 16.5977 Tj -258 TJm (to) 7.7509 Tj -259 TJm (handle) 26.5603 Tj --259 TJm +-258 TJm (them.) 22.4159 Tj --671 TJm -(If) 6.63509 Tj +-672 TJm +(If) 6.6351 Tj -259 TJm (you') 18.2614 Tj 50 TJm -(re) 7.74094 Tj +(re) 7.7409 Tj 72 414.263 Td (not) 12.7322 Tj -279 TJm @@ -77815,7 +68286,7 @@ Q -279 TJm (your) 18.2614 Tj -279 TJm -(C) 6.64505 Tj +(C) 6.6451 Tj -279 TJm (compiler) 35.417 Tj -279 TJm @@ -77831,7 +68302,7 @@ Q -279 TJm (all.) 12.4533 Tj -794 TJm -(If) 6.63509 Tj +(If) 6.6351 Tj -279 TJm (your) 18.2614 Tj -279 TJm @@ -77857,79 +68328,57 @@ Q -283 TJm (lik) 10.5205 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -283 TJm (them,) 22.4159 Tj -291 TJm (just) 14.396 Tj -[1 0 0 1 164.167 402.308] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -164.167 -402.308] cm -[1 0 0 1 0 0] Tm -0 0 Td 164.167 402.308 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (#define) 41.8429 Tj -[1 0 0 1 206.01 402.308] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.8196 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -208.829 -402.308] cm -[1 0 0 1 0 0] Tm -0 0 Td -208.829 402.308 Td -/F134_0 9.9626 Tf +-283 TJm (__inline__) 59.7756 Tj -[1 0 0 1 268.605 402.308] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -268.605 -402.308] cm -[1 0 0 1 0 0] Tm -0 0 Td 271.425 402.308 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj -283 TJm -(be) 9.40469 Tj -[1 0 0 1 294.22 402.308] cm +(be) 9.4047 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -294.22 -402.308] cm -[1 0 0 1 0 0] Tm -0 0 Td 294.22 402.308 Td -/F134_0 9.9626 Tf -(/) 5.97756 Tj +/F124_0 9.9626 Tf +(/) 5.9776 Tj 300.197 400.565 Td -(*) 5.97756 Tj +(*) 5.9776 Tj -600 TJm -(*) 5.97756 Tj +(*) 5.9776 Tj 318.13 402.308 Td -(/) 5.97756 Tj -[1 0 0 1 324.108 402.308] cm +(/) 5.9776 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -324.108 -402.308] cm -[1 0 0 1 0 0] Tm -0 0 Td 324.108 402.308 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -818 TJm (One) 16.5977 Tj -283 TJm @@ -77937,7 +68386,7 @@ Q -283 TJm (w) 7.193 Tj 10 TJm -(ay) 9.40469 Tj +(ay) 9.4047 Tj -283 TJm (to) 7.7509 Tj -283 TJm @@ -77945,7 +68394,7 @@ Q -283 TJm (this) 14.396 Tj -283 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -283 TJm (to) 7.7509 Tj -283 TJm @@ -77956,34 +68405,26 @@ Q (the) 12.1743 Tj -283 TJm (\003ag) 14.9439 Tj -[1 0 0 1 72 390.353] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -390.353] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 390.353 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (-D__inline__=) 77.7083 Tj -[1 0 0 1 149.709 390.353] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -149.709 -390.353] cm -[1 0 0 1 0 0] Tm -0 0 Td 149.709 390.353 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -250 TJm (which) 24.3486 Tj -250 TJm (should) 26.5703 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (understood) 44.2738 Tj -250 TJm @@ -77994,32 +68435,26 @@ Q (Unix) 19.9252 Tj -250 TJm (compilers.) 41.7831 Tj -[1 0 0 1 72 388.196] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -378.233] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 368.435 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj +(If) 6.6351 Tj -321 TJm (you) 14.9439 Tj -321 TJm (still) 14.9539 Tj -322 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -321 TJm (dif) 11.0684 Tj 25 TJm @@ -78033,30 +68468,22 @@ Q -322 TJm (t) 2.7696 Tj 1 TJm -(he) 9.40469 Tj +(he) 9.4047 Tj -322 TJm (macro) 24.8965 Tj -[1 0 0 1 310.295 368.435] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -310.295 -368.435] cm -[1 0 0 1 0 0] Tm -0 0 Td 310.295 368.435 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_STRICT_ANSI) 83.6858 Tj -[1 0 0 1 393.981 368.435] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -393.981 -368.435] cm -[1 0 0 1 0 0] Tm -0 0 Td -397.18 368.435 Td -/F130_0 9.9626 Tf +397.181 368.435 Td +/F122_0 9.9626 Tf (de\002ned.) 31.8205 Tj -524 TJm (This) 17.7135 Tj @@ -78079,7 +68506,7 @@ Q -322 TJm (in) 7.7509 Tj -321 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -321 TJm (strictly) 27.6761 Tj -321 TJm @@ -78087,7 +68514,7 @@ Q -321 TJm (compliant) 39.8504 Tj -322 TJm -(en) 9.40469 Tj +(en) 9.4047 Tj 40 TJm (vironment.) 43.4469 Tj -1047 TJm @@ -78101,11 +68528,11 @@ Q -321 TJm (lik) 10.5205 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -321 TJm (this) 14.396 Tj -321 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -321 TJm (dangerous) 40.9463 Tj -322 TJm @@ -78123,49 +68550,41 @@ Q 15 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj -[1 0 0 1 204.498 344.525] cm +(e) 4.4234 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -204.498 -344.525] cm -[1 0 0 1 0 0] Tm -0 0 Td 204.498 344.525 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 234.386 344.525] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -234.386 -344.525] cm -[1 0 0 1 0 0] Tm -0 0 Td 234.386 344.525 Td -/F130_0 9.9626 Tf -(') 3.31755 Tj +/F122_0 9.9626 Tf +(') 3.3175 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -260 TJm (checks) 27.1082 Tj -260 TJm -(ag) 9.40469 Tj +(ag) 9.4047 Tj 5 TJm (ainst) 18.8194 Tj --261 TJm -(compressi) 40.3983 Tj -1 TJm -(ng) 9.9626 Tj +-260 TJm +(compressing) 50.3609 Tj -261 TJm (directories,) 44.5428 Tj -262 TJm (symbolic) 36.5329 Tj -261 TJm -(links,) 21.8679 Tj --262 TJm -(de) 9.40469 Tj +(li) 5.5392 Tj +1 TJm +(nks,) 16.3287 Tj +-263 TJm +(de) 9.4047 Tj 25 TJm (vices,) 22.9638 Tj -263 TJm @@ -78186,55 +68605,41 @@ Q (\002lesystem) 40.4083 Tj -250 TJm (corruption!) 44.8217 Tj -[1 0 0 1 72 330.413] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -320.45] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 310.652 Td -/F130_0 9.9626 Tf (One) 16.5977 Tj -392 TJm (other) 20.4731 Tj -391 TJm (thing:) 23.2527 Tj -594 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -391 TJm (you) 14.9439 Tj -392 TJm (create) 23.7807 Tj -391 TJm -(a) 4.42339 Tj -[1 0 0 1 210.879 310.652] cm +(a) 4.4234 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -210.879 -310.652] cm -[1 0 0 1 0 0] Tm -0 0 Td 210.879 310.652 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 240.767 310.652] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -240.767 -310.652] cm -[1 0 0 1 0 0] Tm -0 0 Td 244.669 310.652 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (binary) 25.4544 Tj -392 TJm (for) 11.6164 Tj @@ -78251,39 +68656,31 @@ Q -391 TJm (linking) 28.234 Tj -392 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -391 TJm (statically) 35.9749 Tj -392 TJm -(\() 3.31755 Tj -[1 0 0 1 522.067 310.652] cm +(\() 3.3175 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -522.067 -310.652] cm -[1 0 0 1 0 0] Tm -0 0 Td 522.067 310.652 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (gcc) 17.9327 Tj 72 298.697 Td (-static) 41.8429 Tj -[1 0 0 1 113.843 298.697] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -113.843 -298.697] cm -[1 0 0 1 0 0] Tm -0 0 Td 113.843 298.697 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (\).) 5.8082 Tj -620 TJm (This) 17.7135 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 20 TJm @@ -78293,7 +68690,7 @@ Q -250 TJm (sorts) 18.8194 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (library-v) 34.8591 Tj 15 TJm @@ -78312,52 +68709,38 @@ Q (later) 17.7035 Tj -250 TJm (on.) 12.4533 Tj -[1 0 0 1 72 296.54] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -286.577] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 276.779 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj +(If) 6.6351 Tj -296 TJm (you) 14.9439 Tj -296 TJm (b) 4.9813 Tj 20 TJm (uild) 15.5018 Tj -[1 0 0 1 122.709 276.779] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -122.709 -276.779] cm -[1 0 0 1 0 0] Tm -0 0 Td -122.709 276.779 Td -/F134_0 9.9626 Tf +122.708 276.779 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 152.596 276.779] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -152.596 -276.779] cm -[1 0 0 1 0 0] Tm -0 0 Td 155.545 276.779 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (on) 9.9626 Tj -296 TJm -(W) 9.40469 Tj +(W) 9.4047 Tj 40 TJm (in32,) 20.2042 Tj -307 TJm @@ -78366,84 +68749,60 @@ Q (must) 19.3773 Tj -296 TJm (set) 11.0684 Tj -[1 0 0 1 254.965 276.779] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -254.965 -276.779] cm -[1 0 0 1 0 0] Tm -0 0 Td 254.965 276.779 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_UNIX) 41.8429 Tj -[1 0 0 1 296.808 276.779] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -296.808 -276.779] cm -[1 0 0 1 0 0] Tm -0 0 Td 299.756 276.779 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj -296 TJm (0) 4.9813 Tj -296 TJm (and) 14.386 Tj -[1 0 0 1 335.72 276.779] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -335.72 -276.779] cm -[1 0 0 1 0 0] Tm -0 0 Td 335.72 276.779 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (BZ_LCCWIN32) 65.7532 Tj -[1 0 0 1 401.473 276.779] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -401.473 -276.779] cm -[1 0 0 1 0 0] Tm -0 0 Td 404.422 276.779 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (to) 7.7509 Tj -296 TJm -(1,) 7.47195 Tj +(1,) 7.472 Tj -307 TJm (in) 7.7509 Tj -296 TJm (the) 12.1743 Tj -296 TJm (\002le) 12.7322 Tj -[1 0 0 1 467.159 276.779] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -467.159 -276.779] cm -[1 0 0 1 0 0] Tm -0 0 Td 467.159 276.779 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2.c) 41.8429 Tj -[1 0 0 1 509.002 276.779] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -509.002 -276.779] cm -[1 0 0 1 0 0] Tm -0 0 Td 509.002 276.779 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj +/F122_0 9.9626 Tf +(,) 2.4907 Tj -307 TJm (before) 25.4445 Tj 72 264.824 Td @@ -78469,8 +68828,7 @@ Q -250 TJm (correctly) 35.4071 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 262.667] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -78499,7 +68857,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -78508,11 +68865,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -252.704] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 230.071 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (4.3.) 34.4584 Tj -278 TJm (Repor) 59.6824 Tj @@ -78522,7 +68876,6 @@ Q (b) 12.6223 Tj 20 TJm (ugs) 36.7308 Tj -[1 0 0 1 72 225.474] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -78547,17 +68900,13 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -215.512] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 208.153 Td -/F130_0 9.9626 Tf -(I) 3.31755 Tj +/F122_0 9.9626 Tf +(I) 3.3175 Tj -228 TJm (tried) 18.2614 Tj -228 TJm @@ -78569,31 +68918,23 @@ Q -228 TJm (mak) 17.1556 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -228 TJm (sure) 16.5977 Tj -[1 0 0 1 196.25 208.153] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -196.25 -208.153] cm -[1 0 0 1 0 0] Tm -0 0 Td 196.25 208.153 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 226.138 208.153] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -226.138 -208.153] cm -[1 0 0 1 0 0] Tm -0 0 Td 228.409 208.153 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -228 TJm (b) 4.9813 Tj 20 TJm @@ -78617,13 +68958,13 @@ Q -228 TJm (you') 18.2614 Tj 10 TJm -(ll) 5.53921 Tj +(ll) 5.5392 Tj -228 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj -228 TJm (need) 18.8094 Tj -228 TJm @@ -78638,84 +68979,70 @@ Q (for) 11.6164 Tj -250 TJm (real.) 17.4246 Tj -[1 0 0 1 72 196.098] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -186.136] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 174.28 Td -/F130_0 9.9626 Tf (Ne) 11.6164 Tj 25 TJm (v) 4.9813 Tj 15 TJm (ertheless,) 37.3498 Tj -313 TJm -(if) 6.08715 Tj -[1 0 0 1 137.751 174.28] cm +(if) 6.0871 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -137.751 -174.28] cm -[1 0 0 1 0 0] Tm -0 0 Td 137.751 174.28 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 167.639 174.28] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -167.639 -174.28] cm -[1 0 0 1 0 0] Tm -0 0 Td 170.634 174.28 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (dies) 16.0497 Tj -301 TJm (with) 17.7135 Tj -300 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -301 TJm -(se) 8.29885 Tj +(se) 8.2988 Tj 15 TJm (gmentation) 44.8317 Tj -300 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (ault,) 17.4346 Tj -314 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -300 TJm (b) 4.9813 Tj 20 TJm -(us) 8.85675 Tj +(us) 8.8568 Tj -301 TJm (error) 19.3573 Tj -300 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -301 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -301 TJm (internal) 30.4357 Tj -300 TJm (assertion) 35.417 Tj -301 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (ailure,) 25.1755 Tj -313 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -301 TJm (wil) 12.7322 Tj 1 TJm @@ -78731,7 +69058,7 @@ Q -242 TJm (me) 12.1743 Tj -243 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -242 TJm (b) 4.9813 Tj 20 TJm @@ -78745,11 +69072,11 @@ Q -243 TJm (years) 21.0211 Tj -242 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -242 TJm (feedback) 35.955 Tj -243 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -242 TJm (bzip2) 22.1369 Tj -243 TJm @@ -78769,7 +69096,7 @@ Q -243 TJm (can) 13.8281 Tj 72 150.37 Td -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (traced) 24.3386 Tj -250 TJm @@ -78783,29 +69110,21 @@ Q 20 TJm (ugs) 13.8381 Tj -250 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -250 TJm (hardw) 24.8965 Tj 10 TJm (are) 12.1643 Tj -250 TJm (problems.) 39.5714 Tj -[1 0 0 1 72 148.213] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -97.3611] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -78830,7 +69149,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -78839,12 +69157,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -78853,18 +69165,20 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (32) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -78873,7 +69187,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -78882,12 +69195,10 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -78896,7 +69207,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 36 36 +%%Page: 33 36 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -78914,20 +69225,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -78952,7 +69259,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -78961,12 +69267,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -6.8541] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -78975,18 +69275,23 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 116.328 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -382.4 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 498.728 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Miscellanea) 48.1393 Tj -[1 0 0 1 266.071 749.146] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -78995,7 +69300,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -79004,182 +69308,163 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -7.0936] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -31.5168] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -710.037] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td -78.9739 710.037 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 710.037] cm +74.491 710.037 Td +/F122_0 9.9626 Tf +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 -86.944 -710.037] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 710.037 Td -/F130_0 9.9626 Tf +-450 TJm (Recompile) 43.1679 Tj --306 TJm +-322 TJm (the) 12.1743 Tj --306 TJm +-322 TJm (program) 33.7533 Tj --306 TJm +-322 TJm (with) 17.7135 Tj --306 TJm +-322 TJm (no) 9.9626 Tj --306 TJm -(optimisation,) 52.3136 Tj --320 TJm +-322 TJm +(optimisat) 37.0908 Tj +1 TJm +(ion,) 15.2229 Tj +-340 TJm (and) 14.386 Tj --306 TJm +-322 TJm (see) 12.7222 Tj --306 TJm -(if) 6.08715 Tj --306 TJm -(it) 5.53921 Tj --306 TJm +-322 TJm +(if) 6.0871 Tj +-322 TJm +(it) 5.5392 Tj +-322 TJm (w) 7.193 Tj 10 TJm (orks.) 19.6462 Tj --956 TJm +-1052 TJm (And/or) 28.224 Tj --306 TJm +-322 TJm (try) 11.0684 Tj --306 TJm -(a) 4.42339 Tj --306 TJm +-322 TJm +(a) 4.4234 Tj +-321 TJm (dif) 11.0684 Tj 25 TJm (ferent) 23.2328 Tj --306 TJm +-322 TJm (compiler) 35.417 Tj 55 TJm -(.) 2.49065 Tj --956 TJm -(I) 3.31755 Tj --306 TJm +(.) 2.4907 Tj +-1052 TJm +(I) 3.3175 Tj +-322 TJm (heard) 22.1269 Tj --306 TJm +-322 TJm (all) 9.9626 Tj -86.944 698.082 Td +81.963 698.082 Td (sorts) 18.8194 Tj --282 TJm -(of) 8.29885 Tj --282 TJm +-309 TJm +(of) 8.2988 Tj +-310 TJm (stories) 26.0123 Tj --282 TJm +-310 TJm (about) 22.1369 Tj --283 TJm +-309 TJm (v) 4.9813 Tj 25 TJm (arious) 24.3486 Tj --282 TJm +-310 TJm (\003a) 9.9626 Tj 20 TJm (v) 4.9813 Tj 20 TJm (ours) 17.1556 Tj --282 TJm -(of) 8.29885 Tj --282 TJm +-309 TJm +(of) 8.2988 Tj +-310 TJm (GNU) 21.579 Tj --282 TJm -(C) 6.64505 Tj --282 TJm +-309 TJm +(C) 6.6451 Tj +-310 TJm (\(and) 17.7035 Tj --282 TJm +-309 TJm (other) 20.4731 Tj --283 TJm +-310 TJm (compilers\)) 42.61 Tj --282 TJm +-309 TJm (generating) 42.0521 Tj --282 TJm +-310 TJm (bad) 14.386 Tj --282 TJm +-310 TJm (code) 18.8094 Tj --282 TJm +-309 TJm (for) 11.6164 Tj -[1 0 0 1 472.141 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.141 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td -472.141 698.082 Td -/F134_0 9.9626 Tf +471.527 698.082 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 502.029 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -502.029 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td -502.029 698.082 Td -/F130_0 9.9626 Tf -(,) 2.49065 Tj --290 TJm +501.415 698.082 Td +/F122_0 9.9626 Tf +(,) 2.4907 Tj +-324 TJm (and) 14.386 Tj --282 TJm -(I') 6.63509 Tj +-310 TJm +(I') 6.6351 Tj 50 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj -86.944 686.127 Td +(e) 4.4234 Tj +81.963 686.127 Td (run) 13.2801 Tj -250 TJm (across) 24.8965 Tj @@ -79190,269 +69475,221 @@ Q -250 TJm (such) 18.2614 Tj -250 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xamples) 33.2053 Tj -250 TJm (myself.) 29.6088 Tj -[1 0 0 1 237.767 686.127] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -165.767 -12.1195] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -674.007] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 664.209 Td -/F130_0 9.9626 Tf +81.963 664.209 Td (2.7.X) 22.1369 Tj --280 TJm +-299 TJm (v) 4.9813 Tj 15 TJm (ersions) 28.224 Tj --279 TJm -(of) 8.29885 Tj --280 TJm +-300 TJm +(of) 8.2988 Tj +-299 TJm (GNU) 21.579 Tj --279 TJm -(C) 6.64505 Tj --280 TJm +-299 TJm +(C) 6.6451 Tj +-300 TJm (are) 12.1643 Tj --279 TJm +-299 TJm (kno) 14.9439 Tj 25 TJm (wn) 12.1743 Tj --280 TJm +-300 TJm (to) 7.7509 Tj --280 TJm +-299 TJm (generate) 33.7433 Tj --279 TJm +-299 TJm (bad) 14.386 Tj --280 TJm +-300 TJm (code) 18.8094 Tj --279 TJm +-299 TJm (from) 19.3673 Tj --280 TJm +-299 TJm (time) 17.7135 Tj --279 TJm +-300 TJm (to) 7.7509 Tj --280 TJm +-299 TJm (time,) 20.2042 Tj --287 TJm +-312 TJm (at) 7.193 Tj --280 TJm +-299 TJm (high) 17.7135 Tj --279 TJm +-300 TJm (optimisation) 49.823 Tj --280 TJm +-299 TJm (le) 7.193 Tj 25 TJm (v) 4.9813 Tj 15 TJm (els.) 13.5591 Tj --797 TJm -(If) 6.63509 Tj --280 TJm +-916 TJm +(If) 6.6351 Tj +-300 TJm (you) 14.9439 Tj -86.944 652.254 Td +81.963 652.254 Td (get) 12.1743 Tj --295 TJm +-328 TJm (problems,) 39.5714 Tj --307 TJm +-348 TJm (try) 11.0684 Tj --296 TJm +-328 TJm (using) 21.589 Tj --295 TJm +-329 TJm (the) 12.1743 Tj --296 TJm +-328 TJm (\003ags) 18.8194 Tj -[1 0 0 1 220.116 652.254] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -220.116 -652.254] cm -[1 0 0 1 0 0] Tm -0 0 Td -220.116 652.254 Td -/F134_0 9.9626 Tf +217.176 652.254 Td +/F124_0 9.9626 Tf (-O2) 17.9327 Tj -[1 0 0 1 238.049 652.254] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.9438 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -240.993 -652.254] cm -[1 0 0 1 0 0] Tm -0 0 Td -240.993 652.254 Td -/F134_0 9.9626 Tf -(-fomit-frame-pointer) 119.551 Tj -[1 0 0 1 360.544 652.254] cm +-328 TJm +(-fomit-frame-pointer) 119.5512 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.9438 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -363.488 -652.254] cm -[1 0 0 1 0 0] Tm -0 0 Td -363.488 652.254 Td -/F134_0 9.9626 Tf -(-fno-strength-reduce) 119.551 Tj -[1 0 0 1 483.04 652.254] cm +-329 TJm +(-fno-strength-reduce) 119.5512 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -483.04 -652.254] cm -[1 0 0 1 0 0] Tm -0 0 Td -483.04 652.254 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj --893 TJm +480.753 652.254 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj +-1090 TJm (Y) 7.193 Tj 110 TJm (ou) 9.9626 Tj --295 TJm +-328 TJm (should) 26.5703 Tj -86.944 640.299 Td +81.963 640.299 Td (speci\002cally) 45.3796 Tj -[1 0 0 1 134.814 640.299] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -134.814 -640.299] cm -[1 0 0 1 0 0] Tm -0 0 Td -134.814 640.299 Td -/F637_0 9.9626 Tf +129.832 640.299 Td +/F621_0 9.9626 Tf (not) 12.7322 Tj -[1 0 0 1 147.546 640.299] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -147.546 -640.299] cm -[1 0 0 1 0 0] Tm -0 0 Td -150.036 640.299 Td -/F130_0 9.9626 Tf +145.055 640.299 Td +/F122_0 9.9626 Tf (use) 13.2801 Tj -[1 0 0 1 165.807 640.299] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -165.807 -640.299] cm -[1 0 0 1 0 0] Tm -0 0 Td -165.807 640.299 Td -/F134_0 9.9626 Tf +160.826 640.299 Td +/F124_0 9.9626 Tf (-funroll-loops) 83.6858 Tj -[1 0 0 1 249.493 640.299] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -249.493 -640.299] cm -[1 0 0 1 0 0] Tm -0 0 Td -249.493 640.299 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj -[1 0 0 1 72 638.142] cm +244.512 640.299 Td +/F122_0 9.9626 Tf +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -628.179] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 618.381 Td -/F130_0 9.9626 Tf +81.963 618.381 Td (Y) 7.193 Tj 110 TJm (ou) 9.9626 Tj --249 TJm +-240 TJm (may) 17.1556 Tj --249 TJm +-240 TJm (notice) 24.3486 Tj --248 TJm +-241 TJm (that) 14.9439 Tj --249 TJm +-240 TJm (the) 12.1743 Tj --249 TJm +-240 TJm (Mak) 18.2614 Tj 10 TJm (e\002le) 17.1556 Tj --249 TJm +-240 TJm (runs) 17.1556 Tj --248 TJm +-240 TJm (six) 11.6264 Tj --249 TJm +-241 TJm (tests) 17.7135 Tj --249 TJm -(as) 8.29885 Tj --249 TJm +-240 TJm +(as) 8.2988 Tj +-240 TJm (part) 15.4918 Tj --249 TJm -(of) 8.29885 Tj --248 TJm +-240 TJm +(of) 8.2988 Tj +-240 TJm (the) 12.1743 Tj --249 TJm +-241 TJm (b) 4.9813 Tj 20 TJm (uild) 15.5018 Tj --249 TJm +-240 TJm (process.) 32.3685 Tj --619 TJm -(If) 6.63509 Tj --249 TJm +-613 TJm +(If) 6.6351 Tj +-240 TJm (the) 12.1743 Tj --249 TJm +-241 TJm (program) 33.7533 Tj --248 TJm +-240 TJm (passes) 25.4544 Tj --249 TJm +-240 TJm (all) 9.9626 Tj --249 TJm -(of) 8.29885 Tj --249 TJm +-240 TJm +(of) 8.2988 Tj +-240 TJm (these,) 22.9638 Tj --249 TJm -(it') 8.85675 Tj +-242 TJm +(it') 8.8568 Tj 55 TJm -(s) 3.87545 Tj -86.944 606.426 Td -(a) 4.42339 Tj --250 TJm +(s) 3.8755 Tj +-241 TJm +(a) 4.4234 Tj +81.963 606.426 Td (pretty) 23.2427 Tj -250 TJm (good) 19.9252 Tj -250 TJm -(\(b) 8.29885 Tj +(\(b) 8.2988 Tj 20 TJm (ut) 7.7509 Tj -250 TJm @@ -79472,197 +69709,165 @@ Q -250 TJm (done) 19.3673 Tj -250 TJm -(its) 9.41466 Tj +(its) 9.4147 Tj -250 TJm (job) 12.7322 Tj -250 TJm (correctly) 35.4071 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 604.269] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -19.761] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -584.508] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 584.508 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 584.508] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +74.491 584.508 Td +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -584.508] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 584.508 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj -[1 0 0 1 95.9558 584.508] cm +-450 TJm +(If) 6.6351 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -95.9558 -584.508] cm -[1 0 0 1 0 0] Tm -0 0 Td -95.9558 584.508 Td -/F134_0 9.9626 Tf +91.723 584.508 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 125.844 584.508] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -125.844 -584.508] cm -[1 0 0 1 0 0] Tm -0 0 Td -128.22 584.508 Td -/F130_0 9.9626 Tf +124.239 584.508 Td +/F122_0 9.9626 Tf (crashes) 29.3199 Tj --239 TJm +-264 TJm (randomly) 38.1866 Tj 65 TJm -(,) 2.49065 Tj --240 TJm +(,) 2.4907 Tj +-267 TJm (and) 14.386 Tj --239 TJm +-264 TJm (the) 12.1743 Tj --239 TJm -(crashe) 25.4445 Tj -1 TJm -(s) 3.87545 Tj --239 TJm +-263 TJm +(crashes) 29.3199 Tj +-264 TJm (are) 12.1643 Tj --239 TJm +-264 TJm (not) 12.7322 Tj --238 TJm +-263 TJm (repeatable,) 43.427 Tj --241 TJm +-268 TJm (you) 14.9439 Tj --239 TJm +-263 TJm (may) 17.1556 Tj --238 TJm -(ha) 9.40469 Tj +-264 TJm +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj --239 TJm -(a) 4.42339 Tj --238 TJm +(e) 4.4234 Tj +-264 TJm +(a) 4.4234 Tj +-264 TJm (\003ak) 14.9439 Tj 15 TJm (y) 4.9813 Tj --239 TJm +-263 TJm (memory) 33.2053 Tj --238 TJm +-264 TJm (subsystem.) 44.0048 Tj -[1 0 0 1 510.112 584.508] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -510.112 -584.508] cm -[1 0 0 1 0 0] Tm -0 0 Td 510.112 584.508 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 540 584.508] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -584.508] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 572.553 Td -/F130_0 9.9626 Tf +81.963 572.553 Td +/F122_0 9.9626 Tf (really) 22.6848 Tj --254 TJm +-274 TJm (hammers) 36.5229 Tj --253 TJm +-274 TJm (your) 18.2614 Tj --254 TJm +-274 TJm (memory) 33.2053 Tj --253 TJm +-274 TJm (hierarch) 32.6375 Tj 5 TJm (y) 4.9813 Tj 65 TJm -(,) 2.49065 Tj --255 TJm +(,) 2.4907 Tj +-280 TJm (and) 14.386 Tj --253 TJm -(if) 6.08715 Tj --254 TJm -(it') 8.85675 Tj +-274 TJm +(if) 6.0871 Tj +-274 TJm +(it') 8.8568 Tj 55 TJm -(s) 3.87545 Tj --254 TJm -(a) 4.42339 Tj --253 TJm +(s) 3.8755 Tj +-274 TJm +(a) 4.4234 Tj +-274 TJm (bit) 10.5205 Tj --254 TJm +-274 TJm (mar) 15.4918 Tj 18 TJm (ginal,) 22.4159 Tj --254 TJm +-280 TJm (you) 14.9439 Tj --254 TJm +-274 TJm (may) 17.1556 Tj --253 TJm +-274 TJm (get) 12.1743 Tj --254 TJm +-274 TJm (these) 20.4731 Tj --253 TJm +-274 TJm (problems.) 39.5714 Tj --642 TJm +-764 TJm (Ditto) 20.4831 Tj --254 TJm -(if) 6.08715 Tj --253 TJm +-274 TJm +(if) 6.0871 Tj +-274 TJm (your) 18.2614 Tj --254 TJm +-274 TJm (disk) 16.6077 Tj -86.944 560.598 Td -(or) 8.29885 Tj +81.963 560.598 Td +(or) 8.2988 Tj -250 TJm (I/O) 13.2801 Tj -250 TJm (subsystem) 41.5142 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (slo) 11.6264 Tj 25 TJm (wly) 14.9439 Tj -250 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (ailing.) 25.1855 Tj -620 TJm @@ -79677,28 +69882,22 @@ Q (does) 18.2614 Tj -250 TJm (happen.) 31.2626 Tj -[1 0 0 1 345.143 560.598] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -273.143 -12.1195] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -548.478] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 538.68 Td -/F130_0 9.9626 Tf -(T) 6.08715 Tj +81.963 538.68 Td +(T) 6.0871 Tj 35 TJm -(ry) 8.29885 Tj +(ry) 8.2988 Tj -250 TJm (using) 21.589 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (dif) 11.0684 Tj 25 TJm @@ -79706,7 +69905,7 @@ Q -250 TJm (machine) 33.7533 Tj -250 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -250 TJm (the) 12.1743 Tj -250 TJm @@ -79718,7 +69917,7 @@ Q -250 TJm (see) 12.7222 Tj -250 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -250 TJm (you) 14.9439 Tj -250 TJm @@ -79729,172 +69928,150 @@ Q (the) 12.1743 Tj -250 TJm (problem.) 35.696 Tj -[1 0 0 1 72 536.523] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -19.761] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.9739 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -78.9739 -516.762] cm -[1 0 0 1 0 0] Tm -0 0 Td -78.9739 516.762 Td -/F130_0 9.9626 Tf -(\225) 3.48691 Tj -[1 0 0 1 82.4608 516.762] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm +74.491 516.762 Td +(\225) 3.4869 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 1.9925 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -86.944 -516.762] cm -[1 0 0 1 0 0] Tm -0 0 Td -86.944 516.762 Td -/F130_0 9.9626 Tf +-450 TJm (This) 17.7135 Tj --229 TJm +-252 TJm (isn') 14.9439 Tj 18 TJm (t) 2.7696 Tj --230 TJm +-251 TJm (really) 22.6848 Tj --229 TJm -(a) 4.42339 Tj --229 TJm +-252 TJm +(a) 4.4234 Tj +-252 TJm (b) 4.9813 Tj 20 TJm (ug,) 12.4533 Tj --234 TJm +-252 TJm (b) 4.9813 Tj 20 TJm (ut) 7.7509 Tj --229 TJm -(...) 7.47195 Tj --303 TJm -(If) 6.63509 Tj -[1 0 0 1 212.232 516.762] cm +-251 TJm +(...) 7.472 Tj +-315 TJm +(If) 6.6351 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -212.232 -516.762] cm -[1 0 0 1 0 0] Tm -0 0 Td -212.232 516.762 Td -/F134_0 9.9626 Tf +209.383 516.762 Td +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 242.12 516.762] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -242.12 -516.762] cm -[1 0 0 1 0 0] Tm -0 0 Td -244.405 516.762 Td -/F130_0 9.9626 Tf +241.778 516.762 Td +/F122_0 9.9626 Tf (tells) 16.6077 Tj --229 TJm +-252 TJm (you) 14.9439 Tj --230 TJm +-251 TJm (your) 18.2614 Tj --229 TJm +-252 TJm (\002le) 12.7322 Tj --229 TJm -(is) 6.64505 Tj --230 TJm +-252 TJm +(is) 6.6451 Tj +-251 TJm (corrupted) 38.1767 Tj --229 TJm +-252 TJm (on) 9.9626 Tj --230 TJm +-252 TJm (decompression,) 62.2563 Tj --233 TJm +-252 TJm (and) 14.386 Tj --229 TJm +-251 TJm (you) 14.9439 Tj --230 TJm +-252 TJm (obtained) 34.3112 Tj --229 TJm +-252 TJm (the) 12.1743 Tj --229 TJm +-251 TJm (\002le) 12.7322 Tj -86.944 504.807 Td +81.963 504.807 Td (via) 12.1743 Tj --262 TJm +-281 TJm (FTP) 17.1656 Tj 111 TJm -(,) 2.49065 Tj --263 TJm +(,) 2.4907 Tj +-282 TJm (there) 19.9152 Tj --262 TJm -(is) 6.64505 Tj --262 TJm -(a) 4.42339 Tj --262 TJm +-282 TJm +(is) 6.6451 Tj +-281 TJm +(a) 4.4234 Tj +-282 TJm (possibility) 41.5241 Tj --263 TJm +-281 TJm (that) 14.9439 Tj --262 TJm +-282 TJm (you) 14.9439 Tj --262 TJm +-281 TJm (for) 11.6164 Tj 18 TJm (got) 12.7322 Tj --263 TJm +-282 TJm (to) 7.7509 Tj --262 TJm +-281 TJm (tell) 12.7322 Tj --262 TJm +-282 TJm (FTP) 17.1656 Tj --263 TJm +-281 TJm (to) 7.7509 Tj --262 TJm +-282 TJm (do) 9.9626 Tj --262 TJm -(a) 4.42339 Tj --262 TJm +-281 TJm +(a) 4.4234 Tj +-282 TJm (binary) 25.4544 Tj --263 TJm +-281 TJm (mode) 22.1369 Tj --262 TJm +-282 TJm (transfer) 30.4258 Tj 55 TJm -(.) 2.49065 Tj --694 TJm +(.) 2.4907 Tj +-809 TJm (That) 18.2614 Tj --262 TJm +-282 TJm (absolutely) 40.9562 Tj --262 TJm +-281 TJm (will) 15.5018 Tj --263 TJm +-282 TJm (cause) 22.1269 Tj -86.944 492.852 Td +81.963 492.852 Td (the) 12.1743 Tj -250 TJm (\002le) 12.7322 Tj -250 TJm (to) 7.7509 Tj -250 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -250 TJm (non-decompressible.) 82.7294 Tj -620 TJm @@ -79902,91 +70079,81 @@ Q 110 TJm (ou') 13.2801 Tj 10 TJm -(ll) 5.53921 Tj +(ll) 5.5392 Tj -250 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm (to) 7.7509 Tj -250 TJm (transfer) 30.4258 Tj -250 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -250 TJm -(ag) 9.40469 Tj +(ag) 9.4047 Tj 5 TJm (ain.) 14.6649 Tj -[1 0 0 1 351.34 492.852] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -279.34 -12.1195] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -480.732] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 470.934 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj +(If) 6.6351 Tj -235 TJm (you') 18.2614 Tj 50 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -236 TJm -(incor) 20.4731 Tj +(inc) 12.1743 Tj 1 TJm -(p) 4.9813 Tj +(o) 4.9813 Tj -1 TJm -(or) 8.29885 Tj +(r) 3.3175 Tj +1 TJm +(po) 9.9626 Tj +-1 TJm +(r) 3.3175 Tj 1 TJm (ated) 16.5977 Tj -[1 0 0 1 163.036 470.934] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -163.036 -470.934] cm -[1 0 0 1 0 0] Tm -0 0 Td 163.036 470.934 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (libbzip2) 47.8205 Tj -[1 0 0 1 210.856 470.934] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -210.856 -470.934] cm -[1 0 0 1 0 0] Tm -0 0 Td 213.2 470.934 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (into) 15.5018 Tj -235 TJm (your) 18.2614 Tj --235 TJm +-236 TJm (o) 4.9813 Tj 25 TJm (wn) 12.1743 Tj --236 TJm +-235 TJm (program) 33.7533 Tj -235 TJm (and) 14.386 Tj -235 TJm (are) 12.1643 Tj -236 TJm -(get) 12.1743 Tj +(gett) 14.9439 Tj 1 TJm -(ting) 15.5018 Tj +(ing) 12.7322 Tj -236 TJm (problems,) 39.5714 Tj -238 TJm @@ -80020,7 +70187,7 @@ Q -242 TJm (library) 26.5603 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -244 TJm (are) 12.1643 Tj -242 TJm @@ -80042,7 +70209,7 @@ Q -243 TJm (says) 17.1556 Tj 72 447.024 Td -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (allo) 14.9439 Tj 25 TJm @@ -80050,13 +70217,13 @@ Q 10 TJm (able.) 19.0883 Tj -310 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -250 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm (tried) 18.2614 Tj -250 TJm @@ -80064,7 +70231,7 @@ Q -250 TJm (mak) 17.1556 Tj 10 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm (the) 12.1743 Tj -250 TJm @@ -80074,7 +70241,7 @@ Q 20 TJm (ust) 11.6264 Tj -250 TJm -(ag) 9.40469 Tj +(ag) 9.4047 Tj 5 TJm (ainst) 18.8194 Tj -250 TJm @@ -80090,9 +70257,9 @@ Q -250 TJm (sure) 16.5977 Tj -250 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -250 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm @@ -80101,26 +70268,20 @@ Q (t) 2.7696 Tj -250 TJm (succeeded.) 43.427 Tj -[1 0 0 1 72 444.867] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -434.904] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 425.106 Td -/F130_0 9.9626 Tf (Finally) 28.234 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -324 TJm -(if) 6.08715 Tj +(if) 6.0871 Tj -310 TJm (the) 12.1743 Tj -309 TJm @@ -80128,7 +70289,7 @@ Q 15 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -309 TJm (comments) 40.9562 Tj -310 TJm @@ -80140,13 +70301,13 @@ Q -324 TJm (you') 18.2614 Tj 10 TJm -(ll) 5.53921 Tj +(ll) 5.5392 Tj -310 TJm -(ha) 9.40469 Tj +(ha) 9.4047 Tj 20 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -309 TJm (to) 7.7509 Tj -309 TJm @@ -80154,7 +70315,7 @@ Q -310 TJm (me) 12.1743 Tj -309 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -309 TJm (b) 4.9813 Tj 20 TJm @@ -80166,11 +70327,11 @@ Q 25 TJm (w) 7.193 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -324 TJm -(it') 8.85675 Tj +(it') 8.8568 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -310 TJm (just) 14.396 Tj -309 TJm @@ -80192,7 +70353,7 @@ Q -250 TJm (me) 12.1743 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (b) 4.9813 Tj 20 TJm @@ -80207,42 +70368,39 @@ Q (lik) 10.5205 Tj 10 TJm (e:) 7.193 Tj -[1 0 0 1 72 410.994] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -24.9066] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 23.9103 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 386.087] cm +0 0 468 23.91 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 20.3237] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3685] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -401.629] cm [1 0 0 1 0 0] Tm 0 0 Td 90 401.629 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -426 TJm (crashed) 41.8429 Tj @@ -80258,12 +70416,6 @@ f (my) 11.9551 Tj -426 TJm (machine) 41.8429 Tj -[1 0 0 1 72 386.087] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -80272,16 +70424,16 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -376.125] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 364.169 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -241 TJm (absolutely) 40.9562 Tj @@ -80298,34 +70450,30 @@ f -241 TJm (say) 13.2801 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -243 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -241 TJm (such) 18.2614 Tj -240 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -241 TJm (report) 23.7907 Tj -241 TJm -(is) 6.64505 Tj -[1 0 0 1 324.681 364.169] cm +(is) 6.6451 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -324.681 -364.169] cm -[1 0 0 1 0 0] Tm -0 0 Td 324.681 364.169 Td -/F637_0 9.9626 Tf +/F621_0 9.9626 Tf (totally) 25.4644 Tj 55 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -243 TJm (utterly) 26.0123 Tj 55 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -242 TJm (completely) 43.158 Tj -241 TJm @@ -80349,32 +70497,28 @@ f -255 TJm (time) 17.1556 Tj 10 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -256 TJm (my) 11.6164 Tj -255 TJm (time) 17.1556 Tj 10 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -256 TJm (and) 14.9439 Tj -255 TJm (net) 12.1743 Tj -255 TJm (bandwidth) 42.0721 Tj -[1 0 0 1 302.574 352.214] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -302.574 -352.214] cm -[1 0 0 1 0 0] Tm -0 0 Td 302.574 352.214 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -650 TJm -(W) 9.40469 Tj +(W) 9.4047 Tj 40 TJm (ith) 10.5205 Tj -254 TJm @@ -80388,21 +70532,21 @@ f -256 TJm (there') 23.2328 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -255 TJm (no) 9.9626 Tj -255 TJm (w) 7.193 Tj 10 TJm -(ay) 9.40469 Tj +(ay) 9.4047 Tj -255 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -255 TJm (can) 13.8281 Tj -255 TJm (possibly) 33.2153 Tj -255 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj 15 TJm (gin) 12.7322 Tj 72 340.259 Td @@ -80419,26 +70563,20 @@ f (problem) 33.2053 Tj -250 TJm (is.) 9.1357 Tj -[1 0 0 1 72 338.102] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -328.14] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 318.341 Td -/F130_0 9.9626 Tf (The) 15.4918 Tj -309 TJm (rules) 19.3673 Tj -309 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -309 TJm (the) 12.1743 Tj -310 TJm @@ -80448,15 +70586,15 @@ f -309 TJm (are:) 14.9339 Tj -428 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (acts,) 17.9825 Tj -324 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (acts,) 17.9825 Tj -324 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (acts.) 17.9825 Tj -975 TJm @@ -80482,7 +70620,7 @@ f 18 TJm (t) 2.7696 Tj -309 TJm -(be) 9.40469 Tj +(be) 9.4047 Tj -310 TJm (rele) 14.9339 Tj 25 TJm @@ -80497,42 +70635,39 @@ f (bare) 17.1456 Tj 72 306.386 Td (minimum:) 41.5241 Tj -[1 0 0 1 72 306.287] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -60.7721] cm /DeviceRGB {} cs -[0.94899 0.94899 0.976456] sc +[0.949 0.949 0.9765] sc /DeviceRGB {} CS -[0.94899 0.94899 0.976456] SC -0 0 468 59.7758 re +[0.949 0.949 0.9765] SC +q +[1 0 0 1 72 245.514] cm +0 0 468 59.776 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 56.1892] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -296.922] cm [1 0 0 1 0 0] Tm 0 0 Td 90 296.922 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (Machine) 41.8429 Tj -426 TJm (type.) 29.8878 Tj @@ -80578,12 +70713,6 @@ f (the) 17.9327 Tj -426 TJm (compiler.) 53.798 Tj -[1 0 0 1 72 245.514] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -80592,25 +70721,25 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -235.552] cm -[1 0 0 1 0 0] Tm -0 0 Td +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC 72 223.597 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Ho) 12.1743 Tj 25 TJm (we) 11.6164 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(er) 7.74094 Tj +(er) 7.7409 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -254 TJm (the) 12.1743 Tj -252 TJm @@ -80632,7 +70761,7 @@ f -253 TJm (me) 12.1743 Tj -253 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -252 TJm (the) 12.1743 Tj -253 TJm @@ -80650,7 +70779,7 @@ f -253 TJm (compress) 37.6287 Tj -253 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -253 TJm (decompress) 47.0334 Tj 72 211.641 Td @@ -80666,7 +70795,7 @@ f -305 TJm (happened.) 40.6673 Tj -946 TJm -(W) 9.40469 Tj +(W) 9.4047 Tj 40 TJm (ithout) 23.2527 Tj -304 TJm @@ -80680,7 +70809,7 @@ f -304 TJm (do) 9.9626 Tj -305 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (ything) 25.4644 Tj -304 TJm @@ -80696,10 +70825,9 @@ f -305 TJm (cause,) 24.6176 Tj -318 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj 72 199.686 Td (limited.) 30.7247 Tj -[1 0 0 1 72 199.587] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -80728,7 +70856,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -80737,11 +70864,8 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -189.624] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 164.933 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (4.4.) 34.4584 Tj -278 TJm (Did) 33.2808 Tj @@ -80754,7 +70878,7 @@ f -10 TJm (et) 18.3654 Tj -278 TJm -(the) 30.9877 Tj +(the) 30.9878 Tj -278 TJm (right) 45.9032 Tj -278 TJm @@ -80765,7 +70889,6 @@ f (g) 12.6223 Tj -10 TJm (e?) 24.1085 Tj -[1 0 0 1 72 160.337] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -80790,7 +70913,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -80799,31 +70921,24 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -150.374] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 143.016 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 101.888 143.016] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -101.888 -143.016] cm -[1 0 0 1 0 0] Tm -0 0 Td 104.603 143.016 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -272 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -273 TJm (resource) 33.7433 Tj -272 TJm (hog.) 17.4346 Tj -378 TJm -(It) 6.08715 Tj +(It) 6.0871 Tj -272 TJm (soaks) 22.1369 Tj -273 TJm @@ -80831,15 +70946,15 @@ f -272 TJm (lar) 10.5105 Tj 18 TJm -(ge) 9.40469 Tj +(ge) 9.4047 Tj -273 TJm (amounts) 33.7633 Tj -272 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -273 TJm (CPU) 19.3773 Tj -272 TJm -(c) 4.42339 Tj +(c) 4.4234 Tj 15 TJm (ycles) 20.4731 Tj -273 TJm @@ -80847,17 +70962,17 @@ f -272 TJm (memory) 33.2053 Tj 65 TJm -(.) 2.49065 Tj +(.) 2.4907 Tj -755 TJm (Also,) 21.31 Tj -278 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -273 TJm (gi) 7.7509 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -272 TJm (v) 4.9813 Tj 15 TJm @@ -80865,11 +70980,11 @@ f -273 TJm (lar) 10.5105 Tj 18 TJm -(ge) 9.40469 Tj +(ge) 9.4047 Tj -272 TJm (latencies.) 37.3498 Tj 72 131.06 Td -(In) 8.29885 Tj +(In) 8.2988 Tj -251 TJm (the) 12.1743 Tj -251 TJm @@ -80895,9 +71010,9 @@ f 4 TJm (abyt) 17.1556 Tj 1 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -252 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -251 TJm (uncompressed) 56.996 Tj -251 TJm @@ -80913,7 +71028,7 @@ f -251 TJm (getting) 27.6761 Tj -251 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -251 TJm @@ -80921,7 +71036,7 @@ f 72 119.105 Td (output,) 27.9551 Tj -250 TJm -(so) 8.85675 Tj +(so) 8.8568 Tj -250 TJm (this) 14.396 Tj -250 TJm @@ -80939,45 +71054,39 @@ f 25 TJm (v) 4.9813 Tj 15 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj -250 TJm (beha) 18.8094 Tj 20 TJm (viour) 21.031 Tj 55 TJm -(.) 2.49065 Tj -[1 0 0 1 72 116.949] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -106.986] cm -[1 0 0 1 0 0] Tm -0 0 Td -72 97.1875 Td -/F130_0 9.9626 Tf +72 97.187 Td (These) 23.7907 Tj -304 TJm (aren') 20.4632 Tj 18 TJm (t) 2.7696 Tj -304 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (aults) 18.8194 Tj -304 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -304 TJm (my) 12.7322 Tj -304 TJm (implementation,) 65.0359 Tj -317 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -304 TJm (hope,) 21.8579 Tj -318 TJm @@ -80987,13 +71096,13 @@ f -304 TJm (more) 20.4731 Tj -304 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj -304 TJm (intrinsic) 32.6574 Tj -304 TJm (property) 33.7533 Tj -304 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -304 TJm (the) 12.1743 Tj -304 TJm @@ -81002,7 +71111,7 @@ f (ws-Wheeler) 48.1293 Tj -304 TJm (transform) 38.7346 Tj -72 85.2323 Td +72 85.232 Td (\(unfortunately\).) 62.8042 Tj -620 TJm (Maybe) 27.6661 Tj @@ -81020,27 +71129,18 @@ f (w) 7.193 Tj 10 TJm (ant.) 14.6649 Tj -[1 0 0 1 72 83.0755] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -22.2611] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81065,7 +71165,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81074,12 +71173,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81088,18 +71181,20 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7545] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td (33) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81108,7 +71203,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81117,12 +71211,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81131,7 +71223,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 37 37 +%%Page: 34 37 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -81149,20 +71241,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81187,7 +71275,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81196,12 +71283,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -6.8541] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81210,18 +71291,23 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 116.328 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -382.4 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 498.728 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Miscellanea) 48.1393 Tj -[1 0 0 1 266.071 749.146] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81230,7 +71316,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81239,40 +71324,36 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -7.0936] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -540 -741.554] cm [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F130_0 9.9626 Tf -(If) 6.63509 Tj +/F122_0 9.9626 Tf +(If) 6.6351 Tj -275 TJm (you) 14.9439 Tj -274 TJm @@ -81280,7 +71361,7 @@ Q 10 TJm (ant) 12.1743 Tj -275 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -274 TJm (compressor) 45.9276 Tj -275 TJm @@ -81290,13 +71371,13 @@ Q -274 TJm (which) 24.3486 Tj -275 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -274 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (aster) 18.8094 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -281 TJm (uses) 17.1556 Tj -275 TJm @@ -81326,7 +71407,7 @@ Q 15 TJm (y) 4.9813 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -297 TJm (consider) 33.7533 Tj -288 TJm @@ -81334,7 +71415,7 @@ Q -288 TJm (Gailly') 28.224 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -288 TJm (and) 14.386 Tj -288 TJm @@ -81344,55 +71425,39 @@ Q 1 TJm (er') 11.0585 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -288 TJm (w) 7.193 Tj 10 TJm (ork,) 15.7708 Tj -[1 0 0 1 353.879 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -353.879 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td 353.879 698.082 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (zlib-1.2.1) 59.7756 Tj -[1 0 0 1 413.655 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -413.655 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td 416.523 698.082 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (and) 14.386 Tj -[1 0 0 1 433.777 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -433.777 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td 433.777 698.082 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (gzip-1.2.4) 59.7756 Tj -[1 0 0 1 493.553 698.082] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.553 -698.082] cm -[1 0 0 1 0 0] Tm -0 0 Td 493.553 698.082 Td -/F130_0 9.9626 Tf -(.) 2.49065 Tj +/F122_0 9.9626 Tf +(.) 2.4907 Tj -847 TJm (Look) 21.031 Tj -288 TJm @@ -81424,29 +71489,23 @@ Q 15 TJm (ely) 12.1743 Tj 65 TJm -(.) 2.49065 Tj -[1 0 0 1 72 683.97] cm +(.) 2.4907 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -674.008] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 664.209 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +(F) 5.5392 Tj 15 TJm -(or) 8.29885 Tj +(or) 8.2988 Tj -582 TJm (something) 41.5142 Tj -583 TJm -(f) 3.31755 Tj +(f) 3.3175 Tj 10 TJm (aster) 18.8094 Tj -582 TJm @@ -81464,36 +71523,28 @@ Q -582 TJm (Markus) 30.4357 Tj -582 TJm -(F) 5.53921 Tj +(F) 5.5392 Tj -582 TJm (X) 7.193 Tj -582 TJm -(J) 3.87545 Tj +(J) 3.8755 Tj -582 TJm (Oberhumer') 48.6872 Tj 55 TJm -(s) 3.87545 Tj -[1 0 0 1 437.433 664.209] cm +(s) 3.8755 Tj /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -437.433 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td 437.433 664.209 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (LZO) 17.9327 Tj -[1 0 0 1 455.365 664.209] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -455.365 -664.209] cm -[1 0 0 1 0 0] Tm -0 0 Td -461.163 664.209 Td -/F130_0 9.9626 Tf +461.164 664.209 Td +/F122_0 9.9626 Tf (real-time) 35.965 Tj -582 TJm (compres-) 37.0708 Tj @@ -81502,7 +71553,7 @@ Q -250 TJm (library) 26.5603 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -250 TJm (at) 7.193 Tj -250 TJm @@ -81511,7 +71562,6 @@ Q (.oberhumer) 45.6486 Tj 55 TJm (.com/opensource.) 70.2762 Tj -[1 0 0 1 72 650.097] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81540,7 +71590,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81549,11 +71598,8 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -640.135] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 617.501 Td -/F122_0 20.6585 Tf +/F116_0 20.6585 Tf (4.5.) 34.4584 Tj -278 TJm (Fur) 33.2808 Tj @@ -81561,7 +71607,6 @@ Q (ther) 39.0239 Tj -278 TJm (Reading) 81.4978 Tj -[1 0 0 1 72 612.905] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81586,7 +71631,6 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9626] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -81595,23 +71639,16 @@ Q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -602.942] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 595.583 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 101.888 595.583] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -101.888 -595.583] cm -[1 0 0 1 0 0] Tm -0 0 Td 104.923 595.583 Td -/F130_0 9.9626 Tf -(is) 6.64505 Tj +/F122_0 9.9626 Tf +(is) 6.6451 Tj -305 TJm (not) 12.7322 Tj -304 TJm @@ -81629,19 +71666,19 @@ Q -305 TJm (that) 14.9439 Tj -304 TJm -(it) 5.53921 Tj +(it) 5.5392 Tj -305 TJm (doesn') 26.5603 Tj 18 TJm (t) 2.7696 Tj --305 TJm -(present) 28.772 Tj -304 TJm -(an) 9.40469 Tj +(present) 28.772 Tj +-305 TJm +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -305 TJm -(ne) 9.40469 Tj +(ne) 9.4047 Tj 25 TJm (w) 7.193 Tj -304 TJm @@ -81649,19 +71686,17 @@ Q -474 TJm (Rather) 26.5603 Tj 40 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -318 TJm -(it') 8.85675 Tj +(it') 8.8568 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -305 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj +-304 TJm +(engineering) 47.0334 Tj -305 TJm -(engineeri) 37.0708 Tj -1 TJm -(ng) 9.9626 Tj --305 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (x) 4.9813 Tj 15 TJm @@ -81671,27 +71706,21 @@ Q -250 TJm (on) 9.9626 Tj -250 TJm -(e) 4.42339 Tj +(e) 4.4234 Tj 15 TJm (xisting) 27.1282 Tj -250 TJm (ideas.) 22.9638 Tj -[1 0 0 1 72 581.471] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -9.9627] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -571.509] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 561.71 Td -/F130_0 9.9626 Tf -(F) 5.53921 Tj +(F) 5.5392 Tj 15 TJm (our) 13.2801 Tj -250 TJm @@ -81708,64 +71737,53 @@ Q (ideas) 20.4731 Tj -250 TJm (behind) 27.1182 Tj -[1 0 0 1 298.747 561.71] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -298.747 -561.71] cm -[1 0 0 1 0 0] Tm -0 0 Td 298.747 561.71 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (bzip2) 29.8878 Tj -[1 0 0 1 328.635 561.71] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -328.635 -561.71] cm -[1 0 0 1 0 0] Tm -0 0 Td 328.635 561.71 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (:) 2.7696 Tj -[1 0 0 1 72 559.554] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -299.875] cm /DeviceRGB {} cs -[0.929398 0.968597 0.956848] sc +[0.9294 0.9686 0.9568] sc /DeviceRGB {} CS -[0.929398 0.968597 0.956848] SC +[0.9294 0.9686 0.9568] SC +q +[1 0 0 1 72 259.678] cm 0 0 468 298.879 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 295.293] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -550.189] cm [1 0 0 1 0 0] Tm 0 0 Td 90 550.189 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (Michael) 41.8429 Tj -426 TJm (Burrows) 41.8429 Tj @@ -81777,7 +71795,7 @@ f (J.) 11.9551 Tj -426 TJm (Wheeler:) 47.8205 Tj -98.4879 538.234 Td +98.488 538.234 Td ("A) 11.9551 Tj -426 TJm (block-sorting) 77.7083 Tj @@ -81807,7 +71825,7 @@ f (124.) 23.9102 Tj 102.732 502.368 Td (ftp://ftp.digital.com/pub/DEC/SRC/research-reports/SRC-124.ps.g\ -z) 382.564 Tj +z) 382.5638 Tj 102.732 490.413 Td (If) 11.9551 Tj -426 TJm @@ -81837,7 +71855,7 @@ z) 382.564 Tj -426 TJm (Library,) 47.8205 Tj -426 TJm -(http://www.nzdl.org.) 119.551 Tj +(http://www.nzdl.org.) 119.5512 Tj 90 454.547 Td (Daniel) 35.8654 Tj -426 TJm @@ -81852,7 +71870,7 @@ z) 382.564 Tj (A.) 11.9551 Tj -426 TJm (LeLewer) 41.8429 Tj -98.4879 442.592 Td +98.488 442.592 Td ("Efficient) 59.7756 Tj -426 TJm (Decoding) 47.8205 Tj @@ -81954,7 +71972,7 @@ z) 382.564 Tj (scheme.) 41.8429 Tj 102.732 346.951 Td (ftp://ftp.cl.cam.ac.uk/users/djw3/) 203.237 Tj -90 323.041 Td +90 323.04 Td (Jon) 17.9327 Tj -426 TJm (L.) 11.9551 Tj @@ -81966,7 +71984,7 @@ z) 382.564 Tj (Robert) 35.8654 Tj -426 TJm (Sedgewick) 53.798 Tj -98.4879 311.085 Td +98.488 311.085 Td ("Fast) 29.8878 Tj -426 TJm (Algorithms) 59.7756 Tj @@ -81991,13 +72009,11 @@ z) 382.564 Tj -426 TJm (page,) 29.8878 Tj 102.732 287.175 Td -(www.cs.princeton.edu/~rs) 143.461 Tj -[1 0 0 1 72 259.678] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm +(www.cs.princeton.edu/~rs) 143.4614 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82006,16 +72022,12 @@ z) 382.564 Tj [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -249.715] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 237.76 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (The) 15.4918 Tj -239 TJm (follo) 18.8194 Tj @@ -82028,7 +72040,7 @@ z) 382.564 Tj 25 TJm (v) 4.9813 Tj 15 TJm -(es) 8.29885 Tj +(es) 8.2988 Tj -239 TJm (v) 4.9813 Tj 25 TJm @@ -82048,21 +72060,21 @@ z) 382.564 Tj 20 TJm (ut) 7.7509 Tj -238 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -239 TJm (not) 12.7322 Tj -239 TJm -(immedi) 30.4457 Tj +(immedia) 34.8691 Tj 1 TJm -(ately) 19.3673 Tj +(tely) 14.9439 Tj -239 TJm (the) 12.1743 Tj -239 TJm (basis) 19.9252 Tj -238 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -239 TJm -(an) 9.40469 Tj +(an) 9.4047 Tj 15 TJm (y) 4.9813 Tj -239 TJm @@ -82073,42 +72085,39 @@ z) 382.564 Tj (in) 7.7509 Tj -250 TJm (bzip2.) 24.6275 Tj -[1 0 0 1 72 223.648] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -72.7273] cm /DeviceRGB {} cs -[0.929398 0.968597 0.956848] sc +[0.9294 0.9686 0.9568] sc /DeviceRGB {} CS -[0.929398 0.968597 0.956848] SC +[0.9294 0.9686 0.9568] SC +q +[1 0 0 1 72 150.921] cm 0 0 468 71.731 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 68.1444] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -214.283] cm [1 0 0 1 0 0] Tm 0 0 Td 90 214.283 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (Peter) 29.8878 Tj -426 TJm (Fenwick:) 47.8205 Tj @@ -82145,7 +72154,7 @@ f -426 TJm (31) 11.9551 Tj -426 TJm -(-) 5.97756 Tj +(-) 5.9776 Tj -426 TJm (Feb) 17.9327 Tj -426 TJm @@ -82153,13 +72162,11 @@ f -426 TJm (1996.) 29.8878 Tj 102.732 166.463 Td -(ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps) 322.788 Tj -[1 0 0 1 72 150.921] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm +(ftp://ftp.cs.auckland.ac.nz/pub/peter-f/ACSC96paper.ps) 322.7882 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82168,16 +72175,12 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -140.958] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 129.003 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (K) 7.193 Tj 15 TJm (unihik) 25.4644 Tj @@ -82186,7 +72189,7 @@ f -250 TJm (Sadakane') 41.4942 Tj 55 TJm -(s) 3.87545 Tj +(s) 3.8755 Tj -250 TJm (sorting) 27.6761 Tj -250 TJm @@ -82198,60 +72201,55 @@ f 15 TJm (v) 4.9813 Tj 15 TJm -(e,) 6.91404 Tj +(e,) 6.914 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 25 TJm (ailable) 26.5603 Tj -250 TJm (from:) 22.1369 Tj -[1 0 0 1 72 126.846] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -36.8618] cm /DeviceRGB {} cs -[0.929398 0.968597 0.956848] sc +[0.9294 0.9686 0.9568] sc /DeviceRGB {} CS -[0.929398 0.968597 0.956848] SC -0 0 468 35.8655 re +[0.9294 0.9686 0.9568] SC +q +[1 0 0 1 72 89.985] cm +0 0 468 35.866 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 32.2789] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -117.482] cm [1 0 0 1 0 0] Tm 0 0 Td 90 117.482 Td -/F134_0 9.9626 Tf -(http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz) 346.698 Tj -[1 0 0 1 72 89.9846] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm +/F124_0 9.9626 Tf +(http://naomi.is.s.u-tokyo.ac.jp/~sada/papers/Sada98b.ps.gz) 346.6985 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82260,22 +72258,14 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -29.1702] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82300,7 +72290,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82309,12 +72298,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8542] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82323,18 +72306,21 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9514] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9514 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td +/F122_0 9.9626 Tf (34) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82343,7 +72329,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82352,12 +72337,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82366,7 +72349,7 @@ Q showpage %%PageTrailer pdfEndPage -%%Page: 38 38 +%%Page: 35 38 %%BeginPageSetup %%PageOrientation: Portrait pdfStartPage @@ -82384,20 +72367,16 @@ pdfStartPage [0] SC false op false OP -0 0 612 792 re -W +{} settransfer q -[1 0 0 1 72 741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 14.4459] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82422,7 +72401,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 187.197 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82431,12 +72409,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 -6.8541] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82445,18 +72417,23 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 116.328 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -382.4 -749.245] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 498.728 749.245 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Miscellanea) 48.1393 Tj -[1 0 0 1 266.071 749.146] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82465,7 +72442,6 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 280.796 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82474,39 +72450,35 @@ q [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -472.974 -7.0936] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -0.4981] cm q +[1 0 0 1 73.893 741.803] cm [] 0 d 0 J -0.4981 w -0 0.2491 m -475.465 0.2491 l +0.498 w +0 0 m +475.465 0 l S Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 479.251 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm -/DeviceGray {} cs -[0] sc -/DeviceGray {} CS -[0] SC -[1 0 0 1 -540 -741.554] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC [1 0 0 1 0 0] Tm 0 0 Td 72 710.037 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (The) 15.4918 Tj -250 TJm (Manber) 30.9837 Tj @@ -82523,66 +72495,61 @@ Q -250 TJm (algorithm) 38.7446 Tj -250 TJm -(is) 6.64505 Tj +(is) 6.6451 Tj -250 TJm (described) 38.1767 Tj -250 TJm (in) 7.7509 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj -250 TJm (paper) 22.1269 Tj -250 TJm -(a) 4.42339 Tj +(a) 4.4234 Tj 20 TJm (v) 4.9813 Tj 25 TJm (ailable) 26.5603 Tj -250 TJm (from:) 22.1369 Tj -[1 0 0 1 72 707.88] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -36.8618] cm /DeviceRGB {} cs -[0.929398 0.968597 0.956848] sc +[0.9294 0.9686 0.9568] sc /DeviceRGB {} CS -[0.929398 0.968597 0.956848] SC -0 0 468 35.8655 re +[0.9294 0.9686 0.9568] SC +q +[1 0 0 1 72 671.019] cm +0 0 468 35.866 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 32.2789] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3685] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -698.516] cm [1 0 0 1 0 0] Tm 0 0 Td 90 698.516 Td -/F134_0 9.9626 Tf -(http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps) 322.788 Tj -[1 0 0 1 72 671.019] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm +/F124_0 9.9626 Tf +(http://www.cs.arizona.edu/people/gene/PAPERS/suffix.ps) 322.7882 Tj +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82591,19 +72558,15 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -13.5492] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -72 -661.056] cm -[1 0 0 1 0 0] Tm -0 0 Td 72 649.101 Td -/F130_0 9.9626 Tf +/F122_0 9.9626 Tf (Finally) 28.234 Tj 65 TJm -(,) 2.49065 Tj +(,) 2.4907 Tj -227 TJm (the) 12.1743 Tj -221 TJm @@ -82625,7 +72588,7 @@ f 5 TJm (ations) 23.8007 Tj -221 TJm -(I) 3.31755 Tj +(I) 3.3175 Tj -221 TJm (made) 21.579 Tj -222 TJm @@ -82635,7 +72598,7 @@ f -221 TJm (performance) 50.341 Tj -222 TJm -(of) 8.29885 Tj +(of) 8.2988 Tj -221 TJm (sorting) 27.6761 Tj -221 TJm @@ -82644,42 +72607,39 @@ f (decompression) 59.7656 Tj 72 637.146 Td (algorithms:) 45.3896 Tj -[1 0 0 1 72 634.989] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 -132.503] cm /DeviceRGB {} cs -[0.929398 0.968597 0.956848] sc +[0.9294 0.9686 0.9568] sc /DeviceRGB {} CS -[0.929398 0.968597 0.956848] SC +[0.9294 0.9686 0.9568] SC +q +[1 0 0 1 72 502.486] cm 0 0 468 131.507 re f +Q /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 0 127.92] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 18 -8.3686] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -90 -625.624] cm [1 0 0 1 0 0] Tm 0 0 Td 90 625.624 Td -/F134_0 9.9626 Tf +/F124_0 9.9626 Tf (Julian) 35.8654 Tj -426 TJm (Seward) 35.8654 Tj @@ -82767,12 +72727,6 @@ f (March) 29.8878 Tj -426 TJm (2001.) 29.8878 Tj -[1 0 0 1 72 502.486] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 468 3.5866] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82781,22 +72735,18 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -468 -3.5866] cm +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 0 -451.634] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 1.8929 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 2.4907 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82821,7 +72771,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 374.394 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82830,12 +72779,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 2.4907 0] cm -/DeviceRGB {} cs -[0 0 0] sc -/DeviceRGB {} CS -[0 0 0] SC -[1 0 0 1 0 6.8541] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82844,18 +72787,21 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 40.5726 -6.7546] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 -493.841 -50.9513] cm -[1 0 0 1 0 0] Tm -0 0 Td -534.414 50.9513 Td -/F130_0 9.9626 Tf +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +534.414 50.951 Td +/F122_0 9.9626 Tf (35) 9.9626 Tj -[1 0 0 1 453.269 50.8518] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82864,7 +72810,6 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 93.5985 0] cm /DeviceRGB {} cs [0 0 0] sc /DeviceRGB {} CS @@ -82873,12 +72818,10 @@ f [0 0 0] sc /DeviceRGB {} CS [0 0 0] SC -[1 0 0 1 6.2765 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC -[1 0 0 1 -13.1436 0] cm /DeviceGray {} cs [0] sc /DeviceGray {} CS @@ -82890,11 +72833,11 @@ pdfEndPage %%Trailer end %%DocumentSuppliedResources: -%%+ font DTUUHP+NimbusSanL-Bold -%%+ font VXAMRV+NimbusRomNo9L-Regu -%%+ font MFECUR+NimbusMonL-Regu -%%+ font ZOVMRD+CMMI10 -%%+ font ERVBFT+NimbusMonL-Bold -%%+ font BZXIEB+CMSY10 -%%+ font WWWUTU+NimbusRomNo9L-ReguItal +%%+ font PYRIYB+NimbusSanL-Bold +%%+ font XDVKOU+NimbusRomNo9L-Regu +%%+ font QYKIKI+NimbusMonL-Regu +%%+ font BITXNG+CMMI10 +%%+ font ZWXELK+NimbusMonL-Bold +%%+ font FRBTTO+CMSY10 +%%+ font AMYDOG+NimbusRomNo9L-ReguItal %%EOF diff --git a/lib/3rdparty/bzip2/randtable.c b/lib/3rdparty/bzip2/randtable.c index 068b76367bc..6d624599061 100644 --- a/lib/3rdparty/bzip2/randtable.c +++ b/lib/3rdparty/bzip2/randtable.c @@ -8,8 +8,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. diff --git a/lib/3rdparty/bzip2/spewG.c b/lib/3rdparty/bzip2/spewG.c index 5892b92c364..14a364938d4 100644 --- a/lib/3rdparty/bzip2/spewG.c +++ b/lib/3rdparty/bzip2/spewG.c @@ -13,8 +13,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. diff --git a/lib/3rdparty/bzip2/unzcrash.c b/lib/3rdparty/bzip2/unzcrash.c index a1b75463adc..7041da51c98 100644 --- a/lib/3rdparty/bzip2/unzcrash.c +++ b/lib/3rdparty/bzip2/unzcrash.c @@ -17,8 +17,8 @@ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. - bzip2/libbzip2 version 1.0.5 of 10 December 2007 - Copyright (C) 1996-2007 Julian Seward + bzip2/libbzip2 version 1.0.6 of 6 September 2010 + Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. diff --git a/lib/drivers/ip/network/ip.c b/lib/drivers/ip/network/ip.c index a24cd4e6d39..e0b969f7ee0 100644 --- a/lib/drivers/ip/network/ip.c +++ b/lib/drivers/ip/network/ip.c @@ -63,9 +63,21 @@ PIP_PACKET IPInitializePacket( } -void NTAPI IPTimeout( PVOID Context ) { - IpWorkItemQueued = FALSE; - +VOID NTAPI IPTimeoutDpcFn(PKDPC Dpc, + PVOID DeferredContext, + PVOID SystemArgument1, + PVOID SystemArgument2) +/* + * FUNCTION: Timeout DPC + * ARGUMENTS: + * Dpc = Pointer to our DPC object + * DeferredContext = Pointer to context information (unused) + * SystemArgument1 = Unused + * SystemArgument2 = Unused + * NOTES: + * This routine is dispatched once in a while to do maintainance jobs + */ +{ /* Check if datagram fragments have taken too long to assemble */ IPDatagramReassemblyTimeout(); diff --git a/lib/drivers/ip/network/neighbor.c b/lib/drivers/ip/network/neighbor.c index ae5e3a5bb19..ebb3b2721fc 100644 --- a/lib/drivers/ip/network/neighbor.c +++ b/lib/drivers/ip/network/neighbor.c @@ -97,12 +97,11 @@ VOID NBTimeout(VOID) */ { UINT i; - KIRQL OldIrql; PNEIGHBOR_CACHE_ENTRY *PrevNCE; PNEIGHBOR_CACHE_ENTRY NCE; for (i = 0; i <= NB_HASHMASK; i++) { - TcpipAcquireSpinLock(&NeighborCache[i].Lock, &OldIrql); + TcpipAcquireSpinLockAtDpcLevel(&NeighborCache[i].Lock); for (PrevNCE = &NeighborCache[i].Cache; (NCE = *PrevNCE) != NULL;) { @@ -136,7 +135,7 @@ VOID NBTimeout(VOID) PrevNCE = &NCE->Next; } - TcpipReleaseSpinLock(&NeighborCache[i].Lock, OldIrql); + TcpipReleaseSpinLockFromDpcLevel(&NeighborCache[i].Lock); } } diff --git a/lib/drivers/ip/network/receive.c b/lib/drivers/ip/network/receive.c index afdca21600f..a7908ef6460 100644 --- a/lib/drivers/ip/network/receive.c +++ b/lib/drivers/ip/network/receive.c @@ -510,11 +510,10 @@ VOID IPDatagramReassemblyTimeout( * to hold IP fragments that have taken too long to reassemble */ { - KIRQL OldIrql; PLIST_ENTRY CurrentEntry, NextEntry; PIPDATAGRAM_REASSEMBLY CurrentIPDR; - TcpipAcquireSpinLock(&ReassemblyListLock, &OldIrql); + TcpipAcquireSpinLockAtDpcLevel(&ReassemblyListLock); CurrentEntry = ReassemblyListHead.Flink; while (CurrentEntry != &ReassemblyListHead) @@ -539,7 +538,7 @@ VOID IPDatagramReassemblyTimeout( CurrentEntry = NextEntry; } - TcpipReleaseSpinLock(&ReassemblyListLock, OldIrql); + TcpipReleaseSpinLockFromDpcLevel(&ReassemblyListLock); } VOID IPv4Receive(PIP_INTERFACE IF, PIP_PACKET IPPacket) diff --git a/lib/drivers/sound/mmixer/controls.c b/lib/drivers/sound/mmixer/controls.c index 5b0ac71ed34..6963f49e467 100644 --- a/lib/drivers/sound/mmixer/controls.c +++ b/lib/drivers/sound/mmixer/controls.c @@ -8,153 +8,11 @@ #include "priv.h" -MIXER_STATUS -MMixerGetTargetPinsByNodeConnectionIndex( - IN PMIXER_CONTEXT MixerContext, - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG bUpDirection, - IN ULONG NodeConnectionIndex, - IN ULONG PinCount, - OUT PULONG Pins) -{ - PKSTOPOLOGY_CONNECTION Connection; - ULONG PinId, NodeConnectionCount, Index; - PULONG NodeConnection; - MIXER_STATUS Status; - - - /* sanity check */ - ASSERT(NodeConnectionIndex < NodeConnections->Count); - - Connection = (PKSTOPOLOGY_CONNECTION)(NodeConnections + 1); - - //DPRINT("FromNode %u FromNodePin %u -> ToNode %u ToNodePin %u\n", Connection[NodeConnectionIndex].FromNode, Connection[NodeConnectionIndex].FromNodePin, Connection[NodeConnectionIndex].ToNode, Connection[NodeConnectionIndex].ToNodePin ); - - if ((Connection[NodeConnectionIndex].ToNode == KSFILTER_NODE && bUpDirection == FALSE) || - (Connection[NodeConnectionIndex].FromNode == KSFILTER_NODE && bUpDirection == TRUE)) - { - /* iteration stops here */ - if (bUpDirection) - PinId = Connection[NodeConnectionIndex].FromNodePin; - else - PinId = Connection[NodeConnectionIndex].ToNodePin; - - //DPRINT("GetTargetPinsByNodeIndex FOUND Target Pin %u Parsed %u\n", PinId, Pins[PinId]); - - // sanity check - ASSERT(PinId < PinCount); - - /* mark pin index as a target pin */ - Pins[PinId] = TRUE; - return MM_STATUS_SUCCESS; - } - - // get all node indexes referenced by that node - if (bUpDirection) - { - Status = MMixerGetNodeIndexes(MixerContext, NodeConnections, Connection[NodeConnectionIndex].FromNode, TRUE, FALSE, &NodeConnectionCount, &NodeConnection); - } - else - { - Status = MMixerGetNodeIndexes(MixerContext, NodeConnections, Connection[NodeConnectionIndex].ToNode, TRUE, TRUE, &NodeConnectionCount, &NodeConnection); - } - - if (Status == MM_STATUS_SUCCESS) - { - for(Index = 0; Index < NodeConnectionCount; Index++) - { - // iterate recursively into the nodes - Status = MMixerGetTargetPinsByNodeConnectionIndex(MixerContext, NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], PinCount, Pins); - ASSERT(Status == MM_STATUS_SUCCESS); - } - // free node connection indexes - MixerContext->Free(NodeConnection); - } - - return Status; -} - -MIXER_STATUS -MMixerGetControlsFromPinByConnectionIndex( - IN PMIXER_CONTEXT MixerContext, - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG bUpDirection, - IN ULONG NodeConnectionIndex, - OUT PULONG Nodes) -{ - PKSTOPOLOGY_CONNECTION CurConnection; - LPGUID NodeType; - ULONG NodeIndex; - MIXER_STATUS Status; - ULONG NodeConnectionCount, Index; - PULONG NodeConnection; - - - /* get current connection */ - CurConnection = MMixerGetConnectionByIndex(NodeConnections, NodeConnectionIndex); - - if (bUpDirection) - NodeIndex = CurConnection->FromNode; - else - NodeIndex = CurConnection->ToNode; - - if (NodeIndex > NodeTypes->Count) - { - // reached end of pin connection - return MM_STATUS_SUCCESS; - } - - /* get target node type of current connection */ - NodeType = MMixerGetNodeType(NodeTypes, NodeIndex); - - if (IsEqualGUIDAligned(NodeType, &KSNODETYPE_SUM) || IsEqualGUIDAligned(NodeType, &KSNODETYPE_MUX)) - { - if (bUpDirection) - { - /* add the sum / mux node to destination line */ - Nodes[NodeIndex] = TRUE; - } - - return MM_STATUS_SUCCESS; - } - - /* now add the node */ - Nodes[NodeIndex] = TRUE; - - - /* get all node indexes referenced by that node */ - if (bUpDirection) - { - Status = MMixerGetNodeIndexes(MixerContext, NodeConnections, NodeIndex, TRUE, FALSE, &NodeConnectionCount, &NodeConnection); - } - else - { - Status = MMixerGetNodeIndexes(MixerContext, NodeConnections, NodeIndex, TRUE, TRUE, &NodeConnectionCount, &NodeConnection); - } - - if (Status == MM_STATUS_SUCCESS) - { - for(Index = 0; Index < NodeConnectionCount; Index++) - { - /* iterate recursively into the nodes */ - Status = MMixerGetControlsFromPinByConnectionIndex(MixerContext, NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Nodes); - ASSERT(Status == MM_STATUS_SUCCESS); - } - /* free node connection indexes */ - MixerContext->Free(NodeConnection); - } - - return Status; -} - MIXER_STATUS MMixerAddMixerControl( IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo, - IN HANDLE hDevice, - IN PKSMULTIPLE_ITEM NodeTypes, + IN PTOPOLOGY Topology, IN ULONG NodeIndex, IN LPMIXERLINE_EXT MixerLine, OUT LPMIXERCONTROLW MixerControl) @@ -170,12 +28,12 @@ MMixerAddMixerControl( MixerControl->dwControlID = MixerInfo->ControlId; /* get node type */ - NodeType = MMixerGetNodeType(NodeTypes, NodeIndex); + NodeType = MMixerGetNodeTypeFromTopology(Topology, NodeIndex); /* store control type */ MixerControl->dwControlType = MMixerGetControlTypeFromTopologyNode(NodeType); - MixerControl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; //FIXME - MixerControl->cMultipleItems = 0; //FIXME + MixerControl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; /* FIXME */ + MixerControl->cMultipleItems = 0; /* FIXME */ if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE) { @@ -186,7 +44,7 @@ MMixerAddMixerControl( { MixerControl->Bounds.dwMinimum = 0; MixerControl->Bounds.dwMaximum = 0xFFFF; - MixerControl->Metrics.cSteps = 0xC0; //FIXME + MixerControl->Metrics.cSteps = 0xC0; /* FIXME */ } /* setup request to retrieve name */ @@ -197,7 +55,7 @@ MMixerAddMixerControl( Node.Reserved = 0; /* get node name size */ - Status = MixerContext->Control(hDevice, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), NULL, 0, &BytesReturned); + Status = MixerContext->Control(MixerInfo->hMixer, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), NULL, 0, &BytesReturned); if (Status == MM_STATUS_MORE_ENTRIES) { @@ -210,7 +68,7 @@ MMixerAddMixerControl( } /* get node name */ - Status = MixerContext->Control(hDevice, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), (LPVOID)Name, BytesReturned, &BytesReturned); + Status = MixerContext->Control(MixerInfo->hMixer, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), (LPVOID)Name, BytesReturned, &BytesReturned); if (Status == MM_STATUS_SUCCESS) { @@ -268,7 +126,7 @@ MMixerAddMixerControl( Property.NodeProperty.Property.Set = KSPROPSETID_Audio; /* get node volume level info */ - Status = MixerContext->Control(hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL), Desc, Length, &BytesReturned); + Status = MixerContext->Control(MixerInfo->hMixer, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL), Desc, Length, &BytesReturned); if (Status == MM_STATUS_SUCCESS) { @@ -324,236 +182,6 @@ MMixerAddMixerControl( return MM_STATUS_SUCCESS; } -MIXER_STATUS -MMixerAddMixerSourceLine( - IN PMIXER_CONTEXT MixerContext, - IN OUT LPMIXER_INFO MixerInfo, - IN HANDLE hDevice, - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG PinId, - IN ULONG bBridgePin, - IN ULONG bTargetPin) -{ - LPMIXERLINE_EXT SrcLine, DstLine; - MIXER_STATUS Status; - KSP_PIN Pin; - LPWSTR PinName; - GUID NodeType; - ULONG BytesReturned, ControlCount, Index; - LPGUID Node; - PULONG Nodes; - - if (!bTargetPin) - { - /* allocate src mixer line */ - SrcLine = (LPMIXERLINE_EXT)MixerContext->Alloc(sizeof(MIXERLINE_EXT)); - - if (!SrcLine) - return MM_STATUS_NO_MEMORY; - - /* zero struct */ - RtlZeroMemory(SrcLine, sizeof(MIXERLINE_EXT)); - - } - else - { - ASSERT(!IsListEmpty(&MixerInfo->LineList)); - SrcLine = MMixerGetSourceMixerLineByLineId(MixerInfo, DESTINATION_LINE); - } - - /* get destination line */ - DstLine = MMixerGetSourceMixerLineByLineId(MixerInfo, DESTINATION_LINE); - ASSERT(DstLine); - - - if (!bTargetPin) - { - /* initialize mixer src line */ - SrcLine->hDevice = hDevice; - SrcLine->PinId = PinId; - SrcLine->Line.cbStruct = sizeof(MIXERLINEW); - - /* initialize mixer destination line */ - SrcLine->Line.cbStruct = sizeof(MIXERLINEW); - SrcLine->Line.dwDestination = 0; - SrcLine->Line.dwSource = DstLine->Line.cConnections; - SrcLine->Line.dwLineID = (DstLine->Line.cConnections * 0x10000); - SrcLine->Line.fdwLine = MIXERLINE_LINEF_ACTIVE | MIXERLINE_LINEF_SOURCE; - SrcLine->Line.dwUser = 0; - SrcLine->Line.cChannels = DstLine->Line.cChannels; - SrcLine->Line.cConnections = 0; - SrcLine->Line.Target.dwType = 1; - SrcLine->Line.Target.dwDeviceID = DstLine->Line.Target.dwDeviceID; - SrcLine->Line.Target.wMid = MixerInfo->MixCaps.wMid; - SrcLine->Line.Target.wPid = MixerInfo->MixCaps.wPid; - SrcLine->Line.Target.vDriverVersion = MixerInfo->MixCaps.vDriverVersion; - InitializeListHead(&SrcLine->LineControlsExtraData); - - ASSERT(MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] == L'\0'); - wcscpy(SrcLine->Line.Target.szPname, MixerInfo->MixCaps.szPname); - - } - - /* allocate a node arrary */ - Nodes = (PULONG)MixerContext->Alloc(sizeof(ULONG) * NodeTypes->Count); - - if (!Nodes) - { - /* not enough memory */ - if (!bTargetPin) - { - MixerContext->Free(SrcLine); - } - return MM_STATUS_NO_MEMORY; - } - - Status = MMixerGetControlsFromPin(MixerContext, NodeConnections, NodeTypes, PinId, bTargetPin, Nodes); - if (Status != MM_STATUS_SUCCESS) - { - /* something went wrong */ - if (!bTargetPin) - { - MixerContext->Free(SrcLine); - } - MixerContext->Free(Nodes); - return Status; - } - - /* now count all nodes controlled by that pin */ - ControlCount = 0; - for(Index = 0; Index < NodeTypes->Count; Index++) - { - if (Nodes[Index]) - { - // get node type - Node = MMixerGetNodeType(NodeTypes, Index); - - if (MMixerGetControlTypeFromTopologyNode(Node)) - { - // found a node which can be resolved to a type - ControlCount++; - } - } - } - - /* now allocate the line controls */ - if (ControlCount) - { - SrcLine->LineControls = (LPMIXERCONTROLW)MixerContext->Alloc(sizeof(MIXERCONTROLW) * ControlCount); - - if (!SrcLine->LineControls) - { - /* no memory available */ - if (!bTargetPin) - { - MixerContext->Free(SrcLine); - } - MixerContext->Free(Nodes); - return MM_STATUS_NO_MEMORY; - } - - SrcLine->NodeIds = (PULONG)MixerContext->Alloc(sizeof(ULONG) * ControlCount); - if (!SrcLine->NodeIds) - { - /* no memory available */ - MixerContext->Free(SrcLine->LineControls); - if (!bTargetPin) - { - MixerContext->Free(SrcLine); - } - MixerContext->Free(Nodes); - return MM_STATUS_NO_MEMORY; - } - - /* zero line controls */ - RtlZeroMemory(SrcLine->LineControls, sizeof(MIXERCONTROLW) * ControlCount); - RtlZeroMemory(SrcLine->NodeIds, sizeof(ULONG) * ControlCount); - - ControlCount = 0; - for(Index = 0; Index < NodeTypes->Count; Index++) - { - if (Nodes[Index]) - { - // get node type - Node = MMixerGetNodeType(NodeTypes, Index); - - if (MMixerGetControlTypeFromTopologyNode(Node)) - { - /* store the node index for retrieving / setting details */ - SrcLine->NodeIds[ControlCount] = Index; - - Status = MMixerAddMixerControl(MixerContext, MixerInfo, hDevice, NodeTypes, Index, SrcLine, &SrcLine->LineControls[ControlCount]); - if (Status == MM_STATUS_SUCCESS) - { - /* increment control count on success */ - ControlCount++; - } - } - } - } - /* store control count */ - SrcLine->Line.cControls = ControlCount; - } - - /* release nodes array */ - MixerContext->Free(Nodes); - - /* get pin category */ - Pin.PinId = PinId; - Pin.Reserved = 0; - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - Pin.Property.Set = KSPROPSETID_Pin; - Pin.Property.Id = KSPROPERTY_PIN_CATEGORY; - - /* try get pin category */ - Status = MixerContext->Control(hDevice, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (LPVOID)&NodeType, sizeof(GUID), &BytesReturned); - if (Status != MM_STATUS_SUCCESS) - { - //FIXME - //map component type - } - - /* retrieve pin name */ - Pin.PinId = PinId; - Pin.Reserved = 0; - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - Pin.Property.Set = KSPROPSETID_Pin; - Pin.Property.Id = KSPROPERTY_PIN_NAME; - - /* try get pin name size */ - Status = MixerContext->Control(hDevice, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), NULL, 0, &BytesReturned); - - if (Status == MM_STATUS_MORE_ENTRIES) - { - PinName = (LPWSTR)MixerContext->Alloc(BytesReturned); - if (PinName) - { - /* try get pin name */ - Status = MixerContext->Control(hDevice, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (LPVOID)PinName, BytesReturned, &BytesReturned); - - if (Status == MM_STATUS_SUCCESS) - { - MixerContext->Copy(SrcLine->Line.szShortName, PinName, (min(MIXER_SHORT_NAME_CHARS, wcslen(PinName)+1)) * sizeof(WCHAR)); - SrcLine->Line.szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0'; - - MixerContext->Copy(SrcLine->Line.szName, PinName, (min(MIXER_LONG_NAME_CHARS, wcslen(PinName)+1)) * sizeof(WCHAR)); - SrcLine->Line.szName[MIXER_LONG_NAME_CHARS-1] = L'\0'; - } - MixerContext->Free(PinName); - } - } - - /* insert src line */ - if (!bTargetPin) - { - InsertTailList(&MixerInfo->LineList, &SrcLine->Entry); - DstLine->Line.cConnections++; - } - - return MM_STATUS_SUCCESS; -} - MIXER_STATUS MMixerCreateDestinationLine( IN PMIXER_CONTEXT MixerContext, @@ -563,11 +191,11 @@ MMixerCreateDestinationLine( { LPMIXERLINE_EXT DestinationLine; - // allocate a mixer destination line + /* allocate a mixer destination line */ DestinationLine = (LPMIXERLINE_EXT) MixerContext->Alloc(sizeof(MIXERLINE_EXT)); if (!MixerInfo) { - // no memory + /* no memory */ return MM_STATUS_NO_MEMORY; } @@ -578,7 +206,7 @@ MMixerCreateDestinationLine( DestinationLine->Line.fdwLine = MIXERLINE_LINEF_ACTIVE; DestinationLine->Line.dwUser = 0; DestinationLine->Line.dwComponentType = (bInputMixer == 0 ? MIXERLINE_COMPONENTTYPE_DST_SPEAKERS : MIXERLINE_COMPONENTTYPE_DST_WAVEIN); - DestinationLine->Line.cChannels = 2; //FIXME + DestinationLine->Line.cChannels = 2; /* FIXME */ if (LineName) { @@ -589,12 +217,6 @@ MMixerCreateDestinationLine( DestinationLine->Line.szName[MIXER_LONG_NAME_CHARS-1] = L'\0'; } - else - { - /* FIXME no name was found for pin */ - wcscpy(DestinationLine->Line.szShortName, L"Summe"); - wcscpy(DestinationLine->Line.szName, L"Summe"); - } DestinationLine->Line.Target.dwType = (bInputMixer == 0 ? MIXERLINE_TARGETTYPE_WAVEOUT : MIXERLINE_TARGETTYPE_WAVEIN); DestinationLine->Line.Target.dwDeviceID = !bInputMixer; @@ -605,214 +227,697 @@ MMixerCreateDestinationLine( ASSERT(MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] == 0); wcscpy(DestinationLine->Line.Target.szPname, MixerInfo->MixCaps.szPname); - // initialize extra line + /* initialize extra line */ InitializeListHead(&DestinationLine->LineControlsExtraData); - // insert into mixer info + /* insert into mixer info */ InsertHeadList(&MixerInfo->LineList, &DestinationLine->Entry); - // done + /* done */ return MM_STATUS_SUCCESS; } MIXER_STATUS -MMixerGetControlsFromPin( +MMixerGetPinName( IN PMIXER_CONTEXT MixerContext, - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, + IN LPMIXER_INFO MixerInfo, IN ULONG PinId, - IN ULONG bUpDirection, - OUT PULONG Nodes) + IN OUT LPWSTR * OutBuffer) { - ULONG NodeConnectionCount, Index; + KSP_PIN Pin; + ULONG BytesReturned; + LPWSTR Buffer; MIXER_STATUS Status; - PULONG NodeConnection; - /* sanity check */ - ASSERT(PinId != (ULONG)-1); + /* prepare pin */ + Pin.PinId = PinId; + Pin.Reserved = 0; + Pin.Property.Flags = KSPROPERTY_TYPE_GET; + Pin.Property.Set = KSPROPSETID_Pin; + Pin.Property.Id = KSPROPERTY_PIN_NAME; - /* get all node indexes referenced by that pin */ - if (bUpDirection) - Status = MMixerGetNodeIndexes(MixerContext, NodeConnections, PinId, FALSE, FALSE, &NodeConnectionCount, &NodeConnection); - else - Status = MMixerGetNodeIndexes(MixerContext, NodeConnections, PinId, FALSE, TRUE, &NodeConnectionCount, &NodeConnection); + /* try get pin name size */ + Status = MixerContext->Control(MixerInfo->hMixer, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), NULL, 0, &BytesReturned); - for(Index = 0; Index < NodeConnectionCount; Index++) + /* check if buffer overflowed */ + if (Status == MM_STATUS_MORE_ENTRIES) { - /* get all associated controls */ - Status = MMixerGetControlsFromPinByConnectionIndex(MixerContext, NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Nodes); + /* allocate buffer */ + Buffer = (LPWSTR)MixerContext->Alloc(BytesReturned); + if (!Buffer) + { + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + + /* try get pin name */ + Status = MixerContext->Control(MixerInfo->hMixer, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)Buffer, BytesReturned, &BytesReturned); + if (Status != MM_STATUS_SUCCESS) + { + /* failed to get pin name */ + MixerContext->Free((PVOID)Buffer); + return Status; + } + + /* successfully obtained pin name */ + *OutBuffer = Buffer; + return MM_STATUS_SUCCESS; } - MixerContext->Free(NodeConnection); + /* failed to get pin name */ + return Status; +} + +MIXER_STATUS +MMixerBuildMixerDestinationLine( + IN PMIXER_CONTEXT MixerContext, + IN OUT LPMIXER_INFO MixerInfo, + IN ULONG PinId, + IN ULONG bInput) +{ + LPWSTR PinName; + MIXER_STATUS Status; + + /* try get pin name */ + Status = MMixerGetPinName(MixerContext, MixerInfo, PinId, &PinName); + if (Status == MM_STATUS_SUCCESS) + { + /* create mixer destination line */ + + Status = MMixerCreateDestinationLine(MixerContext, MixerInfo, bInput, PinName); + + /* free pin name */ + MixerContext->Free(PinName); + } + else + { + /* create mixer destination line unlocalized */ + Status = MMixerCreateDestinationLine(MixerContext, MixerInfo, bInput, L"No Name"); + } return Status; } +MIXER_STATUS +MMixerBuildTopology( + IN PMIXER_CONTEXT MixerContext, + IN LPMIXER_DATA MixerData, + OUT PTOPOLOGY * OutTopology) +{ + ULONG PinsCount; + PKSMULTIPLE_ITEM NodeTypes = NULL; + PKSMULTIPLE_ITEM NodeConnections = NULL; + MIXER_STATUS Status; + if (MixerData->Topology) + { + /* re-use existing topology */ + *OutTopology = MixerData->Topology; + return MM_STATUS_SUCCESS; + } + + /* get connected filter pin count */ + PinsCount = MMixerGetFilterPinCount(MixerContext, MixerData->hDevice); + + if (!PinsCount) + { + /* referenced filter does not have any pins */ + return MM_STATUS_UNSUCCESSFUL; + } + + /* get topology node types */ + Status = MMixerGetFilterTopologyProperty(MixerContext, MixerData->hDevice, KSPROPERTY_TOPOLOGY_NODES, &NodeTypes); + if (Status != MM_STATUS_SUCCESS) + { + /* failed to get topology node types */ + return Status; + } + + /* get topology connections */ + Status = MMixerGetFilterTopologyProperty(MixerContext, MixerData->hDevice, KSPROPERTY_TOPOLOGY_CONNECTIONS, &NodeConnections); + if (Status != MM_STATUS_SUCCESS) + { + /* failed to get topology connections */ + MixerContext->Free(NodeTypes); + return Status; + } + + /* create a topology */ + Status = MMixerCreateTopology(MixerContext, PinsCount, NodeConnections, NodeTypes, OutTopology); + + /* free node types & connections */ + MixerContext->Free(NodeConnections); + MixerContext->Free(NodeTypes); + + if (Status == MM_STATUS_SUCCESS) + { + /* store topology object */ + MixerData->Topology = *OutTopology; + } + + /* done */ + return Status; +} + +MIXER_STATUS +MMixerCountMixerControls( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG PinId, + IN ULONG bUpStream, + OUT PULONG OutNodesCount, + OUT PULONG OutNodes, + OUT PULONG OutLineTerminator) +{ + PULONG Nodes; + ULONG NodesCount, NodeIndex, Count, bTerminator; + MIXER_STATUS Status; + + /* allocate an array to store all nodes which are upstream of this pin */ + Status = MMixerAllocateTopologyNodeArray(MixerContext, Topology, &Nodes); + + if (Status != MM_STATUS_SUCCESS) + { + /* out of memory */ + return STATUS_NO_MEMORY; + } + + /* mark result array as zero */ + *OutNodesCount = 0; + + /* get next nodes */ + MMixerGetNextNodesFromPinIndex(MixerContext, Topology, PinId, bUpStream, &NodesCount, Nodes); + + /* assume no topology split before getting line terminator */ + ASSERT(NodesCount == 1); + + /* get first node */ + NodeIndex = Nodes[0]; + Count = 0; + + do + { + /* check if the node is a terminator */ + MMixerIsNodeTerminator(Topology, NodeIndex, &bTerminator); + + if (bTerminator) + { + /* found terminator */ + break; + } + + /* store node id */ + OutNodes[Count] = NodeIndex; + + /* increment node count */ + Count++; + + /* get next nodes upstream */ + MMixerGetNextNodesFromNodeIndex(MixerContext, Topology, NodeIndex, bUpStream, &NodesCount, Nodes); + + /* assume there is a node connected */ + ASSERT(NodesCount != 0); + ASSERT(NodesCount == 1); + + /* use first index */ + NodeIndex = Nodes[0]; + + }while(TRUE); + + /* free node index */ + MixerContext->Free(Nodes); + + /* store nodes count */ + *OutNodesCount = Count; + + /* store line terminator */ + *OutLineTerminator = NodeIndex; + + /* done */ + return MM_STATUS_SUCCESS; +} + +MIXER_STATUS +MMixerAddMixerControlsToMixerLineByNodeIndexArray( + IN PMIXER_CONTEXT MixerContext, + IN LPMIXER_INFO MixerInfo, + IN PTOPOLOGY Topology, + IN OUT LPMIXERLINE_EXT DstLine, + IN ULONG NodesCount, + IN PULONG Nodes) +{ + ULONG Index, Count, bReserved; + MIXER_STATUS Status; + + /* store nodes array */ + DstLine->NodeIds = Nodes; + + /* allocate MIXERCONTROLSW array */ + DstLine->LineControls = MixerContext->Alloc(NodesCount * sizeof(MIXERCONTROLW)); + + if (!DstLine->LineControls) + { + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + + /* initialize control count */ + Count = 0; + + for(Index = 0; Index < NodesCount; Index++) + { + /* check if the node has already been reserved to a line */ + MMixerIsTopologyNodeReserved(Topology, Nodes[Index], &bReserved); + + if (bReserved) + { + /* node is already used, skip it */ + continue; + } + + /* set node status as used */ + MMixerSetTopologyNodeReserved(Topology, Nodes[Index]); + + /* now add the mixer control */ + Status = MMixerAddMixerControl(MixerContext, MixerInfo, Topology, Nodes[Index], DstLine, &DstLine->LineControls[Count]); + + if (Status == MM_STATUS_SUCCESS) + { + /* increment control count */ + Count++; + } + } + + /* store control count */ + DstLine->Line.cControls = Count; + + /* done */ + return MM_STATUS_SUCCESS; +} + +MIXER_STATUS +MMixerBuildMixerSourceLine( + IN PMIXER_CONTEXT MixerContext, + IN OUT LPMIXER_INFO MixerInfo, + IN PTOPOLOGY Topology, + IN ULONG PinId, + IN ULONG NodesCount, + IN PULONG Nodes, + OUT LPMIXERLINE_EXT * OutSrcLine) +{ + LPMIXERLINE_EXT SrcLine, DstLine; + LPWSTR PinName; + MIXER_STATUS Status; + + /* construct source line */ + SrcLine = (LPMIXERLINE_EXT)MixerContext->Alloc(sizeof(MIXERLINE_EXT)); + + if (!SrcLine) + { + /* no memory */ + return MM_STATUS_NO_MEMORY; + } + + /* get destination line */ + DstLine = MMixerGetSourceMixerLineByLineId(MixerInfo, DESTINATION_LINE); + ASSERT(DstLine); + + /* initialize mixer src line */ + SrcLine->hDevice = MixerInfo->hMixer; + SrcLine->PinId = PinId; + SrcLine->NodeIds = Nodes; + + /* initialize mixer line */ + SrcLine->Line.cbStruct = sizeof(MIXERLINEW); + SrcLine->Line.dwDestination = 0; + SrcLine->Line.dwSource = DstLine->Line.cConnections; + SrcLine->Line.dwLineID = (DstLine->Line.cConnections * 0x10000); + SrcLine->Line.fdwLine = MIXERLINE_LINEF_ACTIVE | MIXERLINE_LINEF_SOURCE; + SrcLine->Line.dwUser = 0; + SrcLine->Line.cChannels = DstLine->Line.cChannels; + SrcLine->Line.cConnections = 0; + SrcLine->Line.Target.dwType = 1; + SrcLine->Line.Target.dwDeviceID = DstLine->Line.Target.dwDeviceID; + SrcLine->Line.Target.wMid = MixerInfo->MixCaps.wMid; + SrcLine->Line.Target.wPid = MixerInfo->MixCaps.wPid; + SrcLine->Line.Target.vDriverVersion = MixerInfo->MixCaps.vDriverVersion; + InitializeListHead(&SrcLine->LineControlsExtraData); + + /* copy name */ + ASSERT(MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] == L'\0'); + wcscpy(SrcLine->Line.Target.szPname, MixerInfo->MixCaps.szPname); + + /* get pin name */ + Status = MMixerGetPinName(MixerContext, MixerInfo, PinId, &PinName); + + if (Status == MM_STATUS_SUCCESS) + { + /* store pin name as line name */ + MixerContext->Copy(SrcLine->Line.szShortName, PinName, (min(MIXER_SHORT_NAME_CHARS, wcslen(PinName)+1)) * sizeof(WCHAR)); + SrcLine->Line.szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0'; + + MixerContext->Copy(SrcLine->Line.szName, PinName, (min(MIXER_LONG_NAME_CHARS, wcslen(PinName)+1)) * sizeof(WCHAR)); + SrcLine->Line.szName[MIXER_LONG_NAME_CHARS-1] = L'\0'; + + /* free pin name buffer */ + MixerContext->Free(PinName); + } + + /* add the controls to mixer line */ + Status = MMixerAddMixerControlsToMixerLineByNodeIndexArray(MixerContext, MixerInfo, Topology, SrcLine, NodesCount, Nodes); + if (Status != MM_STATUS_SUCCESS) + { + /* failed */ + return Status; + } + + /* store result */ + *OutSrcLine = SrcLine; + + return MM_STATUS_SUCCESS; +} MIXER_STATUS MMixerAddMixerSourceLines( IN PMIXER_CONTEXT MixerContext, IN OUT LPMIXER_INFO MixerInfo, - IN HANDLE hDevice, - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG PinsCount, - IN ULONG BridgePinIndex, - IN ULONG TargetPinIndex, - IN PULONG Pins) + IN PTOPOLOGY Topology, + IN ULONG LineTerminator) { - ULONG Index; + PULONG AllNodes, AllPins, AllPinNodes; + ULONG AllNodesCount, AllPinsCount, AllPinNodesCount; + ULONG Index, SubIndex, PinId, CurNode, bConnected; + MIXER_STATUS Status; + LPMIXERLINE_EXT DstLine, SrcLine; - for(Index = PinsCount; Index > 0; Index--) + /* get destination line */ + DstLine = MMixerGetSourceMixerLineByLineId(MixerInfo, DESTINATION_LINE); + ASSERT(DstLine); + + /* allocate an array to store all nodes which are upstream of the line terminator */ + Status = MMixerAllocateTopologyNodeArray(MixerContext, Topology, &AllNodes); + + /* check for success */ + if (Status != MM_STATUS_SUCCESS) { - DPRINT("MMixerAddMixerSourceLines Index %lu Pin %lu\n", Index-1, Pins[Index-1]); - if (Pins[Index-1]) - { - MMixerAddMixerSourceLine(MixerContext, MixerInfo, hDevice, NodeConnections, NodeTypes, Index-1, (Index -1 == BridgePinIndex), (Index -1 == TargetPinIndex)); - } + /* out of memory */ + return MM_STATUS_NO_MEMORY; } + + /* allocate an array to store all nodes which are downstream of a particular pin */ + Status = MMixerAllocateTopologyNodeArray(MixerContext, Topology, &AllPinNodes); + + /* allocate an array to store all pins which are upstream of this pin */ + Status = MMixerAllocateTopologyPinArray(MixerContext, Topology, &AllPins); + + /* check for success */ + if (Status != MM_STATUS_SUCCESS) + { + /* out of memory */ + MixerContext->Free(AllNodes); + return MM_STATUS_NO_MEMORY; + } + + /* get all nodes which indirectly / directly connect to this node */ + AllNodesCount = 0; + MMixerGetAllUpOrDownstreamNodesFromNodeIndex(MixerContext, Topology, LineTerminator, TRUE, &AllNodesCount, AllNodes); + + /* get all pins which indirectly / directly connect to this node */ + AllPinsCount = 0; + MMixerGetAllUpOrDownstreamPinsFromNodeIndex(MixerContext, Topology, LineTerminator, TRUE, &AllPinsCount, AllPins); + + DPRINT("LineTerminator %lu\n", LineTerminator); + DPRINT("PinCount %lu\n", AllPinsCount); + DPRINT("AllNodesCount %lu\n", AllNodesCount); + + /* now construct the source lines which are attached to the destination line */ + Index = AllPinsCount; + + do + { + /* get current pin id */ + PinId = AllPins[Index - 1]; + + /* reset nodes count */ + AllPinNodesCount = 0; + + /* now scan all nodes and add them to AllPinNodes array when they are connected to this pin */ + for(SubIndex = 0; SubIndex < AllNodesCount; SubIndex++) + { + /* get current node index */ + CurNode = AllNodes[SubIndex]; + + if (CurNode != MAXULONG && CurNode != LineTerminator) + { + /* check if that node is connected in some way to the current pin */ + Status = MMixerIsNodeConnectedToPin(MixerContext, Topology, CurNode, PinId, TRUE, &bConnected); + + if (Status != MM_STATUS_SUCCESS) + break; + + if (bConnected) + { + /* it is connected */ + AllPinNodes[AllPinNodesCount] = CurNode; + AllPinNodesCount++; + + /* clear current index */ + AllNodes[SubIndex] = MAXULONG; + } + } + } + + /* decrement pin index */ + Index--; + + if (AllPinNodesCount) + { + /* now build the mixer source line */ + Status = MMixerBuildMixerSourceLine(MixerContext, MixerInfo, Topology, PinId, AllPinNodesCount, AllPinNodes, &SrcLine); + + if (Status == MM_STATUS_SUCCESS) + { + /* insert into line list */ + InsertTailList(&MixerInfo->LineList, &SrcLine->Entry); + + /* increment destination line count */ + DstLine->Line.cConnections++; + } + } + + }while(Index != 0); + return MM_STATUS_SUCCESS; } +MIXER_STATUS +MMixerAddMixerControlsToDestinationLine( + IN PMIXER_CONTEXT MixerContext, + IN OUT LPMIXER_INFO MixerInfo, + IN PTOPOLOGY Topology, + IN ULONG PinId, + IN ULONG bInput, + OUT PULONG OutLineTerminator) +{ + PULONG Nodes; + ULONG NodesCount, LineTerminator; + MIXER_STATUS Status; + LPMIXERLINE_EXT DstLine; + + /* allocate nodes index array */ + Status = MMixerAllocateTopologyNodeArray(MixerContext, Topology, &Nodes); + + /* check for success */ + if (Status != MM_STATUS_SUCCESS) + { + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + + /* get all destination line controls */ + Status = MMixerCountMixerControls(MixerContext, Topology, PinId, TRUE, &NodesCount, Nodes, &LineTerminator); + + /* check for success */ + if (Status != MM_STATUS_SUCCESS) + { + /* failed to count controls */ + MixerContext->Free(Nodes); + return Status; + } + + /* get destination mixer line */ + DstLine = MMixerGetSourceMixerLineByLineId(MixerInfo, DESTINATION_LINE); + + /* sanity check */ + ASSERT(DstLine); + + if (NodesCount > 0) + { + /* add all nodes as mixer controls to the destination line */ + Status = MMixerAddMixerControlsToMixerLineByNodeIndexArray(MixerContext, MixerInfo, Topology, DstLine, NodesCount, Nodes); + if (Status != MM_STATUS_SUCCESS) + { + /* failed to add controls */ + MixerContext->Free(Nodes); + return Status; + } + } + + /* store result */ + *OutLineTerminator = LineTerminator; + + /* return result */ + return Status; +} + +VOID +MMixerApplyOutputFilterHack( + IN PMIXER_CONTEXT MixerContext, + IN LPMIXER_DATA MixerData, + IN OUT PULONG PinsCount, + IN OUT PULONG Pins) +{ + ULONG Count = 0, Index; + MIXER_STATUS Status; + PKSPIN_PHYSICALCONNECTION Connection; + + for(Index = 0; Index < *PinsCount; Index++) + { + /* check if it has a physical connection */ + Status = MMixerGetPhysicalConnection(MixerContext, MixerData->hDevice, Pins[Index], &Connection); + + if (Status == MM_STATUS_SUCCESS) + { + /* remove pin */ + MixerContext->Copy(&Pins[Index], &Pins[Index + 1], (*PinsCount - (Index + 1)) * sizeof(ULONG)); + + /* free physical connection */ + MixerContext->Free(Connection); + + /* decrement index */ + Index--; + + /* decrement pin count */ + (*PinsCount)--; + } + else + { + /* simple pin */ + Count++; + } + } + + /* store result */ + *PinsCount = Count; +} + MIXER_STATUS MMixerHandlePhysicalConnection( IN PMIXER_CONTEXT MixerContext, IN PMIXER_LIST MixerList, + IN LPMIXER_DATA MixerData, IN OUT LPMIXER_INFO MixerInfo, IN ULONG bInput, IN PKSPIN_PHYSICALCONNECTION OutConnection) { - PULONG PinsRef = NULL, PinConnectionIndex = NULL, PinsSrcRef; - ULONG PinsRefCount, Index, PinConnectionIndexCount; MIXER_STATUS Status; - PKSMULTIPLE_ITEM NodeTypes = NULL; - PKSMULTIPLE_ITEM NodeConnections = NULL; - PULONG MixerControls; - ULONG MixerControlsCount; - LPMIXER_DATA MixerData; + ULONG PinsCount, LineTerminator; + PULONG Pins; + PTOPOLOGY Topology; - - // open the connected filter + /* first try to open the connected filter */ OutConnection->SymbolicLinkName[1] = L'\\'; MixerData = MMixerGetDataByDeviceName(MixerList, OutConnection->SymbolicLinkName); - ASSERT(MixerData); - // store connected mixer handle + /* check if the linked connection is found */ + if (!MixerData) + { + /* filter references invalid physical connection */ + return MM_STATUS_UNSUCCESSFUL; + } + + DPRINT("Name %S, Pin %lu bInput %lu\n", OutConnection->SymbolicLinkName, OutConnection->Pin, bInput); + + /* store connected mixer handle */ MixerInfo->hMixer = MixerData->hDevice; - // get connected filter pin count - PinsRefCount = MMixerGetFilterPinCount(MixerContext, MixerData->hDevice); - ASSERT(PinsRefCount); - PinsRef = (PULONG)MixerContext->Alloc(sizeof(ULONG) * PinsRefCount); - if (!PinsRef) - { - // no memory - return MM_STATUS_UNSUCCESSFUL; - } - - // get topology node types - Status = MMixerGetFilterTopologyProperty(MixerContext, MixerData->hDevice, KSPROPERTY_TOPOLOGY_NODES, &NodeTypes); + Status = MMixerBuildTopology(MixerContext, MixerData, &Topology); if (Status != MM_STATUS_SUCCESS) { - MixerContext->Free(PinsRef); + /* failed to create topology */ return Status; } - // get topology connections - Status = MMixerGetFilterTopologyProperty(MixerContext, MixerData->hDevice, KSPROPERTY_TOPOLOGY_CONNECTIONS, &NodeConnections); - if (Status != MM_STATUS_SUCCESS) - { - MixerContext->Free(PinsRef); - MixerContext->Free(NodeTypes); - return Status; - } - // gets connection index of the bridge pin which connects to a node - DPRINT("Pin %lu\n", OutConnection->Pin); + /* allocate pin index array which will hold all referenced pins */ + Status = MMixerAllocateTopologyPinArray(MixerContext, Topology, &Pins); + ASSERT(Status == MM_STATUS_SUCCESS); - Status = MMixerGetNodeIndexes(MixerContext, NodeConnections, OutConnection->Pin, FALSE, !bInput, &PinConnectionIndexCount, &PinConnectionIndex); - if (Status != MM_STATUS_SUCCESS) + if (!bInput) { - MixerContext->Free(PinsRef); - MixerContext->Free(NodeTypes); - MixerContext->Free(NodeConnections); - return Status; - } + /* the mixer is an output mixer + * find end pin of the node path + */ + PinsCount = 0; + Status = MMixerGetAllUpOrDownstreamPinsFromPinIndex(MixerContext, Topology, OutConnection->Pin, FALSE, &PinsCount, Pins); - /* there should be no split in the bridge pin */ - ASSERT(PinConnectionIndexCount == 1); - - /* find all target pins of this connection */ - Status = MMixerGetTargetPinsByNodeConnectionIndex(MixerContext, NodeConnections, NodeTypes, FALSE, PinConnectionIndex[0], PinsRefCount, PinsRef); - if (Status != MM_STATUS_SUCCESS) - { - MixerContext->Free(PinsRef); - MixerContext->Free(NodeTypes); - MixerContext->Free(NodeConnections); - MixerContext->Free(PinConnectionIndex); - return Status; - } - - for(Index = 0; Index < PinsRefCount; Index++) - { - DPRINT("PinsRefCount %lu Index %lu Value %lu\n", PinsRefCount, Index, PinsRef[Index]); - if (PinsRef[Index]) + /* check for success */ + if (Status != MM_STATUS_SUCCESS) { - // found a target pin, now get all references - Status = MMixerGetNodeIndexes(MixerContext, NodeConnections, Index, FALSE, FALSE, &MixerControlsCount, &MixerControls); - if (Status != MM_STATUS_SUCCESS) - { - DPRINT("MMixerGetNodeIndexes failed with %u\n", Status); - break; - } + /* failed to get end pin */ + MixerContext->Free(Pins); + //MMixerFreeTopology(Topology); - /* sanity check */ - ASSERT(MixerControlsCount == 1); + /* return error code */ + return Status; + } + /* HACK: + * some topologies do not have strict boundaries + * WorkArround: remove all pin ids which have a physical connection + * because bridge pins may belong to different render paths + */ + MMixerApplyOutputFilterHack(MixerContext, MixerData, &PinsCount, Pins); - PinsSrcRef = (PULONG)MixerContext->Alloc(PinsRefCount * sizeof(ULONG)); - if (!PinsSrcRef) - { - /* no memory */ - MixerContext->Free(PinsRef); - MixerContext->Free(NodeTypes); - MixerContext->Free(NodeConnections); - MixerContext->Free(PinConnectionIndex); - MixerContext->Free(MixerControls); - return MM_STATUS_NO_MEMORY; - } + /* sanity checks */ + ASSERT(PinsCount != 0); + ASSERT(PinsCount == 1); - // now get all connected source pins - Status = MMixerGetTargetPinsByNodeConnectionIndex(MixerContext, NodeConnections, NodeTypes, TRUE, MixerControls[0], PinsRefCount, PinsSrcRef); - if (Status != MM_STATUS_SUCCESS) - { - // failed */ - MixerContext->Free(PinsRef); - MixerContext->Free(NodeTypes); - MixerContext->Free(NodeConnections); - MixerContext->Free(PinConnectionIndex); - MixerContext->Free(MixerControls); - MixerContext->Free(PinsSrcRef); - return Status; - } + /* create destination line */ + Status = MMixerBuildMixerDestinationLine(MixerContext, MixerInfo, Pins[0], bInput); - /* add pins from target line */ - if (!bInput) - { - // dont add bridge pin for input mixers - PinsSrcRef[Index] = TRUE; - PinsSrcRef[OutConnection->Pin] = TRUE; - } - PinsSrcRef[OutConnection->Pin] = TRUE; + if (Status != MM_STATUS_SUCCESS) + { + MixerContext->Free(Pins); + //MMixerFreeTopology(Topology); - Status = MMixerAddMixerSourceLines(MixerContext, MixerInfo, MixerData->hDevice, NodeConnections, NodeTypes, PinsRefCount, OutConnection->Pin, Index, PinsSrcRef); + /* return error code */ + return Status; + } - MixerContext->Free(MixerControls); - MixerContext->Free(PinsSrcRef); + /* add mixer controls to destination line */ + Status = MMixerAddMixerControlsToDestinationLine(MixerContext, MixerInfo, Topology, Pins[0], bInput, &LineTerminator); + + if (Status == MM_STATUS_SUCCESS) + { + /* now add the rest of the source lines */ + Status = MMixerAddMixerSourceLines(MixerContext, MixerInfo, Topology, LineTerminator); } } + else + { + Status = MMixerAddMixerControlsToDestinationLine(MixerContext, MixerInfo, Topology, OutConnection->Pin, bInput, &LineTerminator); + + if (Status == MM_STATUS_SUCCESS) + { + /* now add the rest of the source lines */ + Status = MMixerAddMixerSourceLines(MixerContext, MixerInfo, Topology, LineTerminator); + } + } + + /* free topology */ + //MMixerFreeTopology(Topology); return Status; } @@ -823,193 +928,139 @@ MMixerInitializeFilter( IN PMIXER_CONTEXT MixerContext, IN PMIXER_LIST MixerList, IN LPMIXER_DATA MixerData, - IN PKSMULTIPLE_ITEM NodeTypes, - IN PKSMULTIPLE_ITEM NodeConnections, - IN ULONG PinCount, + IN PTOPOLOGY Topology, IN ULONG NodeIndex, IN ULONG bInputMixer) { LPMIXER_INFO MixerInfo; MIXER_STATUS Status; PKSPIN_PHYSICALCONNECTION OutConnection; - ULONG Index; ULONG * Pins; - ULONG bUsed; - ULONG BytesReturned; - KSP_PIN Pin; - LPWSTR Buffer = NULL; - ULONG PinId; + ULONG PinsFound; - // allocate a mixer info struct + /* allocate a mixer info struct */ MixerInfo = (LPMIXER_INFO) MixerContext->Alloc(sizeof(MIXER_INFO)); if (!MixerInfo) { - // no memory + /* no memory */ return MM_STATUS_NO_MEMORY; } - // intialize mixer caps */ - MixerInfo->MixCaps.wMid = MM_MICROSOFT; //FIXME - MixerInfo->MixCaps.wPid = MM_PID_UNMAPPED; //FIXME - MixerInfo->MixCaps.vDriverVersion = 1; //FIXME + /* intialize mixer caps */ + MixerInfo->MixCaps.wMid = MM_MICROSOFT; /* FIXME */ + MixerInfo->MixCaps.wPid = MM_PID_UNMAPPED; /* FIXME */ + MixerInfo->MixCaps.vDriverVersion = 1; /* FIXME */ MixerInfo->MixCaps.fdwSupport = 0; MixerInfo->MixCaps.cDestinations = 1; MixerInfo->hMixer = MixerData->hDevice; - // get mixer name + /* get mixer name */ MMixerGetDeviceName(MixerContext, MixerInfo, MixerData->hDeviceInterfaceKey); - // initialize line list + /* initialize line list */ InitializeListHead(&MixerInfo->LineList); InitializeListHead(&MixerInfo->EventList); - // sanity check - ASSERT(PinCount); + /* now allocate an array which will receive the indices of the pin + * which has a ADC / DAC nodetype in its path + */ + Status = MMixerAllocateTopologyPinArray(MixerContext, Topology, &Pins); + ASSERT(Status == MM_STATUS_SUCCESS); - // now allocate an array which will receive the indices of the pin - // which has a ADC / DAC nodetype in its path - Pins = (PULONG)MixerContext->Alloc(PinCount * sizeof(ULONG)); + PinsFound = 0; - if (!Pins) - { - // no memory - MMixerFreeMixerInfo(MixerContext, MixerInfo); - return MM_STATUS_NO_MEMORY; - } + /* now get all sink / source pins, which are attached to the ADC / DAC node + * For sink pins (wave out) search up stream + * For source pins (wave in) search down stream + * The search direction is always the opposite of the current mixer type + */ + PinsFound = 0; + MMixerGetAllUpOrDownstreamPinsFromNodeIndex(MixerContext, Topology, NodeIndex, !bInputMixer, &PinsFound, Pins); - // now get the target pins of the ADC / DAC node - Status = MMixerGetTargetPins(MixerContext, NodeTypes, NodeConnections, NodeIndex, !bInputMixer, Pins, PinCount); - - // find a target pin with a name - PinId = PinCount +1; - for(Index = 0; Index < PinCount; Index++) - { - if (Pins[Index]) - { - // store index of pin - PinId = Index; - - /* retrieve pin name */ - Pin.PinId = Index; - Pin.Reserved = 0; - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - Pin.Property.Set = KSPROPSETID_Pin; - Pin.Property.Id = KSPROPERTY_PIN_NAME; - - /* try get pin name size */ - Status = MixerContext->Control(MixerData->hDevice, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), NULL, 0, &BytesReturned); - - if (Status == MM_STATUS_MORE_ENTRIES) - { - Buffer = (LPWSTR)MixerContext->Alloc(BytesReturned); - if (Buffer) - { - /* try get pin name */ - Status = MixerContext->Control(MixerData->hDevice, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)Buffer, BytesReturned, &BytesReturned); - if (Status != MM_STATUS_SUCCESS) - { - MixerContext->Free((PVOID)Buffer); - Buffer = NULL; - } - else - { - // found name, done - break; - } - } - } - } - } - - if (PinId < PinCount) - { - // create an wave info struct - MMixerInitializeWaveInfo(MixerContext, MixerList, MixerData, MixerInfo->MixCaps.szPname, bInputMixer, PinId); - } - - Status = MMixerCreateDestinationLine(MixerContext, MixerInfo, bInputMixer, Buffer); - - if (Buffer) - { - // free name - MixerContext->Free(Buffer); - } + /* if there is now pin found, we have a broken topology */ + ASSERT(PinsFound != 0); + /* now create a wave info struct */ + Status = MMixerInitializeWaveInfo(MixerContext, MixerList, MixerData, MixerInfo->MixCaps.szPname, bInputMixer, PinsFound, Pins); if (Status != MM_STATUS_SUCCESS) { - // failed to create destination line + /* failed to create wave info struct */ MixerContext->Free(MixerInfo); MixerContext->Free(Pins); - return Status; } - RtlZeroMemory(Pins, sizeof(ULONG) * PinCount); - // now get the target pins of the ADC / DAC node - Status = MMixerGetTargetPins(MixerContext, NodeTypes, NodeConnections, NodeIndex, bInputMixer, Pins, PinCount); - - if (Status != MM_STATUS_SUCCESS) + if (bInputMixer) { - // failed to locate target pins - MixerContext->Free(Pins); - MMixerFreeMixerInfo(MixerContext, MixerInfo); - DPRINT("MMixerGetTargetPins failed with %u\n", Status); - return Status; - } + /* pre create the mixer destination line for input mixers */ + Status = MMixerBuildMixerDestinationLine(MixerContext, MixerInfo, Pins[0], bInputMixer); - // filter hasnt been used - bUsed = FALSE; - - // now check all pins and generate new lines for destination lines - for(Index = 0; Index < PinCount; Index++) - { - DPRINT("Index %lu TargetPin %lu\n", Index, Pins[Index]); - // is the current index a target pin - if (Pins[Index]) + if (Status != MM_STATUS_SUCCESS) { - // check if the pin has a physical connection - Status = MMixerGetPhysicalConnection(MixerContext, MixerData->hDevice, Index, &OutConnection); - if (Status == MM_STATUS_SUCCESS) - { - // the pin has a physical connection - Status = MMixerHandlePhysicalConnection(MixerContext, MixerList, MixerInfo, bInputMixer, OutConnection); - DPRINT("MMixerHandlePhysicalConnection status %u\n", Status); - MixerContext->Free(OutConnection); - bUsed = TRUE; - } - else - { - // filter exposes the topology on the same filter - MMixerAddMixerSourceLine(MixerContext, MixerInfo, MixerData->hDevice, NodeConnections, NodeTypes, Index, FALSE, FALSE); - bUsed = TRUE; - } + /* failed to create mixer destination line */ + return Status; } } + + + /* now get the bridge pin which is at the end of node path + * For sink pins (wave out) search down stream + * For source pins (wave in) search up stream + */ MixerContext->Free(Pins); + Status = MMixerAllocateTopologyPinArray(MixerContext, Topology, &Pins); + ASSERT(Status == MM_STATUS_SUCCESS); - if (bUsed) + PinsFound = 0; + MMixerGetAllUpOrDownstreamPinsFromNodeIndex(MixerContext, Topology, NodeIndex, bInputMixer, &PinsFound, Pins); + + /* if there is no pin found, we have a broken topology */ + ASSERT(PinsFound != 0); + + /* there should be exactly one bridge pin */ + ASSERT(PinsFound == 1); + + DPRINT("BridgePin %lu bInputMixer %lu\n", Pins[0], bInputMixer); + + /* does the pin have a physical connection */ + Status = MMixerGetPhysicalConnection(MixerContext, MixerData->hDevice, Pins[0], &OutConnection); + + if (Status == MM_STATUS_SUCCESS) { - // store mixer info in list - if (!bInputMixer && MixerList->MixerListCount == 1) - { - //FIXME preferred device should be inserted at front - //windows always inserts output mixer in front - InsertHeadList(&MixerList->MixerList, &MixerInfo->Entry); - } - else - { - InsertTailList(&MixerList->MixerList, &MixerInfo->Entry); - } - MixerList->MixerListCount++; - DPRINT("New MixerCount %lu\n", MixerList->MixerListCount); + /* topology on the topoloy filter */ + Status = MMixerHandlePhysicalConnection(MixerContext, MixerList, MixerData, MixerInfo, bInputMixer, OutConnection); + + /* free physical connection data */ + MixerContext->Free(OutConnection); } else { - // failed to create a mixer topology - MMixerFreeMixerInfo(MixerContext, MixerInfo); + /* FIXME + * handle drivers which expose their topology on the same filter + */ + ASSERT(0); } - // done + /* free pins */ + MixerContext->Free(Pins); + + if (!bInputMixer && MixerList->MixerListCount == 1) + { + /* FIXME preferred device should be inserted at front + * windows always inserts output mixer in front + */ + InsertHeadList(&MixerList->MixerList, &MixerInfo->Entry); + } + else + { + /* insert at back */ + InsertTailList(&MixerList->MixerList, &MixerInfo->Entry); + } + + /* increment mixer count */ + MixerList->MixerListCount++; + + /* done */ return Status; } @@ -1020,71 +1071,64 @@ MMixerSetupFilter( IN LPMIXER_DATA MixerData, IN PULONG DeviceCount) { - PKSMULTIPLE_ITEM NodeTypes = NULL, NodeConnections = NULL; MIXER_STATUS Status; - ULONG PinCount; + PTOPOLOGY Topology; ULONG NodeIndex; - // get number of pins - PinCount = MMixerGetFilterPinCount(MixerContext, MixerData->hDevice); - ASSERT(PinCount); - DPRINT("NumOfPins: %lu\n", PinCount); - - // get filter node types - Status = MMixerGetFilterTopologyProperty(MixerContext, MixerData->hDevice, KSPROPERTY_TOPOLOGY_NODES, &NodeTypes); - if (Status != MM_STATUS_SUCCESS) + /* check if topology has already been built */ + if (MixerData->Topology == NULL) { - // failed - return Status; + /* build topology */ + Status = MMixerBuildTopology(MixerContext, MixerData, &Topology); + + if (Status != MM_STATUS_SUCCESS) + { + /* failed to build topology */ + return Status; + } + + /* store topology */ + MixerData->Topology = Topology; + } + else + { + /* re-use topology */ + Topology = MixerData->Topology; } - // get filter node connections - Status = MMixerGetFilterTopologyProperty(MixerContext, MixerData->hDevice, KSPROPERTY_TOPOLOGY_CONNECTIONS, &NodeConnections); - if (Status != MM_STATUS_SUCCESS) - { - // failed - MixerContext->Free(NodeTypes); - return Status; - } - - // check if the filter has an wave out node - - NodeIndex = MMixerGetIndexOfGuid(NodeTypes, &KSNODETYPE_DAC); + /* check if the filter has an wave out node */ + NodeIndex = MMixerGetNodeIndexFromGuid(Topology, &KSNODETYPE_DAC); if (NodeIndex != MAXULONG) { - // it has - Status = MMixerInitializeFilter(MixerContext, MixerList, MixerData, NodeTypes, NodeConnections, PinCount, NodeIndex, FALSE); - DPRINT("MMixerInitializeFilter Status %u\n", Status); - // check for success + /* it has */ + Status = MMixerInitializeFilter(MixerContext, MixerList, MixerData, Topology, NodeIndex, FALSE); + + /* check for success */ if (Status == MM_STATUS_SUCCESS) { - // increment mixer count + /* increment mixer count */ (*DeviceCount)++; } } - // check if the filter has an wave in node - NodeIndex = MMixerGetIndexOfGuid(NodeTypes, &KSNODETYPE_ADC); + /* check if the filter has an wave in node */ + NodeIndex = MMixerGetNodeIndexFromGuid(Topology, &KSNODETYPE_ADC); if (NodeIndex != MAXULONG) { - // it has - Status = MMixerInitializeFilter(MixerContext, MixerList, MixerData, NodeTypes, NodeConnections, PinCount, NodeIndex, TRUE); - DPRINT("MMixerInitializeFilter Status %u\n", Status); - // check for success + /* it has */ + Status = MMixerInitializeFilter(MixerContext, MixerList, MixerData, Topology, NodeIndex, TRUE); + + /* check for success */ if (Status == MM_STATUS_SUCCESS) { - // increment mixer count + /* increment mixer count */ (*DeviceCount)++; } } - //free resources - MixerContext->Free((PVOID)NodeTypes); - MixerContext->Free((PVOID)NodeConnections); - - // done + /* done */ return Status; } @@ -1093,20 +1137,22 @@ MIXER_STATUS MMixerAddEvent( IN PMIXER_CONTEXT MixerContext, IN OUT LPMIXER_INFO MixerInfo, - IN ULONG NodeId) + IN PVOID MixerEventContext, + IN PMIXER_EVENT MixerEventRoutine) { - KSE_NODE Property; - LPEVENT_ITEM EventData; - ULONG BytesReturned; - MIXER_STATUS Status; + //KSE_NODE Property; + PEVENT_NOTIFICATION_ENTRY EventData; + //ULONG BytesReturned; + //MIXER_STATUS Status; - EventData = (LPEVENT_ITEM)MixerContext->AllocEventData(sizeof(LIST_ENTRY)); + EventData = (PEVENT_NOTIFICATION_ENTRY)MixerContext->AllocEventData(sizeof(EVENT_NOTIFICATION_ENTRY)); if (!EventData) { - // not enough memory + /* not enough memory */ return MM_STATUS_NO_MEMORY; } +#if 0 /* setup request */ Property.Event.Set = KSEVENTSETID_AudioControlChange; Property.Event.Flags = KSEVENT_TYPE_TOPOLOGY|KSEVENT_TYPE_ENABLE; @@ -1118,48 +1164,18 @@ MMixerAddEvent( Status = MixerContext->Control(MixerInfo->hMixer, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSP_NODE), (PVOID)EventData, sizeof(KSEVENTDATA), &BytesReturned); if (Status != MM_STATUS_SUCCESS) { - // failed to add event + /* failed to add event */ MixerContext->FreeEventData(EventData); return Status; } +#endif - //store event + /* initialize notification entry */ + EventData->MixerEventContext = MixerEventContext; + EventData->MixerEventRoutine; + + /* store event */ InsertTailList(&MixerInfo->EventList, &EventData->Entry); - return Status; -} - -MIXER_STATUS -MMixerAddEvents( - IN PMIXER_CONTEXT MixerContext, - IN OUT LPMIXER_INFO MixerInfo) -{ - PKSMULTIPLE_ITEM NodeTypes; - ULONG Index; - MIXER_STATUS Status; - LPGUID Guid; - - // get filter node types - Status = MMixerGetFilterTopologyProperty(MixerContext, MixerInfo->hMixer, KSPROPERTY_TOPOLOGY_NODES, &NodeTypes); - - if (Status != MM_STATUS_SUCCESS) - { - // failed - return Status; - } - - for(Index = 0; Index < NodeTypes->Count; Index++) - { - Guid = MMixerGetNodeType(NodeTypes, Index); - if (IsEqualGUID(&KSNODETYPE_VOLUME, Guid) || IsEqualGUID(&KSNODETYPE_MUTE, Guid)) - { - //add an event for volume / mute controls - //TODO: extra control types - MMixerAddEvent(MixerContext, MixerInfo, Index); - } - } - - // free node types - MixerContext->Free(NodeTypes); - return MM_STATUS_SUCCESS; } + diff --git a/lib/drivers/sound/mmixer/filter.c b/lib/drivers/sound/mmixer/filter.c index 955fd273ae9..9a2739e2992 100644 --- a/lib/drivers/sound/mmixer/filter.c +++ b/lib/drivers/sound/mmixer/filter.c @@ -19,15 +19,15 @@ MMixerGetFilterPinCount( MIXER_STATUS Status; ULONG NumPins, BytesReturned; - // setup property request + /* setup property request */ Pin.Flags = KSPROPERTY_TYPE_GET; Pin.Set = KSPROPSETID_Pin; Pin.Id = KSPROPERTY_PIN_CTYPES; - // query pin count + /* query pin count */ Status = MixerContext->Control(hMixer, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&NumPins, sizeof(ULONG), (PULONG)&BytesReturned); - // check for success + /* check for success */ if (Status != MM_STATUS_SUCCESS) return 0; @@ -46,43 +46,43 @@ MMixerGetFilterTopologyProperty( MIXER_STATUS Status; ULONG BytesReturned; - // setup property request + /* setup property request */ Property.Id = PropertyId; Property.Flags = KSPROPERTY_TYPE_GET; Property.Set = KSPROPSETID_Topology; - // query for the size + /* query for the size */ Status = MixerContext->Control(hMixer, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &BytesReturned); if (Status != MM_STATUS_MORE_ENTRIES) return Status; - //sanity check + /* sanity check */ ASSERT(BytesReturned); - // allocate an result buffer + /* allocate an result buffer */ MultipleItem = (PKSMULTIPLE_ITEM)MixerContext->Alloc(BytesReturned); if (!MultipleItem) { - // not enough memory + /* not enough memory */ return MM_STATUS_NO_MEMORY; } - // query again with allocated buffer + /* query again with allocated buffer */ Status = MixerContext->Control(hMixer, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)MultipleItem, BytesReturned, &BytesReturned); if (Status != MM_STATUS_SUCCESS) { - // failed + /* failed */ MixerContext->Free((PVOID)MultipleItem); return Status; } - // store result + /* store result */ *OutMultipleItem = MultipleItem; - // done + /* done */ return Status; } @@ -109,24 +109,23 @@ MMixerGetPhysicalConnection( if (Status == MM_STATUS_UNSUCCESSFUL) { - // pin does not have a physical connection + /* pin does not have a physical connection */ return Status; } DPRINT("Status %u BytesReturned %lu\n", Status, BytesReturned); Connection = (PKSPIN_PHYSICALCONNECTION)MixerContext->Alloc(BytesReturned); if (!Connection) { - // not enough memory + /* not enough memory */ return MM_STATUS_NO_MEMORY; } - // query the pin for the physical connection + /* query the pin for the physical connection */ Status = MixerContext->Control(hMixer, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)Connection, BytesReturned, &BytesReturned); if (Status != MM_STATUS_SUCCESS) { - // failed to query the physical connection + /* failed to query the physical connection */ MixerContext->Free(Connection); - DPRINT("Status %u\n", Status); return Status; } @@ -141,73 +140,76 @@ MMixerGetControlTypeFromTopologyNode( { if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_AGC)) { - // automatic gain control + /* automatic gain control */ return MIXERCONTROL_CONTROLTYPE_ONOFF; } else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_LOUDNESS)) { - // loudness control + /* loudness control */ return MIXERCONTROL_CONTROLTYPE_LOUDNESS; } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUTE )) + else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUTE)) { - // mute control + /* mute control */ return MIXERCONTROL_CONTROLTYPE_MUTE; } else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_TONE)) { - // tpne control - //FIXME - // MIXERCONTROL_CONTROLTYPE_ONOFF if KSPROPERTY_AUDIO_BASS_BOOST is supported - // MIXERCONTROL_CONTROLTYPE_BASS if KSPROPERTY_AUDIO_BASS is supported - // MIXERCONTROL_CONTROLTYPE_TREBLE if KSPROPERTY_AUDIO_TREBLE is supported + /* tone control + * FIXME + * MIXERCONTROL_CONTROLTYPE_ONOFF if KSPROPERTY_AUDIO_BASS_BOOST is supported + * MIXERCONTROL_CONTROLTYPE_BASS if KSPROPERTY_AUDIO_BASS is supported + * MIXERCONTROL_CONTROLTYPE_TREBLE if KSPROPERTY_AUDIO_TREBLE is supported + */ UNIMPLEMENTED; return MIXERCONTROL_CONTROLTYPE_ONOFF; } else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_VOLUME)) { - // volume control + /* volume control */ return MIXERCONTROL_CONTROLTYPE_VOLUME; } else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_PEAKMETER)) { - // peakmeter control + /* peakmeter control */ return MIXERCONTROL_CONTROLTYPE_PEAKMETER; } else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUX)) { - // mux control + /* mux control */ return MIXERCONTROL_CONTROLTYPE_MUX; } else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUX)) { - // mux control + /* mux control */ return MIXERCONTROL_CONTROLTYPE_MUX; } else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_STEREO_WIDE)) { - // stero wide control + /* stero wide control */ return MIXERCONTROL_CONTROLTYPE_FADER; } else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_CHORUS)) { - // chorus control + /* chorus control */ return MIXERCONTROL_CONTROLTYPE_FADER; } else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_REVERB)) { - // reverb control + /* reverb control */ return MIXERCONTROL_CONTROLTYPE_FADER; } else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_SUPERMIX)) { - // supermix control - // MIXERCONTROL_CONTROLTYPE_MUTE if KSPROPERTY_AUDIO_MUTE is supported + /* supermix control + * MIXERCONTROL_CONTROLTYPE_MUTE if KSPROPERTY_AUDIO_MUTE is supported + */ UNIMPLEMENTED; return MIXERCONTROL_CONTROLTYPE_VOLUME; } - //TODO - //check for other supported node types + /* TODO + * check for other supported node types + */ //UNIMPLEMENTED return 0; } @@ -279,4 +281,3 @@ MMixerGetPinInstanceCount( ASSERT(Status == MM_STATUS_SUCCESS); return PinInstances.CurrentCount; } - diff --git a/lib/drivers/sound/mmixer/mixer.c b/lib/drivers/sound/mmixer/mixer.c index 4ef2ea9e62a..cd6b0a08a7d 100644 --- a/lib/drivers/sound/mmixer/mixer.c +++ b/lib/drivers/sound/mmixer/mixer.c @@ -17,16 +17,16 @@ MMixerGetCount( PMIXER_LIST MixerList; MIXER_STATUS Status; - // verify mixer context + /* verify mixer context */ Status = MMixerVerifyContext(MixerContext); if (Status != MM_STATUS_SUCCESS) { - // invalid context passed + /* invalid context passed */ return Status; } - // grab mixer list + /* grab mixer list */ MixerList = (PMIXER_LIST)MixerContext->MixerContext; // return number of mixers @@ -42,16 +42,16 @@ MMixerGetCapabilities( MIXER_STATUS Status; LPMIXER_INFO MixerInfo; - // verify mixer context + /* verify mixer context */ Status = MMixerVerifyContext(MixerContext); if (Status != MM_STATUS_SUCCESS) { - // invalid context passed + /* invalid context passed */ return Status; } - // get mixer info + /* get mixer info */ MixerInfo = MMixerGetMixerInfoByIndex(MixerContext, MixerIndex); if (!MixerInfo) @@ -76,36 +76,35 @@ MIXER_STATUS MMixerOpen( IN PMIXER_CONTEXT MixerContext, IN ULONG MixerId, - IN PVOID MixerEvent, + IN PVOID MixerEventContext, IN PMIXER_EVENT MixerEventRoutine, OUT PHANDLE MixerHandle) { MIXER_STATUS Status; LPMIXER_INFO MixerInfo; - // verify mixer context + /* verify mixer context */ Status = MMixerVerifyContext(MixerContext); if (Status != MM_STATUS_SUCCESS) { - // invalid context passed + /* invalid context passed */ return Status; } + /* get mixer info */ MixerInfo = (LPMIXER_INFO)MMixerGetMixerInfoByIndex(MixerContext, MixerId); if (!MixerInfo) { - // invalid mixer id + /* invalid mixer id */ return MM_STATUS_INVALID_PARAMETER; } - // FIXME - // handle event notification - - Status = MMixerAddEvents(MixerContext, MixerInfo); + /* add the event */ + Status = MMixerAddEvent(MixerContext, MixerInfo, MixerEventContext, MixerEventRoutine); - // store result + /* store result */ *MixerHandle = (HANDLE)MixerInfo; return MM_STATUS_SUCCESS; @@ -122,26 +121,26 @@ MMixerGetLineInfo( LPMIXER_INFO MixerInfo; LPMIXERLINE_EXT MixerLineSrc; - // verify mixer context + /* verify mixer context */ Status = MMixerVerifyContext(MixerContext); if (Status != MM_STATUS_SUCCESS) { - // invalid context passed + /* invalid context passed */ return Status; } - // clear hmixer from flags + /* clear hmixer from flags */ Flags &=~MIXER_OBJECTF_HMIXER; if (Flags == MIXER_GETLINEINFOF_DESTINATION) { - // cast to mixer info + /* cast to mixer info */ MixerInfo = (LPMIXER_INFO)MixerHandle; if (MixerLine->dwDestination != 0) { - // destination line member must be zero + /* destination line member must be zero */ return MM_STATUS_INVALID_PARAMETER; } @@ -153,7 +152,7 @@ MMixerGetLineInfo( } else if (Flags == MIXER_GETLINEINFOF_SOURCE) { - // cast to mixer info + /* cast to mixer info */ MixerInfo = (LPMIXER_INFO)MixerHandle; @@ -162,9 +161,9 @@ MMixerGetLineInfo( if (MixerLine->dwSource >= MixerLineSrc->Line.cConnections) { - DPRINT1("dwSource %u > Destinations %u\n", MixerLine->dwSource, MixerLineSrc->Line.cConnections); + DPRINT("dwSource %u > Destinations %u\n", MixerLine->dwSource, MixerLineSrc->Line.cConnections); - // invalid parameter + /* invalid parameter */ return MM_STATUS_INVALID_PARAMETER; } @@ -179,13 +178,13 @@ MMixerGetLineInfo( } else if (Flags == MIXER_GETLINEINFOF_LINEID) { - // cast to mixer info + /* cast to mixer info */ MixerInfo = (LPMIXER_INFO)MixerHandle; MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLine->dwLineID); if (!MixerLineSrc) { - // invalid parameter + /* invalid parameter */ return MM_STATUS_INVALID_PARAMETER; } @@ -195,7 +194,7 @@ MMixerGetLineInfo( } else if (Flags == MIXER_GETLINEINFOF_COMPONENTTYPE) { - // cast to mixer info + /* cast to mixer info */ MixerInfo = (LPMIXER_INFO)MixerHandle; MixerLineSrc = MMixerGetSourceMixerLineByComponentType(MixerInfo, MixerLine->dwComponentType); @@ -228,12 +227,12 @@ MMixerGetLineControls( MIXER_STATUS Status; ULONG Index; - // verify mixer context + /* verify mixer context */ Status = MMixerVerifyContext(MixerContext); if (Status != MM_STATUS_SUCCESS) { - // invalid context passed + /* invalid context passed */ return Status; } @@ -241,31 +240,31 @@ MMixerGetLineControls( if (Flags == MIXER_GETLINECONTROLSF_ALL) { - // cast to mixer info + /* cast to mixer info */ MixerInfo = (LPMIXER_INFO)MixerHandle; MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLineControls->dwLineID); if (!MixerLineSrc) { - // invalid line id + /* invalid line id */ return MM_STATUS_INVALID_PARAMETER; } - // copy line control(s) + /* copy line control(s) */ MixerContext->Copy(MixerLineControls->pamxctrl, MixerLineSrc->LineControls, min(MixerLineSrc->Line.cControls, MixerLineControls->cControls) * sizeof(MIXERCONTROLW)); return MM_STATUS_SUCCESS; } else if (Flags == MIXER_GETLINECONTROLSF_ONEBYTYPE) { - // cast to mixer info + /* cast to mixer info */ MixerInfo = (LPMIXER_INFO)MixerHandle; MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLineControls->dwLineID); if (!MixerLineSrc) { - // invalid line id + /* invalid line id */ return MM_STATUS_INVALID_PARAMETER; } @@ -277,7 +276,7 @@ MMixerGetLineControls( DPRINT("dwControlType %x\n", MixerLineSrc->LineControls[Index].dwControlType); if (MixerLineControls->dwControlType == MixerLineSrc->LineControls[Index].dwControlType) { - // found a control with that type + /* found a control with that type */ MixerContext->Copy(MixerLineControls->pamxctrl, &MixerLineSrc->LineControls[Index], sizeof(MIXERCONTROLW)); return MM_STATUS_SUCCESS; } @@ -287,18 +286,18 @@ MMixerGetLineControls( } else if (Flags == MIXER_GETLINECONTROLSF_ONEBYID) { - // cast to mixer info + /* cast to mixer info */ MixerInfo = (LPMIXER_INFO)MixerHandle; Status = MMixerGetMixerControlById(MixerInfo, MixerLineControls->dwControlID, NULL, &MixerControl, NULL); if (Status != MM_STATUS_SUCCESS) { - // invalid parameter + /* invalid parameter */ return MM_STATUS_INVALID_PARAMETER; } - // copy the controls + /* copy the controls */ MixerContext->Copy(MixerLineControls->pamxctrl, MixerControl, sizeof(MIXERCONTROLW)); return MM_STATUS_SUCCESS; } @@ -320,25 +319,25 @@ MMixerSetControlDetails( LPMIXERLINE_EXT MixerLine; LPMIXERCONTROLW MixerControl; - // verify mixer context + /* verify mixer context */ Status = MMixerVerifyContext(MixerContext); if (Status != MM_STATUS_SUCCESS) { - // invalid context passed + /* invalid context passed */ return Status; } - // get mixer info + /* get mixer info */ MixerInfo = (LPMIXER_INFO)MixerHandle; - // get mixer control + /* get mixer control */ Status = MMixerGetMixerControlById(MixerInfo, MixerControlDetails->dwControlID, &MixerLine, &MixerControl, &NodeId); - // check for success + /* check for success */ if (Status != MM_STATUS_SUCCESS) { - // failed to find control id + /* failed to find control id */ return MM_STATUS_INVALID_PARAMETER; } @@ -370,35 +369,35 @@ MMixerGetControlDetails( LPMIXERLINE_EXT MixerLine; LPMIXERCONTROLW MixerControl; - // verify mixer context + /* verify mixer context */ Status = MMixerVerifyContext(MixerContext); if (Status != MM_STATUS_SUCCESS) { - // invalid context passed + /* invalid context passed */ return Status; } - // get mixer info + /* get mixer info */ MixerInfo = (LPMIXER_INFO)MixerHandle; - // get mixer control + /* get mixer control */ Status = MMixerGetMixerControlById(MixerInfo, MixerControlDetails->dwControlID, &MixerLine, &MixerControl, &NodeId); - // check for success + /* check for success */ if (Status != MM_STATUS_SUCCESS) { - // failed to find control id + /* failed to find control id */ return MM_STATUS_INVALID_PARAMETER; } switch(MixerControl->dwControlType) { case MIXERCONTROL_CONTROLTYPE_MUTE: - Status = MMixerSetGetMuteControlDetails(MixerContext, MixerInfo->hMixer, NodeId, MixerLine->Line.dwLineID, MixerControlDetails, FALSE); + Status = MMixerSetGetMuteControlDetails(MixerContext, MixerInfo, NodeId, MixerLine->Line.dwLineID, MixerControlDetails, FALSE); break; case MIXERCONTROL_CONTROLTYPE_VOLUME: - Status = MMixerSetGetVolumeControlDetails(MixerContext, MixerInfo->hMixer, NodeId, FALSE, MixerControl, MixerControlDetails, MixerLine); + Status = MMixerSetGetVolumeControlDetails(MixerContext, MixerInfo, NodeId, FALSE, MixerControl, MixerControlDetails, MixerLine); break; default: Status = MM_STATUS_NOT_IMPLEMENTED; @@ -423,7 +422,7 @@ MMixerInitialize( if (!MixerContext || !EnumFunction || !EnumContext) { - // invalid parameter + /* invalid parameter */ return MM_STATUS_INVALID_PARAMETER; } @@ -431,19 +430,19 @@ MMixerInitialize( !MixerContext->AllocEventData || !MixerContext->FreeEventData || !MixerContext->Close || !MixerContext->OpenKey || !MixerContext->QueryKeyValue || !MixerContext->CloseKey) { - // invalid parameter + /* invalid parameter */ return MM_STATUS_INVALID_PARAMETER; } - // allocate a mixer list + /* allocate a mixer list */ MixerList = (PMIXER_LIST)MixerContext->Alloc(sizeof(MIXER_LIST)); if (!MixerList) { - // no memory + /* no memory */ return MM_STATUS_NO_MEMORY; } - //initialize mixer list + /* initialize mixer list */ MixerList->MixerListCount = 0; MixerList->MixerDataCount = 0; MixerList->WaveInListCount = 0; @@ -454,48 +453,49 @@ MMixerInitialize( InitializeListHead(&MixerList->WaveOutList); - // store mixer list + /* store mixer list */ MixerContext->MixerContext = (PVOID)MixerList; - // start enumerating all available devices + /* start enumerating all available devices */ Count = 0; DeviceIndex = 0; do { - // enumerate a device + /* enumerate a device */ Status = EnumFunction(EnumContext, DeviceIndex, &DeviceName, &hMixer, &hKey); if (Status != MM_STATUS_SUCCESS) { - //check error code + /* check error code */ if (Status == MM_STATUS_NO_MORE_DEVICES) { - // enumeration has finished + /* enumeration has finished */ break; } else { DPRINT1("Failed to enumerate device %lu\n", DeviceIndex); - // TODO cleanup + /* TODO cleanup */ return Status; } } else { - // create a mixer data entry + /* create a mixer data entry */ Status = MMixerCreateMixerData(MixerContext, MixerList, DeviceIndex, DeviceName, hMixer, hKey); if (Status != MM_STATUS_SUCCESS) break; } - // increment device index + /* increment device index */ DeviceIndex++; }while(TRUE); - //now all filters have been pre-opened - // lets enumerate the filters + /* now all filters have been pre-opened + * lets enumerate the filters + */ Entry = MixerList->MixerData.Flink; while(Entry != &MixerList->MixerData) { @@ -504,6 +504,6 @@ MMixerInitialize( Entry = Entry->Flink; } - // done + /* done */ return MM_STATUS_SUCCESS; } diff --git a/lib/drivers/sound/mmixer/mmixer.h b/lib/drivers/sound/mmixer/mmixer.h index 0cfc4acdc07..c7abbb69a52 100644 --- a/lib/drivers/sound/mmixer/mmixer.h +++ b/lib/drivers/sound/mmixer/mmixer.h @@ -48,7 +48,10 @@ typedef MIXER_STATUS(*PMIXER_CLOSEKEY)( IN HANDLE hKey); typedef VOID (*PMIXER_EVENT)( - IN PVOID MixerEvent); + IN PVOID MixerEventContext, + IN HANDLE hMixer, + IN ULONG NotificationType, + IN ULONG Value); typedef VOID (*PMIXER_COPY)( IN PVOID Dst, @@ -130,7 +133,7 @@ MIXER_STATUS MMixerOpen( IN PMIXER_CONTEXT MixerContext, IN ULONG MixerId, - IN PVOID MixerEvent, + IN PVOID MixerEventContext, IN PMIXER_EVENT MixerEventRoutine, OUT PHANDLE MixerHandle); diff --git a/lib/drivers/sound/mmixer/priv.h b/lib/drivers/sound/mmixer/priv.h index 1580c8a99a6..b854c2e70c2 100644 --- a/lib/drivers/sound/mmixer/priv.h +++ b/lib/drivers/sound/mmixer/priv.h @@ -17,11 +17,56 @@ #define YDEBUG #include +typedef struct __TOPOLOGY_NODE__ +{ + GUID NodeType; + ULONG NodeIndex; + + ULONG NodeConnectedToCount; + struct __TOPOLOGY_NODE__ ** NodeConnectedTo; + + ULONG NodeConnectedFromCount; + struct __TOPOLOGY_NODE__ ** NodeConnectedFrom; + + ULONG PinConnectedFromCount; + PULONG PinConnectedFrom; + + ULONG PinConnectedToCount; + PULONG PinConnectedTo; + + ULONG Visited; + ULONG Reserved; +}TOPOLOGY_NODE, *PTOPOLOGY_NODE; + typedef struct { - KSEVENTDATA EventData; - LIST_ENTRY Entry; -}EVENT_ITEM, *LPEVENT_ITEM; + ULONG PinId; + + ULONG NodesConnectedToCount; + PTOPOLOGY_NODE * NodesConnectedTo; + + ULONG NodesConnectedFromCount; + PTOPOLOGY_NODE * NodesConnectedFrom; + + ULONG PinConnectedFromCount; + PULONG PinConnectedFrom; + + ULONG PinConnectedToCount; + PULONG PinConnectedTo; + + ULONG Visited; +}PIN, *PPIN; + + +typedef struct +{ + ULONG TopologyPinsCount; + PPIN TopologyPins; + + ULONG TopologyNodesCount; + PTOPOLOGY_NODE TopologyNodes; + +}TOPOLOGY, *PTOPOLOGY; typedef struct { @@ -68,6 +113,7 @@ typedef struct HANDLE hDevice; HANDLE hDeviceInterfaceKey; LPWSTR DeviceName; + PTOPOLOGY Topology; }MIXER_DATA, *LPMIXER_DATA; typedef struct @@ -94,6 +140,14 @@ typedef struct LIST_ENTRY WaveOutList; }MIXER_LIST, *PMIXER_LIST; +typedef struct +{ + LIST_ENTRY Entry; + PVOID MixerEventContext; + PMIXER_EVENT MixerEventRoutine; + +}EVENT_NOTIFICATION_ENTRY, *PEVENT_NOTIFICATION_ENTRY; + #define DESTINATION_LINE 0xFFFF0000 ULONG @@ -215,7 +269,7 @@ MMixerGetMixerControlById( MIXER_STATUS MMixerSetGetMuteControlDetails( IN PMIXER_CONTEXT MixerContext, - IN HANDLE hMixer, + IN LPMIXER_INFO MixerInfo, IN ULONG NodeId, IN ULONG dwLineID, IN LPMIXERCONTROLDETAILS MixerControlDetails, @@ -224,7 +278,7 @@ MMixerSetGetMuteControlDetails( MIXER_STATUS MMixerSetGetVolumeControlDetails( IN PMIXER_CONTEXT MixerContext, - IN HANDLE hMixer, + IN LPMIXER_INFO MixerInfo, IN ULONG NodeId, IN ULONG bSet, LPMIXERCONTROLW MixerControl, @@ -273,9 +327,124 @@ MMixerInitializeWaveInfo( IN LPMIXER_DATA MixerData, IN LPWSTR DeviceName, IN ULONG bWaveIn, - IN ULONG PinId); + IN ULONG PinCount, + IN PULONG Pins); MIXER_STATUS -MMixerAddEvents( +MMixerAddEvent( IN PMIXER_CONTEXT MixerContext, - IN OUT LPMIXER_INFO MixerInfo); + IN OUT LPMIXER_INFO MixerInfo, + IN PVOID MixerEvent, + IN PMIXER_EVENT MixerEventRoutine); + +/* topology.c */ + +MIXER_STATUS +MMixerCreateTopology( + IN PMIXER_CONTEXT MixerContext, + IN ULONG PinCount, + IN PKSMULTIPLE_ITEM NodeConnections, + IN PKSMULTIPLE_ITEM NodeTypes, + OUT PTOPOLOGY *OutTopology); + +VOID +MMixerGetAllUpOrDownstreamPinsFromNodeIndex( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG NodeIndex, + IN ULONG bUpStream, + OUT PULONG OutPinsCount, + OUT PULONG OutPins); + +MIXER_STATUS +MMixerGetAllUpOrDownstreamPinsFromPinIndex( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG PinIndex, + IN ULONG bUpStream, + OUT PULONG OutPinsCount, + OUT PULONG OutPins); + +VOID +MMixerGetNextNodesFromPinIndex( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG PinIndex, + IN ULONG bUpStream, + OUT PULONG OutNodesCount, + OUT PULONG OutNodes); + +MIXER_STATUS +MMixerAllocateTopologyPinArray( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + OUT PULONG * OutPins); + +MIXER_STATUS +MMixerAllocateTopologyNodeArray( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + OUT PULONG * OutPins); + +VOID +MMixerGetAllUpOrDownstreamNodesFromPinIndex( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG PinIndex, + IN ULONG bUpStream, + OUT PULONG OutNodesCount, + OUT PULONG OutNodes); + +VOID +MMixerIsNodeTerminator( + IN PTOPOLOGY Topology, + IN ULONG NodeIndex, + OUT ULONG * bTerminator); + +VOID +MMixerGetNextNodesFromNodeIndex( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG NodeIndex, + IN ULONG bUpStream, + OUT PULONG OutNodesCount, + OUT PULONG OutNodes); + +LPGUID +MMixerGetNodeTypeFromTopology( + IN PTOPOLOGY Topology, + IN ULONG NodeIndex); + +MIXER_STATUS +MMixerGetAllUpOrDownstreamNodesFromNodeIndex( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG NodeIndex, + IN ULONG bUpStream, + OUT PULONG OutNodesCount, + OUT PULONG OutNodes); + +MIXER_STATUS +MMixerIsNodeConnectedToPin( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG NodeIndex, + IN ULONG PinId, + IN ULONG bUpStream, + OUT PULONG bConnected); + +ULONG +MMixerGetNodeIndexFromGuid( + IN PTOPOLOGY Topology, + IN const GUID *NodeType); + +VOID +MMixerSetTopologyNodeReserved( + IN PTOPOLOGY Topology, + IN ULONG NodeIndex); + +VOID +MMixerIsTopologyNodeReserved( + IN PTOPOLOGY Topology, + IN ULONG NodeIndex, + OUT PULONG bReserved); diff --git a/lib/drivers/sound/mmixer/sup.c b/lib/drivers/sound/mmixer/sup.c index e864d1db01d..a557cf97465 100644 --- a/lib/drivers/sound/mmixer/sup.c +++ b/lib/drivers/sound/mmixer/sup.c @@ -54,9 +54,10 @@ MMixerFreeMixerInfo( IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo) { - //UNIMPLEMENTED - // FIXME - // free all lines + /* UNIMPLEMENTED + * FIXME + * free all lines + */ MixerContext->Free((PVOID)MixerInfo); } @@ -71,7 +72,7 @@ MMixerGetMixerInfoByIndex( PMIXER_LIST MixerList; ULONG Index = 0; - // get mixer list + /* get mixer list */ MixerList = (PMIXER_LIST)MixerContext->MixerContext; if (!MixerList->MixerListCount) @@ -86,7 +87,7 @@ MMixerGetMixerInfoByIndex( if (Index == MixerIndex) return MixerInfo; - // move to next mixer entry + /* move to next mixer entry */ Index++; Entry = Entry->Flink; } @@ -141,42 +142,6 @@ MMixerGetSourceMixerLineByLineId( return NULL; } -ULONG -MMixerGetIndexOfGuid( - PKSMULTIPLE_ITEM MultipleItem, - LPCGUID NodeType) -{ - ULONG Index; - LPGUID Guid; - - Guid = (LPGUID)(MultipleItem+1); - - /* iterate through node type array */ - for(Index = 0; Index < MultipleItem->Count; Index++) - { - if (IsEqualGUIDAligned(NodeType, Guid)) - { - /* found matching guid */ - return Index; - } - Guid++; - } - return MAXULONG; -} - -PKSTOPOLOGY_CONNECTION -MMixerGetConnectionByIndex( - IN PKSMULTIPLE_ITEM MultipleItem, - IN ULONG Index) -{ - PKSTOPOLOGY_CONNECTION Descriptor; - - ASSERT(Index < MultipleItem->Count); - - Descriptor = (PKSTOPOLOGY_CONNECTION)(MultipleItem + 1); - return &Descriptor[Index]; -} - LPGUID MMixerGetNodeType( IN PKSMULTIPLE_ITEM MultipleItem, @@ -190,183 +155,6 @@ MMixerGetNodeType( return &NodeType[Index]; } -MIXER_STATUS -MMixerGetNodeIndexes( - IN PMIXER_CONTEXT MixerContext, - IN PKSMULTIPLE_ITEM MultipleItem, - IN ULONG NodeIndex, - IN ULONG bNode, - IN ULONG bFrom, - OUT PULONG NodeReferenceCount, - OUT PULONG *NodeReference) -{ - ULONG Index, Count = 0; - PKSTOPOLOGY_CONNECTION Connection; - PULONG Refs; - - // KSMULTIPLE_ITEM is followed by several KSTOPOLOGY_CONNECTION - Connection = (PKSTOPOLOGY_CONNECTION)(MultipleItem + 1); - - // first count all referenced nodes - for(Index = 0; Index < MultipleItem->Count; Index++) - { - if (bNode) - { - if (bFrom) - { - if (Connection->FromNode == NodeIndex) - { - // node id has a connection - Count++; - } - } - else - { - if (Connection->ToNode == NodeIndex) - { - // node id has a connection - Count++; - } - } - } - else - { - if (bFrom) - { - if (Connection->FromNodePin == NodeIndex && Connection->FromNode == KSFILTER_NODE) - { - // node id has a connection - Count++; - } - } - else - { - if (Connection->ToNodePin == NodeIndex && Connection->ToNode == KSFILTER_NODE) - { - // node id has a connection - Count++; - } - } - } - - - // move to next connection - Connection++; - } - - if (!Count) - { - *NodeReferenceCount = 0; - *NodeReference = NULL; - return MM_STATUS_SUCCESS; - } - - ASSERT(Count != 0); - - /* now allocate node index array */ - Refs = (PULONG)MixerContext->Alloc(sizeof(ULONG) * Count); - if (!Refs) - { - // not enough memory - return MM_STATUS_NO_MEMORY; - } - - Count = 0; - Connection = (PKSTOPOLOGY_CONNECTION)(MultipleItem + 1); - for(Index = 0; Index < MultipleItem->Count; Index++) - { - if (bNode) - { - if (bFrom) - { - if (Connection->FromNode == NodeIndex) - { - /* node id has a connection */ - Refs[Count] = Index; - Count++; - } - } - else - { - if (Connection->ToNode == NodeIndex) - { - /* node id has a connection */ - Refs[Count] = Index; - Count++; - } - } - } - else - { - if (bFrom) - { - if (Connection->FromNodePin == NodeIndex && Connection->FromNode == KSFILTER_NODE) - { - /* node id has a connection */ - Refs[Count] = Index; - Count++; - } - } - else - { - if (Connection->ToNodePin == NodeIndex && Connection->ToNode == KSFILTER_NODE) - { - /* node id has a connection */ - Refs[Count] = Index; - Count++; - } - } - } - - /* move to next connection */ - Connection++; - } - - /* store result */ - *NodeReference = Refs; - *NodeReferenceCount = Count; - - return MM_STATUS_SUCCESS; -} - -MIXER_STATUS -MMixerGetTargetPins( - IN PMIXER_CONTEXT MixerContext, - IN PKSMULTIPLE_ITEM NodeTypes, - IN PKSMULTIPLE_ITEM NodeConnections, - IN ULONG NodeIndex, - IN ULONG bUpDirection, - OUT PULONG Pins, - IN ULONG PinCount) -{ - ULONG NodeConnectionCount, Index; - MIXER_STATUS Status; - PULONG NodeConnection; - - // sanity check */ - ASSERT(NodeIndex != (ULONG)-1); - - /* get all node indexes referenced by that pin */ - if (bUpDirection) - Status = MMixerGetNodeIndexes(MixerContext, NodeConnections, NodeIndex, TRUE, FALSE, &NodeConnectionCount, &NodeConnection); - else - Status = MMixerGetNodeIndexes(MixerContext, NodeConnections, NodeIndex, TRUE, TRUE, &NodeConnectionCount, &NodeConnection); - - //DPRINT("NodeIndex %u Status %x Count %u\n", NodeIndex, Status, NodeConnectionCount); - - if (Status == MM_STATUS_SUCCESS) - { - for(Index = 0; Index < NodeConnectionCount; Index++) - { - Status = MMixerGetTargetPinsByNodeConnectionIndex(MixerContext, NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], PinCount, Pins); - ASSERT(Status == STATUS_SUCCESS); - } - MixerContext->Free((PVOID)NodeConnection); - } - - return Status; -} - LPMIXERLINE_EXT MMixerGetSourceMixerLineByComponentType( LPMIXER_INFO MixerInfo, @@ -445,10 +233,38 @@ MMixerGetVolumeControlIndex( return VolumeData->InputSteppingDelta * (VolumeData->ValuesCount-1); } +VOID +MMixerNotifyControlChange( + IN PMIXER_CONTEXT MixerContext, + IN LPMIXER_INFO MixerInfo, + IN ULONG NotificationType, + IN ULONG Value) +{ + PLIST_ENTRY Entry; + PEVENT_NOTIFICATION_ENTRY NotificationEntry; + + /* enumerate list and add a notification entry */ + Entry = MixerInfo->LineList.Flink; + while(Entry != &MixerInfo->EventList) + { + /* get notification entry offset */ + NotificationEntry = (PEVENT_NOTIFICATION_ENTRY)CONTAINING_RECORD(Entry, EVENT_NOTIFICATION_ENTRY, Entry); + + if (NotificationEntry->MixerEventRoutine) + { + /* now perform the callback */ + NotificationEntry->MixerEventRoutine(NotificationEntry->MixerEventContext, (HANDLE)MixerInfo, NotificationType, Value); + } + + /* move to next notification entry */ + Entry = Entry->Flink; + } +} + MIXER_STATUS MMixerSetGetMuteControlDetails( IN PMIXER_CONTEXT MixerContext, - IN HANDLE hMixer, + IN LPMIXER_INFO MixerInfo, IN ULONG NodeId, IN ULONG dwLineID, IN LPMIXERCONTROLDETAILS MixerControlDetails, @@ -469,7 +285,7 @@ MMixerSetGetMuteControlDetails( Value = Input->fValue; /* set control details */ - Status = MMixerSetGetControlDetails(MixerContext, hMixer, NodeId, bSet, KSPROPERTY_AUDIO_MUTE, 0, &Value); + Status = MMixerSetGetControlDetails(MixerContext, MixerInfo->hMixer, NodeId, bSet, KSPROPERTY_AUDIO_MUTE, 0, &Value); if (Status != MM_STATUS_SUCCESS) return Status; @@ -482,7 +298,8 @@ MMixerSetGetMuteControlDetails( } else { - // FIXME notify wdmaud clients MM_MIXM_LINE_CHANGE dwLineID + /* notify wdmaud clients MM_MIXM_LINE_CHANGE dwLineID */ + MMixerNotifyControlChange(MixerContext, MixerInfo, MM_MIXM_LINE_CHANGE, dwLineID); } return Status; @@ -491,7 +308,7 @@ MMixerSetGetMuteControlDetails( MIXER_STATUS MMixerSetGetVolumeControlDetails( IN PMIXER_CONTEXT MixerContext, - IN HANDLE hMixer, + IN LPMIXER_INFO MixerInfo, IN ULONG NodeId, IN ULONG bSet, LPMIXERCONTROLW MixerControl, @@ -534,12 +351,12 @@ MMixerSetGetVolumeControlDetails( if (bSet) { /* TODO */ - Status = MMixerSetGetControlDetails(MixerContext, hMixer, NodeId, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, 0, &Value); - Status = MMixerSetGetControlDetails(MixerContext, hMixer, NodeId, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, 1, &Value); + Status = MMixerSetGetControlDetails(MixerContext, MixerInfo->hMixer, NodeId, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, 0, &Value); + Status = MMixerSetGetControlDetails(MixerContext, MixerInfo->hMixer, NodeId, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, 1, &Value); } else { - Status = MMixerSetGetControlDetails(MixerContext, hMixer, NodeId, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, Channel, &Value); + Status = MMixerSetGetControlDetails(MixerContext, MixerInfo->hMixer, NodeId, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, Channel, &Value); } if (!bSet) @@ -551,6 +368,7 @@ MMixerSetGetVolumeControlDetails( else { /* notify clients of a line change MM_MIXM_CONTROL_CHANGE with MixerControl->dwControlID */ + MMixerNotifyControlChange(MixerContext, MixerInfo, MM_MIXM_CONTROL_CHANGE, MixerControl->dwControlID); } return Status; } @@ -590,7 +408,7 @@ MMixerGetDataByDeviceName( MixerData = (LPMIXER_DATA)CONTAINING_RECORD(Entry, MIXER_DATA, Entry); if (wcsicmp(&DeviceName[2], &MixerData->DeviceName[2]) == 0) { - // found entry + /* found entry */ return MixerData; } Entry = Entry->Flink; @@ -617,6 +435,7 @@ MMixerCreateMixerData( MixerData->DeviceName = DeviceName; MixerData->hDevice = hDevice; MixerData->hDeviceInterfaceKey = hKey; + MixerData->Topology = NULL; InsertTailList(&MixerList->MixerData, &MixerData->Entry); MixerList->MixerDataCount++; @@ -638,16 +457,16 @@ MMixerGetDeviceName( Status = MixerContext->QueryKeyValue(hKey, L"FriendlyName", (PVOID*)&Name, &Length, &Type); if (Status == MM_STATUS_SUCCESS) { - // copy device name + /* copy device name */ MixerContext->Copy(MixerInfo->MixCaps.szPname, Name, min(wcslen(Name), MAXPNAMELEN-1) * sizeof(WCHAR)); - // make sure its null terminated + /* make sure its null terminated */ MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] = L'\0'; - // free device name + /* free device name */ MixerContext->Free(Name); - // done + /* done */ return Status; } @@ -658,13 +477,13 @@ MMixerGetDeviceName( Status = MixerContext->QueryKeyValue(hKey, L"FriendlyName", (PVOID*)&Name, &Length, &Type); if (Status == MM_STATUS_SUCCESS) { - // copy device name + /* copy device name */ MixerContext->Copy(MixerInfo->MixCaps.szPname, Name, min(wcslen(Name), MAXPNAMELEN-1) * sizeof(WCHAR)); - // make sure its null terminated + /* make sure its null terminated */ MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] = L'\0'; - // free device name + /* free device name */ MixerContext->Free(Name); } diff --git a/lib/drivers/sound/mmixer/topology.c b/lib/drivers/sound/mmixer/topology.c new file mode 100644 index 00000000000..6113d1b9cfd --- /dev/null +++ b/lib/drivers/sound/mmixer/topology.c @@ -0,0 +1,1212 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Kernel Streaming + * FILE: lib/drivers/sound/mmixer/topology.c + * PURPOSE: Topology Handling Functions + * PROGRAMMER: Johannes Anderwald + */ + +#include "priv.h" + +VOID +MMixerPrintTopology( + PTOPOLOGY Topology) +{ + ULONG Index, SubIndex; + + DPRINT1("Num Pins %lu NumNodes %lu\n", Topology->TopologyPinsCount, Topology->TopologyNodesCount); + + for(Index = 0; Index < Topology->TopologyPinsCount; Index++) + { + DPRINT1("PinId %lu NodesConnectedFromCount %lu NodesConnectedToCount %lu Visited %lu\n", Topology->TopologyPins[Index].PinId, + Topology->TopologyPins[Index].NodesConnectedFromCount, Topology->TopologyPins[Index].NodesConnectedToCount, Topology->TopologyPins[Index].Visited); + + for(SubIndex = 0; SubIndex < Topology->TopologyPins[Index].NodesConnectedFromCount; SubIndex++) + DPRINT1("NodesConnectedFrom Index %lu NodeId %lu\n", SubIndex, Topology->TopologyPins[Index].NodesConnectedFrom[SubIndex]->NodeIndex); + + for(SubIndex = 0; SubIndex < Topology->TopologyPins[Index].NodesConnectedToCount; SubIndex++) + DPRINT1("NodesConnectedTo Index %lu NodeId %lu\n", SubIndex, Topology->TopologyPins[Index].NodesConnectedTo[SubIndex]->NodeIndex); + } + + for(Index = 0; Index < Topology->TopologyNodesCount; Index++) + { + DPRINT1("NodeId %lu NodesConnectedFromCount %lu NodesConnectedToCount %lu Visited %lu PinConnectedFromCount %lu PinConnectedToCount %lu\n", Topology->TopologyNodes[Index].NodeIndex, + Topology->TopologyNodes[Index].NodeConnectedFromCount, Topology->TopologyNodes[Index].NodeConnectedToCount, Topology->TopologyNodes[Index].Visited, + Topology->TopologyNodes[Index].PinConnectedFromCount, Topology->TopologyNodes[Index].PinConnectedToCount); + } + + +} + + +MIXER_STATUS +MMixerAllocateTopology( + IN PMIXER_CONTEXT MixerContext, + IN ULONG NodesCount, + IN ULONG PinCount, + OUT PTOPOLOGY * OutTopology) +{ + PTOPOLOGY Topology; + + /* allocate topology */ + Topology = (PTOPOLOGY)MixerContext->Alloc(sizeof(TOPOLOGY)); + + if (!Topology) + { + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + + /* allocate topology pins */ + Topology->TopologyPins = (PPIN) MixerContext->Alloc(sizeof(PIN) * PinCount); + + if (!Topology->TopologyPins) + { + /* release memory */ + MixerContext->Free(Topology); + + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + + /* allocate topology nodes */ + if (NodesCount) + { + Topology->TopologyNodes = (PTOPOLOGY_NODE) MixerContext->Alloc(sizeof(TOPOLOGY_NODE) * NodesCount); + + if (!Topology->TopologyNodes) + { + /* release memory */ + MixerContext->Free(Topology->TopologyPins); + MixerContext->Free(Topology); + + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + } + + /* initialize topology */ + Topology->TopologyPinsCount = PinCount; + Topology->TopologyNodesCount = NodesCount; + + /* store result */ + *OutTopology = Topology; + + /* done */ + return MM_STATUS_SUCCESS; +} + +VOID +MMixerResetTopologyVisitStatus( + IN OUT PTOPOLOGY Topology) +{ + ULONG Index; + + for(Index = 0; Index < Topology->TopologyNodesCount; Index++) + { + /* reset visited status */ + Topology->TopologyNodes[Index].Visited = FALSE; + } + + for(Index = 0; Index < Topology->TopologyPinsCount; Index++) + { + /* reset visited status */ + Topology->TopologyPins[Index].Visited = FALSE; + } +} + +VOID +MMixerInitializeTopologyNodes( + IN PMIXER_CONTEXT MixerContext, + IN PKSMULTIPLE_ITEM NodeTypes, + IN OUT PTOPOLOGY Topology) +{ + ULONG Index; + LPGUID Guids; + + /* sanity check */ + ASSERT(Topology->TopologyNodesCount == NodeTypes->Count); + + /* get topology node types */ + Guids = (LPGUID)(NodeTypes + 1); + + for(Index = 0; Index < Topology->TopologyNodesCount; Index++) + { + /* store node connection index */ + Topology->TopologyNodes[Index].NodeIndex = Index; + + /* store topology node type */ + MixerContext->Copy(&Topology->TopologyNodes[Index].NodeType, &Guids[Index], sizeof(GUID)); + } +} + +MIXER_STATUS +MMixerAddPinConnection( + IN PMIXER_CONTEXT MixerContext, + IN PPIN Pin, + IN PTOPOLOGY_NODE Node, + IN ULONG bPinToNode) +{ + ULONG Count; + PULONG NewPinsIndex, OldPinsIndex; + PTOPOLOGY_NODE * NewNodes, *OldNodes; + + if (bPinToNode) + { + /* get existing count */ + Count = Pin->NodesConnectedToCount; + OldNodes = Pin->NodesConnectedTo; + } + else + { + /* get existing count */ + Count = Pin->NodesConnectedFromCount; + OldNodes = Pin->NodesConnectedFrom; + } + + /* allocate new nodes array */ + NewNodes = MixerContext->Alloc(sizeof(PTOPOLOGY_NODE) * (Count + 1)); + + if (!NewNodes) + { + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + + if (Count) + { + /* copy existing nodes */ + MixerContext->Copy(NewNodes, OldNodes, sizeof(PTOPOLOGY) * Count); + + /* release old nodes array */ + MixerContext->Free(OldNodes); + } + + /* add new topology node */ + NewNodes[Count] = Node; + + if (bPinToNode) + { + /* replace old nodes array */ + Pin->NodesConnectedTo = NewNodes; + + /* increment nodes count */ + Pin->NodesConnectedToCount++; + + /* now enlarge PinConnectedFromCount*/ + Count = Node->PinConnectedFromCount; + + /* connected pin count for node */ + OldPinsIndex = Node->PinConnectedFrom; + } + else + { + /* replace old nodes array */ + Pin->NodesConnectedFrom = NewNodes; + + /* increment nodes count */ + Pin->NodesConnectedFromCount++; + + /* now enlarge PinConnectedFromCount*/ + Count = Node->PinConnectedToCount; + + /* connected pin count for node */ + OldPinsIndex = Node->PinConnectedTo; + } + + /* allocate pin connection index */ + NewPinsIndex = MixerContext->Alloc(sizeof(ULONG) * (Count + 1)); + + if (!NewPinsIndex) + { + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + + if (Count) + { + /* copy existing nodes */ + MixerContext->Copy(NewPinsIndex, OldPinsIndex, sizeof(ULONG) * Count); + + /* release old nodes array */ + MixerContext->Free(OldPinsIndex); + } + + /* add new topology node */ + NewPinsIndex[Count] = Pin->PinId; + + if (bPinToNode) + { + /* replace old nodes array */ + Node->PinConnectedFrom = NewPinsIndex; + + /* increment pin count */ + Node->PinConnectedFromCount++; + } + else + { + /* replace old nodes array */ + Node->PinConnectedTo = NewPinsIndex; + + /* increment pin count */ + Node->PinConnectedToCount++; + } + + /* done */ + return MM_STATUS_SUCCESS; +} + +MIXER_STATUS +MMixerHandleNodeToNodeConnection( + IN PMIXER_CONTEXT MixerContext, + IN PKSTOPOLOGY_CONNECTION Connection, + IN OUT PTOPOLOGY Topology) +{ + PTOPOLOGY_NODE InNode, OutNode; + PTOPOLOGY_NODE * NewNodes; + ULONG Count; + + /* sanity checks */ + ASSERT(Topology->TopologyNodesCount > Connection->ToNode); + ASSERT(Topology->TopologyNodesCount > Connection->FromNode); + + /* get node */ + InNode = &Topology->TopologyNodes[Connection->FromNode]; + OutNode = &Topology->TopologyNodes[Connection->ToNode]; + + /* get existing count */ + Count = OutNode->NodeConnectedFromCount; + + /* allocate new nodes array */ + NewNodes = MixerContext->Alloc(sizeof(PTOPOLOGY_NODE) * (Count + 1)); + + if (!NewNodes) + { + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + + if (Count) + { + /* copy existing nodes */ + MixerContext->Copy(NewNodes, OutNode->NodeConnectedFrom, sizeof(PTOPOLOGY) * Count); + + /* release old nodes array */ + MixerContext->Free(OutNode->NodeConnectedFrom); + } + + /* add new topology node */ + NewNodes[OutNode->NodeConnectedFromCount] = InNode; + + /* replace old nodes array */ + OutNode->NodeConnectedFrom = NewNodes; + + /* increment nodes count */ + OutNode->NodeConnectedFromCount++; + + /* get existing count */ + Count = InNode->NodeConnectedToCount; + + /* allocate new nodes array */ + NewNodes = MixerContext->Alloc(sizeof(PTOPOLOGY_NODE) * (Count + 1)); + + if (!NewNodes) + { + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + + if (Count) + { + /* copy existing nodes */ + MixerContext->Copy(NewNodes, InNode->NodeConnectedTo, sizeof(PTOPOLOGY) * Count); + + /* release old nodes array */ + MixerContext->Free(InNode->NodeConnectedTo); + } + + /* add new topology node */ + NewNodes[InNode->NodeConnectedToCount] = OutNode; + + /* replace old nodes array */ + InNode->NodeConnectedTo = NewNodes; + + /* increment nodes count */ + InNode->NodeConnectedToCount++; + + /* done */ + return MM_STATUS_SUCCESS; +} + +MIXER_STATUS +MMixerAddPinToPinConnection( + IN PMIXER_CONTEXT MixerContext, + IN OUT PPIN InPin, + IN OUT PPIN OutPin) +{ + ULONG Count; + PULONG NewPinsIndex; + + /* now enlarge PinConnectedTo */ + Count = InPin->PinConnectedToCount; + + /* allocate pin connection index */ + NewPinsIndex = MixerContext->Alloc(sizeof(ULONG) * (Count + 1)); + + if (!NewPinsIndex) + { + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + + if (Count) + { + /* copy existing nodes */ + MixerContext->Copy(NewPinsIndex, InPin->PinConnectedTo, sizeof(ULONG) * Count); + + /* release old nodes array */ + MixerContext->Free(InPin->PinConnectedTo); + } + + /* add new topology node */ + NewPinsIndex[Count] = OutPin->PinId; + + /* replace old nodes array */ + InPin->PinConnectedTo = NewPinsIndex; + + /* increment pin count */ + InPin->PinConnectedToCount++; + + /* now enlarge PinConnectedFrom */ + Count = OutPin->PinConnectedFromCount; + + /* allocate pin connection index */ + NewPinsIndex = MixerContext->Alloc(sizeof(ULONG) * (Count + 1)); + + if (!NewPinsIndex) + { + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + + if (Count) + { + /* copy existing nodes */ + MixerContext->Copy(NewPinsIndex, OutPin->PinConnectedFrom, sizeof(ULONG) * Count); + + /* release old nodes array */ + MixerContext->Free(OutPin->PinConnectedFrom); + } + + /* add new topology node */ + NewPinsIndex[Count] = InPin->PinId; + + /* replace old nodes array */ + OutPin->PinConnectedFrom = NewPinsIndex; + + /* increment pin count */ + OutPin->PinConnectedFromCount++; + + /* done */ + return MM_STATUS_SUCCESS; +} + +MIXER_STATUS +MMixerHandleNodePinConnection( + IN PMIXER_CONTEXT MixerContext, + IN PKSTOPOLOGY_CONNECTION Connection, + IN OUT PTOPOLOGY Topology) +{ + PPIN Pin; + PTOPOLOGY_NODE Node; + + /* check type */ + if (Connection->FromNode == KSFILTER_NODE && + Connection->ToNode == KSFILTER_NODE) + { + /* Pin -> Pin direction */ + + /* sanity checks */ + ASSERT(Topology->TopologyPinsCount > Connection->FromNodePin); + ASSERT(Topology->TopologyPinsCount > Connection->ToNodePin); + + /* add connection */ + return MMixerAddPinToPinConnection(MixerContext, + &Topology->TopologyPins[Connection->FromNodePin], + &Topology->TopologyPins[Connection->ToNodePin]); + + } + else if (Connection->FromNode == KSFILTER_NODE) + { + /* Pin -> Node direction */ + + /* sanity checks */ + ASSERT(Topology->TopologyPinsCount > Connection->FromNodePin); + ASSERT(Topology->TopologyNodesCount > Connection->ToNode); + ASSERT(Connection->ToNode != KSFILTER_NODE); + + /* get pin */ + Pin = &Topology->TopologyPins[Connection->FromNodePin]; + + /* get node */ + Node = &Topology->TopologyNodes[Connection->ToNode]; + + /* initialize pin */ + Pin->PinId = Connection->FromNodePin; + + /* mark as visited */ + Pin->Visited = TRUE; + Node->Visited = TRUE; + + /* add connection */ + return MMixerAddPinConnection(MixerContext, Pin, Node, TRUE); + } + else if (Connection->ToNode == KSFILTER_NODE) + { + /* Node -> Pin direction */ + + /* sanity checks */ + ASSERT(Topology->TopologyPinsCount > Connection->ToNodePin); + ASSERT(Topology->TopologyNodesCount > Connection->FromNode); + ASSERT(Connection->FromNode != KSFILTER_NODE); + + /* get pin */ + Pin = &Topology->TopologyPins[Connection->ToNodePin]; + + /* get node */ + Node = &Topology->TopologyNodes[Connection->FromNode]; + + /* initialize pin */ + Pin->PinId = Connection->ToNodePin; + + /* mark as visited */ + Pin->Visited = TRUE; + Node->Visited = TRUE; + + /* add connection */ + return MMixerAddPinConnection(MixerContext, Pin, Node, FALSE); + } + /* invalid call */ + ASSERT(0); + return MM_STATUS_INVALID_PARAMETER; +} + +MIXER_STATUS +MMixerExploreTopology( + IN PMIXER_CONTEXT MixerContext, + IN PKSMULTIPLE_ITEM NodeConnections, + IN PKSMULTIPLE_ITEM NodeTypes, + IN OUT PTOPOLOGY Topology) +{ + ULONG Index; + LPGUID Guids; + PKSTOPOLOGY_CONNECTION Connection; + MIXER_STATUS Status; + + /* sanity check */ + ASSERT(Topology->TopologyNodesCount == NodeTypes->Count); + + /* get topology node types */ + Guids = (LPGUID)(NodeTypes + 1); + + /* get node connections */ + Connection = (PKSTOPOLOGY_CONNECTION)(NodeConnections + 1); + + for(Index = 0; Index < NodeConnections->Count; Index++) + { + if (Connection[Index].FromNode == KSFILTER_NODE || + Connection[Index].ToNode == KSFILTER_NODE) + { + /* handle connection from Pin -> Node / Node->Pin */ + Status = MMixerHandleNodePinConnection(MixerContext, + &Connection[Index], + Topology); + + } + else + { + /* handle connection from Node -> Node */ + Status = MMixerHandleNodeToNodeConnection(MixerContext, + &Connection[Index], + Topology); + } + + if (Status != MM_STATUS_SUCCESS) + { + /* failed to handle connection */ + return Status; + } + } + + /* done */ + return MM_STATUS_SUCCESS; +} + +VOID +MMixerAddPinIndexToArray( + IN PMIXER_CONTEXT MixerContext, + IN ULONG PinId, + IN ULONG MaxPins, + OUT PULONG OutPinCount, + OUT PULONG OutPins) +{ + ULONG Index; + + for(Index = 0; Index < MaxPins; Index++) + { + if (OutPins[Index] != MAXULONG) + { + if (OutPins[Index] > PinId) + { + /* shift entries up */ + MixerContext->Copy(&OutPins[Index + 1], &OutPins[Index], (MaxPins - (Index + 1)) * sizeof(ULONG)); + + /* store pin id */ + OutPins[Index] = PinId; + + /* increment pin count */ + (*OutPinCount)++; + + /* done */ + return; + } + } + else + { + /* store pin id */ + OutPins[Index] = PinId; + + /* increment pin count */ + (*OutPinCount)++; + + /* done */ + return; + } + } +} + +VOID +MMixerGetUpOrDownStreamPins( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN PTOPOLOGY_NODE TopologyNode, + IN ULONG bUpStream, + OUT PULONG OutPinCount, + OUT PULONG OutPins) +{ + ULONG Index, TopologyNodesCount, PinsCount; + PTOPOLOGY_NODE *TopologyNodes; + PULONG Pins; + PPIN Pin; + + /* sanity check */ + ASSERT(TopologyNode->Visited == FALSE); + + if (bUpStream) + { + /* use pins to which a node is attached to */ + PinsCount = TopologyNode->PinConnectedFromCount; + Pins = TopologyNode->PinConnectedFrom; + + TopologyNodesCount = TopologyNode->NodeConnectedFromCount; + TopologyNodes = TopologyNode->NodeConnectedFrom; + } + else + { + /* use pins which are attached to a node */ + PinsCount = TopologyNode->PinConnectedToCount; + Pins = TopologyNode->PinConnectedTo; + + TopologyNodesCount = TopologyNode->NodeConnectedToCount; + TopologyNodes = TopologyNode->NodeConnectedTo; + } + + /* add all diretly connected pins */ + for(Index = 0; Index < PinsCount; Index++) + { + /* sanity check */ + ASSERT(Pins[Index] < Topology->TopologyPinsCount); + + /* get pin */ + Pin = &Topology->TopologyPins[Pins[Index]]; + + /* pin should not have been visited */ + ASSERT(Pin->Visited == FALSE); + ASSERT(Pins[Index] == Pin->PinId); + + /* FIXME support Pin -> Pin connections in iteration */ + if (bUpStream) + { + /* indicates a very broken topology Pin -> Pin -> Node <-... */ + ASSERT(Pin->PinConnectedFromCount == 0); + } + else + { + /* indicates a very broken topology -> Node -> Pin -> Pin */ + ASSERT(Pin->PinConnectedToCount == 0); + } + + /* add them to pin array */ + MMixerAddPinIndexToArray(MixerContext, Pin->PinId, Topology->TopologyPinsCount, OutPinCount, OutPins); + + /* mark pin as visited */ + Pin->Visited = TRUE; + } + + /* mark node as visited */ + TopologyNode->Visited = TRUE; + + /* now visit all connected nodes */ + for(Index = 0; Index < TopologyNodesCount; Index++) + { + /* recursively visit them */ + MMixerGetUpOrDownStreamPins(MixerContext, Topology, TopologyNodes[Index], bUpStream, OutPinCount, OutPins); + } + +} + +ULONG +MMixerGetNodeIndexFromGuid( + IN PTOPOLOGY Topology, + IN const GUID * NodeType) +{ + ULONG Index; + + for(Index = 0; Index < Topology->TopologyNodesCount; Index++) + { + if (IsEqualGUIDAligned(NodeType, &Topology->TopologyNodes[Index].NodeType)) + { + return Index; + } + } + + return MAXULONG; +} + + +VOID +MMixerGetAllUpOrDownstreamPinsFromNodeIndex( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG NodeIndex, + IN ULONG bUpStream, + OUT PULONG OutPinsCount, + OUT PULONG OutPins) +{ + PTOPOLOGY_NODE TopologyNode; + + /* reset visited status */ + MMixerResetTopologyVisitStatus(Topology); + + /* sanity check */ + ASSERT(Topology->TopologyNodesCount > NodeIndex); + + /* get topology node */ + TopologyNode = &Topology->TopologyNodes[NodeIndex]; + + /* now visit all upstream pins & nodes */ + MMixerGetUpOrDownStreamPins(MixerContext, Topology, TopologyNode, bUpStream, OutPinsCount, OutPins); +} + +VOID +MMixerGetUpOrDownstreamNodes( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN PTOPOLOGY_NODE TopologyNode, + IN ULONG bUpStream, + OUT PULONG OutNodeCount, + OUT PULONG OutNodes) +{ + ULONG Index, TopologyNodesCount; + PTOPOLOGY_NODE Node, *TopologyNodes; + + if (bUpStream) + { + /* use nodes to which a node is attached to */ + TopologyNodesCount = TopologyNode->NodeConnectedFromCount; + TopologyNodes = TopologyNode->NodeConnectedFrom; + } + else + { + /* use nodes which are attached to a node */ + TopologyNodesCount = TopologyNode->NodeConnectedToCount; + TopologyNodes = TopologyNode->NodeConnectedTo; + } + + /* sanity check */ + ASSERT(TopologyNode->Visited == FALSE); + + /* add all connected nodes */ + for(Index = 0; Index < TopologyNodesCount; Index++) + { + /* get node */ + Node = TopologyNodes[Index]; + + /* node should not have been visited */ + ASSERT(Node->Visited == FALSE); + + /* add them to node array */ + MMixerAddPinIndexToArray(MixerContext, Node->NodeIndex, Topology->TopologyNodesCount, OutNodeCount, OutNodes); + + /* recursively visit them */ + MMixerGetUpOrDownstreamNodes(MixerContext, Topology, TopologyNodes[Index], bUpStream, OutNodeCount, OutNodes); + } + + /* mark node as visited */ + TopologyNode->Visited = TRUE; + +} + +MIXER_STATUS +MMixerGetAllUpOrDownstreamNodesFromNodeIndex( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG NodeIndex, + IN ULONG bUpStream, + OUT PULONG OutNodesCount, + OUT PULONG OutNodes) +{ + PTOPOLOGY_NODE TopologyNode; + + /* reset visited status */ + MMixerResetTopologyVisitStatus(Topology); + + /* sanity check */ + ASSERT(Topology->TopologyNodesCount > NodeIndex); + + /* get topology node */ + TopologyNode = &Topology->TopologyNodes[NodeIndex]; + + /* now visit all upstream pins & nodes */ + MMixerGetUpOrDownstreamNodes(MixerContext, Topology, TopologyNode, bUpStream, OutNodesCount, OutNodes); + + /* done */ + return MM_STATUS_SUCCESS; + +} + +MIXER_STATUS +MMixerGetAllUpOrDownstreamPinsFromPinIndex( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG PinIndex, + IN ULONG bUpStream, + OUT PULONG OutPinsCount, + OUT PULONG OutPins) +{ + ULONG Index, TopologyNodesCount, TopologyPinsCount; + PPIN Pin; + PTOPOLOGY_NODE *TopologyNodes; + PULONG TopologyPins; + + /* get pin */ + Pin = &Topology->TopologyPins[PinIndex]; + + if (bUpStream) + { + /* use nodes to which this pin is attached to */ + TopologyNodes = Pin->NodesConnectedFrom; + TopologyNodesCount = Pin->NodesConnectedFromCount; + + /* use pins to which this pin is attached to */ + TopologyPins = Pin->PinConnectedFrom; + TopologyPinsCount = Pin->PinConnectedFromCount; + + } + else + { + /* use nodes which are attached to a pin */ + TopologyNodes = Pin->NodesConnectedTo; + TopologyNodesCount = Pin->NodesConnectedToCount; + + /* use pins which are attached to this pin */ + TopologyPins = Pin->PinConnectedTo; + TopologyPinsCount = Pin->PinConnectedToCount; + } + + + /* reset visited status */ + MMixerResetTopologyVisitStatus(Topology); + + /* sanity check */ + ASSERT(Topology->TopologyPinsCount > PinIndex); + + /* add pins which are directly connected to this pin */ + for(Index = 0; Index < TopologyPinsCount; Index++) + { + /* add them to pin array */ + MMixerAddPinIndexToArray(MixerContext, TopologyPins[Index], Topology->TopologyPinsCount, OutPinsCount, OutPins); + } + + /* now visit all up / down stream pins & nodes */ + for(Index = 0; Index < TopologyNodesCount; Index++) + { + /* explore all connected pins with helper */ + MMixerGetAllUpOrDownstreamPinsFromNodeIndex(MixerContext, Topology, TopologyNodes[Index]->NodeIndex, bUpStream, OutPinsCount, OutPins); + } + + /* done */ + return MM_STATUS_SUCCESS; + +} + +VOID +MMixerGetAllUpOrDownstreamNodesFromPinIndex( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG PinIndex, + IN ULONG bUpStream, + OUT PULONG OutNodesCount, + OUT PULONG OutNodes) +{ + ULONG Index, TopologyNodesCount; + PPIN Pin; + PTOPOLOGY_NODE *TopologyNodes; + + /* mark them as empty */ + *OutNodesCount = 0; + + /* get pin */ + Pin = &Topology->TopologyPins[PinIndex]; + + if (bUpStream) + { + /* use nodes to which a pin is attached to */ + TopologyNodes = Pin->NodesConnectedFrom; + TopologyNodesCount = Pin->NodesConnectedFromCount; + } + else + { + /* use nodes which are attached to a node */ + TopologyNodes = Pin->NodesConnectedTo; + TopologyNodesCount = Pin->NodesConnectedToCount; + } + + + /* reset visited status */ + MMixerResetTopologyVisitStatus(Topology); + + /* sanity check */ + ASSERT(Topology->TopologyPinsCount > PinIndex); + + /* now visit all up / down stream pins & nodes */ + for(Index = 0; Index < TopologyNodesCount; Index++) + { + /* add node to array */ + MMixerAddPinIndexToArray(MixerContext, TopologyNodes[Index]->NodeIndex, Topology->TopologyNodesCount, OutNodesCount, OutNodes); + + /* explore all connected nodes with helper */ + MMixerGetAllUpOrDownstreamNodesFromNodeIndex(MixerContext, Topology, TopologyNodes[Index]->NodeIndex, bUpStream, OutNodesCount, OutNodes); + } +} + + +VOID +MMixerGetNextNodesFromPinIndex( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG PinIndex, + IN ULONG bUpStream, + OUT PULONG OutNodesCount, + OUT PULONG OutNodes) +{ + PPIN Pin; + TOPOLOGY_NODE **TopologyNodes; + ULONG TopologyNodesCount; + ULONG Index; + + /* sanity check */ + ASSERT(PinIndex < Topology->TopologyPinsCount); + + /* get pin */ + Pin = &Topology->TopologyPins[PinIndex]; + + if (bUpStream) + { + /* get up stream nodes */ + TopologyNodes = Pin->NodesConnectedFrom; + TopologyNodesCount = Pin->NodesConnectedFromCount; + } + else + { + /* get down stream nodes */ + TopologyNodes = Pin->NodesConnectedTo; + TopologyNodesCount = Pin->NodesConnectedToCount; + } + + /* store topology nodes ids */ + for(Index = 0; Index < TopologyNodesCount; Index++) + { + OutNodes[Index] = TopologyNodes[Index]->NodeIndex; + } + + /* store topology nodes count */ + *OutNodesCount = TopologyNodesCount; +} + +VOID +MMixerGetNextNodesFromNodeIndex( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG NodeIndex, + IN ULONG bUpStream, + OUT PULONG OutNodesCount, + OUT PULONG OutNodes) +{ + TOPOLOGY_NODE **TopologyNodes; + ULONG TopologyNodesCount; + ULONG Index; + + /* sanity check */ + ASSERT(NodeIndex < Topology->TopologyNodesCount); + + if (bUpStream) + { + /* get up stream nodes */ + TopologyNodes = Topology->TopologyNodes[NodeIndex].NodeConnectedFrom; + TopologyNodesCount = Topology->TopologyNodes[NodeIndex].NodeConnectedFromCount; + } + else + { + /* get down stream nodes */ + TopologyNodes = Topology->TopologyNodes[NodeIndex].NodeConnectedTo; + TopologyNodesCount = Topology->TopologyNodes[NodeIndex].NodeConnectedToCount; + } + + /* store topology nodes ids */ + for(Index = 0; Index < TopologyNodesCount; Index++) + { + OutNodes[Index] = TopologyNodes[Index]->NodeIndex; + } + + /* store topology nodes count */ + *OutNodesCount = TopologyNodesCount; +} + +MIXER_STATUS +MMixerAllocateTopologyPinArray( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + OUT PULONG * OutPins) +{ + PULONG Pins; + ULONG Index; + + /* sanity check */ + ASSERT(Topology->TopologyPinsCount != 0); + + /* allocate topology pins */ + Pins = MixerContext->Alloc(Topology->TopologyPinsCount * sizeof(ULONG)); + + if (!Pins) + { + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + + /* mark index as unused */ + for(Index = 0; Index < Topology->TopologyPinsCount; Index++) + Pins[Index] = MAXULONG; + + /* store result */ + *OutPins = Pins; + + /* done */ + return MM_STATUS_SUCCESS; +} + +MIXER_STATUS +MMixerAllocateTopologyNodeArray( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + OUT PULONG * OutNodes) +{ + PULONG Nodes; + ULONG Index; + + /* sanity check */ + ASSERT(Topology->TopologyNodesCount != 0); + + /* allocate topology pins */ + Nodes = MixerContext->Alloc(Topology->TopologyNodesCount * sizeof(ULONG)); + + if (!Nodes) + { + /* out of memory */ + return MM_STATUS_NO_MEMORY; + } + + /* mark index as unused */ + for(Index = 0; Index < Topology->TopologyNodesCount; Index++) + Nodes[Index] = MAXULONG; + + /* store result */ + *OutNodes = Nodes; + + /* done */ + return MM_STATUS_SUCCESS; +} + +VOID +MMixerIsNodeTerminator( + IN PTOPOLOGY Topology, + IN ULONG NodeIndex, + OUT ULONG * bTerminator) +{ + /* sanity check */ + ASSERT(NodeIndex < Topology->TopologyNodesCount); + + /* check if node has multiple parents */ + if (Topology->TopologyNodes[NodeIndex].NodeConnectedFromCount > 1) + { + /* node is connected to multiple other nodes */ + *bTerminator = TRUE; + + /* done */ + return; + } + + /* check if node is mux / sum node */ + if (IsEqualGUIDAligned(&Topology->TopologyNodes[NodeIndex].NodeType, &KSNODETYPE_SUM) || + IsEqualGUIDAligned(&Topology->TopologyNodes[NodeIndex].NodeType, &KSNODETYPE_MUX)) + { + /* classic terminator */ + *bTerminator = TRUE; + + /* done */ + return; + + } + + /* node is not a terminator */ + *bTerminator = FALSE; +} + +MIXER_STATUS +MMixerIsNodeConnectedToPin( + IN PMIXER_CONTEXT MixerContext, + IN PTOPOLOGY Topology, + IN ULONG NodeIndex, + IN ULONG PinId, + IN ULONG bUpStream, + OUT PULONG bConnected) +{ + MIXER_STATUS Status; + ULONG Index, PinsCount; + PULONG Pins; + + /* allocate pin index array */ + Status = MMixerAllocateTopologyPinArray(MixerContext, Topology, &Pins); + + if (Status != MM_STATUS_SUCCESS) + { + /* failed to allocate */ + return Status; + } + + /* now get connected pins */ + PinsCount = 0; + MMixerGetAllUpOrDownstreamPinsFromNodeIndex(MixerContext, Topology, NodeIndex, bUpStream, &PinsCount, Pins); + + /* set to false */ + *bConnected = FALSE; + + for(Index = 0; Index < PinsCount; Index++) + { + if (Pins[Index] == PinId) + { + /* pin is connected */ + *bConnected = TRUE; + break; + } + } + + /* free pin index array */ + MixerContext->Free(Pins); + + /* done */ + return MM_STATUS_SUCCESS; +} + +LPGUID +MMixerGetNodeTypeFromTopology( + IN PTOPOLOGY Topology, + IN ULONG NodeIndex) +{ + /* sanity check */ + ASSERT(NodeIndex < Topology->TopologyNodesCount); + + return &Topology->TopologyNodes[NodeIndex].NodeType; +} + +VOID +MMixerSetTopologyNodeReserved( + IN PTOPOLOGY Topology, + IN ULONG NodeIndex) +{ + /* sanity check */ + ASSERT(NodeIndex < Topology->TopologyNodesCount); + + /* set reserved */ + Topology->TopologyNodes[NodeIndex].Reserved = TRUE; +} + +VOID +MMixerIsTopologyNodeReserved( + IN PTOPOLOGY Topology, + IN ULONG NodeIndex, + OUT PULONG bReserved) +{ + /* sanity check */ + ASSERT(NodeIndex < Topology->TopologyNodesCount); + + /* get reserved status */ + *bReserved = Topology->TopologyNodes[NodeIndex].Reserved; +} + + +MIXER_STATUS +MMixerCreateTopology( + IN PMIXER_CONTEXT MixerContext, + IN ULONG PinCount, + IN PKSMULTIPLE_ITEM NodeConnections, + IN PKSMULTIPLE_ITEM NodeTypes, + OUT PTOPOLOGY *OutTopology) +{ + MIXER_STATUS Status; + PTOPOLOGY Topology; + + /* allocate topology */ + Status = MMixerAllocateTopology(MixerContext, NodeTypes->Count, PinCount, &Topology); + + if (Status != MM_STATUS_SUCCESS) + { + /* failed to allocate topology */ + return Status; + } + + /* initialize topology nodes */ + MMixerInitializeTopologyNodes(MixerContext, NodeTypes, Topology); + + /* explore topology */ + Status = MMixerExploreTopology(MixerContext, NodeConnections, NodeTypes, Topology); + + if (Status != MM_STATUS_SUCCESS) + { + /* failed to allocate topology */ + return Status; + } + + MMixerPrintTopology(Topology); + + /* store result */ + *OutTopology = Topology; + + /* done */ + return MM_STATUS_SUCCESS; +} + + + + + diff --git a/lib/drivers/sound/mmixer/wave.c b/lib/drivers/sound/mmixer/wave.c index af29f45bb14..c0d832af880 100644 --- a/lib/drivers/sound/mmixer/wave.c +++ b/lib/drivers/sound/mmixer/wave.c @@ -345,7 +345,8 @@ MMixerInitializeWaveInfo( IN LPMIXER_DATA MixerData, IN LPWSTR DeviceName, IN ULONG bWaveIn, - IN ULONG PinId) + IN ULONG PinCount, + IN PULONG Pins) { MIXER_STATUS Status; PKSMULTIPLE_ITEM MultipleItem; @@ -356,11 +357,18 @@ MMixerInitializeWaveInfo( if (!WaveInfo) return MM_STATUS_NO_MEMORY; + if (PinCount > 1) + { + /* FIXME support multiple pins for wave device */ + DPRINT1("Implement support for multiple pins\n"); + //ASSERT(PinCount == 1); + } + /* initialize wave info */ WaveInfo->DeviceId = MixerData->DeviceId; - WaveInfo->PinId = PinId; + WaveInfo->PinId = Pins[0]; - // sanity check + /* sanity check */ ASSERT(wcslen(DeviceName) < MAXPNAMELEN); /* copy device name */ @@ -388,7 +396,7 @@ MMixerInitializeWaveInfo( } /* get audio pin data ranges */ - Status = MMixerGetAudioPinDataRanges(MixerContext, MixerData->hDevice, PinId, &MultipleItem); + Status = MMixerGetAudioPinDataRanges(MixerContext, MixerData->hDevice, Pins[0], &MultipleItem); if (Status != MM_STATUS_SUCCESS) { /* failed to get audio pin data ranges */ @@ -451,21 +459,21 @@ MMixerOpenWave( LPWAVE_INFO WaveInfo; ACCESS_MASK DesiredAccess = 0; - // verify mixer context + /* verify mixer context */ Status = MMixerVerifyContext(MixerContext); if (Status != MM_STATUS_SUCCESS) { - // invalid context passed + /* invalid context passed */ return Status; } - // grab mixer list + /* grab mixer list */ MixerList = (PMIXER_LIST)MixerContext->MixerContext; if (WaveFormat->wFormatTag != WAVE_FORMAT_PCM) { - // not implemented + /* not implemented */ return MM_STATUS_NOT_IMPLEMENTED; } @@ -501,16 +509,16 @@ MMixerWaveInCapabilities( MIXER_STATUS Status; LPWAVE_INFO WaveInfo; - // verify mixer context + /* verify mixer context */ Status = MMixerVerifyContext(MixerContext); if (Status != MM_STATUS_SUCCESS) { - // invalid context passed + /* invalid context passed */ return Status; } - // grab mixer list + /* grab mixer list */ MixerList = (PMIXER_LIST)MixerContext->MixerContext; /* find destination wave */ @@ -521,7 +529,7 @@ MMixerWaveInCapabilities( return MM_STATUS_UNSUCCESSFUL; } - //copy capabilities + /* copy capabilities */ MixerContext->Copy(Caps, &WaveInfo->u.InCaps, sizeof(WAVEINCAPSW)); return MM_STATUS_SUCCESS; @@ -537,16 +545,16 @@ MMixerWaveOutCapabilities( MIXER_STATUS Status; LPWAVE_INFO WaveInfo; - // verify mixer context + /* verify mixer context */ Status = MMixerVerifyContext(MixerContext); if (Status != MM_STATUS_SUCCESS) { - // invalid context passed + /* invalid context passed */ return Status; } - // grab mixer list + /* grab mixer list */ MixerList = (PMIXER_LIST)MixerContext->MixerContext; /* find destination wave */ @@ -557,7 +565,7 @@ MMixerWaveOutCapabilities( return MM_STATUS_UNSUCCESSFUL; } - //copy capabilities + /* copy capabilities */ MixerContext->Copy(Caps, &WaveInfo->u.OutCaps, sizeof(WAVEOUTCAPSW)); return MM_STATUS_SUCCESS; @@ -570,16 +578,16 @@ MMixerGetWaveInCount( PMIXER_LIST MixerList; MIXER_STATUS Status; - // verify mixer context + /* verify mixer context */ Status = MMixerVerifyContext(MixerContext); if (Status != MM_STATUS_SUCCESS) { - // invalid context passed - return 0; + /* invalid context passed */ + return Status; } - // grab mixer list + /* grab mixer list */ MixerList = (PMIXER_LIST)MixerContext->MixerContext; return MixerList->WaveInListCount; @@ -592,16 +600,16 @@ MMixerGetWaveOutCount( PMIXER_LIST MixerList; MIXER_STATUS Status; - // verify mixer context + /* verify mixer context */ Status = MMixerVerifyContext(MixerContext); if (Status != MM_STATUS_SUCCESS) { - // invalid context passed - return 0; + /* invalid context passed */ + return Status; } - // grab mixer list + /* grab mixer list */ MixerList = (PMIXER_LIST)MixerContext->MixerContext; return MixerList->WaveOutListCount; @@ -637,16 +645,16 @@ MMixerGetWaveDevicePath( ULONG Length; MIXER_STATUS Status; - // verify mixer context + /* verify mixer context */ Status = MMixerVerifyContext(MixerContext); if (Status != MM_STATUS_SUCCESS) { - // invalid context passed + /* invalid context passed */ return Status; } - // grab mixer list + /* grab mixer list */ MixerList = (PMIXER_LIST)MixerContext->MixerContext; /* find destination wave */ diff --git a/lib/rtl/CMakeLists.txt b/lib/rtl/CMakeLists.txt index 69e9b721cc3..c9fbb2e8fb4 100644 --- a/lib/rtl/CMakeLists.txt +++ b/lib/rtl/CMakeLists.txt @@ -27,6 +27,7 @@ list(APPEND SOURCE generictable.c handle.c heap.c + heapdbg.c image.c interlck.c message.c diff --git a/lib/rtl/bootdata.c b/lib/rtl/bootdata.c index 8d0c57b07d5..afbe1af4c5d 100644 --- a/lib/rtl/bootdata.c +++ b/lib/rtl/bootdata.c @@ -541,9 +541,7 @@ Cleanup: */ NTSTATUS NTAPI -RtlCreateSystemVolumeInformationFolder( - IN PUNICODE_STRING VolumeRootPath - ) +RtlCreateSystemVolumeInformationFolder(IN PUNICODE_STRING VolumeRootPath) { OBJECT_ATTRIBUTES ObjectAttributes; IO_STATUS_BLOCK IoStatusBlock; @@ -679,8 +677,8 @@ NTSTATUS NTAPI RtlCreateBootStatusDataFile(VOID) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } /* @@ -688,17 +686,15 @@ RtlCreateBootStatusDataFile(VOID) */ NTSTATUS NTAPI -RtlGetSetBootStatusData( - HANDLE Filehandle, - BOOLEAN WriteMode, - DWORD DataClass, - PVOID Buffer, - ULONG BufferSize, - DWORD DataClass2 - ) +RtlGetSetBootStatusData(HANDLE Filehandle, + BOOLEAN WriteMode, + DWORD DataClass, + PVOID Buffer, + ULONG BufferSize, + DWORD DataClass2) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } /* @@ -706,12 +702,10 @@ RtlGetSetBootStatusData( */ NTSTATUS NTAPI -RtlLockBootStatusData( - HANDLE Filehandle - ) +RtlLockBootStatusData(OUT PHANDLE Filehandle) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } /* @@ -719,12 +713,10 @@ RtlLockBootStatusData( */ NTSTATUS NTAPI -RtlUnlockBootStatusData( - HANDLE Filehandle - ) +RtlUnlockBootStatusData(IN HANDLE Filehandle) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } /* EOF */ diff --git a/lib/rtl/crc32.c b/lib/rtl/crc32.c index d1509569871..760eebd4fa0 100644 --- a/lib/rtl/crc32.c +++ b/lib/rtl/crc32.c @@ -85,15 +85,14 @@ static const ULONG CrcTable[256] = * @implemented */ ULONG NTAPI -RtlComputeCrc32 (IN USHORT Initial, - IN PUCHAR Data, - IN ULONG Length) +RtlComputeCrc32(IN ULONG Initial, + IN PUCHAR Data, + IN ULONG Length) { - ULONG CrcValue; + ULONG CrcValue = ~Initial; - DPRINT("(%lu,%p,%lu)\n", Initial, Data, Length); + DPRINT("(%d,%p,%d)\n", Initial, Data, Length); - CrcValue = ~Initial; while (Length > 0) { CrcValue = CrcTable[(CrcValue ^ *Data) & 0xff] ^ (CrcValue >> 8); diff --git a/lib/rtl/heap.c b/lib/rtl/heap.c index f4b079494a3..0e43ccbcf66 100644 --- a/lib/rtl/heap.c +++ b/lib/rtl/heap.c @@ -150,7 +150,7 @@ typedef struct tagHEAP { SUBHEAP subheap; /* First sub-heap */ struct list entry; /* Entry in process heap list */ - RTL_CRITICAL_SECTION critSection; /* Critical section for serialization */ + HEAP_LOCK lock; /* Critical section for serialization */ DECLSPEC_ALIGN(8) FREE_LIST_ENTRY freeList[HEAP_NB_FREE_LISTS]; /* Free lists */ DWORD flags; /* Heap flags */ DWORD magic; /* Magic number */ @@ -717,15 +717,15 @@ static BOOL HEAP_InitSubHeap( HEAP *heap, LPVOID address, DWORD flags, { if (!processHeap) /* do it by hand to avoid memory allocations */ { - heap->critSection.DebugInfo = &process_heap_critsect_debug; - heap->critSection.LockCount = -1; - heap->critSection.RecursionCount = 0; - heap->critSection.OwningThread = 0; - heap->critSection.LockSemaphore = 0; - heap->critSection.SpinCount = 0; - process_heap_critsect_debug.CriticalSection = &heap->critSection; + heap->lock.CriticalSection.DebugInfo = &process_heap_critsect_debug; + heap->lock.CriticalSection.LockCount = -1; + heap->lock.CriticalSection.RecursionCount = 0; + heap->lock.CriticalSection.OwningThread = 0; + heap->lock.CriticalSection.LockSemaphore = 0; + heap->lock.CriticalSection.SpinCount = 0; + process_heap_critsect_debug.CriticalSection = &heap->lock.CriticalSection; } - else RtlInitializeHeapLock( &heap->critSection ); + else RtlInitializeHeapLock( &heap->lock ); } } @@ -1094,7 +1094,7 @@ static BOOL HEAP_IsRealArena( HEAP *heapPtr, /* [in] ptr to the heap */ flags |= heapPtr->flags; /* calling HeapLock may result in infinite recursion, so do the critsect directly */ if (!(flags & HEAP_NO_SERIALIZE)) - RtlEnterHeapLock( &heapPtr->critSection ); + RtlEnterHeapLock( &heapPtr->lock ); if (block) { @@ -1113,7 +1113,7 @@ static BOOL HEAP_IsRealArena( HEAP *heapPtr, /* [in] ptr to the heap */ ret = HEAP_ValidateInUseArena( subheap, (const ARENA_INUSE *)block - 1, quiet ); if (!(flags & HEAP_NO_SERIALIZE)) - RtlLeaveHeapLock( &heapPtr->critSection ); + RtlLeaveHeapLock( &heapPtr->lock ); return ret; } @@ -1143,7 +1143,7 @@ static BOOL HEAP_IsRealArena( HEAP *heapPtr, /* [in] ptr to the heap */ subheap = subheap->next; } - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->lock ); return ret; } @@ -1181,9 +1181,9 @@ RtlCreateHeap(ULONG flags, if (processHeap) { HEAP *heapPtr = subheap->heap; - RtlEnterHeapLock( &processHeap->critSection ); + RtlEnterHeapLock( &processHeap->lock ); list_add_head( &processHeap->entry, &heapPtr->entry ); - RtlLeaveHeapLock( &processHeap->critSection ); + RtlLeaveHeapLock( &processHeap->lock ); } else { @@ -1224,12 +1224,12 @@ RtlDestroyHeap(HANDLE heap) /* [in] Handle of heap */ return heap; /* cannot delete the main process heap */ /* remove it from the per-process list */ - RtlEnterHeapLock( &processHeap->critSection ); + RtlEnterHeapLock( &processHeap->lock ); list_remove( &heapPtr->entry ); - RtlLeaveHeapLock( &processHeap->critSection ); + RtlLeaveHeapLock( &processHeap->lock ); } - RtlDeleteHeapLock( &heapPtr->critSection ); + RtlDeleteHeapLock( &heapPtr->lock ); subheap = &heapPtr->subheap; while (subheap) { @@ -1281,13 +1281,13 @@ RtlAllocateHeap(HANDLE heap, /* [in] Handle of private heap block */ if (rounded_size < HEAP_MIN_DATA_SIZE) rounded_size = HEAP_MIN_DATA_SIZE; - if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterHeapLock( &heapPtr->lock ); /* Locate a suitable free block */ if (!(pArena = HEAP_FindFreeBlock( heapPtr, rounded_size, &subheap ))) { TRACE("(%p,%08lx,%08lx): returning NULL\n", heap, flags, size ); - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->lock ); if (flags & HEAP_GENERATE_EXCEPTIONS) RtlRaiseStatus( STATUS_NO_MEMORY ); return NULL; } @@ -1319,7 +1319,7 @@ RtlAllocateHeap(HANDLE heap, /* [in] Handle of private heap block */ else mark_block_uninitialized( pInUse + 1, pInUse->size & ARENA_SIZE_MASK ); - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->lock ); TRACE("(%p,%08lx,%08lx): returning %p\n", heap, flags, size, pInUse + 1 ); return (LPVOID)(pInUse + 1); @@ -1357,10 +1357,10 @@ BOOLEAN NTAPI RtlFreeHeap( flags &= HEAP_NO_SERIALIZE; flags |= heapPtr->flags; - if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterHeapLock( &heapPtr->lock ); if (!HEAP_IsRealArena( heapPtr, HEAP_NO_SERIALIZE, ptr, QUIET )) { - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->lock ); RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_INVALID_PARAMETER ); TRACE("(%p,%08lx,%p): returning FALSE\n", heap, flags, ptr ); return FALSE; @@ -1376,13 +1376,13 @@ BOOLEAN NTAPI RtlFreeHeap( HEAP_MakeInUseBlockFree( subheap, pInUse ); - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->lock ); TRACE("(%p,%08lx,%p): returning TRUE\n", heap, flags, ptr ); return TRUE; error: - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->lock ); RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_INVALID_PARAMETER ); TRACE("(%p,%08x,%p): returning FALSE\n", heap, flags, ptr ); return FALSE; @@ -1427,7 +1427,7 @@ PVOID NTAPI RtlReAllocateHeap( //Flags &= HEAP_GENERATE_EXCEPTIONS | HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY | // HEAP_REALLOC_IN_PLACE_ONLY; flags |= heapPtr->flags; - if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterHeapLock( &heapPtr->lock ); rounded_size = ROUND_SIZE(size); if (rounded_size < size) goto oom; /* overflow */ @@ -1510,19 +1510,19 @@ PVOID NTAPI RtlReAllocateHeap( /* Return the new arena */ done: - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->lock ); TRACE("(%p,%08lx,%p,%08lx): returning %p\n", heap, flags, ptr, size, pArena + 1 ); return (LPVOID)(pArena + 1); oom: - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->lock ); if (flags & HEAP_GENERATE_EXCEPTIONS) RtlRaiseStatus( STATUS_NO_MEMORY ); RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_NO_MEMORY ); TRACE("(%p,%08x,%p,%08lx): returning oom\n", heap, flags, ptr, size ); return NULL; error: - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->lock ); RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_INVALID_PARAMETER ); TRACE("(%p,%08x,%p,%08lx): returning error\n", heap, flags, ptr, size ); return NULL; @@ -1562,7 +1562,7 @@ RtlLockHeap(IN HANDLE Heap) HEAP *heapPtr = HEAP_GetPtr( Heap ); if (!heapPtr) return FALSE; - RtlEnterHeapLock( &heapPtr->critSection ); + RtlEnterHeapLock( &heapPtr->lock ); return TRUE; } @@ -1586,7 +1586,7 @@ RtlUnlockHeap(HANDLE Heap) HEAP *heapPtr = HEAP_GetPtr( Heap ); if (!heapPtr) return FALSE; - RtlLeaveHeapLock( &heapPtr->critSection ); + RtlLeaveHeapLock( &heapPtr->lock ); return TRUE; } @@ -1621,7 +1621,7 @@ RtlSizeHeap( } flags &= HEAP_NO_SERIALIZE; flags |= heapPtr->flags; - if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterHeapLock( &heapPtr->lock ); if (!HEAP_IsRealArena( heapPtr, HEAP_NO_SERIALIZE, ptr, QUIET )) { RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_INVALID_PARAMETER ); @@ -1632,12 +1632,29 @@ RtlSizeHeap( const ARENA_INUSE *pArena = (const ARENA_INUSE *)ptr - 1; ret = (pArena->size & ARENA_SIZE_MASK) - pArena->unused_bytes; } - if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->critSection ); + if (!(flags & HEAP_NO_SERIALIZE)) RtlLeaveHeapLock( &heapPtr->lock ); TRACE("(%p,%08lx,%p): returning %08lx\n", heap, flags, ptr, ret ); return ret; } +BOOLEAN NTAPI +RtlpValidateHeap(HEAP * Heap, BOOLEAN ForceValidation) +{ + return HEAP_IsRealArena(Heap, Heap->flags, NULL, TRUE); +} + +BOOLEAN NTAPI +RtlpValidateHeapHeaders(HEAP * Heap, BOOLEAN Recalculate) +{ + return TRUE; +} + +BOOLEAN NTAPI +RtlpValidateHeapEntry(HEAP * Heap, PVOID HeapEntry) +{ + return TRUE; +} /*********************************************************************** * RtlValidateHeap @@ -1694,7 +1711,7 @@ RtlEnumProcessHeaps(PHEAP_ENUMERATION_ROUTINE HeapEnumerationRoutine, NTSTATUS Status = STATUS_SUCCESS; struct list *ptr=NULL; - RtlEnterHeapLock(&processHeap->critSection); + RtlEnterHeapLock(&processHeap->lock); Status=HeapEnumerationRoutine(processHeap,lParam); LIST_FOR_EACH( ptr, &processHeap->entry ) @@ -1703,7 +1720,7 @@ RtlEnumProcessHeaps(PHEAP_ENUMERATION_ROUTINE HeapEnumerationRoutine, Status = HeapEnumerationRoutine(ptr,lParam); } - RtlLeaveHeapLock(&processHeap->critSection); + RtlLeaveHeapLock(&processHeap->lock); return Status; } @@ -1719,7 +1736,7 @@ RtlGetProcessHeaps(ULONG count, ULONG total = 1; /* main heap */ struct list *ptr; ULONG i=0; - RtlEnterHeapLock( &processHeap->critSection ); + RtlEnterHeapLock( &processHeap->lock ); LIST_FOR_EACH( ptr, &processHeap->entry ) total++; //if (total <= count) { @@ -1732,7 +1749,7 @@ RtlGetProcessHeaps(ULONG count, *(heaps++) = LIST_ENTRY( ptr, HEAP, entry ); } } - RtlLeaveHeapLock( &processHeap->critSection ); + RtlLeaveHeapLock( &processHeap->lock ); return i; } @@ -1746,7 +1763,7 @@ RtlValidateProcessHeaps(VOID) BOOLEAN Result = TRUE; HEAP ** pptr; - RtlEnterHeapLock( &processHeap->critSection ); + RtlEnterHeapLock( &processHeap->lock ); for (pptr = (HEAP**)&NtCurrentPeb()->ProcessHeaps; *pptr; pptr++) { @@ -1757,7 +1774,7 @@ RtlValidateProcessHeaps(VOID) } } - RtlLeaveHeapLock( &processHeap->critSection ); + RtlLeaveHeapLock( &processHeap->lock ); return Result; } @@ -1812,7 +1829,8 @@ NTAPI RtlSetUserFlagsHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID BaseAddress, - IN ULONG UserFlags) + IN ULONG UserFlagsReset, + IN ULONG UserFlagsSet) { HEAP *heapPtr; PHEAP_USER_DATA udata; @@ -1829,7 +1847,7 @@ RtlSetUserFlagsHeap(IN PVOID HeapHandle, udata = HEAP_AllocUserData(heapPtr, BaseAddress); if (!udata) return FALSE; } - udata->UserFlags = UserFlags & HEAP_SETTABLE_USER_FLAGS; + udata->UserFlags = UserFlagsSet & HEAP_SETTABLE_USER_FLAGS; return TRUE; } @@ -1933,7 +1951,7 @@ RtlProtectHeap(IN PVOID HeapHandle, return NULL; } -DWORD +NTSTATUS NTAPI RtlSetHeapInformation(IN HANDLE HeapHandle OPTIONAL, IN HEAP_INFORMATION_CLASS HeapInformationClass, @@ -1944,7 +1962,7 @@ RtlSetHeapInformation(IN HANDLE HeapHandle OPTIONAL, return 0; } -DWORD +NTSTATUS NTAPI RtlQueryHeapInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, @@ -1978,23 +1996,23 @@ RtlQueryHeapInformation(HANDLE HeapHandle, } } -DWORD +NTSTATUS NTAPI RtlMultipleAllocateHeap(IN PVOID HeapHandle, - IN DWORD Flags, + IN ULONG Flags, IN SIZE_T Size, - IN DWORD Count, + IN ULONG Count, OUT PVOID *Array) { UNIMPLEMENTED; return 0; } -DWORD +NTSTATUS NTAPI RtlMultipleFreeHeap(IN PVOID HeapHandle, - IN DWORD Flags, - IN DWORD Count, + IN ULONG Flags, + IN ULONG Count, OUT PVOID *Array) { UNIMPLEMENTED; diff --git a/lib/rtl/heap.h b/lib/rtl/heap.h new file mode 100644 index 00000000000..8291838c6de --- /dev/null +++ b/lib/rtl/heap.h @@ -0,0 +1,396 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS System Libraries + * FILE: lib/rtl/heap.h + * PURPOSE: Run-Time Libary Heap Manager header + * PROGRAMMER: Aleksey Bragin + */ + +/* INCLUDES ******************************************************************/ + +#ifndef RTL_HEAP_H +#define RTL_HEAP_H + +/* Core heap definitions */ +#define HEAP_FREELISTS 128 +#define HEAP_SEGMENTS 64 + +#define HEAP_ENTRY_SIZE ((ULONG)sizeof(HEAP_ENTRY)) +#ifdef _WIN64 +#define HEAP_ENTRY_SHIFT 4 +#else +#define HEAP_ENTRY_SHIFT 3 +#endif +#define HEAP_MAX_BLOCK_SIZE ((0x80000 - PAGE_SIZE) >> HEAP_ENTRY_SHIFT) + +#define ARENA_INUSE_FILLER 0xBAADF00D +#define ARENA_FREE_FILLER 0xFEEEFEEE +#define HEAP_TAIL_FILL 0xab + +// from ntifs.h, should go to another header! +#define HEAP_GLOBAL_TAG 0x0800 +#define HEAP_PSEUDO_TAG_FLAG 0x8000 +#define HEAP_TAG_MASK (HEAP_MAXIMUM_TAG << HEAP_TAG_SHIFT) + +#define HEAP_EXTRA_FLAGS_MASK (HEAP_CAPTURE_STACK_BACKTRACES | \ + HEAP_SETTABLE_USER_VALUE | \ + (HEAP_TAG_MASK ^ (0xFF << HEAP_TAG_SHIFT))) + +/* Heap entry flags */ +#define HEAP_ENTRY_BUSY 0x01 +#define HEAP_ENTRY_EXTRA_PRESENT 0x02 +#define HEAP_ENTRY_FILL_PATTERN 0x04 +#define HEAP_ENTRY_VIRTUAL_ALLOC 0x08 +#define HEAP_ENTRY_LAST_ENTRY 0x10 +#define HEAP_ENTRY_SETTABLE_FLAG1 0x20 +#define HEAP_ENTRY_SETTABLE_FLAG2 0x40 +#define HEAP_ENTRY_SETTABLE_FLAG3 0x80 +#define HEAP_ENTRY_SETTABLE_FLAGS (HEAP_ENTRY_SETTABLE_FLAG1 | HEAP_ENTRY_SETTABLE_FLAG2 | HEAP_ENTRY_SETTABLE_FLAG3) + +/* Signatures */ +#define HEAP_SIGNATURE 0xeefeeff +#define HEAP_SEGMENT_SIGNATURE 0xffeeffee + +/* Segment flags */ +#define HEAP_USER_ALLOCATED 0x1 + +/* A handy inline to distinguis normal heap, special "debug heap" and special "page heap" */ +FORCEINLINE BOOLEAN +RtlpHeapIsSpecial(ULONG Flags) +{ + if (Flags & HEAP_SKIP_VALIDATION_CHECKS) return FALSE; + + if (Flags & (HEAP_FLAG_PAGE_ALLOCS | + HEAP_VALIDATE_ALL_ENABLED | + HEAP_VALIDATE_PARAMETERS_ENABLED | + HEAP_CAPTURE_STACK_BACKTRACES | + HEAP_CREATE_ENABLE_TRACING)) + { + /* This is a special heap */ + return TRUE; + } + + /* No need for a special treatment */ + return FALSE; +} + +/* Heap structures */ +struct _HEAP_COMMON_ENTRY +{ + union + { + struct + { + USHORT Size; + UCHAR Flags; + UCHAR SmallTagIndex; + }; + struct + { + PVOID SubSegmentCode; + USHORT PreviousSize; + union + { + UCHAR SegmentOffset; + UCHAR LFHFlags; + }; + UCHAR UnusedBytes; + }; + struct + { + USHORT FunctionIndex; + USHORT ContextValue; + }; + struct + { + ULONG InterceptorValue; + USHORT UnusedBytesLength; + UCHAR EntryOffset; + UCHAR ExtendedBlockSignature; + }; + struct + { + ULONG Code1; + USHORT Code2; + UCHAR Code3; + UCHAR Code4; + }; + ULONGLONG AgregateCode; + }; +}; + +typedef struct _HEAP_FREE_ENTRY +{ + struct _HEAP_COMMON_ENTRY; + LIST_ENTRY FreeList; +} HEAP_FREE_ENTRY, *PHEAP_FREE_ENTRY; + +typedef struct _HEAP_ENTRY +{ + struct _HEAP_COMMON_ENTRY; +} HEAP_ENTRY, *PHEAP_ENTRY; + +#ifdef _WIN64 +C_ASSERT(sizeof(HEAP_ENTRY) == 16); +#else +C_ASSERT(sizeof(HEAP_ENTRY) == 8); +#endif +C_ASSERT((1 << HEAP_ENTRY_SHIFT) == sizeof(HEAP_ENTRY)); + +typedef struct _HEAP_TAG_ENTRY +{ + ULONG Allocs; + ULONG Frees; + ULONG Size; + USHORT TagIndex; + USHORT CreatorBackTraceIndex; + WCHAR TagName[24]; +} HEAP_TAG_ENTRY, *PHEAP_TAG_ENTRY; + +typedef struct _HEAP_PSEUDO_TAG_ENTRY +{ + ULONG Allocs; + ULONG Frees; + ULONG Size; +} HEAP_PSEUDO_TAG_ENTRY, *PHEAP_PSEUDO_TAG_ENTRY; + +typedef struct _HEAP_COUNTERS +{ + ULONG TotalMemoryReserved; + ULONG TotalMemoryCommitted; + ULONG TotalMemoryLargeUCR; + ULONG TotalSizeInVirtualBlocks; + ULONG TotalSegments; + ULONG TotalUCRs; + ULONG CommittOps; + ULONG DeCommitOps; + ULONG LockAcquires; + ULONG LockCollisions; + ULONG CommitRate; + ULONG DecommittRate; + ULONG CommitFailures; + ULONG InBlockCommitFailures; + ULONG CompactHeapCalls; + ULONG CompactedUCRs; + ULONG InBlockDeccommits; + ULONG InBlockDeccomitSize; +} HEAP_COUNTERS, *PHEAP_COUNTERS; + +typedef struct _HEAP_TUNING_PARAMETERS +{ + ULONG CommittThresholdShift; + ULONG MaxPreCommittThreshold; +} HEAP_TUNING_PARAMETERS, *PHEAP_TUNING_PARAMETERS; + +typedef struct _HEAP +{ + HEAP_ENTRY Entry; + ULONG SegmentSignature; + ULONG SegmentFlags; + LIST_ENTRY SegmentListEntry; + struct _HEAP *Heap; + PVOID BaseAddress; + ULONG NumberOfPages; + PHEAP_ENTRY FirstEntry; + PHEAP_ENTRY LastValidEntry; + ULONG NumberOfUnCommittedPages; + ULONG NumberOfUnCommittedRanges; + USHORT SegmentAllocatorBackTraceIndex; + USHORT Reserved; + LIST_ENTRY UCRSegmentList; + + ULONG Flags; + ULONG ForceFlags; + ULONG CompatibilityFlags; + ULONG EncodeFlagMask; + HEAP_ENTRY Encoding; + ULONG PointerKey; + ULONG Interceptor; + ULONG VirtualMemoryThreshold; + ULONG Signature; + ULONG SegmentReserve; + ULONG SegmentCommit; + ULONG DeCommitFreeBlockThreshold; + ULONG DeCommitTotalFreeThreshold; + ULONG TotalFreeSize; + ULONG MaximumAllocationSize; + USHORT ProcessHeapsListIndex; + USHORT HeaderValidateLength; + PVOID HeaderValidateCopy; + USHORT NextAvailableTagIndex; + USHORT MaximumTagIndex; + PHEAP_TAG_ENTRY TagEntries; + LIST_ENTRY UCRList; + LIST_ENTRY UCRSegments; // FIXME: non-Vista + ULONG AlignRound; + ULONG AlignMask; + LIST_ENTRY VirtualAllocdBlocks; + LIST_ENTRY SegmentList; + struct _HEAP_SEGMENT *Segments[HEAP_SEGMENTS]; //FIXME: non-Vista + USHORT AllocatorBackTraceIndex; + ULONG NonDedicatedListLength; + PVOID BlocksIndex; + PVOID UCRIndex; + PHEAP_PSEUDO_TAG_ENTRY PseudoTagEntries; + LIST_ENTRY FreeLists[HEAP_FREELISTS]; //FIXME: non-Vista + union + { + ULONG FreeListsInUseUlong[HEAP_FREELISTS / (sizeof(ULONG) * 8)]; //FIXME: non-Vista + UCHAR FreeListsInUseBytes[HEAP_FREELISTS / (sizeof(UCHAR) * 8)]; //FIXME: non-Vista + } u; + PHEAP_LOCK LockVariable; + PRTL_HEAP_COMMIT_ROUTINE CommitRoutine; + PVOID FrontEndHeap; + USHORT FrontHeapLockCount; + UCHAR FrontEndHeapType; + HEAP_COUNTERS Counters; + HEAP_TUNING_PARAMETERS TuningParameters; +} HEAP, *PHEAP; + +typedef struct _HEAP_SEGMENT +{ + HEAP_ENTRY Entry; + ULONG SegmentSignature; + ULONG SegmentFlags; + LIST_ENTRY SegmentListEntry; + PHEAP Heap; + PVOID BaseAddress; + ULONG NumberOfPages; + PHEAP_ENTRY FirstEntry; + PHEAP_ENTRY LastValidEntry; + ULONG NumberOfUnCommittedPages; + ULONG NumberOfUnCommittedRanges; + USHORT SegmentAllocatorBackTraceIndex; + USHORT Reserved; + LIST_ENTRY UCRSegmentList; + PHEAP_ENTRY LastEntryInSegment; //FIXME: non-Vista +} HEAP_SEGMENT, *PHEAP_SEGMENT; + +typedef struct _HEAP_UCR_DESCRIPTOR +{ + LIST_ENTRY ListEntry; + LIST_ENTRY SegmentEntry; + PVOID Address; + ULONG Size; +} HEAP_UCR_DESCRIPTOR, *PHEAP_UCR_DESCRIPTOR; + +typedef struct _HEAP_UCR_SEGMENT +{ + LIST_ENTRY ListEntry; + SIZE_T ReservedSize; + SIZE_T CommittedSize; +} HEAP_UCR_SEGMENT, *PHEAP_UCR_SEGMENT; + +typedef struct _HEAP_ENTRY_EXTRA +{ + union + { + struct + { + USHORT AllocatorBackTraceIndex; + USHORT TagIndex; + ULONG_PTR Settable; + }; + UINT64 ZeroInit; + }; +} HEAP_ENTRY_EXTRA, *PHEAP_ENTRY_EXTRA; + +typedef HEAP_ENTRY_EXTRA HEAP_FREE_ENTRY_EXTRA, *PHEAP_FREE_ENTRY_EXTRA; + +typedef struct _HEAP_VIRTUAL_ALLOC_ENTRY +{ + LIST_ENTRY Entry; + HEAP_ENTRY_EXTRA ExtraStuff; + ULONG CommitSize; + ULONG ReserveSize; + HEAP_ENTRY BusyBlock; +} HEAP_VIRTUAL_ALLOC_ENTRY, *PHEAP_VIRTUAL_ALLOC_ENTRY; + +/* Global variables */ +extern HEAP_LOCK RtlpProcessHeapsListLock; +extern BOOLEAN RtlpPageHeapEnabled; + +/* Functions declarations */ + +/* heap.c */ +PHEAP_FREE_ENTRY NTAPI +RtlpCoalesceFreeBlocks (PHEAP Heap, + PHEAP_FREE_ENTRY FreeEntry, + PSIZE_T FreeSize, + BOOLEAN Remove); + +PHEAP_ENTRY_EXTRA NTAPI +RtlpGetExtraStuffPointer(PHEAP_ENTRY HeapEntry); + +BOOLEAN NTAPI +RtlpValidateHeap(PHEAP Heap, BOOLEAN ForceValidation); + +BOOLEAN NTAPI +RtlpValidateHeapEntry(PHEAP Heap, PHEAP_ENTRY HeapEntry); + +BOOLEAN NTAPI +RtlpValidateHeapHeaders(PHEAP Heap, BOOLEAN Recalculate); + +/* heapdbg.c */ +HANDLE NTAPI +RtlDebugCreateHeap(ULONG Flags, + PVOID Addr, + SIZE_T TotalSize, + SIZE_T CommitSize, + PVOID Lock, + PRTL_HEAP_PARAMETERS Parameters); + +BOOLEAN NTAPI +RtlDebugDestroyHeap(HANDLE HeapPtr); + +PVOID NTAPI +RtlDebugAllocateHeap(PVOID HeapPtr, + ULONG Flags, + SIZE_T Size); + +PVOID NTAPI +RtlDebugReAllocateHeap(HANDLE HeapPtr, + ULONG Flags, + PVOID Ptr, + SIZE_T Size); + +BOOLEAN NTAPI +RtlDebugFreeHeap(HANDLE HeapPtr, + ULONG Flags, + PVOID Ptr); + +BOOLEAN NTAPI +RtlDebugGetUserInfoHeap(PVOID HeapHandle, + ULONG Flags, + PVOID BaseAddress, + PVOID *UserValue, + PULONG UserFlags); + +BOOLEAN NTAPI +RtlDebugSetUserValueHeap(PVOID HeapHandle, + ULONG Flags, + PVOID BaseAddress, + PVOID UserValue); + +BOOLEAN +NTAPI +RtlDebugSetUserFlagsHeap(PVOID HeapHandle, + ULONG Flags, + PVOID BaseAddress, + ULONG UserFlagsReset, + ULONG UserFlagsSet); + +SIZE_T NTAPI +RtlDebugSizeHeap(HANDLE HeapPtr, + ULONG Flags, + PVOID Ptr); + +HANDLE NTAPI +RtlpPageHeapCreate(ULONG Flags, + PVOID Addr, + SIZE_T TotalSize, + SIZE_T CommitSize, + PVOID Lock, + PRTL_HEAP_PARAMETERS Parameters); + +#endif diff --git a/lib/rtl/heap_rewrite.c b/lib/rtl/heap_rewrite.c new file mode 100644 index 00000000000..2c28b6a76d7 --- /dev/null +++ b/lib/rtl/heap_rewrite.c @@ -0,0 +1,4138 @@ +/* COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/rtl/heap.c + * PURPOSE: RTL Heap backend allocator + * PROGRAMMERS: Copyright 2010 Aleksey Bragin + */ + +/* Useful references: + http://msdn.microsoft.com/en-us/library/ms810466.aspx + http://msdn.microsoft.com/en-us/library/ms810603.aspx + http://www.securitylab.ru/analytics/216376.php + http://binglongx.spaces.live.com/blog/cns!142CBF6D49079DE8!596.entry + http://www.phreedom.org/research/exploits/asn1-bitstring/ + http://illmatics.com/Understanding_the_LFH.pdf + http://www.alex-ionescu.com/?p=18 +*/ + +/* INCLUDES *****************************************************************/ + +#include +#include + +#define NDEBUG +#include + +HEAP_LOCK RtlpProcessHeapsListLock; + +/* Bitmaps stuff */ + +/* How many least significant bits are clear */ +UCHAR RtlpBitsClearLow[] = +{ + 8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, + 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 +}; + +UCHAR FORCEINLINE +RtlpFindLeastSetBit(ULONG Bits) +{ + if (Bits & 0xFFFF) + { + if (Bits & 0xFF) + return RtlpBitsClearLow[Bits & 0xFF]; /* Lowest byte */ + else + return RtlpBitsClearLow[(Bits >> 8) & 0xFF] + 8; /* 2nd byte */ + } + else + { + if ((Bits >> 16) & 0xFF) + return RtlpBitsClearLow[(Bits >> 16) & 0xFF] + 16; /* 3rd byte */ + else + return RtlpBitsClearLow[(Bits >> 24) & 0xFF] + 24; /* Highest byte */ + } +} + +/* Maximum size of a tail-filling pattern used for compare operation */ +UCHAR FillPattern[HEAP_ENTRY_SIZE] = +{ + HEAP_TAIL_FILL, + HEAP_TAIL_FILL, + HEAP_TAIL_FILL, + HEAP_TAIL_FILL, + HEAP_TAIL_FILL, + HEAP_TAIL_FILL, + HEAP_TAIL_FILL, + HEAP_TAIL_FILL +}; + + +ULONG NTAPI +RtlCompareMemoryUlong(PVOID Source, ULONG Length, ULONG Value); + +/* FUNCTIONS *****************************************************************/ + +VOID NTAPI +RtlpInitializeHeap(PHEAP Heap, + PULONG HeaderSize, + ULONG Flags, + BOOLEAN AllocateLock, + PVOID Lock) +{ + PVOID NextHeapBase = Heap + 1; + PHEAP_UCR_DESCRIPTOR UcrDescriptor; + ULONG NumUCRs = 8; + ULONG i; + NTSTATUS Status; + + /* Add UCRs size */ + *HeaderSize += NumUCRs * sizeof(*UcrDescriptor); + + /* Prepare a list of UCRs */ + InitializeListHead(&Heap->UCRList); + InitializeListHead(&Heap->UCRSegments); + UcrDescriptor = NextHeapBase; + + for (i=0; iUCRList, &UcrDescriptor->ListEntry); + } + + NextHeapBase = UcrDescriptor; + // TODO: Add tagging + + /* Round up header size again */ + *HeaderSize = ROUND_UP(*HeaderSize, HEAP_ENTRY_SIZE); + + ASSERT(*HeaderSize <= PAGE_SIZE); + + /* Initialize heap's header */ + Heap->Entry.Size = (*HeaderSize) >> HEAP_ENTRY_SHIFT; + Heap->Entry.Flags = HEAP_ENTRY_BUSY; + + Heap->Signature = HEAP_SIGNATURE; + Heap->Flags = Flags; + Heap->ForceFlags = (Flags & (HEAP_NO_SERIALIZE | + HEAP_GENERATE_EXCEPTIONS | + HEAP_ZERO_MEMORY | + HEAP_REALLOC_IN_PLACE_ONLY | + HEAP_VALIDATE_PARAMETERS_ENABLED | + HEAP_VALIDATE_ALL_ENABLED | + HEAP_TAIL_CHECKING_ENABLED | + HEAP_CREATE_ALIGN_16 | + HEAP_FREE_CHECKING_ENABLED)); + Heap->HeaderValidateCopy = NULL; + Heap->HeaderValidateLength = ((PCHAR)NextHeapBase - (PCHAR)Heap); + + /* Initialize free lists */ + for (i=0; iFreeLists[i]); + } + + /* Initialize "big" allocations list */ + InitializeListHead(&Heap->VirtualAllocdBlocks); + + /* Initialize lock */ + if (AllocateLock) + { + Lock = NextHeapBase; + Status = RtlInitializeHeapLock((PHEAP_LOCK)Lock); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Initializing the lock failed!\n"); + return /*NULL*/; // FIXME! + } + } + + /* Set the lock variable */ + Heap->LockVariable = Lock; +} + +VOID FORCEINLINE +RtlpSetFreeListsBit(PHEAP Heap, + PHEAP_FREE_ENTRY FreeEntry) +{ + ULONG Index, Bit; + + ASSERT(FreeEntry->Size < HEAP_FREELISTS); + + /* Calculate offset in the free list bitmap */ + Index = FreeEntry->Size >> 3; /* = FreeEntry->Size / (sizeof(UCHAR) * 8)*/ + Bit = 1 << (FreeEntry->Size & 7); + + /* Assure it's not already set */ + ASSERT((Heap->u.FreeListsInUseBytes[Index] & Bit) == 0); + + /* Set it */ + Heap->u.FreeListsInUseBytes[Index] |= Bit; +} + +VOID FORCEINLINE +RtlpClearFreeListsBit(PHEAP Heap, + PHEAP_FREE_ENTRY FreeEntry) +{ + ULONG Index, Bit; + + ASSERT(FreeEntry->Size < HEAP_FREELISTS); + + /* Calculate offset in the free list bitmap */ + Index = FreeEntry->Size >> 3; /* = FreeEntry->Size / (sizeof(UCHAR) * 8)*/ + Bit = 1 << (FreeEntry->Size & 7); + + /* Assure it was set and the corresponding free list is empty */ + ASSERT(Heap->u.FreeListsInUseBytes[Index] & Bit); + ASSERT(IsListEmpty(&Heap->FreeLists[FreeEntry->Size])); + + /* Clear it */ + Heap->u.FreeListsInUseBytes[Index] ^= Bit; +} + +VOID NTAPI +RtlpInsertFreeBlockHelper(PHEAP Heap, + PHEAP_FREE_ENTRY FreeEntry, + SIZE_T BlockSize, + BOOLEAN NoFill) +{ + PLIST_ENTRY FreeListHead, Current; + PHEAP_FREE_ENTRY CurrentEntry; + + ASSERT(FreeEntry->Size == BlockSize); + + /* Fill if it's not denied */ + if (!NoFill) + { + FreeEntry->Flags &= ~(HEAP_ENTRY_FILL_PATTERN | + HEAP_ENTRY_EXTRA_PRESENT | + HEAP_ENTRY_BUSY); + + if (Heap->Flags & HEAP_FREE_CHECKING_ENABLED) + { + RtlFillMemoryUlong((PCHAR)(FreeEntry + 1), + (BlockSize << HEAP_ENTRY_SHIFT) - sizeof(*FreeEntry), + ARENA_FREE_FILLER); + + FreeEntry->Flags |= HEAP_ENTRY_FILL_PATTERN; + } + } + else + { + /* Clear out all flags except the last entry one */ + FreeEntry->Flags &= HEAP_ENTRY_LAST_ENTRY; + } + + /* Check if PreviousSize of the next entry matches ours */ + if (!(FreeEntry->Flags & HEAP_ENTRY_LAST_ENTRY)) + { + ASSERT(((PHEAP_ENTRY)FreeEntry + BlockSize)->PreviousSize = BlockSize); + } + + /* Insert it either into dedicated or non-dedicated list */ + if (BlockSize < HEAP_FREELISTS) + { + /* Dedicated list */ + FreeListHead = &Heap->FreeLists[BlockSize]; + + if (IsListEmpty(FreeListHead)) + { + RtlpSetFreeListsBit(Heap, FreeEntry); + } + } + else + { + /* Non-dedicated one */ + FreeListHead = &Heap->FreeLists[0]; + Current = FreeListHead->Flink; + + /* Find a position where to insert it to (the list must be sorted) */ + while (FreeListHead != Current) + { + CurrentEntry = CONTAINING_RECORD(Current, HEAP_FREE_ENTRY, FreeList); + + if (BlockSize <= CurrentEntry->Size) + break; + + Current = Current->Flink; + } + + FreeListHead = Current; + } + + /* Actually insert it into the list */ + InsertTailList(FreeListHead, &FreeEntry->FreeList); +} + +VOID NTAPI +RtlpInsertFreeBlock(PHEAP Heap, + PHEAP_FREE_ENTRY FreeEntry, + SIZE_T BlockSize) +{ + USHORT Size, PreviousSize; + UCHAR SegmentOffset, Flags; + PHEAP_SEGMENT Segment; + + DPRINT("RtlpInsertFreeBlock(%p %p %x)\n", Heap, FreeEntry, BlockSize); + + /* Increase the free size counter */ + Heap->TotalFreeSize += BlockSize; + + /* Remember certain values */ + Flags = FreeEntry->Flags; + PreviousSize = FreeEntry->PreviousSize; + SegmentOffset = FreeEntry->SegmentOffset; + Segment = Heap->Segments[SegmentOffset]; + + /* Process it */ + while (BlockSize) + { + /* Check for the max size */ + if (BlockSize > HEAP_MAX_BLOCK_SIZE) + { + Size = HEAP_MAX_BLOCK_SIZE; + + /* Special compensation if it goes above limit just by 1 */ + if (BlockSize == (HEAP_MAX_BLOCK_SIZE + 1)) + Size -= 16; + + FreeEntry->Flags = 0; + } + else + { + Size = BlockSize; + FreeEntry->Flags = Flags; + } + + /* Change its size and insert it into a free list */ + FreeEntry->Size = Size; + FreeEntry->PreviousSize = PreviousSize; + FreeEntry->SegmentOffset = SegmentOffset; + + /* Call a helper to actually insert the block */ + RtlpInsertFreeBlockHelper(Heap, FreeEntry, Size, FALSE); + + /* Update sizes */ + PreviousSize = Size; + BlockSize -= Size; + + /* Go to the next entry */ + FreeEntry = (PHEAP_FREE_ENTRY)((PHEAP_ENTRY)FreeEntry + Size); + + /* Check if that's all */ + if ((PHEAP_ENTRY)FreeEntry >= Segment->LastValidEntry) return; + } + + /* Update previous size if needed */ + if (!(Flags & HEAP_ENTRY_LAST_ENTRY)) + FreeEntry->PreviousSize = PreviousSize; +} + +VOID NTAPI +RtlpRemoveFreeBlock(PHEAP Heap, + PHEAP_FREE_ENTRY FreeEntry, + BOOLEAN Dedicated, + BOOLEAN NoFill) +{ + SIZE_T Result, RealSize; + PLIST_ENTRY OldBlink, OldFlink; + + // FIXME: Maybe use RemoveEntryList? + + /* Remove the free block */ + OldFlink = FreeEntry->FreeList.Flink; + OldBlink = FreeEntry->FreeList.Blink; + OldBlink->Flink = OldFlink; + OldFlink->Blink = OldBlink; + + /* Update the freelists bitmap */ + if ((OldFlink == OldBlink) && + (Dedicated || (!Dedicated && FreeEntry->Size < HEAP_FREELISTS))) + { + RtlpClearFreeListsBit(Heap, FreeEntry); + } + + /* Fill with pattern if necessary */ + if (!NoFill && + (FreeEntry->Flags & HEAP_ENTRY_FILL_PATTERN)) + { + RealSize = (FreeEntry->Size << HEAP_ENTRY_SHIFT) - sizeof(*FreeEntry); + + /* Deduct extra stuff from block's real size */ + if (FreeEntry->Flags & HEAP_ENTRY_EXTRA_PRESENT && + RealSize > sizeof(HEAP_FREE_ENTRY_EXTRA)) + { + RealSize -= sizeof(HEAP_FREE_ENTRY_EXTRA); + } + + /* Check if the free filler is intact */ + Result = RtlCompareMemoryUlong((PCHAR)(FreeEntry + 1), + RealSize, + ARENA_FREE_FILLER); + + if (Result != RealSize) + { + DPRINT1("Free heap block %p modified at %p after it was freed\n", + FreeEntry, + (PCHAR)(FreeEntry + 1) + Result); + } + } +} + +SIZE_T NTAPI +RtlpGetSizeOfBigBlock(PHEAP_ENTRY HeapEntry) +{ + PHEAP_VIRTUAL_ALLOC_ENTRY VirtualEntry; + + /* Get pointer to the containing record */ + VirtualEntry = CONTAINING_RECORD(HeapEntry, HEAP_VIRTUAL_ALLOC_ENTRY, BusyBlock); + + /* Restore the real size */ + return VirtualEntry->CommitSize - HeapEntry->Size; +} + +PHEAP_UCR_DESCRIPTOR NTAPI +RtlpCreateUnCommittedRange(PHEAP_SEGMENT Segment) +{ + PLIST_ENTRY Entry; + PHEAP_UCR_DESCRIPTOR UcrDescriptor; + PHEAP_UCR_SEGMENT UcrSegment; + PHEAP Heap = Segment->Heap; + SIZE_T ReserveSize = 16 * PAGE_SIZE; + SIZE_T CommitSize = 1 * PAGE_SIZE; + NTSTATUS Status; + + DPRINT("RtlpCreateUnCommittedRange(%p)\n", Segment); + + /* Check if we have unused UCRs */ + if (IsListEmpty(&Heap->UCRList)) + { + /* Get a pointer to the first UCR segment */ + UcrSegment = CONTAINING_RECORD(&Heap->UCRSegments.Flink, HEAP_UCR_SEGMENT, ListEntry); + + /* Check the list of UCR segments */ + if (IsListEmpty(&Heap->UCRSegments) || + UcrSegment->ReservedSize == UcrSegment->CommittedSize) + { + /* We need to create a new one. Reserve 16 pages for it */ + UcrSegment = NULL; + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + (PVOID *)&UcrSegment, + 0, + &ReserveSize, + MEM_RESERVE, + PAGE_READWRITE); + + if (!NT_SUCCESS(Status)) return NULL; + + /* Commit one page */ + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + (PVOID *)&UcrSegment, + 0, + &CommitSize, + MEM_COMMIT, + PAGE_READWRITE); + + if (!NT_SUCCESS(Status)) + { + /* Release reserved memory */ + ZwFreeVirtualMemory(NtCurrentProcess(), + (PVOID *)&UcrDescriptor, + &ReserveSize, + MEM_RELEASE); + return NULL; + } + + /* Set it's data */ + UcrSegment->ReservedSize = ReserveSize; + UcrSegment->CommittedSize = CommitSize; + + /* Add it to the head of the list */ + InsertHeadList(&Heap->UCRSegments, &UcrSegment->ListEntry); + + /* Get a pointer to the first available UCR descriptor */ + UcrDescriptor = (PHEAP_UCR_DESCRIPTOR)(UcrSegment + 1); + } + else + { + /* It's possible to use existing UCR segment. Commit one more page */ + UcrDescriptor = (PHEAP_UCR_DESCRIPTOR)((PCHAR)UcrSegment + UcrSegment->CommittedSize); + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + (PVOID *)&UcrDescriptor, + 0, + &CommitSize, + MEM_COMMIT, + PAGE_READWRITE); + + if (!NT_SUCCESS(Status)) return NULL; + + /* Update sizes */ + UcrSegment->CommittedSize += CommitSize; + } + + /* There is a whole bunch of new UCR descriptors. Put them into the unused list */ + while ((PCHAR)UcrDescriptor < ((PCHAR)UcrSegment + UcrSegment->CommittedSize)) + { + InsertTailList(&Heap->UCRList, &UcrDescriptor->ListEntry); + UcrDescriptor++; + } + } + + /* There are unused UCRs, just get the first one */ + Entry = RemoveHeadList(&Heap->UCRList); + UcrDescriptor = CONTAINING_RECORD(Entry, HEAP_UCR_DESCRIPTOR, ListEntry); + return UcrDescriptor; +} + +VOID NTAPI +RtlpDestroyUnCommittedRange(PHEAP_SEGMENT Segment, + PHEAP_UCR_DESCRIPTOR UcrDescriptor) +{ + /* Zero it out */ + UcrDescriptor->Address = NULL; + UcrDescriptor->Size = 0; + + /* Put it into the heap's list of unused UCRs */ + InsertHeadList(&Segment->Heap->UCRList, &UcrDescriptor->ListEntry); +} + +VOID NTAPI +RtlpInsertUnCommittedPages(PHEAP_SEGMENT Segment, + ULONG_PTR Address, + SIZE_T Size) +{ + PLIST_ENTRY Current; + PHEAP_UCR_DESCRIPTOR UcrDescriptor; + + DPRINT("RtlpInsertUnCommittedPages(%p %p %x)\n", Segment, Address, Size); + + /* Go through the list of UCR descriptors, they are sorted from lowest address + to the highest */ + Current = Segment->UCRSegmentList.Flink; + while(Current != &Segment->UCRSegmentList) + { + UcrDescriptor = CONTAINING_RECORD(Current, HEAP_UCR_DESCRIPTOR, SegmentEntry); + + if ((ULONG_PTR)UcrDescriptor->Address > Address) + { + /* Check for a really lucky case */ + if ((Address + Size) == (ULONG_PTR)UcrDescriptor->Address) + { + /* Exact match */ + UcrDescriptor->Address = (PVOID)Address; + UcrDescriptor->Size += Size; + return; + } + + /* We found the block after which the new one should go */ + break; + } + else if (((ULONG_PTR)UcrDescriptor->Address + UcrDescriptor->Size) == Address) + { + /* Modify this entry */ + Address = (ULONG_PTR)UcrDescriptor->Address; + Size += UcrDescriptor->Size; + + /* Remove it from the list and destroy it */ + RemoveEntryList(Current); + RtlpDestroyUnCommittedRange(Segment, UcrDescriptor); + + Segment->NumberOfUnCommittedRanges--; + } + else + { + /* Advance to the next descriptor */ + Current = Current->Flink; + } + } + + /* Create a new UCR descriptor */ + UcrDescriptor = RtlpCreateUnCommittedRange(Segment); + if (!UcrDescriptor) return; + + UcrDescriptor->Address = (PVOID)Address; + UcrDescriptor->Size = Size; + + /* "Current" is the descriptor after which our one should go */ + InsertTailList(Current, &UcrDescriptor->SegmentEntry); + + DPRINT("Added segment UCR with base %p, size 0x%x\n", Address, Size); + + /* Increase counters */ + Segment->NumberOfUnCommittedRanges++; +} + +PHEAP_FREE_ENTRY NTAPI +RtlpFindAndCommitPages(PHEAP Heap, + PHEAP_SEGMENT Segment, + PSIZE_T Size, + PVOID AddressRequested) +{ + PLIST_ENTRY Current; + ULONG_PTR Address = 0; + PHEAP_UCR_DESCRIPTOR UcrDescriptor, PreviousUcr = NULL; + PHEAP_ENTRY FirstEntry, LastEntry, PreviousLastEntry; + NTSTATUS Status; + + DPRINT("RtlpFindAndCommitPages(%p %p %x %p)\n", Heap, Segment, *Size, Address); + + /* Go through UCRs in a segment */ + Current = Segment->UCRSegmentList.Flink; + while(Current != &Segment->UCRSegmentList) + { + UcrDescriptor = CONTAINING_RECORD(Current, HEAP_UCR_DESCRIPTOR, SegmentEntry); + + /* Check if we can use that one right away */ + if (UcrDescriptor->Size >= *Size && + (UcrDescriptor->Address == AddressRequested || !AddressRequested)) + { + /* Get the address */ + Address = (ULONG_PTR)UcrDescriptor->Address; + + /* Commit it */ + if (Heap->CommitRoutine) + { + Status = Heap->CommitRoutine(Heap, (PVOID *)&Address, Size); + } + else + { + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + (PVOID *)&Address, + 0, + Size, + MEM_COMMIT, + PAGE_READWRITE); + } + + DPRINT("Committed %d bytes at base %p, UCR size is %d\n", *Size, Address, UcrDescriptor->Size); + + /* Fail in unsuccessful case */ + if (!NT_SUCCESS(Status)) + { + DPRINT1("Committing page failed with status 0x%08X\n", Status); + return NULL; + } + + /* Update tracking numbers */ + Segment->NumberOfUnCommittedPages -= *Size / PAGE_SIZE; + + /* Calculate first and last entries */ + FirstEntry = (PHEAP_ENTRY)Address; + + if ((Segment->LastEntryInSegment->Flags & HEAP_ENTRY_LAST_ENTRY) && + (ULONG_PTR)(Segment->LastEntryInSegment + Segment->LastEntryInSegment->Size) == (ULONG_PTR)UcrDescriptor->Address) + { + LastEntry = Segment->LastEntryInSegment; + } + else + { + /* Go through the entries to find the last one */ + + if (PreviousUcr) + LastEntry = (PHEAP_ENTRY)((ULONG_PTR)PreviousUcr->Address + PreviousUcr->Size); + else + LastEntry = Segment->FirstEntry; + + while (!(LastEntry->Flags & HEAP_ENTRY_LAST_ENTRY)) + { + PreviousLastEntry = LastEntry; + LastEntry += LastEntry->Size; + + if ((ULONG_PTR)LastEntry >= (ULONG_PTR)Segment->LastValidEntry || + LastEntry->Size == 0) + { + if (LastEntry == (PHEAP_ENTRY)Address) + { + /* Found it */ + LastEntry = PreviousLastEntry; + break; + } + + DPRINT1("Last entry not found in a committed range near to %p\n", PreviousLastEntry); + return NULL; + } + } + } + + /* Unmark it as a last entry */ + LastEntry->Flags &= ~HEAP_ENTRY_LAST_ENTRY; + + /* Update UCR descriptor */ + UcrDescriptor->Address = (PVOID)((ULONG_PTR)UcrDescriptor->Address + *Size); + UcrDescriptor->Size -= *Size; + + DPRINT("Updating UcrDescriptor %p, new Address %p, size %d\n", + UcrDescriptor, UcrDescriptor->Address, UcrDescriptor->Size); + + /* Check if anything left in this UCR */ + if (UcrDescriptor->Size == 0) + { + /* It's fully exhausted */ + if (UcrDescriptor->Address == Segment->LastValidEntry) + { + FirstEntry->Flags = HEAP_ENTRY_LAST_ENTRY; + Segment->LastEntryInSegment = FirstEntry; + } + else + { + FirstEntry->Flags = 0; + Segment->LastEntryInSegment = Segment->FirstEntry; + } + + /* This UCR needs to be removed because it became useless */ + RemoveEntryList(&UcrDescriptor->SegmentEntry); + + RtlpDestroyUnCommittedRange(Segment, UcrDescriptor); + Segment->NumberOfUnCommittedRanges--; + } + else + { + FirstEntry->Flags = HEAP_ENTRY_LAST_ENTRY; + Segment->LastEntryInSegment = FirstEntry; + } + + /* Set various first entry fields*/ + FirstEntry->SegmentOffset = LastEntry->SegmentOffset; + FirstEntry->Size = *Size >> HEAP_ENTRY_SHIFT; + FirstEntry->PreviousSize = LastEntry->Size; + + /* Update previous size */ + if (!(FirstEntry->Flags & HEAP_ENTRY_LAST_ENTRY)) + (FirstEntry + FirstEntry->Size)->PreviousSize = FirstEntry->Size; + + /* We're done */ + return (PHEAP_FREE_ENTRY)FirstEntry; + } + + /* Advance to the next descriptor */ + PreviousUcr = UcrDescriptor; + Current = Current->Flink; + } + + return NULL; +} + +VOID NTAPI +RtlpDeCommitFreeBlock(PHEAP Heap, + PHEAP_FREE_ENTRY FreeEntry, + SIZE_T Size) +{ + PHEAP_SEGMENT Segment; + PHEAP_ENTRY PrecedingInUseEntry = NULL, NextInUseEntry = NULL; + PHEAP_FREE_ENTRY NextFreeEntry; + PHEAP_UCR_DESCRIPTOR UcrDescriptor; + ULONG PrecedingSize, NextSize, DecommitSize; + ULONG_PTR DecommitBase; + NTSTATUS Status; + + DPRINT("Decommitting %p %p %x\n", Heap, FreeEntry, Size); + + /* We can't decommit if there is a commit routine! */ + if (Heap->CommitRoutine) + { + /* Just add it back the usual way */ + RtlpInsertFreeBlock(Heap, FreeEntry, Size); + return; + } + + /* Get the segment */ + Segment = Heap->Segments[FreeEntry->SegmentOffset]; + + /* Get the preceding entry */ + DecommitBase = ROUND_UP(FreeEntry, PAGE_SIZE); + PrecedingSize = (PHEAP_ENTRY)DecommitBase - (PHEAP_ENTRY)FreeEntry; + + if (PrecedingSize == 1) + { + /* Just 1 heap entry, increase the base/size */ + DecommitBase += PAGE_SIZE; + PrecedingSize += PAGE_SIZE >> HEAP_ENTRY_SHIFT; + } + else if (FreeEntry->PreviousSize && + (DecommitBase == (ULONG_PTR)FreeEntry)) + { + PrecedingInUseEntry = (PHEAP_ENTRY)FreeEntry - FreeEntry->PreviousSize; + } + + /* Get the next entry */ + NextFreeEntry = (PHEAP_FREE_ENTRY)((PHEAP_ENTRY)FreeEntry + Size); + DecommitSize = ROUND_DOWN(NextFreeEntry, PAGE_SIZE); + NextSize = (PHEAP_ENTRY)NextFreeEntry - (PHEAP_ENTRY)DecommitSize; + + if (NextSize == 1) + { + /* Just 1 heap entry, increase the size */ + DecommitSize -= PAGE_SIZE; + NextSize += PAGE_SIZE >> HEAP_ENTRY_SHIFT; + } + else if (NextSize == 0 && + !(FreeEntry->Flags & HEAP_ENTRY_LAST_ENTRY)) + { + NextInUseEntry = (PHEAP_ENTRY)NextFreeEntry; + } + + NextFreeEntry = (PHEAP_FREE_ENTRY)((PHEAP_ENTRY)NextFreeEntry - NextSize); + + /* Calculate real decommit size */ + if (DecommitSize > DecommitBase) + { + DecommitSize -= DecommitBase; + } + else + { + /* Nothing to decommit */ + RtlpInsertFreeBlock(Heap, FreeEntry, Size); + return; + } + + /* A decommit is necessary. Create a UCR descriptor */ + UcrDescriptor = RtlpCreateUnCommittedRange(Segment); + if (!UcrDescriptor) + { + DPRINT1("HEAP: Failed to create UCR descriptor\n"); + RtlpInsertFreeBlock(Heap, FreeEntry, PrecedingSize); + return; + } + + /* Decommit the memory */ + Status = ZwFreeVirtualMemory(NtCurrentProcess(), + (PVOID *)&DecommitBase, + &DecommitSize, + MEM_DECOMMIT); + + /* Delete that UCR. This is needed to assure there is an unused UCR entry in the list */ + RtlpDestroyUnCommittedRange(Segment, UcrDescriptor); + + if (!NT_SUCCESS(Status)) + { + RtlpInsertFreeBlock(Heap, FreeEntry, Size); + return; + } + + /* Insert uncommitted pages */ + RtlpInsertUnCommittedPages(Segment, DecommitBase, DecommitSize); + Segment->NumberOfUnCommittedPages += (DecommitSize / PAGE_SIZE); + + if (PrecedingSize) + { + /* Adjust size of this free entry and insert it */ + FreeEntry->Flags = HEAP_ENTRY_LAST_ENTRY; + FreeEntry->Size = PrecedingSize; + Heap->TotalFreeSize += PrecedingSize; + + /* Set last entry in the segment to this entry */ + Segment->LastEntryInSegment = (PHEAP_ENTRY)FreeEntry; + + /* Insert it into the free list */ + RtlpInsertFreeBlockHelper(Heap, FreeEntry, PrecedingSize, FALSE); + } + else if (PrecedingInUseEntry) + { + /* Adjust preceding in use entry */ + PrecedingInUseEntry->Flags |= HEAP_ENTRY_LAST_ENTRY; + Segment->LastEntryInSegment = PrecedingInUseEntry; + } else if ((ULONG_PTR)Segment->LastEntryInSegment >= DecommitBase && + ((PCHAR)Segment->LastEntryInSegment < ((PCHAR)DecommitBase + DecommitSize))) + { + /* Update this segment's last entry */ + Segment->LastEntryInSegment = Segment->FirstEntry; + } + + /* Now the next one */ + if (NextSize) + { + /* Adjust size of this free entry and insert it */ + NextFreeEntry->Flags = 0; + NextFreeEntry->PreviousSize = 0; + NextFreeEntry->SegmentOffset = Segment->Entry.SegmentOffset; + NextFreeEntry->Size = NextSize; + + ((PHEAP_FREE_ENTRY)((PHEAP_ENTRY)NextFreeEntry + NextSize))->PreviousSize = NextSize; + + Heap->TotalFreeSize += NextSize; + RtlpInsertFreeBlockHelper(Heap, NextFreeEntry, NextSize, FALSE); + } + else if (NextInUseEntry) + { + NextInUseEntry->PreviousSize = 0; + } +} + +BOOLEAN NTAPI +RtlpInitializeHeapSegment(PHEAP Heap, + PHEAP_SEGMENT Segment, + UCHAR SegmentIndex, + ULONG Flags, + PVOID BaseAddress, + PVOID UncommittedBase, + PVOID LimitAddress) +{ + ULONG Pages, CommitSize; + PHEAP_ENTRY HeapEntry; + USHORT PreviousSize = 0, NewSize; + NTSTATUS Status; + + Pages = ((PCHAR)LimitAddress - (PCHAR)BaseAddress) / PAGE_SIZE; + + HeapEntry = (PHEAP_ENTRY)ROUND_UP(Segment + 1, HEAP_ENTRY_SIZE); + + DPRINT("RtlpInitializeHeapSegment(%p %p %x %x %p %p %p)\n", Heap, Segment, SegmentIndex, Flags, BaseAddress, UncommittedBase, LimitAddress); + DPRINT("Pages %x, HeapEntry %p, sizeof(HEAP_SEGMENT) %x\n", Pages, HeapEntry, sizeof(HEAP_SEGMENT)); + + /* Check if it's the first segment and remember its size */ + if (Heap == BaseAddress) + PreviousSize = Heap->Entry.Size; + + NewSize = ((PCHAR)HeapEntry - (PCHAR)Segment) >> HEAP_ENTRY_SHIFT; + + if ((PVOID)(HeapEntry + 1) >= UncommittedBase) + { + /* Check if it goes beyond the limit */ + if ((PVOID)(HeapEntry + 1) >= LimitAddress) + return FALSE; + + /* Need to commit memory */ + CommitSize = (PCHAR)(HeapEntry + 1) - (PCHAR)UncommittedBase; + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + (PVOID)&UncommittedBase, + 0, + &CommitSize, + MEM_COMMIT, + PAGE_READWRITE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Committing page failed with status 0x%08X\n", Status); + return FALSE; + } + + DPRINT("Committed %d bytes at base %p\n", CommitSize, UncommittedBase); + + /* Calcule the new uncommitted base */ + UncommittedBase = (PVOID)((PCHAR)UncommittedBase + CommitSize); + } + + /* Initialize the segment entry */ + Segment->Entry.PreviousSize = PreviousSize; + Segment->Entry.Size = NewSize; + Segment->Entry.Flags = HEAP_ENTRY_BUSY; + Segment->Entry.SegmentOffset = SegmentIndex; + + /* Initialize the segment itself */ + Segment->SegmentSignature = HEAP_SEGMENT_SIGNATURE; + Segment->Heap = Heap; + Segment->BaseAddress = BaseAddress; + Segment->FirstEntry = HeapEntry; + Segment->LastValidEntry = (PHEAP_ENTRY)((PCHAR)BaseAddress + Pages * PAGE_SIZE); + Segment->NumberOfPages = Pages; + Segment->NumberOfUnCommittedPages = ((PCHAR)LimitAddress - (PCHAR)UncommittedBase) / PAGE_SIZE; + InitializeListHead(&Segment->UCRSegmentList); + + /* Insert uncommitted pages into UCR (uncommitted ranges) list */ + if (Segment->NumberOfUnCommittedPages) + { + RtlpInsertUnCommittedPages(Segment, (ULONG_PTR)UncommittedBase, Segment->NumberOfUnCommittedPages * PAGE_SIZE); + } + + /* Set the segment index pointer */ + Heap->Segments[SegmentIndex] = Segment; + + /* Prepare a free heap entry */ + HeapEntry->Flags = HEAP_ENTRY_LAST_ENTRY; + HeapEntry->PreviousSize = Segment->Entry.Size; + HeapEntry->SegmentOffset = SegmentIndex; + + /* Set last entry in segment */ + Segment->LastEntryInSegment = HeapEntry; + + /* Insert it */ + RtlpInsertFreeBlock(Heap, (PHEAP_FREE_ENTRY)HeapEntry, (PHEAP_ENTRY)UncommittedBase - HeapEntry); + + return TRUE; +} + +VOID NTAPI +RtlpDestroyHeapSegment(PHEAP_SEGMENT Segment) +{ + NTSTATUS Status; + PVOID BaseAddress; + SIZE_T Size = 0; + + /* Make sure it's not user allocated */ + if (Segment->SegmentFlags & HEAP_USER_ALLOCATED) return; + + BaseAddress = Segment->BaseAddress; + DPRINT("Destroying segment %p, BA %p\n", Segment, BaseAddress); + + /* Release virtual memory */ + Status = ZwFreeVirtualMemory(NtCurrentProcess(), + &BaseAddress, + &Size, + MEM_RELEASE); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("HEAP: Failed to release segment's memory with status 0x%08X\n", Status); + } +} + +/* Usermode only! */ +VOID NTAPI +RtlpAddHeapToProcessList(PHEAP Heap) +{ + PPEB Peb; + + /* Get PEB */ + Peb = RtlGetCurrentPeb(); + + /* Acquire the lock */ + RtlEnterHeapLock(&RtlpProcessHeapsListLock); + + //_SEH2_TRY { + /* Check if max number of heaps reached */ + if (Peb->NumberOfHeaps == Peb->MaximumNumberOfHeaps) + { + // TODO: Handle this case + ASSERT(FALSE); + } + + /* Add the heap to the process heaps */ + Peb->ProcessHeaps[Peb->NumberOfHeaps] = Heap; + Peb->NumberOfHeaps++; + Heap->ProcessHeapsListIndex = Peb->NumberOfHeaps; + // } _SEH2_FINALLY { + + /* Release the lock */ + RtlLeaveHeapLock(&RtlpProcessHeapsListLock); + + // } _SEH2_END +} + +/* Usermode only! */ +VOID NTAPI +RtlpRemoveHeapFromProcessList(PHEAP Heap) +{ + PPEB Peb; + PHEAP *Current, *Next; + ULONG Count; + + /* Get PEB */ + Peb = RtlGetCurrentPeb(); + + /* Acquire the lock */ + RtlEnterHeapLock(&RtlpProcessHeapsListLock); + + /* Check if we don't need anything to do */ + if ((Heap->ProcessHeapsListIndex == 0) || + (Heap->ProcessHeapsListIndex > Peb->NumberOfHeaps) || + (Peb->NumberOfHeaps == 0)) + { + /* Release the lock */ + RtlLeaveHeapLock(&RtlpProcessHeapsListLock); + + return; + } + + /* The process actually has more than one heap. + Use classic, lernt from university times algorithm for removing an entry + from a static array */ + + Current = (PHEAP *)&Peb->ProcessHeaps[Heap->ProcessHeapsListIndex - 1]; + Next = Current + 1; + + /* How many items we need to shift to the left */ + Count = Peb->NumberOfHeaps - (Heap->ProcessHeapsListIndex - 1); + + /* Move them all in a loop */ + while (--Count) + { + /* Copy it and advance next pointer */ + *Current = *Next; + + /* Update its index */ + (*Current)->ProcessHeapsListIndex -= 1; + + /* Advance pointers */ + Current++; + Next++; + } + + /* Decrease total number of heaps */ + Peb->NumberOfHeaps--; + + /* Zero last unused item */ + Peb->ProcessHeaps[Peb->NumberOfHeaps] = NULL; + Heap->ProcessHeapsListIndex = 0; + + /* Release the lock */ + RtlLeaveHeapLock(&RtlpProcessHeapsListLock); +} + +PHEAP_FREE_ENTRY NTAPI +RtlpCoalesceHeap(PHEAP Heap) +{ + UNIMPLEMENTED; + return NULL; +} + +PHEAP_FREE_ENTRY NTAPI +RtlpCoalesceFreeBlocks (PHEAP Heap, + PHEAP_FREE_ENTRY FreeEntry, + PSIZE_T FreeSize, + BOOLEAN Remove) +{ + PHEAP_FREE_ENTRY CurrentEntry, NextEntry; + + /* Get the previous entry */ + CurrentEntry = (PHEAP_FREE_ENTRY)((PHEAP_ENTRY)FreeEntry - FreeEntry->PreviousSize); + + /* Check it */ + if (CurrentEntry != FreeEntry && + !(CurrentEntry->Flags & HEAP_ENTRY_BUSY) && + (*FreeSize + CurrentEntry->Size) <= HEAP_MAX_BLOCK_SIZE) + { + ASSERT(FreeEntry->PreviousSize == CurrentEntry->Size); + + /* Remove it if asked for */ + if (Remove) + { + RtlpRemoveFreeBlock(Heap, FreeEntry, FALSE, FALSE); + Heap->TotalFreeSize -= FreeEntry->Size; + + /* Remove it only once! */ + Remove = FALSE; + } + + /* Remove previous entry too */ + RtlpRemoveFreeBlock(Heap, CurrentEntry, FALSE, FALSE); + + /* Copy flags */ + CurrentEntry->Flags = FreeEntry->Flags & HEAP_ENTRY_LAST_ENTRY; + + /* Update last entry in the segment */ + if (CurrentEntry->Flags & HEAP_ENTRY_LAST_ENTRY) + Heap->Segments[CurrentEntry->SegmentOffset]->LastEntryInSegment = (PHEAP_ENTRY)CurrentEntry; + + /* Advance FreeEntry and update sizes */ + FreeEntry = CurrentEntry; + *FreeSize = *FreeSize + CurrentEntry->Size; + Heap->TotalFreeSize -= CurrentEntry->Size; + FreeEntry->Size = *FreeSize; + + /* Also update previous size if needed */ + if (!(FreeEntry->Flags & HEAP_ENTRY_LAST_ENTRY)) + { + ((PHEAP_ENTRY)FreeEntry + *FreeSize)->PreviousSize = *FreeSize; + } + } + + /* Check the next block if it exists */ + if (!(FreeEntry->Flags & HEAP_ENTRY_LAST_ENTRY)) + { + NextEntry = (PHEAP_FREE_ENTRY)((PHEAP_ENTRY)FreeEntry + *FreeSize); + + if (!(NextEntry->Flags & HEAP_ENTRY_BUSY) && + NextEntry->Size + *FreeSize <= HEAP_MAX_BLOCK_SIZE) + { + ASSERT(*FreeSize == NextEntry->PreviousSize); + + /* Remove it if asked for */ + if (Remove) + { + RtlpRemoveFreeBlock(Heap, FreeEntry, FALSE, FALSE); + Heap->TotalFreeSize -= FreeEntry->Size; + } + + /* Copy flags */ + FreeEntry->Flags = NextEntry->Flags & HEAP_ENTRY_LAST_ENTRY; + + /* Update last entry in the segment */ + if (FreeEntry->Flags & HEAP_ENTRY_LAST_ENTRY) + Heap->Segments[FreeEntry->SegmentOffset]->LastEntryInSegment = (PHEAP_ENTRY)FreeEntry; + + /* Remove next entry now */ + RtlpRemoveFreeBlock(Heap, NextEntry, FALSE, FALSE); + + /* Update sizes */ + *FreeSize = *FreeSize + NextEntry->Size; + Heap->TotalFreeSize -= NextEntry->Size; + FreeEntry->Size = *FreeSize; + + /* Also update previous size if needed */ + if (!(FreeEntry->Flags & HEAP_ENTRY_LAST_ENTRY)) + { + ((PHEAP_ENTRY)FreeEntry + *FreeSize)->PreviousSize = *FreeSize; + } + } + } + return FreeEntry; +} + +PHEAP_FREE_ENTRY NTAPI +RtlpExtendHeap(PHEAP Heap, + SIZE_T Size) +{ + ULONG Pages; + UCHAR Index, EmptyIndex; + SIZE_T FreeSize, CommitSize, ReserveSize; + PHEAP_SEGMENT Segment; + PHEAP_FREE_ENTRY FreeEntry; + NTSTATUS Status; + + DPRINT("RtlpExtendHeap(%p %x)\n", Heap, Size); + + /* Calculate amount in pages */ + Pages = (Size + PAGE_SIZE - 1) / PAGE_SIZE; + FreeSize = Pages * PAGE_SIZE; + DPRINT("Pages %x, FreeSize %x. Going through segments...\n", Pages, FreeSize); + + /* Find an empty segment */ + EmptyIndex = HEAP_SEGMENTS; + for (Index = 0; Index < HEAP_SEGMENTS; Index++) + { + Segment = Heap->Segments[Index]; + + if (Segment) DPRINT("Segment[%d] %p with NOUCP %x\n", Index, Segment, Segment->NumberOfUnCommittedPages); + + /* Check if its size suits us */ + if (Segment && + Pages <= Segment->NumberOfUnCommittedPages) + { + DPRINT("This segment is suitable\n"); + + /* Commit needed amount */ + FreeEntry = RtlpFindAndCommitPages(Heap, Segment, &FreeSize, NULL); + + /* Coalesce it with adjacent entries */ + if (FreeEntry) + { + FreeSize = FreeSize >> HEAP_ENTRY_SHIFT; + FreeEntry = RtlpCoalesceFreeBlocks(Heap, FreeEntry, &FreeSize, FALSE); + RtlpInsertFreeBlock(Heap, FreeEntry, FreeSize); + return FreeEntry; + } + } + else if (!Segment && + EmptyIndex == HEAP_SEGMENTS) + { + /* Remember the first unused segment index */ + EmptyIndex = Index; + } + } + + /* No luck, need to grow the heap */ + if ((Heap->Flags & HEAP_GROWABLE) && + (EmptyIndex != HEAP_SEGMENTS)) + { + Segment = NULL; + + /* Reserve the memory */ + if ((Size + PAGE_SIZE) <= Heap->SegmentReserve) + ReserveSize = Heap->SegmentReserve; + else + ReserveSize = Size + PAGE_SIZE; + + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + (PVOID)&Segment, + 0, + &ReserveSize, + MEM_RESERVE, + PAGE_READWRITE); + + /* If it failed, retry again with a half division algorithm */ + while (!NT_SUCCESS(Status) && + ReserveSize != Size + PAGE_SIZE) + { + ReserveSize /= 2; + + if (ReserveSize < (Size + PAGE_SIZE)) + ReserveSize = Size + PAGE_SIZE; + + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + (PVOID)&Segment, + 0, + &ReserveSize, + MEM_RESERVE, + PAGE_READWRITE); + } + + /* Proceed only if it's success */ + if (NT_SUCCESS(Status)) + { + Heap->SegmentReserve += ReserveSize; + + /* Now commit the memory */ + if ((Size + PAGE_SIZE) <= Heap->SegmentCommit) + CommitSize = Heap->SegmentCommit; + else + CommitSize = Size + PAGE_SIZE; + + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + (PVOID)&Segment, + 0, + &CommitSize, + MEM_COMMIT, + PAGE_READWRITE); + + DPRINT("Committed %d bytes at base %p\n", CommitSize, Segment); + + /* Initialize heap segment if commit was successful */ + if (NT_SUCCESS(Status)) + { + if (!RtlpInitializeHeapSegment(Heap, Segment, EmptyIndex, 0, Segment, + (PCHAR)Segment + CommitSize, (PCHAR)Segment + ReserveSize)) + { + Status = STATUS_NO_MEMORY; + } + } + + /* If everything worked - cool */ + if (NT_SUCCESS(Status)) return (PHEAP_FREE_ENTRY)Segment->FirstEntry; + + DPRINT1("Committing failed with status 0x%08X\n", Status); + + /* Nope, we failed. Free memory */ + ZwFreeVirtualMemory(NtCurrentProcess(), + (PVOID)&Segment, + &ReserveSize, + MEM_RELEASE); + } + else + { + DPRINT1("Reserving failed with status 0x%08X\n", Status); + } + } + + if (RtlpGetMode() == UserMode) + { + /* If coalescing on free is disabled in usermode, then do it here */ + if (Heap->Flags & HEAP_DISABLE_COALESCE_ON_FREE) + { + FreeEntry = RtlpCoalesceHeap(Heap); + + /* If it's a suitable one - return it */ + if (FreeEntry && + FreeEntry->Size >= Size) + { + return FreeEntry; + } + } + } + + return NULL; +} + +/*********************************************************************** + * RtlCreateHeap + * RETURNS + * Handle of heap: Success + * NULL: Failure + * + * @implemented + */ +HANDLE NTAPI +RtlCreateHeap(ULONG Flags, + PVOID Addr, + SIZE_T TotalSize, + SIZE_T CommitSize, + PVOID Lock, + PRTL_HEAP_PARAMETERS Parameters) +{ + PVOID CommittedAddress = NULL, UncommittedAddress = NULL; + PHEAP Heap = NULL; + RTL_HEAP_PARAMETERS SafeParams = {0}; + PPEB Peb; + ULONG_PTR MaximumUserModeAddress; + SYSTEM_BASIC_INFORMATION SystemInformation; + MEMORY_BASIC_INFORMATION MemoryInfo; + ULONG NtGlobalFlags = RtlGetNtGlobalFlags(); + ULONG HeapSegmentFlags = 0; + NTSTATUS Status; + ULONG MaxBlockSize, HeaderSize; + BOOLEAN AllocateLock = FALSE; + + /* Check for a special heap */ + if (RtlpPageHeapEnabled && !Addr && !Lock) + { + Heap = RtlpPageHeapCreate(Flags, Addr, TotalSize, CommitSize, Lock, Parameters); + if (Heap) return Heap; + + //ASSERT(FALSE); + DPRINT1("Enabling page heap failed\n"); + } + + /* Check validation flags */ + if (!(Flags & HEAP_SKIP_VALIDATION_CHECKS) && (Flags & ~HEAP_CREATE_VALID_MASK)) + { + DPRINT1("Invalid flags 0x%08x, fixing...\n", Flags); + Flags &= HEAP_CREATE_VALID_MASK; + } + + /* TODO: Capture parameters, once we decide to use SEH */ + if (!Parameters) Parameters = &SafeParams; + + /* Check global flags */ + if (NtGlobalFlags & FLG_HEAP_DISABLE_COALESCING) + Flags |= HEAP_DISABLE_COALESCE_ON_FREE; + + if (NtGlobalFlags & FLG_HEAP_ENABLE_FREE_CHECK) + Flags |= HEAP_FREE_CHECKING_ENABLED; + + if (NtGlobalFlags & FLG_HEAP_ENABLE_TAIL_CHECK) + Flags |= HEAP_TAIL_CHECKING_ENABLED; + + if (RtlpGetMode() == UserMode) + { + /* Also check these flags if in usermode */ + if (NtGlobalFlags & FLG_HEAP_VALIDATE_ALL) + Flags |= HEAP_VALIDATE_ALL_ENABLED; + + if (NtGlobalFlags & FLG_HEAP_VALIDATE_PARAMETERS) + Flags |= HEAP_VALIDATE_PARAMETERS_ENABLED; + + if (NtGlobalFlags & FLG_USER_STACK_TRACE_DB) + Flags |= HEAP_CAPTURE_STACK_BACKTRACES; + + /* Get PEB */ + Peb = RtlGetCurrentPeb(); + + /* Apply defaults for non-set parameters */ + if (!Parameters->SegmentCommit) Parameters->SegmentCommit = Peb->HeapSegmentCommit; + if (!Parameters->SegmentReserve) Parameters->SegmentReserve = Peb->HeapSegmentReserve; + if (!Parameters->DeCommitFreeBlockThreshold) Parameters->DeCommitFreeBlockThreshold = Peb->HeapDeCommitFreeBlockThreshold; + if (!Parameters->DeCommitTotalFreeThreshold) Parameters->DeCommitTotalFreeThreshold = Peb->HeapDeCommitTotalFreeThreshold; + } + else + { + /* Apply defaults for non-set parameters */ +#if 0 + if (!Parameters->SegmentCommit) Parameters->SegmentCommit = MmHeapSegmentCommit; + if (!Parameters->SegmentReserve) Parameters->SegmentReserve = MmHeapSegmentReserve; + if (!Parameters->DeCommitFreeBlockThreshold) Parameters->DeCommitFreeBlockThreshold = MmHeapDeCommitFreeBlockThreshold; + if (!Parameters->DeCommitTotalFreeThreshold) Parameters->DeCommitTotalFreeThreshold = MmHeapDeCommitTotalFreeThreshold; +#endif + } + + // FIXME: Move to memory manager + if (!Parameters->SegmentCommit) Parameters->SegmentCommit = PAGE_SIZE * 2; + if (!Parameters->SegmentReserve) Parameters->SegmentReserve = 1048576; + if (!Parameters->DeCommitFreeBlockThreshold) Parameters->DeCommitFreeBlockThreshold = PAGE_SIZE; + if (!Parameters->DeCommitTotalFreeThreshold) Parameters->DeCommitTotalFreeThreshold = 65536; + + /* Get the max um address */ + Status = ZwQuerySystemInformation(SystemBasicInformation, + &SystemInformation, + sizeof(SystemInformation), + NULL); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("Getting max usermode address failed with status 0x%08x\n", Status); + return NULL; + } + + MaximumUserModeAddress = SystemInformation.MaximumUserModeAddress; + + /* Calculate max alloc size */ + if (!Parameters->MaximumAllocationSize) + Parameters->MaximumAllocationSize = MaximumUserModeAddress - (ULONG_PTR)0x10000 - PAGE_SIZE; + + MaxBlockSize = 0x80000 - PAGE_SIZE; + + if (!Parameters->VirtualMemoryThreshold || + Parameters->VirtualMemoryThreshold > MaxBlockSize) + { + Parameters->VirtualMemoryThreshold = MaxBlockSize; + } + + /* Check reserve/commit sizes and set default values */ + if (!CommitSize) + { + CommitSize = PAGE_SIZE; + if (TotalSize) + TotalSize = ROUND_UP(TotalSize, PAGE_SIZE); + else + TotalSize = 64 * PAGE_SIZE; + } + else + { + /* Round up the commit size to be at least the page size */ + CommitSize = ROUND_UP(CommitSize, PAGE_SIZE); + + if (TotalSize) + TotalSize = ROUND_UP(TotalSize, PAGE_SIZE); + else + TotalSize = ROUND_UP(CommitSize, 16 * PAGE_SIZE); + } + + /* Call special heap */ + if (RtlpHeapIsSpecial(Flags)) + return RtlDebugCreateHeap(Flags, Addr, TotalSize, CommitSize, Lock, Parameters); + + /* Calculate header size */ + HeaderSize = sizeof(HEAP); + if (!(Flags & HEAP_NO_SERIALIZE)) + { + if (Lock) + { + Flags |= HEAP_LOCK_USER_ALLOCATED; + } + else + { + HeaderSize += sizeof(HEAP_LOCK); + AllocateLock = TRUE; + } + } + else if (Lock) + { + /* Invalid parameters */ + return NULL; + } + + /* See if we are already provided with an address for the heap */ + if (Addr) + { + if (Parameters->CommitRoutine) + { + /* There is a commit routine, so no problem here, check params */ + if ((Flags & HEAP_GROWABLE) || + !Parameters->InitialCommit || + !Parameters->InitialReserve || + (Parameters->InitialCommit > Parameters->InitialReserve)) + { + /* Fail */ + return NULL; + } + + /* Calculate committed and uncommitted addresses */ + CommittedAddress = Addr; + UncommittedAddress = (PCHAR)Addr + Parameters->InitialCommit; + TotalSize = Parameters->InitialReserve; + + /* Zero the initial page ourselves */ + RtlZeroMemory(CommittedAddress, PAGE_SIZE); + } + else + { + /* Commit routine is absent, so query how much memory caller reserved */ + Status = ZwQueryVirtualMemory(NtCurrentProcess(), + Addr, + MemoryBasicInformation, + &MemoryInfo, + sizeof(MemoryInfo), + NULL); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("Querying amount of user supplied memory failed with status 0x%08X\n", Status); + return NULL; + } + + /* Validate it */ + if (MemoryInfo.BaseAddress != Addr || + MemoryInfo.State == MEM_FREE) + { + return NULL; + } + + /* Validation checks passed, set committed/uncommitted addresses */ + CommittedAddress = Addr; + + /* Check if it's committed or not */ + if (MemoryInfo.State == MEM_COMMIT) + { + /* Zero it out because it's already committed */ + RtlZeroMemory(CommittedAddress, PAGE_SIZE); + + /* Calculate uncommitted address value */ + CommitSize = MemoryInfo.RegionSize; + TotalSize = CommitSize; + UncommittedAddress = (PCHAR)Addr + CommitSize; + + /* Check if uncommitted address is reserved */ + Status = ZwQueryVirtualMemory(NtCurrentProcess(), + UncommittedAddress, + MemoryBasicInformation, + &MemoryInfo, + sizeof(MemoryInfo), + NULL); + + if (NT_SUCCESS(Status) && + MemoryInfo.State == MEM_RESERVE) + { + /* It is, so add it up to the reserve size */ + TotalSize += MemoryInfo.RegionSize; + } + } + else + { + /* It's not committed, inform following code that a commit is necessary */ + CommitSize = PAGE_SIZE; + UncommittedAddress = Addr; + } + } + + /* Mark this as a user-committed mem */ + HeapSegmentFlags = HEAP_USER_ALLOCATED; + Heap = (PHEAP)Addr; + } + else + { + /* Check commit routine */ + if (Parameters->CommitRoutine) return NULL; + + /* Reserve memory */ + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + (PVOID *)&Heap, + 0, + &TotalSize, + MEM_RESERVE, + PAGE_READWRITE); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to reserve memory with status 0x%08x\n", Status); + return NULL; + } + + /* Set base addresses */ + CommittedAddress = Heap; + UncommittedAddress = Heap; + } + + /* Check if we need to commit something */ + if (CommittedAddress == UncommittedAddress) + { + /* Commit the required size */ + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + &CommittedAddress, + 0, + &CommitSize, + MEM_COMMIT, + PAGE_READWRITE); + + DPRINT("Committed %d bytes at base %p\n", CommitSize, CommittedAddress); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failure, Status 0x%08X\n", Status); + + /* Release memory if it was reserved */ + if (!Addr) ZwFreeVirtualMemory(NtCurrentProcess(), + (PVOID *)&Heap, + &TotalSize, + MEM_RELEASE); + + return NULL; + } + + /* Calculate new uncommitted address */ + UncommittedAddress = (PCHAR)UncommittedAddress + CommitSize; + } + + DPRINT("Created heap %p, CommitSize %x, ReserveSize %x\n", Heap, CommitSize, TotalSize); + + /* Initialize the heap */ + RtlpInitializeHeap(Heap, &HeaderSize, Flags, AllocateLock, Lock); + + /* Initialize heap's first segment */ + if (!RtlpInitializeHeapSegment(Heap, + (PHEAP_SEGMENT)((PCHAR)Heap + HeaderSize), + 0, + HeapSegmentFlags, + CommittedAddress, + UncommittedAddress, + (PCHAR)CommittedAddress + TotalSize)) + { + DPRINT1("Failed to initialize heap segment\n"); + return NULL; + } + + /* Set other data */ + Heap->ProcessHeapsListIndex = 0; + Heap->SegmentCommit = Parameters->SegmentCommit; + Heap->SegmentReserve = Parameters->SegmentReserve; + Heap->DeCommitFreeBlockThreshold = Parameters->DeCommitFreeBlockThreshold >> HEAP_ENTRY_SHIFT; + Heap->DeCommitTotalFreeThreshold = Parameters->DeCommitTotalFreeThreshold >> HEAP_ENTRY_SHIFT; + Heap->MaximumAllocationSize = Parameters->MaximumAllocationSize; + Heap->VirtualMemoryThreshold = ROUND_UP(Parameters->VirtualMemoryThreshold, HEAP_ENTRY_SIZE) >> HEAP_ENTRY_SHIFT; + Heap->CommitRoutine = Parameters->CommitRoutine; + + /* Set alignment */ + if (Flags & HEAP_CREATE_ALIGN_16) + { + Heap->AlignMask = (ULONG)~15; + Heap->AlignRound = 15 + sizeof(HEAP_ENTRY); + } + else + { + Heap->AlignMask = (ULONG)~(HEAP_ENTRY_SIZE - 1); + Heap->AlignRound = HEAP_ENTRY_SIZE - 1 + sizeof(HEAP_ENTRY); + } + + if (Heap->Flags & HEAP_TAIL_CHECKING_ENABLED) + Heap->AlignRound += HEAP_ENTRY_SIZE; + + /* Add heap to process list in case of usermode heap */ + if (RtlpGetMode() == UserMode) + { + RtlpAddHeapToProcessList(Heap); + + // FIXME: What about lookasides? + } + + DPRINT("Heap %p, flags 0x%08x\n", Heap, Heap->Flags); + return Heap; +} + +/*********************************************************************** + * RtlDestroyHeap + * RETURNS + * TRUE: Success + * FALSE: Failure + * + * @implemented + * + * RETURNS + * Success: A NULL HANDLE, if heap is NULL or it was destroyed + * Failure: The Heap handle, if heap is the process heap. + */ +HANDLE NTAPI +RtlDestroyHeap(HANDLE HeapPtr) /* [in] Handle of heap */ +{ + PHEAP Heap = (PHEAP)HeapPtr; + PLIST_ENTRY Current; + PHEAP_UCR_SEGMENT UcrSegment; + PHEAP_VIRTUAL_ALLOC_ENTRY VirtualEntry; + PVOID BaseAddress; + SIZE_T Size; + LONG i; + PHEAP_SEGMENT Segment; + + if (!HeapPtr) return NULL; + + /* Call special heap */ + if (RtlpHeapIsSpecial(Heap->Flags)) + { + if (!RtlDebugDestroyHeap(Heap)) return HeapPtr; + } + + /* Check for a process heap */ + if (RtlpGetMode() == UserMode && + HeapPtr == NtCurrentPeb()->ProcessHeap) return HeapPtr; + + /* Free up all big allocations */ + Current = Heap->VirtualAllocdBlocks.Flink; + while (Current != &Heap->VirtualAllocdBlocks) + { + VirtualEntry = CONTAINING_RECORD(Current, HEAP_VIRTUAL_ALLOC_ENTRY, Entry); + BaseAddress = (PVOID)VirtualEntry; + Current = Current->Flink; + Size = 0; + ZwFreeVirtualMemory(NtCurrentProcess(), + &BaseAddress, + &Size, + MEM_RELEASE); + } + + /* Delete tags and remove heap from the process heaps list in user mode */ + if (RtlpGetMode() == UserMode) + { + // FIXME DestroyTags + RtlpRemoveHeapFromProcessList(Heap); + } + + /* Delete the heap lock */ + if (!(Heap->Flags & HEAP_NO_SERIALIZE)) + { + /* Delete it if it wasn't user allocated */ + if (!(Heap->Flags & HEAP_LOCK_USER_ALLOCATED)) + RtlDeleteHeapLock(Heap->LockVariable); + + /* Clear out the lock variable */ + Heap->LockVariable = NULL; + } + + /* Free UCR segments if any were created */ + Current = Heap->UCRSegments.Flink; + while(Current != &Heap->UCRSegments) + { + UcrSegment = CONTAINING_RECORD(Current, HEAP_UCR_SEGMENT, ListEntry); + + /* Advance to the next descriptor */ + Current = Current->Flink; + + BaseAddress = (PVOID)UcrSegment; + Size = 0; + + /* Release that memory */ + ZwFreeVirtualMemory(NtCurrentProcess(), + &BaseAddress, + &Size, + MEM_RELEASE); + } + + /* Go through segments and destroy them */ + for (i = HEAP_SEGMENTS - 1; i >= 0; i--) + { + Segment = Heap->Segments[i]; + if (Segment) RtlpDestroyHeapSegment(Segment); + } + + return NULL; +} + +PHEAP_ENTRY NTAPI +RtlpSplitEntry(PHEAP Heap, + PHEAP_FREE_ENTRY FreeBlock, + SIZE_T AllocationSize, + SIZE_T Index, + SIZE_T Size) +{ + PHEAP_FREE_ENTRY SplitBlock, SplitBlock2; + UCHAR FreeFlags; + PHEAP_ENTRY InUseEntry; + SIZE_T FreeSize; + + /* Save flags, update total free size */ + FreeFlags = FreeBlock->Flags; + Heap->TotalFreeSize -= FreeBlock->Size; + + /* Make this block an in-use one */ + InUseEntry = (PHEAP_ENTRY)FreeBlock; + InUseEntry->Flags = HEAP_ENTRY_BUSY; + InUseEntry->SmallTagIndex = 0; + + /* Calculate the extra amount */ + FreeSize = InUseEntry->Size - Index; + + /* Update it's size fields (we don't need their data anymore) */ + InUseEntry->Size = Index; + InUseEntry->UnusedBytes = AllocationSize - Size; + + /* If there is something to split - do the split */ + if (FreeSize != 0) + { + /* Don't split if resulting entry can't contain any payload data + (i.e. being just HEAP_ENTRY_SIZE) */ + if (FreeSize == 1) + { + /* Increase sizes of the in-use entry */ + InUseEntry->Size++; + InUseEntry->UnusedBytes += sizeof(HEAP_ENTRY); + } + else + { + /* Calculate a pointer to the new entry */ + SplitBlock = (PHEAP_FREE_ENTRY)(InUseEntry + Index); + + /* Initialize it */ + SplitBlock->Flags = FreeFlags; + SplitBlock->SegmentOffset = InUseEntry->SegmentOffset; + SplitBlock->Size = FreeSize; + SplitBlock->PreviousSize = Index; + + /* Check if it's the last entry */ + if (FreeFlags & HEAP_ENTRY_LAST_ENTRY) + { + /* Insert it to the free list if it's the last entry */ + RtlpInsertFreeBlockHelper(Heap, SplitBlock, FreeSize, FALSE); + Heap->TotalFreeSize += FreeSize; + } + else + { + /* Not so easy - need to update next's previous size too */ + SplitBlock2 = (PHEAP_FREE_ENTRY)((PHEAP_ENTRY)SplitBlock + FreeSize); + + if (SplitBlock2->Flags & HEAP_ENTRY_BUSY) + { + SplitBlock2->PreviousSize = (USHORT)FreeSize; + RtlpInsertFreeBlockHelper(Heap, SplitBlock, FreeSize, FALSE); + Heap->TotalFreeSize += FreeSize; + } + else + { + /* Even more complex - the next entry is free, so we can merge them into one! */ + SplitBlock->Flags = SplitBlock2->Flags; + + /* Remove that next entry */ + RtlpRemoveFreeBlock(Heap, SplitBlock2, FALSE, FALSE); + + /* Update sizes */ + FreeSize += SplitBlock2->Size; + Heap->TotalFreeSize -= SplitBlock2->Size; + + if (FreeSize <= HEAP_MAX_BLOCK_SIZE) + { + /* Insert it back */ + SplitBlock->Size = FreeSize; + + /* Don't forget to update previous size of the next entry! */ + if (!(SplitBlock->Flags & HEAP_ENTRY_LAST_ENTRY)) + { + ((PHEAP_FREE_ENTRY)((PHEAP_ENTRY)SplitBlock + FreeSize))->PreviousSize = FreeSize; + } + + /* Actually insert it */ + RtlpInsertFreeBlockHelper(Heap, SplitBlock, (USHORT)FreeSize, FALSE); + + /* Update total size */ + Heap->TotalFreeSize += FreeSize; + } + else + { + /* Resulting block is quite big */ + RtlpInsertFreeBlock(Heap, SplitBlock, FreeSize); + } + } + } + + /* Reset flags of the free entry */ + FreeFlags = 0; + + /* Update last entry in segment */ + if (SplitBlock->Flags & HEAP_ENTRY_LAST_ENTRY) + { + Heap->Segments[SplitBlock->SegmentOffset]->LastEntryInSegment = (PHEAP_ENTRY)SplitBlock; + } + } + } + + /* Set last entry flag */ + if (FreeFlags & HEAP_ENTRY_LAST_ENTRY) + InUseEntry->Flags |= HEAP_ENTRY_LAST_ENTRY; + + return InUseEntry; +} + +PVOID NTAPI +RtlpAllocateNonDedicated(PHEAP Heap, + ULONG Flags, + SIZE_T Size, + SIZE_T AllocationSize, + SIZE_T Index, + BOOLEAN HeapLocked) +{ + PLIST_ENTRY FreeListHead, Next; + PHEAP_FREE_ENTRY FreeBlock; + PHEAP_ENTRY InUseEntry; + PHEAP_ENTRY_EXTRA Extra; + EXCEPTION_RECORD ExceptionRecord; + + /* Go through the zero list to find a place where to insert the new entry */ + FreeListHead = &Heap->FreeLists[0]; + + /* Start from the largest block to reduce time */ + Next = FreeListHead->Blink; + if (FreeListHead != Next) + { + FreeBlock = CONTAINING_RECORD(Next, HEAP_FREE_ENTRY, FreeList); + + if (FreeBlock->Size >= Index) + { + /* Our request is smaller than the largest entry in the zero list */ + + /* Go through the list to find insertion place */ + Next = FreeListHead->Flink; + while (FreeListHead != Next) + { + FreeBlock = CONTAINING_RECORD(Next, HEAP_FREE_ENTRY, FreeList); + + if (FreeBlock->Size >= Index) + { + /* Found minimally fitting entry. Proceed to either using it as it is + or splitting it to two entries */ + RemoveEntryList(&FreeBlock->FreeList); + + /* Split it */ + InUseEntry = RtlpSplitEntry(Heap, FreeBlock, AllocationSize, Index, Size); + + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + + /* Zero memory if that was requested */ + if (Flags & HEAP_ZERO_MEMORY) + RtlZeroMemory(InUseEntry + 1, Size); + else if (Heap->Flags & HEAP_FREE_CHECKING_ENABLED) + { + /* Fill this block with a special pattern */ + RtlFillMemoryUlong(InUseEntry + 1, Size & ~0x3, ARENA_INUSE_FILLER); + } + + /* Fill tail of the block with a special pattern too if requested */ + if (Heap->Flags & HEAP_TAIL_CHECKING_ENABLED) + { + RtlFillMemory((PCHAR)(InUseEntry + 1) + Size, sizeof(HEAP_ENTRY), HEAP_TAIL_FILL); + InUseEntry->Flags |= HEAP_ENTRY_FILL_PATTERN; + } + + /* Prepare extra if it's present */ + if (InUseEntry->Flags & HEAP_ENTRY_EXTRA_PRESENT) + { + Extra = RtlpGetExtraStuffPointer(InUseEntry); + RtlZeroMemory(Extra, sizeof(HEAP_ENTRY_EXTRA)); + + // TODO: Tagging + } + + /* Return pointer to the */ + return InUseEntry + 1; + } + + /* Advance to the next entry */ + Next = Next->Flink; + } + } + } + + /* Extend the heap, 0 list didn't have anything suitable */ + FreeBlock = RtlpExtendHeap(Heap, AllocationSize); + + /* Use the new biggest entry we've got */ + if (FreeBlock) + { + RemoveEntryList(&FreeBlock->FreeList); + + /* Split it */ + InUseEntry = RtlpSplitEntry(Heap, FreeBlock, AllocationSize, Index, Size); + + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + + /* Zero memory if that was requested */ + if (Flags & HEAP_ZERO_MEMORY) + RtlZeroMemory(InUseEntry + 1, Size); + else if (Heap->Flags & HEAP_FREE_CHECKING_ENABLED) + { + /* Fill this block with a special pattern */ + RtlFillMemoryUlong(InUseEntry + 1, Size & ~0x3, ARENA_INUSE_FILLER); + } + + /* Fill tail of the block with a special pattern too if requested */ + if (Heap->Flags & HEAP_TAIL_CHECKING_ENABLED) + { + RtlFillMemory((PCHAR)(InUseEntry + 1) + Size, sizeof(HEAP_ENTRY), HEAP_TAIL_FILL); + InUseEntry->Flags |= HEAP_ENTRY_FILL_PATTERN; + } + + /* Prepare extra if it's present */ + if (InUseEntry->Flags & HEAP_ENTRY_EXTRA_PRESENT) + { + Extra = RtlpGetExtraStuffPointer(InUseEntry); + RtlZeroMemory(Extra, sizeof(HEAP_ENTRY_EXTRA)); + + // TODO: Tagging + } + + /* Return pointer to the */ + return InUseEntry + 1; + } + + /* Really unfortunate, out of memory condition */ + RtlSetLastWin32ErrorAndNtStatusFromNtStatus(STATUS_NO_MEMORY); + + /* Generate an exception */ + if (Flags & HEAP_GENERATE_EXCEPTIONS) + { + ExceptionRecord.ExceptionCode = STATUS_NO_MEMORY; + ExceptionRecord.ExceptionRecord = NULL; + ExceptionRecord.NumberParameters = 1; + ExceptionRecord.ExceptionFlags = 0; + ExceptionRecord.ExceptionInformation[0] = AllocationSize; + + RtlRaiseException(&ExceptionRecord); + } + + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + DPRINT1("HEAP: Allocation failed!\n"); + DPRINT1("Flags %x\n", Heap->Flags); + return NULL; +} + +/*********************************************************************** + * HeapAlloc (KERNEL32.334) + * RETURNS + * Pointer to allocated memory block + * NULL: Failure + * 0x7d030f60--invalid flags in RtlHeapAllocate + * @implemented + */ +PVOID NTAPI +RtlAllocateHeap(IN PVOID HeapPtr, + IN ULONG Flags, + IN SIZE_T Size) +{ + PHEAP Heap = (PHEAP)HeapPtr; + PULONG FreeListsInUse; + ULONG FreeListsInUseUlong; + SIZE_T AllocationSize; + SIZE_T Index; + PLIST_ENTRY FreeListHead; + PHEAP_ENTRY InUseEntry; + PHEAP_FREE_ENTRY FreeBlock; + ULONG InUseIndex, i; + UCHAR FreeFlags; + EXCEPTION_RECORD ExceptionRecord; + BOOLEAN HeapLocked = FALSE; + PHEAP_VIRTUAL_ALLOC_ENTRY VirtualBlock = NULL; + PHEAP_ENTRY_EXTRA Extra; + NTSTATUS Status; + + /* Force flags */ + Flags |= Heap->ForceFlags; + + /* Call special heap */ + if (RtlpHeapIsSpecial(Flags)) + return RtlDebugAllocateHeap(Heap, Flags, Size); + + /* Check for the maximum size */ + if (Size >= 0x80000000) + { + RtlSetLastWin32ErrorAndNtStatusFromNtStatus(STATUS_NO_MEMORY); + DPRINT1("HEAP: Allocation failed!\n"); + return NULL; + } + + if (Flags & (HEAP_CREATE_ENABLE_TRACING | + HEAP_CREATE_ALIGN_16)) + { + DPRINT1("HEAP: RtlAllocateHeap is called with unsupported flags %x, ignoring\n", Flags); + } + + //DPRINT("RtlAllocateHeap(%p %x %x)\n", Heap, Flags, Size); + + /* Calculate allocation size and index */ + if (Size) + AllocationSize = Size; + else + AllocationSize = 1; + AllocationSize = (AllocationSize + Heap->AlignRound) & Heap->AlignMask; + Index = AllocationSize >> HEAP_ENTRY_SHIFT; + + /* Acquire the lock if necessary */ + if (!(Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + HeapLocked = TRUE; + } + + /* Depending on the size, the allocation is going to be done from dedicated, + non-dedicated lists or a virtual block of memory */ + if (Index < HEAP_FREELISTS) + { + FreeListHead = &Heap->FreeLists[Index]; + + if (!IsListEmpty(FreeListHead)) + { + /* There is a free entry in this list */ + FreeBlock = CONTAINING_RECORD(FreeListHead->Blink, + HEAP_FREE_ENTRY, + FreeList); + + /* Save flags and remove the free entry */ + FreeFlags = FreeBlock->Flags; + RtlpRemoveFreeBlock(Heap, FreeBlock, TRUE, FALSE); + + /* Update the total free size of the heap */ + Heap->TotalFreeSize -= Index; + + /* Initialize this block */ + InUseEntry = (PHEAP_ENTRY)FreeBlock; + InUseEntry->Flags = HEAP_ENTRY_BUSY | (FreeFlags & HEAP_ENTRY_LAST_ENTRY); + InUseEntry->UnusedBytes = AllocationSize - Size; + InUseEntry->SmallTagIndex = 0; + } + else + { + /* Find smallest free block which this request could fit in */ + InUseIndex = Index >> 5; + FreeListsInUse = &Heap->u.FreeListsInUseUlong[InUseIndex]; + + /* This bit magic disables all sizes which are less than the requested allocation size */ + FreeListsInUseUlong = *FreeListsInUse++ & ~((1 << ((ULONG)Index & 0x1f)) - 1); + + /* If size is definitily more than our lists - go directly to the non-dedicated one */ + if (InUseIndex > 3) + return RtlpAllocateNonDedicated(Heap, Flags, Size, AllocationSize, Index, HeapLocked); + + /* Go through the list */ + for (i = InUseIndex; i < 4; i++) + { + if (FreeListsInUseUlong) + { + FreeListHead = &Heap->FreeLists[i * 32]; + break; + } + + if (i < 3) FreeListsInUseUlong = *FreeListsInUse++; + } + + /* Nothing found, search in the non-dedicated list */ + if (i == 4) + return RtlpAllocateNonDedicated(Heap, Flags, Size, AllocationSize, Index, HeapLocked); + + /* That list is found, now calculate exact block */ + FreeListHead += RtlpFindLeastSetBit(FreeListsInUseUlong); + + /* Take this entry and remove it from the list of free blocks */ + FreeBlock = CONTAINING_RECORD(FreeListHead->Blink, + HEAP_FREE_ENTRY, + FreeList); + RtlpRemoveFreeBlock(Heap, FreeBlock, TRUE, FALSE); + + /* Split it */ + InUseEntry = RtlpSplitEntry(Heap, FreeBlock, AllocationSize, Index, Size); + } + + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + + /* Zero memory if that was requested */ + if (Flags & HEAP_ZERO_MEMORY) + RtlZeroMemory(InUseEntry + 1, Size); + else if (Heap->Flags & HEAP_FREE_CHECKING_ENABLED) + { + /* Fill this block with a special pattern */ + RtlFillMemoryUlong(InUseEntry + 1, Size & ~0x3, ARENA_INUSE_FILLER); + } + + /* Fill tail of the block with a special pattern too if requested */ + if (Heap->Flags & HEAP_TAIL_CHECKING_ENABLED) + { + RtlFillMemory((PCHAR)(InUseEntry + 1) + Size, sizeof(HEAP_ENTRY), HEAP_TAIL_FILL); + InUseEntry->Flags |= HEAP_ENTRY_FILL_PATTERN; + } + + /* Prepare extra if it's present */ + if (InUseEntry->Flags & HEAP_ENTRY_EXTRA_PRESENT) + { + Extra = RtlpGetExtraStuffPointer(InUseEntry); + RtlZeroMemory(Extra, sizeof(HEAP_ENTRY_EXTRA)); + + // TODO: Tagging + } + + /* User data starts right after the entry's header */ + return InUseEntry + 1; + } + else if (Index <= Heap->VirtualMemoryThreshold) + { + /* The block is too large for dedicated lists, but fine for a non-dedicated one */ + return RtlpAllocateNonDedicated(Heap, Flags, Size, AllocationSize, Index, HeapLocked); + } + else if (Heap->Flags & HEAP_GROWABLE) + { + /* We've got a very big allocation request, satisfy it by directly allocating virtual memory */ + AllocationSize += sizeof(HEAP_VIRTUAL_ALLOC_ENTRY) - sizeof(HEAP_ENTRY); + + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + (PVOID *)&VirtualBlock, + 0, + &AllocationSize, + MEM_COMMIT, + PAGE_READWRITE); + + if (!NT_SUCCESS(Status)) + { + // Set STATUS! + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + DPRINT1("HEAP: Allocation failed!\n"); + return NULL; + } + + /* Initialize the newly allocated block */ + VirtualBlock->BusyBlock.Size = (AllocationSize - Size); + VirtualBlock->BusyBlock.Flags = HEAP_ENTRY_VIRTUAL_ALLOC | HEAP_ENTRY_EXTRA_PRESENT | HEAP_ENTRY_BUSY; + VirtualBlock->CommitSize = AllocationSize; + VirtualBlock->ReserveSize = AllocationSize; + + /* Insert it into the list of virtual allocations */ + InsertTailList(&Heap->VirtualAllocdBlocks, &VirtualBlock->Entry); + + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + + /* Return pointer to user data */ + return VirtualBlock + 1; + } + + /* Generate an exception */ + if (Flags & HEAP_GENERATE_EXCEPTIONS) + { + ExceptionRecord.ExceptionCode = STATUS_NO_MEMORY; + ExceptionRecord.ExceptionRecord = NULL; + ExceptionRecord.NumberParameters = 1; + ExceptionRecord.ExceptionFlags = 0; + ExceptionRecord.ExceptionInformation[0] = AllocationSize; + + RtlRaiseException(&ExceptionRecord); + } + + RtlSetLastWin32ErrorAndNtStatusFromNtStatus(STATUS_BUFFER_TOO_SMALL); + + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + DPRINT1("HEAP: Allocation failed!\n"); + return NULL; +} + + +/*********************************************************************** + * HeapFree (KERNEL32.338) + * RETURNS + * TRUE: Success + * FALSE: Failure + * + * @implemented + */ +BOOLEAN NTAPI RtlFreeHeap( + HANDLE HeapPtr, /* [in] Handle of heap */ + ULONG Flags, /* [in] Heap freeing flags */ + PVOID Ptr /* [in] Address of memory to free */ +) +{ + PHEAP Heap; + PHEAP_ENTRY HeapEntry; + USHORT TagIndex = 0; + SIZE_T BlockSize; + PHEAP_VIRTUAL_ALLOC_ENTRY VirtualEntry; + BOOLEAN Locked = FALSE; + NTSTATUS Status; + + /* Freeing NULL pointer is a legal operation */ + if (!Ptr) return TRUE; + + /* Get pointer to the heap and force flags */ + Heap = (PHEAP)HeapPtr; + Flags |= Heap->ForceFlags; + + /* Call special heap */ + if (RtlpHeapIsSpecial(Flags)) + return RtlDebugFreeHeap(Heap, Flags, Ptr); + + /* Lock if necessary */ + if (!(Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + Locked = TRUE; + } + + /* Get pointer to the heap entry */ + HeapEntry = (PHEAP_ENTRY)Ptr - 1; + + /* Check this entry, fail if it's invalid */ + if (!(HeapEntry->Flags & HEAP_ENTRY_BUSY) || + (((ULONG_PTR)Ptr & 0x7) != 0) || + (HeapEntry->SegmentOffset >= HEAP_SEGMENTS)) + { + /* This is an invalid block */ + DPRINT1("HEAP: Trying to free an invalid address %p!\n", Ptr); + RtlSetLastWin32ErrorAndNtStatusFromNtStatus(STATUS_INVALID_PARAMETER); + + /* Release the heap lock */ + if (Locked) RtlLeaveHeapLock(Heap->LockVariable); + return FALSE; + } + + if (HeapEntry->Flags & HEAP_ENTRY_VIRTUAL_ALLOC) + { + /* Big allocation */ + VirtualEntry = CONTAINING_RECORD(HeapEntry, HEAP_VIRTUAL_ALLOC_ENTRY, BusyBlock); + + /* Remove it from the list */ + RemoveEntryList(&VirtualEntry->Entry); + + // TODO: Tagging + + BlockSize = 0; + Status = ZwFreeVirtualMemory(NtCurrentProcess(), + (PVOID *)&VirtualEntry, + &BlockSize, + MEM_RELEASE); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("HEAP: Failed releasing memory with Status 0x%08X. Heap %p, ptr %p, base address %p\n", + Status, Heap, Ptr, VirtualEntry); + RtlSetLastWin32ErrorAndNtStatusFromNtStatus(Status); + } + } + else + { + /* Normal allocation */ + BlockSize = HeapEntry->Size; + + // TODO: Tagging + + /* Coalesce in kernel mode, and in usermode if it's not disabled */ + if (RtlpGetMode() == KernelMode || + (RtlpGetMode() == UserMode && !(Heap->Flags & HEAP_DISABLE_COALESCE_ON_FREE))) + { + HeapEntry = (PHEAP_ENTRY)RtlpCoalesceFreeBlocks(Heap, + (PHEAP_FREE_ENTRY)HeapEntry, + &BlockSize, + FALSE); + } + + /* If there is no need to decommit the block - put it into a free list */ + if (BlockSize < Heap->DeCommitFreeBlockThreshold || + (Heap->TotalFreeSize + BlockSize < Heap->DeCommitTotalFreeThreshold)) + { + /* Check if it needs to go to a 0 list */ + if (BlockSize > HEAP_MAX_BLOCK_SIZE) + { + /* General-purpose 0 list */ + RtlpInsertFreeBlock(Heap, (PHEAP_FREE_ENTRY)HeapEntry, BlockSize); + } + else + { + /* Usual free list */ + RtlpInsertFreeBlockHelper(Heap, (PHEAP_FREE_ENTRY)HeapEntry, BlockSize, FALSE); + + /* Assert sizes are consistent */ + if (!(HeapEntry->Flags & HEAP_ENTRY_LAST_ENTRY)) + { + ASSERT((HeapEntry + BlockSize)->PreviousSize == BlockSize); + } + + /* Increase the free size */ + Heap->TotalFreeSize += BlockSize; + } + + + if (RtlpGetMode() == UserMode && + TagIndex != 0) + { + // FIXME: Tagging + UNIMPLEMENTED; + } + } + else + { + /* Decommit this block */ + RtlpDeCommitFreeBlock(Heap, (PHEAP_FREE_ENTRY)HeapEntry, BlockSize); + } + } + + /* Release the heap lock */ + if (Locked) RtlLeaveHeapLock(Heap->LockVariable); + + return TRUE; +} + +BOOLEAN NTAPI +RtlpGrowBlockInPlace (IN PHEAP Heap, + IN ULONG Flags, + IN PHEAP_ENTRY InUseEntry, + IN SIZE_T Size, + IN SIZE_T Index) +{ + UCHAR EntryFlags, RememberFlags; + PHEAP_FREE_ENTRY FreeEntry, UnusedEntry, FollowingEntry; + SIZE_T FreeSize, PrevSize, TailPart, AddedSize = 0; + PHEAP_ENTRY_EXTRA OldExtra, NewExtra; + + /* We can't grow beyond specified threshold */ + if (Index > Heap->VirtualMemoryThreshold) + return FALSE; + + /* Get entry flags */ + EntryFlags = InUseEntry->Flags; + + /* Get the next free entry */ + FreeEntry = (PHEAP_FREE_ENTRY)(InUseEntry + InUseEntry->Size); + + if (EntryFlags & HEAP_ENTRY_LAST_ENTRY) + { + /* There is no next block, just uncommitted space. Calculate how much is needed */ + FreeSize = (Index - InUseEntry->Size) << HEAP_ENTRY_SHIFT; + FreeSize = ROUND_UP(FreeSize, PAGE_SIZE); + + /* Find and commit those pages */ + FreeEntry = RtlpFindAndCommitPages(Heap, + Heap->Segments[InUseEntry->SegmentOffset], + &FreeSize, + FreeEntry); + + /* Fail if it failed... */ + if (!FreeEntry) return FALSE; + + /* It was successful, perform coalescing */ + FreeSize = FreeSize >> HEAP_ENTRY_SHIFT; + FreeEntry = RtlpCoalesceFreeBlocks(Heap, FreeEntry, &FreeSize, FALSE); + + /* Check if it's enough */ + if (FreeSize + InUseEntry->Size < Index) + { + /* Still not enough */ + RtlpInsertFreeBlock(Heap, FreeEntry, FreeSize); + Heap->TotalFreeSize += FreeSize; + return FALSE; + } + + /* Remember flags of this free entry */ + RememberFlags = FreeEntry->Flags; + + /* Sum up sizes */ + FreeSize += InUseEntry->Size; + } + else + { + /* The next block indeed exists. Check if it's free or in use */ + if (FreeEntry->Flags & HEAP_ENTRY_BUSY) return FALSE; + + /* Next entry is free, check if it can fit the block we need */ + FreeSize = InUseEntry->Size + FreeEntry->Size; + if (FreeSize < Index) return FALSE; + + /* Remember flags of this free entry */ + RememberFlags = FreeEntry->Flags; + + /* Remove this block from the free list */ + RtlpRemoveFreeBlock(Heap, FreeEntry, FALSE, FALSE); + Heap->TotalFreeSize -= FreeEntry->Size; + } + + PrevSize = (InUseEntry->Size << HEAP_ENTRY_SHIFT) - InUseEntry->UnusedBytes; + FreeSize -= Index; + + /* Don't produce too small blocks */ + if (FreeSize <= 2) + { + Index += FreeSize; + FreeSize = 0; + } + + /* Process extra stuff */ + if (RememberFlags & HEAP_ENTRY_EXTRA_PRESENT) + { + /* Calculate pointers */ + OldExtra = (PHEAP_ENTRY_EXTRA)(InUseEntry + InUseEntry->Size - 1); + NewExtra = (PHEAP_ENTRY_EXTRA)(InUseEntry + Index - 1); + + /* Copy contents */ + *NewExtra = *OldExtra; + + // FIXME Tagging + } + + /* Update sizes */ + InUseEntry->Size = Index; + InUseEntry->UnusedBytes = ((Index << HEAP_ENTRY_SHIFT) - Size); + + /* Check if there is a free space remaining after merging those blocks */ + if (!FreeSize) + { + /* Update flags and sizes */ + InUseEntry->Flags |= RememberFlags & HEAP_ENTRY_LAST_ENTRY; + + /* Either update previous size of the next entry or mark it as a last + entry in the segment*/ + if (RememberFlags & HEAP_ENTRY_LAST_ENTRY) + Heap->Segments[InUseEntry->SegmentOffset]->LastEntryInSegment = InUseEntry; + else + (InUseEntry + InUseEntry->Size)->PreviousSize = InUseEntry->Size; + } + else + { + /* Complex case, we need to split the block to give unused free space + back to the heap */ + UnusedEntry = (PHEAP_FREE_ENTRY)(InUseEntry + Index); + UnusedEntry->PreviousSize = Index; + UnusedEntry->SegmentOffset = InUseEntry->SegmentOffset; + + /* Update the following block or set the last entry in the segment */ + if (RememberFlags & HEAP_ENTRY_LAST_ENTRY) + { + /* Set last entry and set flags and size */ + Heap->Segments[InUseEntry->SegmentOffset]->LastEntryInSegment = InUseEntry; + UnusedEntry->Flags = RememberFlags; + UnusedEntry->Size = FreeSize; + + /* Insert it to the heap and update total size */ + RtlpInsertFreeBlockHelper(Heap, UnusedEntry, FreeSize, FALSE); + Heap->TotalFreeSize += FreeSize; + } + else + { + /* There is a block after this one */ + FollowingEntry = (PHEAP_FREE_ENTRY)((PHEAP_ENTRY)UnusedEntry + FreeSize); + + if (FollowingEntry->Flags & HEAP_ENTRY_BUSY) + { + /* Update flags and set size of the unused space entry */ + UnusedEntry->Flags = RememberFlags & (~HEAP_ENTRY_LAST_ENTRY); + UnusedEntry->Size = FreeSize; + + /* Update previous size of the following entry */ + FollowingEntry->PreviousSize = FreeSize; + + /* Insert it to the heap and update total free size */ + RtlpInsertFreeBlockHelper(Heap, UnusedEntry, FreeSize, FALSE); + Heap->TotalFreeSize += FreeSize; + } + else + { + /* That following entry is also free, what a fortune! */ + RememberFlags = FollowingEntry->Flags; + + /* Remove it */ + RtlpRemoveFreeBlock(Heap, FollowingEntry, FALSE, FALSE); + Heap->TotalFreeSize -= FollowingEntry->Size; + + /* And make up a new combined block */ + FreeSize += FollowingEntry->Size; + UnusedEntry->Flags = RememberFlags; + + /* Check where to put it */ + if (FreeSize <= HEAP_MAX_BLOCK_SIZE) + { + /* Fine for a dedicated list */ + UnusedEntry->Size = FreeSize; + + if (RememberFlags & HEAP_ENTRY_LAST_ENTRY) + Heap->Segments[UnusedEntry->SegmentOffset]->LastEntryInSegment = (PHEAP_ENTRY)UnusedEntry; + else + ((PHEAP_ENTRY)UnusedEntry + FreeSize)->PreviousSize = FreeSize; + + /* Insert it back and update total size */ + RtlpInsertFreeBlockHelper(Heap, UnusedEntry, FreeSize, FALSE); + Heap->TotalFreeSize += FreeSize; + } + else + { + /* The block is very large, leave all the hassle to the insertion routine */ + RtlpInsertFreeBlock(Heap, UnusedEntry, FreeSize); + } + } + } + } + + /* Copy user settable flags */ + InUseEntry->Flags &= ~HEAP_ENTRY_SETTABLE_FLAGS; + InUseEntry->Flags |= ((Flags & HEAP_SETTABLE_USER_FLAGS) >> 4); + + /* Properly "zero out" (and fill!) the space */ + if (Flags & HEAP_ZERO_MEMORY) + { + RtlZeroMemory((PCHAR)(InUseEntry + 1) + PrevSize, Size - PrevSize); + } + else if (Heap->Flags & HEAP_FREE_CHECKING_ENABLED) + { + /* Calculate tail part which we need to fill */ + TailPart = PrevSize & (sizeof(ULONG) - 1); + + /* "Invert" it as usual */ + if (TailPart) TailPart = 4 - TailPart; + + if (Size > (PrevSize + TailPart)) + AddedSize = (Size - (PrevSize + TailPart)) & ~(sizeof(ULONG) - 1); + + if (AddedSize) + { + RtlFillMemoryUlong((PCHAR)(InUseEntry + 1) + PrevSize + TailPart, + AddedSize, + ARENA_INUSE_FILLER); + } + } + + /* Fill the new tail */ + if (Heap->Flags & HEAP_TAIL_CHECKING_ENABLED) + { + RtlFillMemory((PCHAR)(InUseEntry + 1) + Size, + HEAP_ENTRY_SIZE, + HEAP_TAIL_FILL); + } + + /* Return success */ + return TRUE; +} + +PHEAP_ENTRY_EXTRA NTAPI +RtlpGetExtraStuffPointer(PHEAP_ENTRY HeapEntry) +{ + PHEAP_VIRTUAL_ALLOC_ENTRY VirtualEntry; + + /* Check if it's a big block */ + if (HeapEntry->Flags & HEAP_ENTRY_VIRTUAL_ALLOC) + { + VirtualEntry = CONTAINING_RECORD(HeapEntry, HEAP_VIRTUAL_ALLOC_ENTRY, BusyBlock); + + /* Return a pointer to the extra stuff*/ + return &VirtualEntry->ExtraStuff; + } + else + { + /* This is a usual entry, which means extra stuff follows this block */ + return (PHEAP_ENTRY_EXTRA)(HeapEntry + HeapEntry->Size - 1); + } +} + + +/*********************************************************************** + * RtlReAllocateHeap + * PARAMS + * Heap [in] Handle of heap block + * Flags [in] Heap reallocation flags + * Ptr, [in] Address of memory to reallocate + * Size [in] Number of bytes to reallocate + * + * RETURNS + * Pointer to reallocated memory block + * NULL: Failure + * 0x7d030f60--invalid flags in RtlHeapAllocate + * @implemented + */ +PVOID NTAPI +RtlReAllocateHeap(HANDLE HeapPtr, + ULONG Flags, + PVOID Ptr, + SIZE_T Size) +{ + PHEAP Heap = (PHEAP)HeapPtr; + PHEAP_ENTRY InUseEntry, NewInUseEntry; + PHEAP_ENTRY_EXTRA OldExtra, NewExtra; + SIZE_T AllocationSize, FreeSize, DecommitSize; + BOOLEAN HeapLocked = FALSE; + PVOID NewBaseAddress; + PHEAP_FREE_ENTRY SplitBlock, SplitBlock2; + SIZE_T OldSize, Index, OldIndex; + UCHAR FreeFlags; + NTSTATUS Status; + PVOID DecommitBase; + SIZE_T RemainderBytes, ExtraSize; + PHEAP_VIRTUAL_ALLOC_ENTRY VirtualAllocBlock; + EXCEPTION_RECORD ExceptionRecord; + + /* Return success in case of a null pointer */ + if (!Ptr) + { + RtlSetLastWin32ErrorAndNtStatusFromNtStatus(STATUS_SUCCESS); + return NULL; + } + + /* Force heap flags */ + Flags |= Heap->ForceFlags; + + /* Call special heap */ + if (RtlpHeapIsSpecial(Flags)) + return RtlDebugReAllocateHeap(Heap, Flags, Ptr, Size); + + /* Make sure size is valid */ + if (Size >= 0x80000000) + { + RtlSetLastWin32ErrorAndNtStatusFromNtStatus(STATUS_NO_MEMORY); + return NULL; + } + + /* Calculate allocation size and index */ + if (Size) + AllocationSize = Size; + else + AllocationSize = 1; + AllocationSize = (AllocationSize + Heap->AlignRound) & Heap->AlignMask; + + /* Add up extra stuff, if it is present anywhere */ + if (((((PHEAP_ENTRY)Ptr)-1)->Flags & HEAP_ENTRY_EXTRA_PRESENT) || + (Flags & HEAP_EXTRA_FLAGS_MASK) || + Heap->PseudoTagEntries) + { + AllocationSize += sizeof(HEAP_ENTRY_EXTRA); + } + + /* Acquire the lock if necessary */ + if (!(Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + HeapLocked = TRUE; + Flags ^= HEAP_NO_SERIALIZE; + } + + /* Get the pointer to the in-use entry */ + InUseEntry = (PHEAP_ENTRY)Ptr - 1; + + /* If that entry is not really in-use, we have a problem */ + if (!(InUseEntry->Flags & HEAP_ENTRY_BUSY)) + { + RtlSetLastWin32ErrorAndNtStatusFromNtStatus(STATUS_INVALID_PARAMETER); + + /* Release the lock and return */ + if (HeapLocked) + RtlLeaveHeapLock(Heap->LockVariable); + return Ptr; + } + + if (InUseEntry->Flags & HEAP_ENTRY_VIRTUAL_ALLOC) + { + /* This is a virtually allocated block. Get its size */ + OldSize = RtlpGetSizeOfBigBlock(InUseEntry); + + /* Convert it to an index */ + OldIndex = (OldSize + InUseEntry->Size) >> HEAP_ENTRY_SHIFT; + + /* Calculate new allocation size and round it to the page size */ + AllocationSize += FIELD_OFFSET(HEAP_VIRTUAL_ALLOC_ENTRY, BusyBlock); + AllocationSize = ROUND_UP(AllocationSize, PAGE_SIZE); + } + else + { + /* Usual entry */ + OldIndex = InUseEntry->Size; + + OldSize = (OldIndex << HEAP_ENTRY_SHIFT) - InUseEntry->UnusedBytes; + } + + /* Calculate new index */ + Index = AllocationSize >> HEAP_ENTRY_SHIFT; + + /* Check for 4 different scenarios (old size, new size, old index, new index) */ + if (Index <= OldIndex) + { + /* Difference must be greater than 1, adjust if it's not so */ + if (Index + 1 == OldIndex) + { + Index++; + AllocationSize += sizeof(HEAP_ENTRY); + } + + /* Calculate new size */ + if (InUseEntry->Flags & HEAP_ENTRY_VIRTUAL_ALLOC) + { + /* Simple in case of a virtual alloc - just an unused size */ + InUseEntry->Size = AllocationSize - Size; + } + else if (InUseEntry->Flags & HEAP_ENTRY_EXTRA_PRESENT) + { + /* There is extra stuff, take it into account */ + OldExtra = (PHEAP_ENTRY_EXTRA)(InUseEntry + InUseEntry->Size - 1); + NewExtra = (PHEAP_ENTRY_EXTRA)(InUseEntry + Index - 1); + *NewExtra = *OldExtra; + + // FIXME Tagging, TagIndex + + /* Update unused bytes count */ + InUseEntry->UnusedBytes = AllocationSize - Size; + } + else + { + // FIXME Tagging, SmallTagIndex + InUseEntry->UnusedBytes = AllocationSize - Size; + } + + /* If new size is bigger than the old size */ + if (Size > OldSize) + { + /* Zero out that additional space if required */ + if (Flags & HEAP_ZERO_MEMORY) + { + RtlZeroMemory((PCHAR)Ptr + OldSize, Size - OldSize); + } + else if (Heap->Flags & HEAP_FREE_CHECKING_ENABLED) + { + /* Fill it on free if required */ + RemainderBytes = OldSize & (sizeof(ULONG) - 1); + + if (RemainderBytes) + RemainderBytes = 4 - RemainderBytes; + + if (Size > (OldSize + RemainderBytes)) + { + /* Calculate actual amount of extra bytes to fill */ + ExtraSize = (Size - (OldSize + RemainderBytes)) & ~(sizeof(ULONG) - 1); + + /* Fill them if there are any */ + if (ExtraSize != 0) + { + RtlFillMemoryUlong((PCHAR)(InUseEntry + 1) + OldSize + RemainderBytes, + ExtraSize, + ARENA_INUSE_FILLER); + } + } + } + } + + /* Fill tail of the heap entry if required */ + if (Heap->Flags & HEAP_TAIL_CHECKING_ENABLED) + { + RtlFillMemory((PCHAR)(InUseEntry + 1) + Size, + HEAP_ENTRY_SIZE, + HEAP_TAIL_FILL); + } + + /* Check if the difference is significant or not */ + if (Index != OldIndex) + { + /* Save flags */ + FreeFlags = InUseEntry->Flags & ~HEAP_ENTRY_BUSY; + + if (FreeFlags & HEAP_ENTRY_VIRTUAL_ALLOC) + { + /* This is a virtual block allocation */ + VirtualAllocBlock = CONTAINING_RECORD(InUseEntry, HEAP_VIRTUAL_ALLOC_ENTRY, BusyBlock); + + // FIXME Tagging! + + DecommitBase = (PCHAR)VirtualAllocBlock + AllocationSize; + DecommitSize = (OldIndex << HEAP_ENTRY_SHIFT) - AllocationSize; + + /* Release the memory */ + Status = ZwFreeVirtualMemory(NtCurrentProcess(), + (PVOID *)&DecommitBase, + &DecommitSize, + MEM_RELEASE); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("HEAP: Unable to release memory (pointer %p, size 0x%x), Status %08x\n", DecommitBase, DecommitSize, Status); + } + else + { + /* Otherwise reduce the commit size */ + VirtualAllocBlock->CommitSize -= DecommitSize; + } + } + else + { + /* Reduce size of the block and possibly split it */ + SplitBlock = (PHEAP_FREE_ENTRY)(InUseEntry + Index); + + /* Initialize this entry */ + SplitBlock->Flags = FreeFlags; + SplitBlock->PreviousSize = Index; + SplitBlock->SegmentOffset = InUseEntry->SegmentOffset; + + /* Remember free size */ + FreeSize = InUseEntry->Size - Index; + + /* Set new size */ + InUseEntry->Size = Index; + InUseEntry->Flags &= ~HEAP_ENTRY_LAST_ENTRY; + + /* Is that the last entry */ + if (FreeFlags & HEAP_ENTRY_LAST_ENTRY) + { + /* Update segment's last entry */ + Heap->Segments[SplitBlock->SegmentOffset]->LastEntryInSegment = (PHEAP_ENTRY)SplitBlock; + + /* Set its size and insert it to the list */ + SplitBlock->Size = (USHORT)FreeSize; + RtlpInsertFreeBlockHelper(Heap, SplitBlock, FreeSize, FALSE); + + /* Update total free size */ + Heap->TotalFreeSize += FreeSize; + } + else + { + /* Get the block after that one */ + SplitBlock2 = (PHEAP_FREE_ENTRY)((PHEAP_ENTRY)SplitBlock + FreeSize); + + if (SplitBlock2->Flags & HEAP_ENTRY_BUSY) + { + /* It's in use, add it here*/ + SplitBlock->Size = (USHORT)FreeSize; + + /* Update previous size of the next entry */ + ((PHEAP_FREE_ENTRY)((PHEAP_ENTRY)SplitBlock + FreeSize))->PreviousSize = (USHORT)FreeSize; + + /* Insert it to the list */ + RtlpInsertFreeBlockHelper(Heap, SplitBlock, FreeSize, FALSE); + + /* Update total size */ + Heap->TotalFreeSize += FreeSize; + } + else + { + /* Next entry is free, so merge with it */ + SplitBlock->Flags = SplitBlock2->Flags; + + /* Remove it, update total size */ + RtlpRemoveFreeBlock(Heap, SplitBlock2, FALSE, FALSE); + Heap->TotalFreeSize -= SplitBlock2->Size; + + /* Calculate total free size */ + FreeSize += SplitBlock2->Size; + + if (FreeSize <= HEAP_MAX_BLOCK_SIZE) + { + SplitBlock->Size = FreeSize; + + if (!(SplitBlock->Flags & HEAP_ENTRY_LAST_ENTRY)) + { + /* Update previous size of the next entry */ + ((PHEAP_FREE_ENTRY)((PHEAP_ENTRY)SplitBlock + FreeSize))->PreviousSize = FreeSize; + } + else + { + Heap->Segments[SplitBlock->SegmentOffset]->LastEntryInSegment = (PHEAP_ENTRY)SplitBlock; + } + + /* Insert the new one back and update total size */ + RtlpInsertFreeBlockHelper(Heap, SplitBlock, FreeSize, FALSE); + Heap->TotalFreeSize += FreeSize; + } + else + { + /* Just add it */ + RtlpInsertFreeBlock(Heap, SplitBlock, FreeSize); + } + } + } + } + } + } + else + { + /* We're growing the block */ + if ((InUseEntry->Flags & HEAP_ENTRY_VIRTUAL_ALLOC) || + !RtlpGrowBlockInPlace(Heap, Flags, InUseEntry, Size, Index)) + { + /* Growing in place failed, so growing out of place */ + if (Flags & HEAP_REALLOC_IN_PLACE_ONLY) + { + DPRINT1("Realloc in place failed, but it was the only option\n"); + Ptr = NULL; + } + else + { + /* Clear tag bits */ + Flags &= ~HEAP_TAG_MASK; + + /* Process extra stuff */ + if (InUseEntry->Flags & HEAP_ENTRY_EXTRA_PRESENT) + { + /* Preserve user settable flags */ + Flags &= ~HEAP_SETTABLE_USER_FLAGS; + + Flags |= HEAP_SETTABLE_USER_VALUE | ((InUseEntry->Flags & HEAP_ENTRY_SETTABLE_FLAGS) << 4); + + /* Get pointer to the old extra data */ + OldExtra = RtlpGetExtraStuffPointer(InUseEntry); + + /* Save tag index if it was set */ + if (OldExtra->TagIndex && + !(OldExtra->TagIndex & HEAP_PSEUDO_TAG_FLAG)) + { + Flags |= OldExtra->TagIndex << HEAP_TAG_SHIFT; + } + } + else if (InUseEntry->SmallTagIndex) + { + /* Take small tag index into account */ + Flags |= InUseEntry->SmallTagIndex << HEAP_TAG_SHIFT; + } + + /* Allocate new block from the heap */ + NewBaseAddress = RtlAllocateHeap(HeapPtr, + Flags & ~HEAP_ZERO_MEMORY, + Size); + + /* Proceed if it didn't fail */ + if (NewBaseAddress) + { + /* Get new entry pointer */ + NewInUseEntry = (PHEAP_ENTRY)NewBaseAddress - 1; + + /* Process extra stuff if it exists */ + if (NewInUseEntry->Flags & HEAP_ENTRY_EXTRA_PRESENT) + { + NewExtra = RtlpGetExtraStuffPointer(NewInUseEntry); + + if (InUseEntry->Flags & HEAP_ENTRY_EXTRA_PRESENT) + { + OldExtra = RtlpGetExtraStuffPointer(InUseEntry); + NewExtra->Settable = OldExtra->Settable; + } + else + { + RtlZeroMemory(NewExtra, sizeof(*NewExtra)); + } + } + + /* Copy actual user bits */ + if (Size < OldSize) + RtlMoveMemory(NewBaseAddress, Ptr, Size); + else + RtlMoveMemory(NewBaseAddress, Ptr, OldSize); + + /* Zero remaining part if required */ + if (Size > OldSize && + (Flags & HEAP_ZERO_MEMORY)) + { + RtlZeroMemory((PCHAR)NewBaseAddress + OldSize, Size - OldSize); + } + + /* Free the old block */ + RtlFreeHeap(HeapPtr, Flags, Ptr); + } + + Ptr = NewBaseAddress; + } + } + } + + /* Did resizing fail? */ + if (!Ptr && (Flags & HEAP_GENERATE_EXCEPTIONS)) + { + /* Generate an exception if required */ + ExceptionRecord.ExceptionCode = STATUS_NO_MEMORY; + ExceptionRecord.ExceptionRecord = NULL; + ExceptionRecord.NumberParameters = 1; + ExceptionRecord.ExceptionFlags = 0; + ExceptionRecord.ExceptionInformation[0] = AllocationSize; + + RtlRaiseException(&ExceptionRecord); + } + + /* Release the heap lock if it was acquired */ + if (HeapLocked) + RtlLeaveHeapLock(Heap->LockVariable); + + return Ptr; +} + + +/*********************************************************************** + * RtlCompactHeap + * + * @unimplemented + */ +ULONG NTAPI +RtlCompactHeap(HANDLE Heap, + ULONG Flags) +{ + UNIMPLEMENTED; + return 0; +} + + +/*********************************************************************** + * RtlLockHeap + * Attempts to acquire the critical section object for a specified heap. + * + * PARAMS + * Heap [in] Handle of heap to lock for exclusive access + * + * RETURNS + * TRUE: Success + * FALSE: Failure + * + * @implemented + */ +BOOLEAN NTAPI +RtlLockHeap(IN HANDLE HeapPtr) +{ + PHEAP Heap = (PHEAP)HeapPtr; + + // FIXME Check for special heap + + /* Check if it's really a heap */ + if (Heap->Signature != HEAP_SIGNATURE) return FALSE; + + /* Lock if it's lockable */ + if (!(Heap->Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + } + + return TRUE; +} + + +/*********************************************************************** + * RtlUnlockHeap + * Releases ownership of the critical section object. + * + * PARAMS + * Heap [in] Handle to the heap to unlock + * + * RETURNS + * TRUE: Success + * FALSE: Failure + * + * @implemented + */ +BOOLEAN NTAPI +RtlUnlockHeap(HANDLE HeapPtr) +{ + PHEAP Heap = (PHEAP)HeapPtr; + + // FIXME Check for special heap + + /* Check if it's really a heap */ + if (Heap->Signature != HEAP_SIGNATURE) return FALSE; + + /* Unlock if it's lockable */ + if (!(Heap->Flags & HEAP_NO_SERIALIZE)) + { + RtlLeaveHeapLock(Heap->LockVariable); + } + + return TRUE; +} + + +/*********************************************************************** + * RtlSizeHeap + * PARAMS + * Heap [in] Handle of heap + * Flags [in] Heap size control flags + * Ptr [in] Address of memory to return size for + * + * RETURNS + * Size in bytes of allocated memory + * 0xffffffff: Failure + * + * @implemented + */ +SIZE_T NTAPI +RtlSizeHeap( + HANDLE HeapPtr, + ULONG Flags, + PVOID Ptr +) +{ + PHEAP Heap = (PHEAP)HeapPtr; + PHEAP_ENTRY HeapEntry; + SIZE_T EntrySize; + + // FIXME This is a hack around missing SEH support! + if (!Heap) + { + RtlSetLastWin32ErrorAndNtStatusFromNtStatus(STATUS_INVALID_HANDLE); + return (SIZE_T)-1; + } + + /* Force flags */ + Flags |= Heap->ForceFlags; + + /* Call special heap */ + if (RtlpHeapIsSpecial(Flags)) + return RtlDebugSizeHeap(Heap, Flags, Ptr); + + /* Get the heap entry pointer */ + HeapEntry = (PHEAP_ENTRY)Ptr - 1; + + /* Return -1 if that entry is free */ + if (!(HeapEntry->Flags & HEAP_ENTRY_BUSY)) + { + RtlSetLastWin32ErrorAndNtStatusFromNtStatus(STATUS_INVALID_PARAMETER); + return (SIZE_T)-1; + } + + /* Get size of this block depending if it's a usual or a big one */ + if (HeapEntry->Flags & HEAP_ENTRY_VIRTUAL_ALLOC) + { + EntrySize = RtlpGetSizeOfBigBlock(HeapEntry); + } + else + { + /* Calculate it */ + EntrySize = (HeapEntry->Size << HEAP_ENTRY_SHIFT) - HeapEntry->UnusedBytes; + } + + /* Return calculated size */ + return EntrySize; +} + +BOOLEAN NTAPI +RtlpCheckInUsePattern(PHEAP_ENTRY HeapEntry) +{ + SIZE_T Size, Result; + PCHAR TailPart; + + /* Calculate size */ + if (HeapEntry->Flags & HEAP_ENTRY_VIRTUAL_ALLOC) + Size = RtlpGetSizeOfBigBlock(HeapEntry); + else + Size = (HeapEntry->Size << HEAP_ENTRY_SHIFT) - HeapEntry->UnusedBytes; + + /* Calculate pointer to the tail part of the block */ + TailPart = (PCHAR)(HeapEntry + 1) + Size; + + /* Compare tail pattern */ + Result = RtlCompareMemory(TailPart, + FillPattern, + HEAP_ENTRY_SIZE); + + if (Result != HEAP_ENTRY_SIZE) + { + DPRINT1("HEAP: Heap entry (size %x) %p tail is modified at %p\n", Size, HeapEntry, TailPart + Result); + return FALSE; + } + + /* All is fine */ + return TRUE; +} + +BOOLEAN NTAPI +RtlpValidateHeapHeaders( + PHEAP Heap, + BOOLEAN Recalculate) +{ + // We skip header validation for now + return TRUE; +} + +BOOLEAN NTAPI +RtlpValidateHeapEntry( + PHEAP Heap, + PHEAP_ENTRY HeapEntry) +{ + BOOLEAN BigAllocation, EntryFound = FALSE; + PHEAP_SEGMENT Segment; + ULONG SegmentOffset; + + /* Perform various consistency checks of this entry */ + if (!HeapEntry) goto invalid_entry; + if ((ULONG_PTR)HeapEntry & (HEAP_ENTRY_SIZE - 1)) goto invalid_entry; + if (!(HeapEntry->Flags & HEAP_ENTRY_BUSY)) goto invalid_entry; + + BigAllocation = HeapEntry->Flags & HEAP_ENTRY_VIRTUAL_ALLOC; + Segment = Heap->Segments[HeapEntry->SegmentOffset]; + + if (BigAllocation && + (((ULONG_PTR)HeapEntry & (PAGE_SIZE - 1)) != FIELD_OFFSET(HEAP_VIRTUAL_ALLOC_ENTRY, BusyBlock))) + goto invalid_entry; + + if (!BigAllocation && (HeapEntry->SegmentOffset >= HEAP_SEGMENTS || + !Segment || + HeapEntry < Segment->FirstEntry || + HeapEntry >= Segment->LastValidEntry)) + goto invalid_entry; + + if ((HeapEntry->Flags & HEAP_ENTRY_FILL_PATTERN) && + !RtlpCheckInUsePattern(HeapEntry)) + goto invalid_entry; + + /* Checks are done, if this is a virtual entry, that's all */ + if (HeapEntry->Flags & HEAP_ENTRY_VIRTUAL_ALLOC) return TRUE; + + /* Go through segments and check if this entry fits into any of them */ + for (SegmentOffset = 0; SegmentOffset < HEAP_SEGMENTS; SegmentOffset++) + { + Segment = Heap->Segments[SegmentOffset]; + if (!Segment) continue; + + if ((HeapEntry >= Segment->FirstEntry) && + (HeapEntry < Segment->LastValidEntry)) + { + /* Got it */ + EntryFound = TRUE; + break; + } + } + + /* Return our result of finding entry in the segments */ + return EntryFound; + +invalid_entry: + DPRINT1("HEAP: Invalid heap entry %p in heap %p\n", HeapEntry, Heap); + return FALSE; +} + +BOOLEAN NTAPI +RtlpValidateHeapSegment( + PHEAP Heap, + PHEAP_SEGMENT Segment, + UCHAR SegmentOffset, + PULONG FreeEntriesCount, + PSIZE_T TotalFreeSize, + PSIZE_T TagEntries, + PSIZE_T PseudoTagEntries) +{ + PHEAP_UCR_DESCRIPTOR UcrDescriptor; + PLIST_ENTRY UcrEntry; + SIZE_T ByteSize, Size, Result; + PHEAP_ENTRY CurrentEntry; + ULONG UnCommittedPages; + ULONG UnCommittedRanges; + ULONG PreviousSize; + + UnCommittedPages = 0; + UnCommittedRanges = 0; + + if (IsListEmpty(&Segment->UCRSegmentList)) + { + UcrEntry = NULL; + UcrDescriptor = NULL; + } + else + { + UcrEntry = Segment->UCRSegmentList.Flink; + UcrDescriptor = CONTAINING_RECORD(UcrEntry, HEAP_UCR_DESCRIPTOR, SegmentEntry); + } + + if (Segment->BaseAddress == Heap) + CurrentEntry = &Heap->Entry; + else + CurrentEntry = &Segment->Entry; + + while (CurrentEntry < Segment->LastValidEntry) + { + if (UcrDescriptor && + ((PVOID)CurrentEntry >= UcrDescriptor->Address)) + { + DPRINT1("HEAP: Entry %p is not inside uncommited range [%p .. %p)\n", + CurrentEntry, UcrDescriptor->Address, + (PCHAR)UcrDescriptor->Address + UcrDescriptor->Size); + + return FALSE; + } + + PreviousSize = 0; + + while (CurrentEntry < Segment->LastValidEntry) + { + if (PreviousSize != CurrentEntry->PreviousSize) + { + DPRINT1("HEAP: Entry %p has incorrect PreviousSize %x instead of %x\n", + CurrentEntry, CurrentEntry->PreviousSize, PreviousSize); + + return FALSE; + } + + PreviousSize = CurrentEntry->Size; + Size = CurrentEntry->Size << HEAP_ENTRY_SHIFT; + + if (CurrentEntry->Flags & HEAP_ENTRY_BUSY) + { + if (TagEntries) + { + UNIMPLEMENTED; + } + + /* Check fill pattern */ + if (CurrentEntry->Flags & HEAP_ENTRY_FILL_PATTERN) + { + if (!RtlpCheckInUsePattern(CurrentEntry)) + return FALSE; + } + } + else + { + /* The entry is free, increase free entries count and total free size */ + *FreeEntriesCount = *FreeEntriesCount + 1; + *TotalFreeSize += CurrentEntry->Size; + + if ((Heap->Flags & HEAP_FREE_CHECKING_ENABLED) && + (CurrentEntry->Flags & HEAP_ENTRY_FILL_PATTERN)) + { + ByteSize = Size - sizeof(HEAP_FREE_ENTRY); + + if ((CurrentEntry->Flags & HEAP_ENTRY_EXTRA_PRESENT) && + (ByteSize > sizeof(HEAP_FREE_ENTRY_EXTRA))) + { + ByteSize -= sizeof(HEAP_FREE_ENTRY_EXTRA); + } + + Result = RtlCompareMemoryUlong((PCHAR)((PHEAP_FREE_ENTRY)CurrentEntry + 1), + ByteSize, + ARENA_FREE_FILLER); + + if (Result != ByteSize) + { + DPRINT1("HEAP: Free heap block %p modified at %p after it was freed\n", + CurrentEntry, + (PCHAR)(CurrentEntry + 1) + Result); + + return FALSE; + } + } + } + + if (CurrentEntry->SegmentOffset != SegmentOffset) + { + DPRINT1("HEAP: Heap entry %p SegmentOffset is incorrect %x (should be %x)\n", CurrentEntry, SegmentOffset, CurrentEntry->SegmentOffset); + return FALSE; + } + + /* Check if it's the last entry */ + if (CurrentEntry->Flags & HEAP_ENTRY_LAST_ENTRY) + { + CurrentEntry = (PHEAP_ENTRY)((PCHAR)CurrentEntry + Size); + + if (!UcrDescriptor) + { + /* Check if it's not really the last one */ + if (CurrentEntry != Segment->LastValidEntry) + { + DPRINT1("HEAP: Heap entry %p is not last block in segment (%x)\n", CurrentEntry, Segment->LastValidEntry); + return FALSE; + } + } + else if (CurrentEntry != UcrDescriptor->Address) + { + DPRINT1("HEAP: Heap entry %p does not match next uncommitted address (%p)\n", + CurrentEntry, UcrDescriptor->Address); + + return FALSE; + } + else + { + UnCommittedPages += (UcrDescriptor->Size / PAGE_SIZE); + UnCommittedRanges++; + + CurrentEntry = (PHEAP_ENTRY)((PCHAR)UcrDescriptor->Address + UcrDescriptor->Size); + + /* Go to the next UCR descriptor */ + UcrEntry = UcrEntry->Flink; + if (UcrEntry == &Segment->UCRSegmentList) + { + UcrEntry = NULL; + UcrDescriptor = NULL; + } + else + { + UcrDescriptor = CONTAINING_RECORD(UcrEntry, HEAP_UCR_DESCRIPTOR, SegmentEntry); + } + } + + break; + } + + /* Advance to the next entry */ + CurrentEntry = (PHEAP_ENTRY)((PCHAR)CurrentEntry + Size); + } + } + + /* Check total numbers of UCP and UCR */ + if (Segment->NumberOfUnCommittedPages != UnCommittedPages) + { + DPRINT1("HEAP: Segment %p NumberOfUnCommittedPages is invalid (%x != %x)\n", + Segment, Segment->NumberOfUnCommittedPages, UnCommittedPages); + + return FALSE; + } + + if (Segment->NumberOfUnCommittedRanges != UnCommittedRanges) + { + DPRINT1("HEAP: Segment %p NumberOfUnCommittedRanges is invalid (%x != %x)\n", + Segment, Segment->NumberOfUnCommittedRanges, UnCommittedRanges); + + return FALSE; + } + + return TRUE; +} + +BOOLEAN NTAPI +RtlpValidateHeap(PHEAP Heap, + BOOLEAN ForceValidation) +{ + PHEAP_SEGMENT Segment; + BOOLEAN EmptyList; + UCHAR SegmentOffset; + SIZE_T Size, TotalFreeSize; + ULONG PreviousSize; + PHEAP_VIRTUAL_ALLOC_ENTRY VirtualAllocBlock; + PLIST_ENTRY ListHead, NextEntry; + PHEAP_FREE_ENTRY FreeEntry; + ULONG FreeBlocksCount, FreeListEntriesCount; + + /* Check headers */ + if (!RtlpValidateHeapHeaders(Heap, FALSE)) + return FALSE; + + /* Skip validation if it's not needed */ + if (!ForceValidation && !(Heap->Flags & HEAP_VALIDATE_ALL_ENABLED)) + return TRUE; + + /* Check free lists bitmaps */ + FreeListEntriesCount = 0; + ListHead = &Heap->FreeLists[0]; + + for (Size = 0; Size < HEAP_FREELISTS; Size++) + { + if (Size) + { + /* This is a dedicated list. Check if it's empty */ + EmptyList = IsListEmpty(ListHead); + + if (Heap->u.FreeListsInUseBytes[Size >> 3] & (1 << (Size & 7))) + { + if (EmptyList) + { + DPRINT1("HEAP: Empty %x-free list marked as non-empty\n", Size); + return FALSE; + } + } + else + { + if (!EmptyList) + { + DPRINT1("HEAP: Non-empty %x-free list marked as empty\n", Size); + return FALSE; + } + } + } + + /* Now check this list entries */ + NextEntry = ListHead->Flink; + PreviousSize = 0; + + while (ListHead != NextEntry) + { + FreeEntry = CONTAINING_RECORD(NextEntry, HEAP_FREE_ENTRY, FreeList); + NextEntry = NextEntry->Flink; + + /* If there is an in-use entry in a free list - that's quite a big problem */ + if (FreeEntry->Flags & HEAP_ENTRY_BUSY) + { + DPRINT1("HEAP: %x-dedicated list free element %x is marked in-use\n", Size, FreeEntry); + return FALSE; + } + + /* Check sizes according to that specific list's size */ + if ((Size == 0) && (FreeEntry->Size < HEAP_FREELISTS)) + { + DPRINT1("HEAP: Non dedicated list free element %x has size %x which would fit a dedicated list\n", FreeEntry, FreeEntry->Size); + return FALSE; + } + else if (Size && (FreeEntry->Size != Size)) + { + DPRINT1("HEAP: %x-dedicated list free element %x has incorrect size %x\n", Size, FreeEntry, FreeEntry->Size); + return FALSE; + } + else if ((Size == 0) && (FreeEntry->Size < PreviousSize)) + { + DPRINT1("HEAP: Non dedicated list free element %x is not put in order\n", FreeEntry); + return FALSE; + } + + /* Remember previous size*/ + PreviousSize = FreeEntry->Size; + + /* Add up to the total amount of free entries */ + FreeListEntriesCount++; + } + + /* Go to the head of the next free list */ + ListHead++; + } + + /* Check big allocations */ + ListHead = &Heap->VirtualAllocdBlocks; + NextEntry = ListHead->Flink; + + while (ListHead != NextEntry) + { + VirtualAllocBlock = CONTAINING_RECORD(NextEntry, HEAP_VIRTUAL_ALLOC_ENTRY, Entry); + + /* We can only check the fill pattern */ + if (VirtualAllocBlock->BusyBlock.Flags & HEAP_ENTRY_FILL_PATTERN) + { + if (!RtlpCheckInUsePattern(&VirtualAllocBlock->BusyBlock)) + return FALSE; + } + + NextEntry = NextEntry->Flink; + } + + /* Check all segments */ + FreeBlocksCount = 0; + TotalFreeSize = 0; + + for (SegmentOffset = 0; SegmentOffset < HEAP_SEGMENTS; SegmentOffset++) + { + Segment = Heap->Segments[SegmentOffset]; + + /* Go to the next one if there is no segment */ + if (!Segment) continue; + + if (!RtlpValidateHeapSegment(Heap, + Segment, + SegmentOffset, + &FreeBlocksCount, + &TotalFreeSize, + NULL, + NULL)) + { + return FALSE; + } + } + + if (FreeListEntriesCount != FreeBlocksCount) + { + DPRINT1("HEAP: Free blocks count in arena (%d) does not match free blocks number in the free lists (%d)\n", FreeBlocksCount, FreeListEntriesCount); + return FALSE; + } + + if (Heap->TotalFreeSize != TotalFreeSize) + { + DPRINT1("HEAP: Total size of free blocks in arena (%d) does not equal to the one in heap header (%d)\n", TotalFreeSize, Heap->TotalFreeSize); + return FALSE; + } + + return TRUE; +} + +/*********************************************************************** + * RtlValidateHeap + * Validates a specified heap. + * + * PARAMS + * Heap [in] Handle to the heap + * Flags [in] Bit flags that control access during operation + * Block [in] Optional pointer to memory block to validate + * + * NOTES + * Flags is ignored. + * + * RETURNS + * TRUE: Success + * FALSE: Failure + * + * @implemented + */ +BOOLEAN NTAPI RtlValidateHeap( + HANDLE HeapPtr, + ULONG Flags, + PVOID Block +) +{ + PHEAP Heap = (PHEAP)HeapPtr; + BOOLEAN HeapLocked = FALSE; + BOOLEAN HeapValid; + + // FIXME Check for special heap + + /* Check signature */ + if (Heap->Signature != HEAP_SIGNATURE) + { + DPRINT1("HEAP: Signature %x is invalid for heap %p\n", Heap->Signature, Heap); + return FALSE; + } + + /* Force flags */ + Flags = Heap->ForceFlags; + + /* Acquire the lock if necessary */ + if (!(Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + HeapLocked = TRUE; + } + + /* Either validate whole heap or just one entry */ + if (!Block) + HeapValid = RtlpValidateHeap(Heap, TRUE); + else + HeapValid = RtlpValidateHeapEntry(Heap, (PHEAP_ENTRY)Block - 1); + + /* Unlock if it's lockable */ + if (HeapLocked) + { + RtlLeaveHeapLock(Heap->LockVariable); + } + + return HeapValid; +} + +VOID +RtlInitializeHeapManager(VOID) +{ + PPEB Peb; + + /* Get PEB */ + Peb = RtlGetCurrentPeb(); + + /* Initialize heap-related fields of PEB */ + Peb->NumberOfHeaps = 0; + + /* Initialize the process heaps list protecting lock */ + RtlInitializeHeapLock(&RtlpProcessHeapsListLock); +} + + +/* + * @implemented + */ +NTSTATUS NTAPI +RtlEnumProcessHeaps(PHEAP_ENUMERATION_ROUTINE HeapEnumerationRoutine, + PVOID lParam) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @implemented + */ +ULONG NTAPI +RtlGetProcessHeaps(ULONG count, + HANDLE *heaps) +{ + UNIMPLEMENTED; + return 0; +} + + +/* + * @implemented + */ +BOOLEAN NTAPI +RtlValidateProcessHeaps(VOID) +{ + UNIMPLEMENTED; + return TRUE; +} + + +/* + * @unimplemented + */ +BOOLEAN NTAPI +RtlZeroHeap( + IN PVOID HeapHandle, + IN ULONG Flags + ) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @implemented + */ +BOOLEAN +NTAPI +RtlSetUserValueHeap(IN PVOID HeapHandle, + IN ULONG Flags, + IN PVOID BaseAddress, + IN PVOID UserValue) +{ + PHEAP Heap = (PHEAP)HeapHandle; + PHEAP_ENTRY HeapEntry; + PHEAP_ENTRY_EXTRA Extra; + BOOLEAN HeapLocked = FALSE; + + /* Force flags */ + Flags |= Heap->Flags; + + /* Call special heap */ + if (RtlpHeapIsSpecial(Flags)) + return RtlDebugSetUserValueHeap(Heap, Flags, BaseAddress, UserValue); + + /* Lock if it's lockable */ + if (!(Heap->Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + HeapLocked = TRUE; + } + + /* Get a pointer to the entry */ + HeapEntry = (PHEAP_ENTRY)BaseAddress - 1; + + /* If it's a free entry - return error */ + if (!(HeapEntry->Flags & HEAP_ENTRY_BUSY)) + { + RtlSetLastWin32ErrorAndNtStatusFromNtStatus(STATUS_INVALID_PARAMETER); + + /* Release the heap lock if it was acquired */ + if (HeapLocked) + RtlLeaveHeapLock(Heap->LockVariable); + + return FALSE; + } + + /* Check if this entry has an extra stuff associated with it */ + if (HeapEntry->Flags & HEAP_ENTRY_EXTRA_PRESENT) + { + /* Use extra to store the value */ + Extra = RtlpGetExtraStuffPointer(HeapEntry); + Extra->Settable = (ULONG_PTR)UserValue; + } + + /* Release the heap lock if it was acquired */ + if (HeapLocked) + RtlLeaveHeapLock(Heap->LockVariable); + + return TRUE; +} + +/* + * @implemented + */ +BOOLEAN +NTAPI +RtlSetUserFlagsHeap(IN PVOID HeapHandle, + IN ULONG Flags, + IN PVOID BaseAddress, + IN ULONG UserFlagsReset, + IN ULONG UserFlagsSet) +{ + PHEAP Heap = (PHEAP)HeapHandle; + PHEAP_ENTRY HeapEntry; + BOOLEAN HeapLocked = FALSE; + + /* Force flags */ + Flags |= Heap->Flags; + + /* Call special heap */ + if (RtlpHeapIsSpecial(Flags)) + return RtlDebugSetUserFlagsHeap(Heap, Flags, BaseAddress, UserFlagsReset, UserFlagsSet); + + /* Lock if it's lockable */ + if (!(Heap->Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + HeapLocked = TRUE; + } + + /* Get a pointer to the entry */ + HeapEntry = (PHEAP_ENTRY)BaseAddress - 1; + + /* If it's a free entry - return error */ + if (!(HeapEntry->Flags & HEAP_ENTRY_BUSY)) + { + RtlSetLastWin32ErrorAndNtStatusFromNtStatus(STATUS_INVALID_PARAMETER); + + /* Release the heap lock if it was acquired */ + if (HeapLocked) + RtlLeaveHeapLock(Heap->LockVariable); + + return FALSE; + } + + /* Set / reset flags */ + HeapEntry->Flags &= ~(UserFlagsReset >> 4); + HeapEntry->Flags |= (UserFlagsSet >> 4); + + /* Release the heap lock if it was acquired */ + if (HeapLocked) + RtlLeaveHeapLock(Heap->LockVariable); + + return TRUE; +} + +/* + * @implemented + */ +BOOLEAN +NTAPI +RtlGetUserInfoHeap(IN PVOID HeapHandle, + IN ULONG Flags, + IN PVOID BaseAddress, + OUT PVOID *UserValue, + OUT PULONG UserFlags) +{ + PHEAP Heap = (PHEAP)HeapHandle; + PHEAP_ENTRY HeapEntry; + PHEAP_ENTRY_EXTRA Extra; + BOOLEAN HeapLocked = FALSE; + + /* Force flags */ + Flags |= Heap->Flags; + + /* Call special heap */ + if (RtlpHeapIsSpecial(Flags)) + return RtlDebugGetUserInfoHeap(Heap, Flags, BaseAddress, UserValue, UserFlags); + + /* Lock if it's lockable */ + if (!(Heap->Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + HeapLocked = TRUE; + } + + /* Get a pointer to the entry */ + HeapEntry = (PHEAP_ENTRY)BaseAddress - 1; + + /* If it's a free entry - return error */ + if (!(HeapEntry->Flags & HEAP_ENTRY_BUSY)) + { + RtlSetLastWin32ErrorAndNtStatusFromNtStatus(STATUS_INVALID_PARAMETER); + + /* Release the heap lock if it was acquired */ + if (HeapLocked) + RtlLeaveHeapLock(Heap->LockVariable); + + return FALSE; + } + + /* Check if this entry has an extra stuff associated with it */ + if (HeapEntry->Flags & HEAP_ENTRY_EXTRA_PRESENT) + { + /* Get pointer to extra data */ + Extra = RtlpGetExtraStuffPointer(HeapEntry); + + /* Pass user value */ + if (UserValue) + *UserValue = (PVOID)Extra->Settable; + + /* Decode and return user flags */ + if (UserFlags) + *UserFlags = (HeapEntry->Flags & HEAP_ENTRY_SETTABLE_FLAGS) << 4; + } + + /* Release the heap lock if it was acquired */ + if (HeapLocked) + RtlLeaveHeapLock(Heap->LockVariable); + + return TRUE; +} + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +RtlUsageHeap(IN HANDLE Heap, + IN ULONG Flags, + OUT PRTL_HEAP_USAGE Usage) +{ + /* TODO */ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +PWSTR +NTAPI +RtlQueryTagHeap(IN PVOID HeapHandle, + IN ULONG Flags, + IN USHORT TagIndex, + IN BOOLEAN ResetCounters, + OUT PRTL_HEAP_TAG_INFO HeapTagInfo) +{ + /* TODO */ + UNIMPLEMENTED; + return NULL; +} + +ULONG +NTAPI +RtlExtendHeap(IN HANDLE Heap, + IN ULONG Flags, + IN PVOID P, + IN SIZE_T Size) +{ + /* TODO */ + UNIMPLEMENTED; + return 0; +} + +ULONG +NTAPI +RtlCreateTagHeap(IN HANDLE HeapHandle, + IN ULONG Flags, + IN PWSTR TagName, + IN PWSTR TagSubName) +{ + /* TODO */ + UNIMPLEMENTED; + return 0; +} + +NTSTATUS +NTAPI +RtlWalkHeap(IN HANDLE HeapHandle, + IN PVOID HeapEntry) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +PVOID +NTAPI +RtlProtectHeap(IN PVOID HeapHandle, + IN BOOLEAN ReadOnly) +{ + UNIMPLEMENTED; + return NULL; +} + +NTSTATUS +NTAPI +RtlSetHeapInformation(IN HANDLE HeapHandle OPTIONAL, + IN HEAP_INFORMATION_CLASS HeapInformationClass, + IN PVOID HeapInformation, + IN SIZE_T HeapInformationLength) +{ + /* Setting heap information is not really supported except for enabling LFH */ + if (HeapInformationClass == 0) return STATUS_SUCCESS; + + /* Check buffer length */ + if (HeapInformationLength < sizeof(ULONG)) + { + /* The provided buffer is too small */ + return STATUS_BUFFER_TOO_SMALL; + } + + /* Check for a special magic value for enabling LFH */ + if (*(PULONG)HeapInformation == 2) + { + DPRINT1("RtlSetHeapInformation() needs to enable LFH\n"); + return STATUS_SUCCESS; + } + + return STATUS_UNSUCCESSFUL; +} + +NTSTATUS +NTAPI +RtlQueryHeapInformation(HANDLE HeapHandle, + HEAP_INFORMATION_CLASS HeapInformationClass, + PVOID HeapInformation OPTIONAL, + SIZE_T HeapInformationLength OPTIONAL, + PSIZE_T ReturnLength OPTIONAL) +{ + PHEAP Heap = (PHEAP)HeapHandle; + + /* Only HeapCompatibilityInformation is supported */ + if (HeapInformationClass != HeapCompatibilityInformation) + return STATUS_UNSUCCESSFUL; + + /* Set result length */ + if (ReturnLength) *ReturnLength = sizeof(ULONG); + + /* Check buffer length */ + if (HeapInformationLength < sizeof(ULONG)) + { + /* It's too small, return needed length */ + return STATUS_BUFFER_TOO_SMALL; + } + + /* Return front end heap type */ + *(PULONG)HeapInformation = Heap->FrontEndHeapType; + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +RtlMultipleAllocateHeap(IN PVOID HeapHandle, + IN ULONG Flags, + IN SIZE_T Size, + IN ULONG Count, + OUT PVOID *Array) +{ + UNIMPLEMENTED; + return 0; +} + +NTSTATUS +NTAPI +RtlMultipleFreeHeap(IN PVOID HeapHandle, + IN ULONG Flags, + IN ULONG Count, + OUT PVOID *Array) +{ + UNIMPLEMENTED; + return 0; +} + +/* EOF */ diff --git a/lib/rtl/heapdbg.c b/lib/rtl/heapdbg.c new file mode 100644 index 00000000000..b8d68bd31eb --- /dev/null +++ b/lib/rtl/heapdbg.c @@ -0,0 +1,565 @@ +/* + * PROJECT: ReactOS Runtime Library + * LICENSE: GPL - See COPYING in the top level directory + * FILE: lib/rtl/heapdbg.c + * PURPOSE: Heap manager debug heap + * PROGRAMMERS: Copyright 2010 Aleksey Bragin + */ + +/* INCLUDES ******************************************************************/ + +#include +#include + +#define NDEBUG +#include + +BOOLEAN RtlpPageHeapEnabled = FALSE; +ULONG RtlpPageHeapGlobalFlags; +ULONG RtlpPageHeapSizeRangeStart, RtlpPageHeapSizeRangeEnd; +ULONG RtlpPageHeapDllRangeStart, RtlpPageHeapDllRangeEnd; +WCHAR RtlpPageHeapTargetDlls[512]; + +/* FUNCTIONS ******************************************************************/ + +HANDLE NTAPI +RtlDebugCreateHeap(ULONG Flags, + PVOID Addr, + SIZE_T ReserveSize, + SIZE_T CommitSize, + PVOID Lock, + PRTL_HEAP_PARAMETERS Parameters) +{ + MEMORY_BASIC_INFORMATION MemoryInfo; + NTSTATUS Status; + PHEAP Heap; + + /* Validate parameters */ + if (ReserveSize <= HEAP_ENTRY_SIZE) + { + DPRINT1("HEAP: Incorrect ReserveSize %x\n", ReserveSize); + return NULL; + } + + if (ReserveSize < CommitSize) + { + DPRINT1("HEAP: Incorrect CommitSize %x\n", CommitSize); + return NULL; + } + + if (Flags & HEAP_NO_SERIALIZE && Lock) + { + DPRINT1("HEAP: Can't specify Lock routine and have HEAP_NO_SERIALIZE flag set\n"); + return NULL; + } + + /* If the address is specified, check it's virtual memory */ + if (Addr) + { + Status = ZwQueryVirtualMemory(NtCurrentProcess(), + Addr, + MemoryBasicInformation, + &MemoryInfo, + sizeof(MemoryInfo), + NULL); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("HEAP: Specified heap base address %p is invalid, Status 0x%08X\n", Addr, Status); + return NULL; + } + + if (MemoryInfo.BaseAddress != Addr) + { + DPRINT1("HEAP: Specified heap base address %p is not really a base one %p\n", Addr, MemoryInfo.BaseAddress); + return NULL; + } + + if (MemoryInfo.State == MEM_FREE) + { + DPRINT1("HEAP: Specified heap base address %p is free\n", Addr); + return NULL; + } + } + + /* All validation performed, now call the real routine with skip validation check flag */ + Flags |= HEAP_SKIP_VALIDATION_CHECKS | + HEAP_TAIL_CHECKING_ENABLED | + HEAP_FREE_CHECKING_ENABLED; + + Heap = RtlCreateHeap(Flags, Addr, ReserveSize, CommitSize, Lock, Parameters); + if (!Heap) return NULL; + + // FIXME: Capture stack backtrace + + RtlpValidateHeapHeaders(Heap, TRUE); + + return Heap; +} + +BOOLEAN NTAPI +RtlDebugDestroyHeap(HANDLE HeapPtr) +{ + SIZE_T Size; + PHEAP Heap = (PHEAP)HeapPtr; + + if (Heap == RtlGetCurrentPeb()->ProcessHeap) + { + DPRINT1("HEAP: It's forbidden delete process heap!"); + return FALSE; + } + + if (Heap->Signature != HEAP_SIGNATURE) + { + DPRINT1("HEAP: Invalid heap %p signature 0x%x\n", Heap, Heap->Signature); + return FALSE; + } + + if (!RtlpValidateHeap(Heap, FALSE)) return FALSE; + + /* Make heap invalid by zeroing its signature */ + Heap->Signature = 0; + + /* Free validate headers copy if it was existing */ + if (Heap->HeaderValidateCopy) + { + ZwFreeVirtualMemory(NtCurrentProcess(), + &Heap->HeaderValidateCopy, + &Size, + MEM_RELEASE); + } + + return TRUE; +} + +PVOID NTAPI +RtlDebugAllocateHeap(PVOID HeapPtr, + ULONG Flags, + SIZE_T Size) +{ + PHEAP Heap = (PHEAP)HeapPtr; + SIZE_T AllocSize = 1; + BOOLEAN HeapLocked = FALSE; + PVOID Result; + + //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS) + //return RtlpPageHeapAllocateHeap(HeapPtr, Flags, Size); + + if (Heap->Signature != HEAP_SIGNATURE) + { + DPRINT1("HEAP: Invalid heap %p signature 0x%x\n", Heap, Heap->Signature); + return NULL; + } + + /* Add settable user value flag */ + Flags |= Heap->ForceFlags | HEAP_SETTABLE_USER_VALUE | HEAP_SKIP_VALIDATION_CHECKS; + + /* Calculate size */ + if (Size) AllocSize = Size; + AllocSize = ((AllocSize + Heap->AlignRound) & Heap->AlignMask) + sizeof(HEAP_ENTRY_EXTRA); + + /* Check if size didn't exceed max one */ + if (AllocSize < Size || + AllocSize > Heap->MaximumAllocationSize) + { + DPRINT1("HEAP: Too big allocation size %x (max allowed %x)\n", Size, Heap->MaximumAllocationSize); + return NULL; + } + + /* Lock the heap ourselves */ + if (!(Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + HeapLocked = TRUE; + + /* Add no serialize flag so that the main routine won't try to acquire the lock again */ + Flags |= HEAP_NO_SERIALIZE; + } + + /* Validate the heap if necessary */ + RtlpValidateHeap(Heap, FALSE); + + /* Call main routine to do the stuff */ + Result = RtlAllocateHeap(HeapPtr, Flags, Size); + + /* Validate heap headers */ + RtlpValidateHeapHeaders(Heap, TRUE); + + if (Result) + { + if (Heap->Flags & HEAP_VALIDATE_ALL_ENABLED) + RtlpValidateHeap(Heap, FALSE); + } + + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + + return Result; +} + +PVOID NTAPI +RtlDebugReAllocateHeap(HANDLE HeapPtr, + ULONG Flags, + PVOID Ptr, + SIZE_T Size) +{ + PHEAP Heap = (PHEAP)HeapPtr; + SIZE_T AllocSize = 1; + BOOLEAN HeapLocked = FALSE; + PVOID Result = NULL; + PHEAP_ENTRY HeapEntry; + + //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS) + //return RtlpPageHeapReAllocateHeap(HeapPtr, Flags, Size); + + if (Heap->Signature != HEAP_SIGNATURE) + { + DPRINT1("HEAP: Invalid heap %p signature 0x%x\n", Heap, Heap->Signature); + return NULL; + } + + /* Add settable user value flag */ + Flags |= Heap->ForceFlags | HEAP_SETTABLE_USER_VALUE | HEAP_SKIP_VALIDATION_CHECKS; + + /* Calculate size */ + if (Size) AllocSize = Size; + AllocSize = ((AllocSize + Heap->AlignRound) & Heap->AlignMask) + sizeof(HEAP_ENTRY_EXTRA); + + /* Check if size didn't exceed max one */ + if (AllocSize < Size || + AllocSize > Heap->MaximumAllocationSize) + { + DPRINT1("HEAP: Too big allocation size %x (max allowed %x)\n", Size, Heap->MaximumAllocationSize); + return NULL; + } + + /* Lock the heap ourselves */ + if (!(Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + HeapLocked = TRUE; + + /* Add no serialize flag so that the main routine won't try to acquire the lock again */ + Flags |= HEAP_NO_SERIALIZE; + } + + /* Validate the heap if necessary */ + RtlpValidateHeap(Heap, FALSE); + + /* Get the existing heap entry */ + HeapEntry = (PHEAP_ENTRY)Ptr - 1; + + /* Validate it */ + if (RtlpValidateHeapEntry(Heap, HeapEntry)) + { + /* Call main routine to do the stuff */ + Result = RtlReAllocateHeap(HeapPtr, Flags, Ptr, Size); + + if (Result) + { + /* Validate heap headers and then heap itself */ + RtlpValidateHeapHeaders(Heap, TRUE); + RtlpValidateHeap(Heap, FALSE); + } + } + + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + + return Result; +} + +BOOLEAN NTAPI +RtlDebugFreeHeap(HANDLE HeapPtr, + ULONG Flags, + PVOID Ptr) +{ + PHEAP Heap = (PHEAP)HeapPtr; + BOOLEAN HeapLocked = FALSE; + PHEAP_ENTRY HeapEntry; + BOOLEAN Result = FALSE; + + //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS) + //return RtlpPageHeapFreeHeap(HeapPtr, Flags, Size); + + if (Heap->Signature != HEAP_SIGNATURE) + { + DPRINT1("HEAP: Invalid heap %p signature 0x%x\n", Heap, Heap->Signature); + return FALSE; + } + + /* Add skip validation flag */ + Flags |= Heap->ForceFlags | HEAP_SKIP_VALIDATION_CHECKS; + + /* Lock the heap ourselves */ + if (!(Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + HeapLocked = TRUE; + + /* Add no serialize flag so that the main routine won't try to acquire the lock again */ + Flags |= HEAP_NO_SERIALIZE; + } + + /* Validate the heap if necessary */ + RtlpValidateHeap(Heap, FALSE); + + /* Get the existing heap entry */ + HeapEntry = (PHEAP_ENTRY)Ptr - 1; + + /* Validate it */ + if (RtlpValidateHeapEntry(Heap, HeapEntry)) + { + /* If it succeeded - call the main routine */ + Result = RtlFreeHeap(HeapPtr, Flags, Ptr); + + /* Validate heap headers and then heap itself */ + RtlpValidateHeapHeaders(Heap, TRUE); + RtlpValidateHeap(Heap, FALSE); + } + + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + + return Result; +} + +BOOLEAN NTAPI +RtlDebugGetUserInfoHeap(PVOID HeapHandle, + ULONG Flags, + PVOID BaseAddress, + PVOID *UserValue, + PULONG UserFlags) +{ + PHEAP Heap = (PHEAP)HeapHandle; + BOOLEAN HeapLocked = FALSE; + PHEAP_ENTRY HeapEntry; + BOOLEAN Result = FALSE; + + //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS) + //return RtlpPageHeapGetUserInfoHeap(HeapPtr, Flags, Size); + + if (Heap->Signature != HEAP_SIGNATURE) + { + DPRINT1("HEAP: Invalid heap %p signature 0x%x\n", Heap, Heap->Signature); + return FALSE; + } + + /* Add skip validation flag */ + Flags |= Heap->ForceFlags | HEAP_SKIP_VALIDATION_CHECKS; + + /* Lock the heap ourselves */ + if (!(Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + HeapLocked = TRUE; + + /* Add no serialize flag so that the main routine won't try to acquire the lock again */ + Flags |= HEAP_NO_SERIALIZE; + } + + /* Validate the heap if necessary */ + RtlpValidateHeap(Heap, FALSE); + + /* Get the existing heap entry */ + HeapEntry = (PHEAP_ENTRY)BaseAddress - 1; + + /* Validate it */ + if (RtlpValidateHeapEntry(Heap, HeapEntry)) + { + /* If it succeeded - call the main routine */ + Result = RtlGetUserInfoHeap(HeapHandle, Flags, BaseAddress, UserValue, UserFlags); + } + + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + + return Result; +} + +BOOLEAN NTAPI +RtlDebugSetUserValueHeap(PVOID HeapHandle, + ULONG Flags, + PVOID BaseAddress, + PVOID UserValue) +{ + PHEAP Heap = (PHEAP)HeapHandle; + BOOLEAN HeapLocked = FALSE; + PHEAP_ENTRY HeapEntry; + BOOLEAN Result = FALSE; + + //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS) + //return RtlpPageHeapSetUserValueHeap(HeapPtr, Flags, Size); + + if (Heap->Signature != HEAP_SIGNATURE) + { + DPRINT1("HEAP: Invalid heap %p signature 0x%x\n", Heap, Heap->Signature); + return FALSE; + } + + /* Add skip validation flag */ + Flags |= Heap->ForceFlags | HEAP_SKIP_VALIDATION_CHECKS; + + /* Lock the heap ourselves */ + if (!(Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + HeapLocked = TRUE; + + /* Add no serialize flag so that the main routine won't try to acquire the lock again */ + Flags |= HEAP_NO_SERIALIZE; + } + + /* Validate the heap if necessary */ + RtlpValidateHeap(Heap, FALSE); + + /* Get the existing heap entry */ + HeapEntry = (PHEAP_ENTRY)BaseAddress - 1; + + /* Validate it */ + if (RtlpValidateHeapEntry(Heap, HeapEntry)) + { + /* If it succeeded - call the main routine */ + Result = RtlSetUserValueHeap(HeapHandle, Flags, BaseAddress, UserValue); + + /* Validate the heap */ + RtlpValidateHeap(Heap, FALSE); + } + + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + + return Result; +} + +BOOLEAN +NTAPI +RtlDebugSetUserFlagsHeap(PVOID HeapHandle, + ULONG Flags, + PVOID BaseAddress, + ULONG UserFlagsReset, + ULONG UserFlagsSet) +{ + PHEAP Heap = (PHEAP)HeapHandle; + BOOLEAN HeapLocked = FALSE; + PHEAP_ENTRY HeapEntry; + BOOLEAN Result = FALSE; + + //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS) + //return RtlPageHeapSetUserFlagsHeap(HeapPtr, Flags, BaseAddress, UserFlagsReset, UserFlagsSet); + + /* Check if this heap allows flags to be set at all */ + if (UserFlagsSet & ~HEAP_SETTABLE_USER_FLAGS || + UserFlagsReset & ~HEAP_SETTABLE_USER_FLAGS) + { + return FALSE; + } + + if (Heap->Signature != HEAP_SIGNATURE) + { + DPRINT1("HEAP: Invalid heap %p signature 0x%x\n", Heap, Heap->Signature); + return FALSE; + } + + /* Add skip validation flag */ + Flags |= Heap->ForceFlags | HEAP_SKIP_VALIDATION_CHECKS; + + /* Lock the heap ourselves */ + if (!(Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + HeapLocked = TRUE; + + /* Add no serialize flag so that the main routine won't try to acquire the lock again */ + Flags |= HEAP_NO_SERIALIZE; + } + + /* Validate the heap if necessary */ + RtlpValidateHeap(Heap, FALSE); + + /* Get the existing heap entry */ + HeapEntry = (PHEAP_ENTRY)BaseAddress - 1; + + /* Validate it */ + if (RtlpValidateHeapEntry(Heap, HeapEntry)) + { + /* If it succeeded - call the main routine */ + Result = RtlSetUserFlagsHeap(HeapHandle, Flags, BaseAddress, UserFlagsReset, UserFlagsSet); + + /* Validate the heap */ + RtlpValidateHeap(Heap, FALSE); + } + + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + + return Result; +} + +SIZE_T NTAPI +RtlDebugSizeHeap(HANDLE HeapPtr, + ULONG Flags, + PVOID Ptr) +{ + PHEAP Heap = (PHEAP)HeapPtr; + BOOLEAN HeapLocked = FALSE; + PHEAP_ENTRY HeapEntry; + SIZE_T Result = ~(SIZE_T)0; + + //if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS) + //return RtlPageHeapSizeHeap(HeapPtr, Flags, Ptr); + + /* Check heap signature */ + if (Heap->Signature != HEAP_SIGNATURE) + { + DPRINT1("HEAP: Invalid heap %p signature 0x%x\n", Heap, Heap->Signature); + return FALSE; + } + + /* Add skip validation flag */ + Flags |= Heap->ForceFlags | HEAP_SKIP_VALIDATION_CHECKS; + + /* Lock the heap ourselves */ + if (!(Flags & HEAP_NO_SERIALIZE)) + { + RtlEnterHeapLock(Heap->LockVariable); + HeapLocked = TRUE; + + /* Add no serialize flag so that the main routine won't try to acquire the lock again */ + Flags |= HEAP_NO_SERIALIZE; + } + + /* Validate the heap if necessary */ + RtlpValidateHeap(Heap, FALSE); + + /* Get the existing heap entry */ + HeapEntry = (PHEAP_ENTRY)Ptr - 1; + + /* Validate it */ + if (RtlpValidateHeapEntry(Heap, HeapEntry)) + { + /* If it succeeded - call the main routine */ + Result = RtlSizeHeap(HeapPtr, Flags, Ptr); + } + + /* Release the lock */ + if (HeapLocked) RtlLeaveHeapLock(Heap->LockVariable); + + return Result; +} + + +// Page heap -> move to another file + +HANDLE NTAPI +RtlpPageHeapCreate(ULONG Flags, + PVOID Addr, + SIZE_T TotalSize, + SIZE_T CommitSize, + PVOID Lock, + PRTL_HEAP_PARAMETERS Parameters) +{ + return NULL; +} + +/* EOF */ \ No newline at end of file diff --git a/lib/rtl/i386/interlck.S b/lib/rtl/i386/interlck.S index dd8529746f5..5b95e4c5429 100644 --- a/lib/rtl/i386/interlck.S +++ b/lib/rtl/i386/interlck.S @@ -16,6 +16,9 @@ * RtlInterlockedPopEntrySList( * IN PSLIST_HEADER ListHead); */ +.global _ExpInterlockedPopEntrySListResume@0 +.global _ExpInterlockedPopEntrySListEnd@0 +.global _ExpInterlockedPopEntrySListFault@0 .global _RtlInterlockedPopEntrySList@4 _RtlInterlockedPopEntrySList@4: @@ -25,7 +28,7 @@ _RtlInterlockedPopEntrySList@4: /* Load ListHead into ebp */ mov ebp, [esp + 12] - +_ExpInterlockedPopEntrySListResume@0: /* Load ListHead->Next into eax */ mov eax, [ebp] @@ -40,14 +43,15 @@ _RtlInterlockedPopEntrySList@4: /* Copy Depth and Sequence number and adjust Depth */ lea ecx, [edx - 1] +_ExpInterlockedPopEntrySListFault@0: /* Get next pointer */ mov ebx, [eax] - +_ExpInterlockedPopEntrySListEnd@0: /* If [ebp] equals edx:eax, exchange it with ecx:ebx */ - lock cmpxchg8b [ebp] + LOCK cmpxchg8b qword ptr [ebp] /* If not equal, retry with edx:eax, being the content of [ebp] now */ - jnz 1b + jnz _ExpInterlockedPopEntrySListResume@0 /* Restore registers and return */ 2: @@ -89,7 +93,7 @@ _RtlInterlockedPushEntrySList@8: lea ecx, [edx + 0x10001] /* If [ebp] equals edx:eax, exchange it with ecx:ebx */ - lock cmpxchg8b [ebp] + LOCK cmpxchg8b qword ptr [ebp] /* If not equal, retry with edx:eax, being the content of [ebp] now */ jnz 1b @@ -136,7 +140,7 @@ _RtlInterlockedFlushSList@4: xor cx, cx /* If [ebp] equals edx:eax, exchange it with ecx:ebx */ - lock cmpxchg8b [ebp] + LOCK cmpxchg8b qword ptr [ebp] /* If not equal, retry with edx:eax, being the content of [ebp] now */ jnz 1b diff --git a/lib/rtl/ppb.c b/lib/rtl/ppb.c index 868f170b989..39fb9213ee9 100644 --- a/lib/rtl/ppb.c +++ b/lib/rtl/ppb.c @@ -53,9 +53,7 @@ RtlCreateProcessParameters(PRTL_USER_PROCESS_PARAMETERS *ProcessParameters, PUNICODE_STRING ShellInfo, PUNICODE_STRING RuntimeData) { - NTSTATUS Status = STATUS_SUCCESS; PRTL_USER_PROCESS_PARAMETERS Param = NULL; - SIZE_T RegionSize = 0; ULONG Length = 0; PWCHAR Dest; UNICODE_STRING EmptyString; @@ -121,23 +119,16 @@ RtlCreateProcessParameters(PRTL_USER_PROCESS_PARAMETERS *ProcessParameters, Length += ALIGN(RuntimeData->MaximumLength, sizeof(ULONG)); /* Calculate the required block size */ - RegionSize = ROUND_UP(Length, PAGE_SIZE); - - Status = ZwAllocateVirtualMemory(NtCurrentProcess(), - (PVOID*)&Param, - 0, - &RegionSize, - MEM_RESERVE | MEM_COMMIT, - PAGE_READWRITE); - if (!NT_SUCCESS(Status)) + Param = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, Length); + if (!Param) { RtlReleasePebLock(); - return Status; + return STATUS_INSUFFICIENT_RESOURCES; } DPRINT ("Process parameters allocated\n"); - Param->MaximumLength = RegionSize; + Param->MaximumLength = Length; Param->Length = Length; Param->Flags = RTL_USER_PROCESS_PARAMETERS_NORMALIZED; Param->Environment = Environment; @@ -219,15 +210,12 @@ RtlCreateProcessParameters(PRTL_USER_PROCESS_PARAMETERS *ProcessParameters, /* * @implemented */ -NTSTATUS NTAPI -RtlDestroyProcessParameters(PRTL_USER_PROCESS_PARAMETERS ProcessParameters) +NTSTATUS +NTAPI +RtlDestroyProcessParameters(IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters) { - SIZE_T RegionSize = 0; - - return ZwFreeVirtualMemory (NtCurrentProcess (), - (PVOID)ProcessParameters, - &RegionSize, - MEM_RELEASE); + RtlFreeHeap(RtlGetProcessHeap(), 0, ProcessParameters); + return STATUS_SUCCESS; } /* diff --git a/lib/rtl/rtlp.h b/lib/rtl/rtlp.h index f998f5ac7f4..b0cdcd521c1 100644 --- a/lib/rtl/rtlp.h +++ b/lib/rtl/rtlp.h @@ -27,10 +27,10 @@ extern VOID FASTCALL CHECK_PAGED_CODE_RTL(char *file, int line); #endif #define ROUND_DOWN(n, align) \ - (((ULONG)n) & ~((align) - 1l)) + (((ULONG)(n)) & ~((align) - 1l)) #define ROUND_UP(n, align) \ - ROUND_DOWN(((ULONG)n) + (align) - 1, (align)) + ROUND_DOWN(((ULONG)(n)) + (align) - 1, (align)) #define RVA(m, b) ((PVOID)((ULONG_PTR)(b) + (ULONG_PTR)(m))) @@ -86,19 +86,19 @@ RtlpCaptureStackLimits( NTSTATUS NTAPI -RtlDeleteHeapLock(PRTL_CRITICAL_SECTION CriticalSection); +RtlDeleteHeapLock(PHEAP_LOCK Lock); NTSTATUS NTAPI -RtlEnterHeapLock(PRTL_CRITICAL_SECTION CriticalSection); +RtlEnterHeapLock(PHEAP_LOCK Lock); NTSTATUS NTAPI -RtlInitializeHeapLock(PRTL_CRITICAL_SECTION CriticalSection); +RtlInitializeHeapLock(PHEAP_LOCK Lock); NTSTATUS NTAPI -RtlLeaveHeapLock(PRTL_CRITICAL_SECTION CriticalSection); +RtlLeaveHeapLock(PHEAP_LOCK Lock); BOOLEAN NTAPI diff --git a/lib/sdk/crt/math/powf.c b/lib/sdk/crt/math/powf.c new file mode 100644 index 00000000000..55eb92a2e3f --- /dev/null +++ b/lib/sdk/crt/math/powf.c @@ -0,0 +1,11 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the w64 mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#include + +float powf(float x, float y) +{ + return (float)pow((double)x, (double)y); +} diff --git a/lib/sdk/ioevent/ioevent.c b/lib/sdk/ioevent/ioevent.c index 2e4f882303c..6feb319e2d7 100644 --- a/lib/sdk/ioevent/ioevent.c +++ b/lib/sdk/ioevent/ioevent.c @@ -1,6 +1,7 @@ #include #define COM_NO_WINDOWS_H +#include "windef.h" #include "initguid.h" #include diff --git a/lib/sdk/wdmguid/wdmguid.c b/lib/sdk/wdmguid/wdmguid.c index 44a0383e7e3..3ae2ac42bff 100644 --- a/lib/sdk/wdmguid/wdmguid.c +++ b/lib/sdk/wdmguid/wdmguid.c @@ -10,5 +10,9 @@ /* FIXME: shouldn't go there! */ DEFINE_GUID(GUID_DEVICE_SYS_BUTTON, 0x4AFA3D53L, 0x74A7, 0x11d0, 0xbe, 0x5e, 0x00, 0xA0, 0xC9, 0x06, 0x28, 0x57); +DEFINE_GUID(GUID_DEVINTERFACE_DISK, + 0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(GUID_DEVINTERFACE_CDROM, + 0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); /* EOF */ diff --git a/media/doc/3rd Party Files.txt b/media/doc/3rd Party Files.txt index 416a4fe4135..11cec93f2c2 100644 --- a/media/doc/3rd Party Files.txt +++ b/media/doc/3rd Party Files.txt @@ -3,13 +3,13 @@ Files synched with Wine can be found in /media/doc/README.WINE Other Things synched with other projects: Title: RedHat Liberation Fonts -Version: 1.04 -Actual Version: 1.04 +Version: 1.06 +Actual Version: 1.06 Website: https://www.redhat.com/promo/fonts/ Title: DejaVu Fonts -Version: 2.30 -Actual Version: 2.30 +Version: 2.31 +Actual Version: 2.32 Website: http://dejavu.sourceforge.net Title: DXTN OpenGL Compression Libs @@ -19,12 +19,12 @@ Website: http://www.geocities.com/dborca/opengl/tc.html Title: FreeType Version: 2.3.5 -Actual Version: 2.3.11 +Actual Version: 2.4.2 Website: http://www.freetype.org Title: Mesa3D Version: 7.4 -Actual Version: 7.6 +Actual Version: 7.8.2 Website: http://www.mesa3d.org Title: GNU adns @@ -44,10 +44,10 @@ Website: http://expat.sourceforge.net Title: LibXML Version: 2.7.6 -Actual Version: 2.7.6 +Actual Version: 2.7.7 Website: http://xmlsoft.org Title: ZLib Version: 1.2.3 -Actual Version: 1.2.3 +Actual Version: 1.2.5 Website: http://www.zlib.net diff --git a/media/doc/README.WINE b/media/doc/README.WINE index 62f4d2e270a..d03bb636129 100644 --- a/media/doc/README.WINE +++ b/media/doc/README.WINE @@ -22,7 +22,7 @@ When porting a new DLL from Wine to ReactOS, please do the following steps The following build tools are shared with Wine. reactos/tools/unicode # Synced to Wine-1_2rc6 -reactos/tools/widl # Synced to Wine-1_2rc6 +reactos/tools/widl # Synced to Wine-1_3_4 reactos/tools/winebuild # Synced to Wine-1_1_13 reactos/tools/wmc # Synced to Wine-20081105 (~Wine-1.1.7) reactos/tools/wpp # Synced to Wine-20081105 (~Wine-1.1.7) @@ -188,7 +188,7 @@ reactos/dll/win32/xmllite # Autosync ReactOS shares the following programs with Winehq. reactos/base/applications/cmdutils/xcopy # Autosync -reactos/base/applications/games/winemine # Out of sync +reactos/base/applications/games/winmine # Forked at Wine-1_3_5 reactos/base/applications/extrac32 # Autosync reactos/base/applications/iexplore # Autosync reactos/base/applications/notepad # Forked at Wine-20041201 diff --git a/media/fonts/LiberationMono-Bold.ttf b/media/fonts/LiberationMono-Bold.ttf index c11a84dba71..42941e57b16 100644 Binary files a/media/fonts/LiberationMono-Bold.ttf and b/media/fonts/LiberationMono-Bold.ttf differ diff --git a/media/fonts/LiberationMono-BoldItalic.ttf b/media/fonts/LiberationMono-BoldItalic.ttf index ef185adaabc..4682e4de1fc 100644 Binary files a/media/fonts/LiberationMono-BoldItalic.ttf and b/media/fonts/LiberationMono-BoldItalic.ttf differ diff --git a/media/fonts/LiberationMono-Italic.ttf b/media/fonts/LiberationMono-Italic.ttf index ce27ca7c250..e19f08cfb7c 100644 Binary files a/media/fonts/LiberationMono-Italic.ttf and b/media/fonts/LiberationMono-Italic.ttf differ diff --git a/media/fonts/LiberationMono-Regular.ttf b/media/fonts/LiberationMono-Regular.ttf index a74d2277682..dea96958a1b 100644 Binary files a/media/fonts/LiberationMono-Regular.ttf and b/media/fonts/LiberationMono-Regular.ttf differ diff --git a/media/fonts/LiberationSans-Bold.ttf b/media/fonts/LiberationSans-Bold.ttf index f9ad862c37e..b29a5640e41 100644 Binary files a/media/fonts/LiberationSans-Bold.ttf and b/media/fonts/LiberationSans-Bold.ttf differ diff --git a/media/fonts/LiberationSans-BoldItalic.ttf b/media/fonts/LiberationSans-BoldItalic.ttf index b7b5b5b4476..0b0bf94a577 100644 Binary files a/media/fonts/LiberationSans-BoldItalic.ttf and b/media/fonts/LiberationSans-BoldItalic.ttf differ diff --git a/media/fonts/LiberationSans-Italic.ttf b/media/fonts/LiberationSans-Italic.ttf index b23254f6f41..4a430cdddd1 100644 Binary files a/media/fonts/LiberationSans-Italic.ttf and b/media/fonts/LiberationSans-Italic.ttf differ diff --git a/media/fonts/LiberationSans-Regular.ttf b/media/fonts/LiberationSans-Regular.ttf index 9d557bbb7b8..2de10634e06 100644 Binary files a/media/fonts/LiberationSans-Regular.ttf and b/media/fonts/LiberationSans-Regular.ttf differ diff --git a/media/fonts/LiberationSerif-Bold.ttf b/media/fonts/LiberationSerif-Bold.ttf index f45b38205d3..892746e128d 100644 Binary files a/media/fonts/LiberationSerif-Bold.ttf and b/media/fonts/LiberationSerif-Bold.ttf differ diff --git a/media/fonts/LiberationSerif-BoldItalic.ttf b/media/fonts/LiberationSerif-BoldItalic.ttf index b0ca8c6dc76..ad754700fde 100644 Binary files a/media/fonts/LiberationSerif-BoldItalic.ttf and b/media/fonts/LiberationSerif-BoldItalic.ttf differ diff --git a/media/fonts/LiberationSerif-Italic.ttf b/media/fonts/LiberationSerif-Italic.ttf index 006db7e16e1..e81544aab29 100644 Binary files a/media/fonts/LiberationSerif-Italic.ttf and b/media/fonts/LiberationSerif-Italic.ttf differ diff --git a/media/fonts/LiberationSerif-Regular.ttf b/media/fonts/LiberationSerif-Regular.ttf index 394c75c1df9..155675f711c 100644 Binary files a/media/fonts/LiberationSerif-Regular.ttf and b/media/fonts/LiberationSerif-Regular.ttf differ diff --git a/media/fonts/doc/DejaVu_AUTHORS.txt b/media/fonts/doc/DejaVu_AUTHORS.txt index 68e2af28795..db4f0fb2a7c 100644 --- a/media/fonts/doc/DejaVu_AUTHORS.txt +++ b/media/fonts/doc/DejaVu_AUTHORS.txt @@ -1,3 +1,4 @@ +abysta at yandex.ru Adrian Schroeter Andrey Valentinovich Panov Ben Laenen @@ -20,21 +21,27 @@ John Karp Keenan Pepper Lars Naesbye Christensen Mashrab Kuvatov +Max Berger Mederic Boquien Michael Everson +MihailJP Misu Moldovan Nguyen Thai Ngoc Duy +Nicolas Mailhot Ognyan Kulev Ondrej Koala Vacha Peter Cernak Remy Oudompheng Roozbeh Pournader +Sahak Petrosyan Sander Vesik Stepan Roh +Stephen Hartke +Steve Tinney Tavmjong Bah Tim May Valentin Stoykov Vasek Stodulka Wesley Transue -$Id: AUTHORS 1910 2007-06-25 19:10:14Z ben_laenen $ +$Id: AUTHORS 2379 2010-05-27 08:14:08Z ben_laenen $ diff --git a/media/fonts/doc/DejaVu_LICENSE.txt b/media/fonts/doc/DejaVu_LICENSE.txt index 635e609c8e2..254e2cc42a6 100644 --- a/media/fonts/doc/DejaVu_LICENSE.txt +++ b/media/fonts/doc/DejaVu_LICENSE.txt @@ -1,4 +1,5 @@ -Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjung Bah (see below) +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. +Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) Bitstream Vera Fonts Copyright ------------------------------ @@ -95,4 +96,4 @@ dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. -$Id: LICENSE 778 2006-04-20 18:14:24Z moyogo $ +$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $ diff --git a/media/fonts/doc/DejaVu_NEWS.txt b/media/fonts/doc/DejaVu_NEWS.txt index 2a2c26207a8..a84852e73ac 100644 --- a/media/fonts/doc/DejaVu_NEWS.txt +++ b/media/fonts/doc/DejaVu_NEWS.txt @@ -1,3 +1,341 @@ +Changes from 2.30 to 2.31 + +* fixed bug where Serif Condensed Italic wouldn't get proper subfamily tags (by + Ben Laenen) +* added math operators U+2234-U+2237 to Mono (by Ben Laenen) +* removed buggy instructions of U+032D (by Eugeniy Meshcheryakov) +* added U+2C70, U+2C7E, U+2C7F to Sans and Sans Mono (by Denis Jacquerye) +* added U+2C7D to Sans Mono (by Denis Jacquerye) +* added U+2C6D, U+2C70-2C73, U+2C7E-2C7F to Serif (by Denis Jacquerye) +* added extremas to alpha U+03B1 in Serif-Italic (by Denis Jacquerye) +* added U+4A4, U+4A5 to Mono (by Andrey V. Panov) +* added Arabic letters U+0657, U+0670, U+0688-U+0690, U+0693-U+0694, + U+0696-U+0697, U+0699-U+06A0, U+06A2-U+06A3, U+06A5, U+06A7-U+06A8, + U+06AA-U+06AE, U+06B0-U+06B4, U+06B6-U+06B9, U+06BB-U+06BE and their + contextual forms to Sans (by MihailJP) +* added U+A78D LATIN CAPITAL LETTER TURNED H for coming Unicode 6.0 (by Denis + Jacquerye) + +Changes from 2.29 to 2.30 + +* added U+0462-U+0463 to Mono (by Denis Jacquerye) +* corrected U+1E53 in Serif (by Gee Fung Sit) +* added U+1E4C-U+1E4D to Mono and Serif (by Gee Fung Sit) +* added U+1E78-U+1E79 to Mono (by Gee Fung Sit) +* fixed missing diacritics in Latin Extended Additional in Sans ExtraLight + (moved stacked diacritics out of PUA in the process) (by Gee Fung Sit) +* fixed anchors on U+1E78 in Serif (by Gee Fung Sit) +* added U+1DC4-U+1DC9 to Serif (by Denis Jacquerye) +* renamed above-mark to above-mark in Serif-Italic (by Denis Jacquerye) +* added U+1DC4-U+1DC9 to context class for dotless substitution (by Denis + Jacquerye) +* changed Doubleacute to Doublegrave in Sans ExtraLight (by Gee Fung Sit) +* removed redundant reference in U+01FB in Sans Oblique (by Gee Fung Sit) +* added U+A726-U+A727 to Mono (Denis Jacquerye) +* changed U+04BE and U+04BF according to recommedations of Sasha Ankwab in Sans + (by Andrey V. Panov) +* remove "Symbol Charset" from set of codepages in Sans (by Eugeniy + Meshcheryakov) + +Changes from 2.28 to 2.29 + +* modified U+10FB in Sans to be a mirror image of U+2056, since U+10FB is not + Georgian-specific (by Roozbeh Pournader) +* added U+2B1F, U+2B24, U+2B53, U+2B54 in Sans (by Roozbeh Pournader) +* fixed TUR opentype language tag to TRK in Serif (bug 19825) (by Ben Laenen) +* early implementation of Abkhaz letter U+0524-U+0525 in Sans + (by Michael Everson and abysta) +* flipped U+1D538 in Sans (by Gee Fung Sit) +* added U+26B3-U+26B8, U+1D7D8-U+1D7E1 in Sans (by Gee Fung Sit) +* corrected U+1D7A9 in Sans Bold Oblique (by Gee Fung Sit) +* Fixed U+0649 to be dual-joining in Sans Mono (by Roozbeh Pournader) +* Remove unnecessary 'isol' feature from Sans Mono (by Roozbeh Pournader) +* Remove 'cmap' mappings for U+066E, U+066F, U+067C, U+067D, U+0681, U+0682, + U+0685, U+0692, U+06A1, U+06B5, U+06BA, U+06C6, U+06CE, and U+06D5 + in Sans Mono (bug 20323) (by Roozbeh Pournader) +* add half brackets (U+2E22 - U+2E25, by Steve Tinney) + +Changes from 2.27 to 2.28 + +* added U+A789, U+A78A in Sans and Sans Mono (by Denis Jacquerye) +* modified U+02D6, U+02D7, U+02EE in Sans and Sans Mono (by Denis Jacquerye) +* added U+1E9E (German capital テ) to Sans and Serif (by Denis Jacquerye) +* adjusted width of U+01B7-U+01B9 in Serif Italic (by Denis Jacquerye) +* modified U+021C, U+021D in Sans (by Denis Jacquerye) +* added U+021C, U+021D in Mono (by Denis Jacquerye) +* added U+F428 (Georgian Nuskhuri "f") in private use area (by Besarion + Gugushvili) +* updated Georgian mkhedruli (U+10D0-U+10FA) with new version (by Besarion + Gugushvili) +* updated Georgian asomtavruli (U+10A0-U+10C5) with new version (by Besarion + Gugushvili) +* added Georgian nuskhuri (U+2D00-U+2D25) (by Besarion Gugushvili) +* added Georgian mtavruli in private use area (U+F400-U+F426) (by Besarion + Gugushvili) +* added mark anchors above to Cyrillic U+0430-U+0438, U+043A-U+044F, + U+0454-U+0455 in Mono (by Ben Laenen) +* modified/moved up U+0318-U+0319, U+031C-U+031F, U+0329-U+032A, U+032C-U+032D, + U+0339-U+033B, U+0348 and U+0353 in Sans to prevent cut-off (by Gee Fung Sit) +* added U+035A to Sans (by Gee Fung Sit) +* updated fontconfig files (by Nicolas Mailhot) +* added U+2032-2037 to Mono (by Denis Jacquerye) +* added Ogham to Sans ExtraLight (by Gee Fung Sit) +* added U+2C6F, U+2C79, U+2C7C-2C7D to Mono (by Gee Fung Sit) +* added U+210F to Serif and Sans ExtraLight (by Gee Fung Sit) +* changed U+210F to a more common glyph in Sans and Mono (by Gee Fung Sit) + +Changes from 2.26 to 2.27 + +* added some of Michael Everson's new Cyrillic glyphs to Sans (by Wesley + Transue) +* removed blank glyph at U+05EF from Sans Bold Oblique (by Gee Fung Sit) +* small adjustments to existing tone bars in Sans and Mono (by Gee Fung Sit) +* added U+0372-U+0373, U+0376-U+0377, U+03CF, U+A668-U+A66E, U+A708-U+A711, + U+A71B-U+A71F to Sans (by Gee Fung Sit) +* copied U+02E5-U+02E9 over from Sans to fix inconsistencies in Serif (by Gee + Fung Sit) +* added U+021C-U+021D, U+0370-U+0371, U+037B-U+037D, U+0470-U+0471, + U+0510-U+0515, U+051A-U+051D, U+1E9F, U+2C64, U+2C6E-U+2C6F, U+2C79, + U+2C7C-U+2C7D, U+A644-U+A647, U+A650-U+A651, U+A654-U+A657, U+A708-U+A716, + U+A71B-U+A71F to Serif (by Gee Fung Sit) +* added U+A708-U+A716, U+A71B-U+A71F to Mono (by Gee Fung Sit) +* added anchors to U+017F (ナソ) and fixed U+1E9B (蘯) in Serif (by Gee Fung Sit) +* made U+0325 smaller in Sans Bold and Serif to match Sans Book (by Gee Fung + Sit) +* fixes to U+02F3 (moved up), U+228F-U+2294 (more square-like) and + U+22CE-U+22CF (stroke width) in Sans (by Gee Fung Sit) +* replaced U+2202 竏 (Sans and Mono) and U+221D 竏, U+221E 竏 (Sans) with glyphs + from Arev (with small changes) (by Gee Fung Sit) +* added U+22B0-U+22B1, U+22C7, U+22D0-U+22D5 from Arev to Sans to complete the + block (by Gee Fung Sit) +* added U+0514-U+0515 to Sans ExtraLight (by Gee Fung Sit) +* skewed U+A78C in all Oblique/Italic fonts (by Gee Fung Sit) +* moved U+2215 to U+2044 in Sans and Serif and replaced U+2215 with reference + to U+002F in all fonts (by Gee Fung Sit) +* added U+2C6E to Mono (by Denis Jacquerye) +* added U+A782 and U+A783 in Sans (by Wesley Transue) +* added U+0244, U+024C-024D, U+2C64 in Sans Mono (by Denis Jacquerye) +* modified U+01AE in Sans Mono (by Denis Jacquerye) +* added U+2C7A to all fonts (by Gee Fung Sit) +* italicized/small changes to U+2C76 in Serif (Bold) Italic (by Gee Fung Sit) +* improved outlines of U+2C68, U+2C6A, U+2C6C in Serif (Bold) Italic (by Gee + Fung Sit) +* rounded U+2C77 at the bottom in Serif (by Gee Fung Sit) +* added joining behavior for tone letters (U+02E5-U+02E9) in Sans (bug #15669) + (by Gee Fung Sit) +* fixed outline of y.alt in Sans Regular (by Denis Jacquerye) +* changed references of U+1D5A8, U+1D5C5, U+1D5DC, U+1D5F9, U+1D610, U+1D62D, + U+1D644 and U+1D661 to stylistic alternates to have a better distinction (by + Gee Fung Sit) +* hinted I.alt in Sans Regular (by Gee Fung Sit) +* added U+0487, completing Cyrillic block (by Gee Fung Sit) +* extended the bar of U+0463 to the right and moved the anchor (by Gee Fung + Sit) +* added anchors to glyphs in Cyrillic block (by Gee Fung Sit) +* added (preliminary) hints to tone letter forms (U+02E5.5, U+02E9.1, stem) in + Sans Book (by Gee Fung Sit) + +Changes from 2.25 to 2.26 + +- added glyphs for Cyrillic-B to Sans (by Wesley Transue) +- added U+0370-U+0371 to Sans (by Wesley Transue) +- added U+019C, U+01A2-U+01A3, U+01A6, U+01E4-U+01E5, U+024C-U+024D, U+0285, + U+0290, U+02A0, U+0370-U+0371, U+03F1, U+03FC to Sans ExtraLight (by Wesley + Transue) +- added U+20A0-U+20A5, U+20A7-U+20B3, U+2105, U+210D, U+210F, U+2115, U+2117, + U+2119-U+211A, U+211D, U+2124, U+212E, U+2200-U+2204 to Mono (by Heikki + Lindroos) +- added U+01BA and U+01BF to Mono (by Heikki Lindroos) +- merged OpenType "aalt" feature in Latin in Sans (by Denis Jacquerye) +- added alternative shape for y in Sans (by Denis Jacquerye) +- added saltillo (U+A78B-U+A78C) to all faces (by James Cloos) +- changed U+047C-U+047D to references instead of outlines in Sans (by Wesley + Transue) +- added Latin letter tresillo U+A72A-U+A72B to Sans (by Wesley Transue) +- added U+A734-U+A737 to Sans (by Wesley Transue) +- added U+2053 to Serif and fixed it bug:9425 in Sans (by Gee Fung Sit) +- removed problematic hints for U+0423 bug:10025 (by Gee Fung Sit) +- added U+27C5-U+27C6 bug:10255 to all faces (by Gee Fung Sit) +- fixed width of U+2016 in Sans Oblique (by Gee Fung Sit) +- added U+2016, U+2032-U+2038, U+2042, U+2045-U+2046, U+204B-U+204F, + U+2051-U+2052, U+2057 to Serif (by Gee Fung Sit) +- made U+2140 bigger to match other n-ary operators (by Gee Fung Sit) +- added U+0606-U+0607, U+0609-U+060A to Sans (by Gee Fung Sit) +- added U+221B-U+221C to Mono (by Gee Fung Sit) +- small adjustments to U+221B-U+221C in Sans and Serif (by Gee Fung Sit) +- update U+04B4-U+04B5 in Serif (by Andrey V. Panov) +- increased max-storage value from maxp table to 153 (by Andrey V. Panov) +- added U+0472-U+0473, U+0510-U+0511, U+051A-U+051D, U+0606-U+0607, + U+0609-U+060A, U+1E26-U+1E27, U+1E54-U+1E55, U+1E7C-U+1E7D, U+1E8C-U+1E8D, + U+1E90-U+1E91, U+1E97-U+1E99, U+1E9F, U+1EAC-U+1EAD, U+1EB6-U+1EB7, + U+1EC6-U+1EC7, U+1ED8-U+1EDD, U+1EE0-U+1EE3, U+1EE8-U+1EEB, U+1EEE-U+1EF1 to + Mono (by Gee Fung Sit) +- added locl rules for S/T cedilla for Romanian and Moldavian so they get + rendered as S/T with comma accent (see Redhat bug #455981) (by Ben Laenen) +- removed ligature rule from Armenian U+0587 bug:16113 (by Gee Fung Sit) + +Changes from 2.24 to 2.25 + +- moved/added U+2E18 (by Gee Fung Sit) +- added empty glyph for U+2064 in Sans and Serif (by Gee Fung Sit) +- added U+22CE-U+22CF to Sans (by Gee Fung Sit) +- Sans Oblique and Bold Oblique, Serif: reverted digits hinting instructions back to before revision 1590, which fixed mistaken debian bug #471024. This fixes Debian bug #411308. The original bug was in freetype not in the fonts (by Denis Jacquerye) +- added U+A726-U+A729, U+A730-U+A733, U+A738-U+A73F, U+A746-U+A74B, U+A74E-U+A74F, U+A780-U+A781, U+A7FB-U+A7FF to Sans (by Gee Fung Sit) +- added Macedonian italic glyph shape for U+0453 in Serif (by Ben Laenen) +- changed descenders in U+0446, U+0449, U+0497, U+04A3, U+04AD (by Andrey V. Panov) +- updated main SFD files to SplineFontDB 3.0 (Denis Jacquerye and Gee Fung Sit) +- moved U+0561 2 up since it wasn't aligned with the baseline well (by Ben Laenen) +- added U+2E2E to Sans (by Gee Fung Sit) +- replaced U+2699 with simpler version in Sans (by Gee Fung Sit) +- added a lot of hinting instructions to Latin Extended B, Greek and Coptic glyphs Sans Book (by Wesley Transue) +- differentiated U+2219 from U+22C5 and adjusted affected references in Sans and Mono (by Gee Fung Sit) +- made Hebrew narrower in Sans Bold and Sans Bold Oblique (by Denis Jacquerye) +- added Kurdish and Chuvash letters from Unicode 5.1 Cyrillic Extended block (by Wesley Transue) +- added U+1E9F, U+A644-U+A647, U+A64C-U+A64D, U+A650-U+A651, U+A654-U+A655, U+A712U+A716 to Sans (by Gee Fung Sit) +- added several glyphs to Sans ExtraLight (by Gee Fung Sit) +- added hinting instructions to U+046A-U+046B, U+0508-U+0509, U+050B, U+0512-U+0513 in Sans Book (by Wesley Transue) +- corrected width of U+027E in Sans Book (by Gee Fung Sit) +- added U+2C79, U+2C7B-U+2C7D to Sans (by Gee Fung Sit) +- added a bunch of glyphs+small corrections to Sans Light (by Gee Fung Sit) +- added U+0496, U+0497, U+04B0, U+04B1 (by Andrey V. Panov) +- updated U+0493, U+049B, U+04B3, U+04B7, U+04F7 (by Andrey V. Panov) +- further improvements in extended Cyrillic (by Andrey V. Panov) + +Changes from 2.23 to 2.24 + +- instructions for U+05C0 ラ, U+05C3 ラ, U+05F3 ラウ, and U+05F4 ラエ in DejaVu + Sans. (by Wesley Transue) +- instructions for U+2116 in Sans (by Andrey V. Panov) +- Unicode 5.1 update: moved U+F208 to U+2C6D, U+F25F to U+2C71, added + U+2C6E-U+2C6F, U+2C72-U+2C73, updated outline of U+2C71 in Sans. (by + Denis Jacquerye) +- updated and instructed U+0401 in Sans (by Andrey V. Panov) +- fixed the bug in Sans faces where U+02EC ヒャ faced the wrong direction. + Also, added a few more glyph instructions. (by Wesley Transue) +- removed OS2Sub and OS2Strike that weren't intentional in Sans + ExtraLight. (by Denis Jacquerye) +- updated instructions for U+401, U+44F in Serif Book. (by Andrey V. + Panov) +- instructions for U+02C4 ヒ, U+02C5 ヒ, U+03D8 マ, U+03D9 マ, U+0494 メ, and + U+0495 メ in Sans Book. (by Wesley Transue) +- instructions for U+01A6 ニヲ, U+0238 ネク, U+0239 ネケ, U+02EC ヒャ, and U+05C6 ラ + in Sans Book. (by Wesley Transue) +- DejaVuSans.sfd DejaVuSerif.sfd: updated instructions for U+447 and + U+451 using code generated with xgridfit (by Andrey V. Panov) +- instructions for a few glyphs in the Latin Extended-B Block, Greek + Block, Cyrillic Block, and N'Ko block. (by Wesley Transue) +- updated sfdnormalize.pl, and SFD files to new SFD format with empty + lines. (by Denis Jacquerye) + +Changes from 2.22 to 2.23 + +- fixed bug which made Condensed fonts appear instead of normal width ones +- added U+20DB, U+20DC, and U+20E1 to Sans (by Roozbeh Pournader) +- added hinting instructions to U+01A7, U+01AA-U+01AC, U+01AE-U+01AF, + U+01BC-U+01BD, U+01BF, U+01F7, U+0277, U+027F, U+0285-U+0286, U+0297, U+02AF, + U+02B4-U+02B5, U+02BD, U+030D, U+0311, U+0329, U+04A0-U+04A1 in Sans Book (by + Wesley Transue) +- modified hinting instructions of U+04A2 in Sans Book (by Wesley Transue) +- added hinting instructions to U+237D, U+2423 in Mono Book and Mono Bold (by + Wesley Transue) +- added mathematical alphanumeric symbols to all styles (by Max Berger) +- added Unicode 5.1 U+2E18 as U+2E18.u51 (not yet usable) to Sans (by Roozbeh + Pournader) +- dereferenced all glyphs with mixed references and outlines (by Denis + Jacquerye) +- removed non-zero width from U+0344 in Sans (by Denis Jacquerye) + +Changes from 2.21 to 2.22 + +- directory structure has changed, we now use the Makefile +- modified Armenian U+0565 in Sans (by ユ祭。ユーユ。ユッ ユ閑・ユソヨユクユスユオユ。ユカ) +- added double struck letters and numbers U+2102, U+210D, U+2115, + U+2119-U+211A, U+211D, U+2124, U+213C-U+2140, U+2145-U+2149, U+1D538-U+1D539, + U+1D53B-U+1D53E, U+1D540-U+1D544, U+1D546, U+1D54A-U+1D550, U+1D552-U+1D56B, + U+1D7D8-U+1D7E1 to Serif (by Stephen Hartke) +- added letterlike symbols U+2103, U+2109, U+2127, U+214B, U+2141-U+2144 to + Serif (by Ben Laenen) +- fixed outline direction of U+2143 in Sans Bold/Bold Oblique (by Ben Laenen) +- added arrow set in Serif: arrows: U+2194-U+21FF; dingbats: U+27A1; + supplemental arrows A: U+27F0-U+27FF; supplemental arrows B: U+2900-U+2975, + U+297A; miscellaneous symbols and arrows: U+2B00-U+2B11 (by Ben Laenen) +- added U+0180, U+01DE, U+01E0-01E1, U+022A, U+022C, U+0230, U+1E08-U+1E09, + U+1E10-U+1E11, U+1EB0-U+1EB1 to Mono (by Denis Jacquerye) +- adjusted U+01D5, U+01D7, U+01D9, U+1DB in Mono (by Denis Jacquerye) +- added Ogham in Sans (by Wesley Transue) +- added Yijing Hexagram Symbols in Sans (by Wesley Transue) +- hinting instructions added to Cyrillic U+0460, U+04A6-U+04A7, U+04AC-U+04AD, + U+04C7-U+04C8, U+04F6-U+04F7, U+04FA-U+04FB, U+050C-U+050D in Sans Book (by + Wesley Transue) +- adjusted Cyrillic letters U+042A, U+044A, U+044C, U+0459-U+045B, U+0462, + U+048C-U+048D in Serif (by Andrey V. Panov) +- hinting instructions added to Lao U+0EB7 in Sans (by Wesley Transue) +- added Roman numerals and Claudian letter U+2160-U+2184 in Serif (by Ben + Laenen) +- added U+FFF9-U+FFFD to Sans, Serif and Mono (by Lars Nテヲsbye Christensen) +- added mathematical symbols to Serif: U+2200, U+2203-U+2204, U+2213-U+2214, + U+2217-U+2218, U+2223-U+2226, U+2250-U+2255, U+2295-U+22AF, U+22C5 (by Ben + Laenen) +- modified bullet symbol U+2219 in Serif (by Ben Laenen) + +Changes from 2.20 to 2.21 + +- added U+FE20-U+FE23 (half diacritics) to Sans (by Denis Jacquerye) +- added anchor "half" to position right half of double marks, U+FE21 or U+FE23 + to Sans (by Denis Jacquerye) +- shifted U+0360 up to avoid collision with some outlines in Sans (by Denis + Jacquerye) +- added anchor above-mark anchor to U+035D, U+035E, U+0360, U+0361 in Sans (by + Denis Jacquerye) +- added instructions for ff, ffi, ffl ligatures in Serif Bold (by Eugeniy + Meshcheryakov) +- added instructions to some N'Ko glyphs (by Wesley Transue) +- added instructions to some Lao glyphs (by Wesley Transue) +- cleaning up 'liga' Standard Ligature in Latin, in Sans and Sans Mono (by + Denis Jacquerye) +- added U+046A, U+046B (big yus) in Serif (by Andrey V. Panov) +- added box drawing symbols to Sans and Serif (by Lars Nテヲsbye Christensen) +- added Makefile to improve font and packages generating (by Nicolas Mailhot) + +Changes from 2.19 to 2.20 + +- removed TeX and TeXData tags from all sfd files (by Eugeniy Meshcheryakov) +- removed all 'frac' lookups (by Eugeniy Meshcheryakov) +- fixed duplicate glyph names (by Eugeniy Meshcheryakov) +- removed standard ligatures with U+00B7 in Mono (by Eugeniy Meshcheryakov) +- use reference to U+002D in U+00AD in Sans Oblique, and adjust instructions + (by Eugeniy Meshcheryakov) +- updated Cyrillic in Sans Extra Light (by Andrey V. Panov) +- added instructions to N'Ko U+07C1-U+07C6, U+07CA, U+07CE-U+07CF, U+07D1, + U+07D3-U+07D4, U+07D8, U+07DB and U+07EB in Sans (by Wesley Transue) +- added instructions to Lao U+0E8A, U+0E95, U+0E97, U+EA5, U+0EB4 and U+0EB5 + (by Wesley Transue) +- adjusted instructions for Hebrew glyphs (by Denis Jacquerye) +- added instructions for U+0265 in Sans Bold (by Denis Jacquerye) +- fix U+1D68 in Sans: it had the shape of delta, where it should be a rho (by + Ben Laenen) +- remove U+1D5C glyph in Sans Oblique (it was empty) (by Ben Laenen) +- fix instructions of U+01AD in Sans Bold (by Ben Laenen) +- fix instructions of U+042D in Serif (by Ben Laenen) +- remove buggy instructions of U+2328 in Serif (by Ben Laenen) +- corrected width of U+2C75-U+2C76 in Sans Bold and Serif Bold (by Gee Fung Sit) +- added U+2C75-U+2C77 to Mono (by Gee Fung Sit) + +Changes from 2.18 to 2.19 + +- fixed misplaced symbols (U+2325,2326) in Sans Oblique (by John Karp) +- added Mark to Base anchors: 'cedilla' for combining cedilla and + 'above-legacy' for stacking above precomposed glyphs (just a,e,i,o,u with + macron for now) in Sans (by Denis Jacquerye). +- added contextual substitution for Case and Dotless forms in all Sans variants + (by Denis Jacquerye). +- renamed 'ccmp' lookups for RTL and Basic (LGC, etc.) (by Denis Jacquerye) +- added anchor 'cedilla' for vowels in Sans. (by Denis Jacquerye) +- extended contextual dotless and case substitutions to handle both below and + above diacritics (by Denis Jacquerye) +- renamed Dotless and Case Form GSUB lookups in Sans with meaningful names (by + Denis Jacquerye) + Changes from 2.17 to 2.18 - Re-encoded the source files for Full Unicode (by Ben Laenen) @@ -892,4 +1230,4 @@ Changes from 0.9 to 0.9.1: - proper caron shape for dcaron and tcaron - minor visual changes -$Id: NEWS 1923 2007-07-01 11:31:32Z ben_laenen $ +$Id: NEWS 2378 2010-05-27 08:11:33Z ben_laenen $ diff --git a/media/fonts/doc/DejaVu_README.txt b/media/fonts/doc/DejaVu_README.txt index 4081de46169..64c9cac20e4 100644 --- a/media/fonts/doc/DejaVu_README.txt +++ b/media/fonts/doc/DejaVu_README.txt @@ -1,5 +1,5 @@ -DejaVu fonts 2.18 (c)2004-2007 DejaVu fonts team ------------------------------------------------ +DejaVu fonts 2.31 (c)2004-2010 DejaVu fonts team +------------------------------------------------ The DejaVu fonts are a font family based on the Bitstream Vera Fonts (http://gnome.org/fonts/). Its purpose is to provide a wider range of @@ -46,14 +46,14 @@ For more information go to http://dejavu.sourceforge.net/. Characters from Arev fonts, Copyright (c) 2006 by Tavmjong Bah: --------------------------- -U+01ba, U+01bf, U+01f7, U+021c, U+021d, U+0220, U+0222, U+0223, -U+02b9, U+02ba, U+02bd, U+02c2, U+02c3, U+02c4, U+02c5, U+02d4, -U+02d5, U+02d7, U+02ec, U+02ed, U+02ee, U+0346-034e, U+0360, U+0362, -U+03e2-03ef, U+0460-0463, U+0466-0486, U+0488-0489, U+04a8-04a9, -U+0500-050f, U+2055-205e, U+20B0, U+20B2-20B3, U+2102, U+210D, U+210f, -U+2111, U+2113, U+2115, U+2118-U+211A, U+211c-211d, U+2124,U+2135, -U+213C-U+2140, U+2295-2298, U+2308-230b, U+26A2-U+26B1, U+2701-2704, -U+2706-2709, U+270c-274b, U+2758-275a, U+2761-2775, U+2780-2794, -U+2798-27af, U+27b1-27be, U+fb05-fb06 +U+01BA, U+01BF, U+01F7, U+021C-U+021D, U+0220, U+0222-U+0223, +U+02B9, U+02BA, U+02BD, U+02C2-U+02C5, U+02d4-U+02D5, +U+02D7, U+02EC-U+02EE, U+0346-U+034E, U+0360, U+0362, +U+03E2-03EF, U+0460-0463, U+0466-U+0486, U+0488-U+0489, U+04A8-U+04A9, +U+0500-U+050F, U+2055-205E, U+20B0, U+20B2-U+20B3, U+2102, U+210D, U+210F, +U+2111, U+2113, U+2115, U+2118-U+211A, U+211C-U+211D, U+2124, U+2135, +U+213C-U+2140, U+2295-U+2298, U+2308-U+230B, U+26A2-U+26B1, U+2701-U+2704, +U+2706-U+2709, U+270C-U+274B, U+2758-U+275A, U+2761-U+2775, U+2780-U+2794, +U+2798-U+27AF, U+27B1-U+27BE, U+FB05-U+FB06 -$Id: README 1923 2007-07-01 11:31:32Z ben_laenen $ +$Id: README 2377 2010-05-27 08:02:08Z ben_laenen $ diff --git a/media/fonts/doc/DejaVu_langcover.txt b/media/fonts/doc/DejaVu_langcover.txt index 1f3ba77d381..1673d9fef09 100644 --- a/media/fonts/doc/DejaVu_langcover.txt +++ b/media/fonts/doc/DejaVu_langcover.txt @@ -1,55 +1,67 @@ This is the language coverage file for DejaVu fonts -($Id$) +($Id: langcover.txt 2383 2010-05-27 09:23:21Z ben_laenen $) Sans Serif Sans Mono aa Afar 100% (62/62) 100% (62/62) 100% (62/62) ab Abkhazia 100% (90/90) 93% (84/90) 84% (76/90) af Afrikaans 100% (69/69) 100% (69/69) 100% (69/69) +ak Akan 100% (73/73) 100% (73/73) 100% (73/73) am Amharic (0/264) (0/264) (0/264) -ar Arabic 100% (125/125) (0/125) 100% (125/125) -ast Asturian 100% (72/72) 100% (72/72) 100% (72/72) -ava Avaric 100% (67/67) 100% (67/67) 100% (67/67) +an Aragonese 100% (66/66) 100% (66/66) 100% (66/66) +ar Arabic 100% (36/36) (0/36) 100% (36/36) +as Assamese (0/64) (0/64) (0/64) +ast Asturian/Bable/Leonese/Asturleonese 100% (66/66) 100% (66/66) 100% (66/66) +av Avaric 100% (67/67) 100% (67/67) 100% (67/67) ay Aymara 100% (60/60) 100% (60/60) 100% (60/60) -az Azerbaijani 100% (148/148) 97% (144/148) 97% (144/148) -az-ir Azerbaijani in Iran 100% (130/130) (0/130) 100% (130/130) +az-az Azerbaijani in Azerbaijan 100% (66/66) 100% (66/66) 100% (66/66) +az-ir Azerbaijani in Iran 100% (40/40) (0/40) 100% (40/40) ba Bashkir 100% (82/82) 100% (82/82) 97% (80/82) -bam Bambara 100% (60/60) 100% (60/60) 100% (60/60) be Byelorussian 100% (68/68) 100% (68/68) 100% (68/68) +ber-dz Berber in Algeria 100% (70/70) 100% (70/70) 100% (70/70) +ber-ma Berber in Morocco 100% (32/32) (0/32) (0/32) bg Bulgarian 100% (60/60) 100% (60/60) 100% (60/60) bh Bihari (Devanagari script) (0/68) (0/68) (0/68) bho Bhojpuri (Devanagari script) (0/68) (0/68) (0/68) bi Bislama 100% (58/58) 100% (58/58) 100% (58/58) bin Edo or Bini 100% (78/78) 100% (78/78) 100% (78/78) -bn Bengali (0/89) (0/89) (0/89) +bm Bambara 100% (60/60) 100% (60/60) 100% (60/60) +bn Bengali (0/63) (0/63) (0/63) bo Tibetan (0/95) (0/95) (0/95) br Breton 100% (64/64) 100% (64/64) 100% (64/64) bs Bosnian 100% (62/62) 100% (62/62) 100% (62/62) bua Buriat (Buryat) 100% (70/70) 100% (70/70) 100% (70/70) +byn Blin/Bilin (0/255) (0/255) (0/255) ca Catalan 100% (74/74) 100% (74/74) 100% (74/74) ce Chechen 100% (67/67) 100% (67/67) 100% (67/67) ch Chamorro 100% (58/58) 100% (58/58) 100% (58/58) -chm Mari (Lower Cheremis / Upper Cheremis) 100% (76/76) 100% (76/76) 97% (74/76) +chm Mari (Lower Cheremis / Upper Cheremis) 100% (76/76) 100% (76/76) 100% (76/76) chr Cherokee (0/85) (0/85) (0/85) co Corsican 100% (84/84) 100% (84/84) 100% (84/84) +crh Crimean Tatar/Crimean Turkish 100% (68/68) 100% (68/68) 100% (68/68) cs Czech 100% (82/82) 100% (82/82) 100% (82/82) -cu Old Church Slavonic 100% (103/103) 82% (85/103) 74% (77/103) +csb Kashubian 100% (74/74) 100% (74/74) 100% (74/74) +cu Old Church Slavonic 100% (103/103) 86% (89/103) 78% (81/103) cv Chuvash 100% (74/74) 100% (74/74) 100% (74/74) cy Welsh 100% (78/78) 100% (78/78) 100% (78/78) da Danish 100% (70/70) 100% (70/70) 100% (70/70) de German 100% (59/59) 100% (59/59) 100% (59/59) +dv Divehi/Dhivehi/Maldivian (0/49) (0/49) (0/49) dz Dzongkha (0/95) (0/95) (0/95) +ee Ewe 100% (99/99) 100% (99/99) 100% (99/99) el Greek 100% (69/69) 100% (69/69) 100% (69/69) en English 100% (72/72) 100% (72/72) 100% (72/72) eo Esperanto 100% (64/64) 100% (64/64) 100% (64/64) es Spanish 100% (66/66) 100% (66/66) 100% (66/66) et Estonian 100% (64/64) 100% (64/64) 100% (64/64) eu Basque 100% (56/56) 100% (56/56) 100% (56/56) -fa Persian 100% (129/129) (0/129) 100% (129/129) +fa Persian 100% (40/40) (0/40) 100% (40/40) +fat Fanti 100% (73/73) 100% (73/73) 100% (73/73) +ff Fulah (Fula) 100% (62/62) 100% (62/62) 100% (62/62) fi Finnish 100% (62/62) 100% (62/62) 100% (62/62) +fil Filipino 100% (84/84) 100% (84/84) 100% (84/84) fj Fijian 100% (52/52) 100% (52/52) 100% (52/52) fo Faroese 100% (68/68) 100% (68/68) 100% (68/68) fr French 100% (84/84) 100% (84/84) 100% (84/84) -ful Fulah (Fula) 100% (62/62) 100% (62/62) 100% (62/62) fur Friulian 100% (66/66) 100% (66/66) 100% (66/66) fy Frisian 100% (75/75) 100% (75/75) 100% (75/75) ga Irish 100% (80/80) 100% (80/80) 100% (80/80) @@ -57,84 +69,122 @@ gd Scots Gaelic 100% (70/70) 100% (70/70) gez Ethiopic (Geez) (0/218) (0/218) (0/218) gl Galician 100% (66/66) 100% (66/66) 100% (66/66) gn Guarani 100% (70/70) 100% (70/70) 100% (70/70) -gu Gujarati (0/78) (0/78) (0/78) +gu Gujarati (0/68) (0/68) (0/68) gv Manx Gaelic 100% (54/54) 100% (54/54) 100% (54/54) ha Hausa 100% (60/60) 100% (60/60) 100% (60/60) haw Hawaiian 100% (63/63) 100% (63/63) 100% (63/63) he Hebrew 100% (27/27) (0/27) (0/27) hi Hindi (Devanagari script) (0/68) (0/68) (0/68) +hne Chhattisgarhi (0/68) (0/68) (0/68) ho Hiri Motu 100% (52/52) 100% (52/52) 100% (52/52) hr Croatian 100% (62/62) 100% (62/62) 100% (62/62) +hsb Upper Sorbian 100% (72/72) 100% (72/72) 100% (72/72) +ht Haitian/Haitian Creole 100% (56/56) 100% (56/56) 100% (56/56) hu Hungarian 100% (70/70) 100% (70/70) 100% (70/70) hy Armenian 100% (77/77) (0/77) (0/77) +hz Herero 100% (57/57) 100% (57/57) 100% (57/57) ia Interlingua 100% (52/52) 100% (52/52) 100% (52/52) -ibo Igbo 100% (58/58) 100% (58/58) 100% (58/58) id Indonesian 100% (54/54) 100% (54/54) 100% (54/54) ie Interlingue 100% (52/52) 100% (52/52) 100% (52/52) +ig Igbo 100% (58/58) 100% (58/58) 100% (58/58) +ii Sichuan Yi/Nuosu (0/1165) (0/1165) (0/1165) ik Inupiaq (Inupiak, Eskimo) 100% (68/68) 100% (68/68) 100% (68/68) io Ido 100% (52/52) 100% (52/52) 100% (52/52) is Icelandic 100% (70/70) 100% (70/70) 100% (70/70) it Italian 100% (72/72) 100% (72/72) 100% (72/72) iu Inuktitut 100% (161/161) (0/161) (0/161) -ja Japanese (0/6538) (0/6538) (0/6538) -ka Georgian 100% (34/34) 100% (34/34) 100% (34/34) +ja Japanese (0/6537) (0/6537) (0/6537) +jv Javanese 100% (56/56) 100% (56/56) 100% (56/56) +ka Georgian 100% (33/33) 100% (33/33) 100% (33/33) kaa Kara-Kalpak (Karakalpak) 100% (78/78) 100% (78/78) 100% (78/78) +kab Kabyle 100% (70/70) 100% (70/70) 100% (70/70) ki Kikuyu 100% (56/56) 100% (56/56) 100% (56/56) +kj Kuanyama/Kwanyama 100% (52/52) 100% (52/52) 100% (52/52) kk Kazakh 100% (77/77) 100% (77/77) 100% (77/77) kl Greenlandic 100% (81/81) 100% (81/81) 100% (81/81) -km Khmer (0/70) (0/70) (0/70) -kn Kannada (0/80) (0/80) (0/80) +km Central Khmer (0/63) (0/63) (0/63) +kn Kannada (0/70) (0/70) (0/70) ko Korean (0/2443) (0/2443) (0/2443) kok Kokani (Devanagari script) (0/68) (0/68) (0/68) -ks Kashmiri (Devanagari script) (0/68) (0/68) (0/68) -ku Kurdish 100% (64/64) 100% (64/64) 100% (64/64) -ku-ir Kurdish in Iran 100% (32/32) (0/32) 100% (32/32) +kr Kanuri 100% (56/56) 96% (54/56) 100% (56/56) +ks Kashmiri 97% (43/44) (0/44) 93% (41/44) +ku-am Kurdish in Armenia 100% (64/64) 100% (64/64) 100% (64/64) +ku-iq Kurdish in Iraq 100% (32/32) (0/32) 87% (28/32) +ku-ir Kurdish in Iran 100% (32/32) (0/32) 87% (28/32) +ku-tr Kurdish in Turkey 100% (62/62) 100% (62/62) 100% (62/62) kum Kumyk 100% (66/66) 100% (66/66) 100% (66/66) kv Komi (Komi-Permyak/Komi-Siryan) 100% (70/70) 100% (70/70) 100% (70/70) kw Cornish 100% (64/64) 100% (64/64) 100% (64/64) +kwm Kwambi 100% (52/52) 100% (52/52) 100% (52/52) ky Kirgiz 100% (70/70) 100% (70/70) 100% (70/70) la Latin 100% (68/68) 100% (68/68) 100% (68/68) +lah Lahnda 97% (43/44) (0/44) 93% (41/44) lb Luxembourgish (Letzeburgesch) 100% (75/75) 100% (75/75) 100% (75/75) lez Lezghian (Lezgian) 100% (67/67) 100% (67/67) 100% (67/67) -lo Lao 100% (65/65) (0/65) 70% (46/65) +lg Ganda 100% (54/54) 100% (54/54) 100% (54/54) +li Limburgan/Limburger/Limburgish 100% (62/62) 100% (62/62) 100% (62/62) +ln Lingala 100% (81/81) 100% (81/81) 100% (81/81) +lo Lao 100% (55/55) (0/55) 83% (46/55) lt Lithuanian 100% (70/70) 100% (70/70) 100% (70/70) lv Latvian 100% (78/78) 100% (78/78) 100% (78/78) +mai Maithili (Devanagari script) (0/68) (0/68) (0/68) mg Malagasy 100% (56/56) 100% (56/56) 100% (56/56) mh Marshallese 100% (62/62) 100% (62/62) 100% (62/62) mi Maori 100% (64/64) 100% (64/64) 100% (64/64) mk Macedonian 100% (42/42) 100% (42/42) 100% (42/42) -ml Malayalam (0/78) (0/78) (0/78) -mn Mongolian (0/130) (0/130) (0/130) +ml Malayalam (0/68) (0/68) (0/68) +mn-cn Mongolian in China (0/130) (0/130) (0/130) +mn-mn Mongolian in Mongolia 100% (70/70) 100% (70/70) 100% (70/70) mo Moldavian 100% (128/128) 100% (128/128) 100% (128/128) mr Marathi (Devanagari script) (0/68) (0/68) (0/68) +ms Malay 100% (52/52) 100% (52/52) 100% (52/52) mt Maltese 100% (72/72) 100% (72/72) 100% (72/72) my Burmese (Myanmar) (0/48) (0/48) (0/48) +na Nauru 100% (60/60) 100% (60/60) 100% (60/60) nb Norwegian Bokmal 100% (70/70) 100% (70/70) 100% (70/70) nds Low Saxon 100% (59/59) 100% (59/59) 100% (59/59) ne Nepali (Devanagari script) (0/68) (0/68) (0/68) +ng Ndonga 100% (52/52) 100% (52/52) 100% (52/52) nl Dutch 100% (82/82) 100% (82/82) 100% (82/82) nn Norwegian Nynorsk 100% (76/76) 100% (76/76) 100% (76/76) no Norwegian (Bokmal) 100% (70/70) 100% (70/70) 100% (70/70) +nr Ndebele, South 100% (52/52) 100% (52/52) 100% (52/52) +nso Northern Sotho 100% (58/58) 100% (58/58) 100% (58/58) +nv Navajo/Navaho 100% (72/72) 100% (72/72) 100% (72/72) ny Chichewa 100% (54/54) 100% (54/54) 100% (54/54) oc Occitan 100% (70/70) 100% (70/70) 100% (70/70) om Oromo or Galla 100% (52/52) 100% (52/52) 100% (52/52) -or Oriya (0/79) (0/79) (0/79) +or Oriya (0/68) (0/68) (0/68) os Ossetic 100% (66/66) 100% (66/66) 100% (66/66) -pa Punjabi (Gurumukhi script) (0/63) (0/63) (0/63) +ota Ottoman Turkish 100% (37/37) (0/37) 97% (36/37) +pa Panjabi/Punjabi (0/63) (0/63) (0/63) +pa-pk Panjabi/Punjabi in Pakistan 97% (43/44) (0/44) 93% (41/44) +pap-an Papiamento in Netherlands Antilles 100% (72/72) 100% (72/72) 100% (72/72) +pap-aw Papiamento in Aruba 100% (54/54) 100% (54/54) 100% (54/54) +pes Western Farsi 100% (40/40) (0/40) 100% (40/40) pl Polish 100% (70/70) 100% (70/70) 100% (70/70) -ps-af Pashto in Afghanistan 83% (41/49) (0/49) 83% (41/49) -ps-pk Pashto in Pakistan 81% (40/49) (0/49) 81% (40/49) +prs Dari/Eastern Farsi 100% (40/40) (0/40) 100% (40/40) +ps-af Pashto in Afghanistan 95% (47/49) (0/49) 77% (38/49) +ps-pk Pashto in Pakistan 93% (46/49) (0/49) 75% (37/49) pt Portuguese 100% (82/82) 100% (82/82) 100% (82/82) +qu Quechua 100% (55/55) 100% (55/55) 100% (55/55) rm Rhaeto-Romance (Romansch) 100% (66/66) 100% (66/66) 100% (66/66) +rn Rundi 100% (52/52) 100% (52/52) 100% (52/52) ro Romanian 100% (62/62) 100% (62/62) 100% (62/62) ru Russian 100% (66/66) 100% (66/66) 100% (66/66) +rw Kinyarwanda 100% (52/52) 100% (52/52) 100% (52/52) sa Sanskrit (Devanagari script) (0/68) (0/68) (0/68) -sah Yakut 100% (76/76) 100% (76/76) 97% (74/76) -sco Scots 100% (56/56) 96% (54/56) 96% (54/56) +sah Yakut 100% (76/76) 100% (76/76) 100% (76/76) +sc Sardinian 100% (62/62) 100% (62/62) 100% (62/62) +sco Scots 100% (56/56) 100% (56/56) 100% (56/56) +sd Sindhi 100% (54/54) (0/54) 79% (43/54) se North Sami 100% (66/66) 100% (66/66) 100% (66/66) sel Selkup (Ostyak-Samoyed) 100% (66/66) 100% (66/66) 100% (66/66) -sh Serbo-Croatian 100% (76/76) 100% (76/76) 100% (76/76) -si Sinhala (Sinhalese) (0/77) (0/77) (0/77) +sg Sango 100% (72/72) 100% (72/72) 100% (72/72) +sh Serbo-Croatian 100% (156/156) 100% (156/156) 98% (154/156) +shs Secwepemctsin 100% (48/48) 100% (48/48) 100% (48/48) +si Sinhala/Sinhalese (0/73) (0/73) (0/73) +sid Sidamo (0/281) (0/281) (0/281) sk Slovak 100% (86/86) 100% (86/86) 100% (86/86) sl Slovenian 100% (62/62) 100% (62/62) 100% (62/62) sm Samoan 100% (53/53) 100% (53/53) 100% (53/53) @@ -142,46 +192,53 @@ sma South Sami 100% (60/60) 100% (60/60) smj Lule Sami 100% (60/60) 100% (60/60) 100% (60/60) smn Inari Sami 100% (68/68) 100% (68/68) 100% (68/68) sms Skolt Sami 100% (80/80) 100% (80/80) 97% (78/80) +sn Shona 100% (52/52) 100% (52/52) 100% (52/52) so Somali 100% (52/52) 100% (52/52) 100% (52/52) sq Albanian 100% (56/56) 100% (56/56) 100% (56/56) -sr Serbian 100% (76/76) 100% (76/76) 100% (76/76) +sr Serbian 100% (60/60) 100% (60/60) 100% (60/60) +ss Swati 100% (52/52) 100% (52/52) 100% (52/52) +st Sotho, Southern 100% (52/52) 100% (52/52) 100% (52/52) +su Sundanese 100% (54/54) 100% (54/54) 100% (54/54) sv Swedish 100% (68/68) 100% (68/68) 100% (68/68) sw Swahili 100% (52/52) 100% (52/52) 100% (52/52) syr Syriac (0/45) (0/45) (0/45) ta Tamil (0/48) (0/48) (0/48) -te Telugu (0/80) (0/80) (0/80) +te Telugu (0/70) (0/70) (0/70) tg Tajik 100% (78/78) 100% (78/78) 97% (76/78) -th Thai 1% (1/87) (0/87) (0/87) -ti-er Eritrean Tigrinya (0/256) (0/256) (0/256) -ti-et Ethiopian Tigrinya (0/282) (0/282) (0/282) +th Thai 1% (1/74) (0/74) (0/74) +ti-er Eritrean Tigrinya (0/255) (0/255) (0/255) +ti-et Ethiopian Tigrinya (0/281) (0/281) (0/281) tig Tigre (0/221) (0/221) (0/221) -tk Turkmen 100% (74/74) 100% (74/74) 97% (72/74) -tl Tagalog (0/19) (0/19) (0/19) -tn Tswana 100% (56/56) 100% (56/56) 100% (56/56) +tk Turkmen 100% (68/68) 100% (68/68) 100% (68/68) +tl Tagalog 100% (84/84) 100% (84/84) 100% (84/84) +tn Tswana 100% (58/58) 100% (58/58) 100% (58/58) to Tonga 100% (53/53) 100% (53/53) 100% (53/53) tr Turkish 100% (70/70) 100% (70/70) 100% (70/70) ts Tsonga 100% (52/52) 100% (52/52) 100% (52/52) -tt Tatar 100% (76/76) 100% (76/76) 97% (74/76) +tt Tatar 100% (76/76) 100% (76/76) 100% (76/76) tw Twi 100% (73/73) 100% (73/73) 100% (73/73) +ty Tahitian 100% (65/65) 100% (65/65) 100% (65/65) tyv Tuvinian 100% (70/70) 100% (70/70) 100% (70/70) -ug Uighur 100% (125/125) (0/125) 100% (125/125) +ug Uighur 100% (36/36) (0/36) 100% (36/36) uk Ukrainian 100% (72/72) 100% (72/72) 100% (72/72) -ur Urdu 94% (137/145) (0/145) 97% (141/145) -uz Uzbek 100% (68/68) 100% (68/68) 100% (68/68) -ven Venda 100% (62/62) 100% (62/62) 100% (62/62) -vi Vietnamese 100% (194/194) 77% (150/194) 62% (122/194) +ur Urdu 97% (43/44) (0/44) 93% (41/44) +uz Uzbek 100% (52/52) 100% (52/52) 100% (52/52) +ve Venda 100% (62/62) 100% (62/62) 100% (62/62) +vi Vietnamese 100% (194/194) 77% (150/194) 76% (148/194) vo Volapuk 100% (54/54) 100% (54/54) 100% (54/54) vot Votic 100% (62/62) 100% (62/62) 100% (62/62) wa Walloon 100% (70/70) 100% (70/70) 100% (70/70) +wal Wolaitta/Wolaytta (0/281) (0/281) (0/281) wen Sorbian languages (lower and upper) 100% (76/76) 100% (76/76) 100% (76/76) wo Wolof 100% (66/66) 100% (66/66) 100% (66/66) xh Xhosa 100% (52/52) 100% (52/52) 100% (52/52) yap Yapese 100% (58/58) 100% (58/58) 100% (58/58) yi Yiddish 100% (27/27) (0/27) (0/27) yo Yoruba 100% (119/119) 100% (119/119) 100% (119/119) +za Zhuang/Chuang 100% (52/52) 100% (52/52) 100% (52/52) zh-cn Chinese (simplified) 0% (2/6765) 0% (2/6765) 0% (2/6765) zh-hk Chinese Hong Kong Supplementary Character Set (0/2213) (0/2213) (0/2213) -zh-mo Chinese in Macau (0/13063) (0/13063) (0/13063) +zh-mo Chinese in Macau (0/2213) (0/2213) (0/2213) zh-sg Chinese in Singapore 0% (2/6765) 0% (2/6765) 0% (2/6765) zh-tw Chinese (traditional) (0/13063) (0/13063) (0/13063) zu Zulu 100% (52/52) 100% (52/52) 100% (52/52) diff --git a/media/fonts/doc/DejaVu_status.txt b/media/fonts/doc/DejaVu_status.txt index 15e49f54177..084667c173b 100644 --- a/media/fonts/doc/DejaVu_status.txt +++ b/media/fonts/doc/DejaVu_status.txt @@ -1,5 +1,5 @@ This is the status file for DejaVu fonts -($Id: status.txt 1929 2007-07-01 12:42:34Z ben_laenen $) +($Id: status.txt 2383 2010-05-27 09:23:21Z ben_laenen $) original = present in original Bitstream Vera 1.10 = added in DejaVu fonts @@ -211,7 +211,7 @@ U+010c Ccaron original U+010d ccaron original U+010e Dcaron 1.0 U+010f dcaron 1.0 -U+0110 Dcroat 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) +U+0110 Dcroat 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+0111 dcroat original U+0112 Emacron 1.5 U+0113 emacron 1.5 @@ -323,83 +323,83 @@ U+017c zdotaccent 1.4 U+017d Zcaron original U+017e zcaron original U+017f longs 1.12 -U+0180 uni0180 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+0181 uni0181 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+0182 uni0182 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+0183 uni0183 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+0180 uni0180 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0181 uni0181 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0182 uni0182 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0183 uni0183 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+0184 uni0184 2.3 U+0185 uni0185 2.3 U+0186 uni0186 1.15 -U+0187 uni0187 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+0188 uni0188 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+0187 uni0187 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0188 uni0188 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+0189 uni0189 2.1 -U+018a uni018A 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+018b uni018B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+018c uni018C 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+018d uni018D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+018e uni018E 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+018f uni018F 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+018a uni018A 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+018b uni018B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+018c uni018C 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+018d uni018D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+018e uni018E 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+018f uni018F 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+0190 uni0190 1.15 -U+0191 uni0191 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+0191 uni0191 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+0192 florin original -U+0193 uni0193 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+0193 uni0193 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+0194 uni0194 1.14 -U+0195 uni0195 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans ExtraLight) -U+0196 uni0196 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+0197 uni0197 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+0198 uni0198 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+0199 uni0199 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+019a uni019A 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+019b uni019B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0195 uni0195 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0196 uni0196 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0197 uni0197 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0198 uni0198 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0199 uni0199 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+019a uni019A 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+019b uni019B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+019c uni019C 2.3 -U+019d uni019D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+019e uni019E 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+019d uni019D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+019e uni019E 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+019f uni019F 2.3 U+01a0 Ohorn 2.3 U+01a1 ohorn 2.3 U+01a2 uni01A2 2.3 U+01a3 uni01A3 2.3 -U+01a4 uni01A4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+01a5 uni01A5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+01a4 uni01A4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01a5 uni01A5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+01a6 uni01A6 2.3 -U+01a7 uni01A7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+01a8 uni01A8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+01a7 uni01A7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01a8 uni01A8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+01a9 uni01A9 2.2 U+01aa uni01AA 2.3 -U+01ab uni01AB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+01ac uni01AC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+01ad uni01AD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+01ae uni01AE 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+01ab uni01AB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01ac uni01AC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01ad uni01AD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01ae uni01AE 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+01af Uhorn 2.3 U+01b0 uhorn 2.3 -U+01b1 uni01B1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+01b1 uni01B1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+01b2 uni01B2 2.3 U+01b3 uni01B3 2.3 U+01b4 uni01B4 2.3 -U+01b5 uni01B5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+01b6 uni01B6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+01b5 uni01B5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01b6 uni01B6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+01b7 uni01B7 2.3 U+01b8 uni01B8 2.3 U+01b9 uni01B9 2.3 -U+01ba uni01BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+01bb uni01BB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+01ba uni01BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01bb uni01BB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+01bc uni01BC 2.3 U+01bd uni01BD 2.3 U+01be uni01BE 2.3 -U+01bf uni01BF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+01c0 uni01C0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+01c1 uni01C1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+01c2 uni01C2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+01bf uni01BF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01c0 uni01C0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01c1 uni01C1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01c2 uni01C2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+01c3 uni01C3 2.2 -U+01c4 uni01C4 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01c5 uni01C5 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01c6 uni01C6 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01c7 uni01C7 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01c8 uni01C8 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01c9 uni01C9 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01ca uni01CA 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01cb uni01CB 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01cc uni01CC 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+01c4 uni01C4 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01c5 uni01C5 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01c6 uni01C6 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01c7 uni01C7 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01c8 uni01C8 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01c9 uni01C9 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01ca uni01CA 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01cb uni01CB 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01cc uni01CC 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+01cd uni01CD 1.15 U+01ce uni01CE 1.15 U+01cf uni01CF 1.15 @@ -408,7 +408,7 @@ U+01d1 uni01D1 1.15 U+01d2 uni01D2 1.15 U+01d3 uni01D3 1.15 U+01d4 uni01D4 1.15 -U+01d5 uni01D5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+01d5 uni01D5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+01d6 uni01D6 1.13 U+01d7 uni01D7 2.3 U+01d8 uni01D8 2.3 @@ -417,98 +417,98 @@ U+01da uni01DA 2.3 U+01db uni01DB 2.3 U+01dc uni01DC 2.3 U+01dd uni01DD 2.2 -U+01de uni01DE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+01de uni01DE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique) 2.23 (Serif Italic Condensed) U+01df uni01DF 1.13 -U+01e0 uni01E0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01e1 uni01E1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+01e0 uni01E0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01e1 uni01E1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+01e2 uni01E2 1.5 U+01e3 uni01E3 1.5 -U+01e4 uni01E4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01e5 uni01E5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01e6 Gcaron 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01e7 gcaron 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01e8 uni01E8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01e9 uni01E9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01e4 uni01E4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+01e5 uni01E5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+01e6 Gcaron 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01e7 gcaron 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01e8 uni01E8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01e9 uni01E9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+01ea uni01EA 1.9 U+01eb uni01EB 1.9 U+01ec uni01EC 1.9 U+01ed uni01ED 1.9 -U+01ee uni01EE 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01ef uni01EF 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01f0 uni01F0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono) -U+01f1 uni01F1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01f2 uni01F2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01f3 uni01F3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01f4 uni01F4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01f5 uni01F5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01ee uni01EE 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01ef uni01EF 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01f0 uni01F0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono) 2.22 (Sans Mono Bold) 2.23 (Serif Italic Condensed) +U+01f1 uni01F1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01f2 uni01F2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01f3 uni01F3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01f4 uni01F4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01f5 uni01F5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+01f6 uni01F6 2.3 U+01f7 uni01F7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+01f8 uni01F8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01f9 uni01F9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01fa Aringacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01fb aringacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+01fc AEacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01fd aeacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01fe Oslashacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+01ff oslashacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0200 uni0200 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0201 uni0201 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0202 uni0202 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0203 uni0203 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0204 uni0204 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0205 uni0205 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0206 uni0206 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0207 uni0207 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0208 uni0208 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0209 uni0209 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+020a uni020A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+020b uni020B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+020c uni020C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+020d uni020D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+020e uni020E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+020f uni020F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0210 uni0210 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0211 uni0211 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0212 uni0212 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0213 uni0213 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0214 uni0214 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0215 uni0215 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0216 uni0216 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0217 uni0217 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01f8 uni01F8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01f9 uni01F9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01fa Aringacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01fb aringacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01fc AEacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01fd aeacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01fe Oslashacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01ff oslashacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0200 uni0200 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0201 uni0201 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0202 uni0202 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0203 uni0203 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0204 uni0204 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0205 uni0205 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0206 uni0206 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0207 uni0207 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0208 uni0208 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0209 uni0209 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+020a uni020A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+020b uni020B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+020c uni020C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+020d uni020D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+020e uni020E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+020f uni020F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0210 uni0210 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0211 uni0211 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0212 uni0212 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0213 uni0213 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0214 uni0214 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0215 uni0215 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0216 uni0216 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0217 uni0217 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+0218 Scommaaccent 1.5 U+0219 scommaaccent 1.5 U+021a uni021A 1.5 U+021b uni021B 1.5 -U+021c uni021C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+021d uni021D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+021e uni021E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+021f uni021F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0220 uni0220 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.18 (Sans Mono, Sans Mono Bold) -U+0221 uni0221 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+021c uni021C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic) +U+021d uni021D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic) +U+021e uni021E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+021f uni021F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0220 uni0220 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.18 (Sans Mono, Sans Mono Bold) 2.23 (Serif Italic Condensed) +U+0221 uni0221 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+0222 uni0222 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0223 uni0223 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0224 uni0224 2.3 U+0225 uni0225 2.3 -U+0226 uni0226 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0227 uni0227 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0228 uni0228 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0229 uni0229 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+022a uni022A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0226 uni0226 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0227 uni0227 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0228 uni0228 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0229 uni0229 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+022a uni022A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+022b uni022B 1.13 -U+022c uni022C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+022c uni022C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+022d uni022D 1.13 U+022e uni022E 1.10 U+022f uni022F 1.10 -U+0230 uni0230 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) +U+0230 uni0230 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+0231 uni0231 1.13 U+0232 uni0232 1.5 U+0233 uni0233 1.5 -U+0234 uni0234 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+0235 uni0235 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+0236 uni0236 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0234 uni0234 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0235 uni0235 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0236 uni0236 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+0237 dotlessj 1.5 -U+0238 uni0238 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) -U+0239 uni0239 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) +U+0238 uni0238 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0239 uni0239 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+023a uni023A 2.3 U+023b uni023B 2.3 U+023c uni023C 2.3 @@ -517,18 +517,18 @@ U+023e uni023E 2.3 U+023f uni023F 2.3 U+0240 uni0240 2.3 U+0241 uni0241 2.3 -U+0242 uni0242 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) +U+0242 uni0242 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+0243 uni0243 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0244 uni0244 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0245 uni0245 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0244 uni0244 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0245 uni0245 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+0246 uni0246 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0247 uni0247 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0248 uni0248 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0249 uni0249 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0248 uni0248 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0249 uni0249 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) U+024a uni024A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+024b uni024B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+024c uni024C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+024d uni024D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+024b uni024B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans ExtraLight) +U+024c uni024C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+024d uni024D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+024e uni024E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+024f uni024F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+0250 uni0250 1.14 @@ -636,11 +636,11 @@ U+02b5 uni02B5 1.14 U+02b6 uni02B6 1.14 U+02b7 uni02B7 1.14 U+02b8 uni02B8 1.14 -U+02b9 uni02B9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+02b9 uni02B9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+02ba uni02BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+02bb uni02BB 1.5 U+02bc uni02BC 1.12 -U+02bd uni02BD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+02bd uni02BD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+02be uni02BE 2.2 U+02bf uni02BF 2.2 U+02c0 uni02C0 1.14 @@ -652,7 +652,7 @@ U+02c5 uni02C5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+02c6 circumflex original U+02c7 caron original U+02c8 uni02C8 2.0 -U+02c9 uni02C9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+02c9 uni02C9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+02ca uni02CA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+02cb uni02CB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+02cc uni02CC 2.0 @@ -666,7 +666,7 @@ U+02d3 uni02D3 2.2 U+02d4 uni02D4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+02d5 uni02D5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+02d6 uni02D6 2.0 -U+02d7 uni02D7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02d7 uni02D7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+02d8 breve original U+02d9 dotaccent original U+02da ring original @@ -687,7 +687,7 @@ U+02e8 uni02E8 2.0 U+02e9 uni02E9 2.0 U+02ec uni02EC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+02ed uni02ED 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+02ee uni02EE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+02ee uni02EE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+02f3 uni02F3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+02f7 uni02F7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+0300 gravecomb 1.15 @@ -757,7 +757,7 @@ U+033f uni033F 2.1 U+0340 uni0340 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0341 uni0341 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0342 uni0342 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0343 uni0343 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0343 uni0343 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+0344 uni0344 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0345 uni0345 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0346 uni0346 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -769,12 +769,13 @@ U+034b uni034B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+034c uni034C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+034d uni034D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+034e uni034E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+034f uni034F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+034f uni034F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+0351 uni0351 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0352 uni0352 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) -U+0353 uni0353 2.5 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0352 uni0352 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) 2.28 (Sans Condensed Oblique, Sans Oblique) +U+0353 uni0353 2.5 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0357 uni0357 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0358 uni0358 2.3 +U+035a uni035A 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+035c uni035C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+035d uni035D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+035e uni035E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -782,103 +783,110 @@ U+035f uni035F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Conde U+0360 uni0360 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0361 uni0361 2.0 U+0362 uni0362 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0374 uni0374 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0375 uni0375 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+037a uni037A 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+037b uni037B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+037c uni037C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+037d uni037D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+037e uni037E 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0384 tonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0385 dieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0386 Alphatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0387 anoteleia 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0388 Epsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0389 Etatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+038a Iotatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+038c Omicrontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+038e Upsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+038f Omegatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+0390 iotadieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0391 Alpha 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0392 Beta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0393 Gamma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0394 uni0394 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0395 Epsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0396 Zeta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0397 Eta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0398 Theta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+0399 Iota 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+039a Kappa 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+039b Lambda 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+039c Mu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+039d Nu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+039e Xi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+039f Omicron 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03a0 Pi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03a1 Rho 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03a3 Sigma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03a4 Tau 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03a5 Upsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03a6 Phi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03a7 Chi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03a8 Psi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) +U+0370 uni0370 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+0371 uni0371 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+0372 uni0372 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0373 uni0373 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0374 uni0374 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0375 uni0375 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0376 uni0376 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0377 uni0377 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+037a uni037A 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+037b uni037B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+037c uni037C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+037d uni037D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+037e uni037E 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0384 tonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0385 dieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0386 Alphatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0387 anoteleia 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0388 Epsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0389 Etatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+038a Iotatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+038c Omicrontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+038e Upsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+038f Omegatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0390 iotadieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0391 Alpha 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0392 Beta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0393 Gamma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0394 uni0394 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0395 Epsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0396 Zeta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0397 Eta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0398 Theta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0399 Iota 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+039a Kappa 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+039b Lambda 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+039c Mu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+039d Nu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+039e Xi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+039f Omicron 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a0 Pi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a1 Rho 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a3 Sigma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a4 Tau 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a5 Upsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a6 Phi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a7 Chi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a8 Psi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+03a9 Omega original -U+03aa Iotadieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03ab Upsilondieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03ac alphatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03ad epsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03ae etatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03af iotatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03b0 upsilondieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03b1 alpha 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03b2 beta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03b3 gamma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03b4 delta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03b5 epsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03b6 zeta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03b7 eta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03b8 theta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03b9 iota 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03ba kappa 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03bb lambda 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03bc uni03BC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03bd nu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03be xi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03bf omicron 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) +U+03aa Iotadieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ab Upsilondieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ac alphatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ad epsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ae etatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03af iotatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b0 upsilondieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b1 alpha 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b2 beta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b3 gamma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b4 delta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b5 epsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b6 zeta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b7 eta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b8 theta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b9 iota 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ba kappa 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03bb lambda 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03bc uni03BC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03bd nu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03be xi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03bf omicron 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+03c0 pi original -U+03c1 rho 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03c2 sigma1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03c3 sigma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03c4 tau 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03c5 upsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03c6 phi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03c7 chi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03c8 psi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03c9 omega 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03ca iotadieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03cb upsilondieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03cc omicrontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03cd upsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03ce omegatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+03d0 uni03D0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03d1 theta1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03d2 Upsilon1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03d3 uni03D3 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03d4 uni03D4 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03d5 phi1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans ExtraLight) -U+03d6 omega1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03d7 uni03D7 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03d8 uni03D8 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03d9 uni03D9 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03da uni03DA 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03db uni03DB 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03dc uni03DC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03dd uni03DD 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03de uni03DE 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03df uni03DF 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03e0 uni03E0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03e1 uni03E1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+03c1 rho 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c2 sigma1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c3 sigma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c4 tau 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c5 upsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c6 phi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c7 chi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c8 psi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c9 omega 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ca iotadieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03cb upsilondieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03cc omicrontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03cd upsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ce omegatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03cf uni03CF 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+03d0 uni03D0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03d1 theta1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03d2 Upsilon1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03d3 uni03D3 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03d4 uni03D4 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03d5 phi1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03d6 omega1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+03d7 uni03D7 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03d8 uni03D8 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+03d9 uni03D9 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+03da uni03DA 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03db uni03DB 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03dc uni03DC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03dd uni03DD 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03de uni03DE 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03df uni03DF 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03e0 uni03E0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03e1 uni03E1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+03e2 uni03E2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+03e3 uni03E3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+03e4 uni03E4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -893,140 +901,140 @@ U+03ec uni03EC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+03ed uni03ED 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+03ee uni03EE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+03ef uni03EF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+03f0 uni03F0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03f1 uni03F1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03f2 uni03F2 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03f3 uni03F3 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03f4 uni03F4 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03f5 uni03F5 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03f6 uni03F6 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03f7 uni03F7 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03f8 uni03F8 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03f9 uni03F9 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03fa uni03FA 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03fb uni03FB 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03fc uni03FC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+03fd uni03FD 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03fe uni03FE 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+03ff uni03FF 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+0400 uni0400 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0401 uni0401 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0402 uni0402 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0403 uni0403 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0404 uni0404 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0405 uni0405 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0406 uni0406 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0407 uni0407 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0408 uni0408 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0409 uni0409 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+040a uni040A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+040b uni040B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+040c uni040C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+040d uni040D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+040e uni040E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+040f uni040F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0410 uni0410 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0411 uni0411 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0412 uni0412 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0413 uni0413 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0414 uni0414 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0415 uni0415 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0416 uni0416 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0417 uni0417 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0418 uni0418 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0419 uni0419 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+041a uni041A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+041b uni041B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+041c uni041C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+041d uni041D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+041e uni041E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+041f uni041F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0420 uni0420 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0421 uni0421 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0422 uni0422 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0423 uni0423 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0424 uni0424 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0425 uni0425 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0426 uni0426 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0427 uni0427 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0428 uni0428 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0429 uni0429 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+042a uni042A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+042b uni042B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+042c uni042C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+042d uni042D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+042e uni042E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+042f uni042F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0430 uni0430 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0431 uni0431 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0432 uni0432 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0433 uni0433 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0434 uni0434 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0435 uni0435 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0436 uni0436 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0437 uni0437 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0438 uni0438 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0439 uni0439 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+043a uni043A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+043b uni043B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+043c uni043C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+043d uni043D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+043e uni043E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+043f uni043F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0440 uni0440 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0441 uni0441 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0442 uni0442 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0443 uni0443 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0444 uni0444 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0445 uni0445 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0446 uni0446 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0447 uni0447 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0448 uni0448 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0449 uni0449 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+044a uni044A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+044b uni044B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+044c uni044C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+044d uni044D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+044e uni044E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+044f uni044F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0450 uni0450 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0451 uni0451 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0452 uni0452 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+0453 uni0453 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0454 uni0454 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0455 uni0455 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0456 uni0456 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0457 uni0457 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0458 uni0458 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+0459 uni0459 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+045a uni045A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+045b uni045B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) -U+045c uni045C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+045d uni045D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+045e uni045E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) -U+045f uni045F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) +U+03f0 uni03F0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03f1 uni03F1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+03f2 uni03F2 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f3 uni03F3 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f4 uni03F4 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f5 uni03F5 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f6 uni03F6 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f7 uni03F7 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f8 uni03F8 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f9 uni03F9 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03fa uni03FA 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03fb uni03FB 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03fc uni03FC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+03fd uni03FD 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03fe uni03FE 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ff uni03FF 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0400 uni0400 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0401 uni0401 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0402 uni0402 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0403 uni0403 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0404 uni0404 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0405 uni0405 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0406 uni0406 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0407 uni0407 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0408 uni0408 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0409 uni0409 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+040a uni040A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+040b uni040B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+040c uni040C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+040d uni040D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+040e uni040E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+040f uni040F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0410 uni0410 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0411 uni0411 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0412 uni0412 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0413 uni0413 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0414 uni0414 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0415 uni0415 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0416 uni0416 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0417 uni0417 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0418 uni0418 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0419 uni0419 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+041a uni041A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+041b uni041B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+041c uni041C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+041d uni041D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+041e uni041E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+041f uni041F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0420 uni0420 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0421 uni0421 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0422 uni0422 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0423 uni0423 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0424 uni0424 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0425 uni0425 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0426 uni0426 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0427 uni0427 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0428 uni0428 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0429 uni0429 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+042a uni042A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+042b uni042B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+042c uni042C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+042d uni042D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+042e uni042E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+042f uni042F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0430 uni0430 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0431 uni0431 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0432 uni0432 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0433 uni0433 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0434 uni0434 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0435 uni0435 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0436 uni0436 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0437 uni0437 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0438 uni0438 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0439 uni0439 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+043a uni043A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+043b uni043B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+043c uni043C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+043d uni043D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+043e uni043E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+043f uni043F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0440 uni0440 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0441 uni0441 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0442 uni0442 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0443 uni0443 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0444 uni0444 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0445 uni0445 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0446 uni0446 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0447 uni0447 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0448 uni0448 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0449 uni0449 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+044a uni044A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+044b uni044B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+044c uni044C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+044d uni044D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+044e uni044E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+044f uni044F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0450 uni0450 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0451 uni0451 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0452 uni0452 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0453 uni0453 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0454 uni0454 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0455 uni0455 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0456 uni0456 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0457 uni0457 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0458 uni0458 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0459 uni0459 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+045a uni045A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+045b uni045B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+045c uni045C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+045d uni045D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+045e uni045E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+045f uni045F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+0460 uni0460 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0461 uni0461 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0462 uni0462 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+0463 uni0463 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+0464 uni0464 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+0465 uni0465 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0462 uni0462 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0463 uni0463 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0464 uni0464 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0465 uni0465 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+0466 uni0466 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0467 uni0467 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0468 uni0468 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0469 uni0469 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+046a uni046A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+046b uni046B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046a uni046A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+046b uni046B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+046c uni046C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+046d uni046D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+046e uni046E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+046f uni046F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0470 uni0470 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0471 uni0471 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+0472 uni0472 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) -U+0473 uni0473 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+0474 uni0474 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+0475 uni0475 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0470 uni0470 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+0471 uni0471 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+0472 uni0472 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0473 uni0473 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0474 uni0474 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0475 uni0475 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+0476 uni0476 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0477 uni0477 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0478 uni0478 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -1044,129 +1052,129 @@ U+0483 uni0483 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+0484 uni0484 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0485 uni0485 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0486 uni0486 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0487 uni0487 2.9 (Sans, Sans Condensed) +U+0487 uni0487 2.9 (Sans, Sans Condensed) 2.27 (Sans Bold, Sans Bold Oblique, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0488 uni0488 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0489 uni0489 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+048a uni048A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+048b uni048B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+048c uni048C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+048d uni048D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+048c uni048C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+048d uni048D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+048e uni048E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+048f uni048F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0490 uni0490 1.15 U+0491 uni0491 1.15 U+0492 uni0492 1.14 U+0493 uni0493 1.14 -U+0494 uni0494 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0495 uni0495 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+0496 uni0496 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+0497 uni0497 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+0498 uni0498 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+0499 uni0499 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+0494 uni0494 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0495 uni0495 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0496 uni0496 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0497 uni0497 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0498 uni0498 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0499 uni0499 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+049a uni049A 1.14 U+049b uni049B 1.14 U+049c uni049C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+049d uni049D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+049e uni049E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+049f uni049F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04a0 uni04A0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04a1 uni04A1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04a2 uni04A2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04a3 uni04A3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04a4 uni04A4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) -U+04a5 uni04A5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) -U+04a6 uni04A6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04a7 uni04A7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+049e uni049E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+049f uni049F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04a0 uni04A0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+04a1 uni04A1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+04a2 uni04A2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04a3 uni04A3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04a4 uni04A4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+04a5 uni04A5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+04a6 uni04A6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04a7 uni04A7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+04a8 uni04A8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+04a9 uni04A9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04aa uni04AA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04ab uni04AB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04ac uni04AC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04ad uni04AD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04ae uni04AE 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04af uni04AF 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04b0 uni04B0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04b1 uni04B1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04aa uni04AA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04ab uni04AB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04ac uni04AC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04ad uni04AD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04ae uni04AE 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04af uni04AF 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04b0 uni04B0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+04b1 uni04B1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+04b2 uni04B2 1.14 U+04b3 uni04B3 1.14 -U+04b4 uni04B4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) -U+04b5 uni04B5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) -U+04b6 uni04B6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04b7 uni04B7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+04b4 uni04B4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04b5 uni04B5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04b6 uni04B6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04b7 uni04B7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+04b8 uni04B8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+04b9 uni04B9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04ba uni04BA 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+04bb uni04BB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+04ba uni04BA 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04bb uni04BB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+04bc uni04BC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+04bd uni04BD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+04be uni04BE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+04bf uni04BF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04c0 uni04C0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04c1 uni04C1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+04c2 uni04C2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+04c3 uni04C3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+04c4 uni04C4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+04c0 uni04C0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04c1 uni04C1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04c2 uni04C2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04c3 uni04C3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+04c4 uni04C4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+04c5 uni04C5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+04c6 uni04C6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04c7 uni04C7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+04c8 uni04C8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+04c7 uni04C7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+04c8 uni04C8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) U+04c9 uni04C9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+04ca uni04CA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04cb uni04CB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04cc uni04CC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+04cb uni04CB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04cc uni04CC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+04cd uni04CD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+04ce uni04CE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04cf uni04CF 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04d0 uni04D0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+04d1 uni04D1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+04d2 uni04D2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+04d3 uni04D3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+04d4 uni04D4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+04d5 uni04D5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+04d6 uni04D6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+04d7 uni04D7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+04d8 uni04D8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04d9 uni04D9 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04da uni04DA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04db uni04DB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04dc uni04DC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+04dd uni04DD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+04de uni04DE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04df uni04DF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+04cf uni04CF 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04d0 uni04D0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d1 uni04D1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d2 uni04D2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d3 uni04D3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d4 uni04D4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d5 uni04D5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d6 uni04D6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d7 uni04D7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d8 uni04D8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04d9 uni04D9 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04da uni04DA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04db uni04DB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04dc uni04DC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04dd uni04DD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04de uni04DE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04df uni04DF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+04e0 uni04E0 2.3 U+04e1 uni04E1 2.3 -U+04e2 uni04E2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04e3 uni04E3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04e4 uni04E4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04e5 uni04E5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04e6 uni04E6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+04e7 uni04E7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) -U+04e8 uni04E8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+04e9 uni04E9 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+04ea uni04EA 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+04eb uni04EB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+04ec uni04EC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+04ed uni04ED 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+04ee uni04EE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+04ef uni04EF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04f0 uni04F0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+04f1 uni04F1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04f2 uni04F2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+04f3 uni04F3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04f4 uni04F4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+04f5 uni04F5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+04f6 uni04F6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04f7 uni04F7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04f8 uni04F8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+04f9 uni04F9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) +U+04e2 uni04E2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04e3 uni04E3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04e4 uni04E4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04e5 uni04E5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04e6 uni04E6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04e7 uni04E7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04e8 uni04E8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+04e9 uni04E9 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+04ea uni04EA 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+04eb uni04EB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+04ec uni04EC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04ed uni04ED 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04ee uni04EE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04ef uni04EF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04f0 uni04F0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04f1 uni04F1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04f2 uni04F2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04f3 uni04F3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04f4 uni04F4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04f5 uni04F5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04f6 uni04F6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04f7 uni04F7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04f8 uni04F8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04f9 uni04F9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+04fa uni04FA 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+04fb uni04FB 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+04fc uni04FC 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+04fd uni04FD 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04fe uni04FE 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+04ff uni04FF 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0500 uni0500 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0501 uni0501 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04fe uni04FE 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+04ff uni04FF 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0500 uni0500 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0501 uni0501 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) U+0502 uni0502 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0503 uni0503 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0504 uni0504 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -1181,10 +1189,26 @@ U+050c uni050C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+050d uni050D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+050e uni050E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+050f uni050F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0510 uni0510 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0511 uni0511 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0512 uni0512 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0513 uni0513 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0510 uni0510 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+0511 uni0511 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+0512 uni0512 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+0513 uni0513 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+0514 uni0514 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+0515 uni0515 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+0516 uni0516 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0517 uni0517 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0518 uni0518 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0519 uni0519 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+051a uni051A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+051b uni051B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+051c uni051C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+051d uni051D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+0520 uni0520 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0521 uni0521 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0522 uni0522 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0523 uni0523 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0524 uni0524 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0525 uni0525 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0531 uni0531 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0532 uni0532 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0533 uni0533 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -1216,7 +1240,7 @@ U+054c uni054C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+054d uni054D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) U+054e uni054E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+054f uni054F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0550 uni0550 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0550 uni0550 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) U+0551 uni0551 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0552 uni0552 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0553 uni0553 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) @@ -1231,23 +1255,23 @@ U+055d uni055D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+055e uni055E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+055f uni055F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0561 uni0561 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+0562 uni0562 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0563 uni0563 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0564 uni0564 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0565 uni0565 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0566 uni0566 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0562 uni0562 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0563 uni0563 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0564 uni0564 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0565 uni0565 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0566 uni0566 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) U+0567 uni0567 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0568 uni0568 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0568 uni0568 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) U+0569 uni0569 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+056a uni056A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+056b uni056B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+056c uni056C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+056c uni056C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) U+056d uni056D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) U+056e uni056E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+056f uni056F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) U+0570 uni0570 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) U+0571 uni0571 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0572 uni0572 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0572 uni0572 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) U+0573 uni0573 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0574 uni0574 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0575 uni0575 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) @@ -1257,18 +1281,18 @@ U+0578 uni0578 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+0579 uni0579 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+057a uni057A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+057b uni057B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+057c uni057C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+057c uni057C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) U+057d uni057D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+057e uni057E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+057e uni057E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) U+057f uni057F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) U+0580 uni0580 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) U+0581 uni0581 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+0582 uni0582 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0582 uni0582 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) U+0583 uni0583 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) U+0584 uni0584 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+0585 uni0585 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) U+0586 uni0586 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+0587 uni0587 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0587 uni0587 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) U+0589 uni0589 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) U+058a uni058A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+05b0 uni05B0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -1325,6 +1349,10 @@ U+05f1 uni05F1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+05f2 uni05F2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+05f3 uni05F3 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+05f4 uni05F4 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0606 uni0606 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0607 uni0607 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0609 uni0609 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+060a uni060A 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) U+060c uni060C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+0615 uni0615 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+061b uni061B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) @@ -1377,6 +1405,7 @@ U+0652 uni0652 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed U+0653 uni0653 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+0654 uni0654 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+0655 uni0655 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0657 uni0657 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+065a uni065A 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+0660 uni0660 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+0661 uni0661 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) @@ -1394,6 +1423,7 @@ U+066c uni066C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed U+066d uni066D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+066e uni066E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+066f uni066F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0670 uni0670 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+0674 uni0674 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans ExtraLight) 2.16 (Sans Mono, Sans Mono Bold) U+0679 uni0679 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+067a uni067A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) @@ -1410,18 +1440,61 @@ U+0684 uni0684 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed U+0685 uni0685 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+0686 uni0686 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+0687 uni0687 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0688 uni0688 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0689 uni0689 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+068a uni068A 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+068b uni068B 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+068c uni068C 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+068d uni068D 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+068e uni068E 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+068f uni068F 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0690 uni0690 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+0691 uni0691 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+0692 uni0692 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0693 uni0693 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0694 uni0694 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+0695 uni0695 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0696 uni0696 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0697 uni0697 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+0698 uni0698 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0699 uni0699 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+069a uni069A 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+069b uni069B 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+069c uni069C 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+069d uni069D 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+069e uni069E 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+069f uni069F 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06a0 uni06A0 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+06a1 uni06A1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06a2 uni06A2 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06a3 uni06A3 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+06a4 uni06A4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06a5 uni06A5 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+06a6 uni06A6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06a7 uni06A7 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06a8 uni06A8 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+06a9 uni06A9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06aa uni06AA 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06ab uni06AB 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06ac uni06AC 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06ad uni06AD 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06ae uni06AE 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+06af uni06AF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06b0 uni06B0 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06b1 uni06B1 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06b2 uni06B2 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06b3 uni06B3 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06b4 uni06B4 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+06b5 uni06B5 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06b6 uni06B6 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06b7 uni06B7 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06b8 uni06B8 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06b9 uni06B9 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+06ba uni06BA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+06be uni06BE 2.16 (Sans Mono, Sans Mono Bold) +U+06bb uni06BB 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06bc uni06BC 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06bd uni06BD 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06be uni06BE 2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+06bf uni06BF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+06c6 uni06C6 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+06cc uni06CC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) @@ -1557,89 +1630,89 @@ U+0ed8 uni0ED8 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Conde U+0ed9 uni0ED9 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+0edc uni0EDC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+0edd uni0EDD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+10a0 uni10A0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10a1 uni10A1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10a2 uni10A2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10a3 uni10A3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10a4 uni10A4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10a5 uni10A5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10a6 uni10A6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10a7 uni10A7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10a8 uni10A8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10a9 uni10A9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10aa uni10AA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10ab uni10AB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10ac uni10AC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10ad uni10AD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10ae uni10AE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10af uni10AF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10b0 uni10B0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10b1 uni10B1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10b2 uni10B2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10b3 uni10B3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10b4 uni10B4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10b5 uni10B5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10b6 uni10B6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10b7 uni10B7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10b8 uni10B8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10b9 uni10B9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10ba uni10BA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10bb uni10BB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10bc uni10BC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10bd uni10BD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10be uni10BE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10bf uni10BF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10c0 uni10C0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10c1 uni10C1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10c2 uni10C2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10c3 uni10C3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10c4 uni10C4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10c5 uni10C5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10d0 uni10D0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10d1 uni10D1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10d2 uni10D2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10d3 uni10D3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10d4 uni10D4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10d5 uni10D5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10d6 uni10D6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10d7 uni10D7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10d8 uni10D8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10d9 uni10D9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10da uni10DA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10db uni10DB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10dc uni10DC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10dd uni10DD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10de uni10DE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10df uni10DF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10e0 uni10E0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10e1 uni10E1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10e2 uni10E2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10e3 uni10E3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10e4 uni10E4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10e5 uni10E5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10e6 uni10E6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10e7 uni10E7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10e8 uni10E8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10e9 uni10E9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10ea uni10EA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10eb uni10EB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10ec uni10EC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10ed uni10ED 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10ee uni10EE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10ef uni10EF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10f0 uni10F0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10f1 uni10F1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10f2 uni10F2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10f3 uni10F3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10f4 uni10F4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10f5 uni10F5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10f6 uni10F6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10f7 uni10F7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10f8 uni10F8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10f9 uni10F9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10fa uni10FA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10fb uni10FB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) -U+10fc uni10FC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) +U+10a0 uni10A0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a1 uni10A1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a2 uni10A2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a3 uni10A3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a4 uni10A4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a5 uni10A5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a6 uni10A6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a7 uni10A7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a8 uni10A8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a9 uni10A9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10aa uni10AA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ab uni10AB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ac uni10AC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ad uni10AD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ae uni10AE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10af uni10AF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b0 uni10B0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b1 uni10B1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b2 uni10B2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b3 uni10B3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b4 uni10B4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b5 uni10B5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b6 uni10B6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b7 uni10B7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b8 uni10B8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b9 uni10B9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ba uni10BA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10bb uni10BB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10bc uni10BC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10bd uni10BD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10be uni10BE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10bf uni10BF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10c0 uni10C0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10c1 uni10C1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10c2 uni10C2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10c3 uni10C3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10c4 uni10C4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10c5 uni10C5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d0 uni10D0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d1 uni10D1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d2 uni10D2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d3 uni10D3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d4 uni10D4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d5 uni10D5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d6 uni10D6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d7 uni10D7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d8 uni10D8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d9 uni10D9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10da uni10DA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10db uni10DB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10dc uni10DC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10dd uni10DD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10de uni10DE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10df uni10DF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e0 uni10E0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e1 uni10E1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e2 uni10E2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e3 uni10E3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e4 uni10E4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e5 uni10E5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e6 uni10E6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e7 uni10E7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e8 uni10E8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e9 uni10E9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ea uni10EA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10eb uni10EB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ec uni10EC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ed uni10ED 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ee uni10EE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ef uni10EF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f0 uni10F0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f1 uni10F1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f2 uni10F2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f3 uni10F3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f4 uni10F4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f5 uni10F5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f6 uni10F6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f7 uni10F7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f8 uni10F8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f9 uni10F9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10fa uni10FA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10fb uni10FB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10fc uni10FC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+1401 uni1401 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1402 uni1402 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1403 uni1403 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -2044,16 +2117,45 @@ U+1673 uni1673 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Conde U+1674 uni1674 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1675 uni1675 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1676 uni1676 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1680 uni1680 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1681 uni1681 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1682 uni1682 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1683 uni1683 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1684 uni1684 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1685 uni1685 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1686 uni1686 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1687 uni1687 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1688 uni1688 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1689 uni1689 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+168a uni168A 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+168b uni168B 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+168c uni168C 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+168d uni168D 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+168e uni168E 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+168f uni168F 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1690 uni1690 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1691 uni1691 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1692 uni1692 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1693 uni1693 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1694 uni1694 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1695 uni1695 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1696 uni1696 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1697 uni1697 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1698 uni1698 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1699 uni1699 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+169a uni169A 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+169b uni169B 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+169c uni169C 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) U+1d00 uni1D00 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d01 uni1D01 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d02 uni1D02 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+1d02 uni1D02 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1d03 uni1D03 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d04 uni1D04 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) U+1d05 uni1D05 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d06 uni1D06 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d07 uni1D07 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d08 uni1D08 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1d09 uni1D09 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+1d08 uni1D08 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+1d09 uni1D09 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1d0a uni1D0A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d0b uni1D0B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) U+1d0c uni1D0C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -2064,17 +2166,17 @@ U+1d10 uni1D10 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+1d11 uni1D11 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) U+1d12 uni1D12 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) U+1d13 uni1D13 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+1d14 uni1D14 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+1d14 uni1D14 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1d16 uni1D16 2.3 U+1d17 uni1D17 2.3 U+1d18 uni1D18 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d19 uni1D19 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d1a uni1D1A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d19 uni1D19 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+1d1a uni1D1A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) U+1d1b uni1D1B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d1c uni1D1C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d1d uni1D1D 2.3 U+1d1e uni1D1E 2.3 -U+1d1f uni1D1F 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1d1f uni1D1F 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+1d20 uni1D20 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) U+1d21 uni1D21 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) U+1d22 uni1D22 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) @@ -2084,29 +2186,29 @@ U+1d27 uni1D27 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+1d28 uni1D28 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) U+1d29 uni1D29 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d2a uni1D2A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d2b uni1D2B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d2c uni1D2C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d2d uni1D2D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d2e uni1D2E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d30 uni1D30 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d31 uni1D31 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d32 uni1D32 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d33 uni1D33 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d34 uni1D34 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d35 uni1D35 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d36 uni1D36 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d37 uni1D37 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d38 uni1D38 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d39 uni1D39 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d3a uni1D3A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d3b uni1D3B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d3c uni1D3C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) +U+1d2b uni1D2B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+1d2c uni1D2C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d2d uni1D2D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d2e uni1D2E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d30 uni1D30 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d31 uni1D31 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d32 uni1D32 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d33 uni1D33 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d34 uni1D34 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d35 uni1D35 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d36 uni1D36 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d37 uni1D37 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d38 uni1D38 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d39 uni1D39 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d3a uni1D3A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d3b uni1D3B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d3c uni1D3C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d3d uni1D3D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono Oblique) -U+1d3e uni1D3E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d3f uni1D3F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d40 uni1D40 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d41 uni1D41 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d42 uni1D42 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) +U+1d3e uni1D3E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d3f uni1D3F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d40 uni1D40 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d41 uni1D41 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d42 uni1D42 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d43 uni1D43 2.3 U+1d44 uni1D44 2.3 U+1d45 uni1D45 2.3 @@ -2132,23 +2234,22 @@ U+1d58 uni1D58 2.3 U+1d59 uni1D59 2.3 U+1d5a uni1D5A 2.3 U+1d5b uni1D5B 2.3 -U+1d5c uni1D5C 2.10 (Sans Oblique) 2.11 (Sans Condensed Oblique) U+1d5d uni1D5D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+1d5e uni1D5E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+1d5f uni1D5F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+1d60 uni1D60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+1d61 uni1D61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d62 uni1D62 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d63 uni1D63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d64 uni1D64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1d65 uni1D65 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) +U+1d62 uni1D62 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d63 uni1D63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d64 uni1D64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d65 uni1D65 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d66 uni1D66 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+1d67 uni1D67 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+1d68 uni1D68 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+1d69 uni1D69 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+1d6a uni1D6A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+1d77 uni1D77 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) -U+1d78 uni1D78 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) +U+1d77 uni1D77 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1d78 uni1D78 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+1d7b uni1D7B 2.3 U+1d85 uni1D85 2.3 U+1d9b uni1D9B 2.3 @@ -2188,77 +2289,77 @@ U+1dbc uni1DBC 2.3 U+1dbd uni1DBD 2.3 U+1dbe uni1DBE 2.3 U+1dbf uni1DBF 2.3 -U+1dc4 uni1DC4 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1dc5 uni1DC5 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1dc6 uni1DC6 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1dc7 uni1DC7 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1dc8 uni1DC8 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1dc9 uni1DC9 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1e00 uni1E00 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e01 uni1E01 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e02 uni1E02 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e03 uni1E03 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e04 uni1E04 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e05 uni1E05 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e06 uni1E06 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e07 uni1E07 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e08 uni1E08 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e09 uni1E09 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e0a uni1E0A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e0b uni1E0B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1dc4 uni1DC4 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1dc5 uni1DC5 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1dc6 uni1DC6 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1dc7 uni1DC7 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1dc8 uni1DC8 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1dc9 uni1DC9 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1e00 uni1E00 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e01 uni1E01 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e02 uni1E02 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e03 uni1E03 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e04 uni1E04 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e05 uni1E05 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e06 uni1E06 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e07 uni1E07 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e08 uni1E08 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e09 uni1E09 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e0a uni1E0A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e0b uni1E0B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e0c uni1E0C 2.1 U+1e0d uni1E0D 2.1 -U+1e0e uni1E0E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e0f uni1E0F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e10 uni1E10 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e11 uni1E11 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1e0e uni1E0E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e0f uni1E0F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e10 uni1E10 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e11 uni1E11 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e12 uni1E12 1.13 U+1e13 uni1E13 1.13 -U+1e14 uni1E14 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1e15 uni1E15 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1e16 uni1E16 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1e17 uni1E17 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1e18 uni1E18 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e19 uni1E19 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e1a uni1E1A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e1b uni1E1B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e1c uni1E1C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1e1d uni1E1D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+1e1e uni1E1E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e1f uni1E1F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e20 uni1E20 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e21 uni1E21 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e22 uni1E22 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e23 uni1E23 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e14 uni1E14 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e15 uni1E15 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e16 uni1E16 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e17 uni1E17 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e18 uni1E18 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e19 uni1E19 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e1a uni1E1A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e1b uni1E1B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e1c uni1E1C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1e1d uni1E1D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1e1e uni1E1E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e1f uni1E1F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e20 uni1E20 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e21 uni1E21 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e22 uni1E22 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e23 uni1E23 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e24 uni1E24 2.1 U+1e25 uni1E25 2.1 -U+1e26 uni1E26 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e27 uni1E27 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e28 uni1E28 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e29 uni1E29 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e2a uni1E2A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e2b uni1E2B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e2c uni1E2C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e2d uni1E2D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e26 uni1E26 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e27 uni1E27 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e28 uni1E28 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e29 uni1E29 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e2a uni1E2A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e2b uni1E2B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e2c uni1E2C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e2d uni1E2D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e2e uni1E2E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1e2f uni1E2F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e30 uni1E30 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e31 uni1E31 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e32 uni1E32 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e33 uni1E33 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e34 uni1E34 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e35 uni1E35 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e30 uni1E30 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e31 uni1E31 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e32 uni1E32 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e33 uni1E33 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e34 uni1E34 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e35 uni1E35 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e36 uni1E36 2.1 U+1e37 uni1E37 2.1 U+1e38 uni1E38 2.1 U+1e39 uni1E39 2.1 -U+1e3a uni1E3A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e3b uni1E3B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e3a uni1E3A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e3b uni1E3B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e3c uni1E3C 1.13 U+1e3d uni1E3D 1.13 -U+1e3e uni1E3E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e3f uni1E3F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e40 uni1E40 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e3e uni1E3E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e3f uni1E3F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e40 uni1E40 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e41 uni1E41 2.1 U+1e42 uni1E42 2.1 U+1e43 uni1E43 2.1 @@ -2266,31 +2367,31 @@ U+1e44 uni1E44 1.13 U+1e45 uni1E45 1.13 U+1e46 uni1E46 2.1 U+1e47 uni1E47 2.1 -U+1e48 uni1E48 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e49 uni1E49 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e48 uni1E48 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e49 uni1E49 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e4a uni1E4A 1.13 U+1e4b uni1E4B 1.13 -U+1e4c uni1E4C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e4d uni1E4D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e4c uni1E4C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1e4d uni1E4D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+1e4e uni1E4E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1e4f uni1E4F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e50 uni1E50 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1e51 uni1E51 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1e52 uni1E52 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1e53 uni1E53 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1e54 uni1E54 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e55 uni1E55 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e56 uni1E56 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e50 uni1E50 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e51 uni1E51 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e52 uni1E52 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e53 uni1E53 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e54 uni1E54 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e55 uni1E55 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e56 uni1E56 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e57 uni1E57 2.1 -U+1e58 uni1E58 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e59 uni1E59 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e58 uni1E58 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e59 uni1E59 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e5a uni1E5A 2.1 U+1e5b uni1E5B 2.1 U+1e5c uni1E5C 2.1 U+1e5d uni1E5D 2.1 -U+1e5e uni1E5E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e5f uni1E5F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e60 uni1E60 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e5e uni1E5E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e5f uni1E5F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e60 uni1E60 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e61 uni1E61 2.1 U+1e62 uni1E62 2.1 U+1e63 uni1E63 2.1 @@ -2298,28 +2399,28 @@ U+1e64 uni1E64 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+1e65 uni1E65 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+1e66 uni1E66 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1e67 uni1E67 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1e68 uni1E68 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e69 uni1E69 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e6a uni1E6A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e6b uni1E6B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e68 uni1E68 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e69 uni1E69 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e6a uni1E6A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e6b uni1E6B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e6c uni1E6C 2.1 U+1e6d uni1E6D 2.1 -U+1e6e uni1E6E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e6f uni1E6F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e6e uni1E6E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e6f uni1E6F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1e70 uni1E70 1.13 U+1e71 uni1E71 1.13 -U+1e72 uni1E72 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e73 uni1E73 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e74 uni1E74 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e75 uni1E75 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e76 uni1E76 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e77 uni1E77 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e78 uni1E78 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1e79 uni1E79 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1e7a uni1E7A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1e7b uni1E7B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1e7c uni1E7C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e7d uni1E7D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1e72 uni1E72 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e73 uni1E73 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e74 uni1E74 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e75 uni1E75 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e76 uni1E76 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e77 uni1E77 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e78 uni1E78 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e79 uni1E79 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e7a uni1E7A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e7b uni1E7B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e7c uni1E7C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e7d uni1E7D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+1e7e uni1E7E 2.1 U+1e7f uni1E7F 2.1 U+1e80 Wgrave 1.2 @@ -2328,32 +2429,34 @@ U+1e82 Wacute 1.2 U+1e83 wacute 1.2 U+1e84 Wdieresis 1.2 U+1e85 wdieresis 1.2 -U+1e86 uni1E86 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e87 uni1E87 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e88 uni1E88 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e89 uni1E89 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e8a uni1E8A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e8b uni1E8B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e8c uni1E8C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e8d uni1E8D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e8e uni1E8E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e8f uni1E8F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e90 uni1E90 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e91 uni1E91 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e92 uni1E92 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e93 uni1E93 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e94 uni1E94 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e95 uni1E95 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e96 uni1E96 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1e97 uni1E97 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e98 uni1E98 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e99 uni1E99 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1e9a uni1E9A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) -U+1e9b uni1E9B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ea0 uni1EA0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ea1 uni1EA1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ea2 uni1EA2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1ea3 uni1EA3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) +U+1e86 uni1E86 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e87 uni1E87 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e88 uni1E88 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e89 uni1E89 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e8a uni1E8A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e8b uni1E8B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e8c uni1E8C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e8d uni1E8D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e8e uni1E8E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e8f uni1E8F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e90 uni1E90 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e91 uni1E91 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e92 uni1E92 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e93 uni1E93 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e94 uni1E94 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e95 uni1E95 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e96 uni1E96 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e97 uni1E97 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e98 uni1E98 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e99 uni1E99 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e9a uni1E9A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e9b uni1E9B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e9e uni1E9E 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1e9f uni1E9F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1ea0 uni1EA0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ea1 uni1EA1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ea2 uni1EA2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ea3 uni1EA3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1ea4 uni1EA4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1ea5 uni1EA5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1ea6 uni1EA6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) @@ -2362,24 +2465,24 @@ U+1ea8 uni1EA8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+1ea9 uni1EA9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1eaa uni1EAA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1eab uni1EAB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eac uni1EAC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1ead uni1EAD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1eae uni1EAE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1eaf uni1EAF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1eb0 uni1EB0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1eb1 uni1EB1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1eb2 uni1EB2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1eb3 uni1EB3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1eb4 uni1EB4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1eb5 uni1EB5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1eb6 uni1EB6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1eb7 uni1EB7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+1eac uni1EAC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ead uni1EAD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eae uni1EAE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1eaf uni1EAF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1eb0 uni1EB0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1eb1 uni1EB1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1eb2 uni1EB2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1eb3 uni1EB3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1eb4 uni1EB4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1eb5 uni1EB5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1eb6 uni1EB6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eb7 uni1EB7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+1eb8 uni1EB8 2.2 U+1eb9 uni1EB9 2.2 -U+1eba uni1EBA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1ebb uni1EBB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1ebc uni1EBC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ebd uni1EBD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eba uni1EBA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ebb uni1EBB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ebc uni1EBC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ebd uni1EBD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+1ebe uni1EBE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1ebf uni1EBF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1ec0 uni1EC0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) @@ -2388,16 +2491,16 @@ U+1ec2 uni1EC2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+1ec3 uni1EC3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1ec4 uni1EC4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1ec5 uni1EC5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ec6 uni1EC6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1ec7 uni1EC7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1ec8 uni1EC8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1ec9 uni1EC9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) +U+1ec6 uni1EC6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ec7 uni1EC7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ec8 uni1EC8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ec9 uni1EC9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1eca uni1ECA 2.2 U+1ecb uni1ECB 2.2 U+1ecc uni1ECC 2.2 U+1ecd uni1ECD 2.2 -U+1ece uni1ECE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1ecf uni1ECF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) +U+1ece uni1ECE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ecf uni1ECF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+1ed0 uni1ED0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1ed1 uni1ED1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1ed2 uni1ED2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) @@ -2406,296 +2509,296 @@ U+1ed4 uni1ED4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+1ed5 uni1ED5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1ed6 uni1ED6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1ed7 uni1ED7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ed8 uni1ED8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1ed9 uni1ED9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+1eda uni1EDA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1edb uni1EDB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1edc uni1EDC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1edd uni1EDD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ed8 uni1ED8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ed9 uni1ED9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eda uni1EDA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1edb uni1EDB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1edc uni1EDC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1edd uni1EDD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+1ede uni1EDE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1edf uni1EDF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1ee0 uni1EE0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1ee1 uni1EE1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1ee2 uni1EE2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1ee3 uni1EE3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ee0 uni1EE0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ee1 uni1EE1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ee2 uni1EE2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ee3 uni1EE3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+1ee4 uni1EE4 2.2 U+1ee5 uni1EE5 2.2 -U+1ee6 uni1EE6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1ee7 uni1EE7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1ee8 uni1EE8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1ee9 uni1EE9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1eea uni1EEA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1eeb uni1EEB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ee6 uni1EE6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ee7 uni1EE7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ee8 uni1EE8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ee9 uni1EE9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eea uni1EEA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eeb uni1EEB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+1eec uni1EEC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) U+1eed uni1EED 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) -U+1eee uni1EEE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1eef uni1EEF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1ef0 uni1EF0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+1ef1 uni1EF1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eee uni1EEE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eef uni1EEF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ef0 uni1EF0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ef1 uni1EF1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+1ef2 Ygrave 1.2 U+1ef3 ygrave 1.2 -U+1ef4 uni1EF4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ef5 uni1EF5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ef6 uni1EF6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1ef7 uni1EF7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) -U+1ef8 uni1EF8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ef9 uni1EF9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1f00 uni1F00 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f01 uni1F01 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f02 uni1F02 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f03 uni1F03 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f04 uni1F04 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f05 uni1F05 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f06 uni1F06 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f07 uni1F07 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f08 uni1F08 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f09 uni1F09 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f0a uni1F0A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f0b uni1F0B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f0c uni1F0C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f0d uni1F0D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f0e uni1F0E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f0f uni1F0F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f10 uni1F10 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f11 uni1F11 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f12 uni1F12 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f13 uni1F13 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f14 uni1F14 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f15 uni1F15 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f18 uni1F18 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f19 uni1F19 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f1a uni1F1A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f1b uni1F1B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f1c uni1F1C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f1d uni1F1D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f20 uni1F20 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f21 uni1F21 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f22 uni1F22 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f23 uni1F23 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f24 uni1F24 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f25 uni1F25 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f26 uni1F26 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f27 uni1F27 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f28 uni1F28 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f29 uni1F29 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f2a uni1F2A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f2b uni1F2B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f2c uni1F2C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f2d uni1F2D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f2e uni1F2E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f2f uni1F2F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f30 uni1F30 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f31 uni1F31 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f32 uni1F32 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f33 uni1F33 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f34 uni1F34 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f35 uni1F35 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f36 uni1F36 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f37 uni1F37 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f38 uni1F38 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f39 uni1F39 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f3a uni1F3A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f3b uni1F3B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f3c uni1F3C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f3d uni1F3D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f3e uni1F3E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f3f uni1F3F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f40 uni1F40 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f41 uni1F41 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f42 uni1F42 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f43 uni1F43 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f44 uni1F44 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f45 uni1F45 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f48 uni1F48 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f49 uni1F49 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f4a uni1F4A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f4b uni1F4B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f4c uni1F4C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f4d uni1F4D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f50 uni1F50 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f51 uni1F51 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f52 uni1F52 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f53 uni1F53 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f54 uni1F54 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f55 uni1F55 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f56 uni1F56 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f57 uni1F57 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f59 uni1F59 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f5b uni1F5B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f5d uni1F5D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f5f uni1F5F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f60 uni1F60 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f61 uni1F61 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f62 uni1F62 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f63 uni1F63 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f64 uni1F64 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f65 uni1F65 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f66 uni1F66 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f67 uni1F67 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f68 uni1F68 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f69 uni1F69 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f6a uni1F6A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f6b uni1F6B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f6c uni1F6C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f6d uni1F6D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f6e uni1F6E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f6f uni1F6F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f70 uni1F70 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1f71 uni1F71 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1f72 uni1F72 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1f73 uni1F73 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1f74 uni1F74 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1f75 uni1F75 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1f76 uni1F76 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f77 uni1F77 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f78 uni1F78 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1f79 uni1F79 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1f7a uni1F7A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f7b uni1F7B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f7c uni1F7C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f7d uni1F7D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f80 uni1F80 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f81 uni1F81 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f82 uni1F82 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f83 uni1F83 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f84 uni1F84 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f85 uni1F85 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f86 uni1F86 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f87 uni1F87 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f88 uni1F88 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f89 uni1F89 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f8a uni1F8A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f8b uni1F8B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f8c uni1F8C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f8d uni1F8D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f8e uni1F8E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f8f uni1F8F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f90 uni1F90 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f91 uni1F91 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f92 uni1F92 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f93 uni1F93 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f94 uni1F94 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f95 uni1F95 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f96 uni1F96 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f97 uni1F97 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f98 uni1F98 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f99 uni1F99 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f9a uni1F9A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f9b uni1F9B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f9c uni1F9C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f9d uni1F9D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f9e uni1F9E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1f9f uni1F9F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fa0 uni1FA0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fa1 uni1FA1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fa2 uni1FA2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fa3 uni1FA3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fa4 uni1FA4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fa5 uni1FA5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fa6 uni1FA6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fa7 uni1FA7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fa8 uni1FA8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fa9 uni1FA9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1faa uni1FAA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fab uni1FAB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fac uni1FAC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fad uni1FAD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fae uni1FAE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1faf uni1FAF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fb0 uni1FB0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fb1 uni1FB1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fb2 uni1FB2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fb3 uni1FB3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fb4 uni1FB4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fb6 uni1FB6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fb7 uni1FB7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fb8 uni1FB8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fb9 uni1FB9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fba uni1FBA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fbb uni1FBB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fbc uni1FBC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fbd uni1FBD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fbe uni1FBE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fbf uni1FBF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fc0 uni1FC0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fc1 uni1FC1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fc2 uni1FC2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fc3 uni1FC3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fc4 uni1FC4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fc6 uni1FC6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fc7 uni1FC7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fc8 uni1FC8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fc9 uni1FC9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fca uni1FCA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fcb uni1FCB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fcc uni1FCC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) -U+1fcd uni1FCD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fce uni1FCE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fcf uni1FCF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fd0 uni1FD0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fd1 uni1FD1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fd2 uni1FD2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fd3 uni1FD3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fd6 uni1FD6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fd7 uni1FD7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fd8 uni1FD8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fd9 uni1FD9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fda uni1FDA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fdb uni1FDB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fdd uni1FDD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fde uni1FDE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fdf uni1FDF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fe0 uni1FE0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fe1 uni1FE1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fe2 uni1FE2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fe3 uni1FE3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fe4 uni1FE4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fe5 uni1FE5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fe6 uni1FE6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fe7 uni1FE7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fe8 uni1FE8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fe9 uni1FE9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fea uni1FEA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1feb uni1FEB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fec uni1FEC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1fed uni1FED 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fee uni1FEE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1fef uni1FEF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ff2 uni1FF2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1ff3 uni1FF3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1ff4 uni1FF4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1ff6 uni1FF6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1ff7 uni1FF7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1ff8 uni1FF8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ff9 uni1FF9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ffa uni1FFA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1ffb uni1FFB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) -U+1ffc uni1FFC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+1ffd uni1FFD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+1ffe uni1FFE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) -U+2000 uni2000 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2001 uni2001 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2002 uni2002 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2003 uni2003 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2004 uni2004 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2005 uni2005 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2006 uni2006 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2007 uni2007 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2008 uni2008 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2009 uni2009 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+200a uni200A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+200b uni200B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+200c uni200C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+200d uni200D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+200e uni200E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+200f uni200F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) +U+1ef4 uni1EF4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ef5 uni1EF5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ef6 uni1EF6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ef7 uni1EF7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ef8 uni1EF8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ef9 uni1EF9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f00 uni1F00 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f01 uni1F01 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f02 uni1F02 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f03 uni1F03 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f04 uni1F04 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f05 uni1F05 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f06 uni1F06 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f07 uni1F07 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f08 uni1F08 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f09 uni1F09 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f0a uni1F0A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f0b uni1F0B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f0c uni1F0C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f0d uni1F0D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f0e uni1F0E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f0f uni1F0F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f10 uni1F10 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f11 uni1F11 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f12 uni1F12 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f13 uni1F13 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f14 uni1F14 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f15 uni1F15 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f18 uni1F18 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f19 uni1F19 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f1a uni1F1A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f1b uni1F1B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f1c uni1F1C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f1d uni1F1D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f20 uni1F20 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f21 uni1F21 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f22 uni1F22 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f23 uni1F23 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f24 uni1F24 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f25 uni1F25 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f26 uni1F26 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f27 uni1F27 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f28 uni1F28 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f29 uni1F29 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f2a uni1F2A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f2b uni1F2B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f2c uni1F2C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f2d uni1F2D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f2e uni1F2E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f2f uni1F2F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f30 uni1F30 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f31 uni1F31 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f32 uni1F32 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f33 uni1F33 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f34 uni1F34 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f35 uni1F35 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f36 uni1F36 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f37 uni1F37 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f38 uni1F38 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f39 uni1F39 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f3a uni1F3A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f3b uni1F3B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f3c uni1F3C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f3d uni1F3D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f3e uni1F3E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f3f uni1F3F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f40 uni1F40 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f41 uni1F41 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f42 uni1F42 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f43 uni1F43 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f44 uni1F44 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f45 uni1F45 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f48 uni1F48 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f49 uni1F49 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f4a uni1F4A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f4b uni1F4B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f4c uni1F4C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f4d uni1F4D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f50 uni1F50 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f51 uni1F51 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f52 uni1F52 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f53 uni1F53 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f54 uni1F54 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f55 uni1F55 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f56 uni1F56 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f57 uni1F57 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f59 uni1F59 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f5b uni1F5B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f5d uni1F5D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f5f uni1F5F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f60 uni1F60 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f61 uni1F61 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f62 uni1F62 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f63 uni1F63 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f64 uni1F64 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f65 uni1F65 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f66 uni1F66 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f67 uni1F67 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f68 uni1F68 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f69 uni1F69 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f6a uni1F6A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f6b uni1F6B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f6c uni1F6C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f6d uni1F6D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f6e uni1F6E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f6f uni1F6F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f70 uni1F70 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f71 uni1F71 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f72 uni1F72 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f73 uni1F73 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f74 uni1F74 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f75 uni1F75 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f76 uni1F76 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f77 uni1F77 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f78 uni1F78 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f79 uni1F79 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f7a uni1F7A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f7b uni1F7B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f7c uni1F7C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f7d uni1F7D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f80 uni1F80 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f81 uni1F81 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f82 uni1F82 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f83 uni1F83 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f84 uni1F84 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f85 uni1F85 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f86 uni1F86 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f87 uni1F87 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f88 uni1F88 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f89 uni1F89 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f8a uni1F8A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f8b uni1F8B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f8c uni1F8C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f8d uni1F8D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f8e uni1F8E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f8f uni1F8F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f90 uni1F90 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f91 uni1F91 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f92 uni1F92 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f93 uni1F93 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f94 uni1F94 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f95 uni1F95 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f96 uni1F96 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f97 uni1F97 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f98 uni1F98 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f99 uni1F99 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f9a uni1F9A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f9b uni1F9B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f9c uni1F9C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f9d uni1F9D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f9e uni1F9E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f9f uni1F9F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa0 uni1FA0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa1 uni1FA1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa2 uni1FA2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa3 uni1FA3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa4 uni1FA4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa5 uni1FA5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa6 uni1FA6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa7 uni1FA7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa8 uni1FA8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa9 uni1FA9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1faa uni1FAA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fab uni1FAB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fac uni1FAC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fad uni1FAD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fae uni1FAE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1faf uni1FAF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb0 uni1FB0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb1 uni1FB1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb2 uni1FB2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb3 uni1FB3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb4 uni1FB4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb6 uni1FB6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb7 uni1FB7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb8 uni1FB8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fb9 uni1FB9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fba uni1FBA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fbb uni1FBB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fbc uni1FBC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fbd uni1FBD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fbe uni1FBE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fbf uni1FBF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fc0 uni1FC0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fc1 uni1FC1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fc2 uni1FC2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fc3 uni1FC3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fc4 uni1FC4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fc6 uni1FC6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fc7 uni1FC7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fc8 uni1FC8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fc9 uni1FC9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fca uni1FCA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fcb uni1FCB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fcc uni1FCC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fcd uni1FCD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fce uni1FCE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fcf uni1FCF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd0 uni1FD0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd1 uni1FD1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd2 uni1FD2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd3 uni1FD3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd6 uni1FD6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd7 uni1FD7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd8 uni1FD8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fd9 uni1FD9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fda uni1FDA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fdb uni1FDB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fdd uni1FDD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fde uni1FDE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fdf uni1FDF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe0 uni1FE0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe1 uni1FE1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe2 uni1FE2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe3 uni1FE3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe4 uni1FE4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe5 uni1FE5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe6 uni1FE6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe7 uni1FE7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe8 uni1FE8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fe9 uni1FE9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fea uni1FEA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1feb uni1FEB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fec uni1FEC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fed uni1FED 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fee uni1FEE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fef uni1FEF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ff2 uni1FF2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ff3 uni1FF3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ff4 uni1FF4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ff6 uni1FF6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ff7 uni1FF7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ff8 uni1FF8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ff9 uni1FF9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ffa uni1FFA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ffb uni1FFB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ffc uni1FFC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ffd uni1FFD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ffe uni1FFE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+2000 uni2000 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2001 uni2001 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2002 uni2002 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2003 uni2003 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2004 uni2004 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2005 uni2005 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2006 uni2006 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2007 uni2007 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2008 uni2008 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2009 uni2009 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+200a uni200A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+200b uni200B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+200c uni200C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+200d uni200D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+200e uni200E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+200f uni200F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+2010 uni2010 1.5 U+2011 uni2011 1.5 U+2012 figuredash 1.5 U+2013 endash original U+2014 emdash original U+2015 uni2015 1.5 -U+2016 uni2016 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2016 uni2016 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+2017 underscoredbl 2.3 U+2018 quoteleft original U+2019 quoteright original @@ -2704,61 +2807,61 @@ U+201b quotereversed 2.3 U+201c quotedblleft original U+201d quotedblright original U+201e quotedblbase original -U+201f uni201F 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) +U+201f uni201F 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) U+2020 dagger original U+2021 daggerdbl original U+2022 bullet original U+2023 uni2023 2.2 -U+2024 onedotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2025 twodotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2024 onedotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2025 twodotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2026 ellipsis original U+2027 uni2027 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+202a uni202A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+202b uni202B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+202c uni202C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+202d uni202D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+202e uni202E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+202f uni202F 2.11 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+202a uni202A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+202b uni202B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+202c uni202C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+202d uni202D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+202e uni202E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+202f uni202F 2.11 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed) U+2030 perthousand original U+2031 uni2031 2.1 -U+2032 minute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2033 second 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2034 uni2034 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2035 uni2035 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2036 uni2036 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2037 uni2037 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2038 uni2038 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2032 minute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic) +U+2033 second 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic) +U+2034 uni2034 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic) +U+2035 uni2035 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic) +U+2036 uni2036 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic) +U+2037 uni2037 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic) +U+2038 uni2038 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+2039 guilsinglleft original U+203a guilsinglright original U+203b uni203B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+203c exclamdbl 2.0 -U+203d uni203D 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.11 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.14 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+203d uni203D 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.11 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.14 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+203e uni203E 2.3 U+203f uni203F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+2040 uni2040 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+2041 uni2041 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2042 uni2042 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2042 uni2042 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+2043 uni2043 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2044 fraction 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2045 uni2045 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2046 uni2046 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2044 fraction 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2045 uni2045 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2046 uni2046 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+2047 uni2047 2.0 U+2048 uni2048 2.0 U+2049 uni2049 2.0 U+204a uni204A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+204b uni204B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+204c uni204C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+204d uni204D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+204e uni204E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+204f uni204F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+204b uni204B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+204c uni204C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+204d uni204D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+204e uni204E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+204f uni204F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+2050 uni2050 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2051 uni2051 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2052 uni2052 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2053 uni2053 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2051 uni2051 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2052 uni2052 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2053 uni2053 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+2054 uni2054 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+2055 uni2055 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2056 uni2056 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2057 uni2057 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2057 uni2057 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+2058 uni2058 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2059 uni2059 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+205a uni205A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -2767,122 +2870,126 @@ U+205c uni205C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+205d uni205D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+205e uni205E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+205f uni205F 2.14 -U+2060 uni2060 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2061 uni2061 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2062 uni2062 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2063 uni2063 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+206a uni206A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+206b uni206B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+206c uni206C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+206d uni206D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+206e uni206E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+206f uni206F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2060 uni2060 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2061 uni2061 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2062 uni2062 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2063 uni2063 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2064 uni2064 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+206a uni206A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+206b uni206B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+206c uni206C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+206d uni206D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+206e uni206E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+206f uni206F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2070 uni2070 2.2 -U+2071 uni2071 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) +U+2071 uni2071 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+2074 uni2074 2.2 U+2075 uni2075 2.2 U+2076 uni2076 2.2 U+2077 uni2077 2.2 U+2078 uni2078 2.2 U+2079 uni2079 2.2 -U+207a uni207A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+207b uni207B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+207c uni207C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+207d uni207D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+207e uni207E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) +U+207a uni207A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+207b uni207B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+207c uni207C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+207d uni207D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+207e uni207E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+207f uni207F 1.14 U+2080 uni2080 2.4 U+2081 uni2081 2.4 U+2082 uni2082 2.4 U+2083 uni2083 2.4 U+2084 uni2084 2.4 -U+2085 uni2085 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2086 uni2086 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2087 uni2087 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2088 uni2088 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2089 uni2089 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+208a uni208A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+208b uni208B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+208c uni208C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+208d uni208D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+208e uni208E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+2090 uni2090 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+2091 uni2091 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+2092 uni2092 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+2093 uni2093 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+2094 uni2094 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+20a0 uni20A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20a1 colonmonetary 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20a2 uni20A2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20a3 franc 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20a4 lira 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20a5 uni20A5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2085 uni2085 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2086 uni2086 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2087 uni2087 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2088 uni2088 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2089 uni2089 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+208a uni208A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+208b uni208B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+208c uni208C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+208d uni208D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+208e uni208E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2090 uni2090 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2091 uni2091 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2092 uni2092 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2093 uni2093 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2094 uni2094 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+20a0 uni20A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a1 colonmonetary 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a2 uni20A2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a3 franc 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a4 lira 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a5 uni20A5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+20a6 uni20A6 2.3 -U+20a7 peseta 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20a8 uni20A8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20a9 uni20A9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20aa uni20AA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20ab dong 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+20a7 peseta 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a8 uni20A8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a9 uni20A9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20aa uni20AA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20ab dong 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+20ac Euro original -U+20ad uni20AD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20ae uni20AE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+20af uni20AF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+20b0 uni20B0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+20b1 uni20B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+20b2 uni20B2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+20b3 uni20B3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+20b4 uni20B4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+20ad uni20AD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20ae uni20AE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20af uni20AF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20b0 uni20B0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20b1 uni20B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+20b2 uni20B2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20b3 uni20B3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20b4 uni20B4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+20b5 uni20B5 2.2 U+20d0 uni20D0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+20d1 uni20D1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+20d6 uni20D6 2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+20d7 uni20D7 2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20db uni20DB 2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20dc uni20DC 2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20e1 uni20E1 2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2100 uni2100 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2101 uni2101 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2102 uni2102 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.16 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2103 uni2103 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2102 uni2102 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.16 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Condensed) +U+2103 uni2103 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2104 uni2104 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2105 uni2105 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2105 uni2105 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+2106 uni2106 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2107 uni2107 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2108 uni2108 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2109 uni2109 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2109 uni2109 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+210b uni210B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+210c uni210C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+210d uni210D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+210e uni210E 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+210f uni210F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+210d uni210D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+210e uni210E 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+210f uni210F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.28 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+2110 uni2110 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2111 Ifraktur 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2112 uni2112 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2113 uni2113 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2114 uni2114 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2115 uni2115 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2116 uni2116 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2117 uni2117 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2115 uni2115 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2116 uni2116 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2117 uni2117 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+2118 weierstrass 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2119 uni2119 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+211a uni211A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2119 uni2119 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+211a uni211A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+211b uni211B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+211c Rfraktur 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+211d uni211D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+211d uni211D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+211e prescription 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+211f uni211F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2120 uni2120 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2121 uni2121 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2122 trademark original U+2123 uni2123 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2124 uni2124 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2124 uni2124 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+2125 uni2125 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2126 uni2126 2.2 -U+2127 uni2127 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+2127 uni2127 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2128 uni2128 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2129 uni2129 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+212a uni212A 2.2 U+212b uni212B 2.2 U+212c uni212C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+212d uni212D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+212e estimated 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+212e estimated 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+212f uni212F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2130 uni2130 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2131 uni2131 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -2896,252 +3003,252 @@ U+2138 uni2138 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Conde U+2139 uni2139 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+213a uni213A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+213b uni213B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+213c uni213C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+213d uni213D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+213e uni213E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+213f uni213F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2140 uni2140 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2141 uni2141 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2142 uni2142 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2143 uni2143 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2144 uni2144 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2145 uni2145 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2146 uni2146 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2147 uni2147 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2148 uni2148 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2149 uni2149 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+214b uni214B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+213c uni213C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+213d uni213D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+213e uni213E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+213f uni213F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+2140 uni2140 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+2141 uni2141 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2142 uni2142 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2143 uni2143 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2144 uni2144 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2145 uni2145 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+2146 uni2146 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+2147 uni2147 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+2148 uni2148 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+2149 uni2149 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+214b uni214B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+214e uni214E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2153 onethird 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2154 twothirds 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2155 uni2155 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2156 uni2156 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2157 uni2157 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2158 uni2158 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2159 uni2159 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+215a uni215A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+215b oneeighth 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+215c threeeighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+215d fiveeighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+215e seveneighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+215f uni215F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2160 uni2160 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2161 uni2161 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2162 uni2162 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2163 uni2163 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2164 uni2164 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2165 uni2165 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2166 uni2166 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2167 uni2167 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2168 uni2168 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2169 uni2169 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+216a uni216A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+216b uni216B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+216c uni216C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+216d uni216D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+216e uni216E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+216f uni216F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2170 uni2170 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2171 uni2171 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2172 uni2172 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2173 uni2173 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2174 uni2174 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2175 uni2175 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2176 uni2176 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2177 uni2177 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2178 uni2178 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2179 uni2179 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+217a uni217A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+217b uni217B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+217c uni217C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+217d uni217D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+217e uni217E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+217f uni217F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2180 uni2180 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+2181 uni2181 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2182 uni2182 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2183 uni2183 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) -U+2184 uni2184 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+2190 arrowleft 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2191 arrowup 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2192 arrowright 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2193 arrowdown 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2194 arrowboth 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2195 arrowupdn 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2196 uni2196 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2197 uni2197 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2198 uni2198 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2199 uni2199 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+219a uni219A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+219b uni219B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+219c uni219C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+219d uni219D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+219e uni219E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+219f uni219F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21a0 uni21A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21a1 uni21A1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21a2 uni21A2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21a3 uni21A3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21a4 uni21A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21a5 uni21A5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21a6 uni21A6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21a7 uni21A7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21a8 arrowupdnbse 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21a9 uni21A9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21aa uni21AA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21ab uni21AB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21ac uni21AC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21ad uni21AD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21ae uni21AE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21af uni21AF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21b0 uni21B0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21b1 uni21B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21b2 uni21B2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21b3 uni21B3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21b4 uni21B4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21b5 carriagereturn 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21b6 uni21B6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21b7 uni21B7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21b8 uni21B8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21b9 uni21B9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21ba uni21BA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21bb uni21BB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21bc uni21BC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21bd uni21BD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21be uni21BE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21bf uni21BF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21c0 uni21C0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21c1 uni21C1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21c2 uni21C2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21c3 uni21C3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21c4 uni21C4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21c5 uni21C5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21c6 uni21C6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21c7 uni21C7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21c8 uni21C8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21c9 uni21C9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21ca uni21CA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21cb uni21CB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21cc uni21CC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21cd uni21CD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21ce uni21CE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21cf uni21CF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21d0 arrowdblleft 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21d1 arrowdblup 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21d2 arrowdblright 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21d3 arrowdbldown 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21d4 arrowdblboth 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21d5 uni21D5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21d6 uni21D6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21d7 uni21D7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21d8 uni21D8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21d9 uni21D9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21da uni21DA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21db uni21DB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21dc uni21DC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21dd uni21DD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21de uni21DE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21df uni21DF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21e0 uni21E0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21e1 uni21E1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21e2 uni21E2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21e3 uni21E3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21e4 uni21E4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21e5 uni21E5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21e6 uni21E6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21e7 uni21E7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21e8 uni21E8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21e9 uni21E9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21ea uni21EA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21eb uni21EB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21ec uni21EC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21ed uni21ED 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21ee uni21EE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21ef uni21EF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21f0 uni21F0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21f1 uni21F1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21f2 uni21F2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21f3 uni21F3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21f4 uni21F4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21f5 uni21F5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21f6 uni21F6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21f7 uni21F7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21f8 uni21F8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21f9 uni21F9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21fa uni21FA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21fb uni21FB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21fc uni21FC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21fd uni21FD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21fe uni21FE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+21ff uni21FF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2200 universal 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+2201 uni2201 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2153 onethird 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2154 twothirds 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2155 uni2155 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2156 uni2156 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2157 uni2157 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2158 uni2158 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2159 uni2159 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+215a uni215A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+215b oneeighth 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+215c threeeighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+215d fiveeighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+215e seveneighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+215f uni215F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2160 uni2160 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2161 uni2161 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2162 uni2162 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2163 uni2163 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2164 uni2164 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2165 uni2165 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2166 uni2166 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2167 uni2167 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2168 uni2168 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2169 uni2169 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+216a uni216A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+216b uni216B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+216c uni216C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+216d uni216D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+216e uni216E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+216f uni216F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2170 uni2170 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2171 uni2171 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2172 uni2172 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2173 uni2173 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2174 uni2174 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2175 uni2175 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2176 uni2176 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2177 uni2177 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2178 uni2178 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2179 uni2179 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+217a uni217A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+217b uni217B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+217c uni217C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+217d uni217D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+217e uni217E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+217f uni217F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2180 uni2180 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2181 uni2181 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2182 uni2182 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2183 uni2183 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2184 uni2184 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2190 arrowleft 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2191 arrowup 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2192 arrowright 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2193 arrowdown 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2194 arrowboth 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2195 arrowupdn 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2196 uni2196 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2197 uni2197 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2198 uni2198 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2199 uni2199 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+219a uni219A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+219b uni219B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+219c uni219C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+219d uni219D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+219e uni219E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+219f uni219F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a0 uni21A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a1 uni21A1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a2 uni21A2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a3 uni21A3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a4 uni21A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a5 uni21A5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a6 uni21A6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a7 uni21A7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a8 arrowupdnbse 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a9 uni21A9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21aa uni21AA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ab uni21AB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ac uni21AC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ad uni21AD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ae uni21AE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21af uni21AF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b0 uni21B0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b1 uni21B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b2 uni21B2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b3 uni21B3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b4 uni21B4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b5 carriagereturn 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b6 uni21B6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b7 uni21B7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b8 uni21B8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b9 uni21B9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ba uni21BA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21bb uni21BB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21bc uni21BC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21bd uni21BD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21be uni21BE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21bf uni21BF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c0 uni21C0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c1 uni21C1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c2 uni21C2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c3 uni21C3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c4 uni21C4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c5 uni21C5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c6 uni21C6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c7 uni21C7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c8 uni21C8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c9 uni21C9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ca uni21CA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21cb uni21CB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21cc uni21CC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21cd uni21CD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ce uni21CE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21cf uni21CF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d0 arrowdblleft 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d1 arrowdblup 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d2 arrowdblright 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d3 arrowdbldown 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d4 arrowdblboth 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d5 uni21D5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d6 uni21D6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d7 uni21D7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d8 uni21D8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d9 uni21D9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21da uni21DA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21db uni21DB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21dc uni21DC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21dd uni21DD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21de uni21DE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21df uni21DF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e0 uni21E0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e1 uni21E1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e2 uni21E2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e3 uni21E3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e4 uni21E4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e5 uni21E5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e6 uni21E6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e7 uni21E7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e8 uni21E8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e9 uni21E9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ea uni21EA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21eb uni21EB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ec uni21EC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ed uni21ED 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ee uni21EE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ef uni21EF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f0 uni21F0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f1 uni21F1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f2 uni21F2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f3 uni21F3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f4 uni21F4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f5 uni21F5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f6 uni21F6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f7 uni21F7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f8 uni21F8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f9 uni21F9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21fa uni21FA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21fb uni21FB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21fc uni21FC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21fd uni21FD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21fe uni21FE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ff uni21FF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2200 universal 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2201 uni2201 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+2202 partialdiff original -U+2203 existential 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) -U+2204 uni2204 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2203 existential 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2204 uni2204 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+2205 emptyset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+2206 Delta original U+2207 gradient 2.1 -U+2208 element 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2209 notelement 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2208 element 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2209 notelement 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+220a uni220A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+220b suchthat 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+220c uni220C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+220b suchthat 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+220c uni220C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+220d uni220D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+220e uni220E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+220f product original -U+2210 uni2210 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2210 uni2210 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2211 summation original U+2212 minus original -U+2213 uni2213 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2214 uni2214 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2215 fraction original +U+2213 uni2213 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2214 uni2214 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2215 uni2215 original U+2216 uni2216 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2217 asteriskmath 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2218 uni2218 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2219 periodcentered original +U+2217 asteriskmath 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2218 uni2218 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2219 uni2219 original U+221a radical original -U+221b uni221B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+221c uni221C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+221b uni221B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+221c uni221C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+221d proportional 2.1 U+221e infinity original U+221f orthogonal 2.1 U+2220 angle 2.3 U+2221 uni2221 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2222 uni2222 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2223 uni2223 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2224 uni2224 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2225 uni2225 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2226 uni2226 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2223 uni2223 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2224 uni2224 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2225 uni2225 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2226 uni2226 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2227 logicaland 2.1 U+2228 logicalor 2.1 U+2229 intersection 2.1 U+222a union 2.1 U+222b integral original -U+222c uni222C 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+222d uni222D 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+222c uni222C 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+222d uni222D 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+222e uni222E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+222f uni222F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2230 uni2230 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2231 uni2231 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2232 uni2232 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2233 uni2233 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2234 therefore 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2235 uni2235 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2236 uni2236 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2237 uni2237 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) -U+2238 uni2238 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2239 uni2239 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+223a uni223A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+223b uni223B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+223c similar 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+223d uni223D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2234 therefore 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2235 uni2235 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2236 uni2236 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2237 uni2237 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2238 uni2238 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2239 uni2239 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+223a uni223A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+223b uni223B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+223c similar 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+223d uni223D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+223e uni223E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+223f uni223F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2240 uni2240 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2241 uni2241 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2242 uni2242 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2243 uni2243 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2242 uni2242 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2243 uni2243 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2244 uni2244 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) U+2245 congruent 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+2246 uni2246 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) @@ -3154,12 +3261,12 @@ U+224c uni224C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+224d uni224D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) U+224e uni224E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) U+224f uni224F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2250 uni2250 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2251 uni2251 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2252 uni2252 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2253 uni2253 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2254 uni2254 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2255 uni2255 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2250 uni2250 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2251 uni2251 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2252 uni2252 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2253 uni2253 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2254 uni2254 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2255 uni2255 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2256 uni2256 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) U+2257 uni2257 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) U+2258 uni2258 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) @@ -3204,52 +3311,54 @@ U+227e uni227E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+227f uni227F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+2280 uni2280 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+2281 uni2281 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2282 propersubset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2283 propersuperset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2284 notsubset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2285 uni2285 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2286 reflexsubset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2287 reflexsuperset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2282 propersubset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2283 propersuperset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2284 notsubset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2285 uni2285 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2286 reflexsubset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2287 reflexsuperset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2288 uni2288 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) U+2289 uni2289 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) U+228a uni228A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+228b uni228B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+228c uni228C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+228d uni228D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+228e uni228E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+228f uni228F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2290 uni2290 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2291 uni2291 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2292 uni2292 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) -U+2293 uni2293 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2294 uni2294 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2295 circleplus 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2296 uni2296 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2297 circlemultiply 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2298 uni2298 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2299 uni2299 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+229a uni229A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+229b uni229B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+229c uni229C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+229d uni229D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+229e uni229E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+229f uni229F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+22a0 uni22A0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+22a1 uni22A1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+22a2 uni22A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22a3 uni22A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22a4 uni22A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22a5 perpendicular 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22a6 uni22A6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22a7 uni22A7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22a8 uni22A8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22a9 uni22A9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22aa uni22AA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ab uni22AB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ac uni22AC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ad uni22AD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22ae uni22AE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22af uni22AF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+228c uni228C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+228d uni228D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+228e uni228E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+228f uni228F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2290 uni2290 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2291 uni2291 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2292 uni2292 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2293 uni2293 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2294 uni2294 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2295 circleplus 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2296 uni2296 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2297 circlemultiply 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2298 uni2298 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2299 uni2299 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+229a uni229A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+229b uni229B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+229c uni229C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+229d uni229D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+229e uni229E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+229f uni229F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a0 uni22A0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a1 uni22A1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a2 uni22A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a3 uni22A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a4 uni22A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a5 perpendicular 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a6 uni22A6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a7 uni22A7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a8 uni22A8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a9 uni22A9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22aa uni22AA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22ab uni22AB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22ac uni22AC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22ad uni22AD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22ae uni22AE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22af uni22AF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22b0 uni22B0 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b1 uni22B1 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22b2 uni22B2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22b3 uni22B3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22b4 uni22B4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -3269,14 +3378,23 @@ U+22c1 uni22C1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+22c2 uni22C2 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22c3 uni22C3 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22c4 uni22C4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+22c5 dotmath 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+22c5 dotmath 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+22c6 uni22C6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+22c7 uni22C7 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22c8 uni22C8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22c9 uni22C9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22ca uni22CA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22cb uni22CB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22cc uni22CC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22cd uni22CD 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+22ce uni22CE 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22cf uni22CF 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d0 uni22D0 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d1 uni22D1 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d2 uni22D2 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d3 uni22D3 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d4 uni22D4 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d5 uni22D5 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22d6 uni22D6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22d7 uni22D7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+22d8 uni22D8 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) @@ -3327,10 +3445,10 @@ U+2304 uni2304 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Obli U+2305 uni2305 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+2306 uni2306 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+2307 uni2307 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2308 uni2308 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+2309 uni2309 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+230a uni230A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+230b uni230B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) +U+2308 uni2308 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2309 uni2309 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+230a uni230A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+230b uni230B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+230c uni230C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+230d uni230D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+230e uni230E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) @@ -3341,7 +3459,7 @@ U+2312 uni2312 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Obli U+2313 uni2313 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+2314 uni2314 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) U+2315 uni2315 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) -U+2318 uni2318 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2318 uni2318 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+2319 uni2319 1.14 U+231c uni231C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+231d uni231D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) @@ -3349,11 +3467,11 @@ U+231e uni231E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Obli U+231f uni231F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+2320 integraltp 2.3 U+2321 integralbt 2.3 -U+2324 uni2324 2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) -U+2325 uni2325 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2324 uni2324 2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) 2.19 (Sans Condensed Oblique, Sans Oblique) +U+2325 uni2325 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) U+2326 uni2326 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+2327 uni2327 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2328 uni2328 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2328 uni2328 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2329 angleleft 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) U+232a angleright 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) U+232b uni232B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) @@ -3457,134 +3575,134 @@ U+2466 uni2466 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+2467 uni2467 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2468 uni2468 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2469 uni2469 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2500 SF100000 1.12 (Sans Mono, Sans Mono Oblique) -U+2501 uni2501 1.12 (Sans Mono, Sans Mono Oblique) -U+2502 SF110000 1.12 (Sans Mono, Sans Mono Oblique) -U+2503 uni2503 1.12 (Sans Mono, Sans Mono Oblique) -U+2504 uni2504 1.12 (Sans Mono, Sans Mono Oblique) -U+2505 uni2505 1.12 (Sans Mono, Sans Mono Oblique) -U+2506 uni2506 1.12 (Sans Mono, Sans Mono Oblique) -U+2507 uni2507 1.12 (Sans Mono, Sans Mono Oblique) -U+2508 uni2508 1.12 (Sans Mono, Sans Mono Oblique) -U+2509 uni2509 1.12 (Sans Mono, Sans Mono Oblique) -U+250a uni250A 1.12 (Sans Mono, Sans Mono Oblique) -U+250b uni250B 1.12 (Sans Mono, Sans Mono Oblique) -U+250c SF010000 1.12 (Sans Mono, Sans Mono Oblique) -U+250d uni250D 1.12 (Sans Mono, Sans Mono Oblique) -U+250e uni250E 1.12 (Sans Mono, Sans Mono Oblique) -U+250f uni250F 1.12 (Sans Mono, Sans Mono Oblique) -U+2510 SF030000 1.12 (Sans Mono, Sans Mono Oblique) -U+2511 uni2511 1.12 (Sans Mono, Sans Mono Oblique) -U+2512 uni2512 1.12 (Sans Mono, Sans Mono Oblique) -U+2513 uni2513 1.12 (Sans Mono, Sans Mono Oblique) -U+2514 SF020000 1.12 (Sans Mono, Sans Mono Oblique) -U+2515 uni2515 1.12 (Sans Mono, Sans Mono Oblique) -U+2516 uni2516 1.12 (Sans Mono, Sans Mono Oblique) -U+2517 uni2517 1.12 (Sans Mono, Sans Mono Oblique) -U+2518 SF040000 1.12 (Sans Mono, Sans Mono Oblique) -U+2519 uni2519 1.12 (Sans Mono, Sans Mono Oblique) -U+251a uni251A 1.12 (Sans Mono, Sans Mono Oblique) -U+251b uni251B 1.12 (Sans Mono, Sans Mono Oblique) -U+251c SF080000 1.12 (Sans Mono, Sans Mono Oblique) -U+251d uni251D 1.12 (Sans Mono, Sans Mono Oblique) -U+251e uni251E 1.12 (Sans Mono, Sans Mono Oblique) -U+251f uni251F 1.12 (Sans Mono, Sans Mono Oblique) -U+2520 uni2520 1.12 (Sans Mono, Sans Mono Oblique) -U+2521 uni2521 1.12 (Sans Mono, Sans Mono Oblique) -U+2522 uni2522 1.12 (Sans Mono, Sans Mono Oblique) -U+2523 uni2523 1.12 (Sans Mono, Sans Mono Oblique) -U+2524 SF090000 1.12 (Sans Mono, Sans Mono Oblique) -U+2525 uni2525 1.12 (Sans Mono, Sans Mono Oblique) -U+2526 uni2526 1.12 (Sans Mono, Sans Mono Oblique) -U+2527 uni2527 1.12 (Sans Mono, Sans Mono Oblique) -U+2528 uni2528 1.12 (Sans Mono, Sans Mono Oblique) -U+2529 uni2529 1.12 (Sans Mono, Sans Mono Oblique) -U+252a uni252A 1.12 (Sans Mono, Sans Mono Oblique) -U+252b uni252B 1.12 (Sans Mono, Sans Mono Oblique) -U+252c SF060000 1.12 (Sans Mono, Sans Mono Oblique) -U+252d uni252D 1.12 (Sans Mono, Sans Mono Oblique) -U+252e uni252E 1.12 (Sans Mono, Sans Mono Oblique) -U+252f uni252F 1.12 (Sans Mono, Sans Mono Oblique) -U+2530 uni2530 1.12 (Sans Mono, Sans Mono Oblique) -U+2531 uni2531 1.12 (Sans Mono, Sans Mono Oblique) -U+2532 uni2532 1.12 (Sans Mono, Sans Mono Oblique) -U+2533 uni2533 1.12 (Sans Mono, Sans Mono Oblique) -U+2534 SF070000 1.12 (Sans Mono, Sans Mono Oblique) -U+2535 uni2535 1.12 (Sans Mono, Sans Mono Oblique) -U+2536 uni2536 1.12 (Sans Mono, Sans Mono Oblique) -U+2537 uni2537 1.12 (Sans Mono, Sans Mono Oblique) -U+2538 uni2538 1.12 (Sans Mono, Sans Mono Oblique) -U+2539 uni2539 1.12 (Sans Mono, Sans Mono Oblique) -U+253a uni253A 1.12 (Sans Mono, Sans Mono Oblique) -U+253b uni253B 1.12 (Sans Mono, Sans Mono Oblique) -U+253c SF050000 1.12 (Sans Mono, Sans Mono Oblique) -U+253d uni253D 1.12 (Sans Mono, Sans Mono Oblique) -U+253e uni253E 1.12 (Sans Mono, Sans Mono Oblique) -U+253f uni253F 1.12 (Sans Mono, Sans Mono Oblique) -U+2540 uni2540 1.12 (Sans Mono, Sans Mono Oblique) -U+2541 uni2541 1.12 (Sans Mono, Sans Mono Oblique) -U+2542 uni2542 1.12 (Sans Mono, Sans Mono Oblique) -U+2543 uni2543 1.12 (Sans Mono, Sans Mono Oblique) -U+2544 uni2544 1.12 (Sans Mono, Sans Mono Oblique) -U+2545 uni2545 1.12 (Sans Mono, Sans Mono Oblique) -U+2546 uni2546 1.12 (Sans Mono, Sans Mono Oblique) -U+2547 uni2547 1.12 (Sans Mono, Sans Mono Oblique) -U+2548 uni2548 1.12 (Sans Mono, Sans Mono Oblique) -U+2549 uni2549 1.12 (Sans Mono, Sans Mono Oblique) -U+254a uni254A 1.12 (Sans Mono, Sans Mono Oblique) -U+254b uni254B 1.12 (Sans Mono, Sans Mono Oblique) -U+254c uni254C 1.12 (Sans Mono, Sans Mono Oblique) -U+254d uni254D 1.12 (Sans Mono, Sans Mono Oblique) -U+254e uni254E 1.12 (Sans Mono, Sans Mono Oblique) -U+254f uni254F 1.12 (Sans Mono, Sans Mono Oblique) -U+2550 SF430000 1.12 (Sans Mono, Sans Mono Oblique) -U+2551 SF240000 1.12 (Sans Mono, Sans Mono Oblique) -U+2552 SF510000 1.12 (Sans Mono, Sans Mono Oblique) -U+2553 SF520000 1.12 (Sans Mono, Sans Mono Oblique) -U+2554 SF390000 1.12 (Sans Mono, Sans Mono Oblique) -U+2555 SF220000 1.12 (Sans Mono, Sans Mono Oblique) -U+2556 SF210000 1.12 (Sans Mono, Sans Mono Oblique) -U+2557 SF250000 1.12 (Sans Mono, Sans Mono Oblique) -U+2558 SF500000 1.12 (Sans Mono, Sans Mono Oblique) -U+2559 SF490000 1.12 (Sans Mono, Sans Mono Oblique) -U+255a SF380000 1.12 (Sans Mono, Sans Mono Oblique) -U+255b SF280000 1.12 (Sans Mono, Sans Mono Oblique) -U+255c SF270000 1.12 (Sans Mono, Sans Mono Oblique) -U+255d SF260000 1.12 (Sans Mono, Sans Mono Oblique) -U+255e SF360000 1.12 (Sans Mono, Sans Mono Oblique) -U+255f SF370000 1.12 (Sans Mono, Sans Mono Oblique) -U+2560 SF420000 1.12 (Sans Mono, Sans Mono Oblique) -U+2561 SF190000 1.12 (Sans Mono, Sans Mono Oblique) -U+2562 SF200000 1.12 (Sans Mono, Sans Mono Oblique) -U+2563 SF230000 1.12 (Sans Mono, Sans Mono Oblique) -U+2564 SF470000 1.12 (Sans Mono, Sans Mono Oblique) -U+2565 SF480000 1.12 (Sans Mono, Sans Mono Oblique) -U+2566 SF410000 1.12 (Sans Mono, Sans Mono Oblique) -U+2567 SF450000 1.12 (Sans Mono, Sans Mono Oblique) -U+2568 SF460000 1.12 (Sans Mono, Sans Mono Oblique) -U+2569 SF400000 1.12 (Sans Mono, Sans Mono Oblique) -U+256a SF540000 1.12 (Sans Mono, Sans Mono Oblique) -U+256b SF530000 1.12 (Sans Mono, Sans Mono Oblique) -U+256c SF440000 1.12 (Sans Mono, Sans Mono Oblique) -U+256d uni256D 1.12 (Sans Mono, Sans Mono Oblique) -U+256e uni256E 1.12 (Sans Mono, Sans Mono Oblique) -U+256f uni256F 1.12 (Sans Mono, Sans Mono Oblique) -U+2570 uni2570 1.12 (Sans Mono, Sans Mono Oblique) -U+2571 uni2571 1.12 (Sans Mono, Sans Mono Oblique) -U+2572 uni2572 1.12 (Sans Mono, Sans Mono Oblique) -U+2573 uni2573 1.12 (Sans Mono, Sans Mono Oblique) -U+2574 uni2574 1.12 (Sans Mono, Sans Mono Oblique) -U+2575 uni2575 1.12 (Sans Mono, Sans Mono Oblique) -U+2576 uni2576 1.12 (Sans Mono, Sans Mono Oblique) -U+2577 uni2577 1.12 (Sans Mono, Sans Mono Oblique) -U+2578 uni2578 1.12 (Sans Mono, Sans Mono Oblique) -U+2579 uni2579 1.12 (Sans Mono, Sans Mono Oblique) -U+257a uni257A 1.12 (Sans Mono, Sans Mono Oblique) -U+257b uni257B 1.12 (Sans Mono, Sans Mono Oblique) -U+257c uni257C 1.12 (Sans Mono, Sans Mono Oblique) -U+257d uni257D 1.12 (Sans Mono, Sans Mono Oblique) -U+257e uni257E 1.12 (Sans Mono, Sans Mono Oblique) -U+257f uni257F 1.12 (Sans Mono, Sans Mono Oblique) +U+2500 SF100000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2501 uni2501 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2502 SF110000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2503 uni2503 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2504 uni2504 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2505 uni2505 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2506 uni2506 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2507 uni2507 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2508 uni2508 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2509 uni2509 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+250a uni250A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+250b uni250B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+250c SF010000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+250d uni250D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+250e uni250E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+250f uni250F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2510 SF030000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2511 uni2511 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2512 uni2512 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2513 uni2513 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2514 SF020000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2515 uni2515 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2516 uni2516 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2517 uni2517 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2518 SF040000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2519 uni2519 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+251a uni251A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+251b uni251B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+251c SF080000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+251d uni251D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+251e uni251E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+251f uni251F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2520 uni2520 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2521 uni2521 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2522 uni2522 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2523 uni2523 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2524 SF090000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2525 uni2525 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2526 uni2526 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2527 uni2527 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2528 uni2528 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2529 uni2529 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+252a uni252A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+252b uni252B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+252c SF060000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+252d uni252D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+252e uni252E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+252f uni252F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2530 uni2530 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2531 uni2531 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2532 uni2532 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2533 uni2533 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2534 SF070000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2535 uni2535 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2536 uni2536 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2537 uni2537 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2538 uni2538 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2539 uni2539 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+253a uni253A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+253b uni253B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+253c SF050000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+253d uni253D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+253e uni253E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+253f uni253F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2540 uni2540 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2541 uni2541 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2542 uni2542 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2543 uni2543 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2544 uni2544 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2545 uni2545 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2546 uni2546 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2547 uni2547 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2548 uni2548 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2549 uni2549 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+254a uni254A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+254b uni254B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+254c uni254C 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+254d uni254D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+254e uni254E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+254f uni254F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2550 SF430000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2551 SF240000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2552 SF510000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2553 SF520000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2554 SF390000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2555 SF220000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2556 SF210000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2557 SF250000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2558 SF500000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2559 SF490000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+255a SF380000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+255b SF280000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+255c SF270000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+255d SF260000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+255e SF360000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+255f SF370000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2560 SF420000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2561 SF190000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2562 SF200000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2563 SF230000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2564 SF470000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2565 SF480000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2566 SF410000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2567 SF450000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2568 SF460000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2569 SF400000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+256a SF540000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+256b SF530000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+256c SF440000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+256d uni256D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+256e uni256E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+256f uni256F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2570 uni2570 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2571 uni2571 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2572 uni2572 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2573 uni2573 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2574 uni2574 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2575 uni2575 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2576 uni2576 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2577 uni2577 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2578 uni2578 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2579 uni2579 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+257a uni257A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+257b uni257B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+257c uni257C 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+257d uni257D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+257e uni257E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+257f uni257F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2580 upblock 1.14 U+2581 uni2581 1.14 U+2582 uni2582 1.14 @@ -3713,7 +3831,7 @@ U+25fc uni25FC 2.3 U+25fd uni25FD 2.3 U+25fe uni25FE 2.3 U+25ff uni25FF 2.3 -U+2600 uni2600 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2600 uni2600 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2601 uni2601 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+2602 uni2602 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+2603 uni2603 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) @@ -3770,21 +3888,21 @@ U+2635 uni2635 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+2636 uni2636 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+2637 uni2637 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+2638 uni2638 1.15 -U+2639 uni2639 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+263a smileface 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+263b invsmileface 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+263c sun 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2639 uni2639 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+263a smileface 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+263b invsmileface 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+263c sun 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+263d uni263D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+263e uni263E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+263f uni263F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2640 female 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2641 uni2641 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2642 male 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2643 uni2643 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2644 uni2644 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2645 uni2645 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2646 uni2646 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2647 uni2647 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+263f uni263F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2640 female 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2641 uni2641 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2642 male 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2643 uni2643 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2644 uni2644 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2645 uni2645 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2646 uni2646 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2647 uni2647 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2648 uni2648 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+2649 uni2649 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+264a uni264A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) @@ -3809,22 +3927,22 @@ U+265c uni265C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+265d uni265D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+265e uni265E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+265f uni265F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2660 spade 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2661 uni2661 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2662 uni2662 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2663 club 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2664 uni2664 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2665 heart 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2666 diamond 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2667 uni2667 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2660 spade 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2661 uni2661 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2662 uni2662 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2663 club 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2664 uni2664 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2665 heart 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2666 diamond 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2667 uni2667 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2668 uni2668 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+2669 uni2669 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+266a musicalnote 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+266b musicalnotedbl 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+266c uni266C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+266d uni266D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+266e uni266E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+266f uni266F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2669 uni2669 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+266a musicalnote 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+266b musicalnotedbl 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+266c uni266C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+266d uni266D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+266e uni266E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+266f uni266F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2670 uni2670 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+2671 uni2671 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+2672 uni2672 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) @@ -3889,6 +4007,12 @@ U+26af uni26AF 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Obliq U+26b0 uni26B0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) U+26b1 uni26B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) U+26b2 uni26B2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26b3 uni26B3 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26b4 uni26B4 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26b5 uni26B5 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26b6 uni26B6 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26b7 uni26B7 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26b8 uni26B8 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2701 uni2701 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) U+2702 uni2702 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) U+2703 uni2703 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) @@ -4034,7 +4158,7 @@ U+279d uni279D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+279e uni279E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+279f uni279F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+27a0 uni27A0 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) -U+27a1 uni27A1 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a1 uni27A1 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+27a2 uni27A2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+27a3 uni27A3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+27a4 uni27A4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) @@ -4064,291 +4188,415 @@ U+27bc uni27BC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+27bd uni27BD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+27be uni27BE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) U+27bf uni27BF 2.7 (Sans Mono Bold) +U+27c5 uni27C5 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+27c6 uni27C6 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+27e0 uni27E0 2.3 U+27e6 uni27E6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+27e7 uni27E7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27e8 uni27E8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+27e9 uni27E9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+27e8 uni27E8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27e9 uni27E9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+27ea uni27EA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+27eb uni27EB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27f0 uni27F0 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27f1 uni27F1 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27f2 uni27F2 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27f3 uni27F3 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27f4 uni27F4 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27f5 uni27F5 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27f6 uni27F6 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27f7 uni27F7 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27f8 uni27F8 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27f9 uni27F9 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27fa uni27FA 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27fb uni27FB 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27fc uni27FC 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27fd uni27FD 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27fe uni27FE 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+27ff uni27FF 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2800 uni2800 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2801 uni2801 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2802 uni2802 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2803 uni2803 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2804 uni2804 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2805 uni2805 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2806 uni2806 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2807 uni2807 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2808 uni2808 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2809 uni2809 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+280a uni280A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+280b uni280B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+280c uni280C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+280d uni280D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+280e uni280E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+280f uni280F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2810 uni2810 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2811 uni2811 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2812 uni2812 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2813 uni2813 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2814 uni2814 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2815 uni2815 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2816 uni2816 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2817 uni2817 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2818 uni2818 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2819 uni2819 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+281a uni281A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+281b uni281B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+281c uni281C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+281d uni281D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+281e uni281E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+281f uni281F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2820 uni2820 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2821 uni2821 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2822 uni2822 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2823 uni2823 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2824 uni2824 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2825 uni2825 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2826 uni2826 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2827 uni2827 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2828 uni2828 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2829 uni2829 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+282a uni282A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+282b uni282B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+282c uni282C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+282d uni282D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+282e uni282E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+282f uni282F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2830 uni2830 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2831 uni2831 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2832 uni2832 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2833 uni2833 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2834 uni2834 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2835 uni2835 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2836 uni2836 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2837 uni2837 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2838 uni2838 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2839 uni2839 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+283a uni283A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+283b uni283B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+283c uni283C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+283d uni283D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+283e uni283E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+283f uni283F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2840 uni2840 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2841 uni2841 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2842 uni2842 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2843 uni2843 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2844 uni2844 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2845 uni2845 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2846 uni2846 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2847 uni2847 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2848 uni2848 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2849 uni2849 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+284a uni284A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+284b uni284B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+284c uni284C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+284d uni284D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+284e uni284E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+284f uni284F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2850 uni2850 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2851 uni2851 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2852 uni2852 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2853 uni2853 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2854 uni2854 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2855 uni2855 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2856 uni2856 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2857 uni2857 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2858 uni2858 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2859 uni2859 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+285a uni285A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+285b uni285B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+285c uni285C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+285d uni285D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+285e uni285E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+285f uni285F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2860 uni2860 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2861 uni2861 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2862 uni2862 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2863 uni2863 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2864 uni2864 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2865 uni2865 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2866 uni2866 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2867 uni2867 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2868 uni2868 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2869 uni2869 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+286a uni286A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+286b uni286B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+286c uni286C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+286d uni286D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+286e uni286E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+286f uni286F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2870 uni2870 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2871 uni2871 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2872 uni2872 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2873 uni2873 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2874 uni2874 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2875 uni2875 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2876 uni2876 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2877 uni2877 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2878 uni2878 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2879 uni2879 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+287a uni287A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+287b uni287B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+287c uni287C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+287d uni287D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+287e uni287E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+287f uni287F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2880 uni2880 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2881 uni2881 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2882 uni2882 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2883 uni2883 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2884 uni2884 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2885 uni2885 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2886 uni2886 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2887 uni2887 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2888 uni2888 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2889 uni2889 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+288a uni288A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+288b uni288B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+288c uni288C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+288d uni288D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+288e uni288E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+288f uni288F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2890 uni2890 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2891 uni2891 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2892 uni2892 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2893 uni2893 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2894 uni2894 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2895 uni2895 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2896 uni2896 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2897 uni2897 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2898 uni2898 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2899 uni2899 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+289a uni289A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+289b uni289B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+289c uni289C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+289d uni289D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+289e uni289E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+289f uni289F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28a0 uni28A0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28a1 uni28A1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28a2 uni28A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28a3 uni28A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28a4 uni28A4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28a5 uni28A5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28a6 uni28A6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28a7 uni28A7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28a8 uni28A8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28a9 uni28A9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28aa uni28AA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28ab uni28AB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28ac uni28AC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28ad uni28AD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28ae uni28AE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28af uni28AF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28b0 uni28B0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28b1 uni28B1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28b2 uni28B2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28b3 uni28B3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28b4 uni28B4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28b5 uni28B5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28b6 uni28B6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28b7 uni28B7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28b8 uni28B8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28b9 uni28B9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28ba uni28BA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28bb uni28BB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28bc uni28BC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28bd uni28BD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28be uni28BE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28bf uni28BF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28c0 uni28C0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28c1 uni28C1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28c2 uni28C2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28c3 uni28C3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28c4 uni28C4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28c5 uni28C5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28c6 uni28C6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28c7 uni28C7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28c8 uni28C8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28c9 uni28C9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28ca uni28CA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28cb uni28CB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28cc uni28CC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28cd uni28CD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28ce uni28CE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28cf uni28CF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28d0 uni28D0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28d1 uni28D1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28d2 uni28D2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28d3 uni28D3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28d4 uni28D4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28d5 uni28D5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28d6 uni28D6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28d7 uni28D7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28d8 uni28D8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28d9 uni28D9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28da uni28DA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28db uni28DB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28dc uni28DC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28dd uni28DD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28de uni28DE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28df uni28DF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28e0 uni28E0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28e1 uni28E1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28e2 uni28E2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28e3 uni28E3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28e4 uni28E4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28e5 uni28E5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28e6 uni28E6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28e7 uni28E7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28e8 uni28E8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28e9 uni28E9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28ea uni28EA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28eb uni28EB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28ec uni28EC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28ed uni28ED 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28ee uni28EE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28ef uni28EF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28f0 uni28F0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28f1 uni28F1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28f2 uni28F2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28f3 uni28F3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28f4 uni28F4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28f5 uni28F5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28f6 uni28F6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28f7 uni28F7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28f8 uni28F8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28f9 uni28F9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28fa uni28FA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28fb uni28FB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28fc uni28FC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28fd uni28FD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28fe uni28FE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+28ff uni28FF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2906 uni2906 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2907 uni2907 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+290a uni290A 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+290b uni290B 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2940 uni2940 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2941 uni2941 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27f0 uni27F0 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f1 uni27F1 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f2 uni27F2 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f3 uni27F3 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f4 uni27F4 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f5 uni27F5 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f6 uni27F6 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f7 uni27F7 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f8 uni27F8 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f9 uni27F9 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27fa uni27FA 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27fb uni27FB 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27fc uni27FC 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27fd uni27FD 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27fe uni27FE 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27ff uni27FF 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2800 uni2800 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2801 uni2801 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2802 uni2802 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2803 uni2803 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2804 uni2804 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2805 uni2805 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2806 uni2806 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2807 uni2807 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2808 uni2808 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2809 uni2809 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+280a uni280A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+280b uni280B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+280c uni280C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+280d uni280D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+280e uni280E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+280f uni280F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2810 uni2810 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2811 uni2811 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2812 uni2812 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2813 uni2813 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2814 uni2814 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2815 uni2815 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2816 uni2816 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2817 uni2817 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2818 uni2818 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2819 uni2819 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+281a uni281A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+281b uni281B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+281c uni281C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+281d uni281D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+281e uni281E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+281f uni281F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2820 uni2820 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2821 uni2821 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2822 uni2822 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2823 uni2823 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2824 uni2824 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2825 uni2825 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2826 uni2826 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2827 uni2827 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2828 uni2828 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2829 uni2829 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+282a uni282A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+282b uni282B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+282c uni282C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+282d uni282D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+282e uni282E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+282f uni282F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2830 uni2830 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2831 uni2831 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2832 uni2832 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2833 uni2833 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2834 uni2834 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2835 uni2835 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2836 uni2836 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2837 uni2837 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2838 uni2838 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2839 uni2839 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+283a uni283A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+283b uni283B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+283c uni283C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+283d uni283D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+283e uni283E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+283f uni283F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2840 uni2840 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2841 uni2841 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2842 uni2842 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2843 uni2843 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2844 uni2844 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2845 uni2845 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2846 uni2846 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2847 uni2847 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2848 uni2848 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2849 uni2849 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+284a uni284A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+284b uni284B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+284c uni284C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+284d uni284D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+284e uni284E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+284f uni284F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2850 uni2850 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2851 uni2851 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2852 uni2852 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2853 uni2853 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2854 uni2854 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2855 uni2855 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2856 uni2856 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2857 uni2857 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2858 uni2858 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2859 uni2859 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+285a uni285A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+285b uni285B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+285c uni285C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+285d uni285D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+285e uni285E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+285f uni285F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2860 uni2860 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2861 uni2861 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2862 uni2862 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2863 uni2863 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2864 uni2864 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2865 uni2865 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2866 uni2866 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2867 uni2867 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2868 uni2868 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2869 uni2869 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+286a uni286A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+286b uni286B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+286c uni286C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+286d uni286D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+286e uni286E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+286f uni286F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2870 uni2870 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2871 uni2871 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2872 uni2872 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2873 uni2873 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2874 uni2874 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2875 uni2875 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2876 uni2876 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2877 uni2877 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2878 uni2878 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2879 uni2879 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+287a uni287A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+287b uni287B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+287c uni287C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+287d uni287D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+287e uni287E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+287f uni287F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2880 uni2880 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2881 uni2881 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2882 uni2882 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2883 uni2883 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2884 uni2884 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2885 uni2885 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2886 uni2886 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2887 uni2887 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2888 uni2888 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2889 uni2889 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+288a uni288A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+288b uni288B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+288c uni288C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+288d uni288D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+288e uni288E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+288f uni288F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2890 uni2890 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2891 uni2891 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2892 uni2892 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2893 uni2893 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2894 uni2894 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2895 uni2895 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2896 uni2896 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2897 uni2897 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2898 uni2898 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2899 uni2899 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+289a uni289A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+289b uni289B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+289c uni289C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+289d uni289D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+289e uni289E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+289f uni289F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a0 uni28A0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a1 uni28A1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a2 uni28A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a3 uni28A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a4 uni28A4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a5 uni28A5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a6 uni28A6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a7 uni28A7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a8 uni28A8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a9 uni28A9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28aa uni28AA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ab uni28AB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ac uni28AC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ad uni28AD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ae uni28AE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28af uni28AF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b0 uni28B0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b1 uni28B1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b2 uni28B2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b3 uni28B3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b4 uni28B4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b5 uni28B5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b6 uni28B6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b7 uni28B7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b8 uni28B8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b9 uni28B9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ba uni28BA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28bb uni28BB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28bc uni28BC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28bd uni28BD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28be uni28BE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28bf uni28BF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c0 uni28C0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c1 uni28C1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c2 uni28C2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c3 uni28C3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c4 uni28C4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c5 uni28C5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c6 uni28C6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c7 uni28C7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c8 uni28C8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c9 uni28C9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ca uni28CA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28cb uni28CB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28cc uni28CC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28cd uni28CD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ce uni28CE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28cf uni28CF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d0 uni28D0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d1 uni28D1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d2 uni28D2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d3 uni28D3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d4 uni28D4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d5 uni28D5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d6 uni28D6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d7 uni28D7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d8 uni28D8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d9 uni28D9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28da uni28DA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28db uni28DB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28dc uni28DC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28dd uni28DD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28de uni28DE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28df uni28DF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e0 uni28E0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e1 uni28E1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e2 uni28E2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e3 uni28E3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e4 uni28E4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e5 uni28E5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e6 uni28E6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e7 uni28E7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e8 uni28E8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e9 uni28E9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ea uni28EA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28eb uni28EB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ec uni28EC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ed uni28ED 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ee uni28EE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ef uni28EF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f0 uni28F0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f1 uni28F1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f2 uni28F2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f3 uni28F3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f4 uni28F4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f5 uni28F5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f6 uni28F6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f7 uni28F7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f8 uni28F8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f9 uni28F9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28fa uni28FA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28fb uni28FB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28fc uni28FC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28fd uni28FD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28fe uni28FE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ff uni28FF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2900 uni2900 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2901 uni2901 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2902 uni2902 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2903 uni2903 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2904 uni2904 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2905 uni2905 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2906 uni2906 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2907 uni2907 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2908 uni2908 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2909 uni2909 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+290a uni290A 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+290b uni290B 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+290c uni290C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+290d uni290D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+290e uni290E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+290f uni290F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2910 uni2910 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2911 uni2911 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2912 uni2912 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2913 uni2913 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2914 uni2914 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2915 uni2915 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2916 uni2916 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2917 uni2917 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2918 uni2918 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2919 uni2919 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+291a uni291A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+291b uni291B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+291c uni291C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+291d uni291D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+291e uni291E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+291f uni291F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2920 uni2920 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2921 uni2921 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2922 uni2922 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2923 uni2923 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2924 uni2924 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2925 uni2925 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2926 uni2926 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2927 uni2927 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2928 uni2928 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2929 uni2929 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+292a uni292A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+292b uni292B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+292c uni292C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+292d uni292D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+292e uni292E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+292f uni292F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2930 uni2930 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2931 uni2931 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2932 uni2932 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2933 uni2933 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2934 uni2934 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2935 uni2935 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2936 uni2936 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2937 uni2937 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2938 uni2938 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2939 uni2939 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+293a uni293A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+293b uni293B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+293c uni293C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+293d uni293D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+293e uni293E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+293f uni293F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2940 uni2940 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2941 uni2941 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2942 uni2942 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2943 uni2943 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2944 uni2944 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2945 uni2945 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2946 uni2946 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2947 uni2947 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2948 uni2948 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2949 uni2949 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+294a uni294A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+294b uni294B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+294c uni294C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+294d uni294D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+294e uni294E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+294f uni294F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2950 uni2950 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2951 uni2951 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2952 uni2952 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2953 uni2953 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2954 uni2954 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2955 uni2955 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2956 uni2956 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2957 uni2957 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2958 uni2958 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2959 uni2959 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+295a uni295A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+295b uni295B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+295c uni295C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+295d uni295D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+295e uni295E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+295f uni295F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2960 uni2960 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2961 uni2961 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2962 uni2962 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2963 uni2963 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2964 uni2964 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2965 uni2965 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2966 uni2966 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2967 uni2967 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2968 uni2968 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2969 uni2969 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+296a uni296A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+296b uni296B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+296c uni296C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+296d uni296D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+296e uni296E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+296f uni296F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2970 uni2970 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2971 uni2971 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2972 uni2972 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2973 uni2973 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2974 uni2974 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2975 uni2975 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2976 uni2976 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2977 uni2977 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2978 uni2978 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2979 uni2979 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+297a uni297A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+297b uni297B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+297c uni297C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+297d uni297D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+297e uni297E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+297f uni297F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2983 uni2983 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+2984 uni2984 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+29ce uni29CE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -4365,9 +4613,9 @@ U+29fb uni29FB 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Conde U+2a00 uni2A00 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2a01 uni2A01 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2a02 uni2A02 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a0c uni2A0C 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2a0d uni2A0D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2a0e uni2A0E 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2a0c uni2A0C 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2a0d uni2A0D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2a0e uni2A0E 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2a0f uni2A0F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2a10 uni2A10 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2a11 uni2A11 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -4382,7 +4630,7 @@ U+2a19 uni2A19 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+2a1a uni2A1A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2a1b uni2A1B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2a1c uni2A1C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2a2f uni2A2F 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) +U+2a2f uni2A2F 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) U+2a7d uni2A7D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2a7e uni2A7E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2a7f uni2A7F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -4434,54 +4682,110 @@ U+2ab9 uni2AB9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+2aba uni2ABA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2af9 uni2AF9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2afa uni2AFA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b00 uni2B00 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b01 uni2B01 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b02 uni2B02 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b03 uni2B03 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b04 uni2B04 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b05 uni2B05 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b06 uni2B06 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b07 uni2B07 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b08 uni2B08 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b09 uni2B09 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b0a uni2B0A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b0b uni2B0B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b0c uni2B0C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b0d uni2B0D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b0e uni2B0E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b0f uni2B0F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b10 uni2B10 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+2b11 uni2B11 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b00 uni2B00 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b01 uni2B01 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b02 uni2B02 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b03 uni2B03 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b04 uni2B04 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b05 uni2B05 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b06 uni2B06 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b07 uni2B07 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b08 uni2B08 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b09 uni2B09 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b0a uni2B0A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b0b uni2B0B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b0c uni2B0C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b0d uni2B0D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b0e uni2B0E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b0f uni2B0F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b10 uni2B10 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b11 uni2B11 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+2b12 uni2B12 2.3 U+2b13 uni2B13 2.3 -U+2b14 uni2B14 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+2b15 uni2B15 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+2b16 uni2B16 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+2b17 uni2B17 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+2b18 uni2B18 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+2b19 uni2B19 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) -U+2b1a uni2B1A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) +U+2b14 uni2B14 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b15 uni2B15 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b16 uni2B16 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b17 uni2B17 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b18 uni2B18 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b19 uni2B19 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b1a uni2B1A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b1f uni2B1F 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) U+2b20 uni2B20 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2b21 uni2B21 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2b22 uni2B22 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+2b23 uni2B23 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b24 uni2B24 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+2b53 uni2B53 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+2b54 uni2B54 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) U+2c60 uni2C60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+2c61 uni2C61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+2c62 uni2C62 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+2c63 uni2C63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c64 uni2C64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c64 uni2C64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+2c65 uni2C65 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) U+2c66 uni2C66 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c67 uni2C67 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2c68 uni2C68 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2c69 uni2C69 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2c6a uni2C6A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2c6b uni2C6B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2c6c uni2C6C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2c67 uni2C67 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2c68 uni2C68 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2c69 uni2C69 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2c6a uni2C6A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2c6b uni2C6B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2c6c uni2C6C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2c6d uni2C6D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.31 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2c6e uni2C6E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2c6f uni2C6F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic) +U+2c70 uni2C70 2.31 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2c71 uni2C71 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.31 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2c72 uni2C72 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.31 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2c73 uni2C73 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.31 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) U+2c74 uni2C74 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) -U+2c75 uni2C75 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2c76 uni2C76 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+2c77 uni2C77 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2c75 uni2C75 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2c76 uni2C76 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2c77 uni2C77 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2c79 uni2C79 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic) +U+2c7a uni2C7A 2.27 +U+2c7b uni2C7B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c7c uni2C7C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic) +U+2c7d uni2C7D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.31 (Serif Condensed Italic) +U+2c7e uni2C7E 2.31 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2c7f uni2C7F 2.31 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+2d00 uni2D00 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d01 uni2D01 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d02 uni2D02 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d03 uni2D03 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d04 uni2D04 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d05 uni2D05 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d06 uni2D06 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d07 uni2D07 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d08 uni2D08 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d09 uni2D09 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d0a uni2D0A 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d0b uni2D0B 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d0c uni2D0C 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d0d uni2D0D 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d0e uni2D0E 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d0f uni2D0F 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d10 uni2D10 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d11 uni2D11 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d12 uni2D12 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d13 uni2D13 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d14 uni2D14 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d15 uni2D15 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d16 uni2D16 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d17 uni2D17 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d18 uni2D18 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d19 uni2D19 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d1a uni2D1A 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d1b uni2D1B 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d1c uni2D1C 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d1d uni2D1D 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d1e uni2D1E 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d1f uni2D1F 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d20 uni2D20 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d21 uni2D21 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d22 uni2D22 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d23 uni2D23 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d24 uni2D24 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+2d25 uni2D25 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+2d30 uni2D30 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+2d31 uni2D31 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+2d32 uni2D32 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) @@ -4537,6 +4841,171 @@ U+2d63 uni2D63 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condense U+2d64 uni2D64 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+2d65 uni2D65 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+2d6f uni2D6F 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2e18 uni2E18 2.26 +U+2e22 uni2E22 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) 2.31 (Serif Condensed Italic) +U+2e23 uni2E23 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) 2.31 (Serif Condensed Italic) +U+2e24 uni2E24 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) 2.31 (Serif Condensed Italic) +U+2e25 uni2E25 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) 2.31 (Serif Condensed Italic) +U+2e2e uni2E2E 2.26 +U+4dc0 uni4DC0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc1 uni4DC1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc2 uni4DC2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc3 uni4DC3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc4 uni4DC4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc5 uni4DC5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc6 uni4DC6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc7 uni4DC7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc8 uni4DC8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc9 uni4DC9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dca uni4DCA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dcb uni4DCB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dcc uni4DCC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dcd uni4DCD 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dce uni4DCE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dcf uni4DCF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd0 uni4DD0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd1 uni4DD1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd2 uni4DD2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd3 uni4DD3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd4 uni4DD4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd5 uni4DD5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd6 uni4DD6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd7 uni4DD7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd8 uni4DD8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd9 uni4DD9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dda uni4DDA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ddb uni4DDB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ddc uni4DDC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ddd uni4DDD 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dde uni4DDE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ddf uni4DDF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de0 uni4DE0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de1 uni4DE1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de2 uni4DE2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de3 uni4DE3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de4 uni4DE4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de5 uni4DE5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de6 uni4DE6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de7 uni4DE7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de8 uni4DE8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de9 uni4DE9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dea uni4DEA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4deb uni4DEB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dec uni4DEC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ded uni4DED 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dee uni4DEE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4def uni4DEF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df0 uni4DF0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df1 uni4DF1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df2 uni4DF2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df3 uni4DF3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df4 uni4DF4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df5 uni4DF5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df6 uni4DF6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df7 uni4DF7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df8 uni4DF8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df9 uni4DF9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfa uni4DFA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfb uni4DFB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfc uni4DFC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfd uni4DFD 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfe uni4DFE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dff uni4DFF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a644 uniA644 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a645 uniA645 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a646 uniA646 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a647 uniA647 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a64c uniA64C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a64d uniA64D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a650 uniA650 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a651 uniA651 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a654 uniA654 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a655 uniA655 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a656 uniA656 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a657 uniA657 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a662 uniA662 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a663 uniA663 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a664 uniA664 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a665 uniA665 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a666 uniA666 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a667 uniA667 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a668 uniA668 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a669 uniA669 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a66a uniA66A 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a66b uniA66B 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a66c uniA66C 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a66d uniA66D 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a66e uniA66E 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a68a uniA68A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a68b uniA68B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a68c uniA68C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a68d uniA68D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a694 uniA694 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a695 uniA695 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a708 uniA708 2.27 +U+a709 uniA709 2.27 +U+a70a uniA70A 2.27 +U+a70b uniA70B 2.27 +U+a70c uniA70C 2.27 +U+a70d uniA70D 2.27 +U+a70e uniA70E 2.27 +U+a70f uniA70F 2.27 +U+a710 uniA710 2.27 +U+a711 uniA711 2.27 +U+a712 uniA712 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a713 uniA713 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a714 uniA714 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a715 uniA715 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a716 uniA716 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+a71b uniA71B 2.27 +U+a71c uniA71C 2.27 +U+a71d uniA71D 2.27 +U+a71e uniA71E 2.27 +U+a71f uniA71F 2.27 +U+a726 uniA726 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+a727 uniA727 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+a728 uniA728 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a729 uniA729 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a72a uniA72A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a72b uniA72B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a730 uniA730 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a731 uniA731 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a732 uniA732 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a733 uniA733 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a734 uniA734 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a735 uniA735 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a736 uniA736 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a737 uniA737 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a738 uniA738 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a739 uniA739 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73a uniA73A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73b uniA73B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73c uniA73C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73d uniA73D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73e uniA73E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a73f uniA73F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a746 uniA746 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a747 uniA747 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a748 uniA748 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a749 uniA749 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a74a uniA74A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a74b uniA74B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a74e uniA74E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a74f uniA74F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a780 uniA780 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a781 uniA781 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a782 uniA782 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a783 uniA783 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a789 uniA789 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+a78a uniA78A 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+a78b uniA78B 2.26 +U+a78c uniA78C 2.26 +U+a78d uniA78D 2.31 +U+a7fb uniA7FB 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a7fc uniA7FC 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a7fd uniA7FD 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a7fe uniA7FE 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a7ff uniA7FF 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+e000 uniE000 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+e001 uniE001 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) U+e002 uniE002 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) @@ -4577,21 +5046,61 @@ U+f217 uniF217 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Conden U+f21a uniF21A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+f21b uniF21B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+f25f uniF25F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f400 uniF400 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f401 uniF401 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f402 uniF402 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f403 uniF403 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f404 uniF404 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f405 uniF405 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f406 uniF406 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f407 uniF407 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f408 uniF408 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f409 uniF409 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f40a uniF40A 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f40b uniF40B 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f40c uniF40C 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f40d uniF40D 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f40e uniF40E 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f40f uniF40F 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f410 uniF410 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f411 uniF411 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f412 uniF412 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f413 uniF413 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f414 uniF414 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f415 uniF415 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f416 uniF416 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f417 uniF417 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f418 uniF418 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f419 uniF419 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f41a uniF41A 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f41b uniF41B 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f41c uniF41C 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f41d uniF41D 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f41e uniF41E 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f41f uniF41F 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f420 uniF420 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f421 uniF421 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f422 uniF422 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f423 uniF423 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f424 uniF424 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f425 uniF425 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f426 uniF426 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+f428 uniF428 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) U+f5c5 uniF5C5 2.9 (Sans Bold Oblique, Sans Condensed Bold Oblique) -U+f6c4 uniF6C4 2.10 (Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed Bold Italic, Serif Condensed Italic) -U+f6c5 uniF6C5 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.9 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight) -U+f6c6 uniF6C6 2.5 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+f6c7 uniF6C7 2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+f6c8 uniF6C8 2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+f6d1 cyrBreve 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+f6d4 cyrbreve 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fb00 uniFB00 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+f6c4 uniF6C4 2.10 (Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+f6c5 uniF6C5 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.9 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+f6c6 uniF6C6 2.5 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+f6c7 uniF6C7 2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+f6c8 uniF6C8 2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+f6d1 cyrBreve 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+f6d4 cyrbreve 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fb00 uniFB00 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+fb01 fi original U+fb02 fl original -U+fb03 uniFB03 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fb04 uniFB04 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fb05 uniFB05 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fb06 uniFB06 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+fb03 uniFB03 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fb04 uniFB04 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fb05 uniFB05 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fb06 uniFB06 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+fb13 uniFB13 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb14 uniFB14 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fb15 uniFB15 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -4692,6 +5201,14 @@ U+fb7e uniFB7E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed U+fb7f uniFB7F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+fb80 uniFB80 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+fb81 uniFB81 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb82 uniFB82 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb83 uniFB83 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb84 uniFB84 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb85 uniFB85 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb86 uniFB86 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb87 uniFB87 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb88 uniFB88 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb89 uniFB89 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+fb8a uniFB8A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+fb8b uniFB8B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+fb8c uniFB8C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) @@ -4704,12 +5221,28 @@ U+fb92 uniFB92 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed U+fb93 uniFB93 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+fb94 uniFB94 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+fb95 uniFB95 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb96 uniFB96 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb97 uniFB97 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb98 uniFB98 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb99 uniFB99 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb9a uniFB9A 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb9b uniFB9B 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb9c uniFB9C 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fb9d uniFB9D 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+fb9e uniFB9E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+fb9f uniFB9F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fbaa uniFBAA 2.16 (Sans Mono, Sans Mono Bold) -U+fbab uniFBAB 2.16 (Sans Mono, Sans Mono Bold) -U+fbac uniFBAC 2.16 (Sans Mono, Sans Mono Bold) -U+fbad uniFBAD 2.16 (Sans Mono, Sans Mono Bold) +U+fba0 uniFBA0 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fba1 uniFBA1 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fba2 uniFBA2 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fba3 uniFBA3 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbaa uniFBAA 2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbab uniFBAB 2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbac uniFBAC 2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbad uniFBAD 2.16 (Sans Mono, Sans Mono Bold) 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbd3 uniFBD3 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbd4 uniFBD4 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbd5 uniFBD5 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbd6 uniFBD6 2.31 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+fbd9 uniFBD9 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+fbda uniFBDA 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) U+fbe8 uniFBE8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) @@ -4718,22 +5251,26 @@ U+fbfc uniFBFC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed U+fbfd uniFBFD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+fbfe uniFBFE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+fbff uniFBFF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) -U+fe00 uniFE00 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe01 uniFE01 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe02 uniFE02 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe03 uniFE03 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe04 uniFE04 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe05 uniFE05 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe06 uniFE06 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe07 uniFE07 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe08 uniFE08 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe09 uniFE09 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe0a uniFE0A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe0b uniFE0B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe0c uniFE0C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe0d uniFE0D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe0e uniFE0E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) -U+fe0f uniFE0F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) +U+fe00 uniFE00 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe01 uniFE01 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe02 uniFE02 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe03 uniFE03 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe04 uniFE04 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe05 uniFE05 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe06 uniFE06 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe07 uniFE07 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe08 uniFE08 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe09 uniFE09 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe0a uniFE0A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe0b uniFE0B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe0c uniFE0C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe0d uniFE0D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe0e uniFE0E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe0f uniFE0F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe20 uniFE20 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fe21 uniFE21 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fe22 uniFE22 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fe23 uniFE23 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+fe70 uniFE70 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+fe71 uniFE71 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+fe72 uniFE72 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) @@ -4875,6 +5412,10 @@ U+fefa uniFEFA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed U+fefb uniFEFB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+fefc uniFEFC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) U+feff uniFEFF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fff9 uniFFF9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fffa uniFFFA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fffb uniFFFB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fffc uniFFFC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) U+fffd uniFFFD 1.12 U+1d300 u1D300 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d301 u1D301 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) @@ -4963,48 +5504,807 @@ U+1d353 u1D353 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Cond U+1d354 u1D354 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d355 u1D355 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) U+1d356 u1D356 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d538 u1D538 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d539 u1D539 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d53b u1D53B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d53c u1D53C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d53d u1D53D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d53e u1D53E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d540 u1D540 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d541 u1D541 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d542 u1D542 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d543 u1D543 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d544 u1D544 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d546 u1D546 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d54a u1D54A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d54b u1D54B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d54c u1D54C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d54d u1D54D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d54e u1D54E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d54f u1D54F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d550 u1D550 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d552 u1D552 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d553 u1D553 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d554 u1D554 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d555 u1D555 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d556 u1D556 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d557 u1D557 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d558 u1D558 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d559 u1D559 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d55a u1D55A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d55b u1D55B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d55c u1D55C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d55d u1D55D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d55e u1D55E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d55f u1D55F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d560 u1D560 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d561 u1D561 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d562 u1D562 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d563 u1D563 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d564 u1D564 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d565 u1D565 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d566 u1D566 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d567 u1D567 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d568 u1D568 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d569 u1D569 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d56a u1D56A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) -U+1d56b u1D56B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d400 u1D400 2.23 (Serif Bold, Serif Condensed Bold) +U+1d401 u1D401 2.23 (Serif Bold, Serif Condensed Bold) +U+1d402 u1D402 2.23 (Serif Bold, Serif Condensed Bold) +U+1d403 u1D403 2.23 (Serif Bold, Serif Condensed Bold) +U+1d404 u1D404 2.23 (Serif Bold, Serif Condensed Bold) +U+1d405 u1D405 2.23 (Serif Bold, Serif Condensed Bold) +U+1d406 u1D406 2.23 (Serif Bold, Serif Condensed Bold) +U+1d407 u1D407 2.23 (Serif Bold, Serif Condensed Bold) +U+1d408 u1D408 2.23 (Serif Bold, Serif Condensed Bold) +U+1d409 u1D409 2.23 (Serif Bold, Serif Condensed Bold) +U+1d40a u1D40A 2.23 (Serif Bold, Serif Condensed Bold) +U+1d40b u1D40B 2.23 (Serif Bold, Serif Condensed Bold) +U+1d40c u1D40C 2.23 (Serif Bold, Serif Condensed Bold) +U+1d40d u1D40D 2.23 (Serif Bold, Serif Condensed Bold) +U+1d40e u1D40E 2.23 (Serif Bold, Serif Condensed Bold) +U+1d40f u1D40F 2.23 (Serif Bold, Serif Condensed Bold) +U+1d410 u1D410 2.23 (Serif Bold, Serif Condensed Bold) +U+1d411 u1D411 2.23 (Serif Bold, Serif Condensed Bold) +U+1d412 u1D412 2.23 (Serif Bold, Serif Condensed Bold) +U+1d413 u1D413 2.23 (Serif Bold, Serif Condensed Bold) +U+1d414 u1D414 2.23 (Serif Bold, Serif Condensed Bold) +U+1d415 u1D415 2.23 (Serif Bold, Serif Condensed Bold) +U+1d416 u1D416 2.23 (Serif Bold, Serif Condensed Bold) +U+1d417 u1D417 2.23 (Serif Bold, Serif Condensed Bold) +U+1d418 u1D418 2.23 (Serif Bold, Serif Condensed Bold) +U+1d419 u1D419 2.23 (Serif Bold, Serif Condensed Bold) +U+1d41a u1D41A 2.23 (Serif Bold, Serif Condensed Bold) +U+1d41b u1D41B 2.23 (Serif Bold, Serif Condensed Bold) +U+1d41c u1D41C 2.23 (Serif Bold, Serif Condensed Bold) +U+1d41d u1D41D 2.23 (Serif Bold, Serif Condensed Bold) +U+1d41e u1D41E 2.23 (Serif Bold, Serif Condensed Bold) +U+1d41f u1D41F 2.23 (Serif Bold, Serif Condensed Bold) +U+1d420 u1D420 2.23 (Serif Bold, Serif Condensed Bold) +U+1d421 u1D421 2.23 (Serif Bold, Serif Condensed Bold) +U+1d422 u1D422 2.23 (Serif Bold, Serif Condensed Bold) +U+1d423 u1D423 2.23 (Serif Bold, Serif Condensed Bold) +U+1d424 u1D424 2.23 (Serif Bold, Serif Condensed Bold) +U+1d425 u1D425 2.23 (Serif Bold, Serif Condensed Bold) +U+1d426 u1D426 2.23 (Serif Bold, Serif Condensed Bold) +U+1d427 u1D427 2.23 (Serif Bold, Serif Condensed Bold) +U+1d428 u1D428 2.23 (Serif Bold, Serif Condensed Bold) +U+1d429 u1D429 2.23 (Serif Bold, Serif Condensed Bold) +U+1d42a u1D42A 2.23 (Serif Bold, Serif Condensed Bold) +U+1d42b u1D42B 2.23 (Serif Bold, Serif Condensed Bold) +U+1d42c u1D42C 2.23 (Serif Bold, Serif Condensed Bold) +U+1d42d u1D42D 2.23 (Serif Bold, Serif Condensed Bold) +U+1d42e u1D42E 2.23 (Serif Bold, Serif Condensed Bold) +U+1d42f u1D42F 2.23 (Serif Bold, Serif Condensed Bold) +U+1d430 u1D430 2.23 (Serif Bold, Serif Condensed Bold) +U+1d431 u1D431 2.23 (Serif Bold, Serif Condensed Bold) +U+1d432 u1D432 2.23 (Serif Bold, Serif Condensed Bold) +U+1d433 u1D433 2.23 (Serif Bold, Serif Condensed Bold) +U+1d434 u1D434 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d435 u1D435 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d436 u1D436 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d437 u1D437 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d438 u1D438 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d439 u1D439 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d43a u1D43A 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d43b u1D43B 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d43c u1D43C 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d43d u1D43D 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d43e u1D43E 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d43f u1D43F 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d440 u1D440 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d441 u1D441 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d442 u1D442 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d443 u1D443 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d444 u1D444 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d445 u1D445 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d446 u1D446 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d447 u1D447 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d448 u1D448 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d449 u1D449 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d44a u1D44A 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d44b u1D44B 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d44c u1D44C 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d44d u1D44D 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d44e u1D44E 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d44f u1D44F 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d450 u1D450 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d451 u1D451 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d452 u1D452 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d453 u1D453 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d454 u1D454 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d456 u1D456 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d457 u1D457 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d458 u1D458 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d459 u1D459 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d45a u1D45A 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d45b u1D45B 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d45c u1D45C 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d45d u1D45D 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d45e u1D45E 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d45f u1D45F 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d460 u1D460 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d461 u1D461 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d462 u1D462 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d463 u1D463 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d464 u1D464 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d465 u1D465 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d466 u1D466 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d467 u1D467 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d468 u1D468 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d469 u1D469 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46a u1D46A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46b u1D46B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46c u1D46C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46d u1D46D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46e u1D46E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46f u1D46F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d470 u1D470 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d471 u1D471 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d472 u1D472 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d473 u1D473 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d474 u1D474 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d475 u1D475 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d476 u1D476 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d477 u1D477 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d478 u1D478 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d479 u1D479 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47a u1D47A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47b u1D47B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47c u1D47C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47d u1D47D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47e u1D47E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47f u1D47F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d480 u1D480 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d481 u1D481 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d482 u1D482 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d483 u1D483 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d484 u1D484 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d485 u1D485 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d486 u1D486 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d487 u1D487 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d488 u1D488 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d489 u1D489 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48a u1D48A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48b u1D48B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48c u1D48C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48d u1D48D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48e u1D48E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48f u1D48F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d490 u1D490 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d491 u1D491 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d492 u1D492 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d493 u1D493 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d494 u1D494 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d495 u1D495 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d496 u1D496 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d497 u1D497 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d498 u1D498 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d499 u1D499 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d49a u1D49A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d49b u1D49B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d538 u1D538 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d539 u1D539 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d53b u1D53B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d53c u1D53C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d53d u1D53D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d53e u1D53E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d540 u1D540 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d541 u1D541 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d542 u1D542 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d543 u1D543 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d544 u1D544 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d546 u1D546 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d54a u1D54A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d54b u1D54B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d54c u1D54C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d54d u1D54D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d54e u1D54E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d54f u1D54F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d550 u1D550 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d552 u1D552 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d553 u1D553 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d554 u1D554 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d555 u1D555 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d556 u1D556 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d557 u1D557 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d558 u1D558 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d559 u1D559 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d55a u1D55A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d55b u1D55B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d55c u1D55C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d55d u1D55D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d55e u1D55E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d55f u1D55F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d560 u1D560 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d561 u1D561 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d562 u1D562 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d563 u1D563 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d564 u1D564 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d565 u1D565 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d566 u1D566 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d567 u1D567 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d568 u1D568 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d569 u1D569 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d56a u1D56A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d56b u1D56B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d5a0 u1D5A0 2.23 (Sans, Sans Condensed) +U+1d5a1 u1D5A1 2.23 (Sans, Sans Condensed) +U+1d5a2 u1D5A2 2.23 (Sans, Sans Condensed) +U+1d5a3 u1D5A3 2.23 (Sans, Sans Condensed) +U+1d5a4 u1D5A4 2.23 (Sans, Sans Condensed) +U+1d5a5 u1D5A5 2.23 (Sans, Sans Condensed) +U+1d5a6 u1D5A6 2.23 (Sans, Sans Condensed) +U+1d5a7 u1D5A7 2.23 (Sans, Sans Condensed) +U+1d5a8 u1D5A8 2.23 (Sans, Sans Condensed) +U+1d5a9 u1D5A9 2.23 (Sans, Sans Condensed) +U+1d5aa u1D5AA 2.23 (Sans, Sans Condensed) +U+1d5ab u1D5AB 2.23 (Sans, Sans Condensed) +U+1d5ac u1D5AC 2.23 (Sans, Sans Condensed) +U+1d5ad u1D5AD 2.23 (Sans, Sans Condensed) +U+1d5ae u1D5AE 2.23 (Sans, Sans Condensed) +U+1d5af u1D5AF 2.23 (Sans, Sans Condensed) +U+1d5b0 u1D5B0 2.23 (Sans, Sans Condensed) +U+1d5b1 u1D5B1 2.23 (Sans, Sans Condensed) +U+1d5b2 u1D5B2 2.23 (Sans, Sans Condensed) +U+1d5b3 u1D5B3 2.23 (Sans, Sans Condensed) +U+1d5b4 u1D5B4 2.23 (Sans, Sans Condensed) +U+1d5b5 u1D5B5 2.23 (Sans, Sans Condensed) +U+1d5b6 u1D5B6 2.23 (Sans, Sans Condensed) +U+1d5b7 u1D5B7 2.23 (Sans, Sans Condensed) +U+1d5b8 u1D5B8 2.23 (Sans, Sans Condensed) +U+1d5b9 u1D5B9 2.23 (Sans, Sans Condensed) +U+1d5ba u1D5BA 2.23 (Sans, Sans Condensed) +U+1d5bb u1D5BB 2.23 (Sans, Sans Condensed) +U+1d5bc u1D5BC 2.23 (Sans, Sans Condensed) +U+1d5bd u1D5BD 2.23 (Sans, Sans Condensed) +U+1d5be u1D5BE 2.23 (Sans, Sans Condensed) +U+1d5bf u1D5BF 2.23 (Sans, Sans Condensed) +U+1d5c0 u1D5C0 2.23 (Sans, Sans Condensed) +U+1d5c1 u1D5C1 2.23 (Sans, Sans Condensed) +U+1d5c2 u1D5C2 2.23 (Sans, Sans Condensed) +U+1d5c3 u1D5C3 2.23 (Sans, Sans Condensed) +U+1d5c4 u1D5C4 2.23 (Sans, Sans Condensed) +U+1d5c5 u1D5C5 2.23 (Sans, Sans Condensed) +U+1d5c6 u1D5C6 2.23 (Sans, Sans Condensed) +U+1d5c7 u1D5C7 2.23 (Sans, Sans Condensed) +U+1d5c8 u1D5C8 2.23 (Sans, Sans Condensed) +U+1d5c9 u1D5C9 2.23 (Sans, Sans Condensed) +U+1d5ca u1D5CA 2.23 (Sans, Sans Condensed) +U+1d5cb u1D5CB 2.23 (Sans, Sans Condensed) +U+1d5cc u1D5CC 2.23 (Sans, Sans Condensed) +U+1d5cd u1D5CD 2.23 (Sans, Sans Condensed) +U+1d5ce u1D5CE 2.23 (Sans, Sans Condensed) +U+1d5cf u1D5CF 2.23 (Sans, Sans Condensed) +U+1d5d0 u1D5D0 2.23 (Sans, Sans Condensed) +U+1d5d1 u1D5D1 2.23 (Sans, Sans Condensed) +U+1d5d2 u1D5D2 2.23 (Sans, Sans Condensed) +U+1d5d3 u1D5D3 2.23 (Sans, Sans Condensed) +U+1d5d4 u1D5D4 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5d5 u1D5D5 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5d6 u1D5D6 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5d7 u1D5D7 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5d8 u1D5D8 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5d9 u1D5D9 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5da u1D5DA 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5db u1D5DB 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5dc u1D5DC 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5dd u1D5DD 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5de u1D5DE 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5df u1D5DF 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e0 u1D5E0 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e1 u1D5E1 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e2 u1D5E2 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e3 u1D5E3 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e4 u1D5E4 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e5 u1D5E5 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e6 u1D5E6 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e7 u1D5E7 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e8 u1D5E8 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e9 u1D5E9 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5ea u1D5EA 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5eb u1D5EB 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5ec u1D5EC 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5ed u1D5ED 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5ee u1D5EE 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5ef u1D5EF 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f0 u1D5F0 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f1 u1D5F1 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f2 u1D5F2 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f3 u1D5F3 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f4 u1D5F4 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f5 u1D5F5 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f6 u1D5F6 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f7 u1D5F7 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f8 u1D5F8 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f9 u1D5F9 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5fa u1D5FA 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5fb u1D5FB 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5fc u1D5FC 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5fd u1D5FD 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5fe u1D5FE 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5ff u1D5FF 2.23 (Sans Bold, Sans Condensed Bold) +U+1d600 u1D600 2.23 (Sans Bold, Sans Condensed Bold) +U+1d601 u1D601 2.23 (Sans Bold, Sans Condensed Bold) +U+1d602 u1D602 2.23 (Sans Bold, Sans Condensed Bold) +U+1d603 u1D603 2.23 (Sans Bold, Sans Condensed Bold) +U+1d604 u1D604 2.23 (Sans Bold, Sans Condensed Bold) +U+1d605 u1D605 2.23 (Sans Bold, Sans Condensed Bold) +U+1d606 u1D606 2.23 (Sans Bold, Sans Condensed Bold) +U+1d607 u1D607 2.23 (Sans Bold, Sans Condensed Bold) +U+1d608 u1D608 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d609 u1D609 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d60a u1D60A 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d60b u1D60B 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d60c u1D60C 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d60d u1D60D 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d60e u1D60E 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d60f u1D60F 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d610 u1D610 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d611 u1D611 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d612 u1D612 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d613 u1D613 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d614 u1D614 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d615 u1D615 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d616 u1D616 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d617 u1D617 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d618 u1D618 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d619 u1D619 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d61a u1D61A 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d61b u1D61B 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d61c u1D61C 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d61d u1D61D 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d61e u1D61E 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d61f u1D61F 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d620 u1D620 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d621 u1D621 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d622 u1D622 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d623 u1D623 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d624 u1D624 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d625 u1D625 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d626 u1D626 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d627 u1D627 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d628 u1D628 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d629 u1D629 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d62a u1D62A 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d62b u1D62B 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d62c u1D62C 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d62d u1D62D 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d62e u1D62E 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d62f u1D62F 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d630 u1D630 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d631 u1D631 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d632 u1D632 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d633 u1D633 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d634 u1D634 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d635 u1D635 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d636 u1D636 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d637 u1D637 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d638 u1D638 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d639 u1D639 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d63a u1D63A 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d63b u1D63B 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d63c u1D63C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d63d u1D63D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d63e u1D63E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d63f u1D63F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d640 u1D640 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d641 u1D641 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d642 u1D642 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d643 u1D643 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d644 u1D644 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d645 u1D645 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d646 u1D646 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d647 u1D647 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d648 u1D648 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d649 u1D649 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64a u1D64A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64b u1D64B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64c u1D64C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64d u1D64D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64e u1D64E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64f u1D64F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d650 u1D650 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d651 u1D651 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d652 u1D652 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d653 u1D653 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d654 u1D654 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d655 u1D655 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d656 u1D656 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d657 u1D657 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d658 u1D658 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d659 u1D659 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65a u1D65A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65b u1D65B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65c u1D65C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65d u1D65D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65e u1D65E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65f u1D65F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d660 u1D660 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d661 u1D661 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d662 u1D662 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d663 u1D663 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d664 u1D664 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d665 u1D665 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d666 u1D666 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d667 u1D667 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d668 u1D668 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d669 u1D669 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66a u1D66A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66b u1D66B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66c u1D66C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66d u1D66D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66e u1D66E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66f u1D66F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d670 u1D670 2.23 (Sans Mono) +U+1d671 u1D671 2.23 (Sans Mono) +U+1d672 u1D672 2.23 (Sans Mono) +U+1d673 u1D673 2.23 (Sans Mono) +U+1d674 u1D674 2.23 (Sans Mono) +U+1d675 u1D675 2.23 (Sans Mono) +U+1d676 u1D676 2.23 (Sans Mono) +U+1d677 u1D677 2.23 (Sans Mono) +U+1d678 u1D678 2.23 (Sans Mono) +U+1d679 u1D679 2.23 (Sans Mono) +U+1d67a u1D67A 2.23 (Sans Mono) +U+1d67b u1D67B 2.23 (Sans Mono) +U+1d67c u1D67C 2.23 (Sans Mono) +U+1d67d u1D67D 2.23 (Sans Mono) +U+1d67e u1D67E 2.23 (Sans Mono) +U+1d67f u1D67F 2.23 (Sans Mono) +U+1d680 u1D680 2.23 (Sans Mono) +U+1d681 u1D681 2.23 (Sans Mono) +U+1d682 u1D682 2.23 (Sans Mono) +U+1d683 u1D683 2.23 (Sans Mono) +U+1d684 u1D684 2.23 (Sans Mono) +U+1d685 u1D685 2.23 (Sans Mono) +U+1d686 u1D686 2.23 (Sans Mono) +U+1d687 u1D687 2.23 (Sans Mono) +U+1d688 u1D688 2.23 (Sans Mono) +U+1d689 u1D689 2.23 (Sans Mono) +U+1d68a u1D68A 2.23 (Sans Mono) +U+1d68b u1D68B 2.23 (Sans Mono) +U+1d68c u1D68C 2.23 (Sans Mono) +U+1d68d u1D68D 2.23 (Sans Mono) +U+1d68e u1D68E 2.23 (Sans Mono) +U+1d68f u1D68F 2.23 (Sans Mono) +U+1d690 u1D690 2.23 (Sans Mono) +U+1d691 u1D691 2.23 (Sans Mono) +U+1d692 u1D692 2.23 (Sans Mono) +U+1d693 u1D693 2.23 (Sans Mono) +U+1d694 u1D694 2.23 (Sans Mono) +U+1d695 u1D695 2.23 (Sans Mono) +U+1d696 u1D696 2.23 (Sans Mono) +U+1d697 u1D697 2.23 (Sans Mono) +U+1d698 u1D698 2.23 (Sans Mono) +U+1d699 u1D699 2.23 (Sans Mono) +U+1d69a u1D69A 2.23 (Sans Mono) +U+1d69b u1D69B 2.23 (Sans Mono) +U+1d69c u1D69C 2.23 (Sans Mono) +U+1d69d u1D69D 2.23 (Sans Mono) +U+1d69e u1D69E 2.23 (Sans Mono) +U+1d69f u1D69F 2.23 (Sans Mono) +U+1d6a0 u1D6A0 2.23 (Sans Mono) +U+1d6a1 u1D6A1 2.23 (Sans Mono) +U+1d6a2 u1D6A2 2.23 (Sans Mono) +U+1d6a3 u1D6A3 2.23 (Sans Mono) +U+1d6a4 u1D6A4 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6a5 u1D6A5 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6a8 u1D6A8 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6a9 u1D6A9 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6aa u1D6AA 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ab u1D6AB 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ac u1D6AC 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ad u1D6AD 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ae u1D6AE 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6af u1D6AF 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b0 u1D6B0 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b1 u1D6B1 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b2 u1D6B2 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b3 u1D6B3 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b4 u1D6B4 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b5 u1D6B5 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b6 u1D6B6 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b7 u1D6B7 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b8 u1D6B8 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b9 u1D6B9 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ba u1D6BA 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6bb u1D6BB 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6bc u1D6BC 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6bd u1D6BD 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6be u1D6BE 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6bf u1D6BF 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c0 u1D6C0 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c1 u1D6C1 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c2 u1D6C2 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c3 u1D6C3 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c4 u1D6C4 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c5 u1D6C5 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c6 u1D6C6 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c7 u1D6C7 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c8 u1D6C8 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c9 u1D6C9 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ca u1D6CA 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6cb u1D6CB 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6cc u1D6CC 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6cd u1D6CD 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ce u1D6CE 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6cf u1D6CF 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d0 u1D6D0 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d1 u1D6D1 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d2 u1D6D2 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d3 u1D6D3 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d4 u1D6D4 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d5 u1D6D5 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d6 u1D6D6 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d7 u1D6D7 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d8 u1D6D8 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d9 u1D6D9 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6da u1D6DA 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6db u1D6DB 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6dc u1D6DC 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6dd u1D6DD 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6de u1D6DE 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6df u1D6DF 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6e0 u1D6E0 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6e1 u1D6E1 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6e2 u1D6E2 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6e3 u1D6E3 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6e4 u1D6E4 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6e5 u1D6E5 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6e6 u1D6E6 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6e7 u1D6E7 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6e8 u1D6E8 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6e9 u1D6E9 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6ea u1D6EA 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6eb u1D6EB 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6ec u1D6EC 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6ed u1D6ED 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6ee u1D6EE 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6ef u1D6EF 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6f0 u1D6F0 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6f1 u1D6F1 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6f2 u1D6F2 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6f3 u1D6F3 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6f4 u1D6F4 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6f5 u1D6F5 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6f6 u1D6F6 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6f7 u1D6F7 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6f8 u1D6F8 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6f9 u1D6F9 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6fa u1D6FA 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6fb u1D6FB 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6fc u1D6FC 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6fd u1D6FD 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6fe u1D6FE 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d6ff u1D6FF 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d700 u1D700 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d701 u1D701 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d702 u1D702 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d703 u1D703 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d704 u1D704 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d705 u1D705 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d706 u1D706 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d707 u1D707 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d708 u1D708 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d709 u1D709 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d70a u1D70A 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d70b u1D70B 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d70c u1D70C 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d70d u1D70D 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d70e u1D70E 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d70f u1D70F 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d710 u1D710 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d711 u1D711 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d712 u1D712 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d713 u1D713 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d714 u1D714 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d715 u1D715 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d716 u1D716 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d717 u1D717 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d718 u1D718 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d719 u1D719 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d71a u1D71A 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d71b u1D71B 2.23 (Serif Italic, Serif Italic Condensed) 2.31 (Serif Condensed Italic) +U+1d71c u1D71C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d71d u1D71D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d71e u1D71E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d71f u1D71F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d720 u1D720 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d721 u1D721 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d722 u1D722 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d723 u1D723 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d724 u1D724 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d725 u1D725 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d726 u1D726 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d727 u1D727 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d728 u1D728 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d729 u1D729 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72a u1D72A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72b u1D72B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72c u1D72C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72d u1D72D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72e u1D72E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72f u1D72F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d730 u1D730 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d731 u1D731 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d732 u1D732 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d733 u1D733 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d734 u1D734 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d735 u1D735 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d736 u1D736 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d737 u1D737 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d738 u1D738 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d739 u1D739 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73a u1D73A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73b u1D73B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73c u1D73C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73d u1D73D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73e u1D73E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73f u1D73F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d740 u1D740 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d741 u1D741 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d742 u1D742 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d743 u1D743 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d744 u1D744 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d745 u1D745 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d746 u1D746 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d747 u1D747 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d748 u1D748 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d749 u1D749 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74a u1D74A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74b u1D74B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74c u1D74C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74d u1D74D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74e u1D74E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74f u1D74F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d750 u1D750 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d751 u1D751 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d752 u1D752 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d753 u1D753 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d754 u1D754 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d755 u1D755 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d756 u1D756 2.23 (Sans Bold, Sans Condensed Bold) +U+1d757 u1D757 2.23 (Sans Bold, Sans Condensed Bold) +U+1d758 u1D758 2.23 (Sans Bold, Sans Condensed Bold) +U+1d759 u1D759 2.23 (Sans Bold, Sans Condensed Bold) +U+1d75a u1D75A 2.23 (Sans Bold, Sans Condensed Bold) +U+1d75b u1D75B 2.23 (Sans Bold, Sans Condensed Bold) +U+1d75c u1D75C 2.23 (Sans Bold, Sans Condensed Bold) +U+1d75d u1D75D 2.23 (Sans Bold, Sans Condensed Bold) +U+1d75e u1D75E 2.23 (Sans Bold, Sans Condensed Bold) +U+1d75f u1D75F 2.23 (Sans Bold, Sans Condensed Bold) +U+1d760 u1D760 2.23 (Sans Bold, Sans Condensed Bold) +U+1d761 u1D761 2.23 (Sans Bold, Sans Condensed Bold) +U+1d762 u1D762 2.23 (Sans Bold, Sans Condensed Bold) +U+1d763 u1D763 2.23 (Sans Bold, Sans Condensed Bold) +U+1d764 u1D764 2.23 (Sans Bold, Sans Condensed Bold) +U+1d765 u1D765 2.23 (Sans Bold, Sans Condensed Bold) +U+1d766 u1D766 2.23 (Sans Bold, Sans Condensed Bold) +U+1d767 u1D767 2.23 (Sans Bold, Sans Condensed Bold) +U+1d768 u1D768 2.23 (Sans Bold, Sans Condensed Bold) +U+1d769 u1D769 2.23 (Sans Bold, Sans Condensed Bold) +U+1d76a u1D76A 2.23 (Sans Bold, Sans Condensed Bold) +U+1d76b u1D76B 2.23 (Sans Bold, Sans Condensed Bold) +U+1d76c u1D76C 2.23 (Sans Bold, Sans Condensed Bold) +U+1d76d u1D76D 2.23 (Sans Bold, Sans Condensed Bold) +U+1d76e u1D76E 2.23 (Sans Bold, Sans Condensed Bold) +U+1d76f u1D76F 2.23 (Sans Bold, Sans Condensed Bold) +U+1d770 u1D770 2.23 (Sans Bold, Sans Condensed Bold) +U+1d771 u1D771 2.23 (Sans Bold, Sans Condensed Bold) +U+1d772 u1D772 2.23 (Sans Bold, Sans Condensed Bold) +U+1d773 u1D773 2.23 (Sans Bold, Sans Condensed Bold) +U+1d774 u1D774 2.23 (Sans Bold, Sans Condensed Bold) +U+1d775 u1D775 2.23 (Sans Bold, Sans Condensed Bold) +U+1d776 u1D776 2.23 (Sans Bold, Sans Condensed Bold) +U+1d777 u1D777 2.23 (Sans Bold, Sans Condensed Bold) +U+1d778 u1D778 2.23 (Sans Bold, Sans Condensed Bold) +U+1d779 u1D779 2.23 (Sans Bold, Sans Condensed Bold) +U+1d77a u1D77A 2.23 (Sans Bold, Sans Condensed Bold) +U+1d77b u1D77B 2.23 (Sans Bold, Sans Condensed Bold) +U+1d77c u1D77C 2.23 (Sans Bold, Sans Condensed Bold) +U+1d77d u1D77D 2.23 (Sans Bold, Sans Condensed Bold) +U+1d77e u1D77E 2.23 (Sans Bold, Sans Condensed Bold) +U+1d77f u1D77F 2.23 (Sans Bold, Sans Condensed Bold) +U+1d780 u1D780 2.23 (Sans Bold, Sans Condensed Bold) +U+1d781 u1D781 2.23 (Sans Bold, Sans Condensed Bold) +U+1d782 u1D782 2.23 (Sans Bold, Sans Condensed Bold) +U+1d783 u1D783 2.23 (Sans Bold, Sans Condensed Bold) +U+1d784 u1D784 2.23 (Sans Bold, Sans Condensed Bold) +U+1d785 u1D785 2.23 (Sans Bold, Sans Condensed Bold) +U+1d786 u1D786 2.23 (Sans Bold, Sans Condensed Bold) +U+1d787 u1D787 2.23 (Sans Bold, Sans Condensed Bold) +U+1d788 u1D788 2.23 (Sans Bold, Sans Condensed Bold) +U+1d789 u1D789 2.23 (Sans Bold, Sans Condensed Bold) +U+1d78a u1D78A 2.23 (Sans Bold, Sans Condensed Bold) +U+1d78b u1D78B 2.23 (Sans Bold, Sans Condensed Bold) +U+1d78c u1D78C 2.23 (Sans Bold, Sans Condensed Bold) +U+1d78d u1D78D 2.23 (Sans Bold, Sans Condensed Bold) +U+1d78e u1D78E 2.23 (Sans Bold, Sans Condensed Bold) +U+1d78f u1D78F 2.23 (Sans Bold, Sans Condensed Bold) +U+1d790 u1D790 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d791 u1D791 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d792 u1D792 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d793 u1D793 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d794 u1D794 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d795 u1D795 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d796 u1D796 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d797 u1D797 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d798 u1D798 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d799 u1D799 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79a u1D79A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79b u1D79B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79c u1D79C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79d u1D79D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79e u1D79E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79f u1D79F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a0 u1D7A0 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a1 u1D7A1 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a2 u1D7A2 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a3 u1D7A3 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a4 u1D7A4 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a5 u1D7A5 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a6 u1D7A6 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a7 u1D7A7 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a8 u1D7A8 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a9 u1D7A9 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7aa u1D7AA 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ab u1D7AB 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ac u1D7AC 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ad u1D7AD 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ae u1D7AE 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7af u1D7AF 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b0 u1D7B0 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b1 u1D7B1 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b2 u1D7B2 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b3 u1D7B3 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b4 u1D7B4 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b5 u1D7B5 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b6 u1D7B6 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b7 u1D7B7 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b8 u1D7B8 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b9 u1D7B9 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ba u1D7BA 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7bb u1D7BB 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7bc u1D7BC 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7bd u1D7BD 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7be u1D7BE 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7bf u1D7BF 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c0 u1D7C0 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c1 u1D7C1 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c2 u1D7C2 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c3 u1D7C3 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c4 u1D7C4 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c5 u1D7C5 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c6 u1D7C6 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c7 u1D7C7 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c8 u1D7C8 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c9 u1D7C9 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ca u1D7CA 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7cb u1D7CB 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7ce u1D7CE 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7cf u1D7CF 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d0 u1D7D0 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d1 u1D7D1 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d2 u1D7D2 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d3 u1D7D3 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d4 u1D7D4 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d5 u1D7D5 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d6 u1D7D6 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d7 u1D7D7 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d8 u1D7D8 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7d9 u1D7D9 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7da u1D7DA 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7db u1D7DB 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7dc u1D7DC 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7dd u1D7DD 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7de u1D7DE 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7df u1D7DF 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7e0 u1D7E0 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7e1 u1D7E1 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7e2 u1D7E2 2.23 (Sans, Sans Condensed) +U+1d7e3 u1D7E3 2.23 (Sans, Sans Condensed) +U+1d7e4 u1D7E4 2.23 (Sans, Sans Condensed) +U+1d7e5 u1D7E5 2.23 (Sans, Sans Condensed) +U+1d7e6 u1D7E6 2.23 (Sans, Sans Condensed) +U+1d7e7 u1D7E7 2.23 (Sans, Sans Condensed) +U+1d7e8 u1D7E8 2.23 (Sans, Sans Condensed) +U+1d7e9 u1D7E9 2.23 (Sans, Sans Condensed) +U+1d7ea u1D7EA 2.23 (Sans, Sans Condensed) +U+1d7eb u1D7EB 2.23 (Sans, Sans Condensed) +U+1d7ec u1D7EC 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7ed u1D7ED 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7ee u1D7EE 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7ef u1D7EF 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f0 u1D7F0 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f1 u1D7F1 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f2 u1D7F2 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f3 u1D7F3 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f4 u1D7F4 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f5 u1D7F5 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f6 u1D7F6 2.23 (Sans Mono) +U+1d7f7 u1D7F7 2.23 (Sans Mono) +U+1d7f8 u1D7F8 2.23 (Sans Mono) +U+1d7f9 u1D7F9 2.23 (Sans Mono) +U+1d7fa u1D7FA 2.23 (Sans Mono) +U+1d7fb u1D7FB 2.23 (Sans Mono) +U+1d7fc u1D7FC 2.23 (Sans Mono) +U+1d7fd u1D7FD 2.23 (Sans Mono) +U+1d7fe u1D7FE 2.23 (Sans Mono) +U+1d7ff u1D7FF 2.23 (Sans Mono) diff --git a/media/fonts/doc/DejaVu_unicover.txt b/media/fonts/doc/DejaVu_unicover.txt index bce0681c88d..81ce70338e9 100644 --- a/media/fonts/doc/DejaVu_unicover.txt +++ b/media/fonts/doc/DejaVu_unicover.txt @@ -1,5 +1,5 @@ This is the Unicode coverage file for DejaVu fonts -($Id$) +($Id: unicover.txt 2383 2010-05-27 09:23:21Z ben_laenen $) Control and similar characters are discounted from totals. @@ -7,133 +7,161 @@ Control and similar characters are discounted from totals. U+0000 Basic Latin 100% (95/95) 100% (95/95) 100% (95/95) U+0080 Latin-1 Supplement 100% (96/96) 100% (96/96) 100% (96/96) U+0100 Latin Extended-A 100% (128/128) 100% (128/128) 100% (128/128) -U+0180 Latin Extended-B 100% (208/208) 90% (189/208) 78% (164/208) +U+0180 Latin Extended-B 100% (208/208) 91% (191/208) 86% (179/208) U+0250 IPA Extensions 100% (96/96) 100% (96/96) 100% (96/96) -U+02b0 Spacing Modifier Letters 78% (63/80) 56% (45/80) 57% (46/80) -U+0300 Combining Diacritical Marks 82% (92/112) 60% (68/112) 59% (67/112) -U+0370 Greek and Coptic 100% (127/127) 86% (110/127) 86% (110/127) -U+0400 Cyrillic 100% (255/255) 76% (194/255) 66% (170/255) -U+0500 Cyrillic Supplement 100% (20/20) (0/20) (0/20) +U+02b0 Spacing Modifier Letters 78% (63/80) 56% (45/80) 60% (48/80) +U+0300 Combining Diacritical Marks 83% (93/112) 60% (68/112) 59% (67/112) +U+0370 Greek and Coptic 100% (134/134) 85% (115/134) 82% (110/134) +U+0400 Cyrillic 100% (256/256) 78% (200/256) 70% (180/256) +U+0500 Cyrillic Supplement 94% (36/38) 26% (10/38) 15% (6/38) U+0530 Armenian 100% (86/86) (0/86) (0/86) U+0590 Hebrew 62% (54/87) (0/87) (0/87) -U+0600 Arabic 47% (111/235) (0/235) 46% (109/235) +U+0600 Arabic 64% (161/250) (0/250) 39% (99/250) U+0700 Syriac (0/77) (0/77) (0/77) -U+0750 Arabic Supplement (0/30) (0/30) (0/30) +U+0750 Arabic Supplement (0/48) (0/48) (0/48) U+0780 Thaana (0/50) (0/50) (0/50) U+07c0 NKo 91% (54/59) (0/59) (0/59) -U+0900 Devanagari (0/111) (0/111) (0/111) -U+0980 Bengali (0/91) (0/91) (0/91) -U+0a00 Gurmukhi (0/77) (0/77) (0/77) +U+0800 Samaritan (0/61) (0/61) (0/61) +U+0900 Devanagari (0/117) (0/117) (0/117) +U+0980 Bengali (0/92) (0/92) (0/92) +U+0a00 Gurmukhi (0/79) (0/79) (0/79) U+0a80 Gujarati (0/83) (0/83) (0/83) -U+0b00 Oriya (0/81) (0/81) (0/81) -U+0b80 Tamil (0/71) (0/71) (0/71) -U+0c00 Telugu (0/80) (0/80) (0/80) +U+0b00 Oriya (0/84) (0/84) (0/84) +U+0b80 Tamil (0/72) (0/72) (0/72) +U+0c00 Telugu (0/93) (0/93) (0/93) U+0c80 Kannada (0/86) (0/86) (0/86) -U+0d00 Malayalam (0/78) (0/78) (0/78) +U+0d00 Malayalam (0/95) (0/95) (0/95) U+0d80 Sinhala (0/80) (0/80) (0/80) U+0e00 Thai 1% (1/87) (0/87) (0/87) U+0e80 Lao 100% (65/65) (0/65) 70% (46/65) -U+0f00 Tibetan (0/195) (0/195) (0/195) -U+1000 Myanmar (0/78) (0/78) (0/78) +U+0f00 Tibetan (0/205) (0/205) (0/205) +U+1000 Myanmar (0/160) (0/160) (0/160) U+10a0 Georgian 100% (83/83) 100% (83/83) 54% (45/83) -U+1100 Hangul Jamo (0/240) (0/240) (0/240) +U+1100 Hangul Jamo (0/256) (0/256) (0/256) U+1200 Ethiopic (0/356) (0/356) (0/356) U+1380 Ethiopic Supplement (0/26) (0/26) (0/26) U+13a0 Cherokee (0/85) (0/85) (0/85) -U+1400 Unified Canadian Aboriginal Syllabics 64% (404/630) (0/630) (0/630) -U+1680 Ogham (0/29) (0/29) (0/29) +U+1400 Unified Canadian Aboriginal Syllabics 63% (404/640) (0/640) (0/640) +U+1680 Ogham 100% (29/29) (0/29) (0/29) U+16a0 Runic (0/81) (0/81) (0/81) U+1700 Tagalog (0/20) (0/20) (0/20) U+1720 Hanunoo (0/23) (0/23) (0/23) U+1740 Buhid (0/20) (0/20) (0/20) U+1760 Tagbanwa (0/18) (0/18) (0/18) U+1780 Khmer (0/114) (0/114) (0/114) -U+1800 Mongolian (0/155) (0/155) (0/155) +U+1800 Mongolian (0/156) (0/156) (0/156) +U+18b0 Unified Canadian Aboriginal Syllabics Extended (0/70) (0/70) (0/70) U+1900 Limbu (0/66) (0/66) (0/66) U+1950 Tai Le (0/35) (0/35) (0/35) -U+1980 New Tai Lue (0/80) (0/80) (0/80) +U+1980 New Tai Lue (0/83) (0/83) (0/83) U+19e0 Khmer Symbols (0/32) (0/32) (0/32) U+1a00 Buginese (0/30) (0/30) (0/30) +U+1a20 Tai Tham (0/127) (0/127) (0/127) U+1b00 Balinese (0/121) (0/121) (0/121) +U+1b80 Sundanese (0/55) (0/55) (0/55) +U+1c00 Lepcha (0/74) (0/74) (0/74) +U+1c50 Ol Chiki (0/48) (0/48) (0/48) +U+1cd0 Vedic Extensions (0/35) (0/35) (0/35) U+1d00 Phonetic Extensions 82% (105/128) 48% (62/128) 48% (62/128) U+1d80 Phonetic Extensions Supplement 59% (38/64) 57% (37/64) 57% (37/64) -U+1dc0 Combining Diacritical Marks Supplement 46% (6/13) (0/13) (0/13) -U+1e00 Latin Extended Additional 100% (246/246) 78% (192/246) 54% (134/246) +U+1dc0 Combining Diacritical Marks Supplement 14% (6/42) 14% (6/42) (0/42) +U+1e00 Latin Extended Additional 96% (248/256) 76% (196/256) 71% (182/256) U+1f00 Greek Extended 100% (233/233) 100% (233/233) 100% (233/233) -U+2000 General Punctuation 98% (104/106) 61% (65/106) 42% (45/106) +U+2000 General Punctuation 98% (105/107) 81% (87/107) 47% (51/107) U+2070 Superscripts and Subscripts 100% (34/34) 100% (34/34) 100% (34/34) -U+20a0 Currency Symbols 100% (22/22) 27% (6/22) 22% (5/22) -U+20d0 Combining Diacritical Marks for Symbols 12% (4/32) (0/32) (0/32) -U+2100 Letterlike Symbols 94% (75/79) 7% (6/79) 8% (7/79) -U+2150 Number Forms 100% (50/50) 26% (13/50) 26% (13/50) -U+2190 Arrows 100% (112/112) 3% (4/112) 100% (112/112) -U+2200 Mathematical Operators 95% (245/256) 11% (30/256) 56% (145/256) -U+2300 Miscellaneous Technical 27% (64/232) 6% (16/232) 50% (117/232) +U+20a0 Currency Symbols 88% (22/25) 24% (6/25) 88% (22/25) +U+20d0 Combining Diacritical Marks for Symbols 21% (7/33) (0/33) (0/33) +U+2100 Letterlike Symbols 93% (75/80) 40% (32/80) 21% (17/80) +U+2150 Number Forms 86% (50/58) 86% (50/58) 22% (13/58) +U+2190 Arrows 100% (112/112) 100% (112/112) 100% (112/112) +U+2200 Mathematical Operators 100% (256/256) 39% (100/256) 60% (155/256) +U+2300 Miscellaneous Technical 27% (64/233) 6% (16/233) 50% (117/233) U+2400 Control Pictures 5% (2/39) 2% (1/39) 2% (1/39) U+2440 Optical Character Recognition (0/11) (0/11) (0/11) U+2460 Enclosed Alphanumerics 6% (10/160) (0/160) (0/160) -U+2500 Box Drawing (0/128) (0/128) 100% (128/128) +U+2500 Box Drawing 100% (128/128) 100% (128/128) 100% (128/128) U+2580 Block Elements 100% (32/32) 100% (32/32) 100% (32/32) U+25a0 Geometric Shapes 100% (96/96) 100% (96/96) 100% (96/96) -U+2600 Miscellaneous Symbols 100% (176/176) 17% (30/176) 84% (149/176) -U+2700 Dingbats 100% (174/174) (0/174) 82% (144/174) -U+27c0 Miscellaneous Mathematical Symbols-A 17% (7/39) 7% (3/39) 7% (3/39) -U+27f0 Supplemental Arrows-A 100% (16/16) (0/16) (0/16) +U+2600 Miscellaneous Symbols 72% (182/250) 12% (30/250) 59% (149/250) +U+2700 Dingbats 99% (174/175) 0% (1/175) 82% (144/175) +U+27c0 Miscellaneous Mathematical Symbols-A 20% (9/44) 11% (5/44) 11% (5/44) +U+27f0 Supplemental Arrows-A 100% (16/16) 100% (16/16) (0/16) U+2800 Braille Patterns 100% (256/256) 100% (256/256) (0/256) -U+2900 Supplemental Arrows-B 4% (6/128) (0/128) (0/128) +U+2900 Supplemental Arrows-B 4% (6/128) 100% (128/128) (0/128) U+2980 Miscellaneous Mathematical Symbols-B 10% (13/128) 0% (1/128) 2% (3/128) U+2a00 Supplemental Mathematical Operators 28% (72/256) 1% (4/256) 0% (1/256) -U+2b00 Miscellaneous Symbols and Arrows 100% (31/31) 29% (9/31) 29% (9/31) +U+2b00 Miscellaneous Symbols and Arrows 40% (35/87) 31% (27/87) 10% (9/87) U+2c00 Glagolitic (0/94) (0/94) (0/94) -U+2c60 Latin Extended-C 100% (17/17) 52% (9/17) (0/17) -U+2c80 Coptic (0/114) (0/114) (0/114) -U+2d00 Georgian Supplement (0/38) (0/38) (0/38) +U+2c60 Latin Extended-C 96% (31/32) 71% (23/32) 43% (14/32) +U+2c80 Coptic (0/121) (0/121) (0/121) +U+2d00 Georgian Supplement (0/38) 100% (38/38) (0/38) U+2d30 Tifinagh 100% (55/55) (0/55) (0/55) U+2d80 Ethiopic Extended (0/79) (0/79) (0/79) -U+2e00 Supplemental Punctuation (0/26) (0/26) (0/26) +U+2de0 Cyrillic Extended-A (0/32) (0/32) (0/32) +U+2e00 Supplemental Punctuation 12% (6/50) 12% (6/50) 12% (6/50) U+2e80 CJK Radicals Supplement (0/115) (0/115) (0/115) U+2f00 Kangxi Radicals (0/214) (0/214) (0/214) U+2ff0 Ideographic Description Characters (0/12) (0/12) (0/12) U+3000 CJK Symbols and Punctuation (0/64) (0/64) (0/64) U+3040 Hiragana (0/93) (0/93) (0/93) U+30a0 Katakana (0/96) (0/96) (0/96) -U+3100 Bopomofo (0/40) (0/40) (0/40) +U+3100 Bopomofo (0/41) (0/41) (0/41) U+3130 Hangul Compatibility Jamo (0/94) (0/94) (0/94) U+3190 Kanbun (0/16) (0/16) (0/16) U+31a0 Bopomofo Extended (0/24) (0/24) (0/24) -U+31c0 CJK Strokes (0/16) (0/16) (0/16) +U+31c0 CJK Strokes (0/36) (0/36) (0/36) U+31f0 Katakana Phonetic Extensions (0/16) (0/16) (0/16) -U+3200 Enclosed CJK Letters and Months (0/242) (0/242) (0/242) +U+3200 Enclosed CJK Letters and Months (0/254) (0/254) (0/254) U+3300 CJK Compatibility (0/256) (0/256) (0/256) U+3400 CJK Unified Ideographs Extension A (0/0) (0/0) (0/0) -U+4dc0 Yijing Hexagram Symbols (0/64) (0/64) (0/64) +U+4dc0 Yijing Hexagram Symbols 100% (64/64) (0/64) (0/64) U+4e00 CJK Unified Ideographs (0/0) (0/0) (0/0) U+a000 Yi Syllables (0/1165) (0/1165) (0/1165) U+a490 Yi Radicals (0/55) (0/55) (0/55) -U+a700 Modifier Tone Letters (0/27) (0/27) (0/27) -U+a720 Latin Extended-D (0/2) (0/2) (0/2) +U+a4d0 Lisu (0/48) (0/48) (0/48) +U+a500 Vai (0/300) (0/300) (0/300) +U+a640 Cyrillic Extended-B 39% (31/78) 12% (10/78) (0/78) +U+a6a0 Bamum (0/88) (0/88) (0/88) +U+a700 Modifier Tone Letters 62% (20/32) 62% (20/32) 62% (20/32) +U+a720 Latin Extended-D 37% (43/114) 1% (2/114) 5% (6/114) U+a800 Syloti Nagri (0/44) (0/44) (0/44) +U+a830 Common Indic Number Forms (0/10) (0/10) (0/10) U+a840 Phags-pa (0/56) (0/56) (0/56) +U+a880 Saurashtra (0/81) (0/81) (0/81) +U+a8e0 Devanagari Extended (0/28) (0/28) (0/28) +U+a900 Kayah Li (0/48) (0/48) (0/48) +U+a930 Rejang (0/37) (0/37) (0/37) +U+a960 Hangul Jamo Extended-A (0/29) (0/29) (0/29) +U+a980 Javanese (0/91) (0/91) (0/91) +U+aa00 Cham (0/83) (0/83) (0/83) +U+aa60 Myanmar Extended-A (0/28) (0/28) (0/28) +U+aa80 Tai Viet (0/72) (0/72) (0/72) +U+abc0 Meetei Mayek (0/56) (0/56) (0/56) U+ac00 Hangul Syllables (0/0) (0/0) (0/0) +U+d7b0 Hangul Jamo Extended-B (0/72) (0/72) (0/72) U+d800 High Surrogates (0/0) (0/0) (0/0) U+db80 High Private Use Surrogates (0/0) (0/0) (0/0) U+dc00 Low Surrogates (0/0) (0/0) (0/0) U+e000 Private Use Area (0/0) (0/0) (0/0) -U+f900 CJK Compatibility Ideographs (0/467) (0/467) (0/467) +U+f900 CJK Compatibility Ideographs (0/470) (0/470) (0/470) U+fb00 Alphabetic Presentation Forms 100% (58/58) 12% (7/58) 3% (2/58) -U+fb50 Arabic Presentation Forms-A 11% (70/595) (0/595) 12% (72/595) +U+fb50 Arabic Presentation Forms-A 16% (98/595) (0/595) 12% (72/595) U+fe00 Variation Selectors 100% (16/16) 100% (16/16) (0/16) U+fe10 Vertical Forms (0/10) (0/10) (0/10) -U+fe20 Combining Half Marks (0/4) (0/4) (0/4) +U+fe20 Combining Half Marks 57% (4/7) (0/7) (0/7) U+fe30 CJK Compatibility Forms (0/32) (0/32) (0/32) U+fe50 Small Form Variants (0/26) (0/26) (0/26) U+fe70 Arabic Presentation Forms-B 100% (141/141) (0/141) 100% (141/141) U+ff00 Halfwidth and Fullwidth Forms (0/225) (0/225) (0/225) -U+fff0 Specials 20% (1/5) 20% (1/5) 20% (1/5) +U+fff0 Specials 100% (5/5) 100% (5/5) 100% (5/5) U+10000 Linear B Syllabary (0/88) (0/88) (0/88) U+10080 Linear B Ideograms (0/123) (0/123) (0/123) U+10100 Aegean Numbers (0/57) (0/57) (0/57) U+10140 Ancient Greek Numbers (0/75) (0/75) (0/75) +U+10190 Ancient Symbols (0/12) (0/12) (0/12) +U+101d0 Phaistos Disc (0/46) (0/46) (0/46) +U+10280 Lycian (0/29) (0/29) (0/29) +U+102a0 Carian (0/49) (0/49) (0/49) U+10300 Old Italic (0/35) (0/35) (0/35) U+10330 Gothic (0/27) (0/27) (0/27) U+10380 Ugaritic (0/31) (0/31) (0/31) @@ -142,17 +170,32 @@ U+10400 Deseret (0/80) (0/80) U+10450 Shavian (0/48) (0/48) (0/48) U+10480 Osmanya (0/40) (0/40) (0/40) U+10800 Cypriot Syllabary (0/55) (0/55) (0/55) -U+10900 Phoenician (0/27) (0/27) (0/27) +U+10840 Imperial Aramaic (0/31) (0/31) (0/31) +U+10900 Phoenician (0/29) (0/29) (0/29) +U+10920 Lydian (0/27) (0/27) (0/27) U+10a00 Kharoshthi (0/65) (0/65) (0/65) +U+10a60 Old South Arabian (0/32) (0/32) (0/32) +U+10b00 Avestan (0/61) (0/61) (0/61) +U+10b40 Inscriptional Parthian (0/30) (0/30) (0/30) +U+10b60 Inscriptional Pahlavi (0/27) (0/27) (0/27) +U+10c00 Old Turkic (0/73) (0/73) (0/73) +U+10e60 Rumi Numeral Symbols (0/31) (0/31) (0/31) +U+11080 Kaithi (0/66) (0/66) (0/66) U+12000 Cuneiform (0/879) (0/879) (0/879) U+12400 Cuneiform Numbers and Punctuation (0/103) (0/103) (0/103) +U+13000 Egyptian Hieroglyphs (0/1071) (0/1071) (0/1071) U+1d000 Byzantine Musical Symbols (0/246) (0/246) (0/246) -U+1d100 Musical Symbols (0/219) (0/219) (0/219) +U+1d100 Musical Symbols (0/220) (0/220) (0/220) U+1d200 Ancient Greek Musical Notation (0/70) (0/70) (0/70) U+1d300 Tai Xuan Jing Symbols 100% (87/87) (0/87) (0/87) U+1d360 Counting Rod Numerals (0/18) (0/18) (0/18) -U+1d400 Mathematical Alphanumeric Symbols 4% (45/996) (0/996) (0/996) +U+1d400 Mathematical Alphanumeric Symbols 11% (117/996) 5% (55/996) 6% (62/996) +U+1f000 Mahjong Tiles (0/44) (0/44) (0/44) +U+1f030 Domino Tiles (0/100) (0/100) (0/100) +U+1f100 Enclosed Alphanumeric Supplement (0/63) (0/63) (0/63) +U+1f200 Enclosed Ideographic Supplement (0/44) (0/44) (0/44) U+20000 CJK Unified Ideographs Extension B (0/0) (0/0) (0/0) +U+2a700 CJK Unified Ideographs Extension C (0/0) (0/0) (0/0) U+2f800 CJK Compatibility Ideographs Supplement (0/542) (0/542) (0/542) U+e0000 Tags (0/98) (0/98) (0/98) U+e0100 Variation Selectors Supplement (0/240) (0/240) (0/240) diff --git a/media/fonts/tahoma.ttf b/media/fonts/tahoma.ttf index efc75d32e2c..ca5ab1b9042 100644 Binary files a/media/fonts/tahoma.ttf and b/media/fonts/tahoma.ttf differ diff --git a/media/fonts/tahomabd.ttf b/media/fonts/tahomabd.ttf index 3daab9dfbbb..afa2d39756a 100644 Binary files a/media/fonts/tahomabd.ttf and b/media/fonts/tahomabd.ttf differ diff --git a/ntoskrnl/CMakeLists.txt b/ntoskrnl/CMakeLists.txt index 104a181c20d..a57f62ec68e 100644 --- a/ntoskrnl/CMakeLists.txt +++ b/ntoskrnl/CMakeLists.txt @@ -184,26 +184,23 @@ list(APPEND SOURCE mm/ARM3/pfnlist.c mm/ARM3/pool.c mm/ARM3/procsup.c + mm/ARM3/section.c mm/ARM3/sysldr.c mm/ARM3/syspte.c mm/ARM3/vadnode.c mm/ARM3/virtual.c + mm/ARM3/zeropage.c mm/anonmem.c mm/balance.c mm/freelist.c mm/marea.c mm/mmfault.c mm/mminit.c - mm/mpw.c mm/pagefile.c mm/pageop.c - mm/pe.c - mm/ppool.c - mm/procsup.c mm/region.c mm/rmap.c mm/section.c - mm/virtual.c ob/obdir.c ob/obhandle.c ob/obinit.c diff --git a/ntoskrnl/cc/copy.c b/ntoskrnl/cc/copy.c index bcc24387efb..8e19ba82d36 100644 --- a/ntoskrnl/cc/copy.c +++ b/ntoskrnl/cc/copy.c @@ -29,24 +29,25 @@ ULONG CcFastReadResourceMiss; /* FUNCTIONS *****************************************************************/ +VOID +NTAPI +MiZeroPhysicalPage( + IN PFN_NUMBER PageFrameIndex +); + VOID NTAPI CcInitCacheZeroPage(VOID) { NTSTATUS Status; - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, &CcZeroPage); + Status = MmRequestPageMemoryConsumer(MC_SYSTEM, TRUE, &CcZeroPage); if (!NT_SUCCESS(Status)) { DbgPrint("Can't allocate CcZeroPage.\n"); KeBugCheck(CACHE_MANAGER); } - Status = MiZeroPage(CcZeroPage); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Can't zero out CcZeroPage.\n"); - KeBugCheck(CACHE_MANAGER); - } + MiZeroPhysicalPage(CcZeroPage); } NTSTATUS diff --git a/ntoskrnl/cc/view.c b/ntoskrnl/cc/view.c index a7153ed79d0..fcdefc4d032 100644 --- a/ntoskrnl/cc/view.c +++ b/ntoskrnl/cc/view.c @@ -189,6 +189,7 @@ CcRosFlushDirtyPages(ULONG Target, PULONG Count) (*Count) = 0; + KeEnterCriticalRegion(); KeAcquireGuardedMutex(&ViewLock); WriteCount[0] = WriteCount[1]; @@ -278,6 +279,7 @@ CcRosFlushDirtyPages(ULONG Target, PULONG Count) } KeReleaseGuardedMutex(&ViewLock); + KeLeaveCriticalRegion(); DPRINT("CcRosFlushDirtyPages() finished\n"); return(STATUS_SUCCESS); @@ -685,7 +687,7 @@ CcRosCreateCacheSegment(PBCB Bcb, MmLockAddressSpace(MmGetKernelAddressSpace()); current->BaseAddress = NULL; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_CACHE_SEGMENT, + 0, // nothing checks for cache_segment mareas, so set to 0 ¤t->BaseAddress, Bcb->CacheSegmentSize, PAGE_READWRITE, diff --git a/ntoskrnl/config/cmapi.c b/ntoskrnl/config/cmapi.c index 538c3e5b560..4db60d7a676 100644 --- a/ntoskrnl/config/cmapi.c +++ b/ntoskrnl/config/cmapi.c @@ -4,6 +4,7 @@ * FILE: ntoskrnl/config/cmapi.c * PURPOSE: Configuration Manager - Internal Registry APIs * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + * Eric Kohl */ /* INCLUDES ******************************************************************/ @@ -1814,3 +1815,86 @@ CmUnloadKey(IN PCM_KEY_CONTROL_BLOCK Kcb, UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; } + +ULONG +NTAPI +CmCountOpenSubKeys(IN PCM_KEY_CONTROL_BLOCK RootKcb, + IN BOOLEAN RemoveEmptyCacheEntries) +{ + PCM_KEY_HASH Entry; + PCM_KEY_CONTROL_BLOCK CachedKcb; + PCM_KEY_CONTROL_BLOCK ParentKcb; + USHORT ParentKeyCount; + USHORT j; + ULONG i; + ULONG SubKeys = 0; + + DPRINT("CmCountOpenSubKeys() called\n"); + + /* The root key is the only referenced key. There are no refereced sub keys. */ + if (RootKcb->RefCount == 1) + { + DPRINT("open sub keys: 0\n"); + return 0; + } + + /* Enumerate all hash lists */ + for (i = 0; i < CmpHashTableSize; i++) + { + /* Get the first cache entry */ + Entry = CmpCacheTable[i].Entry; + + /* Enumerate all cache entries */ + while (Entry) + { + /* Get the KCB of the current cache entry */ + CachedKcb = CONTAINING_RECORD(Entry, CM_KEY_CONTROL_BLOCK, KeyHash); + + /* Check keys only that are subkeys to our root key */ + if (CachedKcb->TotalLevels > RootKcb->TotalLevels) + { + /* Calculate the number of parent keys to the root key */ + ParentKeyCount = CachedKcb->TotalLevels - RootKcb->TotalLevels; + + /* Find a parent key that could be the root key */ + ParentKcb = CachedKcb; + for (j = 0; j < ParentKeyCount; j++) + { + ParentKcb = ParentKcb->ParentKcb; + } + + /* Check whether the parent is the root key */ + if (ParentKcb == RootKcb) + { + DPRINT("Found a sub key \n"); + DPRINT("RefCount = %u\n", CachedKcb->RefCount); + + if (CachedKcb->RefCount > 0) + { + /* Count the current hash entry if it is in use */ + SubKeys++; + } + else if ((CachedKcb->RefCount == 0) && (RemoveEmptyCacheEntries == TRUE)) + { + /* Remove the current key from the delayed close list */ + CmpRemoveFromDelayedClose(CachedKcb); + + /* Remove the current cache entry */ + CmpCleanUpKcbCacheWithLock(CachedKcb, TRUE); + + /* Restart, because the hash list has changed */ + Entry = CmpCacheTable[i].Entry; + continue; + } + } + } + + /* Get the next cache entry */ + Entry = Entry->NextHash; + } + } + + DPRINT("open sub keys: %u\n", SubKeys); + + return SubKeys; +} diff --git a/ntoskrnl/config/cmvalche.c b/ntoskrnl/config/cmvalche.c index 02bbbf9c29b..8c8c3618dd1 100644 --- a/ntoskrnl/config/cmvalche.c +++ b/ntoskrnl/config/cmvalche.c @@ -428,6 +428,7 @@ CmpQueryKeyValueData(IN PCM_KEY_CONTROL_BLOCK Kcb, /* Full key information */ case KeyValueFullInformation: + case KeyValueFullInformationAlign64: /* Check if this is a small key and compute key size */ IsSmall = CmpIsKeyValueSmall(&KeySize, @@ -447,9 +448,20 @@ CmpQueryKeyValueData(IN PCM_KEY_CONTROL_BLOCK Kcb, /* Calculate the data offset */ DataOffset = Size - KeySize; - /* Align the offset to 4 bytes */ - AlignedData = ALIGN_UP(DataOffset, ULONG); - +#ifdef _WIN64 + /* On 64-bit, always align to 8 bytes */ + AlignedData = ALIGN_UP(DataOffset, ULONGLONG); +#else + /* On 32-bit, align the offset to 4 or 8 bytes */ + if (KeyValueInformationClass == KeyValueFullInformationAlign64) + { + AlignedData = ALIGN_UP(DataOffset, ULONGLONG); + } + else + { + AlignedData = ALIGN_UP(DataOffset, ULONG); + } +#endif /* If alignment was required, we'll need more space */ if (AlignedData > DataOffset) Size += (AlignedData-DataOffset); } @@ -656,6 +668,7 @@ CmpQueryKeyValueData(IN PCM_KEY_CONTROL_BLOCK Kcb, default: /* We got some class that we don't support */ + DPRINT1("Caller requested unknown class: %lx\n", KeyValueInformationClass); *Status = STATUS_INVALID_PARAMETER; break; } diff --git a/ntoskrnl/config/ntapi.c b/ntoskrnl/config/ntapi.c index 4d4123d90be..0e76f7cd743 100644 --- a/ntoskrnl/config/ntapi.c +++ b/ntoskrnl/config/ntapi.c @@ -4,6 +4,7 @@ * FILE: ntoskrnl/config/cmapi.c * PURPOSE: Configuration Manager - Internal Registry APIs * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + * Eric Kohl */ /* INCLUDES ******************************************************************/ @@ -1015,8 +1016,91 @@ NTAPI NtQueryOpenSubKeys(IN POBJECT_ATTRIBUTES TargetKey, OUT PULONG HandleCount) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + KPROCESSOR_MODE PreviousMode; + PCM_KEY_BODY KeyBody = NULL; + HANDLE KeyHandle; + NTSTATUS Status; + + DPRINT("NtQueryOpenSubKeys()\n"); + + PAGED_CODE(); + + /* Get the processor mode */ + PreviousMode = KeGetPreviousMode(); + + if (PreviousMode != KernelMode) + { + /* Prepare to probe parameters */ + _SEH2_TRY + { + /* Probe target key */ + ProbeForRead(TargetKey, + sizeof(OBJECT_ATTRIBUTES), + sizeof(ULONG)); + + /* Probe handle count */ + ProbeForWriteUlong(HandleCount); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Return the exception code */ + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; + } + + /* Open a handle to the key */ + Status = ObOpenObjectByName(TargetKey, + CmpKeyObjectType, + PreviousMode, + NULL, + KEY_READ, + NULL, + &KeyHandle); + if (NT_SUCCESS(Status)) + { + /* Reference the key object */ + Status = ObReferenceObjectByHandle(KeyHandle, + KEY_READ, + CmpKeyObjectType, + PreviousMode, + (PVOID *)&KeyBody, + NULL); + + /* Close the handle */ + NtClose(KeyHandle); + } + + /* Fail, if the key object could not be referenced */ + if (!NT_SUCCESS(Status)) + return Status; + + /* Lock the registry exclusively */ + CmpLockRegistryExclusive(); + + /* Fail, if we did not open a hive root key */ + if (KeyBody->KeyControlBlock->KeyCell != + KeyBody->KeyControlBlock->KeyHive->BaseBlock->RootCell) + { + DPRINT("Error: Key is not a hive root key!\n"); + CmpUnlockRegistry(); + ObDereferenceObject(KeyBody); + return STATUS_INVALID_PARAMETER; + } + + /* Call the internal API */ + *HandleCount = CmCountOpenSubKeys(KeyBody->KeyControlBlock, + FALSE); + + /* Unlock the registry */ + CmpUnlockRegistry(); + + /* Dereference the key object */ + ObDereferenceObject(KeyBody); + + DPRINT("Done.\n"); + + return Status; } NTSTATUS diff --git a/ntoskrnl/ex/init.c b/ntoskrnl/ex/init.c index 18dd8aa2b10..5b448efbbf1 100644 --- a/ntoskrnl/ex/init.c +++ b/ntoskrnl/ex/init.c @@ -14,6 +14,14 @@ #include #include "ntstrsafe.h" +/* Temporary hack */ +BOOLEAN +NTAPI +MmArmInitSystem( + IN ULONG Phase, + IN PLOADER_PARAMETER_BLOCK LoaderBlock +); + typedef struct _INIT_BUFFER { WCHAR DebugBuffer[256]; @@ -1045,7 +1053,7 @@ ExpInitializeExecutive(IN ULONG Cpu, if (!ExInitSystem()) KeBugCheck(PHASE0_INITIALIZATION_FAILED); /* Initialize the memory manager at phase 0 */ - if (!MmInitSystem(0, LoaderBlock)) KeBugCheck(PHASE0_INITIALIZATION_FAILED); + if (!MmArmInitSystem(0, LoaderBlock)) KeBugCheck(PHASE0_INITIALIZATION_FAILED); /* Load boot symbols */ ExpLoadBootSymbols(LoaderBlock); @@ -1270,8 +1278,6 @@ ExpInitializeExecutive(IN ULONG Cpu, SharedUserData->ImageNumberHigh = IMAGE_FILE_MACHINE_ARCHITECTURE; } -extern BOOLEAN AllowPagedPool; - VOID NTAPI Phase1InitializationDiscard(IN PVOID Context) @@ -1579,7 +1585,7 @@ Phase1InitializationDiscard(IN PVOID Context) if (!MmInitSystem(1, LoaderBlock)) KeBugCheck(MEMORY1_INITIALIZATION_FAILED); /* Create NLS section */ - ExpInitNls(KeLoaderBlock); + ExpInitNls(LoaderBlock); /* Initialize Cache Views */ if (!CcInitializeCacheManager()) KeBugCheck(CACHE_INITIALIZATION_FAILED); @@ -1864,8 +1870,8 @@ Phase1InitializationDiscard(IN PVOID Context) NtClose(OptionHandle); } - /* Unmap Low memory, and initialize the MPW and Balancer Thread */ - MmInitSystem(2, LoaderBlock); + /* FIXME: This doesn't do anything for now */ + MmArmInitSystem(2, LoaderBlock); /* Update progress bar */ InbvUpdateProgressBar(80); @@ -1891,9 +1897,6 @@ Phase1InitializationDiscard(IN PVOID Context) /* Update progress bar */ InbvUpdateProgressBar(90); - /* Enough fun for now */ - AllowPagedPool = FALSE; - /* Launch initial process */ ProcessInfo = &InitBuffer->ProcessInfo; ExpLoadInitialProcess(InitBuffer, &ProcessParameters, &Environment); @@ -1951,5 +1954,5 @@ Phase1Initialization(IN PVOID Context) Phase1InitializationDiscard(Context); /* Jump into zero page thread */ - MmZeroPageThreadMain(NULL); + MmZeroPageThread(); } diff --git a/ntoskrnl/ex/sysinfo.c b/ntoskrnl/ex/sysinfo.c index ee585576967..483c92057ea 100644 --- a/ntoskrnl/ex/sysinfo.c +++ b/ntoskrnl/ex/sysinfo.c @@ -547,8 +547,7 @@ QSI_DEF(SystemPerformanceInformation) * Add up all the used "Committed" memory + pagefile. * Not sure this is right. 8^\ */ - Spi->CommittedPages = MiMemoryConsumers[MC_PPOOL].PagesUsed + - MiMemoryConsumers[MC_NPPOOL].PagesUsed + + Spi->CommittedPages = MiMemoryConsumers[MC_SYSTEM].PagesUsed + MiMemoryConsumers[MC_CACHE].PagesUsed + MiMemoryConsumers[MC_USER].PagesUsed + MiUsedSwapPages; @@ -574,10 +573,10 @@ QSI_DEF(SystemPerformanceInformation) Spi->MappedPagesWriteCount = 0; /* FIXME */ Spi->MappedWriteIoCount = 0; /* FIXME */ - Spi->PagedPoolPages = MiMemoryConsumers[MC_PPOOL].PagesUsed; + Spi->PagedPoolPages = 0; /* FIXME */ Spi->PagedPoolAllocs = 0; /* FIXME */ Spi->PagedPoolFrees = 0; /* FIXME */ - Spi->NonPagedPoolPages = MiMemoryConsumers[MC_NPPOOL].PagesUsed; + Spi->NonPagedPoolPages = 0; /* FIXME */ Spi->NonPagedPoolAllocs = 0; /* FIXME */ Spi->NonPagedPoolFrees = 0; /* FIXME */ @@ -592,7 +591,7 @@ QSI_DEF(SystemPerformanceInformation) Spi->Spare3Count = 0; /* FIXME */ Spi->ResidentSystemCachePage = MiMemoryConsumers[MC_CACHE].PagesUsed; - Spi->ResidentPagedPoolPage = MiMemoryConsumers[MC_PPOOL].PagesUsed; /* FIXME */ + Spi->ResidentPagedPoolPage = 0; /* FIXME */ Spi->ResidentSystemDriverPage = 0; /* FIXME */ Spi->CcFastReadNoWait = 0; /* FIXME */ diff --git a/ntoskrnl/fstub/fstubex.c b/ntoskrnl/fstub/fstubex.c index bd419931f16..51b8ea48b52 100644 --- a/ntoskrnl/fstub/fstubex.c +++ b/ntoskrnl/fstub/fstubex.c @@ -3,7 +3,7 @@ * LICENSE: GPL - See COPYING in the top level directory * FILE: ntoskrnl/fstub/fstubex.c * PURPOSE: Extended FSTUB Routines (not linked to HAL) -* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) +* PROGRAMMERS: Pierre Schweitzer (pierre.schweitzer@reactos.org) */ /* INCLUDES ******************************************************************/ @@ -12,34 +12,2041 @@ #define NDEBUG #include +/* PRIVATE FUNCTIONS *********************************************************/ + +typedef struct _DISK_INFORMATION +{ + PDEVICE_OBJECT DeviceObject; + ULONG SectorSize; + DISK_GEOMETRY_EX DiskGeometry; + PUSHORT Buffer; + ULONGLONG SectorCount; +} DISK_INFORMATION, *PDISK_INFORMATION; + +#include +typedef struct _EFI_PARTITION_HEADER +{ + ULONGLONG Signature; // 0 + ULONG Revision; // 8 + ULONG HeaderSize; // 12 + ULONG HeaderCRC32; // 16 + ULONG Reserved; // 20 + ULONGLONG MyLBA; // 24 + ULONGLONG AlternateLBA; // 32 + ULONGLONG FirstUsableLBA; // 40 + ULONGLONG LastUsableLBA; // 48 + GUID DiskGUID; // 56 + ULONGLONG PartitionEntryLBA; // 72 + ULONG NumberOfEntries; // 80 + ULONG SizeOfPartitionEntry; // 84 + ULONG PartitionEntryCRC32; // 88 +} EFI_PARTITION_HEADER, *PEFI_PARTITION_HEADER; +#include + +typedef struct _EFI_PARTITION_ENTRY +{ + GUID PartitionType; // 0 + GUID UniquePartition; // 16 + ULONGLONG StartingLBA; // 32 + ULONGLONG EndingLBA; // 40 + ULONGLONG Attributes; // 48 + WCHAR Name[0x24]; // 56 +} EFI_PARTITION_ENTRY, *PEFI_PARTITION_ENTRY; + +typedef struct _CREATE_DISK_MBR +{ + ULONG Signature; +} CREATE_DISK_MBR, *PCREATE_DISK_MBR; + +typedef struct _CREATE_DISK_GPT +{ + GUID DiskId; + ULONG MaxPartitionCount; +} CREATE_DISK_GPT, *PCREATE_DISK_GPT; + +typedef struct _CREATE_DISK +{ + PARTITION_STYLE PartitionStyle; + union + { + CREATE_DISK_MBR Mbr; + CREATE_DISK_GPT Gpt; + }; +} CREATE_DISK, *PCREATE_DISK; + +typedef struct _PARTITION_TABLE_ENTRY +{ + UCHAR BootIndicator; + UCHAR StartHead; + UCHAR StartSector; + UCHAR StartCylinder; + UCHAR SystemIndicator; + UCHAR EndHead; + UCHAR EndSector; + UCHAR EndCylinder; + ULONG SectorCountBeforePartition; + ULONG PartitionSectorCount; +} PARTITION_TABLE_ENTRY, *PPARTITION_TABLE_ENTRY; + +typedef struct _MASTER_BOOT_RECORD +{ + UCHAR MasterBootRecordCodeAndData[0x1B8]; // 0 + ULONG Signature; // 440 + USHORT Reserved; // 444 + PARTITION_TABLE_ENTRY PartitionTable[4]; // 446 + USHORT MasterBootRecordMagic; // 510 +} MASTER_BOOT_RECORD, *PMASTER_BOOT_RECORD; + +/* Tag for Fstub allocations */ +#define TAG_FSTUB 'BtsF' +/* Partition entry size (bytes) - FIXME: It's hardcoded as Microsoft does, but according to specs, it shouldn't be */ +#define PARTITION_ENTRY_SIZE 128 +/* Defines "EFI PART" */ +#define EFI_HEADER_SIGNATURE 0x5452415020494645ULL +/* Defines version 1.0 */ +#define EFI_HEADER_REVISION_1 0x00010000 +/* Defines system type for MBR showing that a GPT is following */ +#define EFI_PMBR_OSTYPE_EFI 0xEE + +#define IS_VALID_DISK_INFO(Disk) \ + (Disk) && \ + (Disk->DeviceObject) && \ + (Disk->SectorSize) && \ + (Disk->Buffer) && \ + (Disk->SectorCount) + +VOID +NTAPI +FstubDbgPrintPartitionEx(IN PPARTITION_INFORMATION_EX PartitionEntry, + IN ULONG PartitionNumber +); + +NTSTATUS +NTAPI +FstubDetectPartitionStyle(IN PDISK_INFORMATION Disk, + IN PARTITION_STYLE * PartitionStyle +); + +VOID +NTAPI +FstubFreeDiskInformation(IN PDISK_INFORMATION DiskBuffer +); + +NTSTATUS +NTAPI +FstubGetDiskGeometry(IN PDEVICE_OBJECT DeviceObject, + OUT PDISK_GEOMETRY_EX Geometry +); + +NTSTATUS +NTAPI +FstubReadSector(IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONGLONG StartingSector OPTIONAL, + OUT PUSHORT Buffer +); + +NTSTATUS +NTAPI +FstubWriteBootSectorEFI(IN PDISK_INFORMATION Disk +); + +NTSTATUS +NTAPI +FstubWritePartitionTableEFI(IN PDISK_INFORMATION Disk, + IN GUID DiskGUID, + IN ULONG MaxPartitionCount, + IN ULONGLONG FirstUsableLBA, + IN ULONGLONG LastUsableLBA, + IN BOOLEAN WriteBackupTable, + IN ULONG PartitionCount, + IN PPARTITION_INFORMATION_EX PartitionEntries OPTIONAL +); + +NTSTATUS +NTAPI +FstubWriteSector(IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONGLONG StartingSector OPTIONAL, + IN PUSHORT Buffer +); + +VOID +NTAPI +FstubAdjustPartitionCount(IN ULONG SectorSize, + IN OUT PULONG PartitionCount) +{ + ULONG Count; + PAGED_CODE(); + + ASSERT(SectorSize); + ASSERT(PartitionCount); + + /* Get partition count */ + Count = *PartitionCount; + /* We need at least 128 entries */ + if (Count < 128) + { + Count = 128; + } + + /* Then, ensure that we will have a round value, + * ie, all sectors will be full of entries + * There won't be lonely entries + */ + Count = (Count * PARTITION_ENTRY_SIZE) / SectorSize; + Count = (Count * SectorSize) / PARTITION_ENTRY_SIZE; + ASSERT(*PartitionCount <= Count); + /* Return result */ + *PartitionCount = Count; + + /* One more sanity check */ + if (SectorSize == 512) + { + ASSERT(Count % 4 == 0); + } +} + +NTSTATUS +NTAPI +FstubAllocateDiskInformation(IN PDEVICE_OBJECT DeviceObject, + OUT PDISK_INFORMATION * DiskBuffer, + PDISK_GEOMETRY_EX DiskGeometry OPTIONAL) +{ + NTSTATUS Status; + PDISK_INFORMATION DiskInformation; + PAGED_CODE(); + + ASSERT(DeviceObject); + ASSERT(DiskBuffer); + + /* Allocate internal structure */ + DiskInformation = ExAllocatePoolWithTag(NonPagedPool, sizeof(DISK_INFORMATION), TAG_FSTUB); + if (!DiskInformation) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* If caller don't pass needed information, let's get them */ + if (!DiskGeometry) + { + Status = FstubGetDiskGeometry(DeviceObject, &(DiskInformation->DiskGeometry)); + if (!NT_SUCCESS(Status)) + { + ExFreePoolWithTag(DiskInformation, TAG_FSTUB); + return Status; + } + } + else + { + DiskInformation->DiskGeometry = *DiskGeometry; + } + + /* Ensure read/received information are correct */ + if (DiskInformation->DiskGeometry.Geometry.BytesPerSector == 0 || + DiskInformation->DiskGeometry.DiskSize.QuadPart == 0) + { + ExFreePoolWithTag(DiskInformation, TAG_FSTUB); + return STATUS_DEVICE_NOT_READY; + } + + /* Store vital information as well */ + DiskInformation->DeviceObject = DeviceObject; + DiskInformation->SectorSize = DiskInformation->DiskGeometry.Geometry.BytesPerSector; + DiskInformation->SectorCount = DiskInformation->DiskGeometry.DiskSize.QuadPart / DiskInformation->SectorSize; + + /* Finally, allocate the buffer that will be used for different read */ + DiskInformation->Buffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, DiskInformation->SectorSize, TAG_FSTUB); + if (!DiskInformation->Buffer) + { + ExFreePoolWithTag(DiskInformation, TAG_FSTUB); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Return allocated internal structure */ + *DiskBuffer = DiskInformation; + + return STATUS_SUCCESS; +} + +PDRIVE_LAYOUT_INFORMATION +NTAPI +FstubConvertExtendedToLayout(IN PDRIVE_LAYOUT_INFORMATION_EX LayoutEx) +{ + ULONG i; + PDRIVE_LAYOUT_INFORMATION DriveLayout; + PAGED_CODE(); + + ASSERT(LayoutEx); + + /* Check whether we're dealing with MBR partition table */ + if (LayoutEx->PartitionStyle != PARTITION_STYLE_MBR) + { + ASSERT(FALSE); + return NULL; + } + + /* Allocate needed buffer */ + DriveLayout = ExAllocatePoolWithTag(NonPagedPool, + FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION, PartitionEntry) + + LayoutEx->PartitionCount * sizeof(PARTITION_INFORMATION), + 'BtsF'); + if (!DriveLayout) + { + return NULL; + } + + /* Convert information about partition table */ + DriveLayout->PartitionCount = LayoutEx->PartitionCount; + DriveLayout->Signature = LayoutEx->Mbr.Signature; + + /* Convert each partition */ + for (i = 0; i < LayoutEx->PartitionCount; i++) + { + DriveLayout->PartitionEntry[i].StartingOffset = LayoutEx->PartitionEntry[i].StartingOffset; + DriveLayout->PartitionEntry[i].PartitionLength = LayoutEx->PartitionEntry[i].PartitionLength; + DriveLayout->PartitionEntry[i].HiddenSectors = LayoutEx->PartitionEntry[i].Mbr.HiddenSectors; + DriveLayout->PartitionEntry[i].PartitionNumber = LayoutEx->PartitionEntry[i].PartitionNumber; + DriveLayout->PartitionEntry[i].PartitionType = LayoutEx->PartitionEntry[i].Mbr.PartitionType; + DriveLayout->PartitionEntry[i].BootIndicator = LayoutEx->PartitionEntry[i].Mbr.BootIndicator; + DriveLayout->PartitionEntry[i].RecognizedPartition = LayoutEx->PartitionEntry[i].Mbr.RecognizedPartition; + DriveLayout->PartitionEntry[i].RewritePartition = LayoutEx->PartitionEntry[i].RewritePartition; + } + + return DriveLayout; +} + +VOID +NTAPI +FstubCopyEntryEFI(OUT PEFI_PARTITION_ENTRY Entry, + IN PPARTITION_INFORMATION_EX Partition, + ULONG SectorSize) +{ + PAGED_CODE(); + + ASSERT(Entry); + ASSERT(Partition); + ASSERT(SectorSize); + + /* Just convert data to EFI partition entry type */ + Entry->PartitionType = Partition->Gpt.PartitionType; + Entry->UniquePartition = Partition->Gpt.PartitionId; + Entry->StartingLBA = Partition->StartingOffset.QuadPart / SectorSize; + Entry->EndingLBA = (Partition->StartingOffset.QuadPart + Partition->PartitionLength.QuadPart - 1) / SectorSize; + Entry->Attributes = Partition->Gpt.Attributes; + RtlCopyMemory(Entry->Name, Partition->Gpt.Name, sizeof(Entry->Name)); +} + +NTSTATUS +NTAPI +FstubCreateDiskMBR(IN PDEVICE_OBJECT DeviceObject, + IN PCREATE_DISK_MBR DiskInfo) +{ + NTSTATUS Status; + PDISK_INFORMATION Disk = NULL; + PMASTER_BOOT_RECORD MasterBootRecord; + PAGED_CODE(); + + ASSERT(DeviceObject); + + /* Allocate internal structure */ + Status = FstubAllocateDiskInformation(DeviceObject, &Disk, 0); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Read previous MBR, if any */ + Status = FstubReadSector(Disk->DeviceObject, + Disk->SectorSize, + 0ULL, + Disk->Buffer); + if (!NT_SUCCESS(Status)) + { + FstubFreeDiskInformation(Disk); + return Status; + } + /* Fill the buffer with needed information, we won't overwrite boot code */ + MasterBootRecord = (PMASTER_BOOT_RECORD)Disk->Buffer; + MasterBootRecord->Signature = DiskInfo->Signature; + RtlZeroMemory(MasterBootRecord->PartitionTable, sizeof(PARTITION_TABLE_ENTRY) * 4); + MasterBootRecord->MasterBootRecordMagic = BOOT_RECORD_SIGNATURE; + + /* Finally, write MBR */ + Status = FstubWriteSector(Disk->DeviceObject, + Disk->SectorSize, + 0ULL, + Disk->Buffer); + + /* Release internal structure and return */ + FstubFreeDiskInformation(Disk); + return Status; +} + +NTSTATUS +NTAPI +FstubCreateDiskEFI(IN PDEVICE_OBJECT DeviceObject, + IN PCREATE_DISK_GPT DiskInfo) +{ + NTSTATUS Status; + PDISK_INFORMATION Disk = NULL; + ULONGLONG FirstUsableLBA, LastUsableLBA; + ULONG MaxPartitionCount, SectorsForPartitions; + PAGED_CODE(); + + ASSERT(DeviceObject); + ASSERT(DiskInfo); + + /* Allocate internal structure */ + Status = FstubAllocateDiskInformation(DeviceObject, &Disk, 0); + if (!NT_SUCCESS(Status)) + { + return Status; + } + ASSERT(Disk); + + /* Write legacy MBR */ + Status = FstubWriteBootSectorEFI(Disk); + if (!NT_SUCCESS(Status)) + { + FstubFreeDiskInformation(Disk); + return Status; + } + + /* Get max entries and adjust its number */ + MaxPartitionCount = DiskInfo->MaxPartitionCount; + FstubAdjustPartitionCount(Disk->SectorSize, &MaxPartitionCount); + + /* Count number of sectors needed to store partitions */ + SectorsForPartitions = (MaxPartitionCount * PARTITION_ENTRY_SIZE) / Disk->SectorSize; + /* Set first usable LBA: Legacy MBR + GPT header + Partitions entries */ + FirstUsableLBA = SectorsForPartitions + 2; + /* Set last usable LBA: Last sector - GPT header - Partitions entries */ + LastUsableLBA = Disk->SectorCount - SectorsForPartitions - 1; + + /* First, write primary table */ + Status = FstubWritePartitionTableEFI(Disk, + DiskInfo->DiskId, + MaxPartitionCount, + FirstUsableLBA, + LastUsableLBA, + FALSE, + 0, + NULL); + /* Then, write backup table */ + if (NT_SUCCESS(Status)) + { + Status = FstubWritePartitionTableEFI(Disk, + DiskInfo->DiskId, + MaxPartitionCount, + FirstUsableLBA, + LastUsableLBA, + TRUE, + 0, + NULL); + } + + /* Release internal structure and return */ + FstubFreeDiskInformation(Disk); + return Status; +} + +NTSTATUS +NTAPI +FstubCreateDiskRaw(IN PDEVICE_OBJECT DeviceObject) +{ + NTSTATUS Status; + PDISK_INFORMATION Disk = NULL; + PARTITION_STYLE PartitionStyle; + PMASTER_BOOT_RECORD MasterBootRecord; + PAGED_CODE(); + + ASSERT(DeviceObject); + + /* Allocate internal structure */ + Status = FstubAllocateDiskInformation(DeviceObject, &Disk, 0); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Detect current disk partition style */ + Status = FstubDetectPartitionStyle(Disk, &PartitionStyle); + if (!NT_SUCCESS(Status)) + { + FstubFreeDiskInformation(Disk); + return Status; + } + + /* Read MBR, if any */ + Status = FstubReadSector(Disk->DeviceObject, + Disk->SectorSize, + 0ULL, + Disk->Buffer); + if (!NT_SUCCESS(Status)) + { + FstubFreeDiskInformation(Disk); + return Status; + } + + /* Only zero useful stuff */ + MasterBootRecord = (PMASTER_BOOT_RECORD)Disk->Buffer; + MasterBootRecord->Signature = 0; + RtlZeroMemory(MasterBootRecord->PartitionTable, sizeof(PARTITION_TABLE_ENTRY)); + MasterBootRecord->MasterBootRecordMagic = 0; + + /* Write back that destroyed MBR */ + Status = FstubWriteSector(Disk->DeviceObject, + Disk->SectorSize, + 0ULL, + Disk->Buffer); + /* If previous style wasn't GPT, we're done here */ + if (PartitionStyle != PARTITION_STYLE_GPT) + { + FstubFreeDiskInformation(Disk); + return Status; + } + + /* Otherwise, we've to zero the two GPT headers */ + RtlZeroMemory(Disk->Buffer, Disk->SectorSize); + /* Erase primary header */ + Status = FstubWriteSector(Disk->DeviceObject, + Disk->SectorSize, + 1ULL, + Disk->Buffer); + /* In case of success, erase backup header */ + if (NT_SUCCESS(Status)) + { + Status = FstubWriteSector(Disk->DeviceObject, + Disk->SectorSize, + Disk->SectorCount - 1ULL, + Disk->Buffer); + } + + /* Release internal structure and return */ + FstubFreeDiskInformation(Disk); + return Status; +} + +PCHAR +NTAPI +FstubDbgGuidToString(IN PGUID Guid, + OUT PCHAR String) +{ + sprintf(String, + "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", + Guid->Data1, + Guid->Data2, + Guid->Data3, + Guid->Data4[0], + Guid->Data4[1], + Guid->Data4[2], + Guid->Data4[3], + Guid->Data4[4], + Guid->Data4[5], + Guid->Data4[6], + Guid->Data4[7]); + + return String; +} + +VOID +NTAPI +FstubDbgPrintDriveLayoutEx(IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout) +{ + ULONG i; + CHAR Guid[38]; + PAGED_CODE(); + + DPRINT1("FSTUB: DRIVE_LAYOUT_INFORMATION_EX: %p\n", DriveLayout); + switch (DriveLayout->PartitionStyle) + { + case PARTITION_STYLE_MBR: + if (DriveLayout->PartitionCount % 4 != 0) + { + DPRINT1("Warning: Partition count isn't a 4-factor: %ld!\n", DriveLayout->PartitionCount); + } + + DPRINT1("Signature: %8.8x\n", DriveLayout->Mbr.Signature); + for (i = 0; i < DriveLayout->PartitionCount; i++) + { + FstubDbgPrintPartitionEx(DriveLayout->PartitionEntry, i); + } + + break; + case PARTITION_STYLE_GPT: + FstubDbgGuidToString(&(DriveLayout->Gpt.DiskId), Guid); + DPRINT1("DiskId: %s\n", Guid); + DPRINT1("StartingUsableOffset: %I64x\n", DriveLayout->Gpt.StartingUsableOffset.QuadPart); + DPRINT1("UsableLength: %I64x\n", DriveLayout->Gpt.UsableLength.QuadPart); + DPRINT1("MaxPartitionCount: %ld\n", DriveLayout->Gpt.MaxPartitionCount); + for (i = 0; i < DriveLayout->PartitionCount; i++) + { + FstubDbgPrintPartitionEx(DriveLayout->PartitionEntry, i); + } + + break; + default: + DPRINT1("Unsupported partition style: %ld\n", DriveLayout->PartitionStyle); + } +} + +VOID +NTAPI +FstubDbgPrintPartitionEx(IN PPARTITION_INFORMATION_EX PartitionEntry, + IN ULONG PartitionNumber) +{ + CHAR Guid[38]; + PAGED_CODE(); + + DPRINT1("Printing partition %ld\n", PartitionNumber); + + switch (PartitionEntry[PartitionNumber].PartitionStyle) + { + case PARTITION_STYLE_MBR: + DPRINT1(" StartingOffset: %I64x\n", PartitionEntry[PartitionNumber].StartingOffset.QuadPart); + DPRINT1(" PartitionLength: %I64x\n", PartitionEntry[PartitionNumber].PartitionLength.QuadPart); + DPRINT1(" RewritePartition: %d\n", PartitionEntry[PartitionNumber].RewritePartition); + DPRINT1(" PartitionType: %02x\n", PartitionEntry[PartitionNumber].Mbr.PartitionType); + DPRINT1(" BootIndicator: %d\n", PartitionEntry[PartitionNumber].Mbr.BootIndicator); + DPRINT1(" RecognizedPartition: %d\n", PartitionEntry[PartitionNumber].Mbr.RecognizedPartition); + DPRINT1(" HiddenSectors: %ld\n", PartitionEntry[PartitionNumber].Mbr.HiddenSectors); + + break; + case PARTITION_STYLE_GPT: + DPRINT1(" StartingOffset: %I64x\n", PartitionEntry[PartitionNumber].StartingOffset.QuadPart); + DPRINT1(" PartitionLength: %I64x\n", PartitionEntry[PartitionNumber].PartitionLength.QuadPart); + DPRINT1(" RewritePartition: %d\n", PartitionEntry[PartitionNumber].RewritePartition); + FstubDbgGuidToString(&(PartitionEntry[PartitionNumber].Gpt.PartitionType), Guid); + DPRINT1(" PartitionType: %s\n", Guid); + FstubDbgGuidToString(&(PartitionEntry[PartitionNumber].Gpt.PartitionId), Guid); + DPRINT1(" PartitionId: %s\n", Guid); + DPRINT1(" Attributes: %16x\n", PartitionEntry[PartitionNumber].Gpt.Attributes); + DPRINT1(" Name: %ws\n", PartitionEntry[PartitionNumber].Gpt.Name); + + break; + default: + DPRINT1(" Unsupported partition style: %ld\n", PartitionEntry[PartitionNumber].PartitionStyle); + } +} + +VOID +NTAPI +FstubDbgPrintSetPartitionEx(IN PSET_PARTITION_INFORMATION_EX PartitionEntry, + IN ULONG PartitionNumber) +{ + CHAR Guid[38]; + PAGED_CODE(); + + DPRINT1("FSTUB: SET_PARTITION_INFORMATION_EX: %p\n", PartitionEntry); + DPRINT1("Modifying partition %ld\n", PartitionNumber); + switch (PartitionEntry->PartitionStyle) + { + case PARTITION_STYLE_MBR: + DPRINT1(" PartitionType: %02x\n", PartitionEntry->Mbr.PartitionType); + + break; + case PARTITION_STYLE_GPT: + FstubDbgGuidToString(&(PartitionEntry->Gpt.PartitionType), Guid); + DPRINT1(" PartitionType: %s\n", Guid); + FstubDbgGuidToString(&(PartitionEntry->Gpt.PartitionId), Guid); + DPRINT1(" PartitionId: %s\n", Guid); + DPRINT1(" Attributes: %16x\n", PartitionEntry->Gpt.Attributes); + DPRINT1(" Name: %ws\n", PartitionEntry->Gpt.Name); + + break; + default: + DPRINT1(" Unsupported partition style: %ld\n", PartitionEntry[PartitionNumber].PartitionStyle); + } +} + +NTSTATUS +NTAPI +FstubDetectPartitionStyle(IN PDISK_INFORMATION Disk, + IN PARTITION_STYLE * PartitionStyle) +{ + NTSTATUS Status; + PPARTITION_DESCRIPTOR PartitionDescriptor; + PAGED_CODE(); + + ASSERT(IS_VALID_DISK_INFO(Disk)); + ASSERT(PartitionStyle); + + /* Read disk first sector */ + Status = FstubReadSector(Disk->DeviceObject, + Disk->SectorSize, + 0, + Disk->Buffer); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Get the partition descriptor array */ + PartitionDescriptor = (PPARTITION_DESCRIPTOR) + &(Disk->Buffer[PARTITION_TABLE_OFFSET]); + /* If we have not the 0xAA55 then it's raw partition */ + if (Disk->Buffer[BOOT_SIGNATURE_OFFSET] != BOOT_RECORD_SIGNATURE) + { + *PartitionStyle = PARTITION_STYLE_RAW; + } + /* Check partitions types: if first is 0xEE and all the others 0, we have GPT */ + else if (PartitionDescriptor[0].PartitionType == EFI_PMBR_OSTYPE_EFI && + PartitionDescriptor[1].PartitionType == 0 && + PartitionDescriptor[2].PartitionType == 0 && + PartitionDescriptor[3].PartitionType == 0) + { + *PartitionStyle = PARTITION_STYLE_GPT; + } + /* Otherwise, partition table is in MBR */ + else + { + *PartitionStyle = PARTITION_STYLE_MBR; + } + + return STATUS_SUCCESS; +} + +VOID +NTAPI +FstubFreeDiskInformation(IN PDISK_INFORMATION DiskBuffer) +{ + if (DiskBuffer) + { + if (DiskBuffer->Buffer) + { + ExFreePoolWithTag(DiskBuffer->Buffer, TAG_FSTUB); + } + ExFreePoolWithTag(DiskBuffer, TAG_FSTUB); + } +} + +NTSTATUS +NTAPI +FstubGetDiskGeometry(IN PDEVICE_OBJECT DeviceObject, + OUT PDISK_GEOMETRY_EX Geometry) +{ + PIRP Irp; + NTSTATUS Status; + PKEVENT Event = NULL; + PDISK_GEOMETRY_EX DiskGeometry = NULL; + PIO_STATUS_BLOCK IoStatusBlock = NULL; + PAGED_CODE(); + + ASSERT(DeviceObject); + ASSERT(Geometry); + + /* Allocate needed components */ + DiskGeometry = ExAllocatePoolWithTag(NonPagedPool, sizeof(DISK_GEOMETRY_EX), TAG_FSTUB); + if (!DiskGeometry) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Cleanup; + } + + IoStatusBlock = ExAllocatePoolWithTag(NonPagedPool, sizeof(IO_STATUS_BLOCK), TAG_FSTUB); + if (!IoStatusBlock) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Cleanup; + } + + Event = ExAllocatePoolWithTag(NonPagedPool, sizeof(KEVENT), TAG_FSTUB); + if (!Event) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Cleanup; + } + /* Initialize the waiting event */ + KeInitializeEvent(Event, NotificationEvent, FALSE); + + /* Build the request to get disk geometry */ + Irp = IoBuildDeviceIoControlRequest(IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, + DeviceObject, + 0, + 0, + DiskGeometry, + sizeof(DISK_GEOMETRY_EX), + FALSE, + Event, + IoStatusBlock); + if (!Irp) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Cleanup; + } + + /* Call the driver and wait for completion if needed */ + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatusBlock->Status; + } + + /* In case of a success, return read data */ + if (NT_SUCCESS(Status)) + { + *Geometry = *DiskGeometry; + } + +Cleanup: + if (DiskGeometry) + { + ExFreePoolWithTag(DiskGeometry, TAG_FSTUB); + + if (NT_SUCCESS(Status)) + { + ASSERT(Geometry->Geometry.BytesPerSector % PARTITION_ENTRY_SIZE == 0); + } + } + + if (IoStatusBlock) + { + ExFreePoolWithTag(IoStatusBlock, TAG_FSTUB); + } + + if (Event) + { + ExFreePoolWithTag(Event, TAG_FSTUB); + } + + return Status; +} + +NTSTATUS +NTAPI +FstubReadHeaderEFI(IN PDISK_INFORMATION Disk, + IN BOOLEAN ReadBackupTable, + PEFI_PARTITION_HEADER HeaderBuffer) +{ + NTSTATUS Status; + PUCHAR Sector = NULL; + ULONGLONG StartingSector; + PEFI_PARTITION_HEADER EFIHeader; + ULONG i, HeaderCRC32, PreviousCRC32, SectoredPartitionEntriesSize, LonelyPartitions; + PAGED_CODE(); + + ASSERT(Disk); + ASSERT(IS_VALID_DISK_INFO(Disk)); + ASSERT(HeaderBuffer); + + /* In case we want to read backup table, we read last disk sector */ + if (ReadBackupTable) + { + StartingSector = Disk->SectorCount - 1ULL; + } + else + { + /* Otherwise we start at first sector (as sector 0 is the MBR) */ + StartingSector = 1ULL; + } + + Status = FstubReadSector(Disk->DeviceObject, + Disk->SectorSize, + StartingSector, + Disk->Buffer); + if (!NT_SUCCESS(Status)) + { + DPRINT("EFI::Failed reading header!\n"); + return Status; + } + /* Let's use read buffer as EFI_PARTITION_HEADER */ + EFIHeader = (PEFI_PARTITION_HEADER)Disk->Buffer; + + + /* First check signature + * Then, check version (we only support v1) + * Finally check header size + */ + if (EFIHeader->Signature != EFI_HEADER_SIGNATURE || + EFIHeader->Revision != EFI_HEADER_REVISION_1 || + EFIHeader->HeaderSize != sizeof(EFI_PARTITION_HEADER)) + { + DPRINT("EFI::Wrong signature/version/header size!\n"); + DPRINT("%I64x (expected: %I64x)\n", EFIHeader->Signature, EFI_HEADER_SIGNATURE); + DPRINT("%03x (expected: %03x)\n", EFIHeader->Revision, EFI_HEADER_REVISION_1); + DPRINT("%02x (expected: %02x)\n", EFIHeader->HeaderSize, sizeof(EFI_PARTITION_HEADER)); + return STATUS_DISK_CORRUPT_ERROR; + } + + /* Save current checksum */ + HeaderCRC32 = EFIHeader->HeaderCRC32; + /* Then zero the one in EFI header. This is needed to compute header checksum */ + EFIHeader->HeaderCRC32 = 0; + /* Compute header checksum and compare with the one present in partition table */ + if (RtlComputeCrc32(0, (PUCHAR)Disk->Buffer, sizeof(EFI_PARTITION_HEADER)) != HeaderCRC32) + { + DPRINT("EFI::Not matching header checksum!\n"); + return STATUS_DISK_CORRUPT_ERROR; + } + /* Put back removed checksum in header */ + EFIHeader->HeaderCRC32 = HeaderCRC32; + + /* Check if current LBA is matching with ours */ + if (EFIHeader->MyLBA != StartingSector) + { + DPRINT("EFI::Not matching starting sector!\n"); + return STATUS_DISK_CORRUPT_ERROR; + } + + /* Allocate a buffer to read a sector on the disk */ + Sector = ExAllocatePoolWithTag(NonPagedPool, + Disk->SectorSize, + 'BtsF'); + if (!Sector) + { + DPRINT("EFI::Lacking resources!\n"); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Count how much sectors we'll have to read to read the whole partition table */ + SectoredPartitionEntriesSize = (EFIHeader->NumberOfEntries * PARTITION_ENTRY_SIZE) / Disk->SectorSize; + /* Compute partition table checksum */ + for (i = 0, PreviousCRC32 = 0; i < SectoredPartitionEntriesSize; i++) + { + Status = FstubReadSector(Disk->DeviceObject, + Disk->SectorSize, + EFIHeader->PartitionEntryLBA + i, + (PUSHORT)Sector); + if (!NT_SUCCESS(Status)) + { + ExFreePoolWithTag(Sector, 'BtsF'); + DPRINT("EFI::Failed reading sector for partition entry!\n"); + return Status; + } + + PreviousCRC32 = RtlComputeCrc32(PreviousCRC32, Sector, Disk->SectorSize); + } + + /* Check whether we have a last sector not full of partitions */ + LonelyPartitions = (EFIHeader->NumberOfEntries * PARTITION_ENTRY_SIZE) % Disk->SectorSize; + /* In such case, we have to complete checksum computation */ + if (LonelyPartitions != 0) + { + /* Read the sector that contains those partitions */ + Status = FstubReadSector(Disk->DeviceObject, + Disk->SectorSize, + EFIHeader->PartitionEntryLBA + i, + (PUSHORT)Sector); + if (!NT_SUCCESS(Status)) + { + ExFreePoolWithTag(Sector, 'BtsF'); + DPRINT("EFI::Failed reading sector for partition entry!\n"); + return Status; + } + + /* Then complete checksum by computing on each partition */ + for (i = 0; i < LonelyPartitions; i++) + { + PreviousCRC32 = RtlComputeCrc32(PreviousCRC32, Sector + i * PARTITION_ENTRY_SIZE, PARTITION_ENTRY_SIZE); + } + } + + /* Finally, release memory */ + ExFreePoolWithTag(Sector, 'BtsF'); + + /* Compare checksums */ + if (PreviousCRC32 == EFIHeader->PartitionEntryCRC32) + { + /* In case of a success, return read header */ + *HeaderBuffer = *EFIHeader; + return STATUS_SUCCESS; + } + else + { + DPRINT("EFI::Not matching partition table checksum!\n"); + DPRINT("EFI::Expected: %x, received: %x\n", EFIHeader->PartitionEntryCRC32, PreviousCRC32); + return STATUS_DISK_CORRUPT_ERROR; + } +} + +NTSTATUS +NTAPI +FstubReadPartitionTableEFI(IN PDISK_INFORMATION Disk, + IN BOOLEAN ReadBackupTable, + OUT struct _DRIVE_LAYOUT_INFORMATION_EX** DriveLayout) +{ + NTSTATUS Status; + EFI_PARTITION_HEADER EfiHeader; + ULONGLONG SectorsForPartitions; + EFI_PARTITION_ENTRY PartitionEntry; + BOOLEAN UpdatedPartitionTable = FALSE; + PDRIVE_LAYOUT_INFORMATION_EX DriveLayoutEx = NULL; + ULONG i, PartitionCount, PartitionIndex, PartitionsPerSector; + PAGED_CODE(); + + ASSERT(Disk); + + /* Zero output */ + *DriveLayout = NULL; + + /* Read EFI header */ + Status = FstubReadHeaderEFI(Disk, + ReadBackupTable, + &EfiHeader); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Allocate a DRIVE_LAYOUT_INFORMATION_EX struct big enough */ + DriveLayoutEx = ExAllocatePoolWithTag(NonPagedPool, + FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION_EX, PartitionEntry) + + EfiHeader.NumberOfEntries * sizeof(PARTITION_INFORMATION_EX), + TAG_FSTUB); + if (!DriveLayoutEx) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + if (ReadBackupTable) + { + /* If we read backup but if it doesn't match with current geometry */ + if ((Disk->SectorCount - 1ULL) != EfiHeader.AlternateLBA) + { + /* We'll update it. First, count number of sectors needed to store partitions */ + SectorsForPartitions = (EfiHeader.NumberOfEntries * PARTITION_ENTRY_SIZE) / Disk->SectorSize; + /* Then set first usable LBA: Legacy MBR + GPT header + Partitions entries */ + EfiHeader.FirstUsableLBA = SectorsForPartitions + 2; + /* Then set last usable LBA: Last sector - GPT header - Partitions entries */ + EfiHeader.LastUsableLBA = Disk->SectorCount - SectorsForPartitions - 1; + /* Inform that we'll rewrite partition table */ + UpdatedPartitionTable = TRUE; + } + } + + DriveLayoutEx->PartitionStyle = PARTITION_STYLE_GPT; + /* Translate LBA -> Offset */ + DriveLayoutEx->Gpt.StartingUsableOffset.QuadPart = EfiHeader.FirstUsableLBA * Disk->SectorSize; + DriveLayoutEx->Gpt.UsableLength.QuadPart = EfiHeader.LastUsableLBA - EfiHeader.FirstUsableLBA * Disk->SectorSize; + DriveLayoutEx->Gpt.MaxPartitionCount = EfiHeader.NumberOfEntries; + DriveLayoutEx->Gpt.DiskId = EfiHeader.DiskGUID; + + /* Count number of partitions per sector */ + PartitionsPerSector = (Disk->SectorSize / PARTITION_ENTRY_SIZE); + /* Read all partitions and fill in structure */ + for (i = 0, PartitionCount = 0, PartitionIndex = PartitionsPerSector; + i < EfiHeader.NumberOfEntries; + i++) + { + /* Only read following sector if we finished with previous sector */ + if (PartitionIndex == PartitionsPerSector) + { + Status = FstubReadSector(Disk->DeviceObject, + Disk->SectorSize, + EfiHeader.PartitionEntryLBA + (i / PartitionsPerSector), + Disk->Buffer); + if (!NT_SUCCESS(Status)) + { + ExFreePoolWithTag(DriveLayoutEx, TAG_FSTUB); + return Status; + } + + PartitionIndex = 0; + } + /* Read following partition */ + PartitionEntry = ((PEFI_PARTITION_ENTRY)Disk->Buffer)[PartitionIndex]; + PartitionIndex++; + + /* If partition GUID is 00000000-0000-0000-0000-000000000000, then it's unused, skip it */ + if (PartitionEntry.PartitionType.Data1 == 0 && + PartitionEntry.PartitionType.Data2 == 0 && + PartitionEntry.PartitionType.Data3 == 0 && + ((PULONGLONG)PartitionEntry.PartitionType.Data4)[0] == 0) + { + continue; + } + + /* Write data to structure. Don't forget GPT is using sectors, Windows offsets */ + DriveLayoutEx->PartitionEntry[PartitionCount].StartingOffset.QuadPart = PartitionEntry.StartingLBA * Disk->SectorSize; + DriveLayoutEx->PartitionEntry[PartitionCount].PartitionLength.QuadPart = (PartitionEntry.EndingLBA - + PartitionEntry.StartingLBA + 1) * + Disk->SectorSize; + /* This number starts from 1 */ + DriveLayoutEx->PartitionEntry[PartitionCount].PartitionNumber = PartitionCount + 1; + DriveLayoutEx->PartitionEntry[PartitionCount].RewritePartition = FALSE; + DriveLayoutEx->PartitionEntry[PartitionCount].PartitionStyle = PARTITION_STYLE_GPT; + DriveLayoutEx->PartitionEntry[PartitionCount].Gpt.PartitionType = PartitionEntry.PartitionType; + DriveLayoutEx->PartitionEntry[PartitionCount].Gpt.PartitionId = PartitionEntry.UniquePartition; + DriveLayoutEx->PartitionEntry[PartitionCount].Gpt.Attributes = PartitionEntry.Attributes; + RtlCopyMemory(DriveLayoutEx->PartitionEntry[PartitionCount].Gpt.Name, + PartitionEntry.Name, sizeof(PartitionEntry.Name)); + + /* Update partition count */ + PartitionCount++; + } + DriveLayoutEx->PartitionCount = PartitionCount; + + /* If we updated partition table using backup table, rewrite partition table */ + if (UpdatedPartitionTable) + { + IoWritePartitionTableEx(Disk->DeviceObject, + DriveLayoutEx); + } + + /* Finally, return read data */ + *DriveLayout = DriveLayoutEx; + + return Status; +} + +NTSTATUS +NTAPI +FstubReadPartitionTableMBR(IN PDISK_INFORMATION Disk, + IN BOOLEAN ReturnRecognizedPartitions, + OUT struct _DRIVE_LAYOUT_INFORMATION_EX** ReturnedDriveLayout) +{ + ULONG i; + NTSTATUS Status; + PDRIVE_LAYOUT_INFORMATION DriveLayout = NULL; + PDRIVE_LAYOUT_INFORMATION_EX DriveLayoutEx = NULL; + PAGED_CODE(); + + ASSERT(IS_VALID_DISK_INFO(Disk)); + ASSERT(ReturnedDriveLayout); + + /* Zero output */ + *ReturnedDriveLayout = NULL; + + /* Read partition table the old way */ + Status = IoReadPartitionTable(Disk->DeviceObject, + Disk->SectorSize, + ReturnRecognizedPartitions, + &DriveLayout); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Allocate a DRIVE_LAYOUT_INFORMATION_EX struct big enough */ + DriveLayoutEx = ExAllocatePoolWithTag(NonPagedPool, + FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION_EX, PartitionEntry) + + DriveLayout->PartitionCount * sizeof(PARTITION_INFORMATION_EX), + TAG_FSTUB); + if (!DriveLayoutEx) + { + /* Let's not leak memory as in Windows 2003 */ + ExFreePool(DriveLayout); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Start converting the DRIVE_LAYOUT_INFORMATION structure */ + DriveLayoutEx->PartitionStyle = PARTITION_STYLE_MBR; + DriveLayoutEx->PartitionCount = DriveLayout->PartitionCount; + DriveLayoutEx->Mbr.Signature = DriveLayout->Signature; + + /* Convert each found partition */ + for (i = 0; i < DriveLayout->PartitionCount; i++) + { + DriveLayoutEx->PartitionEntry[i].PartitionStyle = PARTITION_STYLE_MBR; + DriveLayoutEx->PartitionEntry[i].StartingOffset = DriveLayout->PartitionEntry[i].StartingOffset; + DriveLayoutEx->PartitionEntry[i].PartitionLength = DriveLayout->PartitionEntry[i].PartitionLength; + DriveLayoutEx->PartitionEntry[i].PartitionNumber = DriveLayout->PartitionEntry[i].PartitionNumber; + DriveLayoutEx->PartitionEntry[i].RewritePartition = DriveLayout->PartitionEntry[i].RewritePartition; + DriveLayoutEx->PartitionEntry[i].Mbr.PartitionType = DriveLayout->PartitionEntry[i].PartitionType; + DriveLayoutEx->PartitionEntry[i].Mbr.BootIndicator = DriveLayout->PartitionEntry[i].BootIndicator; + DriveLayoutEx->PartitionEntry[i].Mbr.RecognizedPartition = DriveLayout->PartitionEntry[i].RecognizedPartition; + DriveLayoutEx->PartitionEntry[i].Mbr.HiddenSectors = DriveLayout->PartitionEntry[i].HiddenSectors; + } + + /* Finally, return data and free old structure */ + *ReturnedDriveLayout = DriveLayoutEx; + ExFreePool(DriveLayout); + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +FstubReadSector(IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONGLONG StartingSector OPTIONAL, + OUT PUSHORT Buffer) +{ + PIRP Irp; + KEVENT Event; + NTSTATUS Status; + LARGE_INTEGER StartingOffset; + IO_STATUS_BLOCK IoStatusBlock; + PIO_STACK_LOCATION IoStackLocation; + PAGED_CODE(); + + ASSERT(DeviceObject); + ASSERT(Buffer); + ASSERT(SectorSize); + + /* Compute starting offset */ + StartingOffset.QuadPart = StartingSector * SectorSize; + + /* Initialize waiting event */ + KeInitializeEvent(&Event, NotificationEvent, FALSE); + + /* Prepare IRP */ + Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ, + DeviceObject, + Buffer, + SectorSize, + &StartingOffset, + &Event, + &IoStatusBlock); + if (!Irp) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Override volume verify */ + IoStackLocation = IoGetNextIrpStackLocation(Irp); + IoStackLocation->Flags |= SL_OVERRIDE_VERIFY_VOLUME; + + /* Then call driver, and wait for completion if needed */ + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatusBlock.Status; + } + + return Status; +} + +NTSTATUS +NTAPI +FstubSetPartitionInformationEFI(IN PDISK_INFORMATION Disk, + IN ULONG PartitionNumber, + IN SET_PARTITION_INFORMATION_GPT * PartitionInfo) +{ + NTSTATUS Status; + PDRIVE_LAYOUT_INFORMATION_EX Layout = NULL; + PAGED_CODE(); + + ASSERT(Disk); + ASSERT(PartitionInfo); + + /* Partition 0 isn't correct (should start at 1) */ + if (PartitionNumber == 0) + { + return STATUS_INVALID_PARAMETER; + } + + /* Read partition table */ + Status = IoReadPartitionTableEx(Disk->DeviceObject, &Layout); + if (!NT_SUCCESS(Status)) + { + return Status; + } + ASSERT(Layout); + + /* If our partition (started at 0 now) is higher than partition count, then, there's an issue */ + if (Layout->PartitionCount <= --PartitionNumber) + { + ExFreePool(Layout); + return STATUS_INVALID_PARAMETER; + } + + /* Erase actual partition entry data with provided ones */ + Layout->PartitionEntry[PartitionNumber].Gpt.PartitionType = PartitionInfo->PartitionType; + Layout->PartitionEntry[PartitionNumber].Gpt.PartitionId = PartitionInfo->PartitionId; + Layout->PartitionEntry[PartitionNumber].Gpt.Attributes = PartitionInfo->Attributes; + RtlCopyMemory(Layout->PartitionEntry[PartitionNumber].Gpt.Name, PartitionInfo->Name, sizeof(PartitionInfo->Name)); + + /* Rewrite the whole partition table to update the modified entry */ + Status = IoWritePartitionTableEx(Disk->DeviceObject, Layout); + + /* Free partition table and return */ + ExFreePool(Layout); + return Status; +} + +NTSTATUS +NTAPI +FstubVerifyPartitionTableEFI(IN PDISK_INFORMATION Disk, + IN BOOLEAN FixErrors) +{ + NTSTATUS Status; + PEFI_PARTITION_HEADER EFIHeader; + EFI_PARTITION_HEADER ReadEFIHeader; + BOOLEAN PrimaryValid = FALSE, BackupValid = FALSE; + PAGED_CODE(); + + EFIHeader = ExAllocatePoolWithTag(NonPagedPool, sizeof(EFI_PARTITION_HEADER), TAG_FSTUB); + if (!EFIHeader) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + Status = FstubReadHeaderEFI(Disk, FALSE, &ReadEFIHeader); + if (NT_SUCCESS(Status)) + { + PrimaryValid = TRUE; + } + + Status = FstubReadHeaderEFI(Disk, TRUE, &ReadEFIHeader); + if (NT_SUCCESS(Status)) + { + BackupValid = TRUE; + } + + if (!PrimaryValid) + { + if (!BackupValid || !FixErrors) + { + ExFreePoolWithTag(EFIHeader, TAG_FSTUB); + return STATUS_DISK_CORRUPT_ERROR; + } + + DPRINT1("EFI::Partition table fixing not yet supported!\n"); + ExFreePoolWithTag(EFIHeader, TAG_FSTUB); + return STATUS_NOT_IMPLEMENTED; + } + else if (!BackupValid) + { + if (!PrimaryValid || !FixErrors) + { + ExFreePoolWithTag(EFIHeader, TAG_FSTUB); + return STATUS_DISK_CORRUPT_ERROR; + } + + DPRINT1("EFI::Partition table fixing not yet supported!\n"); + ExFreePoolWithTag(EFIHeader, TAG_FSTUB); + return STATUS_NOT_IMPLEMENTED; + } + else + { + ExFreePoolWithTag(EFIHeader, TAG_FSTUB); + return STATUS_SUCCESS; + } +} + +NTSTATUS +NTAPI +FstubWriteBootSectorEFI(IN PDISK_INFORMATION Disk) +{ + NTSTATUS Status; + ULONG Signature = 0; + PMASTER_BOOT_RECORD MasterBootRecord; + PAGED_CODE(); + + ASSERT(Disk); + ASSERT(IS_VALID_DISK_INFO(Disk)); + + /* Read if a MBR is already present */ + Status = FstubReadSector(Disk->DeviceObject, + Disk->SectorSize, + 0ULL, + Disk->Buffer); + MasterBootRecord = (PMASTER_BOOT_RECORD)Disk->Buffer; + /* If one has been found */ + if (NT_SUCCESS(Status) && MasterBootRecord->MasterBootRecordMagic == BOOT_RECORD_SIGNATURE) + { + /* Save its signature */ + Signature = MasterBootRecord->Signature; + } + + /* Reset the MBR */ + RtlZeroMemory(MasterBootRecord, Disk->SectorSize); + /* Then create a fake MBR matching those purposes: + * It must have only partition. Type of this partition + * has to be 0xEE to signal a GPT is following. + * This partition has to cover the whole disk. To prevent + * any disk modification by a program that wouldn't + * understand anything to GPT. + */ + MasterBootRecord->Signature = Signature; + MasterBootRecord->PartitionTable[0].StartSector = 2; + MasterBootRecord->PartitionTable[0].SystemIndicator = EFI_PMBR_OSTYPE_EFI; + MasterBootRecord->PartitionTable[0].EndHead = 0xFF; + MasterBootRecord->PartitionTable[0].EndSector = 0xFF; + MasterBootRecord->PartitionTable[0].EndCylinder = 0xFF; + MasterBootRecord->PartitionTable[0].SectorCountBeforePartition = 1; + MasterBootRecord->PartitionTable[0].PartitionSectorCount = 0xFFFFFFFF; + MasterBootRecord->MasterBootRecordMagic = BOOT_RECORD_SIGNATURE; + + /* Finally, write that MBR */ + return FstubWriteSector(Disk->DeviceObject, + Disk->SectorSize, + 0, + Disk->Buffer); +} + +NTSTATUS +NTAPI +FstubWriteEntryEFI(IN PDISK_INFORMATION Disk, + IN ULONG PartitionsSizeSector, + IN ULONG PartitionEntryNumber, + IN PEFI_PARTITION_ENTRY PartitionEntry, + IN BOOLEAN WriteBackupTable, + IN BOOLEAN ForceWrite, + OUT PULONG PartitionEntryCRC32 OPTIONAL) +{ + ULONG Offset; + ULONGLONG FirstEntryLBA; + NTSTATUS Status = STATUS_SUCCESS; + PAGED_CODE(); + + ASSERT(Disk); + ASSERT(IS_VALID_DISK_INFO(Disk)); + + /* Get the first LBA where the partition table is: + * On primary table, it's sector 2 (skip MBR & Header) + * On backup table, it's ante last sector (Header) minus partition table size + */ + if (!WriteBackupTable) + { + FirstEntryLBA = 2ULL; + } + else + { + FirstEntryLBA = Disk->SectorCount - PartitionsSizeSector - 1; + } + + /* Copy the entry at the proper place into the buffer + * That way, we don't erase previous entries + */ + RtlCopyMemory(Disk->Buffer + (((PartitionEntryNumber * PARTITION_ENTRY_SIZE) % Disk->SectorSize) / sizeof(PUSHORT)), + PartitionEntry, + sizeof(EFI_PARTITION_ENTRY)); + /* Compute size of buffer */ + Offset = (PartitionEntryNumber * PARTITION_ENTRY_SIZE) % Disk->SectorSize + PARTITION_ENTRY_SIZE; + ASSERT(Offset <= Disk->SectorSize); + + /* If it's full of partition entries, or if call ask for it, write down the data */ + if (Offset == Disk->SectorSize || ForceWrite) + { + /* We will write at first entry LBA + a shift made by already present/written entries */ + Status = FstubWriteSector(Disk->DeviceObject, + Disk->SectorSize, + FirstEntryLBA + ((PartitionEntryNumber * PARTITION_ENTRY_SIZE) / Disk->SectorSize), + Disk->Buffer); + if (!NT_SUCCESS(Status)) + { + return Status; + } + /* We clean buffer */ + RtlZeroMemory(Disk->Buffer, Disk->SectorSize); + } + + /* If we have a buffer for CRC32, then compute it */ + if (PartitionEntryCRC32) + { + *PartitionEntryCRC32 = RtlComputeCrc32(*PartitionEntryCRC32, (PUCHAR)PartitionEntry, PARTITION_ENTRY_SIZE); + } + + return Status; +} + +NTSTATUS +NTAPI +FstubWriteHeaderEFI(IN PDISK_INFORMATION Disk, + IN ULONG PartitionsSizeSector, + IN GUID DiskGUID, + IN ULONG NumberOfEntries, + IN ULONGLONG FirstUsableLBA, + IN ULONGLONG LastUsableLBA, + IN ULONG PartitionEntryCRC32, + IN BOOLEAN WriteBackupTable) +{ + PEFI_PARTITION_HEADER EFIHeader; + PAGED_CODE(); + + ASSERT(Disk); + ASSERT(IS_VALID_DISK_INFO(Disk)); + + /* Let's use read buffer as EFI_PARTITION_HEADER */ + EFIHeader = (PEFI_PARTITION_HEADER)Disk->Buffer; + + /* Complete standard header information */ + EFIHeader->Signature = EFI_HEADER_SIGNATURE; + EFIHeader->Revision = EFI_HEADER_REVISION_1; + EFIHeader->HeaderSize = sizeof(EFI_PARTITION_HEADER); + /* Set no CRC32 checksum at the moment */ + EFIHeader->HeaderCRC32 = 0; + EFIHeader->Reserved = 0; + /* Check whether we're writing primary or backup + * That way, we can ajust LBA setting: + * Primary is on first sector + * Backup is on last sector + */ + if (!WriteBackupTable) + { + EFIHeader->MyLBA = 1ULL; + EFIHeader->AlternateLBA = Disk->SectorCount - 1ULL; + } + else + { + EFIHeader->MyLBA = Disk->SectorCount - 1ULL; + EFIHeader->AlternateLBA = 1ULL; + } + /* Fill in with received data */ + EFIHeader->FirstUsableLBA = FirstUsableLBA; + EFIHeader->LastUsableLBA = LastUsableLBA; + EFIHeader->DiskGUID = DiskGUID; + /* Check whether we're writing primary or backup + * That way, we can ajust LBA setting: + * On primary, partition entries are just after header, so sector 2 + * On backup, partition entries are just before header, so, last sector minus partition table size + */ + if (!WriteBackupTable) + { + EFIHeader->PartitionEntryLBA = EFIHeader->MyLBA + 1ULL; + } + else + { + EFIHeader->PartitionEntryLBA = EFIHeader->MyLBA - PartitionsSizeSector; + } + /* Complete filling in */ + EFIHeader->NumberOfEntries = NumberOfEntries; + EFIHeader->SizeOfPartitionEntry = PARTITION_ENTRY_SIZE; + EFIHeader->PartitionEntryCRC32 = PartitionEntryCRC32; + /* Finally, compute header checksum */ + EFIHeader->HeaderCRC32 = RtlComputeCrc32(0, (PUCHAR)EFIHeader, sizeof(EFI_PARTITION_HEADER)); + + /* Debug the way we'll break disk, to let user pray */ + DPRINT("FSTUB: About to write the following header for %s table\n", (WriteBackupTable ? "backup" : "primary")); + DPRINT(" Signature: %I64x\n Revision: %x\n HeaderSize: %x\n HeaderCRC32: %x\n", + EFIHeader->Signature, EFIHeader->Revision, EFIHeader->HeaderSize, EFIHeader->HeaderCRC32); + DPRINT(" MyLBA: %I64x\n AlternateLBA: %I64x\n FirstUsableLBA: %I64x\n LastUsableLBA: %I64x\n", + EFIHeader->MyLBA, EFIHeader->AlternateLBA, EFIHeader->FirstUsableLBA, EFIHeader->LastUsableLBA); + DPRINT(" PartitionEntryLBA: %I64x\n NumberOfEntries: %x\n SizeOfPartitionEntry: %x\n PartitionEntryCRC32: %x\n", + EFIHeader->PartitionEntryLBA, EFIHeader->NumberOfEntries, + EFIHeader->SizeOfPartitionEntry, EFIHeader->PartitionEntryCRC32); + + /* Write header to disk */ + return FstubWriteSector(Disk->DeviceObject, + Disk->SectorSize, + EFIHeader->MyLBA, + Disk->Buffer); +} + +NTSTATUS +NTAPI +FstubWritePartitionTableEFI(IN PDISK_INFORMATION Disk, + IN GUID DiskGUID, + IN ULONG MaxPartitionCount, + IN ULONGLONG FirstUsableLBA, + IN ULONGLONG LastUsableLBA, + IN BOOLEAN WriteBackupTable, + IN ULONG PartitionCount, + IN PPARTITION_INFORMATION_EX PartitionEntries OPTIONAL) +{ + NTSTATUS Status; + EFI_PARTITION_ENTRY Entry; + ULONG i, WrittenPartitions, SectoredPartitionEntriesSize, PartitionEntryCRC32; + PAGED_CODE(); + + ASSERT(Disk); + ASSERT(MaxPartitionCount >= 128); + ASSERT(PartitionCount <= MaxPartitionCount); + + PartitionEntryCRC32 = 0; + /* Count how much sectors we'll have to read to read the whole partition table */ + SectoredPartitionEntriesSize = (MaxPartitionCount * PARTITION_ENTRY_SIZE) / Disk->SectorSize; + + for (i = 0, WrittenPartitions = 0; i < PartitionCount; i++) + { + /* If partition GUID is 00000000-0000-0000-0000-000000000000, then it's unused, skip it */ + if (PartitionEntries[i].Gpt.PartitionType.Data1 == 0 && + PartitionEntries[i].Gpt.PartitionType.Data2 == 0 && + PartitionEntries[i].Gpt.PartitionType.Data3 == 0 && + ((PULONGLONG)PartitionEntries[i].Gpt.PartitionType.Data4)[0] == 0) + { + continue; + } + + /* Copy the entry in the partition entry format */ + FstubCopyEntryEFI(&Entry, &PartitionEntries[i], Disk->SectorSize); + /* Then write the entry to the disk */ + Status = FstubWriteEntryEFI(Disk, + SectoredPartitionEntriesSize, + WrittenPartitions, + &Entry, + WriteBackupTable, + FALSE, + &PartitionEntryCRC32); + if (!NT_SUCCESS(Status)) + { + return Status; + } + WrittenPartitions++; + } + + /* Zero the buffer to write zeros to the disk */ + RtlZeroMemory(&Entry, sizeof(EFI_PARTITION_ENTRY)); + /* Write the disks with zeros for every unused remaining partition entry */ + for (i = WrittenPartitions; i < MaxPartitionCount; i++) + { + Status = FstubWriteEntryEFI(Disk, + SectoredPartitionEntriesSize, + i, + &Entry, + WriteBackupTable, + FALSE, + &PartitionEntryCRC32); + if (!NT_SUCCESS(Status)) + { + return Status; + } + } + + /* Once we're done, write the GPT header */ + return FstubWriteHeaderEFI(Disk, + SectoredPartitionEntriesSize, + DiskGUID, + MaxPartitionCount, + FirstUsableLBA, + LastUsableLBA, + PartitionEntryCRC32, + WriteBackupTable); +} + +NTSTATUS +NTAPI +FstubWritePartitionTableMBR(IN PDISK_INFORMATION Disk, + IN PDRIVE_LAYOUT_INFORMATION_EX LayoutEx) +{ + NTSTATUS Status; + PDRIVE_LAYOUT_INFORMATION DriveLayout; + PAGED_CODE(); + + ASSERT(IS_VALID_DISK_INFO(Disk)); + ASSERT(LayoutEx); + + /* Convert data to the correct format */ + DriveLayout = FstubConvertExtendedToLayout(LayoutEx); + if (!DriveLayout) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Really write information */ + Status = IoWritePartitionTable(Disk->DeviceObject, + Disk->SectorSize, + Disk->DiskGeometry.Geometry.SectorsPerTrack, + Disk->DiskGeometry.Geometry.TracksPerCylinder, + DriveLayout); + + /* Free allocated structure and return */ + ExFreePool(DriveLayout); + return Status; +} + +NTSTATUS +NTAPI +FstubWriteSector(IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONGLONG StartingSector OPTIONAL, + IN PUSHORT Buffer) +{ + PIRP Irp; + KEVENT Event; + NTSTATUS Status; + LARGE_INTEGER StartingOffset; + IO_STATUS_BLOCK IoStatusBlock; + PIO_STACK_LOCATION IoStackLocation; + PAGED_CODE(); + + ASSERT(DeviceObject); + ASSERT(Buffer); + ASSERT(SectorSize); + + /* Compute starting offset */ + StartingOffset.QuadPart = StartingSector * SectorSize; + + /* Initialize waiting event */ + KeInitializeEvent(&Event, NotificationEvent, FALSE); + + /* Prepare IRP */ + Irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE, + DeviceObject, + Buffer, + SectorSize, + &StartingOffset, + &Event, + &IoStatusBlock); + if (!Irp) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Override volume verify */ + IoStackLocation = IoGetNextIrpStackLocation(Irp); + IoStackLocation->Flags |= SL_OVERRIDE_VERIFY_VOLUME; + + /* Then call driver, and wait for completion if needed */ + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatusBlock.Status; + } + + return Status; +} + /* FUNCTIONS *****************************************************************/ /* - * @unimplemented + * @implemented */ NTSTATUS NTAPI IoCreateDisk(IN PDEVICE_OBJECT DeviceObject, IN struct _CREATE_DISK* Disk) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PARTITION_STYLE PartitionStyle; + PAGED_CODE(); + + ASSERT(DeviceObject); + + /* Get partition style. If caller didn't provided data, assume it's raw */ + PartitionStyle = ((Disk) ? Disk->PartitionStyle : PARTITION_STYLE_RAW); + /* Then, call appropriate internal function */ + switch (PartitionStyle) + { + case PARTITION_STYLE_MBR: + return FstubCreateDiskMBR(DeviceObject, &(Disk->Mbr)); + case PARTITION_STYLE_GPT: + return FstubCreateDiskEFI(DeviceObject, &(Disk->Gpt)); + case PARTITION_STYLE_RAW: + return FstubCreateDiskRaw(DeviceObject); + default: + return STATUS_NOT_SUPPORTED; + } } /* - * @unimplemented + * @implemented */ NTSTATUS NTAPI IoGetBootDiskInformation(IN OUT PBOOTDISK_INFORMATION BootDiskInformation, IN ULONG Size) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PIRP Irp; + KEVENT Event; + PLIST_ENTRY NextEntry; + PFILE_OBJECT FileObject; + DISK_GEOMETRY DiskGeometry; + PDEVICE_OBJECT DeviceObject; + UNICODE_STRING DeviceStringW; + IO_STATUS_BLOCK IoStatusBlock; + CHAR Buffer[128], ArcBuffer[128]; + NTSTATUS Status = STATUS_SUCCESS; + BOOLEAN SingleDisk, IsBootDiskInfoEx; + PARC_DISK_SIGNATURE ArcDiskSignature; + PARC_DISK_INFORMATION ArcDiskInformation; + PARTITION_INFORMATION_EX PartitionInformation; + PDRIVE_LAYOUT_INFORMATION_EX DriveLayout = NULL; + ULONG DiskCount, DiskNumber, Signature, PartitionNumber; + ANSI_STRING ArcBootString, ArcSystemString, DeviceStringA, ArcNameStringA; + extern PLOADER_PARAMETER_BLOCK IopLoaderBlock; + PAGED_CODE(); + + /* Get loader block. If it's null, we come to late */ + if (!IopLoaderBlock) + { + return STATUS_TOO_LATE; + } + + /* Check buffer size */ + if (Size < sizeof(BOOTDISK_INFORMATION)) + { + return STATUS_INVALID_PARAMETER; + } + + /* Init some useful stuff: + * Get arc disks information + * Check whether we have a single disk + * Check received structure size (extended or not?) + * Init boot strings (system/boot) + * Finaly, get disk count + */ + ArcDiskInformation = IopLoaderBlock->ArcDiskInformation; + SingleDisk = IsListEmpty(&(ArcDiskInformation->DiskSignatureListHead)); + IsBootDiskInfoEx = (Size >= sizeof(BOOTDISK_INFORMATION_EX)); + RtlInitAnsiString(&ArcBootString, IopLoaderBlock->ArcBootDeviceName); + RtlInitAnsiString(&ArcSystemString, IopLoaderBlock->ArcHalDeviceName); + DiskCount = IoGetConfigurationInformation()->DiskCount; + + /* If no disk, return success */ + if (DiskCount == 0) + { + return STATUS_SUCCESS; + } + + /* Now, browse all disks */ + for (DiskNumber = 0; DiskNumber < DiskCount; DiskNumber++) + { + /* Create the device name */ + sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition0", DiskNumber); + RtlInitAnsiString(&DeviceStringA, Buffer); + Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE); + if (!NT_SUCCESS(Status)) + { + continue; + } + + /* Get its device object */ + Status = IoGetDeviceObjectPointer(&DeviceStringW, + FILE_READ_ATTRIBUTES, + &FileObject, + &DeviceObject); + RtlFreeUnicodeString(&DeviceStringW); + if (!NT_SUCCESS(Status)) + { + continue; + } + + /* Prepare for getting disk geometry */ + Irp = IoBuildDeviceIoControlRequest(IOCTL_DISK_GET_DRIVE_GEOMETRY, + DeviceObject, + NULL, + 0, + &DiskGeometry, + sizeof(DISK_GEOMETRY), + FALSE, + &Event, + &IoStatusBlock); + if (!Irp) + { + ObDereferenceObject(FileObject); + continue; + } + + /* Then, call the drive, and wait for it if needed */ + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatusBlock.Status; + } + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(FileObject); + continue; + } + + /* Read partition table */ + Status = IoReadPartitionTableEx(DeviceObject, + &DriveLayout); + + /* FileObject, you can go! */ + ObDereferenceObject(FileObject); + + if (!NT_SUCCESS(Status)) + { + continue; + } + + /* Ensure we have at least 512 bytes per sector */ + if (DiskGeometry.BytesPerSector < 512) + { + DiskGeometry.BytesPerSector = 512; + } + + /* Now, for each arc disk, try to find the matching */ + for (NextEntry = ArcDiskInformation->DiskSignatureListHead.Flink; + NextEntry != &ArcDiskInformation->DiskSignatureListHead; + NextEntry = NextEntry->Flink) + { + ArcDiskSignature = CONTAINING_RECORD(NextEntry, + ARC_DISK_SIGNATURE, + ListEntry); + /* If they matches, ie + * - There's only one disk for both BIOS and detected + * - Signatures are matching + * - This is MBR + * (We don't check checksums here) + */ + if (((SingleDisk && DiskCount == 1) || + (IopVerifyDiskSignature(DriveLayout, ArcDiskSignature, &Signature))) && + (DriveLayout->PartitionStyle == PARTITION_STYLE_MBR)) + { + /* Create arc name */ + sprintf(ArcBuffer, "\\ArcName\\%s", ArcDiskSignature->ArcName); + RtlInitAnsiString(&ArcNameStringA, ArcBuffer); + + /* Browse all partitions */ + for (PartitionNumber = 1; PartitionNumber <= DriveLayout->PartitionCount; PartitionNumber++) + { + /* Create its device name */ + sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition%lu", DiskNumber, PartitionNumber); + RtlInitAnsiString(&DeviceStringA, Buffer); + Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE); + if (!NT_SUCCESS(Status)) + { + continue; + } + + /* If IopVerifyDiskSignature returned no signature, take the one from DriveLayout */ + if (!Signature) + { + Signature = DriveLayout->Mbr.Signature; + } + + /* Create partial arc name */ + sprintf(ArcBuffer, "%spartition(%lu)", ArcDiskSignature->ArcName, PartitionNumber); + RtlInitAnsiString(&ArcNameStringA, ArcBuffer); + + /* If it's matching boot string */ + if (RtlEqualString(&ArcNameStringA, &ArcBootString, TRUE)) + { + /* Then, fill in information about boot device */ + BootDiskInformation->BootDeviceSignature = Signature; + + /* Get its device object */ + Status = IoGetDeviceObjectPointer(&DeviceStringW, + FILE_READ_ATTRIBUTES, + &FileObject, + &DeviceObject); + if (!NT_SUCCESS(Status)) + { + RtlFreeUnicodeString(&DeviceStringW); + continue; + } + + /* And call the drive to get information about partition */ + Irp = IoBuildDeviceIoControlRequest(IOCTL_DISK_GET_PARTITION_INFO_EX, + DeviceObject, + NULL, + 0, + &PartitionInformation, + sizeof(PARTITION_INFORMATION_EX), + FALSE, + &Event, + &IoStatusBlock); + if (!Irp) + { + ObDereferenceObject(FileObject); + RtlFreeUnicodeString(&DeviceStringW); + continue; + } + + /* Call & wait if needed */ + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatusBlock.Status; + } + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(FileObject); + RtlFreeUnicodeString(&DeviceStringW); + continue; + } + + /* We get partition offset as demanded and return it */ + BootDiskInformation->BootPartitionOffset = PartitionInformation.StartingOffset.QuadPart; + + /* If called passed a BOOTDISK_INFORMATION_EX structure, give more intel */ + if (IsBootDiskInfoEx) + { + /* Is PT MBR or GPT? */ + if (DriveLayout->PartitionStyle == PARTITION_STYLE_GPT) + { + ((PBOOTDISK_INFORMATION_EX)BootDiskInformation)->BootDeviceGuid = DriveLayout->Gpt.DiskId; + ((PBOOTDISK_INFORMATION_EX)BootDiskInformation)->BootDeviceIsGpt = TRUE; + } + else + { + ((PBOOTDISK_INFORMATION_EX)BootDiskInformation)->BootDeviceIsGpt = FALSE; + } + } + + /* Dereference FileObject */ + ObDereferenceObject(FileObject); + } + + /* If it's matching system string */ + if (RtlEqualString(&ArcNameStringA, &ArcSystemString, TRUE)) + { + /* Then, fill in information about the system device */ + BootDiskInformation->SystemDeviceSignature = Signature; + + /* Get its device object */ + Status = IoGetDeviceObjectPointer(&DeviceStringW, + FILE_READ_ATTRIBUTES, + &FileObject, + &DeviceObject); + if (!NT_SUCCESS(Status)) + { + RtlFreeUnicodeString(&DeviceStringW); + continue; + } + + /* And call the drive to get information about partition */ + Irp = IoBuildDeviceIoControlRequest(IOCTL_DISK_GET_PARTITION_INFO_EX, + DeviceObject, + NULL, + 0, + &PartitionInformation, + sizeof(PARTITION_INFORMATION_EX), + FALSE, + &Event, + &IoStatusBlock); + if (!Irp) + { + ObDereferenceObject(FileObject); + RtlFreeUnicodeString(&DeviceStringW); + continue; + } + + /* Call & wait if needed */ + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatusBlock.Status; + } + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(FileObject); + RtlFreeUnicodeString(&DeviceStringW); + continue; + } + + /* We get partition offset as demanded and return it */ + BootDiskInformation->SystemPartitionOffset = PartitionInformation.StartingOffset.QuadPart; + + /* If called passed a BOOTDISK_INFORMATION_EX structure, give more intel */ + if (IsBootDiskInfoEx) + { + /* Is PT MBR or GPT? */ + if (DriveLayout->PartitionStyle == PARTITION_STYLE_GPT) + { + ((PBOOTDISK_INFORMATION_EX)BootDiskInformation)->SystemDeviceGuid = DriveLayout->Gpt.DiskId; + ((PBOOTDISK_INFORMATION_EX)BootDiskInformation)->SystemDeviceIsGpt = TRUE; + } + else + { + ((PBOOTDISK_INFORMATION_EX)BootDiskInformation)->SystemDeviceIsGpt = FALSE; + } + } + + /* Dereference FileObject */ + ObDereferenceObject(FileObject); + } + + /* Release device string */ + RtlFreeUnicodeString(&DeviceStringW); + } + } + } + + /* Finally, release drive layout structure */ + ExFreePool(DriveLayout); + } + + /* And return */ + return Status; } /* - * @unimplemented + * @implemented */ NTSTATUS NTAPI @@ -47,24 +2054,172 @@ IoReadDiskSignature(IN PDEVICE_OBJECT DeviceObject, IN ULONG BytesPerSector, OUT PDISK_SIGNATURE Signature) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PULONG Buffer; + NTSTATUS Status; + ULONG HeaderCRC32, i, CheckSum; + PEFI_PARTITION_HEADER EFIHeader; + PPARTITION_DESCRIPTOR PartitionDescriptor; + PAGED_CODE(); + + /* Ensure we'll read at least 512 bytes */ + if (BytesPerSector < 512) + { + BytesPerSector = 512; + } + + /* Allocate a buffer for reading operations */ + Buffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, BytesPerSector, TAG_FSTUB); + if (!Buffer) + { + return STATUS_NO_MEMORY; + } + + /* Read first sector (sector 0) for MBR */ + Status = FstubReadSector(DeviceObject, + BytesPerSector, + 0ULL, + (PUSHORT)Buffer); + if (!NT_SUCCESS(Status)) + { + goto Cleanup; + } + + /* Get the partition descriptor array */ + PartitionDescriptor = (PPARTITION_DESCRIPTOR) + &(Buffer[PARTITION_TABLE_OFFSET]); + /* Check partitions types: if first is 0xEE and all the others 0, we have GPT */ + if (PartitionDescriptor[0].PartitionType == EFI_PMBR_OSTYPE_EFI && + PartitionDescriptor[1].PartitionType == 0 && + PartitionDescriptor[2].PartitionType == 0 && + PartitionDescriptor[3].PartitionType == 0) + { + /* If we have GPT, read second sector (sector 1) for GPT header */ + Status = FstubReadSector(DeviceObject, + BytesPerSector, + 1ULL, + (PUSHORT)Buffer); + if (!NT_SUCCESS(Status)) + { + goto Cleanup; + } + EFIHeader = (PEFI_PARTITION_HEADER)Buffer; + + /* First check signature + * Then, check version (we only support v1 + * Finally check header size + */ + if (EFIHeader->Signature != EFI_HEADER_SIGNATURE || + EFIHeader->Revision != EFI_HEADER_REVISION_1 || + EFIHeader->HeaderSize != sizeof(EFI_PARTITION_HEADER)) + { + Status = STATUS_DISK_CORRUPT_ERROR; + goto Cleanup; + } + + /* Save current checksum */ + HeaderCRC32 = EFIHeader->HeaderCRC32; + /* Then zero the one in EFI header. This is needed to compute header checksum */ + EFIHeader->HeaderCRC32 = 0; + /* Compute header checksum and compare with the one present in partition table */ + if (RtlComputeCrc32(0, (PUCHAR)Buffer, sizeof(EFI_PARTITION_HEADER)) != HeaderCRC32) + { + Status = STATUS_DISK_CORRUPT_ERROR; + goto Cleanup; + } + + /* Set partition table style to GPT and return disk GUID */ + Signature->PartitionStyle = PARTITION_STYLE_GPT; + Signature->Gpt.DiskId = EFIHeader->DiskGUID; + } + else + { + /* Compute MBR checksum */ + for (i = 0, CheckSum = 0; i < 512 / sizeof(ULONG) ; i++) + { + CheckSum += Buffer[i]; + } + + /* Set partition table style to MBR and return signature (offset 440) and checksum */ + Signature->PartitionStyle = PARTITION_STYLE_MBR; + Signature->Mbr.Signature = Buffer[PARTITION_TABLE_OFFSET / 2 - 1]; + Signature->Mbr.CheckSum = CheckSum; + } + +Cleanup: + /* Free buffer and return */ + ExFreePoolWithTag(Buffer, TAG_FSTUB); + return Status; } /* - * @unimplemented + * @implemented */ NTSTATUS NTAPI IoReadPartitionTableEx(IN PDEVICE_OBJECT DeviceObject, IN struct _DRIVE_LAYOUT_INFORMATION_EX** DriveLayout) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + PDISK_INFORMATION Disk; + PARTITION_STYLE PartitionStyle; + PAGED_CODE(); + + ASSERT(DeviceObject); + ASSERT(DriveLayout); + + /* First of all, allocate internal structure */ + Status = FstubAllocateDiskInformation(DeviceObject, &Disk, 0); + if (!NT_SUCCESS(Status)) + { + return Status; + } + ASSERT(Disk); + + /* Then, detect partition style (MBR? GTP/EFI? RAW?) */ + Status = FstubDetectPartitionStyle(Disk, &PartitionStyle); + if (!NT_SUCCESS(Status)) + { + FstubFreeDiskInformation(Disk); + return Status; + } + + /* Here partition table is really read, depending on its style */ + switch (PartitionStyle) + { + case PARTITION_STYLE_MBR: + case PARTITION_STYLE_RAW: + Status = FstubReadPartitionTableMBR(Disk, FALSE, DriveLayout); + break; + + case PARTITION_STYLE_GPT: + /* Read primary table */ + Status = FstubReadPartitionTableEFI(Disk, FALSE, DriveLayout); + /* If it failed, try reading backup table */ + if (!NT_SUCCESS(Status)) + { + Status = FstubReadPartitionTableEFI(Disk, TRUE, DriveLayout); + } + break; + + default: + DPRINT("Unknown partition type\n"); + Status = STATUS_UNSUCCESSFUL; + } + + /* It's over, internal structure not needed anymore */ + FstubFreeDiskInformation(Disk); + + /* In case of success, print data */ + if (NT_SUCCESS(Status)) + { + FstubDbgPrintDriveLayoutEx(*DriveLayout); + } + + return Status; } /* - * @unimplemented + * @implemented */ NTSTATUS NTAPI @@ -72,32 +2227,207 @@ IoSetPartitionInformationEx(IN PDEVICE_OBJECT DeviceObject, IN ULONG PartitionNumber, IN struct _SET_PARTITION_INFORMATION_EX* PartitionInfo) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + PDISK_INFORMATION Disk; + PARTITION_STYLE PartitionStyle; + PAGED_CODE(); + + ASSERT(DeviceObject); + ASSERT(PartitionInfo); + + /* Debug given modifications */ + FstubDbgPrintSetPartitionEx(PartitionInfo, PartitionNumber); + + /* Allocate internal structure */ + Status = FstubAllocateDiskInformation(DeviceObject, &Disk, NULL); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Get partition table style on disk */ + Status = FstubDetectPartitionStyle(Disk, &PartitionStyle); + if (!NT_SUCCESS(Status)) + { + FstubFreeDiskInformation(Disk); + return Status; + } + + /* If it's not matching partition style given in modifications, give up */ + if (PartitionInfo->PartitionStyle != PartitionStyle) + { + FstubFreeDiskInformation(Disk); + return STATUS_INVALID_PARAMETER; + } + + /* Finally, handle modifications using proper function */ + switch (PartitionStyle) + { + case PARTITION_STYLE_MBR: + Status = IoSetPartitionInformation(DeviceObject, + Disk->SectorSize, + PartitionNumber, + PartitionInfo->Mbr.PartitionType); + break; + case PARTITION_STYLE_GPT: + Status = FstubSetPartitionInformationEFI(Disk, + PartitionNumber, + &(PartitionInfo->Gpt)); + break; + default: + Status = STATUS_NOT_SUPPORTED; + } + + /* Release internal structure and return */ + FstubFreeDiskInformation(Disk); + return Status; } /* - * @unimplemented + * @implemented */ NTSTATUS NTAPI IoVerifyPartitionTable(IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN FixErrors) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + PDISK_INFORMATION Disk; + PARTITION_STYLE PartitionStyle; + PAGED_CODE(); + + ASSERT(DeviceObject); + + /* Allocate internal structure */ + Status = FstubAllocateDiskInformation(DeviceObject, &Disk, NULL); + if (!NT_SUCCESS(Status)) + { + return Status; + } + ASSERT(Disk); + + /* Get partition table style on disk */ + Status = FstubDetectPartitionStyle(Disk, &PartitionStyle); + if (!NT_SUCCESS(Status)) + { + FstubFreeDiskInformation(Disk); + return Status; + } + + /* Action will depend on partition style */ + switch (PartitionStyle) + { + /* For MBR, assume it's always OK */ + case PARTITION_STYLE_MBR: + Status = STATUS_SUCCESS; + break; + /* For GPT, call internal function */ + case PARTITION_STYLE_GPT: + Status = FstubVerifyPartitionTableEFI(Disk, FixErrors); + break; + /* Otherwise, signal we can't work */ + default: + Status = STATUS_NOT_SUPPORTED; + } + + /* Release internal structure and return */ + FstubFreeDiskInformation(Disk); + return Status; } /* - * @unimplemented + * @implemented */ NTSTATUS NTAPI IoWritePartitionTableEx(IN PDEVICE_OBJECT DeviceObject, - IN struct _DRIVE_LAYOUT_INFORMATION_EX* DriveLayfout) + IN struct _DRIVE_LAYOUT_INFORMATION_EX* DriveLayout) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + PDISK_INFORMATION Disk; + ULONGLONG SectorsForPartitions; + EFI_PARTITION_HEADER EfiHeader; + PAGED_CODE(); + + ASSERT(DeviceObject); + ASSERT(DriveLayout); + + /* Debug partition table that must be written */ + FstubDbgPrintDriveLayoutEx(DriveLayout); + + /* Allocate internal structure */ + Status = FstubAllocateDiskInformation(DeviceObject, &Disk, 0); + if (!NT_SUCCESS(Status)) + { + return Status; + } + ASSERT(Disk); + + switch (DriveLayout->PartitionStyle) + { + case PARTITION_STYLE_MBR: + Status = FstubWritePartitionTableMBR(Disk, DriveLayout); + break; + + case PARTITION_STYLE_GPT: + /* Read primary table header */ + Status = FstubReadHeaderEFI(Disk, + FALSE, + &EfiHeader); + /* If it failed, try reading back table header */ + if (!NT_SUCCESS(Status)) + { + Status = FstubReadHeaderEFI(Disk, + TRUE, + &EfiHeader); + } + + /* We have a header! */ + if (NT_SUCCESS(Status)) + { + /* Check if there are enough places for the partitions to be written */ + if (DriveLayout->PartitionCount <= EfiHeader.NumberOfEntries) + { + /* Count number of sectors needed to store partitions */ + SectorsForPartitions = (EfiHeader.NumberOfEntries * PARTITION_ENTRY_SIZE) / Disk->SectorSize; + /* Set first usable LBA: Legacy MBR + GPT header + Partitions entries */ + EfiHeader.FirstUsableLBA = SectorsForPartitions + 2; + /* Set last usable LBA: Last sector - GPT header - Partitions entries */ + EfiHeader.LastUsableLBA = Disk->SectorCount - SectorsForPartitions - 1; + /* Write primary table */ + Status = FstubWritePartitionTableEFI(Disk, + EfiHeader.DiskGUID, + EfiHeader.NumberOfEntries, + EfiHeader.FirstUsableLBA, + EfiHeader.LastUsableLBA, + FALSE, + DriveLayout->PartitionCount, + DriveLayout->PartitionEntry); + /* If it succeed, also update backup table */ + if (NT_SUCCESS(Status)) + { + Status = FstubWritePartitionTableEFI(Disk, + EfiHeader.DiskGUID, + EfiHeader.NumberOfEntries, + EfiHeader.FirstUsableLBA, + EfiHeader.LastUsableLBA, + TRUE, + DriveLayout->PartitionCount, + DriveLayout->PartitionEntry); + } + } + } + break; + + default: + DPRINT("Unsupported partition style: %ld\n", DriveLayout->PartitionStyle); + Status = STATUS_NOT_SUPPORTED; + } + + /* It's over, internal structure not needed anymore */ + FstubFreeDiskInformation(Disk); + + return Status; } /* EOF */ diff --git a/ntoskrnl/inbv/inbv.c b/ntoskrnl/inbv/inbv.c index a324fadfe95..280e918bd83 100644 --- a/ntoskrnl/inbv/inbv.c +++ b/ntoskrnl/inbv/inbv.c @@ -73,11 +73,15 @@ FindBitmapResource(IN PLOADER_PARAMETER_BLOCK LoaderBlock, if (NT_SUCCESS(Status)) { /* Access the resource */ + ULONG Size = 0; Status = LdrAccessResource(LdrEntry->DllBase, ResourceDataEntry, &Data, - NULL); - if (Data) KiBugCheckData[4] ^= RtlComputeCrc32(0, Data, PAGE_SIZE); + &Size); + if ((Data) && (ResourceId < 3)) + { + KiBugCheckData[4] ^= RtlComputeCrc32(0, Data, Size); + } if (!NT_SUCCESS(Status)) Data = NULL; } } @@ -115,8 +119,8 @@ InbvDriverInitialize(IN PLOADER_PARAMETER_BLOCK LoaderBlock, VidResetDisplay(CustomLogo); /* Find bitmap resources in the kernel */ - ResourceCount = Count; - for (i = 0; i < Count; i++) + ResourceCount = min(IDB_CLUSTER_SERVER, Count); + for (i = 1; i <= Count; i++) { /* Do the lookup */ ResourceList[i] = FindBitmapResource(LoaderBlock, i); diff --git a/ntoskrnl/include/internal/amd64/mm.h b/ntoskrnl/include/internal/amd64/mm.h index a9d865b8942..d6343ed2d2c 100644 --- a/ntoskrnl/include/internal/amd64/mm.h +++ b/ntoskrnl/include/internal/amd64/mm.h @@ -152,6 +152,27 @@ MiIsPdeForAddressValid(PVOID Address) #define VAtoPDI(va) ((((ULONG64)va) >> PDI_SHIFT) & 0x1FF) #define VAtoPTI(va) ((((ULONG64)va) >> PTI_SHIFT) & 0x1FF) +FORCEINLINE +VOID +MI_MAKE_PROTOTYPE_PTE(IN PMMPTE NewPte, + IN PMMPTE PointerPte) +{ + ULONG_PTR Offset; + + /* Store the Address */ + NewPte->u.Long = (ULONG64)PointerPte; + + /* Mark this as a prototype PTE */ + NewPte->u.Proto.Prototype = 1; + NewPte->u.Proto.Valid = 1; + NewPte->u.Proto.ReadOnly = 0; + NewPte->u.Proto.Protection = 0; +} + +/* Sign extend 48 bits */ +#define MiProtoPteToPte(x) \ + (PMMPTE)((LONG64)(x)->u.Proto.ProtoAddress) + /* We don't use these hacks */ VOID FORCEINLINE diff --git a/ntoskrnl/include/internal/cm.h b/ntoskrnl/include/internal/cm.h index 62f4010f20b..30fa3669f4a 100644 --- a/ntoskrnl/include/internal/cm.h +++ b/ntoskrnl/include/internal/cm.h @@ -1501,6 +1501,13 @@ CmUnloadKey( IN ULONG Flags ); +ULONG +NTAPI +CmCountOpenSubKeys( + IN PCM_KEY_CONTROL_BLOCK RootKcb, + IN BOOLEAN RemoveEmptyCacheEntries +); + // // Startup and Shutdown // diff --git a/ntoskrnl/include/internal/io.h b/ntoskrnl/include/internal/io.h index 11ed38f22f3..28bc779111c 100644 --- a/ntoskrnl/include/internal/io.h +++ b/ntoskrnl/include/internal/io.h @@ -741,6 +741,14 @@ IoInitSystem( IN PLOADER_PARAMETER_BLOCK LoaderBlock ); +BOOLEAN +NTAPI +IopVerifyDiskSignature( + IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout, + IN PARC_DISK_SIGNATURE ArcDiskSignature, + OUT PULONG Signature +); + // // Device/Volume Routines // @@ -1165,6 +1173,23 @@ IopStartRamdisk( IN PLOADER_PARAMETER_BLOCK LoaderBlock ); +// +// Configuration Routines +// +NTSTATUS +NTAPI +IopFetchConfigurationInformation(OUT PWSTR * SymbolicLinkList, + IN GUID Guid, + IN ULONG ExpectedInterfaces, + IN PULONG Interfaces +); + +VOID +NTAPI +IopStoreSystemPartitionInformation(IN PUNICODE_STRING NtSystemPartitionDeviceName, + IN PUNICODE_STRING OsLoaderPathName +); + // // Global I/O Data // diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h index 346d9c08a54..25360af7416 100644 --- a/ntoskrnl/include/internal/mm.h +++ b/ntoskrnl/include/internal/mm.h @@ -8,7 +8,6 @@ struct _EPROCESS; extern PFN_NUMBER MiFreeSwapPages; extern PFN_NUMBER MiUsedSwapPages; -extern SIZE_T MmPagedPoolSize; extern SIZE_T MmTotalPagedPoolQuota; extern SIZE_T MmTotalNonPagedPoolQuota; extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress; @@ -19,9 +18,6 @@ extern PFN_NUMBER MmHighestPhysicalPage; extern PFN_NUMBER MmAvailablePages; extern PFN_NUMBER MmResidentAvailablePages; -extern PVOID MmPagedPoolBase; -extern SIZE_T MmPagedPoolSize; - extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor; extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg; @@ -76,20 +72,8 @@ typedef ULONG SWAPENTRY; #define MI_STATIC_MEMORY_AREAS (13) #endif -#define MEMORY_AREA_INVALID (0) #define MEMORY_AREA_SECTION_VIEW (1) -#define MEMORY_AREA_CONTINUOUS_MEMORY (2) -#define MEMORY_AREA_NO_CACHE (3) -#define MEMORY_AREA_IO_MAPPING (4) -#define MEMORY_AREA_SYSTEM (5) -#define MEMORY_AREA_MDL_MAPPING (7) #define MEMORY_AREA_VIRTUAL_MEMORY (8) -#define MEMORY_AREA_CACHE_SEGMENT (9) -#define MEMORY_AREA_SHARED_DATA (10) -#define MEMORY_AREA_KERNEL_STACK (11) -#define MEMORY_AREA_PAGED_POOL (12) -#define MEMORY_AREA_NO_ACCESS (13) -#define MEMORY_AREA_PEB_OR_TEB (14) #define MEMORY_AREA_OWNED_BY_ARM3 (15) #define MEMORY_AREA_STATIC (0x80000000) @@ -130,10 +114,8 @@ typedef ULONG SWAPENTRY; #define MC_CACHE (0) #define MC_USER (1) -#define MC_PPOOL (2) -#define MC_NPPOOL (3) -#define MC_SYSTEM (4) -#define MC_MAXIMUM (5) +#define MC_SYSTEM (2) +#define MC_MAXIMUM (3) #define PAGED_POOL_MASK 1 #define MUST_SUCCEED_POOL_MASK 2 @@ -278,6 +260,7 @@ typedef struct _MEMORY_AREA ULONG Flags; BOOLEAN DeleteInProgress; ULONG PageOpCount; + PVOID Vad; union { struct @@ -285,7 +268,6 @@ typedef struct _MEMORY_AREA ROS_SECTION_OBJECT* Section; ULONG ViewOffset; PMM_SECTION_SEGMENT Segment; - BOOLEAN WriteCopyView; LIST_ENTRY RegionListHead; } SectionData; struct @@ -295,6 +277,17 @@ typedef struct _MEMORY_AREA } Data; } MEMORY_AREA, *PMEMORY_AREA; +typedef struct _MM_RMAP_ENTRY +{ + struct _MM_RMAP_ENTRY* Next; + PEPROCESS Process; + PVOID Address; +#if DBG + PVOID Caller; +#endif +} +MM_RMAP_ENTRY, *PMM_RMAP_ENTRY; + // // These two mappings are actually used by Windows itself, based on the ASSERTS // @@ -306,30 +299,30 @@ typedef struct _MMPFNENTRY USHORT Modified:1; USHORT ReadInProgress:1; // StartOfAllocation USHORT WriteInProgress:1; // EndOfAllocation - USHORT PrototypePte:1; // Zero - USHORT PageColor:4; // LockCount - USHORT PageLocation:3; // Consumer + USHORT PrototypePte:1; + USHORT PageColor:4; + USHORT PageLocation:3; USHORT RemovalRequested:1; - USHORT CacheAttribute:2; // Type + USHORT CacheAttribute:2; USHORT Rom:1; - USHORT ParityError:1; + USHORT ParityError:1; // HasRmap } MMPFNENTRY; typedef struct _MMPFN { union { - PFN_NUMBER Flink; // ListEntry.Flink - ULONG WsIndex; + PFN_NUMBER Flink; + ULONG WsIndex; // SavedSwapEntry PKEVENT Event; NTSTATUS ReadStatus; SINGLE_LIST_ENTRY NextStackPfn; } u1; - PMMPTE PteAddress; // ListEntry.Blink + PMMPTE PteAddress; union { PFN_NUMBER Blink; - ULONG_PTR ShareCount; // MapCount + ULONG_PTR ShareCount; } u2; union { @@ -351,7 +344,7 @@ typedef struct _MMPFN }; union { - ULONG_PTR EntireFrame; // SavedSwapEntry + ULONG_PTR EntireFrame; struct { ULONG_PTR PteFrame:25; @@ -1164,10 +1157,10 @@ MmGetContinuousPages( BOOLEAN ZeroPages ); -NTSTATUS +VOID NTAPI -MmZeroPageThreadMain( - PVOID Context +MmZeroPageThread( + VOID ); /* hypermap.c *****************************************************************/ @@ -1189,7 +1182,7 @@ MiUnmapPageInHyperSpace(IN PEPROCESS Process, PVOID NTAPI -MiMapPagesToZeroInHyperSpace(IN PMMPFN *Pages, +MiMapPagesToZeroInHyperSpace(IN PMMPFN Pfn1, IN PFN_NUMBER NumberOfPages); VOID @@ -1208,14 +1201,6 @@ MmCreateHyperspaceMapping(IN PFN_NUMBER Page) return MiMapPageInHyperSpace(HyperProcess, Page, &HyperIrql); } -FORCEINLINE -PVOID -MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page) -{ - PMMPFN Pfn1 = MiGetPfnEntry(Page); - return MiMapPagesToZeroInHyperSpace(&Pfn1, 1); -} - #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql); /* i386/page.c *********************************************************/ @@ -1523,7 +1508,7 @@ MmFindRegion( PFILE_OBJECT NTAPI MmGetFileObjectForSection( - IN PROS_SECTION_OBJECT Section + IN PVOID Section ); NTSTATUS NTAPI @@ -1535,7 +1520,7 @@ MmGetFileNameForAddress( NTSTATUS NTAPI MmGetFileNameForSection( - IN PROS_SECTION_OBJECT Section, + IN PVOID Section, OUT POBJECT_NAME_INFORMATION *ModuleName ); @@ -1694,20 +1679,6 @@ MmCallDllInitialize( IN PLIST_ENTRY ListHead ); -/* ReactOS Mm Hacks */ -VOID -FASTCALL -MiSyncForProcessAttach( - IN PKTHREAD NextThread, - IN PEPROCESS Process -); - -VOID -FASTCALL -MiSyncForContextSwitch( - IN PKTHREAD Thread -); - extern PMMSUPPORT MmKernelAddressSpace; FORCEINLINE diff --git a/ntoskrnl/io/iomgr/arcname.c b/ntoskrnl/io/iomgr/arcname.c index 003c9bfc8ca..17d242ef5c5 100644 --- a/ntoskrnl/io/iomgr/arcname.c +++ b/ntoskrnl/io/iomgr/arcname.c @@ -5,6 +5,7 @@ * PURPOSE: ARC Path Initialization Functions * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) * Eric Kohl +* Pierre Schweitzer (pierre.schweitzer@reactos.org) */ /* INCLUDES ******************************************************************/ @@ -17,429 +18,35 @@ UNICODE_STRING IoArcHalDeviceName, IoArcBootDeviceName; PCHAR IoLoaderArcBootDeviceName; -extern PROS_LOADER_PARAMETER_BLOCK KeRosLoaderBlock; /* FUNCTIONS *****************************************************************/ -BOOLEAN +NTSTATUS INIT_FUNCTION NTAPI -IopApplyRosCdromArcHack(IN ULONG i) -{ - ULONG DeviceNumber = -1; - OBJECT_ATTRIBUTES ObjectAttributes; - ANSI_STRING InstallName; - UNICODE_STRING DeviceName; - CHAR Buffer[128], RosSysPath[16]; - FILE_BASIC_INFORMATION FileInfo; - NTSTATUS Status; - PCHAR p, q; - PCONFIGURATION_INFORMATION ConfigInfo = IoGetConfigurationInformation(); - extern BOOLEAN InitIsWinPEMode, ExpInTextModeSetup; +IopCreateArcNamesCd(IN PLOADER_PARAMETER_BLOCK LoaderBlock +); - /* Change this if you want ROS to boot properly from another directory */ - sprintf(RosSysPath, "%s", "reactos"); - - /* Only ARC Name left - Build full ARC Name */ - p = strstr(KeLoaderBlock->ArcBootDeviceName, "cdrom"); - if (p) - { - /* Build installer name */ - sprintf(Buffer, "\\Device\\CdRom%lu\\%s\\ntoskrnl.exe", i, RosSysPath); - RtlInitAnsiString(&InstallName, Buffer); - Status = RtlAnsiStringToUnicodeString(&DeviceName, &InstallName, TRUE); - if (!NT_SUCCESS(Status)) return FALSE; - - /* Try to find the installer */ - InitializeObjectAttributes(&ObjectAttributes, - &DeviceName, - 0, - NULL, - NULL); - Status = ZwQueryAttributesFile(&ObjectAttributes, &FileInfo); - - /* Free the string */ - RtlFreeUnicodeString(&DeviceName); - - /* Check if we found the file */ - if (NT_SUCCESS(Status)) - { - /* We did, save the device number */ - DeviceNumber = i; - } - else - { - /* Build live CD kernel name */ - sprintf(Buffer, - "\\Device\\CdRom%lu\\%s\\system32\\ntoskrnl.exe", - i, RosSysPath); - RtlInitAnsiString(&InstallName, Buffer); - Status = RtlAnsiStringToUnicodeString(&DeviceName, - &InstallName, - TRUE); - if (!NT_SUCCESS(Status)) return FALSE; - - /* Try to find it */ - InitializeObjectAttributes(&ObjectAttributes, - &DeviceName, - 0, - NULL, - NULL); - Status = ZwQueryAttributesFile(&ObjectAttributes, &FileInfo); - if (NT_SUCCESS(Status)) DeviceNumber = i; - - /* Free the string */ - RtlFreeUnicodeString(&DeviceName); - } - - if (!InitIsWinPEMode) - { - /* Build the name */ - sprintf(p, "cdrom(%lu)", DeviceNumber); - - /* Adjust original command line */ - q = strchr(p, ')'); - if (q) - { - q++; - strcpy(Buffer, q); - sprintf(p, "cdrom(%lu)", DeviceNumber); - strcat(p, Buffer); - } - } - } - - /* OK, how many disks are there? */ - DeviceNumber += ConfigInfo->DiskCount; - - /* Return whether this is the CD or not */ - if ((InitIsWinPEMode) || (ExpInTextModeSetup)) - { - return TRUE; - } - - /* Failed */ - return FALSE; -} - -BOOLEAN +NTSTATUS INIT_FUNCTION NTAPI -IopGetDiskInformation(IN ULONG i, - OUT PULONG CheckSum, - OUT PULONG Signature, - OUT PULONG PartitionCount, - OUT PDEVICE_OBJECT *DiskDeviceObject) -{ - ULONG j, Checksum; - ANSI_STRING TempString; - CHAR Buffer[128]; - UNICODE_STRING DeviceName; - NTSTATUS Status; - PDEVICE_OBJECT DeviceObject; - PFILE_OBJECT FileObject; - DISK_GEOMETRY DiskGeometry; - PDRIVE_LAYOUT_INFORMATION DriveLayout; - KEVENT Event; - PIRP Irp; - IO_STATUS_BLOCK StatusBlock; - LARGE_INTEGER PartitionOffset; - PULONG PartitionBuffer; - - /* Build the name */ - sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition0", i); - - /* Convert it to Unicode */ - RtlInitAnsiString(&TempString, Buffer); - Status = RtlAnsiStringToUnicodeString(&DeviceName, &TempString, TRUE); - if (!NT_SUCCESS(Status)) return FALSE; - - /* Get the device pointer */ - Status = IoGetDeviceObjectPointer(&DeviceName, - FILE_READ_ATTRIBUTES, - &FileObject, - &DeviceObject); - *DiskDeviceObject = DeviceObject; - - /* Free the string */ - RtlFreeUnicodeString(&DeviceName); - - /* Move on if we failed */ - if (!NT_SUCCESS(Status)) return FALSE; - - /* Build an IRP to determine the sector size */ - KeInitializeEvent(&Event, NotificationEvent, FALSE); - Irp = IoBuildDeviceIoControlRequest(IOCTL_DISK_GET_DRIVE_GEOMETRY, - DeviceObject, - NULL, - 0, - &DiskGeometry, - sizeof(DISK_GEOMETRY), - FALSE, - &Event, - &StatusBlock); - if (!Irp) - { - /* Try again */ - ObDereferenceObject(FileObject); - return FALSE; - } - - /* Call the driver and check if we have to wait on it */ - Status = IoCallDriver(DeviceObject, Irp); - if (Status == STATUS_PENDING) - { - /* Wait on the driver */ - KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); - Status = StatusBlock.Status; - } - - /* Check if we failed */ - if (!NT_SUCCESS(Status)) - { - /* Try again */ - ObDereferenceObject(FileObject); - return FALSE; - } - - /* Read the partition table */ - Status = IoReadPartitionTable(DeviceObject, - DiskGeometry.BytesPerSector, - TRUE, - &DriveLayout); - - /* Dereference the file object */ - ObDereferenceObject(FileObject); - if (!NT_SUCCESS(Status)) return FALSE; - - /* Set the offset to 0 */ - PartitionOffset.QuadPart = 0; - - /* Allocate a buffer for the partition */ - PartitionBuffer = ExAllocatePoolWithTag(NonPagedPool, - DiskGeometry.BytesPerSector, - TAG_IO); - if (!PartitionBuffer) - { - /* Try again */ - ExFreePoolWithTag(DriveLayout, TAG_FILE_SYSTEM); - return FALSE; - } - - /* Build an IRP to read the partition sector */ - KeInitializeEvent(&Event, NotificationEvent, FALSE); - Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ, - DeviceObject, - PartitionBuffer, - DiskGeometry.BytesPerSector, - &PartitionOffset, - &Event, - &StatusBlock); - if (!Irp) - { - /* Try again */ - ExFreePoolWithTag(PartitionBuffer, TAG_IO); - ExFreePoolWithTag(DriveLayout, TAG_FILE_SYSTEM); - return FALSE; - } - - /* Call the driver and check if we have to wait */ - Status = IoCallDriver(DeviceObject, Irp); - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); - Status = StatusBlock.Status; - } - - /* Check if we failed */ - if (!NT_SUCCESS(Status)) - { - /* Try again */ - ExFreePoolWithTag(PartitionBuffer, TAG_IO); - ExFreePoolWithTag(DriveLayout, TAG_FILE_SYSTEM); - return FALSE; - } - - /* Calculate the MBR checksum */ - Checksum = 0; - for (j = 0; j < 128; j++) Checksum += PartitionBuffer[j]; - - /* Save the signature and checksum */ - *CheckSum = ~Checksum + 1; - *Signature = DriveLayout->Signature; - *PartitionCount = DriveLayout->PartitionCount; - - /* Free the buffer */ - ExFreePoolWithTag(PartitionBuffer, TAG_IO); - ExFreePoolWithTag(DriveLayout, TAG_FILE_SYSTEM); - return TRUE; -} - -BOOLEAN -INIT_FUNCTION -NTAPI -IopAssignArcNamesToCdrom(IN PLOADER_PARAMETER_BLOCK LoaderBlock, - IN PULONG Buffer, - IN ULONG DiskNumber) -{ - CHAR ArcBuffer[128]; - ANSI_STRING TempString; - UNICODE_STRING DeviceName, ArcName; - NTSTATUS Status; - LARGE_INTEGER PartitionOffset; - KEVENT Event; - IO_STATUS_BLOCK IoStatusBlock; - PIRP Irp; - ULONG i, CheckSum = 0; - PDEVICE_OBJECT DeviceObject; - PFILE_OBJECT FileObject; - PARC_DISK_INFORMATION ArcDiskInfo = LoaderBlock->ArcDiskInformation; - PLIST_ENTRY NextEntry; - PARC_DISK_SIGNATURE ArcDiskEntry; - BOOLEAN IsBootCdRom = FALSE; - - /* Build the device name */ - sprintf(ArcBuffer, "\\Device\\CdRom%lu", DiskNumber); - - /* Convert it to Unicode */ - RtlInitAnsiString(&TempString, ArcBuffer); - Status = RtlAnsiStringToUnicodeString(&DeviceName, &TempString, TRUE); - if (!NT_SUCCESS(Status)) return FALSE; - - /* Get the device for it */ - Status = IoGetDeviceObjectPointer(&DeviceName, - FILE_READ_ATTRIBUTES, - &FileObject, - &DeviceObject); - if (!NT_SUCCESS(Status)) - { - /* Free the string and fail */ - RtlFreeUnicodeString(&DeviceName); - return FALSE; - } - - /* Setup the event */ - KeInitializeEvent(&Event, NotificationEvent, FALSE); - - /* Set the offset and build the read IRP */ - PartitionOffset.QuadPart = 0x8000; - Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ, - DeviceObject, - Buffer, - 2048, - &PartitionOffset, - &Event, - &IoStatusBlock); - if (!Irp) - { - /* Free the string and fail */ - RtlFreeUnicodeString(&DeviceName); - return FALSE; - } - - /* Call the driver and check if we have to wait on it */ - Status = IoCallDriver(DeviceObject, Irp); - if (Status == STATUS_PENDING) - { - /* Wait for completion */ - KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); - Status = IoStatusBlock.Status; - } - - /* Dereference the file object */ - ObDereferenceObject(FileObject); - if (!NT_SUCCESS(Status)) return FALSE; - - /* Now calculate the checksum */ - for (i = 0; i < 2048 / sizeof(ULONG); i++) CheckSum += Buffer[i]; - -#ifndef _M_AMD64 - if (KeRosLoaderBlock) goto freeldrhack; -#endif - - /* Search if this device is the actual boot CD */ - for (NextEntry = ArcDiskInfo->DiskSignatureListHead.Flink; - NextEntry != &ArcDiskInfo->DiskSignatureListHead; - NextEntry = NextEntry->Flink) - { - /* Get the current ARC disk signature entry */ - ArcDiskEntry = CONTAINING_RECORD(NextEntry, - ARC_DISK_SIGNATURE, - ListEntry); - /* And check if checksums and arc names match */ - if (CheckSum == ArcDiskEntry->CheckSum && - strcmp(KeLoaderBlock->ArcBootDeviceName, ArcDiskEntry->ArcName) == 0) - { - IsBootCdRom = TRUE; - break; - } - } - goto checkbootcd; - -#ifndef _M_AMD64 -freeldrhack: -#endif - /* - * FIXME: In normal conditions, NTLDR/FreeLdr sends the *proper* CDROM - * ARC Path name, and what happens here is a comparision of both checksums - * in order to see if this is the actual boot CD. - * - * In ReactOS this doesn't currently happen, instead we have a hack on top - * of this file which scans the CD for the ntoskrnl.exe file, then modifies - * the LoaderBlock's ARC Path with the right CDROM path. Consequently, we - * get the same state as if NTLDR had properly booted us, except that we do - * not actually need to check the signature, since the hack already did the - * check for ntoskrnl.exe, which is just as good. - * - * The signature code stays however, because eventually FreeLDR will work - * like NTLDR, and, conversly, we do want to be able to be booted by NTLDR. - */ - IsBootCdRom = IopApplyRosCdromArcHack(DiskNumber); - -checkbootcd: - if (IsBootCdRom) - { - /* This is the boot CD-ROM, build the ARC name */ - sprintf(ArcBuffer, "\\ArcName\\%s", KeLoaderBlock->ArcBootDeviceName); - - /* Convert it to Unicode */ - RtlInitAnsiString(&TempString, ArcBuffer); - Status = RtlAnsiStringToUnicodeString(&ArcName, &TempString, TRUE); - if (!NT_SUCCESS(Status)) return FALSE; - - /* Create the symbolic link and free the strings */ - IoAssignArcName(&ArcName, &DeviceName); - RtlFreeUnicodeString(&ArcName); - RtlFreeUnicodeString(&DeviceName); - - /* Let caller know that we've found the boot CD */ - return TRUE; - } - - /* No boot CD found */ - return FALSE; -} +IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN BOOLEAN SingleDisk, + IN PBOOLEAN FoundBoot +); NTSTATUS INIT_FUNCTION NTAPI IopCreateArcNames(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { - PCONFIGURATION_INFORMATION ConfigInfo = IoGetConfigurationInformation(); PARC_DISK_INFORMATION ArcDiskInfo = LoaderBlock->ArcDiskInformation; CHAR Buffer[128]; - ANSI_STRING ArcBootString, ArcSystemString, ArcString; - UNICODE_STRING ArcName, BootPath, DeviceName; + ANSI_STRING ArcSystemString, ArcString; BOOLEAN SingleDisk; - ULONG i, j, Length; - PDEVICE_OBJECT DeviceObject; - ULONG Signature, Checksum, PartitionCount; - PLIST_ENTRY NextEntry; - PARC_DISK_SIGNATURE ArcDiskEntry; + ULONG Length; NTSTATUS Status; BOOLEAN FoundBoot = FALSE; - PULONG PartitionBuffer; /* Check if we only have one disk on the machine */ SingleDisk = ArcDiskInfo->DiskSignatureListHead.Flink->Flink == @@ -476,157 +83,704 @@ IopCreateArcNames(IN PLOADER_PARAMETER_BLOCK LoaderBlock) } /* Build the boot strings */ - RtlInitAnsiString(&ArcBootString, LoaderBlock->ArcBootDeviceName); RtlInitAnsiString(&ArcSystemString, LoaderBlock->ArcHalDeviceName); - /* Loop every detected disk */ - for (i = 0; i < ConfigInfo->DiskCount; i++) + /* FIXME: Handle IoRemoteBootClient here and create appropriate symbolic link */ + + /* Loop every disk and try to find boot disk */ + Status = IopCreateArcNamesDisk(LoaderBlock, SingleDisk, &FoundBoot); + /* If it succeed but we didn't find boot device, try to browse Cds */ + if (NT_SUCCESS(Status) && !FoundBoot) { - /* Get information about the disk */ - if (!IopGetDiskInformation(i, - &Checksum, - &Signature, - &PartitionCount, - &DeviceObject)) - { - /* Skip this disk */ - continue; - } - - /* Loop ARC disks */ - for (NextEntry = ArcDiskInfo->DiskSignatureListHead.Flink; - NextEntry != &ArcDiskInfo->DiskSignatureListHead; - NextEntry = NextEntry->Flink) - { - /* Get the current ARC disk signature entry */ - ArcDiskEntry = CONTAINING_RECORD(NextEntry, - ARC_DISK_SIGNATURE, - ListEntry); - - /* - * Now check if the signature and checksum match, unless this is - * the only disk that was in the ARC list, and also in the device - * tree, in which case the check is bypassed and we accept the disk - */ - if (((SingleDisk) && (ConfigInfo->DiskCount == 1)) || - ((Checksum == ArcDiskEntry->CheckSum) && - (Signature == ArcDiskEntry->Signature))) - { - /* Build the NT Device Name */ - sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition0", i); - - /* Convert it to Unicode */ - RtlInitAnsiString(&ArcString, Buffer); - Status = RtlAnsiStringToUnicodeString(&DeviceName, - &ArcString, - TRUE); - if (!NT_SUCCESS(Status)) continue; - - /* Build the ARC Device Name */ - sprintf(Buffer, "\\ArcName\\%s", ArcDiskEntry->ArcName); - - /* Convert it to Unicode */ - RtlInitAnsiString(&ArcString, Buffer); - Status = RtlAnsiStringToUnicodeString(&ArcName, - &ArcString, - TRUE); - if (!NT_SUCCESS(Status)) continue; - - /* Create the symbolic link and free the strings */ - IoAssignArcName(&ArcName, &DeviceName); - RtlFreeUnicodeString(&ArcName); - RtlFreeUnicodeString(&DeviceName); - - /* Loop all the partitions */ - for (j = 0; j < PartitionCount; j++) - { - /* Build the partition device name */ - sprintf(Buffer, - "\\Device\\Harddisk%lu\\Partition%lu", - i, - j + 1); - - /* Convert it to Unicode */ - RtlInitAnsiString(&ArcString, Buffer); - Status = RtlAnsiStringToUnicodeString(&DeviceName, - &ArcString, - TRUE); - if (!NT_SUCCESS(Status)) continue; - - /* Build the partial ARC name for this partition */ - sprintf(Buffer, - "%spartition(%lu)", - ArcDiskEntry->ArcName, - j + 1); - RtlInitAnsiString(&ArcString, Buffer); - - /* Check if this is the boot device */ - if (RtlEqualString(&ArcString, &ArcBootString, TRUE)) - { - /* Remember that we found a Hard Disk Boot Device */ - FoundBoot = TRUE; - } - - /* Check if it's the system boot partition */ - if (RtlEqualString(&ArcString, &ArcSystemString, TRUE)) - { - /* It is, create a Unicode string for it */ - RtlInitAnsiString(&ArcString, - LoaderBlock->NtHalPathName); - Status = RtlAnsiStringToUnicodeString(&BootPath, - &ArcString, - TRUE); - if (NT_SUCCESS(Status)) - { - /* FIXME: Save in registry */ - - /* Free the string now */ - RtlFreeUnicodeString(&BootPath); - } - } - - /* Build the full ARC name */ - sprintf(Buffer, - "\\ArcName\\%spartition(%lu)", - ArcDiskEntry->ArcName, - j + 1); - - /* Convert it to Unicode */ - RtlInitAnsiString(&ArcString, Buffer); - Status = RtlAnsiStringToUnicodeString(&ArcName, - &ArcString, - TRUE); - if (!NT_SUCCESS(Status)) continue; - - /* Create the symbolic link and free the strings */ - IoAssignArcName(&ArcName, &DeviceName); - RtlFreeUnicodeString(&ArcName); - RtlFreeUnicodeString(&DeviceName); - } - } - } - } - - /* Check if we didn't find the boot disk */ - if (!FoundBoot) - { - /* Allocate a buffer for the CD-ROM MBR */ - PartitionBuffer = ExAllocatePoolWithTag(NonPagedPool, 2048, TAG_IO); - if (!PartitionBuffer) return STATUS_INSUFFICIENT_RESOURCES; - - /* Loop every CD-ROM */ - for (i = 0; i < ConfigInfo->CdRomCount; i++) - { - /* Give it an ARC name */ - if (IopAssignArcNamesToCdrom(LoaderBlock, PartitionBuffer, i)) break; - } - - /* Free the buffer */ - ExFreePoolWithTag(PartitionBuffer, TAG_IO); + Status = IopCreateArcNamesCd(LoaderBlock); } /* Return success */ - return STATUS_SUCCESS; + return Status; +} + +NTSTATUS +INIT_FUNCTION +NTAPI +IopCreateArcNamesCd(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PIRP Irp; + KEVENT Event; + NTSTATUS Status; + PLIST_ENTRY NextEntry; + PFILE_OBJECT FileObject; + PDEVICE_OBJECT DeviceObject; + LARGE_INTEGER StartingOffset; + IO_STATUS_BLOCK IoStatusBlock; + PULONG PartitionBuffer = NULL; + CHAR Buffer[128], ArcBuffer[128]; + BOOLEAN NotEnabledPresent = FALSE; + STORAGE_DEVICE_NUMBER DeviceNumber; + ANSI_STRING DeviceStringA, ArcNameStringA; + PWSTR SymbolicLinkList, lSymbolicLinkList; + PARC_DISK_SIGNATURE ArcDiskSignature = NULL; + UNICODE_STRING DeviceStringW, ArcNameStringW; + ULONG DiskNumber, CdRomCount, CheckSum, i, EnabledDisks = 0; + PARC_DISK_INFORMATION ArcDiskInformation = LoaderBlock->ArcDiskInformation; + + /* Get all the Cds present in the system */ + CdRomCount = IoGetConfigurationInformation()->CdRomCount; + + /* Get enabled Cds and check if result matches + * For the record, enabled Cds (or even disk) are Cds/disks + * that have been successfully handled by MountMgr driver + * and that already own their device name. This is the "new" way + * to handle them, that came with NT5. + * Currently, Windows 2003 provides an arc names creation based + * on both enabled drives and not enabled drives (lack from + * the driver). + * Given the current ReactOS state, that's good for us. + * To sum up, this is NOT a hack or whatsoever. + */ + Status = IopFetchConfigurationInformation(&SymbolicLinkList, + GUID_DEVINTERFACE_CDROM, + CdRomCount, + &EnabledDisks); + if (!NT_SUCCESS(Status)) + { + NotEnabledPresent = TRUE; + } + /* Save symbolic link list address in order to free it after */ + lSymbolicLinkList = SymbolicLinkList; + /* For the moment, we won't fail */ + Status = STATUS_SUCCESS; + + /* Browse all the ARC devices trying to find the one matching boot device */ + for (NextEntry = ArcDiskInformation->DiskSignatureListHead.Flink; + NextEntry != &ArcDiskInformation->DiskSignatureListHead; + NextEntry = NextEntry->Flink) + { + ArcDiskSignature = CONTAINING_RECORD(NextEntry, + ARC_DISK_SIGNATURE, + ListEntry); + + if (strcmp(LoaderBlock->ArcBootDeviceName, ArcDiskSignature->ArcName) == 0) + { + break; + } + + ArcDiskSignature = NULL; + } + + /* Not found... Not booting from a Cd */ + if (!ArcDiskSignature) + { + DPRINT("Failed finding a cd that could match current boot device\n"); + goto Cleanup; + } + + /* Allocate needed space for reading Cd */ + PartitionBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, 2048, TAG_IO); + if (!PartitionBuffer) + { + DPRINT("Failed allocating resources!\n"); + /* Here, we fail, BUT we return success, some Microsoft joke */ + goto Cleanup; + } + + /* If we have more enabled Cds, take that into account */ + if (EnabledDisks > CdRomCount) + { + CdRomCount = EnabledDisks; + } + + /* If we'll have to browse for none enabled Cds, fix higher count */ + if (NotEnabledPresent && !EnabledDisks) + { + CdRomCount += 5; + } + + /* Finally, if in spite of all that work, we still don't have Cds, leave */ + if (!CdRomCount) + { + goto Cleanup; + } + + /* Start browsing Cds */ + for (DiskNumber = 0, EnabledDisks = 0; DiskNumber < CdRomCount; DiskNumber++) + { + /* Check if we have an enabled disk */ + if (SymbolicLinkList && *SymbolicLinkList != UNICODE_NULL) + { + /* Create its device name using first symbolic link */ + RtlInitUnicodeString(&DeviceStringW, lSymbolicLinkList); + /* Then, update symbolic links list */ + lSymbolicLinkList += wcslen(lSymbolicLinkList) + (sizeof(UNICODE_NULL) / sizeof(WCHAR)); + + /* Get its associated device object and file object */ + Status = IoGetDeviceObjectPointer(&DeviceStringW, + FILE_READ_ATTRIBUTES, + &FileObject, + &DeviceObject); + /* Failure? Good bye! */ + if (!NT_SUCCESS(Status)) + { + goto Cleanup; + } + + /* Now, we'll ask the device its device number */ + Irp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_GET_DEVICE_NUMBER, + DeviceObject, + NULL, + 0, + &DeviceNumber, + sizeof(STORAGE_DEVICE_NUMBER), + FALSE, + &Event, + &IoStatusBlock); + /* Failure? Good bye! */ + if (!Irp) + { + /* Dereference file object before leaving */ + ObDereferenceObject(FileObject); + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Cleanup; + } + + /* Call the driver, and wait for it if needed */ + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatusBlock.Status; + } + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(FileObject); + goto Cleanup; + } + + /* Finally, build proper device name */ + sprintf(Buffer, "\\Device\\CdRom%lu", DeviceNumber.DeviceNumber); + RtlInitAnsiString(&DeviceStringA, Buffer); + Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE); + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(FileObject); + goto Cleanup; + } + } + else + { + /* Create device name for the cd */ + sprintf(Buffer, "\\Device\\CdRom%lu", EnabledDisks++); + RtlInitAnsiString(&DeviceStringA, Buffer); + Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE); + if (!NT_SUCCESS(Status)) + { + goto Cleanup; + } + + /* Get its device object */ + Status = IoGetDeviceObjectPointer(&DeviceStringW, + FILE_READ_ATTRIBUTES, + &FileObject, + &DeviceObject); + if (!NT_SUCCESS(Status)) + { + RtlFreeUnicodeString(&DeviceStringW); + goto Cleanup; + } + } + + /* Initiate data for reading cd and compute checksum */ + StartingOffset.QuadPart = 0x8000; + CheckSum = 0; + Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ, + DeviceObject, + PartitionBuffer, + 2048, + &StartingOffset, + &Event, + &IoStatusBlock); + if (Irp) + { + /* Call the driver, and wait for it if needed */ + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatusBlock.Status; + } + + /* Reading succeed, compute checksum by adding data, 2048 bytes checksum */ + if (NT_SUCCESS(Status)) + { + for (i = 0; i < 2048 / sizeof(ULONG); i++) + { + CheckSum += PartitionBuffer[i]; + } + } + } + + /* Dereference file object */ + ObDereferenceObject(FileObject); + + /* If checksums are matching, we have the proper cd */ + if (CheckSum + ArcDiskSignature->CheckSum == 0) + { + /* Create ARC name */ + sprintf(ArcBuffer, "\\ArcName\\%s", LoaderBlock->ArcBootDeviceName); + RtlInitAnsiString(&ArcNameStringA, ArcBuffer); + Status = RtlAnsiStringToUnicodeString(&ArcNameStringW, &ArcNameStringA, TRUE); + if (NT_SUCCESS(Status)) + { + /* Create symbolic link */ + IoCreateSymbolicLink(&ArcNameStringW, &DeviceStringW); + RtlFreeUnicodeString(&ArcNameStringW); + DPRINT1("Boot device found\n"); + } + + /* And quit, whatever happens */ + RtlFreeUnicodeString(&DeviceStringW); + goto Cleanup; + } + + /* Free string before trying another disk */ + RtlFreeUnicodeString(&DeviceStringW); + } + +Cleanup: + if (PartitionBuffer) + { + ExFreePoolWithTag(PartitionBuffer, TAG_IO); + } + + if (SymbolicLinkList) + { + ExFreePool(SymbolicLinkList); + } + + return Status; +} + +NTSTATUS +INIT_FUNCTION +NTAPI +IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN BOOLEAN SingleDisk, + IN PBOOLEAN FoundBoot) +{ + PIRP Irp; + PVOID Data; + KEVENT Event; + NTSTATUS Status; + PLIST_ENTRY NextEntry; + PFILE_OBJECT FileObject; + DISK_GEOMETRY DiskGeometry; + PDEVICE_OBJECT DeviceObject; + LARGE_INTEGER StartingOffset; + PULONG PartitionBuffer = NULL; + IO_STATUS_BLOCK IoStatusBlock; + CHAR Buffer[128], ArcBuffer[128]; + BOOLEAN NotEnabledPresent = FALSE; + STORAGE_DEVICE_NUMBER DeviceNumber; + PARC_DISK_SIGNATURE ArcDiskSignature; + PWSTR SymbolicLinkList, lSymbolicLinkList; + PDRIVE_LAYOUT_INFORMATION_EX DriveLayout = NULL; + UNICODE_STRING DeviceStringW, ArcNameStringW, HalPathStringW; + ULONG DiskNumber, DiskCount, CheckSum, i, Signature, EnabledDisks = 0; + PARC_DISK_INFORMATION ArcDiskInformation = LoaderBlock->ArcDiskInformation; + ANSI_STRING ArcBootString, ArcSystemString, DeviceStringA, ArcNameStringA, HalPathStringA; + + /* Initialise device number */ + DeviceNumber.DeviceNumber = 0xFFFFFFFF; + /* Get all the disks present in the system */ + DiskCount = IoGetConfigurationInformation()->DiskCount; + + /* Get enabled disks and check if result matches */ + Status = IopFetchConfigurationInformation(&SymbolicLinkList, + GUID_DEVINTERFACE_DISK, + DiskCount, + &EnabledDisks); + if (!NT_SUCCESS(Status)) + { + NotEnabledPresent = TRUE; + } + + /* Save symbolic link list address in order to free it after */ + lSymbolicLinkList = SymbolicLinkList; + + /* Build the boot strings */ + RtlInitAnsiString(&ArcBootString, LoaderBlock->ArcBootDeviceName); + RtlInitAnsiString(&ArcSystemString, LoaderBlock->ArcHalDeviceName); + + /* If we have more enabled disks, take that into account */ + if (EnabledDisks > DiskCount) + { + DiskCount = EnabledDisks; + } + + /* If we'll have to browse for none enabled disks, fix higher count */ + if (NotEnabledPresent && !EnabledDisks) + { + DiskCount += 20; + } + + /* Finally, if in spite of all that work, we still don't have disks, leave */ + if (!DiskCount) + { + goto Cleanup; + } + + /* Start browsing disks */ + for (DiskNumber = 0; DiskNumber < DiskCount; DiskNumber++) + { + /* Check if we have an enabled disk */ + if (lSymbolicLinkList && *lSymbolicLinkList != UNICODE_NULL) + { + /* Create its device name using first symbolic link */ + RtlInitUnicodeString(&DeviceStringW, lSymbolicLinkList); + /* Then, update symbolic links list */ + lSymbolicLinkList += wcslen(lSymbolicLinkList) + (sizeof(UNICODE_NULL) / sizeof(WCHAR)); + + /* Get its associated device object and file object */ + Status = IoGetDeviceObjectPointer(&DeviceStringW, + FILE_READ_ATTRIBUTES, + &FileObject, + &DeviceObject); + if (NT_SUCCESS(Status)) + { + /* Now, we'll ask the device its device number */ + Irp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_GET_DEVICE_NUMBER, + DeviceObject, + NULL, + 0, + &DeviceNumber, + sizeof(STORAGE_DEVICE_NUMBER), + FALSE, + &Event, + &IoStatusBlock); + /* Missing resources is a shame... No need to go farther */ + if (!Irp) + { + ObDereferenceObject(FileObject); + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Cleanup; + } + + /* Call the driver, and wait for it if needed */ + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatusBlock.Status; + } + + /* If we didn't get the appriopriate data, just skip that disk */ + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(FileObject); + continue; + } + } + + /* End of enabled disks enumeration */ + if (NotEnabledPresent && *lSymbolicLinkList == UNICODE_NULL) + { + /* No enabled disk worked, reset field */ + if (DeviceNumber.DeviceNumber == 0xFFFFFFFF) + { + DeviceNumber.DeviceNumber = 0; + } + + /* Update disk number to enable the following not enabled disks */ + if (DeviceNumber.DeviceNumber > DiskNumber) + { + DiskNumber = DeviceNumber.DeviceNumber; + } + + /* Increase a bit more */ + DiskCount = DiskNumber + 20; + } + } + else + { + /* Create device name for the disk */ + sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition0", DiskNumber); + RtlInitAnsiString(&DeviceStringA, Buffer); + Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE); + if (!NT_SUCCESS(Status)) + { + goto Cleanup; + } + + /* Get its device object */ + Status = IoGetDeviceObjectPointer(&DeviceStringW, + FILE_READ_ATTRIBUTES, + &FileObject, + &DeviceObject); + + RtlFreeUnicodeString(&DeviceStringW); + /* This is a security measure, to ensure DiskNumber will be used */ + DeviceNumber.DeviceNumber = 0xFFFFFFFF; + } + + /* Something failed somewhere earlier, just skip the disk */ + if (!NT_SUCCESS(Status)) + { + continue; + } + + /* Let's ask the disk for its geometry */ + Irp = IoBuildDeviceIoControlRequest(IOCTL_DISK_GET_DRIVE_GEOMETRY, + DeviceObject, + NULL, + 0, + &DiskGeometry, + sizeof(DISK_GEOMETRY), + FALSE, + &Event, + &IoStatusBlock); + /* Missing resources is a shame... No need to go farther */ + if (!Irp) + { + ObDereferenceObject(FileObject); + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Cleanup; + } + + /* Call the driver, and wait for it if needed */ + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatusBlock.Status; + } + /* Failure, skip disk */ + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(FileObject); + continue; + } + + /* Read the partition table */ + Status = IoReadPartitionTableEx(DeviceObject, + &DriveLayout); + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(FileObject); + continue; + } + + /* Ensure we have at least 512 bytes per sector */ + if (DiskGeometry.BytesPerSector < 512) + { + DiskGeometry.BytesPerSector = 512; + } + + /* Check MBR type against EZ Drive type */ + StartingOffset.QuadPart = 0; + HalExamineMBR(DeviceObject, DiskGeometry.BytesPerSector, 0x55, &Data); + if (Data) + { + /* If MBR is of the EZ Drive type, we'll read after it */ + StartingOffset.QuadPart = DiskGeometry.BytesPerSector; + ExFreePool(Data); + } + + /* Allocate for reading enough data for checksum */ + PartitionBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned, DiskGeometry.BytesPerSector, TAG_IO); + if (!PartitionBuffer) + { + ObDereferenceObject(FileObject); + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Cleanup; + } + + /* Read a sector for computing checksum */ + Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ, + DeviceObject, + PartitionBuffer, + DiskGeometry.BytesPerSector, + &StartingOffset, + &Event, + &IoStatusBlock); + if (!Irp) + { + ObDereferenceObject(FileObject); + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Cleanup; + } + + /* Call the driver to perform reading */ + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatusBlock.Status; + } + if (!NT_SUCCESS(Status)) + { + ExFreePool(DriveLayout); + ExFreePoolWithTag(PartitionBuffer, TAG_IO); + ObDereferenceObject(FileObject); + continue; + } + + ObDereferenceObject(FileObject); + + /* Calculate checksum, that's an easy computation, just adds read data */ + for (i = 0, CheckSum = 0; i < 512 / sizeof(ULONG) ; i++) + { + CheckSum += PartitionBuffer[i]; + } + + /* Browse each ARC disk */ + for (NextEntry = ArcDiskInformation->DiskSignatureListHead.Flink; + NextEntry != &ArcDiskInformation->DiskSignatureListHead; + NextEntry = NextEntry->Flink) + { + ArcDiskSignature = CONTAINING_RECORD(NextEntry, + ARC_DISK_SIGNATURE, + ListEntry); + + /* If they matches, ie + * - There's only one disk for both BIOS and detected/enabled + * - Signatures are matching + * - Checksums are matching + * - This is MBR + */ + if (((SingleDisk && DiskCount == 1) || + (IopVerifyDiskSignature(DriveLayout, ArcDiskSignature, &Signature) && + (ArcDiskSignature->CheckSum + CheckSum == 0))) && + (DriveLayout->PartitionStyle == PARTITION_STYLE_MBR)) + { + /* Create device name */ + sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition0", (DeviceNumber.DeviceNumber != 0xFFFFFFFF) ? DeviceNumber.DeviceNumber : DiskNumber); + RtlInitAnsiString(&DeviceStringA, Buffer); + Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE); + if (!NT_SUCCESS(Status)) + { + goto Cleanup; + } + + /* Create ARC name */ + sprintf(ArcBuffer, "\\ArcName\\%s", ArcDiskSignature->ArcName); + RtlInitAnsiString(&ArcNameStringA, ArcBuffer); + Status = RtlAnsiStringToUnicodeString(&ArcNameStringW, &ArcNameStringA, TRUE); + if (!NT_SUCCESS(Status)) + { + RtlFreeUnicodeString(&DeviceStringW); + goto Cleanup; + } + + /* Link both */ + IoCreateSymbolicLink(&ArcNameStringW, &DeviceStringW); + + /* And release resources */ + RtlFreeUnicodeString(&ArcNameStringW); + RtlFreeUnicodeString(&DeviceStringW); + + /* Now, browse for every partition */ + for (i = 1; i <= DriveLayout->PartitionCount; i++) + { + /* Create device name */ + sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition%lu", (DeviceNumber.DeviceNumber != 0xFFFFFFFF) ? DeviceNumber.DeviceNumber : DiskNumber, i); + RtlInitAnsiString(&DeviceStringA, Buffer); + Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE); + if (!NT_SUCCESS(Status)) + { + goto Cleanup; + } + + /* Create partial ARC name */ + sprintf(ArcBuffer, "%spartition(%lu)", ArcDiskSignature->ArcName, i); + RtlInitAnsiString(&ArcNameStringA, ArcBuffer); + + /* Is that boot device? */ + if (RtlEqualString(&ArcNameStringA, &ArcBootString, TRUE)) + { + DPRINT("Found boot device\n"); + *FoundBoot = TRUE; + } + + /* Is that system partition? */ + if (RtlEqualString(&ArcNameStringA, &ArcSystemString, TRUE)) + { + /* Create HAL path name */ + RtlInitAnsiString(&HalPathStringA, LoaderBlock->NtHalPathName); + Status = RtlAnsiStringToUnicodeString(&HalPathStringW, &HalPathStringA, TRUE); + if (!NT_SUCCESS(Status)) + { + RtlFreeUnicodeString(&DeviceStringW); + goto Cleanup; + } + + /* Then store those information to registry */ + IopStoreSystemPartitionInformation(&DeviceStringW, &HalPathStringW); + RtlFreeUnicodeString(&HalPathStringW); + } + + /* Create complete ARC name */ + sprintf(ArcBuffer, "\\ArcName\\%spartition(%lu)", ArcDiskSignature->ArcName, i); + RtlInitAnsiString(&ArcNameStringA, ArcBuffer); + Status = RtlAnsiStringToUnicodeString(&ArcNameStringW, &ArcNameStringA, TRUE); + if (!NT_SUCCESS(Status)) + { + RtlFreeUnicodeString(&DeviceStringW); + goto Cleanup; + } + + /* Link device name & ARC name */ + IoCreateSymbolicLink(&ArcNameStringW, &DeviceStringW); + + /* Release strings */ + RtlFreeUnicodeString(&ArcNameStringW); + RtlFreeUnicodeString(&DeviceStringW); + } + } + else + { + /* In case there's a valid partition, a matching signature, + BUT a none matching checksum, or there's a duplicate + signature, or even worse a virus played with partition + table */ + if (ArcDiskSignature->Signature == Signature && + (ArcDiskSignature->CheckSum + CheckSum != 0) && + ArcDiskSignature->ValidPartitionTable) + { + DPRINT("Be careful, or you have a duplicate disk signature, or a virus altered your MBR!\n"); + } + } + } + + /* Release memory before jumping to next item */ + ExFreePool(DriveLayout); + DriveLayout = NULL; + ExFreePoolWithTag(PartitionBuffer, TAG_IO); + PartitionBuffer = NULL; + } + + Status = STATUS_SUCCESS; + +Cleanup: + if (SymbolicLinkList) + { + ExFreePool(SymbolicLinkList); + } + + if (DriveLayout) + { + ExFreePool(DriveLayout); + } + + if (PartitionBuffer) + { + ExFreePoolWithTag(PartitionBuffer, TAG_IO); + } + + return Status; } NTSTATUS @@ -737,4 +891,54 @@ IopReassignSystemRoot(IN PLOADER_PARAMETER_BLOCK LoaderBlock, return TRUE; } +BOOLEAN +NTAPI +IopVerifyDiskSignature(IN PDRIVE_LAYOUT_INFORMATION_EX DriveLayout, + IN PARC_DISK_SIGNATURE ArcDiskSignature, + OUT PULONG Signature) +{ + /* First condition: having a valid partition table */ + if (!ArcDiskSignature->ValidPartitionTable) + { + return FALSE; + } + + /* If that partition table is the MBR */ + if (DriveLayout->PartitionStyle == PARTITION_STYLE_MBR) + { + /* Then check MBR signature */ + if (DriveLayout->Mbr.Signature == ArcDiskSignature->Signature) + { + /* And return it */ + if (Signature) + { + *Signature = DriveLayout->Mbr.Signature; + } + + return TRUE; + } + } + /* If that partition table is the GPT */ + else if (DriveLayout->PartitionStyle == PARTITION_STYLE_GPT) + { + /* Check we are using GPT and compare GUID */ + if (ArcDiskSignature->IsGpt && + (((PULONG)ArcDiskSignature->GptSignature)[0] == DriveLayout->Gpt.DiskId.Data1 && + ((PUSHORT)ArcDiskSignature->GptSignature)[2] == DriveLayout->Gpt.DiskId.Data2 && + ((PUSHORT)ArcDiskSignature->GptSignature)[3] == DriveLayout->Gpt.DiskId.Data3 && + ((PULONGLONG)ArcDiskSignature->GptSignature)[1] == ((PULONGLONG)DriveLayout->Gpt.DiskId.Data4)[0])) + { + /* There's no signature to give, so we just zero output */ + if (Signature) + { + *Signature = 0; + } + return TRUE; + } + } + + /* If we fall here, it means that something went wrong, so return that */ + return FALSE; +} + /* EOF */ diff --git a/ntoskrnl/io/iomgr/iomgr.c b/ntoskrnl/io/iomgr/iomgr.c index 0cccebdf3b3..38e72ec10cb 100644 --- a/ntoskrnl/io/iomgr/iomgr.c +++ b/ntoskrnl/io/iomgr/iomgr.c @@ -82,6 +82,8 @@ GENERAL_LOOKASIDE IoSmallIrpLookaside; GENERAL_LOOKASIDE IopMdlLookasideList; extern GENERAL_LOOKASIDE IoCompletionPacketLookaside; +PLOADER_PARAMETER_BLOCK IopLoaderBlock; + #if defined (ALLOC_PRAGMA) #pragma alloc_text(INIT, IoInitSystem) #endif @@ -493,6 +495,9 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Initialize HAL Root Bus Driver */ HalInitPnpDriver(); + /* Make loader block available for the whole kernel */ + IopLoaderBlock = LoaderBlock; + /* Load boot start drivers */ IopInitializeBootDrivers(); @@ -506,8 +511,11 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock) IopStartRamdisk(LoaderBlock); } + /* No one should need loader block any longer */ + IopLoaderBlock = NULL; + /* Create ARC names for boot devices */ - IopCreateArcNames(LoaderBlock); + if (!NT_SUCCESS(IopCreateArcNames(LoaderBlock))) return FALSE; /* Mark the system boot partition */ if (!IopMarkBootPartition(LoaderBlock)) return FALSE; diff --git a/ntoskrnl/io/iomgr/iorsrce.c b/ntoskrnl/io/iomgr/iorsrce.c index 3c63d03dc54..af5913146c6 100644 --- a/ntoskrnl/io/iomgr/iorsrce.c +++ b/ntoskrnl/io/iomgr/iorsrce.c @@ -1,11 +1,12 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel - * FILE: ntoskrnl/io/resource.c + * FILE: ntoskrnl/io/iorsrce.c * PURPOSE: Hardware resource managment * * PROGRAMMERS: David Welch (welch@mcmail.com) * Alex Ionescu (alex@relsoft.net) + * Pierre Schweitzer (pierre.schweitzer@reactos.org) */ /* INCLUDES *****************************************************************/ @@ -650,6 +651,184 @@ IopQueryBusDescription( return Status; } +NTSTATUS +NTAPI +IopFetchConfigurationInformation(OUT PWSTR * SymbolicLinkList, + IN GUID Guid, + IN ULONG ExpectedInterfaces, + IN PULONG Interfaces) +{ + NTSTATUS Status; + ULONG IntInterfaces = 0; + PWSTR IntSymbolicLinkList; + + /* Get the associated enabled interfaces with the given GUID */ + Status = IoGetDeviceInterfaces(&Guid, NULL, 0, SymbolicLinkList); + if (!NT_SUCCESS(Status)) + { + /* Zero output and leave */ + if (SymbolicLinkList != 0) + { + *SymbolicLinkList = 0; + } + + return STATUS_UNSUCCESSFUL; + } + + IntSymbolicLinkList = *SymbolicLinkList; + + /* Count the number of enabled interfaces by counting the number of symbolic links */ + while (*IntSymbolicLinkList != UNICODE_NULL) + { + IntInterfaces++; + IntSymbolicLinkList += wcslen(IntSymbolicLinkList) + (sizeof(UNICODE_NULL) / sizeof(WCHAR)); + } + + /* Matching result will define the result */ + Status = (IntInterfaces >= ExpectedInterfaces) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; + /* Finally, give back to the caller the number of found interfaces */ + *Interfaces = IntInterfaces; + + return Status; +} + +VOID +NTAPI +IopStoreSystemPartitionInformation(IN PUNICODE_STRING NtSystemPartitionDeviceName, + IN PUNICODE_STRING OsLoaderPathName) +{ + NTSTATUS Status; + UNICODE_STRING LinkTarget, KeyName; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE LinkHandle, RegistryHandle, KeyHandle; + WCHAR LinkTargetBuffer[256], KeyNameBuffer[sizeof("SystemPartition")]; + UNICODE_STRING CmRegistryMachineSystemName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM"); + + ASSERT(NtSystemPartitionDeviceName->MaximumLength >= NtSystemPartitionDeviceName->Length + sizeof(WCHAR)); + ASSERT(NtSystemPartitionDeviceName->Buffer[NtSystemPartitionDeviceName->Length / sizeof(WCHAR)] == UNICODE_NULL); + ASSERT(OsLoaderPathName->MaximumLength >= OsLoaderPathName->Length + sizeof(WCHAR)); + ASSERT(OsLoaderPathName->Buffer[OsLoaderPathName->Length / sizeof(WCHAR)] == UNICODE_NULL); + + /* First define needed stuff to open NtSystemPartitionDeviceName symbolic link */ + InitializeObjectAttributes(&ObjectAttributes, + NtSystemPartitionDeviceName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + NULL, + NULL); + + /* Open NtSystemPartitionDeviceName symbolic link */ + Status = ZwOpenSymbolicLinkObject(&LinkHandle, + SYMBOLIC_LINK_QUERY, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT("Failed opening given symbolic link!\n"); + return; + } + + /* Prepare the string that will receive where symbolic link points to */ + LinkTarget.Length = 0; + /* We will zero the end of the string after having received it */ + LinkTarget.MaximumLength = sizeof(LinkTargetBuffer) - sizeof(UNICODE_NULL); + LinkTarget.Buffer = LinkTargetBuffer; + + /* Query target */ + Status = ZwQuerySymbolicLinkObject(LinkHandle, + &LinkTarget, + NULL); + + /* We are done with symbolic link */ + ObCloseHandle(LinkHandle, KernelMode); + + if (!NT_SUCCESS(Status)) + { + DPRINT("Failed querying given symbolic link!\n"); + return; + } + + /* As promised, we zero the end */ + LinkTarget.Buffer[LinkTarget.Length / sizeof(WCHAR)] = UNICODE_NULL; + + /* Open registry to save data (HKLM\SYSTEM) */ + Status = IopOpenRegistryKeyEx(&RegistryHandle, + NULL, + &CmRegistryMachineSystemName, + KEY_ALL_ACCESS); + if (!NT_SUCCESS(Status)) + { + DPRINT("Failed opening registry!\n"); + return; + } + + /* We'll store in Setup subkey, and as we love fun, we use only one buffer for three writings... */ + wcscpy(KeyNameBuffer, L"Setup"); + KeyName.Length = sizeof(L"Setup") - sizeof(UNICODE_NULL); + KeyName.MaximumLength = sizeof(L"Setup"); + KeyName.Buffer = KeyNameBuffer; + + /* So, open or create the subkey */ + Status = IopCreateRegistryKeyEx(&KeyHandle, + RegistryHandle, + &KeyName, + KEY_ALL_ACCESS, + REG_OPTION_NON_VOLATILE, + NULL); + + /* We're done with HKLM\SYSTEM */ + ObCloseHandle(RegistryHandle, KernelMode); + + if (!NT_SUCCESS(Status)) + { + DPRINT("Failed opening/creating Setup key!\n"); + return; + } + + /* Prepare first data writing... */ + wcscpy(KeyNameBuffer, L"SystemPartition"); + KeyName.Length = sizeof(L"SystemPartition") - sizeof(UNICODE_NULL); + KeyName.MaximumLength = sizeof(L"SystemPartition"); + + /* Write SystemPartition value which is the target of the symbolic link */ + Status = ZwSetValueKey(KeyHandle, + &KeyName, + 0, + REG_SZ, + LinkTarget.Buffer, + LinkTarget.Length + sizeof(WCHAR)); + if (!NT_SUCCESS(Status)) + { + DPRINT("Failed writing SystemPartition value!\n"); + } + + /* Prepare for second data writing... */ + wcscpy(KeyName.Buffer, L"OsLoaderPath"); + KeyName.Length = sizeof(L"OsLoaderPath") - sizeof(UNICODE_NULL); + KeyName.MaximumLength = sizeof(L"OsLoaderPath"); + + /* Remove trailing slash if any (one slash only excepted) */ + if (OsLoaderPathName->Length > sizeof(WCHAR) && + OsLoaderPathName->Buffer[(OsLoaderPathName->Length / sizeof(WCHAR)) - 1] == OBJ_NAME_PATH_SEPARATOR) + { + OsLoaderPathName->Length -= sizeof(WCHAR); + OsLoaderPathName->Buffer[OsLoaderPathName->Length / sizeof(WCHAR)] = UNICODE_NULL; + } + + /* Then, write down data */ + Status = ZwSetValueKey(KeyHandle, + &KeyName, + 0, + REG_SZ, + OsLoaderPathName->Buffer, + OsLoaderPathName->Length + sizeof(WCHAR)); + if (!NT_SUCCESS(Status)) + { + DPRINT("Failed writing OsLoaderPath value!\n"); + } + + /* We're finally done! */ + ObCloseHandle(KeyHandle, KernelMode); +} + /* PUBLIC FUNCTIONS ***********************************************************/ /* diff --git a/ntoskrnl/io/pnpmgr/pnpnotify.c b/ntoskrnl/io/pnpmgr/pnpnotify.c index 8a6dce72e95..6e43d7143cf 100644 --- a/ntoskrnl/io/pnpmgr/pnpnotify.c +++ b/ntoskrnl/io/pnpmgr/pnpnotify.c @@ -290,36 +290,30 @@ IoRegisterPlugPlayNotification(IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory, NULL, /* PhysicalDeviceObject OPTIONAL */ 0, /* Flags */ &SymbolicLinkList); - if (!NT_SUCCESS(Status)) + if (NT_SUCCESS(Status)) { - DPRINT("IoGetDeviceInterfaces() failed with status 0x%08lx\n", - Status); - ExFreePoolWithTag(Entry, TAG_PNP_NOTIFY); - ObDereferenceObject(DriverObject); - return Status; + /* Enumerate SymbolicLinkList */ + NotificationInfos.Version = 1; + NotificationInfos.Size = sizeof(DEVICE_INTERFACE_CHANGE_NOTIFICATION); + RtlCopyMemory(&NotificationInfos.Event, + &GUID_DEVICE_INTERFACE_ARRIVAL, + sizeof(GUID)); + RtlCopyMemory(&NotificationInfos.InterfaceClassGuid, + EventCategoryData, + sizeof(GUID)); + NotificationInfos.SymbolicLinkName = &SymbolicLinkU; + + for (SymbolicLink = SymbolicLinkList; + *SymbolicLink; + SymbolicLink += wcslen(SymbolicLink) + 1) + { + RtlInitUnicodeString(&SymbolicLinkU, SymbolicLink); + DPRINT("Calling callback routine for %S\n", SymbolicLink); + (*CallbackRoutine)(&NotificationInfos, Context); + } + + ExFreePool(SymbolicLinkList); } - - /* Enumerate SymbolicLinkList */ - NotificationInfos.Version = 1; - NotificationInfos.Size = sizeof(DEVICE_INTERFACE_CHANGE_NOTIFICATION); - RtlCopyMemory(&NotificationInfos.Event, - &GUID_DEVICE_INTERFACE_ARRIVAL, - sizeof(GUID)); - RtlCopyMemory(&NotificationInfos.InterfaceClassGuid, - EventCategoryData, - sizeof(GUID)); - NotificationInfos.SymbolicLinkName = &SymbolicLinkU; - - for (SymbolicLink = SymbolicLinkList; - *SymbolicLink; - SymbolicLink += wcslen(SymbolicLink) + 1) - { - RtlInitUnicodeString(&SymbolicLinkU, SymbolicLink); - DPRINT("Calling callback routine for %S\n", SymbolicLink); - (*CallbackRoutine)(&NotificationInfos, Context); - } - - ExFreePool(SymbolicLinkList); } Entry->PnpNotificationProc = CallbackRoutine; diff --git a/ntoskrnl/ke/amd64/cpu.c b/ntoskrnl/ke/amd64/cpu.c index 90a6b2c0641..2e414ba3413 100644 --- a/ntoskrnl/ke/amd64/cpu.c +++ b/ntoskrnl/ke/amd64/cpu.c @@ -37,7 +37,6 @@ ULONG KeLargestCacheLine = 0x40; ULONG KiDmaIoCoherency = 0; CHAR KeNumberProcessors = 0; KAFFINITY KeActiveProcessors = 1; -BOOLEAN KiI386PentiumLockErrataPresent; BOOLEAN KiSMTProcessorsPresent; /* Freeze data */ diff --git a/ntoskrnl/ke/bug.c b/ntoskrnl/ke/bug.c index 56c61df4f5c..284f4252ccd 100644 --- a/ntoskrnl/ke/bug.c +++ b/ntoskrnl/ke/bug.c @@ -1430,13 +1430,18 @@ KeBugCheckEx(IN ULONG BugCheckCode, IN ULONG_PTR BugCheckParameter3, IN ULONG_PTR BugCheckParameter4) { - /* Call the internal API */ - KeBugCheckWithTf(BugCheckCode, - BugCheckParameter1, - BugCheckParameter2, - BugCheckParameter3, - BugCheckParameter4, - NULL); + /* Workaround for Windows Server 2003 Checked PCI Driver issue */ + if (!((BugCheckCode == PCI_BUS_DRIVER_INTERNAL) && + (BugCheckParameter1 == 0xDEAD0010))) + { + /* Call the internal API */ + KeBugCheckWithTf(BugCheckCode, + BugCheckParameter1, + BugCheckParameter2, + BugCheckParameter3, + BugCheckParameter4, + NULL); + } } /* diff --git a/ntoskrnl/ke/i386/ctxswitch.S b/ntoskrnl/ke/i386/ctxswitch.S index 4af3f9b504d..716db3b3b11 100644 --- a/ntoskrnl/ke/i386/ctxswitch.S +++ b/ntoskrnl/ke/i386/ctxswitch.S @@ -584,10 +584,6 @@ CheckNext: #endif SwapContext: - /* ReactOS Mm Hack */ - mov ecx, esi - call @MiSyncForContextSwitch@4 - /* Swap context at APC_LEVEL */ mov ecx, APC_LEVEL call @KiSwapContextInternal@0 diff --git a/ntoskrnl/ke/i386/traphdlr.c b/ntoskrnl/ke/i386/traphdlr.c index 2374bf40505..4822b71b8aa 100644 --- a/ntoskrnl/ke/i386/traphdlr.c +++ b/ntoskrnl/ke/i386/traphdlr.c @@ -1176,14 +1176,6 @@ KiTrap0EHandler(IN PKTRAP_FRAME TrapFrame) /* Save CR2 */ Cr2 = __readcr2(); - /* Check for Pentium LOCK errata */ - if (KiI386PentiumLockErrataPresent) - { - /* Not yet implemented */ - UNIMPLEMENTED; - while (TRUE); - } - /* HACK: Check if interrupts are disabled and enable them */ if (!(TrapFrame->EFlags & EFLAGS_INTERRUPT_MASK)) { diff --git a/ntoskrnl/ke/procobj.c b/ntoskrnl/ke/procobj.c index f187ec1dd71..ce337feab2a 100644 --- a/ntoskrnl/ke/procobj.c +++ b/ntoskrnl/ke/procobj.c @@ -96,9 +96,6 @@ KiAttachProcess(IN PKTHREAD Thread, /* Release lock */ KiReleaseApcLockFromDpcLevel(ApcLock); - - /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ - MiSyncForProcessAttach(Thread, (PEPROCESS)Process); /* Swap Processes */ KiSwapProcess(Process, SavedApcState->Process); @@ -450,9 +447,6 @@ KeAttachProcess(IN PKPROCESS Process) ASSERT_PROCESS(Process); ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL); - /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ - MiSyncForProcessAttach(Thread, (PEPROCESS)Process); - /* Check if we're already in that process */ if (Thread->ApcState.Process == Process) return; diff --git a/ntoskrnl/ke/thrdobj.c b/ntoskrnl/ke/thrdobj.c index e73f4ff9d29..b23741f6a28 100644 --- a/ntoskrnl/ke/thrdobj.c +++ b/ntoskrnl/ke/thrdobj.c @@ -810,9 +810,6 @@ KeInitThread(IN OUT PKTHREAD Thread, Thread->StackLimit = (ULONG_PTR)KernelStack - KERNEL_STACK_SIZE; Thread->KernelStackResident = TRUE; - /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ - MiSyncForProcessAttach(Thread, (PEPROCESS)Process); - /* Enter SEH to avoid crashes due to user mode */ Status = STATUS_SUCCESS; _SEH2_TRY diff --git a/ntoskrnl/ke/thrdschd.c b/ntoskrnl/ke/thrdschd.c index 87246f0b778..040073cdb09 100644 --- a/ntoskrnl/ke/thrdschd.c +++ b/ntoskrnl/ke/thrdschd.c @@ -386,9 +386,6 @@ KiSwapThread(IN PKTHREAD CurrentThread, /* Save the wait IRQL */ WaitIrql = CurrentThread->WaitIrql; - /* REACTOS Mm Hack of Doom */ - MiSyncForContextSwitch(NextThread); - /* Swap contexts */ ApcState = KiSwapContext(CurrentThread, NextThread); @@ -756,9 +753,6 @@ NtYieldExecution(VOID) /* Sanity check */ ASSERT(OldIrql <= DISPATCH_LEVEL); - /* REACTOS Mm Hack of Doom */ - MiSyncForContextSwitch(NextThread); - /* Swap to new thread */ KiSwapContext(Thread, NextThread); Status = STATUS_SUCCESS; diff --git a/ntoskrnl/mm/ARM3/expool.c b/ntoskrnl/mm/ARM3/expool.c index 83d62b785ac..4a93c072a86 100644 --- a/ntoskrnl/mm/ARM3/expool.c +++ b/ntoskrnl/mm/ARM3/expool.c @@ -19,8 +19,6 @@ #undef ExAllocatePoolWithQuota #undef ExAllocatePoolWithQuotaTag -BOOLEAN AllowPagedPool = TRUE; - /* GLOBALS ********************************************************************/ ULONG ExpNumberOfPagedPools; @@ -454,11 +452,6 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, PPOOL_HEADER Entry, NextEntry, FragmentEntry; KIRQL OldIrql; ULONG BlockSize, i; - - // - // Check for paged pool - // - if (!(AllowPagedPool) && (PoolType == PagedPool)) return ExAllocatePagedPoolWithTag(PagedPool, NumberOfBytes, Tag); // // Some sanity checks @@ -760,19 +753,6 @@ ExFreePoolWithTag(IN PVOID P, PPOOL_DESCRIPTOR PoolDesc; BOOLEAN Combined = FALSE; - // - // Check for paged pool - // - if ((P >= MmPagedPoolBase) && - (P <= (PVOID)((ULONG_PTR)MmPagedPoolBase + MmPagedPoolSize))) - { - // - // Use old allocator - // - ExFreePagedPool(P); - return; - } - // // Quickly deal with big page allocations // diff --git a/ntoskrnl/mm/ARM3/hypermap.c b/ntoskrnl/mm/ARM3/hypermap.c index fca9e03929b..cb5cb2f1059 100644 --- a/ntoskrnl/mm/ARM3/hypermap.c +++ b/ntoskrnl/mm/ARM3/hypermap.c @@ -112,18 +112,17 @@ MiUnmapPageInHyperSpace(IN PEPROCESS Process, PVOID NTAPI -MiMapPagesToZeroInHyperSpace(IN PMMPFN *Pages, +MiMapPagesToZeroInHyperSpace(IN PMMPFN Pfn1, IN PFN_NUMBER NumberOfPages) { MMPTE TempPte; PMMPTE PointerPte; PFN_NUMBER Offset, PageFrameIndex; - PMMPFN Page; // // Sanity checks // - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); ASSERT(NumberOfPages != 0); ASSERT(NumberOfPages <= (MI_ZERO_PTES - 1)); @@ -151,19 +150,17 @@ MiMapPagesToZeroInHyperSpace(IN PMMPFN *Pages, // PointerPte->u.Hard.PageFrameNumber = Offset - NumberOfPages; - // - // Write the current PTE - // + /* Choose the correct PTE to use, and which template */ PointerPte += (Offset + 1); TempPte = ValidKernelPte; MI_MAKE_LOCAL_PAGE(&TempPte); // Hyperspace is local! - do + + /* Make sure the list isn't empty and loop it */ + ASSERT(Pfn1 != (PVOID)LIST_HEAD); + while (Pfn1 != (PVOID)LIST_HEAD) { - // - // Get the first page entry and its PFN - // - Page = *Pages++; - PageFrameIndex = MiGetPfnEntryIndex(Page); + /* Get the page index for this PFN */ + PageFrameIndex = MiGetPfnEntryIndex(Pfn1); // // Write the PFN @@ -175,7 +172,10 @@ MiMapPagesToZeroInHyperSpace(IN PMMPFN *Pages, // PointerPte--; MI_WRITE_VALID_PTE(PointerPte, TempPte); - } while (--NumberOfPages); + + /* Move to the next PFN */ + Pfn1 = (PMMPFN)Pfn1->u1.Flink; + } // // Return the address @@ -193,7 +193,7 @@ MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress, // // Sanity checks // - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); ASSERT (NumberOfPages != 0); ASSERT (NumberOfPages <= (MI_ZERO_PTES - 1)); diff --git a/ntoskrnl/mm/ARM3/i386/init.c b/ntoskrnl/mm/ARM3/i386/init.c index f18e6b2e72a..cfb77c6e33c 100644 --- a/ntoskrnl/mm/ARM3/i386/init.c +++ b/ntoskrnl/mm/ARM3/i386/init.c @@ -26,7 +26,7 @@ MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, MMPDE DemandZeroPde = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)}; /* Template PTE for prototype page */ -MMPTE PrototypePte = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) | PTE_PROTOTYPE | 0xFFFFF000}; +MMPTE PrototypePte = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) | PTE_PROTOTYPE | (MI_PTE_LOOKUP_NEEDED << PAGE_SHIFT)}; /* PRIVATE FUNCTIONS **********************************************************/ @@ -145,8 +145,6 @@ MiComputeNonPagedPoolVa(IN ULONG FreePages) } } -extern KEVENT ZeroPageThreadEvent; - NTSTATUS NTAPI MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) @@ -496,10 +494,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Initialize the color tables */ MiInitializeColorTables(); - - /* ReactOS Stuff */ - KeInitializeEvent(&ZeroPageThreadEvent, NotificationEvent, TRUE); - + /* Build the PFN Database */ MiInitializePfnDatabase(LoaderBlock); MmInitializeBalancer(MmAvailablePages, 0); @@ -572,6 +567,16 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1; + /* Check for Pentium LOCK errata */ + if (KiI386PentiumLockErrataPresent) + { + /* Mark the 1st IDT page as Write-Through to prevent a lockup + on a FOOF instruction. + See http://www.rcollins.org/Errata/Dec97/F00FBug.html */ + PointerPte = MiAddressToPte(KeGetPcr()->IDT); + PointerPte->u.Hard.WriteThrough = 1; + } + return STATUS_SUCCESS; } diff --git a/ntoskrnl/mm/ARM3/mdlsup.c b/ntoskrnl/mm/ARM3/mdlsup.c index 2702bb0182f..6d63db132b7 100644 --- a/ntoskrnl/mm/ARM3/mdlsup.c +++ b/ntoskrnl/mm/ARM3/mdlsup.c @@ -16,8 +16,11 @@ #define MODULE_INVOLVED_IN_ARM3 #include "../ARM3/miarm.h" +/* GLOBALS ********************************************************************/ + BOOLEAN MmTrackPtes; BOOLEAN MmTrackLockedPages; +SIZE_T MmSystemLockPagesCount; /* PUBLIC FUNCTIONS ***********************************************************/ @@ -248,34 +251,47 @@ MmFreePagesFromMdl(IN PMDL Mdl) // // Reached the last page // - if (*Pages == -1) break; - - // - // Sanity check - // - ASSERT(*Pages <= MmHighestPhysicalPage); - + if (*Pages == LIST_HEAD) break; + // // Get the page entry // Pfn1 = MiGetPfnEntry(*Pages); - ASSERT(Pfn1->u3.ReferenceCount == 1); + ASSERT(Pfn1); + ASSERT(Pfn1->u2.ShareCount == 1); + ASSERT(MI_IS_PFN_DELETED(Pfn1) == TRUE); + if (Pfn1->u4.PteFrame != 0x1FFEDCB) + { + /* Corrupted PFN entry or invalid free */ + KeBugCheckEx(MEMORY_MANAGEMENT, 0x1236, (ULONG_PTR)Mdl, (ULONG_PTR)Pages, *Pages); + } // // Clear it // Pfn1->u3.e1.StartOfAllocation = 0; Pfn1->u3.e1.EndOfAllocation = 0; + Pfn1->u2.ShareCount == 0; // // Dereference it // - MmDereferencePage(*Pages); + ASSERT(Pfn1->u3.e2.ReferenceCount != 0); + if (Pfn1->u3.e2.ReferenceCount != 1) + { + /* Just take off one reference */ + InterlockedDecrement16((PSHORT)&Pfn1->u3.e2.ReferenceCount); + } + else + { + /* We'll be nuking the whole page */ + MiDecrementReferenceCount(Pfn1, *Pages); + } // // Clear this page and move on // - *Pages++ = -1; + *Pages++ = LIST_HEAD; } while (--NumberOfPages != 0); // @@ -411,7 +427,7 @@ MmMapLockedPagesSpecifyCache(IN PMDL Mdl, // // We're done here // - if (*MdlPages == -1) break; + if (*MdlPages == LIST_HEAD) break; // // Write the PTE @@ -444,10 +460,8 @@ MmMapLockedPagesSpecifyCache(IN PMDL Mdl, return Base; } - // - // In user-mode, let ReactOS do it - // - return MiMapLockedPagesInUserSpace(Mdl, Base, CacheType, BaseAddress); + UNIMPLEMENTED; + return NULL; } /* @@ -557,10 +571,7 @@ MmUnmapLockedPages(IN PVOID BaseAddress, } else { - // - // Let ReactOS handle it - // - MiUnmapLockedPagesInUserSpace(BaseAddress, Mdl); + UNIMPLEMENTED; } } @@ -578,13 +589,14 @@ MmProbeAndLockPages(IN PMDL Mdl, ULONG LockPages, TotalPages; NTSTATUS Status = STATUS_SUCCESS; PEPROCESS CurrentProcess; - PMMSUPPORT AddressSpace; NTSTATUS ProbeStatus; PMMPTE PointerPte, LastPte; PMMPDE PointerPde; PFN_NUMBER PageFrameIndex; BOOLEAN UsePfnLock; KIRQL OldIrql; + USHORT OldRefCount, RefCount; + PMMPFN Pfn1; DPRINT("Probing MDL: %p\n", Mdl); // @@ -613,8 +625,17 @@ MmProbeAndLockPages(IN PMDL Mdl, LockPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(Address, Mdl->ByteCount); ASSERT(LockPages != 0); + /* Block invalid access */ + if ((AccessMode != KernelMode) && + ((LastAddress > (PVOID)MM_USER_PROBE_ADDRESS) || (Address >= LastAddress))) + { + /* Caller should be in SEH, raise the error */ + *MdlPages = LIST_HEAD; + ExRaiseStatus(STATUS_ACCESS_VIOLATION); + } + // - // Get theprocess + // Get the process // if (Address <= MM_HIGHEST_USER_ADDRESS) { @@ -637,6 +658,9 @@ MmProbeAndLockPages(IN PMDL Mdl, TotalPages = LockPages; StartAddress = Address; + /* Large pages not supported */ + ASSERT(!MI_IS_PHYSICAL_ADDRESS(Address)); + // // Now probe them // @@ -651,7 +675,7 @@ MmProbeAndLockPages(IN PMDL Mdl, // // Assume failure // - *MdlPages = -1; + *MdlPages = LIST_HEAD; // // Read @@ -673,8 +697,7 @@ MmProbeAndLockPages(IN PMDL Mdl, // // Next address... // - Address = (PVOID)((ULONG_PTR)Address + PAGE_SIZE); - Address = PAGE_ALIGN(Address); + Address = PAGE_ALIGN((ULONG_PTR)Address + PAGE_SIZE); // // Next page... @@ -716,6 +739,10 @@ MmProbeAndLockPages(IN PMDL Mdl, // PointerPte = MiAddressToPte(StartAddress); PointerPde = MiAddressToPde(StartAddress); +#if (_MI_PAGING_LEVELS >= 3) + DPRINT1("PAE/x64 Not Implemented\n"); + ASSERT(FALSE); +#endif // // Sanity check @@ -766,7 +793,6 @@ MmProbeAndLockPages(IN PMDL Mdl, // UsePfnLock = TRUE; OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - AddressSpace = NULL; // Keep compiler happy } else { @@ -787,13 +813,10 @@ MmProbeAndLockPages(IN PMDL Mdl, // Mdl->Process = CurrentProcess; - // - // Use the process lock - // + /* Lock the process working set */ + MiLockProcessWorkingSet(CurrentProcess, PsGetCurrentThread()); UsePfnLock = FALSE; - AddressSpace = &CurrentProcess->Vm; - MmLockAddressSpace(AddressSpace); - OldIrql = DISPATCH_LEVEL; // Keep compiler happy + OldIrql = MM_NOIRQL; } // @@ -809,7 +832,7 @@ MmProbeAndLockPages(IN PMDL Mdl, // // Assume failure and check for non-mapped pages // - *MdlPages = -1; + *MdlPages = LIST_HEAD; #if (_MI_PAGING_LEVELS >= 3) /* Should be checking the PPE and PXE */ ASSERT(FALSE); @@ -829,10 +852,8 @@ MmProbeAndLockPages(IN PMDL Mdl, } else { - // - // Release process address space lock - // - MmUnlockAddressSpace(AddressSpace); + /* Release process working set */ + MiUnlockProcessWorkingSet(CurrentProcess, PsGetCurrentThread()); } // @@ -861,10 +882,8 @@ MmProbeAndLockPages(IN PMDL Mdl, } else { - // - // Use the address space lock - // - MmLockAddressSpace(AddressSpace); + /* Lock the process working set */ + MiLockProcessWorkingSet(CurrentProcess, PsGetCurrentThread()); } } @@ -901,10 +920,8 @@ MmProbeAndLockPages(IN PMDL Mdl, } else { - // - // Release process address space lock - // - MmUnlockAddressSpace(AddressSpace); + /* Release process working set */ + MiUnlockProcessWorkingSet(CurrentProcess, PsGetCurrentThread()); } // @@ -932,10 +949,8 @@ MmProbeAndLockPages(IN PMDL Mdl, } else { - // - // Use the address space lock - // - MmLockAddressSpace(AddressSpace); + /* Lock the process working set */ + MiLockProcessWorkingSet(CurrentProcess, PsGetCurrentThread()); } // @@ -957,14 +972,55 @@ MmProbeAndLockPages(IN PMDL Mdl, // Grab the PFN // PageFrameIndex = PFN_FROM_PTE(PointerPte); - if (PageFrameIndex <= MmHighestPhysicalPage) + Pfn1 = MiGetPfnEntry(PageFrameIndex); + if (Pfn1) { + /* Either this is for kernel-mode, or the working set is held */ ASSERT((CurrentProcess == NULL) || (UsePfnLock == FALSE)); - // - // Now lock the page - // - MmReferencePage(PageFrameIndex); + /* No Physical VADs supported yet */ + if (CurrentProcess) ASSERT(CurrentProcess->PhysicalVadRoot == NULL); + + /* This address should already exist and be fully valid */ + ASSERT(Pfn1->u3.e2.ReferenceCount != 0); + if (MI_IS_ROS_PFN(Pfn1)) + { + /* ReactOS Mm doesn't track share count */ + ASSERT(Pfn1->u3.e1.PageLocation == ActiveAndValid); + } + else + { + /* On ARM3 pages, we should see a valid share count */ + ASSERT((Pfn1->u2.ShareCount != 0) && (Pfn1->u3.e1.PageLocation == ActiveAndValid)); + + /* We don't support mapping a prototype page yet */ + ASSERT((Pfn1->u3.e1.PrototypePte == 0) && (Pfn1->OriginalPte.u.Soft.Prototype == 0)); + } + + /* More locked pages! */ + InterlockedExchangeAddSizeT(&MmSystemLockPagesCount, 1); + + /* Loop trying to update the reference count */ + do + { + /* Get the current reference count, make sure it's valid */ + OldRefCount = Pfn1->u3.e2.ReferenceCount; + ASSERT(OldRefCount != 0); + ASSERT(OldRefCount < 2500); + + /* Bump it up by one */ + RefCount = InterlockedCompareExchange16((PSHORT)&Pfn1->u3.e2.ReferenceCount, + OldRefCount + 1, + OldRefCount); + ASSERT(RefCount != 0); + } while (OldRefCount != RefCount); + + /* Was this the first lock attempt? */ + if (OldRefCount != 1) + { + /* Someone else came through */ + InterlockedExchangeAddSizeT(&MmSystemLockPagesCount, -1); + } } else { @@ -978,7 +1034,10 @@ MmProbeAndLockPages(IN PMDL Mdl, // Write the page and move on // *MdlPages++ = PageFrameIndex; - if (!((ULONG_PTR)(++PointerPte) & (PAGE_SIZE - 1))) PointerPde++; + PointerPte++; + + /* Check if we're on a PDE boundary */ + if (!((ULONG_PTR)PointerPte & (PD_SIZE - 1))) PointerPde++; } while (PointerPte <= LastPte); // @@ -993,10 +1052,8 @@ MmProbeAndLockPages(IN PMDL Mdl, } else { - // - // Release process address space lock - // - MmUnlockAddressSpace(AddressSpace); + /* Release process working set */ + MiUnlockProcessWorkingSet(CurrentProcess, PsGetCurrentThread()); } // @@ -1023,10 +1080,8 @@ CleanupWithLock: } else { - // - // Release process address space lock - // - MmUnlockAddressSpace(AddressSpace); + /* Release process working set */ + MiUnlockProcessWorkingSet(CurrentProcess, PsGetCurrentThread()); } Cleanup: // @@ -1053,6 +1108,8 @@ MmUnlockPages(IN PMDL Mdl) PVOID Base; ULONG Flags, PageCount; KIRQL OldIrql; + USHORT RefCount, OldRefCount; + PMMPFN Pfn1; DPRINT("Unlocking MDL: %p\n", Mdl); // @@ -1112,17 +1169,71 @@ MmUnlockPages(IN PMDL Mdl) // // Last page, break out // - if (*MdlPages == -1) break; + if (*MdlPages == LIST_HEAD) break; // // Check if this page is in the PFN database // - if (*MdlPages <= MmHighestPhysicalPage) + Pfn1 = MiGetPfnEntry(*MdlPages); + if (Pfn1); { - // - // Unlock and dereference - // - MmDereferencePage(*MdlPages); + /* Get the current entry and reference count */ + OldRefCount = Pfn1->u3.e2.ReferenceCount; + ASSERT(OldRefCount != 0); + + /* Is this already the last dereference */ + if (OldRefCount == 1) + { + /* It should be on a free list waiting for us */ + ASSERT(Pfn1->u3.e2.ReferenceCount == 1); + ASSERT(Pfn1->u3.e1.PageLocation != ActiveAndValid); + ASSERT(Pfn1->u2.ShareCount == 0); + + /* Not supported yet */ + ASSERT(((Pfn1->u3.e1.PrototypePte == 0) && + (Pfn1->OriginalPte.u.Soft.Prototype == 0))); + + /* One less page */ + InterlockedExchangeAddSizeT(&MmSystemLockPagesCount, -1); + + /* Do the last dereference, we're done here */ + MiDecrementReferenceCount(Pfn1, *MdlPages); + } + else + { + /* Loop decrementing one reference */ + do + { + /* Make sure it's still valid */ + OldRefCount = Pfn1->u3.e2.ReferenceCount; + ASSERT(OldRefCount != 0); + + /* Take off one reference */ + RefCount = InterlockedCompareExchange16((PSHORT)&Pfn1->u3.e2.ReferenceCount, + OldRefCount - 1, + OldRefCount); + ASSERT(RefCount != 0); + } while (OldRefCount != RefCount); + ASSERT(RefCount > 1); + + /* Are there only lock references left? */ + if (RefCount == 2) + { + /* And does the page still have users? */ + if (Pfn1->u2.ShareCount >= 1) + { + /* Then it should still be valid */ + ASSERT(Pfn1->u3.e1.PageLocation == ActiveAndValid); + + /* Not supported yet */ + ASSERT(((Pfn1->u3.e1.PrototypePte == 0) && + (Pfn1->OriginalPte.u.Soft.Prototype == 0))); + + /* But there is one less "locked" page though */ + InterlockedExchangeAddSizeT(&MmSystemLockPagesCount, -1); + } + } + } } } while (++MdlPages < LastPage); @@ -1174,7 +1285,7 @@ MmUnlockPages(IN PMDL Mdl) // // Last page reached // - if (*MdlPages == -1) + if (*MdlPages == LIST_HEAD) { // // Were there no pages at all? @@ -1195,10 +1306,9 @@ MmUnlockPages(IN PMDL Mdl) break; } - // - // Sanity check - // - ASSERT(*MdlPages <= MmHighestPhysicalPage); + /* Save the PFN entry instead for the secondary loop */ + *MdlPages = (PFN_NUMBER)MiGetPfnEntry(*MdlPages); + ASSERT((*MdlPages) != 0); } while (++MdlPages < LastPage); // @@ -1212,10 +1322,64 @@ MmUnlockPages(IN PMDL Mdl) OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); do { - // - // Unlock and dereference - // - MmDereferencePage(*MdlPages); + /* Get the current entry and reference count */ + Pfn1 = (PMMPFN)(*MdlPages); + OldRefCount = Pfn1->u3.e2.ReferenceCount; + ASSERT(OldRefCount != 0); + + /* Is this already the last dereference */ + if (OldRefCount == 1) + { + /* It should be on a free list waiting for us */ + ASSERT(Pfn1->u3.e2.ReferenceCount == 1); + ASSERT(Pfn1->u3.e1.PageLocation != ActiveAndValid); + ASSERT(Pfn1->u2.ShareCount == 0); + + /* Not supported yet */ + ASSERT(((Pfn1->u3.e1.PrototypePte == 0) && + (Pfn1->OriginalPte.u.Soft.Prototype == 0))); + + /* One less page */ + InterlockedExchangeAddSizeT(&MmSystemLockPagesCount, -1); + + /* Do the last dereference, we're done here */ + MiDecrementReferenceCount(Pfn1, *MdlPages); + } + else + { + /* Loop decrementing one reference */ + do + { + /* Make sure it's still valid */ + OldRefCount = Pfn1->u3.e2.ReferenceCount; + ASSERT(OldRefCount != 0); + + /* Take off one reference */ + RefCount = InterlockedCompareExchange16((PSHORT)&Pfn1->u3.e2.ReferenceCount, + OldRefCount - 1, + OldRefCount); + ASSERT(RefCount != 0); + } while (OldRefCount != RefCount); + ASSERT(RefCount > 1); + + /* Are there only lock references left? */ + if (RefCount == 2) + { + /* And does the page still have users? */ + if (Pfn1->u2.ShareCount >= 1) + { + /* Then it should still be valid */ + ASSERT(Pfn1->u3.e1.PageLocation == ActiveAndValid); + + /* Not supported yet */ + ASSERT(((Pfn1->u3.e1.PrototypePte == 0) && + (Pfn1->OriginalPte.u.Soft.Prototype == 0))); + + /* But there is one less "locked" page though */ + InterlockedExchangeAddSizeT(&MmSystemLockPagesCount, -1); + } + } + } } while (++MdlPages < LastPage); // diff --git a/ntoskrnl/mm/ARM3/miarm.h b/ntoskrnl/mm/ARM3/miarm.h index f97ea6962b9..c736bc38c80 100644 --- a/ntoskrnl/mm/ARM3/miarm.h +++ b/ntoskrnl/mm/ARM3/miarm.h @@ -45,9 +45,7 @@ #define MM_HIGHEST_VAD_ADDRESS \ (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE)) - -/* The range 0x10000->0x7FEFFFFF is reserved for the ROSMM MAREA Allocator */ -#define MI_LOWEST_VAD_ADDRESS (PVOID)0x7FF00000 +#define MI_LOWEST_VAD_ADDRESS (PVOID)MM_LOWEST_USER_ADDRESS #endif /* !_M_AMD64 */ @@ -56,17 +54,27 @@ #define _1MB (1024 * _1KB) #define _1GB (1024 * _1MB) +/* Everyone loves 64K */ +#define _64K (64 * _1KB) + /* Area mapped by a PDE */ #define PDE_MAPPED_VA (PTE_COUNT * PAGE_SIZE) /* Size of a page table */ #define PT_SIZE (PTE_COUNT * sizeof(MMPTE)) +/* Size of a page directory */ +#define PD_SIZE (PDE_COUNT * sizeof(MMPDE)) + +/* Size of all page directories for a process */ +#define SYSTEM_PD_SIZE (PD_COUNT * PD_SIZE) + /* Architecture specific count of PDEs in a directory, and count of PTEs in a PT */ #ifdef _M_IX86 #define PD_COUNT 1 #define PDE_COUNT 1024 #define PTE_COUNT 1024 +C_ASSERT(SYSTEM_PD_SIZE == PAGE_SIZE); #elif _M_ARM #define PD_COUNT 1 #define PDE_COUNT 4096 @@ -103,6 +111,7 @@ #define MM_NOCACHE 8 #define MM_DECOMMIT 0x10 #define MM_NOACCESS (MM_DECOMMIT | MM_NOCACHE) +#define MM_INVALID_PROTECTION 0xFFFFFFFF // // Specific PTE Definitions that map to the Memory Manager's Protection Mask Bits @@ -141,6 +150,7 @@ #endif extern const ULONG MmProtectToPteMask[32]; +extern const ULONG MmProtectToValue[32]; // // Assertions for session images, addresses, and PTEs @@ -194,16 +204,56 @@ extern const ULONG MmProtectToPteMask[32]; #define MM_SYSLDR_BOOT_LOADED (PVOID)0xFFFFFFFF #define MM_SYSLDR_SINGLE_ENTRY 0x1 +#if defined(_M_IX86) || defined(_M_ARM) // // PFN List Sentinel // #define LIST_HEAD 0xFFFFFFFF +// +// Because GCC cannot automatically downcast 0xFFFFFFFF to lesser-width bits, +// we need a manual definition suited to the number of bits in the PteFrame. +// This is used as a LIST_HEAD for the colored list +// +#define COLORED_LIST_HEAD ((1 << 25) - 1) // 0x1FFFFFF +#elif defined(_M_AMD64) +#define LIST_HEAD 0xFFFFFFFFFFFFFFFFLL +#define COLORED_LIST_HEAD ((1 << 57) - 1) // 0x1FFFFFFFFFFFFFFLL +#else +#error Define these please! +#endif + // // Special IRQL value (found in assertions) // #define MM_NOIRQL (KIRQL)0xFFFFFFFF +// +// Returns the color of a page +// +#define MI_GET_PAGE_COLOR(x) ((x) & MmSecondaryColorMask) +#define MI_GET_NEXT_COLOR(x) (MI_GET_PAGE_COLOR(++MmSystemPageColor)) +#define MI_GET_NEXT_PROCESS_COLOR(x) (MI_GET_PAGE_COLOR(++(x)->NextPageColor)) + +#ifdef _M_IX86 +// +// Decodes a Prototype PTE into the underlying PTE +// +#define MiProtoPteToPte(x) \ + (PMMPTE)((ULONG_PTR)MmPagedPoolStart + \ + (((x)->u.Proto.ProtoAddressHigh << 7) | (x)->u.Proto.ProtoAddressLow)) +#endif + +// +// Prototype PTEs that don't yet have a pagefile association +// +#define MI_PTE_LOOKUP_NEEDED 0xFFFFF + +// +// System views are binned into 64K chunks +// +#define MI_SYSTEM_VIEW_BUCKET_SIZE _64K + // // FIXFIX: These should go in ex.h after the pool merge // @@ -330,6 +380,25 @@ typedef struct _MI_LARGE_PAGE_RANGES PFN_NUMBER LastFrame; } MI_LARGE_PAGE_RANGES, *PMI_LARGE_PAGE_RANGES; +typedef struct _MMVIEW +{ + ULONG_PTR Entry; + PCONTROL_AREA ControlArea; +} MMVIEW, *PMMVIEW; + +typedef struct _MMSESSION +{ + KGUARDED_MUTEX SystemSpaceViewLock; + PKGUARDED_MUTEX SystemSpaceViewLockPointer; + PCHAR SystemSpaceViewStart; + PMMVIEW SystemSpaceViewTable; + ULONG SystemSpaceHashSize; + ULONG SystemSpaceHashEntries; + ULONG SystemSpaceHashKey; + ULONG BitmapFailures; + PRTL_BITMAP SystemSpaceBitMap; +} MMSESSION, *PMMSESSION; + extern MMPTE HyperTemplatePte; extern MMPDE ValidKernelPde; extern MMPTE ValidKernelPte; @@ -439,9 +508,10 @@ extern PMMPDE MiHighestUserPde; extern PFN_NUMBER MmSystemPageDirectory[PD_COUNT]; extern PMMPTE MmSharedUserDataPte; extern LIST_ENTRY MmProcessList; - -#define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x]) -#define MI_PFNENTRY_TO_PFN(x) (x - MmPfnDatabase[1]) +extern BOOLEAN MmZeroingPageThreadActive; +extern KEVENT MmZeroingPageEvent; +extern ULONG MmSystemPageColor; +extern ULONG MmProcessColorSeed; // // Figures out the hardware bits for a PTE @@ -534,6 +604,34 @@ MI_MAKE_HARDWARE_PTE_USER(IN PMMPTE NewPte, NewPte->u.Long |= MmProtectToPteMask[ProtectionMask]; } +#ifdef _M_IX86 +// +// Builds a Prototype PTE for the address of the PTE +// +FORCEINLINE +VOID +MI_MAKE_PROTOTYPE_PTE(IN PMMPTE NewPte, + IN PMMPTE PointerPte) +{ + ULONG_PTR Offset; + + /* Mark this as a prototype */ + NewPte->u.Long = 0; + NewPte->u.Proto.Prototype = 1; + + /* + * Prototype PTEs are only valid in paged pool by design, this little trick + * lets us only use 28 bits for the adress of the PTE + */ + Offset = (ULONG_PTR)PointerPte - (ULONG_PTR)MmPagedPoolStart; + + /* 7 bits go in the "low", and the other 21 bits go in the "high" */ + NewPte->u.Proto.ProtoAddressLow = Offset & 0x7F; + NewPte->u.Proto.ProtoAddressHigh = (Offset & 0xFFFFFF80) >> 7; + ASSERT(MiProtoPteToPte(NewPte) == PointerPte); +} +#endif + // // Returns if the page is physically resident (ie: a large page) // FIXFIX: CISC/x86 only? @@ -735,7 +833,23 @@ MiUnlockWorkingSet(IN PETHREAD Thread, KeLeaveGuardedRegion(); } -NTSTATUS +// +// Returns the ProtoPTE inside a VAD for the given VPN +// +FORCEINLINE +PMMPTE +MI_GET_PROTOTYPE_PTE_FOR_VPN(IN PMMVAD Vad, + IN ULONG_PTR Vpn) +{ + PMMPTE ProtoPte; + + /* Find the offset within the VAD's prototype PTEs */ + ProtoPte = Vad->FirstPrototypePte + (Vpn - Vad->StartingVpn); + ASSERT(ProtoPte <= Vad->LastContiguousPte); + return ProtoPte; +} + +BOOLEAN NTAPI MmArmInitSystem( IN ULONG Phase, @@ -920,15 +1034,9 @@ MiUnmapLockedPagesInUserSpace( VOID NTAPI -MiInsertInListTail( +MiInsertPageInList( IN PMMPFNLIST ListHead, - IN PMMPFN Entry -); - -VOID -NTAPI -MiInsertZeroListAtBack( - IN PFN_NUMBER PageIndex + IN PFN_NUMBER PageFrameIndex ); VOID @@ -937,12 +1045,6 @@ MiUnlinkFreeOrZeroedPage( IN PMMPFN Entry ); -PMMPFN -NTAPI -MiRemoveHeadList( - IN PMMPFNLIST ListHead -); - PFN_NUMBER NTAPI MiAllocatePfn( @@ -973,6 +1075,13 @@ MiDecrementShareCount( IN PFN_NUMBER PageFrameIndex ); +VOID +NTAPI +MiDecrementReferenceCount( + IN PMMPFN Pfn1, + IN PFN_NUMBER PageFrameIndex +); + PFN_NUMBER NTAPI MiRemoveAnyPage( @@ -1061,6 +1170,23 @@ MiFindEmptyAddressRangeDownTree( OUT PMMADDRESS_NODE *Parent ); +NTSTATUS +NTAPI +MiFindEmptyAddressRangeInTree( + IN SIZE_T Length, + IN ULONG_PTR Alignment, + IN PMM_AVL_TABLE Table, + OUT PMMADDRESS_NODE *PreviousVad, + OUT PULONG_PTR Base +); + +VOID +NTAPI +MiInsertVad( + IN PMMVAD Vad, + IN PEPROCESS Process +); + VOID NTAPI MiInsertNode( @@ -1089,4 +1215,81 @@ MiGetNextNode( IN PMMADDRESS_NODE Node ); +BOOLEAN +NTAPI +MiInitializeSystemSpaceMap( + IN PVOID InputSession OPTIONAL +); + +ULONG +NTAPI +MiMakeProtectionMask( + IN ULONG Protect +); + +VOID +NTAPI +MiDeleteVirtualAddresses( + IN ULONG_PTR Va, + IN ULONG_PTR EndingAddress, + IN PMMVAD Vad +); + +ULONG +NTAPI +MiMakeSystemAddressValid( + IN PVOID PageTableVirtualAddress, + IN PEPROCESS CurrentProcess +); + +ULONG +NTAPI +MiMakeSystemAddressValidPfn( + IN PVOID VirtualAddress, + IN KIRQL OldIrql +); + +VOID +NTAPI +MiRemoveMappedView( + IN PEPROCESS CurrentProcess, + IN PMMVAD Vad +); + +PSUBSECTION +NTAPI +MiLocateSubsection( + IN PMMVAD Vad, + IN ULONG_PTR Vpn +); + +// +// MiRemoveZeroPage will use inline code to zero out the page manually if only +// free pages are available. In some scenarios, we don't/can't run that piece of +// code and would rather only have a real zero page. If we can't have a zero page, +// then we'd like to have our own code to grab a free page and zero it out, by +// using MiRemoveAnyPage. This macro implements this. +// +PFN_NUMBER +FORCEINLINE +MiRemoveZeroPageSafe(IN ULONG Color) +{ + if (MmFreePagesByColor[ZeroedPageList][Color].Flink != LIST_HEAD) return MiRemoveZeroPage(Color); + return 0; +} + +// +// New ARM3<->RosMM PAGE Architecture +// +#define MI_GET_ROS_DATA(x) ((PMMROSPFN)(x->RosMmData)) +#define MI_IS_ROS_PFN(x) (((x)->u4.AweAllocation == TRUE) && (MI_GET_ROS_DATA(x) != NULL)) +#define ASSERT_IS_ROS_PFN(x) ASSERT(MI_IS_ROS_PFN(x) == TRUE); +typedef struct _MMROSPFN +{ + PMM_RMAP_ENTRY RmapListHead; + SWAPENTRY SwapEntry; +} MMROSPFN, *PMMROSPFN; + +#define RosMmData AweReferenceCount + /* EOF */ diff --git a/ntoskrnl/mm/ARM3/mminit.c b/ntoskrnl/mm/ARM3/mminit.c index e7bb328d784..2a63047f837 100644 --- a/ntoskrnl/mm/ARM3/mminit.c +++ b/ntoskrnl/mm/ARM3/mminit.c @@ -353,33 +353,16 @@ SIZE_T MmAllocationFragment; SIZE_T MmTotalCommitLimit; SIZE_T MmTotalCommitLimitMaximum; -/* PRIVATE FUNCTIONS **********************************************************/ - -#ifndef _M_AMD64 -// -// In Bavaria, this is probably a hate crime -// -VOID -FASTCALL -MiSyncARM3WithROS(IN PVOID AddressStart, - IN PVOID AddressEnd) -{ - // - // Puerile piece of junk-grade carbonized horseshit puss sold to the lowest bidder - // - ULONG Pde = ADDR_TO_PDE_OFFSET(AddressStart); - while (Pde <= ADDR_TO_PDE_OFFSET(AddressEnd)) - { - // - // This both odious and heinous - // - extern ULONG MmGlobalKernelPageDirectory[1024]; - MmGlobalKernelPageDirectory[Pde] = ((PULONG)PDE_BASE)[Pde]; - Pde++; - } -} +/* Internal setting used for debugging memory descriptors */ +BOOLEAN MiDbgEnableMdDump = +#ifdef _ARM_ +TRUE; +#else +FALSE; #endif +/* PRIVATE FUNCTIONS **********************************************************/ + PFN_NUMBER NTAPI MxGetNextPage(IN PFN_NUMBER PageCount) @@ -1674,9 +1657,63 @@ MiBuildPagedPool(VOID) MiHighPagedPoolThreshold = (60 * _1MB) >> PAGE_SHIFT; MiHighPagedPoolThreshold = min(MiHighPagedPoolThreshold, (Size * 2) / 5); ASSERT(MiLowPagedPoolThreshold < MiHighPagedPoolThreshold); + + /* Setup the global session space */ + MiInitializeSystemSpaceMap(NULL); } -NTSTATUS +VOID +NTAPI +MiDbgDumpMemoryDescriptors(VOID) +{ + PLIST_ENTRY NextEntry; + PMEMORY_ALLOCATION_DESCRIPTOR Md; + ULONG TotalPages = 0; + PCHAR + MemType[] = + { + "ExceptionBlock ", + "SystemBlock ", + "Free ", + "Bad ", + "LoadedProgram ", + "FirmwareTemporary ", + "FirmwarePermanent ", + "OsloaderHeap ", + "OsloaderStack ", + "SystemCode ", + "HalCode ", + "BootDriver ", + "ConsoleInDriver ", + "ConsoleOutDriver ", + "StartupDpcStack ", + "StartupKernelStack", + "StartupPanicStack ", + "StartupPcrPage ", + "StartupPdrPage ", + "RegistryData ", + "MemoryData ", + "NlsData ", + "SpecialMemory ", + "BBTMemory ", + "LoaderReserve ", + "LoaderXIPRom " + }; + + DPRINT1("Base\t\tLength\t\tType\n"); + for (NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink; + NextEntry != &KeLoaderBlock->MemoryDescriptorListHead; + NextEntry = NextEntry->Flink) + { + Md = CONTAINING_RECORD(NextEntry, MEMORY_ALLOCATION_DESCRIPTOR, ListEntry); + DPRINT1("%08lX\t%08lX\t%s\n", Md->BasePage, Md->PageCount, MemType[Md->MemoryType]); + TotalPages += Md->PageCount; + } + + DPRINT1("Total: %08lX (%d MB)\n", TotalPages, (TotalPages * PAGE_SIZE) / 1024 / 1024); +} + +BOOLEAN NTAPI MmArmInitSystem(IN ULONG Phase, IN PLOADER_PARAMETER_BLOCK LoaderBlock) @@ -1687,6 +1724,9 @@ MmArmInitSystem(IN ULONG Phase, PPHYSICAL_MEMORY_RUN Run; PFN_NUMBER PageCount; + /* Dump memory descriptors */ + if (MiDbgEnableMdDump) MiDbgDumpMemoryDescriptors(); + // // Instantiate memory that we don't consider RAM/usable // We use the same exclusions that Windows does, in order to try to be @@ -1811,7 +1851,11 @@ MmArmInitSystem(IN ULONG Phase, /* Initialize the Loader Lock */ KeInitializeMutant(&MmSystemLoadLock, FALSE); - + + /* Set the zero page event */ + KeInitializeEvent(&MmZeroingPageEvent, SynchronizationEvent, FALSE); + MmZeroingPageThreadActive = FALSE; + // // Count physical pages on the system // @@ -1885,14 +1929,7 @@ MmArmInitSystem(IN ULONG Phase, /* Initialize the platform-specific parts */ MiInitMachineDependent(LoaderBlock); - - // - // Sync us up with ReactOS Mm - // - MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); - MiSyncARM3WithROS(MmPfnDatabase, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); - MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1)); - + // // Build the physical memory block // @@ -2090,7 +2127,7 @@ MmArmInitSystem(IN ULONG Phase, // // Always return success for now // - return STATUS_SUCCESS; + return TRUE; } /* EOF */ diff --git a/ntoskrnl/mm/ARM3/pagfault.c b/ntoskrnl/mm/ARM3/pagfault.c index c391a0ad389..50304dad896 100644 --- a/ntoskrnl/mm/ARM3/pagfault.c +++ b/ntoskrnl/mm/ARM3/pagfault.c @@ -27,12 +27,30 @@ MiCheckVirtualAddress(IN PVOID VirtualAddress, OUT PMMVAD *ProtoVad) { PMMVAD Vad; + PMMPTE PointerPte; /* No prototype/section support for now */ *ProtoVad = NULL; - /* Only valid for user VADs for now */ - ASSERT(VirtualAddress <= MM_HIGHEST_USER_ADDRESS); + /* Check if this is a page table address */ + if (MI_IS_PAGE_TABLE_ADDRESS(VirtualAddress)) + { + /* This should never happen, as these addresses are handled by the double-maping */ + if (((PMMPTE)VirtualAddress >= MiAddressToPte(MmPagedPoolStart)) && + ((PMMPTE)VirtualAddress <= MmPagedPoolInfo.LastPteForPagedPool)) + { + /* Fail such access */ + *ProtectCode = MM_NOACCESS; + return NULL; + } + + /* Return full access rights */ + *ProtectCode = MM_READWRITE; + return NULL; + } + + /* Should not be a session address */ + ASSERT(MI_IS_SESSION_ADDRESS(VirtualAddress) == FALSE); /* Special case for shared data */ if (PAGE_ALIGN(VirtualAddress) == (PVOID)USER_SHARED_DATA) @@ -50,15 +68,33 @@ MiCheckVirtualAddress(IN PVOID VirtualAddress, *ProtectCode = MM_NOACCESS; return NULL; } - - /* This must be a TEB/PEB VAD */ - ASSERT(Vad->u.VadFlags.PrivateMemory == TRUE); - ASSERT(Vad->u.VadFlags.MemCommit == TRUE); + + /* This must be a VM VAD */ ASSERT(Vad->u.VadFlags.VadType == VadNone); - /* Return the protection on it */ - *ProtectCode = Vad->u.VadFlags.Protection; - return NULL; + /* Check if it's a section, or just an allocation */ + if (Vad->u.VadFlags.PrivateMemory == TRUE) + { + /* This must be a TEB/PEB VAD */ + ASSERT(Vad->u.VadFlags.MemCommit == TRUE); + *ProtectCode = Vad->u.VadFlags.Protection; + return NULL; + } + else + { + /* Return the proto VAD */ + ASSERT(Vad->u2.VadFlags2.ExtendableFile == 0); + *ProtoVad = Vad; + + /* Get the prototype PTE for this page */ + PointerPte = (((ULONG_PTR)VirtualAddress >> PAGE_SHIFT) - Vad->StartingVpn) + Vad->FirstPrototypePte; + ASSERT(PointerPte <= Vad->LastContiguousPte); + ASSERT(PointerPte != NULL); + + /* Return the Prototype PTE and the protection for the page mapping */ + *ProtectCode = Vad->u.VadFlags.Protection; + return PointerPte; + } } NTSTATUS @@ -107,16 +143,11 @@ MiCheckPdeForPagedPool(IN PVOID Address) #ifdef _M_AMD64 ASSERT(FALSE); #else - /* This seems to be making the assumption that one PDE is one page long */ - C_ASSERT(PAGE_SIZE == (PD_COUNT * (sizeof(MMPTE) * PDE_COUNT))); - // // Copy it from our double-mapped system page directory // InterlockedExchangePte(PointerPde, - MmSystemPagePtes[((ULONG_PTR)PointerPde & - (PAGE_SIZE - 1)) / - sizeof(MMPTE)].u.Long); + MmSystemPagePtes[((ULONG_PTR)PointerPde & (SYSTEM_PD_SIZE - 1)) / sizeof(MMPTE)].u.Long); #endif } @@ -179,16 +210,16 @@ MiResolveDemandZeroFault(IN PVOID Address, IN PEPROCESS Process, IN KIRQL OldIrql) { - PFN_NUMBER PageFrameNumber; + PFN_NUMBER PageFrameNumber = 0; MMPTE TempPte; - BOOLEAN NeedZero = FALSE; + BOOLEAN NeedZero = FALSE, HaveLock = FALSE; + ULONG Color; DPRINT("ARM3 Demand Zero Page Fault Handler for address: %p in process: %p\n", Address, Process); /* Must currently only be called by paging path */ - ASSERT(OldIrql == MM_NOIRQL); - if (Process) + if ((Process) && (OldIrql == MM_NOIRQL)) { /* Sanity check */ ASSERT(MI_IS_PAGE_TABLE_ADDRESS(PointerPte)); @@ -196,27 +227,66 @@ MiResolveDemandZeroFault(IN PVOID Address, /* No forking yet */ ASSERT(Process->ForkInProgress == NULL); + /* Get process color */ + Color = MI_GET_NEXT_PROCESS_COLOR(Process); + ASSERT(Color != 0xFFFFFFFF); + /* We'll need a zero page */ NeedZero = TRUE; } + else + { + /* Check if we need a zero page */ + NeedZero = (OldIrql != MM_NOIRQL); - // - // Lock the PFN database - // - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - ASSERT(PointerPte->u.Hard.Valid == 0); + /* Get the next system page color */ + Color = MI_GET_NEXT_COLOR(); + } + + /* Check if the PFN database should be acquired */ + if (OldIrql == MM_NOIRQL) + { + /* Acquire it and remember we should release it after */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + HaveLock = TRUE; + } - /* Get a page */ - PageFrameNumber = MiRemoveAnyPage(0); - DPRINT("New pool page: %lx\n", PageFrameNumber); + /* We either manually locked the PFN DB, or already came with it locked */ + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + + /* Do we need a zero page? */ + ASSERT(PointerPte->u.Hard.Valid == 0); + if ((NeedZero) && (Process)) + { + /* Try to get one, if we couldn't grab a free page and zero it */ + PageFrameNumber = MiRemoveZeroPageSafe(Color); + if (PageFrameNumber) + { + /* We got a genuine zero page, stop worrying about it */ + NeedZero = FALSE; + } + else + { + /* We'll need a free page and zero it manually */ + PageFrameNumber = MiRemoveAnyPage(Color); + } + } + else if (!NeedZero) + { + /* Process or system doesn't want a zero page, grab anything */ + PageFrameNumber = MiRemoveAnyPage(Color); + } + else + { + /* System wants a zero page, obtain one */ + PageFrameNumber = MiRemoveZeroPage(Color); + } /* Initialize it */ MiInitializePfn(PageFrameNumber, PointerPte, TRUE); - // - // Release PFN lock - // - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + /* Release PFN lock if needed */ + if (HaveLock) KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); // // Increment demand zero faults @@ -267,24 +337,53 @@ MiCompleteProtoPteFault(IN BOOLEAN StoreInstruction, IN PMMPFN Pfn1) { MMPTE TempPte; + PMMPTE OriginalPte; + ULONG Protection; PFN_NUMBER PageFrameIndex; /* Must be called with an valid prototype PTE, with the PFN lock held */ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); ASSERT(PointerProtoPte->u.Hard.Valid == 1); - /* Quick-n-dirty */ - ASSERT(PointerPte->u.Soft.PageFileHigh == 0xFFFFF); - /* Get the page */ PageFrameIndex = PFN_FROM_PTE(PointerProtoPte); + + /* Get the PFN entry and set it as a prototype PTE */ + Pfn1 = MiGetPfnEntry(PageFrameIndex); + Pfn1->u3.e1.PrototypePte = 1; + + /* FIXME: Increment the share count for the page table */ + + /* Check where we should be getting the protection information from */ + if (PointerPte->u.Soft.PageFileHigh == MI_PTE_LOOKUP_NEEDED) + { + /* Get the protection from the PTE, there's no real Proto PTE data */ + Protection = PointerPte->u.Soft.Protection; + } + else + { + /* Get the protection from the original PTE link */ + OriginalPte = &Pfn1->OriginalPte; + Protection = OriginalPte->u.Soft.Protection; + } /* Release the PFN lock */ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - /* Build the user PTE */ - ASSERT(Address < MmSystemRangeStart); - MI_MAKE_HARDWARE_PTE_USER(&TempPte, PointerPte, MM_READONLY, PageFrameIndex); + /* Remove caching bits */ + Protection &= ~(MM_NOCACHE | MM_NOACCESS); + + /* Check if this is a kernel or user address */ + if (Address < MmSystemRangeStart) + { + /* Build the user PTE */ + MI_MAKE_HARDWARE_PTE_USER(&TempPte, PointerPte, Protection, PageFrameIndex); + } + else + { + /* Build the kernel PTE */ + MI_MAKE_HARDWARE_PTE(&TempPte, PointerPte, Protection, PageFrameIndex); + } /* Write the PTE */ MI_WRITE_VALID_PTE(PointerPte, TempPte); @@ -309,25 +408,56 @@ MiResolveProtoPteFault(IN BOOLEAN StoreInstruction, MMPTE TempPte; PMMPFN Pfn1; PFN_NUMBER PageFrameIndex; + NTSTATUS Status; /* Must be called with an invalid, prototype PTE, with the PFN lock held */ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); ASSERT(PointerPte->u.Hard.Valid == 0); ASSERT(PointerPte->u.Soft.Prototype == 1); - /* Read the prototype PTE -- it must be valid since we only handle shared data */ + /* Read the prototype PTE and check if it's valid */ TempPte = *PointerProtoPte; - ASSERT(TempPte.u.Hard.Valid == 1); + if (TempPte.u.Hard.Valid == 1) + { + /* One more user of this mapped page */ + PageFrameIndex = PFN_FROM_PTE(&TempPte); + Pfn1 = MiGetPfnEntry(PageFrameIndex); + Pfn1->u2.ShareCount++; - /* One more user of this mapped page */ - PageFrameIndex = PFN_FROM_PTE(&TempPte); - Pfn1 = MiGetPfnEntry(PageFrameIndex); - Pfn1->u2.ShareCount++; + /* Call it a transition */ + InterlockedIncrement(&KeGetCurrentPrcb()->MmTransitionCount); - /* Call it a transition */ - InterlockedIncrement(&KeGetCurrentPrcb()->MmTransitionCount); + /* Complete the prototype PTE fault -- this will release the PFN lock */ + return MiCompleteProtoPteFault(StoreInstruction, + Address, + PointerPte, + PointerProtoPte, + OldIrql, + NULL); + } + + /* Make sure there's some protection mask */ + if (TempPte.u.Long == 0) + { + /* Release the lock */ + DPRINT1("Access on reserved section?\n"); + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + return STATUS_ACCESS_VIOLATION; + } + + /* This is the only thing we support right now */ + ASSERT(TempPte.u.Soft.PageFileHigh == 0); + ASSERT(TempPte.u.Proto.ReadOnly == 0); + ASSERT(PointerPte > MiHighestUserPte); + ASSERT(TempPte.u.Soft.Prototype == 0); + ASSERT(TempPte.u.Soft.Transition == 0); + + /* Resolve the demand zero fault */ + Status = MiResolveDemandZeroFault(Address, PointerProtoPte, Process, OldIrql); + ASSERT(NT_SUCCESS(Status)); /* Complete the prototype PTE fault -- this will release the PFN lock */ + ASSERT(PointerPte->u.Hard.Valid == 0); return MiCompleteProtoPteFault(StoreInstruction, Address, PointerPte, @@ -372,39 +502,75 @@ MiDispatchFault(IN BOOLEAN StoreInstruction, { /* This should never happen */ ASSERT(!MI_IS_PHYSICAL_ADDRESS(PointerProtoPte)); - - /* We currently only handle the shared user data PTE path */ - ASSERT(Address < MmSystemRangeStart); - ASSERT(PointerPte->u.Soft.Prototype == 1); - ASSERT(PointerPte->u.Soft.PageFileHigh == 0xFFFFF); - ASSERT(Vad == NULL); - /* Lock the PFN database */ - LockIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - - /* For the shared data page, this should be true */ + /* Check if this is a kernel-mode address */ SuperProtoPte = MiAddressToPte(PointerProtoPte); - ASSERT(SuperProtoPte->u.Hard.Valid == 1); - ASSERT(TempPte.u.Hard.Valid == 0); + if (Address >= MmSystemRangeStart) + { + /* Lock the PFN database */ + LockIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Has the PTE been made valid yet? */ + if (!SuperProtoPte->u.Hard.Valid) + { + UNIMPLEMENTED; + while (TRUE); + } + else + { + /* Resolve the fault -- this will release the PFN lock */ + ASSERT(PointerPte->u.Hard.Valid == 0); + Status = MiResolveProtoPteFault(StoreInstruction, + Address, + PointerPte, + PointerProtoPte, + NULL, + NULL, + NULL, + Process, + LockIrql, + TrapInformation); + ASSERT(Status == STATUS_SUCCESS); - /* Resolve the fault -- this will release the PFN lock */ - Status = MiResolveProtoPteFault(StoreInstruction, - Address, - PointerPte, - PointerProtoPte, - NULL, - NULL, - NULL, - Process, - LockIrql, - TrapInformation); - ASSERT(Status == STATUS_SUCCESS); + /* Complete this as a transition fault */ + ASSERT(OldIrql == KeGetCurrentIrql()); + ASSERT(OldIrql <= APC_LEVEL); + ASSERT(KeAreAllApcsDisabled() == TRUE); + return Status; + } + } + else + { + /* We currently only handle very limited paths */ + ASSERT(PointerPte->u.Soft.Prototype == 1); + ASSERT(PointerPte->u.Soft.PageFileHigh == MI_PTE_LOOKUP_NEEDED); + + /* Lock the PFN database */ + LockIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* For our current usage, this should be true */ + ASSERT(SuperProtoPte->u.Hard.Valid == 1); + ASSERT(TempPte.u.Hard.Valid == 0); - /* Complete this as a transition fault */ - ASSERT(OldIrql == KeGetCurrentIrql()); - ASSERT(OldIrql <= APC_LEVEL); - ASSERT(KeAreAllApcsDisabled() == TRUE); - return STATUS_PAGE_FAULT_TRANSITION; + /* Resolve the fault -- this will release the PFN lock */ + Status = MiResolveProtoPteFault(StoreInstruction, + Address, + PointerPte, + PointerProtoPte, + NULL, + NULL, + NULL, + Process, + LockIrql, + TrapInformation); + ASSERT(Status == STATUS_SUCCESS); + + /* Complete this as a transition fault */ + ASSERT(OldIrql == KeGetCurrentIrql()); + ASSERT(OldIrql <= APC_LEVEL); + ASSERT(KeAreAllApcsDisabled() == TRUE); + return STATUS_PAGE_FAULT_TRANSITION; + } } // @@ -453,7 +619,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, IN PVOID TrapInformation) { KIRQL OldIrql = KeGetCurrentIrql(), LockIrql; - PMMPTE PointerPte, ProtoPte; + PMMPTE PointerPte, ProtoPte = NULL; PMMPDE PointerPde; MMPTE TempPte; PETHREAD CurrentThread; @@ -463,6 +629,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, ULONG ProtectionCode; PMMVAD Vad; PFN_NUMBER PageFrameIndex; + ULONG Color; DPRINT("ARM3 FAULT AT: %p\n", Address); // @@ -492,7 +659,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, // // Check for kernel fault // - if (Address >= MmSystemRangeStart) + while (Address >= MmSystemRangeStart) { // // What are you even DOING here? @@ -568,25 +735,16 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, // if (MI_IS_PAGE_TABLE_OR_HYPER_ADDRESS(Address)) { - // - // This might happen...not sure yet - // - DPRINT1("FAULT ON PAGE TABLES: %p %lx %lx!\n", Address, *PointerPte, *PointerPde); #if (_MI_PAGING_LEVELS == 2) - // - // Map in the page table - // + /* Could be paged pool access from a new process -- synchronize the page directories */ if (MiCheckPdeForPagedPool(Address) == STATUS_WAIT_1) { DPRINT1("PAGE TABLES FAULTED IN!\n"); return STATUS_SUCCESS; } #endif - // - // Otherwise the page table doesn't actually exist - // - DPRINT1("FAILING\n"); - return STATUS_ACCESS_VIOLATION; + /* Otherwise this could be a commit of a virtual address */ + break; } /* In this path, we are using the system working set */ @@ -628,9 +786,6 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, /* Check one kind of prototype PTE */ if (TempPte.u.Soft.Prototype) { - /* The one used for protected pool... */ - ASSERT(MmProtectFreedNonPagedPool == TRUE); - /* Make sure protected pool is on, and that this is a pool address */ if ((MmProtectFreedNonPagedPool) && (((Address >= MmNonPagedPoolStart) && @@ -646,12 +801,43 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, Mode, 4); } + + /* Get the prototype PTE! */ + ProtoPte = MiProtoPteToPte(&TempPte); + } + else + { + // + // We don't implement transition PTEs + // + ASSERT(TempPte.u.Soft.Transition == 0); + + /* Check for no-access PTE */ + if (TempPte.u.Soft.Protection == MM_NOACCESS) + { + /* Bad boy, bad boy, whatcha gonna do, whatcha gonna do when ARM3 comes for you! */ + KeBugCheckEx(PAGE_FAULT_IN_NONPAGED_AREA, + (ULONG_PTR)Address, + StoreInstruction, + (ULONG_PTR)TrapInformation, + 1); + } } - // - // We don't implement transition PTEs - // - ASSERT(TempPte.u.Soft.Transition == 0); + /* Check for demand page */ + if ((StoreInstruction) && !(ProtoPte) && !(TempPte.u.Hard.Valid)) + { + /* Get the protection code */ + if (!(TempPte.u.Soft.Protection & MM_READWRITE)) + { + /* Bad boy, bad boy, whatcha gonna do, whatcha gonna do when ARM3 comes for you! */ + KeBugCheckEx(ATTEMPTED_WRITE_TO_READONLY_MEMORY, + (ULONG_PTR)Address, + TempPte.u.Long, + (ULONG_PTR)TrapInformation, + 14); + } + } // // Now do the real fault handling @@ -659,7 +845,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, Status = MiDispatchFault(StoreInstruction, Address, PointerPte, - NULL, + ProtoPte, FALSE, NULL, TrapInformation, @@ -690,7 +876,6 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, #endif /* First things first, is the PDE valid? */ - ASSERT(PointerPde != MiAddressToPde(PTE_BASE)); ASSERT(PointerPde->u.Hard.LargePage == 0); if (PointerPde->u.Hard.Valid == 0) { @@ -725,11 +910,55 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, ASSERT(PointerPde->u.Hard.Valid == 1); } - /* Now capture the PTE. We only handle cases where it's totally empty */ + /* Now capture the PTE. Ignore virtual faults for now */ TempPte = *PointerPte; - ASSERT(TempPte.u.Long == 0); + ASSERT(TempPte.u.Hard.Valid == 0); + + /* Quick check for demand-zero */ + if (TempPte.u.Long == (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)) + { + /* Resolve the fault */ + MiResolveDemandZeroFault(Address, + PointerPte, + CurrentProcess, + MM_NOIRQL); + + /* Return the status */ + MiUnlockProcessWorkingSet(CurrentProcess, CurrentThread); + return STATUS_PAGE_FAULT_DEMAND_ZERO; + } + + /* Get protection and check if it's a prototype PTE */ + ProtectionCode = TempPte.u.Soft.Protection; + ASSERT(TempPte.u.Soft.Prototype == 0); + + /* Check for non-demand zero PTE */ + if (TempPte.u.Long != 0) + { + /* This is a page fault, check for valid protection */ + ASSERT(ProtectionCode != 0x100); + + /* FIXME: Run MiAccessCheck */ + + /* Dispatch the fault */ + Status = MiDispatchFault(StoreInstruction, + Address, + PointerPte, + NULL, + FALSE, + PsGetCurrentProcess(), + TrapInformation, + NULL); + + /* Return the status */ + ASSERT(NT_SUCCESS(Status)); + ASSERT(KeGetCurrentIrql() <= APC_LEVEL); + MiUnlockProcessWorkingSet(CurrentProcess, CurrentThread); + return Status; + } /* Check if this address range belongs to a valid allocation (VAD) */ + ASSERT(TempPte.u.Long == 0); ProtoPte = MiCheckVirtualAddress(Address, &ProtectionCode, &Vad); if (ProtectionCode == MM_NOACCESS) { @@ -756,19 +985,25 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, /* Lock the PFN database since we're going to grab a page */ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Try to get a zero page */ + Color = MI_GET_NEXT_PROCESS_COLOR(CurrentProcess); + PageFrameIndex = MiRemoveZeroPageSafe(Color); + if (!PageFrameIndex) + { + /* Grab a page out of there. Later we should grab a colored zero page */ + PageFrameIndex = MiRemoveAnyPage(Color); + ASSERT(PageFrameIndex); - /* Grab a page out of there. Later we should grab a colored zero page */ - PageFrameIndex = MiRemoveAnyPage(0); - ASSERT(PageFrameIndex); + /* Release the lock since we need to do some zeroing */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - /* Release the lock since we need to do some zeroing */ - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + /* Zero out the page, since it's for user-mode */ + MiZeroPfn(PageFrameIndex); - /* Zero out the page, since it's for user-mode */ - MiZeroPfn(PageFrameIndex); - - /* Grab the lock again so we can initialize the PFN entry */ - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + /* Grab the lock again so we can initialize the PFN entry */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + } /* Initialize the PFN entry now */ MiInitializePfn(PageFrameIndex, PointerPte, 1); @@ -808,8 +1043,9 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, } else { - /* The only "prototype PTE" we support is the shared user data path */ - ASSERT(ProtectionCode == MM_READONLY); + /* No guard page support yet */ + ASSERT((ProtectionCode & MM_DECOMMIT) == 0); + ASSERT(ProtectionCode != 0x100); /* Write the prototype PTE */ TempPte = PrototypePte; @@ -827,7 +1063,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, Vad); ASSERT(Status == STATUS_PAGE_FAULT_TRANSITION); ASSERT(PointerPte->u.Hard.Valid == 1); - ASSERT(PointerPte->u.Hard.PageFrameNumber == MmSharedUserDataPte->u.Hard.PageFrameNumber); + ASSERT(PointerPte->u.Hard.PageFrameNumber != 0); } /* Release the working set */ diff --git a/ntoskrnl/mm/ARM3/pfnlist.c b/ntoskrnl/mm/ARM3/pfnlist.c index 659adccedd0..0a1d426637c 100644 --- a/ntoskrnl/mm/ARM3/pfnlist.c +++ b/ntoskrnl/mm/ARM3/pfnlist.c @@ -34,6 +34,7 @@ do { \ BOOLEAN MmDynamicPfn; BOOLEAN MmMirroring; +ULONG MmSystemPageColor; MMPFNLIST MmZeroedPageListHead = {0, ZeroedPageList, LIST_HEAD, LIST_HEAD}; MMPFNLIST MmFreePageListHead = {0, FreePageList, LIST_HEAD, LIST_HEAD}; @@ -66,141 +67,11 @@ MiZeroPhysicalPage(IN PFN_NUMBER PageFrameIndex) /* Map in hyperspace, then wipe it using XMMI or MEMSET */ VirtualAddress = MiMapPageInHyperSpace(Process, PageFrameIndex, &OldIrql); + ASSERT(VirtualAddress); KeZeroPages(VirtualAddress, PAGE_SIZE); MiUnmapPageInHyperSpace(Process, VirtualAddress, OldIrql); } -VOID -NTAPI -MiInsertInListTail(IN PMMPFNLIST ListHead, - IN PMMPFN Entry) -{ - PFN_NUMBER OldBlink, EntryIndex = MiGetPfnEntryIndex(Entry); - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - ASSERT_LIST_INVARIANT(ListHead); - - /* Get the back link */ - OldBlink = ListHead->Blink; - if (OldBlink != LIST_HEAD) - { - /* Set the back pointer to point to us now */ - MiGetPfnEntry(OldBlink)->u1.Flink = EntryIndex; - } - else - { - /* Set the list to point to us */ - ListHead->Flink = EntryIndex; - } - - /* Set the entry to point to the list head forwards, and the old page backwards */ - Entry->u1.Flink = LIST_HEAD; - Entry->u2.Blink = OldBlink; - - /* And now the head points back to us, since we are last */ - ListHead->Blink = EntryIndex; - ListHead->Total++; - ASSERT_LIST_INVARIANT(ListHead); -} - -VOID -NTAPI -MiInsertZeroListAtBack(IN PFN_NUMBER EntryIndex) -{ - PFN_NUMBER OldBlink; - PMMPFNLIST ListHead; - PMMPFN Pfn1; -#if 0 - PMMPFN Blink; - ULONG Color; - PMMCOLOR_TABLES ColorHead; -#endif - - /* Make sure the PFN lock is held */ - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - - /* Get the descriptor */ - Pfn1 = MiGetPfnEntry(EntryIndex); - ASSERT(Pfn1->u3.e2.ReferenceCount == 0); - ASSERT(Pfn1->u4.MustBeCached == 0); - ASSERT(Pfn1->u3.e1.Rom == 0); - ASSERT(Pfn1->u3.e1.RemovalRequested == 0); - ASSERT(Pfn1->u4.InPageError == 0); - - /* Use the zero list */ - ListHead = &MmZeroedPageListHead; - ASSERT_LIST_INVARIANT(ListHead); - ListHead->Total++; - - /* Get the back link */ - OldBlink = ListHead->Blink; - if (OldBlink != LIST_HEAD) - { - /* Set the back pointer to point to us now */ - MiGetPfnEntry(OldBlink)->u1.Flink = EntryIndex; - } - else - { - /* Set the list to point to us */ - ListHead->Flink = EntryIndex; - } - - /* Set the entry to point to the list head forwards, and the old page backwards */ - Pfn1->u1.Flink = LIST_HEAD; - Pfn1->u2.Blink = OldBlink; - - /* And now the head points back to us, since we are last */ - ListHead->Blink = EntryIndex; - ASSERT_LIST_INVARIANT(ListHead); - - /* Update the page location */ - Pfn1->u3.e1.PageLocation = ZeroedPageList; - - /* FIXME: NOT YET Due to caller semantics: Update the available page count */ - //MmAvailablePages++; - - /* Check if we've reached the configured low memory threshold */ - if (MmAvailablePages == MmLowMemoryThreshold) - { - /* Clear the event, because now we're ABOVE the threshold */ - KeClearEvent(MiLowMemoryEvent); - } - else if (MmAvailablePages == MmHighMemoryThreshold) - { - /* Otherwise check if we reached the high threshold and signal the event */ - KeSetEvent(MiHighMemoryEvent, 0, FALSE); - } - -#if 0 - /* Get the page color */ - Color = EntryIndex & MmSecondaryColorMask; - - /* Get the first page on the color list */ - ColorHead = &MmFreePagesByColor[ZeroedPageList][Color]; - if (ColorHead->Flink == LIST_HEAD) - { - /* The list is empty, so we are the first page */ - Pfn1->u4.PteFrame = -1; - ColorHead->Flink = EntryIndex; - } - else - { - /* Get the previous page */ - Blink = (PMMPFN)ColorHead->Blink; - - /* Make it link to us */ - Pfn1->u4.PteFrame = MiGetPfnEntryIndex(Blink); - Blink->OriginalPte.u.Long = EntryIndex; - } - - /* Now initialize our own list pointers */ - ColorHead->Blink = Pfn1; - Pfn1->OriginalPte.u.Long = LIST_HEAD; - - /* And increase the count in the colored list */ - ColorHead->Count++; -#endif -} - VOID NTAPI MiUnlinkFreeOrZeroedPage(IN PMMPFN Entry) @@ -208,6 +79,9 @@ MiUnlinkFreeOrZeroedPage(IN PMMPFN Entry) PFN_NUMBER OldFlink, OldBlink; PMMPFNLIST ListHead; MMLISTS ListName; + ULONG Color; + PMMCOLOR_TABLES ColorTable; + PMMPFN Pfn1; /* Make sure the PFN lock is held */ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); @@ -254,13 +128,65 @@ MiUnlinkFreeOrZeroedPage(IN PMMPFN Entry) /* Set the list head's backlink instead */ ListHead->Flink = OldFlink; } + + /* Get the page color */ + OldBlink = MiGetPfnEntryIndex(Entry); + Color = OldBlink & MmSecondaryColorMask; + + /* Get the first page on the color list */ + ColorTable = &MmFreePagesByColor[ListName][Color]; + + /* Check if this was was actually the head */ + OldFlink = ColorTable->Flink; + if (OldFlink == OldBlink) + { + /* Make the table point to the next page this page was linking to */ + ColorTable->Flink = Entry->OriginalPte.u.Long; + if (ColorTable->Flink != LIST_HEAD) + { + /* And make the previous link point to the head now */ + MiGetPfnEntry(ColorTable->Flink)->u4.PteFrame = COLORED_LIST_HEAD; + } + else + { + /* And if that page was the head, loop the list back around */ + ColorTable->Blink = (PVOID)LIST_HEAD; + } + } + else + { + /* This page shouldn't be pointing back to the head */ + ASSERT(Entry->u4.PteFrame != COLORED_LIST_HEAD); + + /* Make the back link point to whoever the next page is */ + Pfn1 = MiGetPfnEntry(Entry->u4.PteFrame); + Pfn1->OriginalPte.u.Long = Entry->OriginalPte.u.Long; + + /* Check if this page was pointing to the head */ + if (Entry->OriginalPte.u.Long != LIST_HEAD) + { + /* Make the back link point to the head */ + Pfn1 = MiGetPfnEntry(Entry->OriginalPte.u.Long); + Pfn1->u4.PteFrame = Entry->u4.PteFrame; + } + else + { + /* Then the table is directly back pointing to this page now */ + ColorTable->Blink = Pfn1; + } + } + + /* One less colored page */ + ASSERT(ColorTable->Count >= 1); + ColorTable->Count--; + /* ReactOS Hack */ + Entry->OriginalPte.u.Long = 0; + /* We are not on a list anymore */ Entry->u1.Flink = Entry->u2.Blink = 0; ASSERT_LIST_INVARIANT(ListHead); - /* FIXME: Deal with color list */ - /* See if we hit any thresholds */ if (MmAvailablePages == MmHighMemoryThreshold) { @@ -290,9 +216,8 @@ MiRemovePageByColor(IN PFN_NUMBER PageIndex, MMLISTS ListName; PFN_NUMBER OldFlink, OldBlink; ULONG OldColor, OldCache; -#if 0 PMMCOLOR_TABLES ColorTable; -#endif + /* Make sure PFN lock is held */ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); ASSERT(Color < MmSecondaryColors); @@ -352,27 +277,32 @@ MiRemovePageByColor(IN PFN_NUMBER PageIndex, Pfn1->u3.e1.PageColor = OldColor; Pfn1->u3.e1.CacheAttribute = OldCache; -#if 0 // When switching to ARM3 /* Get the first page on the color list */ + ASSERT(Color < MmSecondaryColors); ColorTable = &MmFreePagesByColor[ListName][Color]; ASSERT(ColorTable->Count >= 1); /* Set the forward link to whoever we were pointing to */ ColorTable->Flink = Pfn1->OriginalPte.u.Long; + + /* Get the first page on the color list */ if (ColorTable->Flink == LIST_HEAD) { /* This is the beginning of the list, so set the sentinel value */ - ColorTable->Blink = LIST_HEAD; + ColorTable->Blink = (PVOID)LIST_HEAD; } else { /* The list is empty, so we are the first page */ - MiGetPfnEntry(ColorTable->Flink)->u4.PteFrame = -1; + MiGetPfnEntry(ColorTable->Flink)->u4.PteFrame = COLORED_LIST_HEAD; } - /* One more page */ - ColorTable->Total++; -#endif + /* One less page */ + ColorTable->Count--; + + /* ReactOS Hack */ + Pfn1->OriginalPte.u.Long = 0; + /* See if we hit any thresholds */ if (MmAvailablePages == MmHighMemoryThreshold) { @@ -406,14 +336,15 @@ MiRemoveAnyPage(IN ULONG Color) ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); ASSERT(MmAvailablePages != 0); ASSERT(Color < MmSecondaryColors); - +#if 0 /* Check the colored free list */ -#if 0 // Enable when using ARM3 database */ PageIndex = MmFreePagesByColor[FreePageList][Color].Flink; + DPRINT1("Found free page: %lx\n", PageIndex); if (PageIndex == LIST_HEAD) { /* Check the colored zero list */ PageIndex = MmFreePagesByColor[ZeroedPageList][Color].Flink; + DPRINT1("Found zero page: %lx\n", PageIndex); if (PageIndex == LIST_HEAD) { #endif @@ -434,11 +365,10 @@ MiRemoveAnyPage(IN ULONG Color) ASSERT(MmZeroedPageListHead.Total == 0); } } -#if 0 // Enable when using ARM3 database */ +#if 0 } } #endif - /* Remove the page from its list */ PageIndex = MiRemovePageByColor(PageIndex, Color); @@ -469,7 +399,7 @@ MiRemoveZeroPage(IN ULONG Color) ASSERT(Color < MmSecondaryColors); /* Check the colored zero list */ -#if 0 // Enable when using ARM3 database */ +#if 0 PageIndex = MmFreePagesByColor[ZeroedPageList][Color].Flink; if (PageIndex == LIST_HEAD) { @@ -480,11 +410,12 @@ MiRemoveZeroPage(IN ULONG Color) Color = PageIndex & MmSecondaryColorMask; if (PageIndex == LIST_HEAD) { + /* This means there's no zero pages, we have to look for free ones */ ASSERT(MmZeroedPageListHead.Total == 0); Zero = TRUE; -#if 0 // Enable when using ARM3 database */ +#if 0 /* Check the colored free list */ - PageIndex = MmFreePagesByColor[ZeroedPageList][Color].Flink; + PageIndex = MmFreePagesByColor[FreePageList][Color].Flink; if (PageIndex == LIST_HEAD) { #endif @@ -498,13 +429,14 @@ MiRemoveZeroPage(IN ULONG Color) /* FIXME: Should check the standby list */ ASSERT(MmZeroedPageListHead.Total == 0); } -#if 0 // Enable when using ARM3 database */ +#if 0 } #endif } -#if 0 // Enable when using ARM3 database */ +#if 0 } #endif + /* Sanity checks */ Pfn1 = MiGetPfnEntry(PageIndex); ASSERT((Pfn1->u3.e1.PageLocation == FreePageList) || @@ -526,47 +458,6 @@ MiRemoveZeroPage(IN ULONG Color) /* Return the page */ return PageIndex; } - - -PMMPFN -NTAPI -MiRemoveHeadList(IN PMMPFNLIST ListHead) -{ - PFN_NUMBER Entry, Flink; - PMMPFN Pfn1; - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - ASSERT_LIST_INVARIANT(ListHead); - - /* Get the entry that's currently first on the list */ - Entry = ListHead->Flink; - Pfn1 = MiGetPfnEntry(Entry); - - /* Make the list point to the entry following the first one */ - Flink = Pfn1->u1.Flink; - ListHead->Flink = Flink; - - /* Check if the next entry is actually the list head */ - if (ListHead->Flink != LIST_HEAD) - { - /* It isn't, so therefore whoever is coming next points back to the head */ - MiGetPfnEntry(Flink)->u2.Blink = LIST_HEAD; - } - else - { - /* Then the list is empty, so the backlink should point back to us */ - ListHead->Blink = LIST_HEAD; - } - - /* We are not on a list anymore */ - Pfn1->u1.Flink = Pfn1->u2.Blink = 0; - ListHead->Total--; - ASSERT_LIST_INVARIANT(ListHead); - - /* Return the head element */ - return Pfn1; -} - -extern KEVENT ZeroPageThreadEvent; VOID NTAPI @@ -575,11 +466,10 @@ MiInsertPageInFreeList(IN PFN_NUMBER PageFrameIndex) PMMPFNLIST ListHead; PFN_NUMBER LastPage; PMMPFN Pfn1; -#if 0 ULONG Color; PMMPFN Blink; PMMCOLOR_TABLES ColorTable; -#endif + /* Make sure the page index is valid */ ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL); ASSERT((PageFrameIndex != 0) && @@ -645,7 +535,6 @@ MiInsertPageInFreeList(IN PFN_NUMBER PageFrameIndex) KeSetEvent(MiHighMemoryEvent, 0, FALSE); } -#if 0 // When using ARM3 PFN /* Get the page color */ Color = PageFrameIndex & MmSecondaryColorMask; @@ -654,7 +543,7 @@ MiInsertPageInFreeList(IN PFN_NUMBER PageFrameIndex) if (ColorTable->Flink == LIST_HEAD) { /* The list is empty, so we are the first page */ - Pfn1->u4.PteFrame = -1; + Pfn1->u4.PteFrame = COLORED_LIST_HEAD; ColorTable->Flink = PageFrameIndex; } else @@ -663,26 +552,147 @@ MiInsertPageInFreeList(IN PFN_NUMBER PageFrameIndex) Blink = (PMMPFN)ColorTable->Blink; /* Make it link to us */ - Pfn1->u4.PteFrame = MI_PFNENTRY_TO_PFN(Blink); + Pfn1->u4.PteFrame = MiGetPfnEntryIndex(Blink); + + /* If there is an original pte, it should be an old link, NOT a ReactOS RMAP */ + ASSERT(Blink->u4.AweAllocation == FALSE); Blink->OriginalPte.u.Long = PageFrameIndex; } /* Now initialize our own list pointers */ ColorTable->Blink = Pfn1; + + /* If there is an original pte, it should be an old link, NOT a ReactOS RMAP */ + ASSERT(Pfn1->u4.AweAllocation == FALSE); Pfn1->OriginalPte.u.Long = LIST_HEAD; /* And increase the count in the colored list */ ColorTable->Count++; -#endif - + /* Notify zero page thread if enough pages are on the free list now */ - if ((MmFreePageListHead.Total > 8) && !(KeReadStateEvent(&ZeroPageThreadEvent))) + if ((ListHead->Total >= 8) && !(MmZeroingPageThreadActive)) { - /* This is ReactOS-specific */ - KeSetEvent(&ZeroPageThreadEvent, IO_NO_INCREMENT, FALSE); + /* Set the event */ + MmZeroingPageThreadActive = TRUE; + KeSetEvent(&MmZeroingPageEvent, IO_NO_INCREMENT, FALSE); } } +/* Note: This function is hardcoded only for the zeroed page list, for now */ +VOID +NTAPI +MiInsertPageInList(IN PMMPFNLIST ListHead, + IN PFN_NUMBER PageFrameIndex) +{ + PFN_NUMBER Flink; + PMMPFN Pfn1, Pfn2; + MMLISTS ListName; + PMMCOLOR_TABLES ColorHead; + ULONG Color; + + /* For free pages, use MiInsertPageInFreeList */ + ASSERT(ListHead != &MmFreePageListHead); + + /* Make sure the lock is held */ + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + + /* Make sure the PFN is valid */ + ASSERT((PageFrameIndex) && + (PageFrameIndex <= MmHighestPhysicalPage) && + (PageFrameIndex >= MmLowestPhysicalPage)); + + /* Page should be unused */ + Pfn1 = MiGetPfnEntry(PageFrameIndex); + ASSERT(Pfn1->u3.e2.ReferenceCount == 0); + ASSERT(Pfn1->u3.e1.Rom != 1); + + /* Only used for zero pages in ReactOS */ + ListName = ListHead->ListName; + ASSERT(ListName == ZeroedPageList); + ListHead->Total++; + + /* Don't handle bad pages yet yet */ + ASSERT(Pfn1->u3.e1.RemovalRequested == 0); + + /* Make the head of the list point to this page now */ + Flink = ListHead->Flink; + ListHead->Flink = PageFrameIndex; + + /* Make the page point to the previous head, and back to the list */ + Pfn1->u1.Flink = Flink; + Pfn1->u2.Blink = LIST_HEAD; + + /* Was the list empty? */ + if (Flink != LIST_HEAD) + { + /* It wasn't, so update the backlink of the previous head page */ + Pfn2 = MiGetPfnEntry(Flink); + Pfn2->u2.Blink = PageFrameIndex; + } + else + { + /* It was empty, so have it loop back around to this new page */ + ListHead->Blink = PageFrameIndex; + } + + /* Move the page onto its new location */ + Pfn1->u3.e1.PageLocation = ListName; + + /* One more page on the system */ + MmAvailablePages++; + + /* Check if we've reached the configured low memory threshold */ + if (MmAvailablePages == MmLowMemoryThreshold) + { + /* Clear the event, because now we're ABOVE the threshold */ + KeClearEvent(MiLowMemoryEvent); + } + else if (MmAvailablePages == MmHighMemoryThreshold) + { + /* Otherwise check if we reached the high threshold and signal the event */ + KeSetEvent(MiHighMemoryEvent, 0, FALSE); + } + + /* Sanity checks */ + ASSERT(ListName == ZeroedPageList); + ASSERT(Pfn1->u4.InPageError == 0); + + /* Get the page color */ + Color = PageFrameIndex & MmSecondaryColorMask; + + /* Get the list for this color */ + ColorHead = &MmFreePagesByColor[ZeroedPageList][Color]; + + /* Get the old head */ + Flink = ColorHead->Flink; + + /* If there is an original pte, it should be an old link, NOT a ReactOS RMAP */ + ASSERT(Pfn1->u4.AweAllocation == FALSE); + + /* Make this page point back to the list, and point forwards to the old head */ + Pfn1->OriginalPte.u.Long = Flink; + Pfn1->u4.PteFrame = COLORED_LIST_HEAD; + + /* Set the new head */ + ColorHead->Flink = PageFrameIndex; + + /* Was the head empty? */ + if (Flink != LIST_HEAD) + { + /* No, so make the old head point to this page */ + Pfn2 = MiGetPfnEntry(Flink); + Pfn2->u4.PteFrame = PageFrameIndex; + } + else + { + /* Yes, make it loop back to this page */ + ColorHead->Blink = (PVOID)Pfn1; + } + + /* One more paged on the colored list */ + ColorHead->Count++; +} + VOID NTAPI MiInitializePfn(IN PFN_NUMBER PageFrameIndex, @@ -703,6 +713,16 @@ MiInitializePfn(IN PFN_NUMBER PageFrameIndex, { /* Only valid from MmCreateProcessAddressSpace path */ ASSERT(PsGetCurrentProcess()->Vm.WorkingSetSize == 0); + + /* Make this a demand zero PTE */ + MI_MAKE_SOFTWARE_PTE(&Pfn1->OriginalPte, MM_READWRITE); + } + else + { + /* Copy the PTE data */ + Pfn1->OriginalPte = *PointerPte; + ASSERT(!((Pfn1->OriginalPte.u.Soft.Prototype == 0) && + (Pfn1->OriginalPte.u.Soft.Transition == 1))); } /* Otherwise this is a fresh page -- set it up */ @@ -768,7 +788,7 @@ MiAllocatePfn(IN PMMPTE PointerPte, /* Grab a page */ ASSERT_LIST_INVARIANT(&MmFreePageListHead); ASSERT_LIST_INVARIANT(&MmZeroedPageListHead); - PageFrameIndex = MiRemoveAnyPage(0); + PageFrameIndex = MiRemoveAnyPage(MI_GET_NEXT_COLOR()); /* Write the software PTE */ MI_WRITE_INVALID_PTE(PointerPte, TempPte); @@ -833,7 +853,7 @@ MiDecrementShareCount(IN PMMPFN Pfn1, * ways we shouldn't be seeing RMAP entries at this point */ ASSERT(Pfn1->OriginalPte.u.Soft.Prototype == 0); - ASSERT(Pfn1->OriginalPte.u.Long == 0); + ASSERT(Pfn1->u4.AweAllocation == FALSE); /* Mark the page temporarily as valid, we're going to make it free soon */ Pfn1->u3.e1.PageLocation = ActiveAndValid; @@ -849,6 +869,49 @@ MiDecrementShareCount(IN PMMPFN Pfn1, } } +VOID +NTAPI +MiDecrementReferenceCount(IN PMMPFN Pfn1, + IN PFN_NUMBER PageFrameIndex) +{ + /* PFN lock must be held */ + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + + /* Sanity checks on the page */ + ASSERT(PageFrameIndex < MmHighestPhysicalPage); + ASSERT(Pfn1 == MiGetPfnEntry(PageFrameIndex)); + ASSERT(Pfn1->u3.e2.ReferenceCount != 0); + + /* Dereference the page, bail out if it's still alive */ + InterlockedDecrement16((PSHORT)&Pfn1->u3.e2.ReferenceCount); + if (Pfn1->u3.e2.ReferenceCount) return; + + /* Nobody should still have reference to this page */ + if (Pfn1->u2.ShareCount != 0) + { + /* Otherwise something's really wrong */ + KeBugCheckEx(PFN_LIST_CORRUPT, 7, PageFrameIndex, Pfn1->u2.ShareCount, 0); + } + + /* And it should be lying on some page list */ + ASSERT(Pfn1->u3.e1.PageLocation != ActiveAndValid); + + /* Did someone set the delete flag? */ + if (MI_IS_PFN_DELETED(Pfn1)) + { + /* Insert it into the free list, there's nothing left to do */ + MiInsertPageInFreeList(PageFrameIndex); + return; + } + + /* We don't have a modified list yet */ + ASSERT(Pfn1->u3.e1.Modified == 0); + ASSERT(Pfn1->u3.e1.RemovalRequested == 0); + + /* FIXME: Normally it would go on the standby list, but we're pushing it on the free list */ + MiInsertPageInFreeList(PageFrameIndex); +} + VOID NTAPI MiInitializePfnForOtherProcess(IN PFN_NUMBER PageFrameIndex, @@ -860,11 +923,9 @@ MiInitializePfnForOtherProcess(IN PFN_NUMBER PageFrameIndex, /* Setup the PTE */ Pfn1 = MiGetPfnEntry(PageFrameIndex); Pfn1->PteAddress = PointerPte; - -#if 0 // When using ARM3 PFN + /* Make this a software PTE */ MI_MAKE_SOFTWARE_PTE(&Pfn1->OriginalPte, MM_READWRITE); -#endif /* Setup the page */ ASSERT(Pfn1->u3.e2.ReferenceCount == 0); diff --git a/ntoskrnl/mm/ARM3/pool.c b/ntoskrnl/mm/ARM3/pool.c index 1124dfb03a0..8156f6748f7 100644 --- a/ntoskrnl/mm/ARM3/pool.c +++ b/ntoskrnl/mm/ARM3/pool.c @@ -377,7 +377,10 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, KIRQL OldIrql; PLIST_ENTRY NextEntry, NextHead, LastHead; PMMPTE PointerPte, StartPte; + PMMPDE PointerPde; + ULONG EndAllocation; MMPTE TempPte; + MMPDE TempPde; PMMPFN Pfn1; PVOID BaseVa, BaseVaStart; PMMFREE_POOL_ENTRY FreeEntry; @@ -409,7 +412,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // // Get the page bit count // - i = ((SizeInPages - 1) / 1024) + 1; + i = ((SizeInPages - 1) / PTE_COUNT) + 1; DPRINT1("Paged pool expansion: %d %x\n", i, SizeInPages); // @@ -450,15 +453,15 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, } // - // Get the template PTE we'll use to expand + // Get the template PDE we'll use to expand // - TempPte = ValidKernelPte; + TempPde = ValidKernelPde; // // Get the first PTE in expansion space // - PointerPte = MmPagedPoolInfo.NextPdeForPagedPoolExpansion; - BaseVa = MiPteToAddress(PointerPte); + PointerPde = MmPagedPoolInfo.NextPdeForPagedPoolExpansion; + BaseVa = MiPteToAddress(PointerPde); BaseVaStart = BaseVa; // @@ -470,11 +473,13 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // // It should not already be valid // - ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(PointerPde->u.Hard.Valid == 0); /* Request a page */ - PageFrameNumber = MiRemoveAnyPage(0); - TempPte.u.Hard.PageFrameNumber = PageFrameNumber; + DPRINT1("Requesting %d PDEs\n", i); + PageFrameNumber = MiRemoveAnyPage(MI_GET_NEXT_COLOR()); + TempPde.u.Hard.PageFrameNumber = PageFrameNumber; + DPRINT1("We have a PDE: %lx\n", PageFrameNumber); #if (_MI_PAGING_LEVELS >= 3) /* On PAE/x64 systems, there's no double-buffering */ @@ -483,38 +488,38 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // // Save it into our double-buffered system page directory // - /* This seems to be making the assumption that one PDE is one page long */ - C_ASSERT(PAGE_SIZE == (PD_COUNT * (sizeof(MMPTE) * PDE_COUNT))); - MmSystemPagePtes[(ULONG_PTR)PointerPte & (PAGE_SIZE - 1) / - sizeof(MMPTE)] = TempPte; - + MmSystemPagePtes[((ULONG_PTR)PointerPde & (SYSTEM_PD_SIZE - 1)) / sizeof(MMPTE)] = TempPde; + /* Initialize the PFN */ MiInitializePfnForOtherProcess(PageFrameNumber, - PointerPte, - MmSystemPageDirectory[(PointerPte - (PMMPTE)PDE_BASE) / PDE_COUNT]); + PointerPde, + MmSystemPageDirectory[(PointerPde - MiAddressToPde(NULL)) / PDE_COUNT]); - /* Write the actual PTE now */ - MI_WRITE_VALID_PTE(PointerPte++, TempPte); + /* Write the actual PDE now */ + MI_WRITE_VALID_PTE(PointerPde, TempPde); #endif // // Move on to the next expansion address // + PointerPde++; BaseVa = (PVOID)((ULONG_PTR)BaseVa + PAGE_SIZE); - } while (--i > 0); + i--; + } while (i > 0); // // Release the PFN database lock // KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - + // // These pages are now available, clear their availablity bits // + EndAllocation = (MmPagedPoolInfo.NextPdeForPagedPoolExpansion - + MiAddressToPte(MmPagedPoolInfo.FirstPteForPagedPool)) * + PTE_COUNT; RtlClearBits(MmPagedPoolInfo.PagedPoolAllocationMap, - (MmPagedPoolInfo.NextPdeForPagedPoolExpansion - - MiAddressToPte(MmPagedPoolInfo.FirstPteForPagedPool)) * - 1024, - SizeInPages * 1024); + EndAllocation, + SizeInPages * PTE_COUNT); // // Update the next expansion location @@ -553,7 +558,8 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // Update the end bitmap so we know the bounds of this allocation when // the time comes to free it // - RtlSetBit(MmPagedPoolInfo.EndOfPagedPoolBitmap, i + SizeInPages - 1); + EndAllocation = i + SizeInPages - 1; + RtlSetBit(MmPagedPoolInfo.EndOfPagedPoolBitmap, EndAllocation); // // Now we can release the lock (it mainly protects the bitmap) @@ -583,9 +589,8 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // // Write the demand zero PTE and keep going // - ASSERT(PointerPte->u.Hard.Valid == 0); - *PointerPte++ = TempPte; - } while (PointerPte < StartPte); + MI_WRITE_INVALID_PTE(PointerPte, TempPte); + } while (++PointerPte < StartPte); // // Return the allocation address to the caller @@ -768,7 +773,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, do { /* Allocate a page */ - PageFrameNumber = MiRemoveAnyPage(0); + PageFrameNumber = MiRemoveAnyPage(MI_GET_NEXT_COLOR()); /* Get the PFN entry for it and fill it out */ Pfn1 = MiGetPfnEntry(PageFrameNumber); diff --git a/ntoskrnl/mm/ARM3/procsup.c b/ntoskrnl/mm/ARM3/procsup.c index 8def3be2f2c..7fdca8d0d83 100644 --- a/ntoskrnl/mm/ARM3/procsup.c +++ b/ntoskrnl/mm/ARM3/procsup.c @@ -16,7 +16,9 @@ #define MODULE_INVOLVED_IN_ARM3 #include "../ARM3/miarm.h" -extern MM_SYSTEMSIZE MmSystemSize; +/* GLOBALS ********************************************************************/ + +ULONG MmProcessColorSeed = 0x12345678; /* PRIVATE FUNCTIONS **********************************************************/ @@ -27,14 +29,14 @@ MiRosTakeOverPebTebRanges(IN PEPROCESS Process) NTSTATUS Status; PMEMORY_AREA MemoryArea; PHYSICAL_ADDRESS BoundaryAddressMultiple; - PVOID AllocatedBase = (PVOID)MI_LOWEST_VAD_ADDRESS; + PVOID AllocatedBase = (PVOID)USER_SHARED_DATA; BoundaryAddressMultiple.QuadPart = 0; Status = MmCreateMemoryArea(&Process->Vm, MEMORY_AREA_OWNED_BY_ARM3, &AllocatedBase, ((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - 1) - - (ULONG_PTR)MI_LOWEST_VAD_ADDRESS, + (ULONG_PTR)USER_SHARED_DATA, PAGE_READWRITE, &MemoryArea, TRUE, @@ -123,7 +125,7 @@ MiCreatePebOrTeb(IN PEPROCESS Process, /* Build the rest of the VAD now */ Vad->StartingVpn = (*Base) >> PAGE_SHIFT; - Vad->EndingVpn = ((*Base) + Size - 1) >> PAGE_SHIFT; + Vad->EndingVpn = ((*Base) + Size - 1) >> PAGE_SHIFT; Vad->u3.Secured.StartVpn = *Base; Vad->u3.Secured.EndVpn = (Vad->EndingVpn << PAGE_SHIFT) | (PAGE_SIZE - 1); Vad->u1.Parent = NULL; @@ -137,6 +139,10 @@ MiCreatePebOrTeb(IN PEPROCESS Process, /* Insert the VAD */ ASSERT(Vad->EndingVpn >= Vad->StartingVpn); Process->VadRoot.NodeHint = Vad; + Vad->ControlArea = NULL; // For Memory-Area hack + Vad->FirstPrototypePte = NULL; + DPRINT("VAD: %p\n", Vad); + DPRINT("Allocated PEB/TEB at: 0x%p for %16s\n", *Base, Process->ImageFileName); MiInsertNode(&Process->VadRoot, (PVOID)Vad, Parent, Result); /* Release the working set */ @@ -146,7 +152,6 @@ MiCreatePebOrTeb(IN PEPROCESS Process, KeReleaseGuardedMutex(&Process->AddressCreationLock); /* Return the status */ - DPRINT("Allocated PEB/TEB at: 0x%p for %16s\n", *Base, Process->ImageFileName); return Status; } @@ -256,7 +261,7 @@ MmDeleteKernelStack(IN PVOID StackBase, MiDecrementShareCount(Pfn2, PageTableFrameNumber); #endif /* Set the special pending delete marker */ - Pfn1->PteAddress = (PMMPTE)((ULONG_PTR)Pfn1->PteAddress | 1); + MI_SET_PFN_DELETED(Pfn1); /* And now delete the actual stack page */ MiDecrementShareCount(Pfn1, PageFrameNumber); @@ -357,7 +362,7 @@ MmCreateKernelStack(IN BOOLEAN GuiStack, PointerPte++; /* Get a page and write the current invalid PTE */ - PageFrameIndex = MiRemoveAnyPage(0); + PageFrameIndex = MiRemoveAnyPage(MI_GET_NEXT_COLOR()); MI_WRITE_INVALID_PTE(PointerPte, InvalidPte); /* Initialize the PFN entry for this page */ @@ -368,9 +373,6 @@ MmCreateKernelStack(IN BOOLEAN GuiStack, MI_WRITE_VALID_PTE(PointerPte, TempPte); } - // Bug #4835 - (VOID)InterlockedExchangeAddUL(&MiMemoryConsumers[MC_NPPOOL].PagesUsed, StackPages); - // // Release the PFN lock // @@ -444,7 +446,7 @@ MmGrowKernelStackEx(IN PVOID StackPointer, while (LimitPte >= NewLimitPte) { /* Get a page and write the current invalid PTE */ - PageFrameIndex = MiRemoveAnyPage(0); + PageFrameIndex = MiRemoveAnyPage(MI_GET_NEXT_COLOR()); MI_WRITE_INVALID_PTE(LimitPte, InvalidPte); /* Initialize the PFN entry for this page */ @@ -1058,9 +1060,10 @@ MmCreateProcessAddressSpace(IN ULONG MinWs, MMPTE TempPte, PdePte; ULONG PdeOffset; PMMPTE SystemTable; + ULONG Color; - /* No page colors yet */ - Process->NextPageColor = 0; + /* Choose a process color */ + Process->NextPageColor = RtlRandom(&MmProcessColorSeed); /* Setup the hyperspace lock */ KeInitializeSpinLock(&Process->HyperSpaceLock); @@ -1068,16 +1071,37 @@ MmCreateProcessAddressSpace(IN ULONG MinWs, /* Lock PFN database */ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - /* Get a page for the PDE */ - PdeIndex = MiRemoveAnyPage(0); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - MiZeroPhysicalPage(PdeIndex); - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - - /* Get a page for hyperspace */ - HyperIndex = MiRemoveAnyPage(0); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - MiZeroPhysicalPage(HyperIndex); + /* Get a zero page for the PDE, if possible */ + Color = MI_GET_NEXT_PROCESS_COLOR(Process); + PdeIndex = MiRemoveZeroPageSafe(Color); + if (!PdeIndex) + { + /* No zero pages, grab a free one */ + PdeIndex = MiRemoveAnyPage(Color); + + /* Zero it outside the PFN lock */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + MiZeroPhysicalPage(PdeIndex); + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + } + + /* Get a zero page for hyperspace, if possible */ + Color = MI_GET_NEXT_PROCESS_COLOR(Process); + HyperIndex = MiRemoveZeroPageSafe(Color); + if (!HyperIndex) + { + /* No zero pages, grab a free one */ + HyperIndex = MiRemoveAnyPage(Color); + + /* Zero it outside the PFN lock */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + MiZeroPhysicalPage(HyperIndex); + } + else + { + /* Release the PFN lock */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + } /* Switch to phase 1 initialization */ ASSERT(Process->AddressSpaceInitialized == 0); @@ -1112,7 +1136,6 @@ MmCreateProcessAddressSpace(IN ULONG MinWs, /* Copy all the kernel mappings */ PdeOffset = MiGetPdeOffset(MmSystemRangeStart); - RtlCopyMemory(&SystemTable[PdeOffset], MiAddressToPde(MmSystemRangeStart), PAGE_SIZE - PdeOffset * sizeof(MMPTE)); @@ -1151,7 +1174,6 @@ MmCleanProcessAddressSpace(IN PEPROCESS Process) /* Enumerate the VADs */ VadTree = &Process->VadRoot; - DPRINT("Cleaning up VADs: %d\n", VadTree->NumberGenericTableElements); while (VadTree->NumberGenericTableElements) { /* Grab the current VAD */ @@ -1163,14 +1185,34 @@ MmCleanProcessAddressSpace(IN PEPROCESS Process) /* Remove this VAD from the tree */ ASSERT(VadTree->NumberGenericTableElements >= 1); MiRemoveNode((PMMADDRESS_NODE)Vad, VadTree); - DPRINT("Moving on: %d\n", VadTree->NumberGenericTableElements); - /* Only PEB/TEB VADs supported for now */ - ASSERT(Vad->u.VadFlags.PrivateMemory == 1); + /* Only regular VADs supported for now */ ASSERT(Vad->u.VadFlags.VadType == VadNone); - /* Release the working set */ - MiUnlockProcessWorkingSet(Process, Thread); + /* Check if this is a section VAD */ + if (!(Vad->u.VadFlags.PrivateMemory) && (Vad->ControlArea)) + { + /* Remove the view */ + MiRemoveMappedView(Process, Vad); + } + else + { + /* Delete the addresses */ + MiDeleteVirtualAddresses(Vad->StartingVpn << PAGE_SHIFT, + (Vad->EndingVpn << PAGE_SHIFT) | (PAGE_SIZE - 1), + Vad); + + /* Release the working set */ + MiUnlockProcessWorkingSet(Process, Thread); + } + + /* Skip ARM3 fake VADs, they'll be freed by MmDeleteProcessAddresSpace */ + if (Vad->u.VadFlags.Spare == 1) + { + /* Set a flag so MmDeleteMemoryArea knows to free, but not to remove */ + Vad->u.VadFlags.Spare = 2; + continue; + } /* Free the VAD memory */ ExFreePool(Vad); diff --git a/ntoskrnl/mm/ARM3/section.c b/ntoskrnl/mm/ARM3/section.c new file mode 100644 index 00000000000..30f6b4c0a03 --- /dev/null +++ b/ntoskrnl/mm/ARM3/section.c @@ -0,0 +1,1867 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/sectopm.c + * PURPOSE: ARM Memory Manager Section Support + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARMツウ::SECTION" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +/* GLOBALS ********************************************************************/ + +ACCESS_MASK MmMakeSectionAccess[8] = +{ + SECTION_MAP_READ, + SECTION_MAP_READ, + SECTION_MAP_EXECUTE, + SECTION_MAP_EXECUTE | SECTION_MAP_READ, + SECTION_MAP_WRITE, + SECTION_MAP_READ, + SECTION_MAP_EXECUTE | SECTION_MAP_WRITE, + SECTION_MAP_EXECUTE | SECTION_MAP_READ +}; + +CHAR MmUserProtectionToMask1[16] = +{ + 0, + MM_NOACCESS, + MM_READONLY, + (CHAR)MM_INVALID_PROTECTION, + MM_READWRITE, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + MM_WRITECOPY, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION +}; + +CHAR MmUserProtectionToMask2[16] = +{ + 0, + MM_EXECUTE, + MM_EXECUTE_READ, + (CHAR)MM_INVALID_PROTECTION, + MM_EXECUTE_READWRITE, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + MM_EXECUTE_WRITECOPY, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION, + (CHAR)MM_INVALID_PROTECTION +}; + +MMSESSION MmSession; + +/* PRIVATE FUNCTIONS **********************************************************/ + +ULONG +NTAPI +MiMakeProtectionMask(IN ULONG Protect) +{ + ULONG Mask1, Mask2, ProtectMask; + + /* PAGE_EXECUTE_WRITECOMBINE is theoretically the maximum */ + if (Protect >= (PAGE_WRITECOMBINE * 2)) return MM_INVALID_PROTECTION; + + /* + * Windows API protection mask can be understood as two bitfields, differing + * by whether or not execute rights are being requested + */ + Mask1 = Protect & 0xF; + Mask2 = (Protect >> 4) & 0xF; + + /* Check which field is there */ + if (!Mask1) + { + /* Mask2 must be there, use it to determine the PTE protection */ + if (!Mask2) return MM_INVALID_PROTECTION; + ProtectMask = MmUserProtectionToMask2[Mask2]; + } + else + { + /* Mask2 should not be there, use Mask1 to determine the PTE mask */ + if (Mask2) return MM_INVALID_PROTECTION; + ProtectMask = MmUserProtectionToMask1[Mask1]; + } + + /* Make sure the final mask is a valid one */ + if (ProtectMask == MM_INVALID_PROTECTION) return MM_INVALID_PROTECTION; + + /* Check for PAGE_GUARD option */ + if (Protect & PAGE_GUARD) + { + /* It's not valid on no-access, nocache, or writecombine pages */ + if ((ProtectMask == MM_NOACCESS) || + (Protect & (PAGE_NOCACHE | PAGE_WRITECOMBINE))) + { + /* Fail such requests */ + return MM_INVALID_PROTECTION; + } + + /* This actually turns on guard page in this scenario! */ + ProtectMask |= MM_DECOMMIT; + } + + /* Check for nocache option */ + if (Protect & PAGE_NOCACHE) + { + /* The earlier check should've eliminated this possibility */ + ASSERT((Protect & PAGE_GUARD) == 0); + + /* Check for no-access page or write combine page */ + if ((ProtectMask == MM_NOACCESS) || (Protect & PAGE_WRITECOMBINE)) + { + /* Such a request is invalid */ + return MM_INVALID_PROTECTION; + } + + /* Add the PTE flag */ + ProtectMask |= MM_NOCACHE; + } + + /* Check for write combine option */ + if (Protect & PAGE_WRITECOMBINE) + { + /* The two earlier scenarios should've caught this */ + ASSERT((Protect & (PAGE_GUARD | PAGE_NOACCESS)) == 0); + + /* Don't allow on no-access pages */ + if (ProtectMask == MM_NOACCESS) return MM_INVALID_PROTECTION; + + /* This actually turns on write-combine in this scenario! */ + ProtectMask |= MM_NOACCESS; + } + + /* Return the final MM PTE protection mask */ + return ProtectMask; +} + +BOOLEAN +NTAPI +MiInitializeSystemSpaceMap(IN PVOID InputSession OPTIONAL) +{ + SIZE_T AllocSize, BitmapSize; + PMMSESSION Session; + + /* For now, always use the global session */ + ASSERT(InputSession == NULL); + Session = &MmSession; + + /* Initialize the system space lock */ + Session->SystemSpaceViewLockPointer = &Session->SystemSpaceViewLock; + KeInitializeGuardedMutex(Session->SystemSpaceViewLockPointer); + + /* Set the start address */ + Session->SystemSpaceViewStart = MiSystemViewStart; + + /* Create a bitmap to describe system space */ + BitmapSize = sizeof(RTL_BITMAP) + ((((MmSystemViewSize / MI_SYSTEM_VIEW_BUCKET_SIZE) + 31) / 32) * sizeof(ULONG)); + Session->SystemSpaceBitMap = ExAllocatePoolWithTag(NonPagedPool, + BitmapSize, + ' mM'); + ASSERT(Session->SystemSpaceBitMap); + RtlInitializeBitMap(Session->SystemSpaceBitMap, + (PULONG)(Session->SystemSpaceBitMap + 1), + MmSystemViewSize / MI_SYSTEM_VIEW_BUCKET_SIZE); + + /* Set system space fully empty to begin with */ + RtlClearAllBits(Session->SystemSpaceBitMap); + + /* Set default hash flags */ + Session->SystemSpaceHashSize = 31; + Session->SystemSpaceHashKey = Session->SystemSpaceHashSize - 1; + Session->SystemSpaceHashEntries = 0; + + /* Calculate how much space for the hash views we'll need */ + AllocSize = sizeof(MMVIEW) * Session->SystemSpaceHashSize; + ASSERT(AllocSize < PAGE_SIZE); + + /* Allocate and zero the view table */ + Session->SystemSpaceViewTable = ExAllocatePoolWithTag(NonPagedPool, + AllocSize, + ' mM'); + ASSERT(Session->SystemSpaceViewTable != NULL); + RtlZeroMemory(Session->SystemSpaceViewTable, AllocSize); + + /* Success */ + return TRUE; +} + +PVOID +NTAPI +MiInsertInSystemSpace(IN PMMSESSION Session, + IN ULONG Buckets, + IN PCONTROL_AREA ControlArea) +{ + PVOID Base; + ULONG Entry, Hash, i; + PAGED_CODE(); + + /* Only global mappings supported for now */ + ASSERT(Session == &MmSession); + + /* Stay within 4GB and don't go past the number of hash entries available */ + ASSERT(Buckets < MI_SYSTEM_VIEW_BUCKET_SIZE); + ASSERT(Session->SystemSpaceHashEntries < Session->SystemSpaceHashSize); + + /* Find space where to map this view */ + i = RtlFindClearBitsAndSet(Session->SystemSpaceBitMap, Buckets, 0); + ASSERT(i != 0xFFFFFFFF); + Base = (PVOID)((ULONG_PTR)Session->SystemSpaceViewStart + (i * MI_SYSTEM_VIEW_BUCKET_SIZE)); + + /* Get the hash entry for this allocation */ + Entry = ((ULONG_PTR)Base & ~(MI_SYSTEM_VIEW_BUCKET_SIZE - 1)) + Buckets; + Hash = (Entry >> 16) % Session->SystemSpaceHashKey; + + /* Loop hash entries until a free one is found */ + while (Session->SystemSpaceViewTable[Hash].Entry) + { + /* Unless we overflow, in which case loop back at hash o */ + if (++Hash >= Session->SystemSpaceHashSize) Hash = 0; + } + + /* Add this entry into the hash table */ + Session->SystemSpaceViewTable[Hash].Entry = Entry; + Session->SystemSpaceViewTable[Hash].ControlArea = ControlArea; + + /* Hash entry found, increment total and return the base address */ + Session->SystemSpaceHashEntries++; + return Base; +} + +NTSTATUS +NTAPI +MiAddMappedPtes(IN PMMPTE FirstPte, + IN PFN_NUMBER PteCount, + IN PCONTROL_AREA ControlArea) +{ + MMPTE TempPte; + PMMPTE PointerPte, ProtoPte, LastProtoPte, LastPte; + PSUBSECTION Subsection; + + /* ARM3 doesn't support this yet */ + ASSERT(ControlArea->u.Flags.GlobalOnlyPerSession == 0); + ASSERT(ControlArea->u.Flags.Rom == 0); + ASSERT(ControlArea->FilePointer == NULL); + + /* Sanity checks */ + ASSERT(PteCount != 0); + ASSERT(ControlArea->NumberOfMappedViews >= 1); + ASSERT(ControlArea->NumberOfUserReferences >= 1); + ASSERT(ControlArea->NumberOfSectionReferences != 0); + ASSERT(ControlArea->u.Flags.BeingCreated == 0); + ASSERT(ControlArea->u.Flags.BeingDeleted == 0); + ASSERT(ControlArea->u.Flags.BeingPurged == 0); + + /* Get the PTEs for the actual mapping */ + PointerPte = FirstPte; + LastPte = FirstPte + PteCount; + + /* Get the prototype PTEs that desribe the section mapping in the subsection */ + Subsection = (PSUBSECTION)(ControlArea + 1); + ProtoPte = Subsection->SubsectionBase; + LastProtoPte = &Subsection->SubsectionBase[Subsection->PtesInSubsection]; + + /* Loop the PTEs for the mapping */ + while (PointerPte < LastPte) + { + /* We may have run out of prototype PTEs in this subsection */ + if (ProtoPte >= LastProtoPte) + { + /* But we don't handle this yet */ + UNIMPLEMENTED; + while (TRUE); + } + + /* The PTE should be completely clear */ + ASSERT(PointerPte->u.Long == 0); + + /* Build the prototype PTE and write it */ + MI_MAKE_PROTOTYPE_PTE(&TempPte, ProtoPte); + MI_WRITE_INVALID_PTE(PointerPte, TempPte); + + /* Keep going */ + PointerPte++; + ProtoPte++; + } + + /* No failure path */ + return STATUS_SUCCESS; +} + +#if (_MI_PAGING_LEVELS == 2) +VOID +NTAPI +MiFillSystemPageDirectory(IN PVOID Base, + IN SIZE_T NumberOfBytes) +{ + PMMPDE PointerPde, LastPde, SystemMapPde; + MMPDE TempPde; + PFN_NUMBER PageFrameIndex; + KIRQL OldIrql; + PAGED_CODE(); + + /* Find the PDEs needed for this mapping */ + PointerPde = MiAddressToPde(Base); + LastPde = MiAddressToPde((PVOID)((ULONG_PTR)Base + NumberOfBytes - 1)); + + /* Find the system double-mapped PDE that describes this mapping */ + SystemMapPde = &MmSystemPagePtes[((ULONG_PTR)PointerPde & (SYSTEM_PD_SIZE - 1)) / sizeof(MMPTE)]; + + /* Use the PDE template and loop the PDEs */ + TempPde = ValidKernelPde; + while (PointerPde <= LastPde) + { + /* Lock the PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Check if we don't already have this PDE mapped */ + if (SystemMapPde->u.Hard.Valid == 0) + { + /* Grab a page for it */ + PageFrameIndex = MiRemoveZeroPage(MI_GET_NEXT_COLOR()); + ASSERT(PageFrameIndex); + TempPde.u.Hard.PageFrameNumber = PageFrameIndex; + + /* Initialize its PFN entry, with the parent system page directory page table */ + MiInitializePfnForOtherProcess(PageFrameIndex, + PointerPde, + MmSystemPageDirectory[(PointerPde - MiAddressToPde(NULL)) / PDE_COUNT]); + + /* Make the system PDE entry valid */ + MI_WRITE_VALID_PTE(SystemMapPde, TempPde); + + /* The system PDE entry might be the PDE itself, so check for this */ + if (PointerPde->u.Hard.Valid == 0) + { + /* It's different, so make the real PDE valid too */ + MI_WRITE_VALID_PTE(PointerPde, TempPde); + } + } + + /* Release the lock and keep going with the next PDE */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + SystemMapPde++; + PointerPde++; + } +} +#endif + +NTSTATUS +NTAPI +MiCheckPurgeAndUpMapCount(IN PCONTROL_AREA ControlArea, + IN BOOLEAN FailIfSystemViews) +{ + KIRQL OldIrql; + + /* Flag not yet supported */ + ASSERT(FailIfSystemViews == FALSE); + + /* Lock the PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* State not yet supported */ + ASSERT(ControlArea->u.Flags.BeingPurged == 0); + + /* Increase the reference counts */ + ControlArea->NumberOfMappedViews++; + ControlArea->NumberOfUserReferences++; + ASSERT(ControlArea->NumberOfSectionReferences != 0); + + /* Release the PFN lock and return success */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + return STATUS_SUCCESS; +} + +PSUBSECTION +NTAPI +MiLocateSubsection(IN PMMVAD Vad, + IN ULONG_PTR Vpn) +{ + PSUBSECTION Subsection; + PCONTROL_AREA ControlArea; + ULONG PteOffset; + + /* Get the control area */ + ControlArea = Vad->ControlArea; + ASSERT(ControlArea->u.Flags.Rom == 0); + ASSERT(ControlArea->u.Flags.Image == 0); + ASSERT(ControlArea->u.Flags.GlobalOnlyPerSession == 0); + + /* Get the subsection */ + Subsection = (PSUBSECTION)(ControlArea + 1); + + /* We only support single-subsection segments */ + ASSERT(Subsection->SubsectionBase != NULL); + ASSERT(Vad->FirstPrototypePte >= Subsection->SubsectionBase); + ASSERT(Vad->FirstPrototypePte < &Subsection->SubsectionBase[Subsection->PtesInSubsection]); + + /* Compute the PTE offset */ + PteOffset = (ULONG_PTR)Vpn - Vad->StartingVpn; + PteOffset += Vad->FirstPrototypePte - Subsection->SubsectionBase; + + /* Again, we only support single-subsection segments */ + ASSERT(PteOffset < 0xF0000000); + ASSERT(PteOffset < Subsection->PtesInSubsection); + + /* Return the subsection */ + return Subsection; +} + +VOID +NTAPI +MiSegmentDelete(IN PSEGMENT Segment) +{ + PCONTROL_AREA ControlArea; + SEGMENT_FLAGS SegmentFlags; + PSUBSECTION Subsection; + PMMPTE PointerPte, LastPte, PteForProto; + MMPTE TempPte; + KIRQL OldIrql; + + /* Capture data */ + SegmentFlags = Segment->SegmentFlags; + ControlArea = Segment->ControlArea; + + /* Make sure control area is on the right delete path */ + ASSERT(ControlArea->u.Flags.BeingDeleted == 1); + ASSERT(ControlArea->WritableUserReferences == 0); + + /* These things are not supported yet */ + ASSERT(ControlArea->DereferenceList.Flink == NULL); + ASSERT(!(ControlArea->u.Flags.Image) & !(ControlArea->u.Flags.File)); + ASSERT(ControlArea->u.Flags.GlobalOnlyPerSession == 0); + ASSERT(ControlArea->u.Flags.Rom == 0); + + /* Get the subsection and PTEs for this segment */ + Subsection = (PSUBSECTION)(ControlArea + 1); + PointerPte = Subsection->SubsectionBase; + LastPte = PointerPte + Segment->NonExtendedPtes; + + /* Lock the PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Check if the master PTE is invalid */ + PteForProto = MiAddressToPte(PointerPte); + if (!PteForProto->u.Hard.Valid) + { + /* Fault it in */ + MiMakeSystemAddressValidPfn(PointerPte, OldIrql); + } + + /* Loop all the segment PTEs */ + while (PointerPte < LastPte) + { + /* Check if it's time to switch master PTEs if we passed a PDE boundary */ + if (!((ULONG_PTR)PointerPte & (PD_SIZE - 1)) && + (PointerPte != Subsection->SubsectionBase)) + { + /* Check if the master PTE is invalid */ + PteForProto = MiAddressToPte(PointerPte); + if (!PteForProto->u.Hard.Valid) + { + /* Fault it in */ + MiMakeSystemAddressValidPfn(PointerPte, OldIrql); + } + } + + /* This should be a prototype PTE */ + TempPte = *PointerPte; + ASSERT(SegmentFlags.LargePages == 0); + ASSERT(TempPte.u.Hard.Valid == 0); + ASSERT(TempPte.u.Soft.Prototype == 1); + + /* Zero the PTE and keep going */ + PointerPte->u.Long = 0; + PointerPte++; + } + + /* Release the PFN lock */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + /* Free the structures */ + ExFreePool(ControlArea); + ExFreePool(Segment); +} + +VOID +NTAPI +MiCheckControlArea(IN PCONTROL_AREA ControlArea, + IN KIRQL OldIrql) +{ + BOOLEAN DeleteSegment = FALSE; + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + + /* Check if this is the last reference or view */ + if (!(ControlArea->NumberOfMappedViews) && + !(ControlArea->NumberOfSectionReferences)) + { + /* There should be no more user references either */ + ASSERT(ControlArea->NumberOfUserReferences == 0); + + /* Not yet supported */ + ASSERT(ControlArea->FilePointer == NULL); + + /* The control area is being destroyed */ + ControlArea->u.Flags.BeingDeleted = TRUE; + DeleteSegment = TRUE; + } + + /* Release the PFN lock */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + /* Delete the segment if needed */ + if (DeleteSegment) + { + /* No more user write references at all */ + ASSERT(ControlArea->WritableUserReferences == 0); + MiSegmentDelete(ControlArea->Segment); + } +} + +VOID +NTAPI +MiRemoveMappedView(IN PEPROCESS CurrentProcess, + IN PMMVAD Vad) +{ + KIRQL OldIrql; + PCONTROL_AREA ControlArea; + + /* Get the control area */ + ControlArea = Vad->ControlArea; + + /* We only support non-extendable, non-image, pagefile-backed regular sections */ + ASSERT(Vad->u.VadFlags.VadType == VadNone); + ASSERT(Vad->u2.VadFlags2.ExtendableFile == FALSE); + ASSERT(ControlArea); + ASSERT(ControlArea->FilePointer == NULL); + + /* Delete the actual virtual memory pages */ + MiDeleteVirtualAddresses(Vad->StartingVpn << PAGE_SHIFT, + (Vad->EndingVpn << PAGE_SHIFT) | (PAGE_SIZE - 1), + Vad); + + /* Release the working set */ + MiUnlockProcessWorkingSet(CurrentProcess, PsGetCurrentThread()); + + /* Lock the PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Remove references */ + ControlArea->NumberOfMappedViews--; + ControlArea->NumberOfUserReferences--; + + /* Check if it should be destroyed */ + MiCheckControlArea(ControlArea, OldIrql); +} + +NTSTATUS +NTAPI +MiMapViewInSystemSpace(IN PVOID Section, + IN PMMSESSION Session, + OUT PVOID *MappedBase, + IN OUT PSIZE_T ViewSize) +{ + PVOID Base; + PCONTROL_AREA ControlArea; + ULONG Buckets, SectionSize; + NTSTATUS Status; + PAGED_CODE(); + + /* Only global mappings for now */ + ASSERT(Session == &MmSession); + + /* Get the control area, check for any flags ARM3 doesn't yet support */ + ControlArea = ((PSECTION)Section)->Segment->ControlArea; + ASSERT(ControlArea->u.Flags.Image == 0); + ASSERT(ControlArea->FilePointer == NULL); + ASSERT(ControlArea->u.Flags.GlobalOnlyPerSession == 0); + ASSERT(ControlArea->u.Flags.Rom == 0); + ASSERT(ControlArea->u.Flags.WasPurged == 0); + + /* Increase the reference and map count on the control area, no purges yet */ + Status = MiCheckPurgeAndUpMapCount(ControlArea, FALSE); + ASSERT(NT_SUCCESS(Status)); + + /* Get the section size at creation time */ + SectionSize = ((PSECTION)Section)->SizeOfSection.LowPart; + + /* If the caller didn't specify a view size, assume the whole section */ + if (!(*ViewSize)) *ViewSize = SectionSize; + + /* Check if the caller wanted a larger section than the view */ + if (*ViewSize > SectionSize) + { + /* We should probably fail. FIXME TODO */ + UNIMPLEMENTED; + while (TRUE); + } + + /* Get the number of 64K buckets required for this mapping */ + Buckets = *ViewSize / MI_SYSTEM_VIEW_BUCKET_SIZE; + if (*ViewSize & (MI_SYSTEM_VIEW_BUCKET_SIZE - 1)) Buckets++; + + /* Check if the view is more than 4GB large */ + if (Buckets >= MI_SYSTEM_VIEW_BUCKET_SIZE) + { + /* We should probably fail */ + UNIMPLEMENTED; + while (TRUE); + } + + /* Insert this view into system space and get a base address for it */ + Base = MiInsertInSystemSpace(Session, Buckets, ControlArea); + ASSERT(Base); + +#if (_MI_PAGING_LEVELS == 2) + /* Create the PDEs needed for this mapping, and double-map them if needed */ + MiFillSystemPageDirectory(Base, Buckets * MI_SYSTEM_VIEW_BUCKET_SIZE); +#endif + + /* Create the actual prototype PTEs for this mapping */ + Status = MiAddMappedPtes(MiAddressToPte(Base), + BYTES_TO_PAGES(*ViewSize), + ControlArea); + ASSERT(NT_SUCCESS(Status)); + + /* Return the base adress of the mapping and success */ + *MappedBase = Base; + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +MiMapViewOfDataSection(IN PCONTROL_AREA ControlArea, + IN PEPROCESS Process, + IN PVOID *BaseAddress, + IN PLARGE_INTEGER SectionOffset, + IN PSIZE_T ViewSize, + IN PSECTION Section, + IN SECTION_INHERIT InheritDisposition, + IN ULONG ProtectionMask, + IN ULONG CommitSize, + IN ULONG_PTR ZeroBits, + IN ULONG AllocationType) +{ + PMMVAD Vad; + PETHREAD Thread = PsGetCurrentThread(); + ULONG_PTR StartAddress, EndingAddress; + PSUBSECTION Subsection; + PSEGMENT Segment; + PFN_NUMBER PteOffset; + NTSTATUS Status; + + /* Get the segment and subection for this section */ + Segment = ControlArea->Segment; + Subsection = (PSUBSECTION)(ControlArea + 1); + + /* Non-pagefile-backed sections not supported */ + ASSERT(ControlArea->u.Flags.GlobalOnlyPerSession == 0); + ASSERT(ControlArea->u.Flags.Rom == 0); + ASSERT(ControlArea->FilePointer == NULL); + ASSERT(Segment->SegmentFlags.TotalNumberOfPtes4132 == 0); + + /* Based sections not supported */ + ASSERT(Section->Address.StartingVpn == 0); + + /* These flags/parameters are not supported */ + ASSERT((AllocationType & MEM_DOS_LIM) == 0); + ASSERT((AllocationType & MEM_RESERVE) == 0); + ASSERT(Process->VmTopDown == 0); + ASSERT(Section->u.Flags.CopyOnWrite == FALSE); + ASSERT(ZeroBits == 0); + + /* First, increase the map count. No purging is supported yet */ + Status = MiCheckPurgeAndUpMapCount(ControlArea, FALSE); + ASSERT(NT_SUCCESS(Status)); + + /* Check if the caller specified the view size */ + if (!(*ViewSize)) + { + /* The caller did not, so pick a 64K aligned view size based on the offset */ + SectionOffset->LowPart &= ~(_64K - 1); + *ViewSize = Section->SizeOfSection.QuadPart - SectionOffset->QuadPart; + } + else + { + /* A size was specified, align it to a 64K boundary */ + *ViewSize += SectionOffset->LowPart & (_64K - 1); + + /* Align the offset as well to make this an aligned map */ + SectionOffset->LowPart &= ~((ULONG)_64K - 1); + } + + /* We must be dealing with a 64KB aligned offset */ + ASSERT((SectionOffset->LowPart & ((ULONG)_64K - 1)) == 0); + + /* It's illegal to try to map more than 2GB */ + if (*ViewSize >= 0x80000000) return STATUS_INVALID_VIEW_SIZE; + + /* Within this section, figure out which PTEs will describe the view */ + PteOffset = SectionOffset->QuadPart >> PAGE_SHIFT; + + /* The offset must be in this segment's PTE chunk and it must be valid */ + ASSERT(PteOffset < Segment->TotalNumberOfPtes); + ASSERT(((SectionOffset->QuadPart + *ViewSize + PAGE_SIZE - 1) >> PAGE_SHIFT) >= PteOffset); + + /* In ARM3, only one subsection is used for now. It must contain these PTEs */ + ASSERT(PteOffset < Subsection->PtesInSubsection); + ASSERT(Subsection->SubsectionBase != NULL); + + /* In ARM3, only MEM_COMMIT is supported for now. The PTEs must've been committed */ + ASSERT(Segment->NumberOfCommittedPages >= Segment->TotalNumberOfPtes); + + /* Did the caller specify an address? */ + if (!(*BaseAddress)) + { + /* Which way should we search? */ + if (AllocationType & MEM_TOP_DOWN) + { + /* No, find an address top-down */ + Status = MiFindEmptyAddressRangeDownTree(*ViewSize, + (ULONG_PTR)MM_HIGHEST_VAD_ADDRESS, + _64K, + &Process->VadRoot, + &StartAddress, + (PMMADDRESS_NODE*)&Process->VadFreeHint); + ASSERT(NT_SUCCESS(Status)); + } + else + { + /* No, find an address bottom-up */ + Status = MiFindEmptyAddressRangeInTree(*ViewSize, + _64K, + &Process->VadRoot, + (PMMADDRESS_NODE*)&Process->VadFreeHint, + &StartAddress); + ASSERT(NT_SUCCESS(Status)); + } + } + else + { + /* This (rather easy) code path is not yet implemented */ + UNIMPLEMENTED; + while (TRUE); + } + + /* Get the ending address, which is the last piece we need for the VAD */ + EndingAddress = (StartAddress + *ViewSize - 1) | (PAGE_SIZE - 1); + + /* A VAD can now be allocated. Do so and zero it out */ + Vad = ExAllocatePoolWithTag(NonPagedPool, sizeof(MMVAD), 'ldaV'); + ASSERT(Vad); + RtlZeroMemory(Vad, sizeof(MMVAD)); + + /* Write all the data required in the VAD for handling a fault */ + Vad->StartingVpn = StartAddress >> PAGE_SHIFT; + Vad->EndingVpn = EndingAddress >> PAGE_SHIFT; + Vad->ControlArea = ControlArea; + Vad->u.VadFlags.Protection = ProtectionMask; + Vad->u2.VadFlags2.FileOffset = SectionOffset->QuadPart >> 16; + Vad->u2.VadFlags2.Inherit = (InheritDisposition == ViewShare); + if ((AllocationType & SEC_NO_CHANGE) || (Section->u.Flags.NoChange)) + { + /* This isn't really implemented yet, but handle setting the flag */ + Vad->u.VadFlags.NoChange = 1; + Vad->u2.VadFlags2.SecNoChange = 1; + } + + /* Finally, write down the first and last prototype PTE */ + Vad->FirstPrototypePte = &Subsection->SubsectionBase[PteOffset]; + PteOffset += (Vad->EndingVpn - Vad->StartingVpn); + Vad->LastContiguousPte = &Subsection->SubsectionBase[PteOffset]; + + /* Make sure the last PTE is valid and still within the subsection */ + ASSERT(PteOffset < Subsection->PtesInSubsection); + ASSERT(Vad->FirstPrototypePte <= Vad->LastContiguousPte); + + /* FIXME: Should setup VAD bitmap */ + Status = STATUS_SUCCESS; + + /* Pretend as if we own the working set */ + MiLockProcessWorkingSet(Process, Thread); + + /* Insert the VAD */ + MiInsertVad(Vad, Process); + + /* Release the working set */ + MiUnlockProcessWorkingSet(Process, Thread); + + /* Windows stores this for accounting purposes, do so as well */ + if (!Segment->u2.FirstMappedVa) Segment->u2.FirstMappedVa = (PVOID)StartAddress; + + /* Finally, let the caller know where, and for what size, the view was mapped */ + *ViewSize = (ULONG_PTR)EndingAddress - (ULONG_PTR)StartAddress + 1; + *BaseAddress = (PVOID)StartAddress; + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +MiCreatePagingFileMap(OUT PSEGMENT *Segment, + IN PSIZE_T MaximumSize, + IN ULONG ProtectionMask, + IN ULONG AllocationAttributes) +{ + SIZE_T SizeLimit; + PFN_NUMBER PteCount; + PMMPTE PointerPte; + MMPTE TempPte; + PCONTROL_AREA ControlArea; + PSEGMENT NewSegment; + PSUBSECTION Subsection; + PAGED_CODE(); + + /* No large pages in ARM3 yet */ + ASSERT((AllocationAttributes & SEC_LARGE_PAGES) == 0); + + /* Pagefile-backed sections need a known size */ + if (!(*MaximumSize)) return STATUS_INVALID_PARAMETER_4; + + /* Calculate the maximum size possible, given the Prototype PTEs we'll need */ + SizeLimit = MAXULONG_PTR - sizeof(SEGMENT); + SizeLimit /= sizeof(MMPTE); + SizeLimit <<= PAGE_SHIFT; + + /* Fail if this size is too big */ + if (*MaximumSize > SizeLimit) return STATUS_SECTION_TOO_BIG; + + /* Calculate how many Prototype PTEs will be needed */ + PteCount = (*MaximumSize + PAGE_SIZE - 1) >> PAGE_SHIFT; + + /* For commited memory, we must have a valid protection mask */ + if (AllocationAttributes & SEC_COMMIT) ASSERT(ProtectionMask != 0); + + /* The segment contains all the Prototype PTEs, allocate it in paged pool */ + NewSegment = ExAllocatePoolWithTag(PagedPool, + sizeof(SEGMENT) + + sizeof(MMPTE) * (PteCount - 1), + 'tSmM'); + ASSERT(NewSegment); + *Segment = NewSegment; + + /* Now allocate the control area, which has the subsection structure */ + ControlArea = ExAllocatePoolWithTag(NonPagedPool, + sizeof(CONTROL_AREA) + sizeof(SUBSECTION), + 'tCmM'); + ASSERT(ControlArea); + + /* And zero it out, filling the basic segmnet pointer and reference fields */ + RtlZeroMemory(ControlArea, sizeof(CONTROL_AREA) + sizeof(SUBSECTION)); + ControlArea->Segment = NewSegment; + ControlArea->NumberOfSectionReferences = 1; + ControlArea->NumberOfUserReferences = 1; + + /* Convert allocation attributes to control area flags */ + if (AllocationAttributes & SEC_BASED) ControlArea->u.Flags.Based = 1; + if (AllocationAttributes & SEC_RESERVE) ControlArea->u.Flags.Reserve = 1; + if (AllocationAttributes & SEC_COMMIT) ControlArea->u.Flags.Commit = 1; + + /* The subsection follows, write the mask, PTE count and point back to the CA */ + Subsection = (PSUBSECTION)(ControlArea + 1); + Subsection->ControlArea = ControlArea; + Subsection->PtesInSubsection = PteCount; + Subsection->u.SubsectionFlags.Protection = ProtectionMask; + + /* Zero out the segment's prototype PTEs, and link it with the control area */ + PointerPte = &NewSegment->ThePtes[0]; + RtlZeroMemory(NewSegment, sizeof(SEGMENT)); + NewSegment->PrototypePte = PointerPte; + NewSegment->ControlArea = ControlArea; + + /* Save some extra accounting data for the segment as well */ + NewSegment->u1.CreatingProcess = PsGetCurrentProcess(); + NewSegment->SizeOfSegment = PteCount * PAGE_SIZE; + NewSegment->TotalNumberOfPtes = PteCount; + NewSegment->NonExtendedPtes = PteCount; + + /* The subsection's base address is the first Prototype PTE in the segment */ + Subsection->SubsectionBase = PointerPte; + + /* Start with an empty PTE, unless this is a commit operation */ + TempPte.u.Long = 0; + if (AllocationAttributes & SEC_COMMIT) + { + /* In which case, write down the protection mask in the Prototype PTEs */ + TempPte.u.Soft.Protection = ProtectionMask; + + /* For accounting, also mark these pages as being committed */ + NewSegment->NumberOfCommittedPages = PteCount; + } + + /* The template PTE itself for the segment should also have the mask set */ + NewSegment->SegmentPteTemplate.u.Soft.Protection = ProtectionMask; + + /* Write out the prototype PTEs, for now they're simply demand zero */ + RtlFillMemoryUlong(PointerPte, PteCount * sizeof(MMPTE), TempPte.u.Long); + return STATUS_SUCCESS; +} + +PFILE_OBJECT +NTAPI +MmGetFileObjectForSection(IN PVOID SectionObject) +{ + PSECTION_OBJECT Section; + ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); + ASSERT(SectionObject != NULL); + + /* Check if it's an ARM3, or ReactOS section */ + if ((ULONG_PTR)SectionObject & 1) + { + /* Return the file pointer stored in the control area */ + Section = (PVOID)((ULONG_PTR)SectionObject & ~1); + return Section->Segment->ControlArea->FilePointer; + } + + /* Return the file object */ + return ((PROS_SECTION_OBJECT)SectionObject)->FileObject; +} + +NTSTATUS +NTAPI +MmGetFileNameForFileObject(IN PFILE_OBJECT FileObject, + OUT POBJECT_NAME_INFORMATION *ModuleName) +{ + POBJECT_NAME_INFORMATION ObjectNameInfo; + NTSTATUS Status; + ULONG ReturnLength; + + /* Allocate memory for our structure */ + ObjectNameInfo = ExAllocatePoolWithTag(PagedPool, 1024, ' mM'); + if (!ObjectNameInfo) return STATUS_NO_MEMORY; + + /* Query the name */ + Status = ObQueryNameString(FileObject, + ObjectNameInfo, + 1024, + &ReturnLength); + if (!NT_SUCCESS(Status)) + { + /* Failed, free memory */ + DPRINT1("Name query failed\n"); + ExFreePoolWithTag(ObjectNameInfo, ' mM'); + *ModuleName = NULL; + return Status; + } + + /* Success */ + *ModuleName = ObjectNameInfo; + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +MmGetFileNameForSection(IN PVOID Section, + OUT POBJECT_NAME_INFORMATION *ModuleName) +{ + PFILE_OBJECT FileObject; + + /* Make sure it's an image section */ + if ((ULONG_PTR)Section & 1) + { + /* Check ARM3 Section flag */ + if (((PSECTION)((ULONG_PTR)Section & ~1))->u.Flags.Image == 0) + { + /* It's not, fail */ + DPRINT1("Not an image section\n"); + return STATUS_SECTION_NOT_IMAGE; + } + } + else if (!(((PROS_SECTION_OBJECT)Section)->AllocationAttributes & SEC_IMAGE)) + { + /* It's not, fail */ + DPRINT1("Not an image section\n"); + return STATUS_SECTION_NOT_IMAGE; + } + + /* Get the file object */ + FileObject = MmGetFileObjectForSection(Section); + return MmGetFileNameForFileObject(FileObject, ModuleName); +} + +NTSTATUS +NTAPI +MmGetFileNameForAddress(IN PVOID Address, + OUT PUNICODE_STRING ModuleName) +{ + PVOID Section; + PMEMORY_AREA MemoryArea; + POBJECT_NAME_INFORMATION ModuleNameInformation; + PVOID AddressSpace; + NTSTATUS Status; + PFILE_OBJECT FileObject = NULL; + PMMVAD Vad; + PCONTROL_AREA ControlArea; + + /* Lock address space */ + AddressSpace = MmGetCurrentAddressSpace(); + MmLockAddressSpace(AddressSpace); + + /* Locate the memory area for the process by address */ + MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, Address); + if (!MemoryArea) + { + /* Fail, the address does not exist */ +InvalidAddress: + DPRINT1("Invalid address\n"); + MmUnlockAddressSpace(AddressSpace); + return STATUS_INVALID_ADDRESS; + } + + /* Check if it's a section view (RosMm section) or ARM3 section */ + if (MemoryArea->Type == MEMORY_AREA_SECTION_VIEW) + { + /* Get the section pointer to the SECTION_OBJECT */ + Section = MemoryArea->Data.SectionData.Section; + + /* Unlock address space */ + MmUnlockAddressSpace(AddressSpace); + + /* Get the filename of the section */ + Status = MmGetFileNameForSection(Section, &ModuleNameInformation); + } + else if (MemoryArea->Type == MEMORY_AREA_OWNED_BY_ARM3) + { + /* Get the VAD */ + Vad = MiLocateAddress(Address); + if (!Vad) goto InvalidAddress; + + /* Make sure it's not a VM VAD */ + if (Vad->u.VadFlags.PrivateMemory == 1) + { +NotSection: + DPRINT1("Address is not a section\n"); + MmUnlockAddressSpace(AddressSpace); + return STATUS_SECTION_NOT_IMAGE; + } + + /* Get the control area */ + ControlArea = Vad->ControlArea; + if (!(ControlArea) || !(ControlArea->u.Flags.Image)) goto NotSection; + + /* Get the file object */ + FileObject = ControlArea->FilePointer; + ASSERT(FileObject != NULL); + ObReferenceObject(FileObject); + + /* Unlock address space */ + MmUnlockAddressSpace(AddressSpace); + + /* Get the filename of the file object */ + Status = MmGetFileNameForFileObject(FileObject, &ModuleNameInformation); + + /* Dereference it */ + ObDereferenceObject(FileObject); + } + else + { + /* Trying to access virtual memory or something */ + goto InvalidAddress; + } + + /* Check if we were able to get the file object name */ + if (NT_SUCCESS(Status)) + { + /* Init modulename */ + RtlCreateUnicodeString(ModuleName, + ModuleNameInformation->Name.Buffer); + + /* Free temp taged buffer from MmGetFileNameForFileObject() */ + ExFreePoolWithTag(ModuleNameInformation, ' mM'); + DPRINT("Found ModuleName %S by address %p\n", ModuleName->Buffer, Address); + } + + /* Return status */ + return Status; +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ +NTSTATUS +NTAPI +MmCreateArm3Section(OUT PVOID *SectionObject, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER InputMaximumSize, + IN ULONG SectionPageProtection, + IN ULONG AllocationAttributes, + IN HANDLE FileHandle OPTIONAL, + IN PFILE_OBJECT FileObject OPTIONAL) +{ + SECTION Section; + PSECTION NewSection; + PSUBSECTION Subsection; + PSEGMENT NewSegment; + NTSTATUS Status; + PCONTROL_AREA ControlArea; + ULONG ProtectionMask; + + /* ARM3 does not yet support this */ + ASSERT(FileHandle == NULL); + ASSERT(FileObject == NULL); + ASSERT((AllocationAttributes & SEC_LARGE_PAGES) == 0); + ASSERT((AllocationAttributes & SEC_BASED) == 0); + + /* Make the same sanity checks that the Nt interface should've validated */ + ASSERT((AllocationAttributes & ~(SEC_COMMIT | SEC_RESERVE | SEC_BASED | + SEC_LARGE_PAGES | SEC_IMAGE | SEC_NOCACHE | + SEC_NO_CHANGE)) == 0); + ASSERT((AllocationAttributes & (SEC_COMMIT | SEC_RESERVE | SEC_IMAGE)) != 0); + ASSERT(!((AllocationAttributes & SEC_IMAGE) && + (AllocationAttributes & (SEC_COMMIT | SEC_RESERVE | + SEC_NOCACHE | SEC_NO_CHANGE)))); + ASSERT(!((AllocationAttributes & SEC_COMMIT) && (AllocationAttributes & SEC_RESERVE))); + ASSERT(!((SectionPageProtection & PAGE_NOCACHE) || + (SectionPageProtection & PAGE_WRITECOMBINE) || + (SectionPageProtection & PAGE_GUARD) || + (SectionPageProtection & PAGE_NOACCESS))); + + /* Convert section flag to page flag */ + if (AllocationAttributes & SEC_NOCACHE) SectionPageProtection |= PAGE_NOCACHE; + + /* Check to make sure the protection is correct. Nt* does this already */ + ProtectionMask = MiMakeProtectionMask(SectionPageProtection); + if (ProtectionMask == MM_INVALID_PROTECTION) return STATUS_INVALID_PAGE_PROTECTION; + + /* A handle must be supplied with SEC_IMAGE, and this is the no-handle path */ + if (AllocationAttributes & SEC_IMAGE) return STATUS_INVALID_FILE_FOR_SECTION; + + /* So this must be a pagefile-backed section, create the mappings needed */ + Status = MiCreatePagingFileMap(&NewSegment, + (PSIZE_T)InputMaximumSize, + ProtectionMask, + AllocationAttributes); + ASSERT(NT_SUCCESS(Status)); + + /* Set the initial section object data */ + Section.InitialPageProtection = SectionPageProtection; + Section.Segment = NULL; + Section.SizeOfSection.QuadPart = NewSegment->SizeOfSegment; + Section.Segment = NewSegment; + + /* THe mapping created a control area and segment, save the flags */ + ControlArea = NewSegment->ControlArea; + Section.u.LongFlags = ControlArea->u.LongFlags; + + /* ARM3 cannot support these right now, make sure they're not being set */ + ASSERT(ControlArea->u.Flags.Image == 0); + ASSERT(ControlArea->FilePointer == NULL); + ASSERT(ControlArea->u.Flags.GlobalOnlyPerSession == 0); + ASSERT(ControlArea->u.Flags.Rom == 0); + ASSERT(ControlArea->u.Flags.WasPurged == 0); + + /* A pagefile-backed mapping only has one subsection, and this is all ARM3 supports */ + Subsection = (PSUBSECTION)(ControlArea + 1); + ASSERT(Subsection->NextSubsection == NULL); + + /* Create the actual section object, with enough space for the prototype PTEs */ + Status = ObCreateObject(ExGetPreviousMode(), + MmSectionObjectType, + ObjectAttributes, + ExGetPreviousMode(), + NULL, + sizeof(SECTION), + sizeof(SECTION) + + NewSegment->TotalNumberOfPtes * sizeof(MMPTE), + sizeof(CONTROL_AREA) + sizeof(SUBSECTION), + (PVOID*)&NewSection); + ASSERT(NT_SUCCESS(Status)); + + /* Now copy the local section object from the stack into this new object */ + RtlCopyMemory(NewSection, &Section, sizeof(SECTION)); + NewSection->Address.StartingVpn = 0; + + /* Return the object and the creation status */ + *SectionObject = (PVOID)NewSection; + return Status; +} + +/* + * @implemented + */ +NTSTATUS +NTAPI +MmMapViewOfArm3Section(IN PVOID SectionObject, + IN PEPROCESS Process, + IN OUT PVOID *BaseAddress, + IN ULONG_PTR ZeroBits, + IN SIZE_T CommitSize, + IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, + IN OUT PSIZE_T ViewSize, + IN SECTION_INHERIT InheritDisposition, + IN ULONG AllocationType, + IN ULONG Protect) +{ + KAPC_STATE ApcState; + BOOLEAN Attached = FALSE; + PSECTION Section; + PCONTROL_AREA ControlArea; + ULONG ProtectionMask; + NTSTATUS Status; + PAGED_CODE(); + + /* Get the segment and control area */ + Section = (PSECTION)SectionObject; + ControlArea = Section->Segment->ControlArea; + + /* These flags/states are not yet supported by ARM3 */ + ASSERT(Section->u.Flags.Image == 0); + ASSERT(Section->u.Flags.NoCache == 0); + ASSERT(Section->u.Flags.WriteCombined == 0); + ASSERT((AllocationType & MEM_RESERVE) == 0); + ASSERT(ControlArea->u.Flags.PhysicalMemory == 0); + + +#if 0 + /* FIXME: Check if the mapping protection is compatible with the create */ + if (!MiIsProtectionCompatible(Section->InitialPageProtection, Protect)) + { + DPRINT1("Mapping protection is incompatible\n"); + return STATUS_SECTION_PROTECTION; + } +#endif + + /* Check if the offset and size would cause an overflow */ + if ((SectionOffset->QuadPart + *ViewSize) < SectionOffset->QuadPart) + { + DPRINT1("Section offset overflows\n"); + return STATUS_INVALID_VIEW_SIZE; + } + + /* Check if the offset and size are bigger than the section itself */ + if ((SectionOffset->QuadPart + *ViewSize) > Section->SizeOfSection.QuadPart) + { + DPRINT1("Section offset is larger than section\n"); + return STATUS_INVALID_VIEW_SIZE; + } + + /* Check if the caller did not specify a view size */ + if (!(*ViewSize)) + { + /* Compute it for the caller */ + *ViewSize = Section->SizeOfSection.QuadPart - SectionOffset->QuadPart; + + /* Check if it's larger than 4GB or overflows into kernel-mode */ + if ((*ViewSize > 0xFFFFFFFF) || + (((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS - (ULONG_PTR)*BaseAddress) < *ViewSize)) + { + DPRINT1("Section view won't fit\n"); + return STATUS_INVALID_VIEW_SIZE; + } + } + + /* Check if the commit size is larger than the view size */ + if (CommitSize > *ViewSize) + { + DPRINT1("Attempting to commit more than the view itself\n"); + return STATUS_INVALID_PARAMETER_5; + } + + /* Check if the view size is larger than the section */ + if (*ViewSize > Section->SizeOfSection.QuadPart) + { + DPRINT1("The view is larger than the section\n"); + return STATUS_INVALID_VIEW_SIZE; + } + + /* Compute and validate the protection mask */ + ProtectionMask = MiMakeProtectionMask(Protect); + if (ProtectionMask == MM_INVALID_PROTECTION) + { + DPRINT1("The protection is invalid\n"); + return STATUS_INVALID_PAGE_PROTECTION; + } + + /* We only handle pagefile-backed sections, which cannot be writecombined */ + if (Protect & PAGE_WRITECOMBINE) + { + DPRINT1("Cannot write combine a pagefile-backed section\n"); + return STATUS_INVALID_PARAMETER_10; + } + + /* Start by attaching to the current process if needed */ + if (PsGetCurrentProcess() != Process) + { + KeStackAttachProcess(&Process->Pcb, &ApcState); + Attached = TRUE; + } + + /* Lock the address space and make sure the process is alive */ + MmLockAddressSpace(&Process->Vm); + if (!Process->VmDeleted) + { + /* Do the actual mapping */ + Status = MiMapViewOfDataSection(ControlArea, + Process, + BaseAddress, + SectionOffset, + ViewSize, + Section, + InheritDisposition, + ProtectionMask, + CommitSize, + ZeroBits, + AllocationType); + } + else + { + /* The process is being terminated, fail */ + DPRINT1("The process is dying\n"); + Status = STATUS_PROCESS_IS_TERMINATING; + } + + /* Unlock the address space and detatch if needed, then return status */ + MmUnlockAddressSpace(&Process->Vm); + if (Attached) KeUnstackDetachProcess(&ApcState); + return Status; +} + +/* SYSTEM CALLS ***************************************************************/ + +NTSTATUS +NTAPI +NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage, + IN PVOID File2MappedAsFile) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @implemented + */ +NTSTATUS +NTAPI +NtCreateSection(OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize OPTIONAL, + IN ULONG SectionPageProtection OPTIONAL, + IN ULONG AllocationAttributes, + IN HANDLE FileHandle OPTIONAL) +{ + LARGE_INTEGER SafeMaximumSize; + PVOID SectionObject; + HANDLE Handle; + KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); + NTSTATUS Status; + PAGED_CODE(); + + /* Check for non-existing flags */ + if ((AllocationAttributes & ~(SEC_COMMIT | SEC_RESERVE | SEC_BASED | + SEC_LARGE_PAGES | SEC_IMAGE | SEC_NOCACHE | + SEC_NO_CHANGE))) + { + if (!(AllocationAttributes & 1)) + { + DPRINT1("Bogus allocation attribute: %lx\n", AllocationAttributes); + return STATUS_INVALID_PARAMETER_6; + } + } + + /* Check for no allocation type */ + if (!(AllocationAttributes & (SEC_COMMIT | SEC_RESERVE | SEC_IMAGE))) + { + DPRINT1("Missing allocation type in allocation attributes\n"); + return STATUS_INVALID_PARAMETER_6; + } + + /* Check for image allocation with invalid attributes */ + if ((AllocationAttributes & SEC_IMAGE) && + (AllocationAttributes & (SEC_COMMIT | SEC_RESERVE | SEC_LARGE_PAGES | + SEC_NOCACHE | SEC_NO_CHANGE))) + { + DPRINT1("Image allocation with invalid attributes\n"); + return STATUS_INVALID_PARAMETER_6; + } + + /* Check for allocation type is both commit and reserve */ + if ((AllocationAttributes & SEC_COMMIT) && (AllocationAttributes & SEC_RESERVE)) + { + DPRINT1("Commit and reserve in the same time\n"); + return STATUS_INVALID_PARAMETER_6; + } + + /* Now check for valid protection */ + if ((SectionPageProtection & PAGE_NOCACHE) || + (SectionPageProtection & PAGE_WRITECOMBINE) || + (SectionPageProtection & PAGE_GUARD) || + (SectionPageProtection & PAGE_NOACCESS)) + { + DPRINT1("Sections don't support these protections\n"); + return STATUS_INVALID_PAGE_PROTECTION; + } + + /* Use a maximum size of zero, if none was specified */ + SafeMaximumSize.QuadPart = 0; + + /* Check for user-mode caller */ + if (PreviousMode != KernelMode) + { + /* Enter SEH */ + _SEH2_TRY + { + /* Safely check user-mode parameters */ + if (MaximumSize) SafeMaximumSize = ProbeForReadLargeInteger(MaximumSize); + MaximumSize = &SafeMaximumSize; + ProbeForWriteHandle(SectionHandle); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Return the exception code */ + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; + } + else if (!MaximumSize) MaximumSize = &SafeMaximumSize; + + /* Create the section */ + Status = MmCreateSection(&SectionObject, + DesiredAccess, + ObjectAttributes, + MaximumSize, + SectionPageProtection, + AllocationAttributes, + FileHandle, + NULL); + if (!NT_SUCCESS(Status)) return Status; + + /* FIXME: Should zero last page for a file mapping */ + + /* Now insert the object */ + Status = ObInsertObject(SectionObject, + NULL, + DesiredAccess, + 0, + NULL, + &Handle); + if (NT_SUCCESS(Status)) + { + /* Enter SEH */ + _SEH2_TRY + { + /* Return the handle safely */ + *SectionHandle = Handle; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Nothing here */ + } + _SEH2_END; + } + + /* Return the status */ + return Status; +} + +NTSTATUS +NTAPI +NtOpenSection(OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes) +{ + HANDLE Handle; + NTSTATUS Status; + KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); + PAGED_CODE(); + + /* Check for user-mode caller */ + if (PreviousMode != KernelMode) + { + /* Enter SEH */ + _SEH2_TRY + { + /* Safely check user-mode parameters */ + ProbeForWriteHandle(SectionHandle); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Return the exception code */ + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; + } + + /* Try opening the object */ + Status = ObOpenObjectByName(ObjectAttributes, + MmSectionObjectType, + PreviousMode, + NULL, + DesiredAccess, + NULL, + &Handle); + + /* Enter SEH */ + _SEH2_TRY + { + /* Return the handle safely */ + *SectionHandle = Handle; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Nothing here */ + } + _SEH2_END; + + /* Return the status */ + return Status; +} + +NTSTATUS +NTAPI +NtMapViewOfSection(IN HANDLE SectionHandle, + IN HANDLE ProcessHandle, + IN OUT PVOID* BaseAddress, + IN ULONG_PTR ZeroBits, + IN SIZE_T CommitSize, + IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, + IN OUT PSIZE_T ViewSize, + IN SECTION_INHERIT InheritDisposition, + IN ULONG AllocationType, + IN ULONG Protect) +{ + PVOID SafeBaseAddress; + LARGE_INTEGER SafeSectionOffset; + SIZE_T SafeViewSize; + PROS_SECTION_OBJECT Section; + PEPROCESS Process; + NTSTATUS Status; + ACCESS_MASK DesiredAccess; + ULONG ProtectionMask; + KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); + + /* Check for invalid zero bits */ + if (ZeroBits > 21) // per-arch? + { + DPRINT1("Invalid zero bits\n"); + return STATUS_INVALID_PARAMETER_4; + } + + /* Check for invalid inherit disposition */ + if ((InheritDisposition > ViewUnmap) || (InheritDisposition < ViewShare)) + { + DPRINT1("Invalid inherit disposition\n"); + return STATUS_INVALID_PARAMETER_8; + } + + /* Allow only valid allocation types */ + if ((AllocationType & ~(MEM_TOP_DOWN | MEM_LARGE_PAGES | MEM_DOS_LIM | + SEC_NO_CHANGE | MEM_RESERVE))) + { + DPRINT1("Invalid allocation type\n"); + return STATUS_INVALID_PARAMETER_9; + } + + /* Convert the protection mask, and validate it */ + ProtectionMask = MiMakeProtectionMask(Protect); + if (ProtectionMask == MM_INVALID_PROTECTION) + { + DPRINT1("Invalid page protection\n"); + return STATUS_INVALID_PAGE_PROTECTION; + } + + /* Now convert the protection mask into desired section access mask */ + DesiredAccess = MmMakeSectionAccess[ProtectionMask & 0x7]; + + /* Assume no section offset */ + SafeSectionOffset.QuadPart = 0; + + /* Enter SEH */ + _SEH2_TRY + { + /* Check for unsafe parameters */ + if (PreviousMode != KernelMode) + { + /* Probe the parameters */ + ProbeForWritePointer(BaseAddress); + ProbeForWriteSize_t(ViewSize); + } + + /* Check if a section offset was given */ + if (SectionOffset) + { + /* Check for unsafe parameters and capture section offset */ + if (PreviousMode != KernelMode) ProbeForWriteLargeInteger(SectionOffset); + SafeSectionOffset = *SectionOffset; + } + + /* Capture the other parameters */ + SafeBaseAddress = *BaseAddress; + SafeViewSize = *ViewSize; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Return the exception code */ + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; + + /* Check for kernel-mode address */ + if (SafeBaseAddress > MM_HIGHEST_VAD_ADDRESS) + { + DPRINT1("Kernel base not allowed\n"); + return STATUS_INVALID_PARAMETER_3; + } + + /* Check for range entering kernel-mode */ + if (((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS - (ULONG_PTR)SafeBaseAddress) < SafeViewSize) + { + DPRINT1("Overflowing into kernel base not allowed\n"); + return STATUS_INVALID_PARAMETER_3; + } + + /* Check for invalid zero bits */ + if (((ULONG_PTR)SafeBaseAddress + SafeViewSize) > (0xFFFFFFFF >> ZeroBits)) // arch? + { + DPRINT1("Invalid zero bits\n"); + return STATUS_INVALID_PARAMETER_4; + } + + /* Reference the process */ + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_OPERATION, + PsProcessType, + PreviousMode, + (PVOID*)&Process, + NULL); + if (!NT_SUCCESS(Status)) return Status; + + /* Reference the section */ + Status = ObReferenceObjectByHandle(SectionHandle, + DesiredAccess, + MmSectionObjectType, + PreviousMode, + (PVOID*)&Section, + NULL); + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(Process); + return Status; + } + + /* Now do the actual mapping */ + Status = MmMapViewOfSection(Section, + Process, + &SafeBaseAddress, + ZeroBits, + CommitSize, + &SafeSectionOffset, + &SafeViewSize, + InheritDisposition, + AllocationType, + Protect); + + /* Check if this is an image for the current process */ + if ((Section->AllocationAttributes & SEC_IMAGE) && + (Process == PsGetCurrentProcess()) && + ((Status != STATUS_IMAGE_NOT_AT_BASE) || + (Status != STATUS_CONFLICTING_ADDRESSES))) + { + /* Notify the debugger */ + DbgkMapViewOfSection(Section, + SafeBaseAddress, + SafeSectionOffset.LowPart, + SafeViewSize); + } + + /* Return data only on success */ + if (NT_SUCCESS(Status)) + { + /* Enter SEH */ + _SEH2_TRY + { + /* Return parameters to user */ + *BaseAddress = SafeBaseAddress; + *ViewSize = SafeViewSize; + if (SectionOffset) *SectionOffset = SafeSectionOffset; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Nothing to do */ + } + _SEH2_END; + } + + /* Dereference all objects and return status */ + ObDereferenceObject(Section); + ObDereferenceObject(Process); + return Status; +} + +NTSTATUS +NTAPI +NtUnmapViewOfSection(IN HANDLE ProcessHandle, + IN PVOID BaseAddress) +{ + PEPROCESS Process; + NTSTATUS Status; + KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); + + /* Don't allowing mapping kernel views */ + if ((PreviousMode == UserMode) && (BaseAddress > MM_HIGHEST_USER_ADDRESS)) + { + DPRINT1("Trying to unmap a kernel view\n"); + return STATUS_NOT_MAPPED_VIEW; + } + + /* Reference the process */ + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_OPERATION, + PsProcessType, + PreviousMode, + (PVOID*)&Process, + NULL); + if (!NT_SUCCESS(Status)) return Status; + + /* Unmap the view */ + Status = MmUnmapViewOfSection(Process, BaseAddress); + + /* Dereference the process and return status */ + ObDereferenceObject(Process); + return Status; +} + +NTSTATUS +NTAPI +NtExtendSection(IN HANDLE SectionHandle, + IN OUT PLARGE_INTEGER NewMaximumSize) +{ + LARGE_INTEGER SafeNewMaximumSize; + PROS_SECTION_OBJECT Section; + NTSTATUS Status; + KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); + + /* Check for user-mode parameters */ + if (PreviousMode != KernelMode) + { + /* Enter SEH */ + _SEH2_TRY + { + /* Probe and capture the maximum size, it's both read and write */ + ProbeForWriteLargeInteger(NewMaximumSize); + SafeNewMaximumSize = *NewMaximumSize; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Return the exception code */ + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; + } + else + { + /* Just read the size directly */ + SafeNewMaximumSize = *NewMaximumSize; + } + + /* Reference the section */ + Status = ObReferenceObjectByHandle(SectionHandle, + SECTION_EXTEND_SIZE, + MmSectionObjectType, + PreviousMode, + (PVOID*)&Section, + NULL); + if (!NT_SUCCESS(Status)) return Status; + + /* Really this should go in MmExtendSection */ + if (!(Section->AllocationAttributes & SEC_FILE)) + { + DPRINT1("Not extending a file\n"); + ObDereferenceObject(Section); + return STATUS_SECTION_NOT_EXTENDED; + } + + /* FIXME: Do the work */ + + /* Dereference the section */ + ObDereferenceObject(Section); + + /* Enter SEH */ + _SEH2_TRY + { + /* Write back the new size */ + *NewMaximumSize = SafeNewMaximumSize; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Nothing to do */ + } + _SEH2_END; + + /* Return the status */ + return STATUS_NOT_IMPLEMENTED; +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @unimplemented + */ +BOOLEAN +NTAPI +MmDisableModifiedWriteOfSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +BOOLEAN +NTAPI +MmForceSectionClosed(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN BOOLEAN DelayClose) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +MmMapViewInSessionSpace(IN PVOID Section, + OUT PVOID *MappedBase, + IN OUT PSIZE_T ViewSize) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +MmUnmapViewInSessionSpace(IN PVOID MappedBase) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* EOF */ diff --git a/ntoskrnl/mm/ARM3/sysldr.c b/ntoskrnl/mm/ARM3/sysldr.c index 5c716ce73a3..7990b82d2e6 100644 --- a/ntoskrnl/mm/ARM3/sysldr.c +++ b/ntoskrnl/mm/ARM3/sysldr.c @@ -746,7 +746,11 @@ MiSnapThunk(IN PVOID DllBase, } /* Check if we couldn't find it */ - if (High < Low) return STATUS_DRIVER_ENTRYPOINT_NOT_FOUND; + if (High < Low) + { + DPRINT1("Warning: Driver failed to load, %s not found\n", NameImport->Name); + return STATUS_DRIVER_ENTRYPOINT_NOT_FOUND; + } /* Otherwise, this is the ordinal */ Ordinal = OrdinalTable[Mid]; @@ -1237,6 +1241,7 @@ CheckDllState: /* Cleanup and return */ MiDereferenceImports(LoadedImports); if (LoadedImports) ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); + DPRINT1("Warning: Driver failed to load, %S not found\n", *MissingDriver); return STATUS_DRIVER_ENTRYPOINT_NOT_FOUND; } diff --git a/ntoskrnl/mm/ARM3/vadnode.c b/ntoskrnl/mm/ARM3/vadnode.c index a9aa209dd84..d62a02c8a73 100644 --- a/ntoskrnl/mm/ARM3/vadnode.c +++ b/ntoskrnl/mm/ARM3/vadnode.c @@ -93,14 +93,72 @@ MiCheckForConflictingNode(IN ULONG_PTR StartVpn, VOID NTAPI -MiInsertNode( - IN PMM_AVL_TABLE Table, - IN PMMADDRESS_NODE NewNode, - PMMADDRESS_NODE Parent, - TABLE_SEARCH_RESULT Result) +MiInsertNode(IN PMM_AVL_TABLE Table, + IN PMMADDRESS_NODE NewNode, + IN PMMADDRESS_NODE Parent, + IN TABLE_SEARCH_RESULT Result) { /* Insert it into the tree */ RtlpInsertAvlTreeNode(Table, NewNode, Parent, Result); + + /* Now insert an ARM3 MEMORY_AREA for this node, unless the insert was already from the MEMORY_AREA code */ + PMMVAD Vad = (PMMVAD)NewNode; + if (Vad->u.VadFlags.Spare == 0) + { + NTSTATUS Status; + PMEMORY_AREA MemoryArea; + PHYSICAL_ADDRESS BoundaryAddressMultiple; + SIZE_T Size; + PEPROCESS Process = CONTAINING_RECORD(Table, EPROCESS, VadRoot); + PVOID AllocatedBase = (PVOID)(Vad->StartingVpn << PAGE_SHIFT); + BoundaryAddressMultiple.QuadPart = 0; + Size = ((Vad->EndingVpn + 1) - Vad->StartingVpn) << PAGE_SHIFT; + Status = MmCreateMemoryArea(&Process->Vm, + MEMORY_AREA_OWNED_BY_ARM3, + &AllocatedBase, + Size, + PAGE_READWRITE, + &MemoryArea, + TRUE, + 0, + BoundaryAddressMultiple); + ASSERT(NT_SUCCESS(Status)); + + /* Check if this is VM VAD */ + if (Vad->ControlArea == NULL) + { + /* We store the reactos MEMORY_AREA here */ + DPRINT("Storing %p in %p\n", MemoryArea, Vad); + Vad->FirstPrototypePte = (PMMPTE)MemoryArea; + } + else + { + /* This is a section VAD. Store the MAREA here for now */ + DPRINT("Storing %p in %p\n", MemoryArea, Vad); + Vad->ControlArea->WaitingForDeletion = (PVOID)MemoryArea; + } + } +} + +VOID +NTAPI +MiInsertVad(IN PMMVAD Vad, + IN PEPROCESS Process) +{ + TABLE_SEARCH_RESULT Result; + PMMADDRESS_NODE Parent = NULL; + + /* Validate the VAD and set it as the current hint */ + ASSERT(Vad->EndingVpn >= Vad->StartingVpn); + Process->VadRoot.NodeHint = Vad; + + /* Find the parent VAD and where this child should be inserted */ + Result = RtlpFindAvlTableNodeOrParent(&Process->VadRoot, (PVOID)Vad->StartingVpn, &Parent); + ASSERT(Result != TableFoundNode); + ASSERT((Parent != NULL) || (Result == TableEmptyTree)); + + /* Do the actual insert operation */ + MiInsertNode(&Process->VadRoot, (PVOID)Vad, Parent, Result); } VOID @@ -108,8 +166,6 @@ NTAPI MiRemoveNode(IN PMMADDRESS_NODE Node, IN PMM_AVL_TABLE Table) { - DPRINT("Removing address node: %lx %lx\n", Node->StartingVpn, Node->EndingVpn); - /* Call the AVL code */ RtlpDeleteAvlTreeNode(Table, Node); @@ -123,6 +179,40 @@ MiRemoveNode(IN PMMADDRESS_NODE Node, if (!Table->NumberGenericTableElements) Table->NodeHint = NULL; else Table->NodeHint = Table->BalancedRoot.RightChild; } + + /* Free the node from ReactOS view as well */ + PMMVAD Vad = (PMMVAD)Node; + if (Vad->u.VadFlags.Spare == 0) + { + PMEMORY_AREA MemoryArea; + PEPROCESS Process; + + /* Check if this is VM VAD */ + if (Vad->ControlArea == NULL) + { + /* We store the ReactOS MEMORY_AREA here */ + MemoryArea = (PMEMORY_AREA)Vad->FirstPrototypePte; + } + else + { + /* This is a section VAD. We store the ReactOS MEMORY_AREA here */ + MemoryArea = (PMEMORY_AREA)Vad->ControlArea->WaitingForDeletion; + } + + /* Make sure one actually still exists */ + if (MemoryArea) + { + /* Get the process */ + Process = CONTAINING_RECORD(Table, EPROCESS, VadRoot); + + /* We only create fake memory-areas for ARM3 VADs */ + ASSERT(MemoryArea->Type == MEMORY_AREA_OWNED_BY_ARM3); + ASSERT(MemoryArea->Vad == NULL); + + /* Free it */ + MmFreeMemoryArea(&Process->Vm, MemoryArea, NULL, NULL); + } + } } PMMADDRESS_NODE @@ -161,15 +251,120 @@ MiGetPreviousNode(IN PMMADDRESS_NODE Node) return NULL; } +PMMADDRESS_NODE +NTAPI +MiGetNextNode(IN PMMADDRESS_NODE Node) +{ + PMMADDRESS_NODE Parent; + + /* Get the right child */ + if (RtlRightChildAvl(Node)) + { + /* Get left-most child */ + Node = RtlRightChildAvl(Node); + while (RtlLeftChildAvl(Node)) Node = RtlLeftChildAvl(Node); + return Node; + } + + Parent = RtlParentAvl(Node); + ASSERT(Parent != NULL); + while (Parent != Node) + { + /* The parent should be a left child, return the real predecessor */ + if (RtlIsLeftChildAvl(Node)) + { + /* Return it */ + return Parent; + } + + /* Keep lopping until we find our parent */ + Node = Parent; + Parent = RtlParentAvl(Node); + } + + /* Nothing found */ + return NULL; +} + +NTSTATUS +NTAPI +MiFindEmptyAddressRangeInTree(IN SIZE_T Length, + IN ULONG_PTR Alignment, + IN PMM_AVL_TABLE Table, + OUT PMMADDRESS_NODE *PreviousVad, + OUT PULONG_PTR Base) +{ + PMMADDRESS_NODE Node; + PMMADDRESS_NODE NextNode; + ULONG_PTR StartingVpn, HighestVpn, AlignmentVpn, LengthVpn, LowVpn; + ASSERT(Length != 0); + + /* Precompute page numbers for the length, alignment, and starting address */ + LengthVpn = (Length + (PAGE_SIZE - 1)) >> PAGE_SHIFT; + AlignmentVpn = Alignment >> PAGE_SHIFT; + StartingVpn = ROUND_UP((ULONG_PTR)MM_LOWEST_USER_ADDRESS >> PAGE_SHIFT, + AlignmentVpn); + + /* Check if the table is free, so the lowest possible address is available */ + if (!Table->NumberGenericTableElements) goto FoundAtBottom; + + /* Otherwise, follow the leftmost child of the right root node's child */ + Node = RtlRightChildAvl(&Table->BalancedRoot); + while (RtlLeftChildAvl(Node)) Node = RtlLeftChildAvl(Node); + + /* This is the node for the remaining gap at the bottom, can it be used? */ + if ((Node->StartingVpn > StartingVpn) && + (LengthVpn < Node->StartingVpn - StartingVpn)) + { +FoundAtBottom: + /* Use this VAD to store the allocation */ + *PreviousVad = NULL; + *Base = StartingVpn << PAGE_SHIFT; + return STATUS_SUCCESS; + } + + /* Otherwise, we start a search to find a gap */ + while (TRUE) + { + /* The last aligned page number in this entry */ + LowVpn = ROUND_UP(Node->EndingVpn + 1, AlignmentVpn); + + /* Keep going as long as there's still a next node */ + NextNode = MiGetNextNode(Node); + if (!NextNode) break; + + /* Can this allocation fit in this node? */ + if ((LengthVpn <= (NextNode->StartingVpn - LowVpn)) && + (NextNode->StartingVpn > LowVpn)) + { +Found: + /* Yes! Use this VAD to store the allocation */ + *PreviousVad = Node; + *Base = ROUND_UP((Node->EndingVpn << PAGE_SHIFT) | (PAGE_SIZE - 1), + Alignment); + return STATUS_SUCCESS; + } + + /* Try the next node */ + Node = NextNode; + } + + /* We're down to the last (top) VAD, will this allocation fit inside it? */ + HighestVpn = ((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1) >> PAGE_SHIFT; + if ((HighestVpn > LowVpn) && (LengthVpn <= HighestVpn - LowVpn)) goto Found; + + /* Nyet, there's no free address space for this allocation, so we'll fail */ + return STATUS_NO_MEMORY; +} + TABLE_SEARCH_RESULT NTAPI -MiFindEmptyAddressRangeDownTree( - IN SIZE_T Length, - IN ULONG_PTR BoundaryAddress, - IN ULONG_PTR Alignment, - IN PMM_AVL_TABLE Table, - OUT PULONG_PTR Base, - OUT PMMADDRESS_NODE *Parent) +MiFindEmptyAddressRangeDownTree(IN SIZE_T Length, + IN ULONG_PTR BoundaryAddress, + IN ULONG_PTR Alignment, + IN PMM_AVL_TABLE Table, + OUT PULONG_PTR Base, + OUT PMMADDRESS_NODE *Parent) { PMMADDRESS_NODE Node, LowestNode, Child; ULONG LowVpn, HighVpn; @@ -180,7 +375,7 @@ MiFindEmptyAddressRangeDownTree( ASSERT(BoundaryAddress <= ((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1)); /* Compute page length, make sure the boundary address is valid */ - Length = PAGE_ROUND_UP(Length); + Length = ROUND_TO_PAGES(Length); PageCount = Length >> PAGE_SHIFT; if ((BoundaryAddress + 1) < Length) return STATUS_NO_MEMORY; @@ -188,7 +383,7 @@ MiFindEmptyAddressRangeDownTree( if (Table->NumberGenericTableElements == 0) { /* Tree is empty, the candidate address is already the best one */ - *Base = ROUND_DOWN(BoundaryAddress + 1 - Length, Alignment); + *Base = ROUND_UP(BoundaryAddress + 1 - Length, Alignment); return TableEmptyTree; } diff --git a/ntoskrnl/mm/ARM3/virtual.c b/ntoskrnl/mm/ARM3/virtual.c index 53ac25023f8..dd0f818e0ca 100644 --- a/ntoskrnl/mm/ARM3/virtual.c +++ b/ntoskrnl/mm/ARM3/virtual.c @@ -29,6 +29,85 @@ MiProtectVirtualMemory(IN PEPROCESS Process, /* PRIVATE FUNCTIONS **********************************************************/ +ULONG +NTAPI +MiMakeSystemAddressValid(IN PVOID PageTableVirtualAddress, + IN PEPROCESS CurrentProcess) +{ + NTSTATUS Status; + BOOLEAN LockChange = FALSE; + + /* Must be a non-pool page table, since those are double-mapped already */ + ASSERT(PageTableVirtualAddress > MM_HIGHEST_USER_ADDRESS); + ASSERT((PageTableVirtualAddress < MmPagedPoolStart) || + (PageTableVirtualAddress > MmPagedPoolEnd)); + + /* Working set lock or PFN lock should be held */ + ASSERT(KeAreAllApcsDisabled() == TRUE); + + /* Check if the page table is valid */ + while (!MmIsAddressValid(PageTableVirtualAddress)) + { + /* Fault it in */ + Status = MmAccessFault(FALSE, PageTableVirtualAddress, KernelMode, NULL); + if (!NT_SUCCESS(Status)) + { + /* This should not fail */ + KeBugCheckEx(KERNEL_DATA_INPAGE_ERROR, + 1, + Status, + (ULONG_PTR)CurrentProcess, + (ULONG_PTR)PageTableVirtualAddress); + } + + /* This flag will be useful later when we do better locking */ + LockChange = TRUE; + } + + /* Let caller know what the lock state is */ + return LockChange; +} + +ULONG +NTAPI +MiMakeSystemAddressValidPfn(IN PVOID VirtualAddress, + IN KIRQL OldIrql) +{ + NTSTATUS Status; + BOOLEAN LockChange = FALSE; + + /* Must be e kernel address */ + ASSERT(VirtualAddress > MM_HIGHEST_USER_ADDRESS); + + /* Check if the page is valid */ + while (!MmIsAddressValid(VirtualAddress)) + { + /* Release the PFN database */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + /* Fault it in */ + Status = MmAccessFault(FALSE, VirtualAddress, KernelMode, NULL); + if (!NT_SUCCESS(Status)) + { + /* This should not fail */ + KeBugCheckEx(KERNEL_DATA_INPAGE_ERROR, + 3, + Status, + 0, + (ULONG_PTR)VirtualAddress); + } + + /* This flag will be useful later when we do better locking */ + LockChange = TRUE; + + /* Lock the PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + } + + /* Let caller know what the lock state is */ + return LockChange; +} + PFN_NUMBER NTAPI MiDeleteSystemPageableVm(IN PMMPTE PointerPte, @@ -126,6 +205,266 @@ MiDeleteSystemPageableVm(IN PMMPTE PointerPte, return ActualPages; } +VOID +NTAPI +MiDeletePte(IN PMMPTE PointerPte, + IN PVOID VirtualAddress, + IN PEPROCESS CurrentProcess, + IN PMMPTE PrototypePte) +{ + PMMPFN Pfn1; + MMPTE TempPte; + PFN_NUMBER PageFrameIndex; + PMMPDE PointerPde; + + /* PFN lock must be held */ + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + + /* Capture the PTE */ + TempPte = *PointerPte; + + /* We only support valid PTEs for now */ + ASSERT(TempPte.u.Hard.Valid == 1); + if (TempPte.u.Hard.Valid == 0) + { + /* Invalid PTEs not supported yet */ + ASSERT(TempPte.u.Soft.Prototype == 0); + ASSERT(TempPte.u.Soft.Transition == 0); + } + + /* Get the PFN entry */ + PageFrameIndex = PFN_FROM_PTE(&TempPte); + Pfn1 = MiGetPfnEntry(PageFrameIndex); + + /* Check if this is a valid, prototype PTE */ + if (Pfn1->u3.e1.PrototypePte == 1) + { + /* Get the PDE and make sure it's faulted in */ + PointerPde = MiAddressToPde(PointerPte); + if (PointerPde->u.Hard.Valid == 0) + { +#if (_MI_PAGING_LEVELS == 2) + /* Could be paged pool access from a new process -- synchronize the page directories */ + if (!NT_SUCCESS(MiCheckPdeForPagedPool(VirtualAddress))) + { +#endif + /* The PDE must be valid at this point */ + KeBugCheckEx(MEMORY_MANAGEMENT, + 0x61940, + (ULONG_PTR)PointerPte, + PointerPte->u.Long, + (ULONG_PTR)VirtualAddress); + } +#if (_MI_PAGING_LEVELS == 2) + } +#endif + /* FIXME: Drop the reference on the page table. For now, leak it until RosMM is gone */ + //MiDecrementShareCount(MiGetPfnEntry(PFN_FROM_PTE(PointerPde)), PFN_FROM_PDE(PointerPde)); + + /* Drop the share count */ + MiDecrementShareCount(Pfn1, PageFrameIndex); + + /* No fork yet */ + if (PointerPte <= MiHighestUserPte) ASSERT(PrototypePte == Pfn1->PteAddress); + } + else + { + /* Make sure the saved PTE address is valid */ + if ((PMMPTE)((ULONG_PTR)Pfn1->PteAddress & ~0x1) != PointerPte) + { + /* The PFN entry is illegal, or invalid */ + KeBugCheckEx(MEMORY_MANAGEMENT, + 0x401, + (ULONG_PTR)PointerPte, + PointerPte->u.Long, + (ULONG_PTR)Pfn1->PteAddress); + } + + /* There should only be 1 shared reference count */ + ASSERT(Pfn1->u2.ShareCount == 1); + + /* FIXME: Drop the reference on the page table. For now, leak it until RosMM is gone */ + //MiDecrementShareCount(MiGetPfnEntry(Pfn1->u4.PteFrame), Pfn1->u4.PteFrame); + + /* Mark the PFN for deletion and dereference what should be the last ref */ + MI_SET_PFN_DELETED(Pfn1); + MiDecrementShareCount(Pfn1, PageFrameIndex); + + /* We should eventually do this */ + //CurrentProcess->NumberOfPrivatePages--; + } + + /* Destroy the PTE and flush the TLB */ + PointerPte->u.Long = 0; + KeFlushCurrentTb(); +} + +VOID +NTAPI +MiDeleteVirtualAddresses(IN ULONG_PTR Va, + IN ULONG_PTR EndingAddress, + IN PMMVAD Vad) +{ + PMMPTE PointerPte, PointerPde, PrototypePte, LastPrototypePte; + MMPTE TempPte; + PEPROCESS CurrentProcess; + KIRQL OldIrql; + BOOLEAN AddressGap = FALSE; + PSUBSECTION Subsection; + + /* Get out if this is a fake VAD, RosMm will free the marea pages */ + if ((Vad) && (Vad->u.VadFlags.Spare == 1)) return; + + /* Grab the process and PTE/PDE for the address being deleted */ + CurrentProcess = PsGetCurrentProcess(); + PointerPde = MiAddressToPde(Va); + PointerPte = MiAddressToPte(Va); + + /* Check if this is a section VAD or a VM VAD */ + if (!(Vad) || (Vad->u.VadFlags.PrivateMemory) || !(Vad->FirstPrototypePte)) + { + /* Don't worry about prototypes */ + PrototypePte = LastPrototypePte = NULL; + } + else + { + /* Get the prototype PTE */ + PrototypePte = Vad->FirstPrototypePte; + LastPrototypePte = Vad->FirstPrototypePte + 1; + } + + /* In all cases, we don't support fork() yet */ + ASSERT(CurrentProcess->CloneRoot == NULL); + + /* Loop the PTE for each VA */ + while (TRUE) + { + /* First keep going until we find a valid PDE */ + while (!PointerPde->u.Long) + { + /* There are gaps in the address space */ + AddressGap = TRUE; + + /* Still no valid PDE, try the next 4MB (or whatever) */ + PointerPde++; + + /* Update the PTE on this new boundary */ + PointerPte = MiPteToAddress(PointerPde); + + /* Check if all the PDEs are invalid, so there's nothing to free */ + Va = (ULONG_PTR)MiPteToAddress(PointerPte); + if (Va > EndingAddress) return; + } + + /* Now check if the PDE is mapped in */ + if (!PointerPde->u.Hard.Valid) + { + /* It isn't, so map it in */ + PointerPte = MiPteToAddress(PointerPde); + MiMakeSystemAddressValid(PointerPte, CurrentProcess); + } + + /* Now we should have a valid PDE, mapped in, and still have some VA */ + ASSERT(PointerPde->u.Hard.Valid == 1); + ASSERT(Va <= EndingAddress); + + /* Check if this is a section VAD with gaps in it */ + if ((AddressGap) && (LastPrototypePte)) + { + /* We need to skip to the next correct prototype PTE */ + PrototypePte = MI_GET_PROTOTYPE_PTE_FOR_VPN(Vad, Va >> PAGE_SHIFT); + + /* And we need the subsection to skip to the next last prototype PTE */ + Subsection = MiLocateSubsection(Vad, Va >> PAGE_SHIFT); + if (Subsection) + { + /* Found it! */ + LastPrototypePte = &Subsection->SubsectionBase[Subsection->PtesInSubsection]; + } + else + { + /* No more subsections, we are done with prototype PTEs */ + PrototypePte = NULL; + } + } + + /* Lock the PFN Database while we delete the PTEs */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + do + { + /* Capture the PDE and make sure it exists */ + TempPte = *PointerPte; + if (TempPte.u.Long) + { + /* Check if the PTE is actually mapped in */ + if (TempPte.u.Long & 0xFFFFFC01) + { + /* Are we dealing with section VAD? */ + if ((LastPrototypePte) && (PrototypePte > LastPrototypePte)) + { + /* We need to skip to the next correct prototype PTE */ + PrototypePte = MI_GET_PROTOTYPE_PTE_FOR_VPN(Vad, Va >> PAGE_SHIFT); + + /* And we need the subsection to skip to the next last prototype PTE */ + Subsection = MiLocateSubsection(Vad, Va >> PAGE_SHIFT); + if (Subsection) + { + /* Found it! */ + LastPrototypePte = &Subsection->SubsectionBase[Subsection->PtesInSubsection]; + } + else + { + /* No more subsections, we are done with prototype PTEs */ + PrototypePte = NULL; + } + } + + /* Check for prototype PTE */ + if ((TempPte.u.Hard.Valid == 0) && + (TempPte.u.Soft.Prototype == 1)) + { + /* Just nuke it */ + PointerPte->u.Long = 0; + } + else + { + /* Delete the PTE proper */ + MiDeletePte(PointerPte, + (PVOID)Va, + CurrentProcess, + PrototypePte); + } + } + else + { + /* The PTE was never mapped, just nuke it here */ + PointerPte->u.Long = 0; + } + } + + /* Update the address and PTE for it */ + Va += PAGE_SIZE; + PointerPte++; + PrototypePte++; + + /* Making sure the PDE is still valid */ + ASSERT(PointerPde->u.Hard.Valid == 1); + } + while ((Va & (PDE_MAPPED_VA - 1)) && (Va <= EndingAddress)); + + /* The PDE should still be valid at this point */ + ASSERT(PointerPde->u.Hard.Valid == 1); + + /* Release the lock and get out if we're done */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + if (Va > EndingAddress) return; + + /* Otherwise, we exited because we hit a new PDE boundary, so start over */ + PointerPde = MiAddressToPde(Va); + AddressGap = FALSE; + } +} + LONG MiGetExceptionInfo(IN PEXCEPTION_POINTERS ExceptionInfo, OUT PBOOLEAN HaveBadAddress, @@ -709,6 +1048,109 @@ MmFlushVirtualMemory(IN PEPROCESS Process, return STATUS_SUCCESS; } +ULONG +NTAPI +MiQueryAddressState(IN PVOID Va, + IN PMMVAD Vad, + IN PEPROCESS TargetProcess, + OUT PULONG ReturnedProtect, + OUT PVOID *NextVa) +{ + + PMMPTE PointerPte, PointerPde; + MMPTE TempPte; + BOOLEAN DemandZeroPte = TRUE, ValidPte = FALSE; + ULONG State = MEM_RESERVE, Protect = 0, LockChange; + ASSERT((Vad->StartingVpn <= ((ULONG_PTR)Va >> PAGE_SHIFT)) && + (Vad->EndingVpn >= ((ULONG_PTR)Va >> PAGE_SHIFT))); + + /* Only normal VADs supported */ + ASSERT(Vad->u.VadFlags.VadType == VadNone); + + /* Get the PDE and PTE for the address */ + PointerPde = MiAddressToPde(Va); + PointerPte = MiAddressToPte(Va); + + /* Return the next range */ + *NextVa = (PVOID)((ULONG_PTR)Va + PAGE_SIZE); + + /* Loop to make sure the PDE is valid */ + do + { + /* Try again */ + LockChange = 0; + + /* Is the PDE empty? */ + if (!PointerPde->u.Long) + { + /* No address in this range used yet, move to the next PDE range */ + *NextVa = MiPteToAddress(MiPteToAddress(PointerPde + 1)); + break; + } + + /* The PDE is empty, but is it faulted in? */ + if (!PointerPde->u.Hard.Valid) + { + /* It isn't, go ahead and do the fault */ + LockChange = MiMakeSystemAddressValid(MiPteToAddress(PointerPde), + TargetProcess); + } + + /* Check if the PDE was faulted in, making the PTE readable */ + if (!LockChange) ValidPte = TRUE; + } while (LockChange); + + /* Is it safe to try reading the PTE? */ + if (ValidPte) + { + /* FIXME: watch out for large pages */ + + /* Capture the PTE */ + TempPte = *PointerPte; + if (TempPte.u.Long) + { + /* The PTE is valid, so it's not zeroed out */ + DemandZeroPte = FALSE; + + /* Check if it's valid or has a valid protection mask */ + ASSERT(TempPte.u.Soft.Prototype == 0); + if ((TempPte.u.Soft.Protection != MM_DECOMMIT) || + (TempPte.u.Hard.Valid == 1)) + { + /* This means it's committed */ + State = MEM_COMMIT; + + /* For now, we lie about the protection */ + Protect = PAGE_EXECUTE_READWRITE; + } + else + { + /* Otherwise our defaults should hold */ + ASSERT(Protect == 0); + ASSERT(State == MEM_RESERVE); + } + } + } + + /* Check if this was a demand-zero PTE, since we need to find the state */ + if (DemandZeroPte) + { + /* Check if the VAD is for committed memory */ + if (Vad->u.VadFlags.MemCommit) + { + /* This is committed memory */ + State = MEM_COMMIT; + + /* Convert the protection */ + Protect = MmProtectToValue[Vad->u.VadFlags.Protection]; + } + } + + /* Return the protection code */ + *ReturnedProtect = Protect; + return State; +} + /* PUBLIC FUNCTIONS ***********************************************************/ /* @@ -1851,4 +2293,155 @@ NtResetWriteWatch(IN HANDLE ProcessHandle, return STATUS_SUCCESS; } +NTSTATUS +NTAPI +NtQueryVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN MEMORY_INFORMATION_CLASS MemoryInformationClass, + OUT PVOID MemoryInformation, + IN SIZE_T MemoryInformationLength, + OUT PSIZE_T ReturnLength) +{ + PEPROCESS TargetProcess; + NTSTATUS Status; + PMMVAD Vad = NULL; + PVOID Address, NextAddress; + BOOLEAN Found; + ULONG NewProtect, NewState, BaseVpn; + MEMORY_BASIC_INFORMATION MemoryInfo; + KAPC_STATE ApcState; + DPRINT("Querying class %d about address: %p\n", MemoryInformationClass, BaseAddress); + + /* Only this class is supported for now */ + ASSERT(MemoryInformationClass == MemoryBasicInformation); + + /* Validate the size information of the class */ + if (MemoryInformationLength < sizeof(MEMORY_BASIC_INFORMATION)) + { + /* The size is invalid */ + return STATUS_INFO_LENGTH_MISMATCH; + } + + /* Bail out if the address is invalid */ + if (BaseAddress > MM_HIGHEST_USER_ADDRESS) return STATUS_INVALID_PARAMETER; + + /* Check for illegal addresses in user-space, or the shared memory area */ + if ((BaseAddress > MM_HIGHEST_VAD_ADDRESS) || + (PAGE_ALIGN(BaseAddress) == (PVOID)USER_SHARED_DATA)) + { + /* FIXME: We should return some bogus info structure */ + UNIMPLEMENTED; + while (TRUE); + } + + /* Check if this is for a local or remote process */ + if (ProcessHandle == NtCurrentProcess()) + { + TargetProcess = PsGetCurrentProcess(); + } + else + { + /* Reference the target process */ + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_QUERY_INFORMATION, + PsProcessType, + ExGetPreviousMode(), + (PVOID*)&TargetProcess, + NULL); + if (!NT_SUCCESS(Status)) return Status; + + /* Attach to it now */ + KeStackAttachProcess(&TargetProcess->Pcb, &ApcState); + } + + /* Loop the VADs */ + ASSERT(TargetProcess->VadRoot.NumberGenericTableElements); + if (TargetProcess->VadRoot.NumberGenericTableElements) + { + /* Scan on the right */ + Vad = (PMMVAD)TargetProcess->VadRoot.BalancedRoot.RightChild; + BaseVpn = (ULONG_PTR)BaseAddress >> PAGE_SHIFT; + while (Vad) + { + /* Check if this VAD covers the allocation range */ + if ((BaseVpn >= Vad->StartingVpn) && + (BaseVpn <= Vad->EndingVpn)) + { + /* We're done */ + Found = TRUE; + break; + } + + /* Check if this VAD is too high */ + if (BaseVpn < Vad->StartingVpn) + { + /* Search on the left next */ + Vad = Vad->LeftChild; + } + else + { + /* Then this VAD is too low, keep searching on the right */ + ASSERT(BaseVpn > Vad->EndingVpn); + Vad = Vad->RightChild; + } + } + } + + /* Was a VAD found? */ + if (!Found) + { + /* We don't handle this yet */ + UNIMPLEMENTED; + while (TRUE); + } + + /* This must be a VM VAD */ + ASSERT(Vad->u.VadFlags.PrivateMemory); + + /* Build the initial information block */ + Address = PAGE_ALIGN(BaseAddress); + MemoryInfo.BaseAddress = Address; + MemoryInfo.AllocationBase = (PVOID)(Vad->StartingVpn << PAGE_SHIFT); + MemoryInfo.AllocationProtect = MmProtectToValue[Vad->u.VadFlags.Protection]; + MemoryInfo.Type = MEM_PRIVATE; + + /* Find the largest chunk of memory which has the same state and protection mask */ + MemoryInfo.State = MiQueryAddressState(Address, + Vad, + TargetProcess, + &MemoryInfo.Protect, + &NextAddress); + Address = NextAddress; + while (((ULONG_PTR)Address >> PAGE_SHIFT) <= Vad->EndingVpn) + { + /* Keep going unless the state or protection mask changed */ + NewState = MiQueryAddressState(Address, Vad, TargetProcess, &NewProtect, &NextAddress); + if ((NewState != MemoryInfo.State) || (NewProtect != MemoryInfo.Protect)) break; + Address = NextAddress; + } + + /* Now that we know the last VA address, calculate hte region size */ + MemoryInfo.RegionSize = ((ULONG_PTR)Address - (ULONG_PTR)MemoryInfo.BaseAddress); + + /* Check if we were attached */ + if (ProcessHandle != NtCurrentProcess()) + { + /* Detach and derefernece the process */ + KeUnstackDetachProcess(&ApcState); + ObDereferenceObject(TargetProcess); + } + + /* Return the data (FIXME: Use SEH) */ + *(PMEMORY_BASIC_INFORMATION)MemoryInformation = MemoryInfo; + if (ReturnLength) *ReturnLength = sizeof(MEMORY_BASIC_INFORMATION); + + /* All went well */ + DPRINT("Base: %p AllocBase: %p Protect: %lx AllocProtect: %lx " + "State: %lx Type: %lx Size: %lx\n", + MemoryInfo.BaseAddress, MemoryInfo.AllocationBase, + MemoryInfo.AllocationProtect, MemoryInfo.Protect, + MemoryInfo.State, MemoryInfo.Type, MemoryInfo.RegionSize); + return STATUS_SUCCESS; +} + /* EOF */ diff --git a/ntoskrnl/mm/ARM3/zeropage.c b/ntoskrnl/mm/ARM3/zeropage.c new file mode 100644 index 00000000000..4735cfbadf4 --- /dev/null +++ b/ntoskrnl/mm/ARM3/zeropage.c @@ -0,0 +1,101 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/zeropage.c + * PURPOSE: ARM Memory Manager Zero Page Thread Support + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARMツウ::ZEROPAGE" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +/* GLOBALS ********************************************************************/ + +BOOLEAN MmZeroingPageThreadActive; +KEVENT MmZeroingPageEvent; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +NTAPI +MmZeroPageThread(VOID) +{ + PKTHREAD Thread = KeGetCurrentThread(); + //PVOID StartAddress, EndAddress; + PVOID WaitObjects[2]; + NTSTATUS Status; + KIRQL OldIrql; + PVOID ZeroAddress; + PFN_NUMBER PageIndex, FreePage; + PMMPFN Pfn1; + + /* FIXME: Get the discardable sections to free them */ +// MiFindInitializationCode(&StartAddress, &EndAddress); +// if (StartAddress) MiFreeInitializationCode(StartAddress, EndAddress); + + /* Set our priority to 0 */ + Thread->BasePriority = 0; + KeSetPriorityThread(Thread, 0); + + /* Setup the wait objects */ + WaitObjects[0] = &MmZeroingPageEvent; +// WaitObjects[1] = &PoSystemIdleTimer; FIXME: Implement idle timer + + while (TRUE) + { + Status = KeWaitForMultipleObjects(1, // 2 + WaitObjects, + WaitAny, + WrFreePage, + KernelMode, + FALSE, + NULL, + NULL); + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + while (TRUE) + { + if (!MmFreePageListHead.Total) + { + MmZeroingPageThreadActive = FALSE; + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + break; + } + + PageIndex = MmFreePageListHead.Flink; + ASSERT(PageIndex != LIST_HEAD); + Pfn1 = MiGetPfnEntry(PageIndex); + FreePage = MiRemoveAnyPage(MI_GET_PAGE_COLOR(PageIndex)); + + /* The first global free page should also be the first on its own list */ + if (FreePage != PageIndex) + { + KeBugCheckEx(PFN_LIST_CORRUPT, + 0x8F, + FreePage, + PageIndex, + 0); + } + + Pfn1->u1.Flink = LIST_HEAD; + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + ZeroAddress = MiMapPagesToZeroInHyperSpace(Pfn1, 1); + ASSERT(ZeroAddress); + RtlZeroMemory(ZeroAddress, PAGE_SIZE); + MiUnmapPagesInZeroSpace(ZeroAddress, 1); + + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + MiInsertPageInList(&MmZeroedPageListHead, PageIndex); + } + } +} + +/* EOF */ diff --git a/ntoskrnl/mm/amd64/init.c b/ntoskrnl/mm/amd64/init.c index 29800619a97..a7aed95b36d 100644 --- a/ntoskrnl/mm/amd64/init.c +++ b/ntoskrnl/mm/amd64/init.c @@ -857,9 +857,9 @@ MmArmInitSystem_x(IN ULONG Phase, //MiBuildPagedPool(); // This is the old stuff: - MmPagedPoolBase = (PVOID)((PCHAR)MmPagedPoolEnd + 1); - MmPagedPoolSize = MM_PAGED_POOL_SIZE; - ASSERT((PCHAR)MmPagedPoolBase + MmPagedPoolSize < (PCHAR)MmNonPagedSystemStart); + //MmPagedPoolBase = (PVOID)((PCHAR)MmPagedPoolEnd + 1); + //MmPagedPoolSize = MM_PAGED_POOL_SIZE; + //ASSERT((PCHAR)MmPagedPoolBase + MmPagedPoolSize < (PCHAR)MmNonPagedSystemStart); HalInitializeBios(0, LoaderBlock); diff --git a/ntoskrnl/mm/anonmem.c b/ntoskrnl/mm/anonmem.c index 56453521d3a..5f44fc745fd 100644 --- a/ntoskrnl/mm/anonmem.c +++ b/ntoskrnl/mm/anonmem.c @@ -43,6 +43,9 @@ #define NDEBUG #include +#define MODULE_INVOLVED_IN_ARM3 +#include "ARM3/miarm.h" + /* FUNCTIONS *****************************************************************/ NTSTATUS @@ -513,34 +516,71 @@ MmModifyAttributes(PMMSUPPORT AddressSpace, } } +NTSTATUS NTAPI +MiProtectVirtualMemory(IN PEPROCESS Process, + IN OUT PVOID *BaseAddress, + IN OUT PSIZE_T NumberOfBytesToProtect, + IN ULONG NewAccessProtection, + OUT PULONG OldAccessProtection OPTIONAL) +{ + PMEMORY_AREA MemoryArea; + PMMSUPPORT AddressSpace; + ULONG OldAccessProtection_; + NTSTATUS Status; + + *NumberOfBytesToProtect = + PAGE_ROUND_UP((ULONG_PTR)(*BaseAddress) + (*NumberOfBytesToProtect)) - + PAGE_ROUND_DOWN(*BaseAddress); + *BaseAddress = (PVOID)PAGE_ROUND_DOWN(*BaseAddress); + + AddressSpace = &Process->Vm; + + MmLockAddressSpace(AddressSpace); + MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, *BaseAddress); + if (MemoryArea == NULL) + { + MmUnlockAddressSpace(AddressSpace); + return STATUS_UNSUCCESSFUL; + } + + if (OldAccessProtection == NULL) + OldAccessProtection = &OldAccessProtection_; + + if (MemoryArea->Type == MEMORY_AREA_VIRTUAL_MEMORY) + { + Status = MmProtectAnonMem(AddressSpace, MemoryArea, *BaseAddress, + *NumberOfBytesToProtect, NewAccessProtection, + OldAccessProtection); + } + else if (MemoryArea->Type == MEMORY_AREA_SECTION_VIEW) + { + Status = MmProtectSectionView(AddressSpace, MemoryArea, *BaseAddress, + *NumberOfBytesToProtect, + NewAccessProtection, + OldAccessProtection); + } + else + { + /* FIXME: Should we return failure or success in this case? */ + Status = STATUS_CONFLICTING_ADDRESSES; + } + + MmUnlockAddressSpace(AddressSpace); + + return Status; +} + /* * @implemented */ -NTSTATUS NTAPI -NtAllocateVirtualMemory(IN HANDLE ProcessHandle, +NTSTATUS +NTAPI +NtAllocateVirtualMemory(IN HANDLE ProcessHandle, IN OUT PVOID* UBaseAddress, - IN ULONG_PTR ZeroBits, + IN ULONG_PTR ZeroBits, IN OUT PSIZE_T URegionSize, - IN ULONG AllocationType, - IN ULONG Protect) -/* - * FUNCTION: Allocates a block of virtual memory in the process address space - * ARGUMENTS: - * ProcessHandle = The handle of the process which owns the virtual memory - * BaseAddress = A pointer to the virtual memory allocated. If you - * supply a non zero value the system will try to - * allocate the memory at the address supplied. It round - * it down to a multiple of the page size. - * ZeroBits = (OPTIONAL) You can specify the number of high order bits - * that must be zero, ensuring that the memory will be - * allocated at a address below a certain value. - * RegionSize = The number of bytes to allocate - * AllocationType = Indicates the type of virtual memory you like to - * allocated, can be a combination of MEM_COMMIT, - * MEM_RESERVE, MEM_RESET, MEM_TOP_DOWN. - * Protect = Indicates the protection type of the pages allocated. - * RETURNS: Status - */ + IN ULONG AllocationType, + IN ULONG Protect) { PEPROCESS Process; MEMORY_AREA* MemoryArea; @@ -552,132 +592,188 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, ULONG RegionSize; PVOID PBaseAddress; ULONG PRegionSize; - ULONG MemProtection; PHYSICAL_ADDRESS BoundaryAddressMultiple; - KPROCESSOR_MODE PreviousMode; + PEPROCESS CurrentProcess = PsGetCurrentProcess(); + KPROCESSOR_MODE PreviousMode = KeGetPreviousMode(); + KAPC_STATE ApcState; + ULONG ProtectionMask; + BOOLEAN Attached = FALSE; + BoundaryAddressMultiple.QuadPart = 0; + PAGED_CODE(); - PAGED_CODE(); + /* Check for valid Zero bits */ + if (ZeroBits > 21) + { + DPRINT1("Too many zero bits\n"); + return STATUS_INVALID_PARAMETER_3; + } - DPRINT("NtAllocateVirtualMemory(*UBaseAddress %x, " - "ZeroBits %d, *URegionSize %x, AllocationType %x, Protect %x)\n", - *UBaseAddress,ZeroBits,*URegionSize,AllocationType, - Protect); + /* Check for valid Allocation Types */ + if ((AllocationType & ~(MEM_COMMIT | MEM_RESERVE | MEM_RESET | MEM_PHYSICAL | + MEM_TOP_DOWN | MEM_WRITE_WATCH))) + { + DPRINT1("Invalid Allocation Type\n"); + return STATUS_INVALID_PARAMETER_5; + } - /* Check for valid protection flags */ - MemProtection = Protect & ~(PAGE_GUARD|PAGE_NOCACHE); - if (MemProtection != PAGE_NOACCESS && - MemProtection != PAGE_READONLY && - MemProtection != PAGE_READWRITE && - MemProtection != PAGE_WRITECOPY && - MemProtection != PAGE_EXECUTE && - MemProtection != PAGE_EXECUTE_READ && - MemProtection != PAGE_EXECUTE_READWRITE && - MemProtection != PAGE_EXECUTE_WRITECOPY) - { - DPRINT1("Invalid page protection\n"); - return STATUS_INVALID_PAGE_PROTECTION; - } + /* Check for at least one of these Allocation Types to be set */ + if (!(AllocationType & (MEM_COMMIT | MEM_RESERVE | MEM_RESET))) + { + DPRINT1("No memory allocation base type\n"); + return STATUS_INVALID_PARAMETER_5; + } - /* Check for valid Zero bits */ - if (ZeroBits > 21) - { - DPRINT1("Too many zero bits\n"); - return STATUS_INVALID_PARAMETER_3; - } + /* MEM_RESET is an exclusive flag, make sure that is valid too */ + if ((AllocationType & MEM_RESET) && (AllocationType != MEM_RESET)) + { + DPRINT1("Invalid use of MEM_RESET\n"); + return STATUS_INVALID_PARAMETER_5; + } - /* Check for valid Allocation Types */ - if ((AllocationType & ~(MEM_COMMIT | MEM_RESERVE | MEM_RESET | MEM_PHYSICAL | - MEM_TOP_DOWN | MEM_WRITE_WATCH))) - { - DPRINT1("Invalid Allocation Type\n"); - return STATUS_INVALID_PARAMETER_5; - } + /* Check if large pages are being used */ + if (AllocationType & MEM_LARGE_PAGES) + { + /* Large page allocations MUST be committed */ + if (!(AllocationType & MEM_COMMIT)) + { + DPRINT1("Must supply MEM_COMMIT with MEM_LARGE_PAGES\n"); + return STATUS_INVALID_PARAMETER_5; + } + + /* These flags are not allowed with large page allocations */ + if (AllocationType & (MEM_PHYSICAL | MEM_RESET | MEM_WRITE_WATCH)) + { + DPRINT1("Using illegal flags with MEM_LARGE_PAGES\n"); + return STATUS_INVALID_PARAMETER_5; + } + } - /* Check for at least one of these Allocation Types to be set */ - if (!(AllocationType & (MEM_COMMIT | MEM_RESERVE | MEM_RESET))) - { - DPRINT1("No memory allocation base type\n"); - return STATUS_INVALID_PARAMETER_5; - } + /* MEM_WRITE_WATCH can only be used if MEM_RESERVE is also used */ + if ((AllocationType & MEM_WRITE_WATCH) && !(AllocationType & MEM_RESERVE)) + { + DPRINT1("MEM_WRITE_WATCH used without MEM_RESERVE\n"); + return STATUS_INVALID_PARAMETER_5; + } - /* MEM_RESET is an exclusive flag, make sure that is valid too */ - if ((AllocationType & MEM_RESET) && (AllocationType != MEM_RESET)) - { - DPRINT1("Invalid use of MEM_RESET\n"); - return STATUS_INVALID_PARAMETER_5; - } + /* MEM_PHYSICAL can only be used if MEM_RESERVE is also used */ + if ((AllocationType & MEM_PHYSICAL) && !(AllocationType & MEM_RESERVE)) + { + DPRINT1("MEM_WRITE_WATCH used without MEM_RESERVE\n"); + return STATUS_INVALID_PARAMETER_5; + } - /* MEM_WRITE_WATCH can only be used if MEM_RESERVE is also used */ - if ((AllocationType & MEM_WRITE_WATCH) && !(AllocationType & MEM_RESERVE)) - { - DPRINT1("MEM_WRITE_WATCH used without MEM_RESERVE\n"); - return STATUS_INVALID_PARAMETER_5; - } + /* Check for valid MEM_PHYSICAL usage */ + if (AllocationType & MEM_PHYSICAL) + { + /* Only these flags are allowed with MEM_PHYSIAL */ + if (AllocationType & ~(MEM_RESERVE | MEM_TOP_DOWN | MEM_PHYSICAL)) + { + DPRINT1("Using illegal flags with MEM_PHYSICAL\n"); + return STATUS_INVALID_PARAMETER_5; + } - /* MEM_PHYSICAL can only be used with MEM_RESERVE, and can only be R/W */ - if (AllocationType & MEM_PHYSICAL) - { - /* First check for MEM_RESERVE exclusivity */ - if (AllocationType != (MEM_RESERVE | MEM_PHYSICAL)) - { - DPRINT1("MEM_PHYSICAL used with other flags then MEM_RESERVE or" - "MEM_RESERVE was not present at all\n"); - return STATUS_INVALID_PARAMETER_5; - } + /* Then make sure PAGE_READWRITE is used */ + if (Protect != PAGE_READWRITE) + { + DPRINT1("MEM_PHYSICAL used without PAGE_READWRITE\n"); + return STATUS_INVALID_PARAMETER_6; + } + } - /* Then make sure PAGE_READWRITE is used */ - if (Protect != PAGE_READWRITE) - { - DPRINT1("MEM_PHYSICAL used without PAGE_READWRITE\n"); - return STATUS_INVALID_PAGE_PROTECTION; - } - } + /* Calculate the protection mask and make sure it's valid */ + ProtectionMask = MiMakeProtectionMask(Protect); + if (ProtectionMask == MM_INVALID_PROTECTION) + { + DPRINT1("Invalid protection mask\n"); + return STATUS_INVALID_PAGE_PROTECTION; + } - PreviousMode = KeGetPreviousMode(); + /* Enter SEH */ + _SEH2_TRY + { + /* Check for user-mode parameters */ + if (PreviousMode != KernelMode) + { + /* Make sure they are writable */ + ProbeForWritePointer(UBaseAddress); + ProbeForWriteUlong(URegionSize); + } + + /* Capture their values */ + PBaseAddress = *UBaseAddress; + PRegionSize = *URegionSize; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Return the exception code */ + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; + + /* Make sure the allocation isn't past the VAD area */ + if (PBaseAddress >= MM_HIGHEST_VAD_ADDRESS) + { + DPRINT1("Virtual allocation base above User Space\n"); + return STATUS_INVALID_PARAMETER_2; + } + + /* Make sure the allocation wouldn't overflow past the VAD area */ + if ((((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS + 1) - (ULONG_PTR)PBaseAddress) < PRegionSize) + { + DPRINT1("Region size would overflow into kernel-memory\n"); + return STATUS_INVALID_PARAMETER_4; + } + + /* Make sure there's a size specified */ + if (!PRegionSize) + { + DPRINT1("Region size is invalid (zero)\n"); + return STATUS_INVALID_PARAMETER_4; + } - _SEH2_TRY - { - if (PreviousMode != KernelMode) - { - ProbeForWritePointer(UBaseAddress); - ProbeForWriteUlong(URegionSize); - } - PBaseAddress = *UBaseAddress; - PRegionSize = *URegionSize; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); - } - _SEH2_END; - - BoundaryAddressMultiple.QuadPart = 0; + /* Check if this is for the current process */ + if (ProcessHandle == NtCurrentProcess()) + { + /* We already have the current process, no need to go through Ob */ + Process = CurrentProcess; + } + else + { + /* Reference the handle for correct permissions */ + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_OPERATION, + PsProcessType, + PreviousMode, + (PVOID*)&Process, + NULL); + if (!NT_SUCCESS(Status)) return Status; + + /* Check if not running in the current process */ + if (CurrentProcess != Process) + { + /* Attach to it */ + KeStackAttachProcess(&Process->Pcb, &ApcState); + Attached = TRUE; + } + } + + /* Check for large page allocations */ + if (AllocationType & MEM_LARGE_PAGES) + { + /* The lock memory privilege is required */ + if (!SeSinglePrivilegeCheck(SeLockMemoryPrivilege, PreviousMode)) + { + /* Fail without it */ + DPRINT1("Privilege not held for MEM_LARGE_PAGES\n"); + if (ProcessHandle != NtCurrentProcess()) ObDereferenceObject(Process); + return STATUS_PRIVILEGE_NOT_HELD; + } + } BaseAddress = (PVOID)PAGE_ROUND_DOWN(PBaseAddress); RegionSize = PAGE_ROUND_UP((ULONG_PTR)PBaseAddress + PRegionSize) - PAGE_ROUND_DOWN(PBaseAddress); - /* - * We've captured and calculated the data, now do more checks - * Yes, MmCreateMemoryArea does similar checks, but they don't return - * the right status codes that a caller of this routine would expect. - */ - if ((ULONG_PTR)BaseAddress >= USER_SHARED_DATA) - { - DPRINT1("Virtual allocation base above User Space\n"); - return STATUS_INVALID_PARAMETER_2; - } - if (!RegionSize) - { - DPRINT1("Region size is invalid (zero)\n"); - return STATUS_INVALID_PARAMETER_4; - } - if ((USER_SHARED_DATA - (ULONG_PTR)BaseAddress) < RegionSize) - { - DPRINT1("Region size would overflow into kernel-memory\n"); - return STATUS_INVALID_PARAMETER_4; - } /* * Copy on Write is reserved for system use. This case is a certain failure @@ -690,19 +786,6 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, return STATUS_INVALID_PAGE_PROTECTION; } - - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_OPERATION, - PsProcessType, - PreviousMode, - (PVOID*)(&Process), - NULL); - if (!NT_SUCCESS(Status)) - { - DPRINT("NtAllocateVirtualMemory() = %x\n",Status); - return(Status); - } - Type = (AllocationType & MEM_COMMIT) ? MEM_COMMIT : MEM_RESERVE; DPRINT("Type %x\n", Type); @@ -724,8 +807,8 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, (ULONG_PTR)BaseAddress + RegionSize, MemoryArea->EndingAddress); MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); - + if (Attached) KeUnstackDetachProcess(&ApcState); + if (ProcessHandle != NtCurrentProcess()) ObDereferenceObject(Process); return STATUS_MEMORY_NOT_ALLOCATED; } @@ -741,7 +824,8 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, } MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); + if (Attached) KeUnstackDetachProcess(&ApcState); + if (ProcessHandle != NtCurrentProcess()) ObDereferenceObject(Process); /* MEM_RESET does not modify any attributes of region */ return STATUS_SUCCESS; @@ -757,7 +841,8 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, BaseAddress, RegionSize, Type, Protect, MmModifyAttributes); MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); + if (Attached) KeUnstackDetachProcess(&ApcState); + if (ProcessHandle != NtCurrentProcess()) ObDereferenceObject(Process); DPRINT("NtAllocateVirtualMemory() = %x\n",Status); /* Give the caller rounded BaseAddress and area length */ @@ -788,7 +873,8 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, } MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); + if (Attached) KeUnstackDetachProcess(&ApcState); + if (ProcessHandle != NtCurrentProcess()) ObDereferenceObject(Process); DPRINT("NtAllocateVirtualMemory() = %x\n",Status); /* Give the caller rounded BaseAddress and area length */ @@ -804,7 +890,8 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, else { MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); + if (Attached) KeUnstackDetachProcess(&ApcState); + if (ProcessHandle != NtCurrentProcess()) ObDereferenceObject(Process); return(STATUS_UNSUCCESSFUL); } } @@ -822,7 +909,8 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, if (!NT_SUCCESS(Status)) { MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); + if (Attached) KeUnstackDetachProcess(&ApcState); + if (ProcessHandle != NtCurrentProcess()) ObDereferenceObject(Process); DPRINT("NtAllocateVirtualMemory() = %x\n",Status); return(Status); } @@ -840,12 +928,14 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, MmReserveSwapPages(nPages); } + MmUnlockAddressSpace(AddressSpace); + if (Attached) KeUnstackDetachProcess(&ApcState); + if (ProcessHandle != NtCurrentProcess()) ObDereferenceObject(Process); + *UBaseAddress = BaseAddress; *URegionSize = MemoryAreaLength; DPRINT("*UBaseAddress %x *URegionSize %x\n", BaseAddress, RegionSize); - MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); return(STATUS_SUCCESS); } @@ -949,8 +1039,8 @@ MmFreeVirtualMemory(PEPROCESS Process, */ NTSTATUS NTAPI NtFreeVirtualMemory(IN HANDLE ProcessHandle, - IN PVOID* PBaseAddress, - IN PSIZE_T PRegionSize, + IN PVOID* UBaseAddress, + IN PSIZE_T URegionSize, IN ULONG FreeType) /* * FUNCTION: Frees a range of virtual memory @@ -969,52 +1059,95 @@ NtFreeVirtualMemory(IN HANDLE ProcessHandle, NTSTATUS Status; PEPROCESS Process; PMMSUPPORT AddressSpace; - PVOID BaseAddress; - ULONG RegionSize; - - PAGED_CODE(); - - DPRINT("NtFreeVirtualMemory(ProcessHandle %x, *PBaseAddress %x, " - "*PRegionSize %x, FreeType %x)\n",ProcessHandle,*PBaseAddress, - *PRegionSize,FreeType); + PVOID BaseAddress, PBaseAddress; + ULONG RegionSize, PRegionSize; + PEPROCESS CurrentProcess = PsGetCurrentProcess(); + KPROCESSOR_MODE PreviousMode = KeGetPreviousMode(); + KAPC_STATE ApcState; + BOOLEAN Attached = FALSE; + PAGED_CODE(); + /* Only two flags are supported */ if (!(FreeType & (MEM_RELEASE | MEM_DECOMMIT))) { DPRINT1("Invalid FreeType\n"); return STATUS_INVALID_PARAMETER_4; } - - if (ExGetPreviousMode() != KernelMode) + + /* Check if no flag was used, or if both flags were used */ + if (!((FreeType & (MEM_DECOMMIT | MEM_RELEASE))) || + ((FreeType & (MEM_DECOMMIT | MEM_RELEASE)) == (MEM_DECOMMIT | MEM_RELEASE))) { - _SEH2_TRY - { - /* Probe user pointers */ - ProbeForWriteSize_t(PRegionSize); - ProbeForWritePointer(PBaseAddress); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); - } - _SEH2_END; + DPRINT1("Invalid FreeType combination\n"); + return STATUS_INVALID_PARAMETER_4; } - - BaseAddress = (PVOID)PAGE_ROUND_DOWN((*PBaseAddress)); - RegionSize = PAGE_ROUND_UP((ULONG_PTR)(*PBaseAddress) + (*PRegionSize)) - - PAGE_ROUND_DOWN((*PBaseAddress)); - - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_OPERATION, - PsProcessType, - UserMode, - (PVOID*)(&Process), - NULL); - if (!NT_SUCCESS(Status)) + + /* Enter SEH */ + _SEH2_TRY + { + /* Check for user-mode parameters */ + if (PreviousMode != KernelMode) + { + /* Make sure they are writable */ + ProbeForWritePointer(UBaseAddress); + ProbeForWriteUlong(URegionSize); + } + + /* Capture their values */ + PBaseAddress = *UBaseAddress; + PRegionSize = *URegionSize; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Return the exception code */ + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; + + /* Make sure the allocation isn't past the user area */ + if (PBaseAddress >= MM_HIGHEST_USER_ADDRESS) + { + DPRINT1("Virtual free base above User Space\n"); + return STATUS_INVALID_PARAMETER_2; + } + + /* Make sure the allocation wouldn't overflow past the user area */ + if (((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (ULONG_PTR)PBaseAddress) < PRegionSize) { - return(Status); + DPRINT1("Region size would overflow into kernel-memory\n"); + return STATUS_INVALID_PARAMETER_3; } + /* Check if this is for the current process */ + if (ProcessHandle == NtCurrentProcess()) + { + /* We already have the current process, no need to go through Ob */ + Process = CurrentProcess; + } + else + { + /* Reference the handle for correct permissions */ + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_OPERATION, + PsProcessType, + PreviousMode, + (PVOID*)&Process, + NULL); + if (!NT_SUCCESS(Status)) return Status; + + /* Check if not running in the current process */ + if (CurrentProcess != Process) + { + /* Attach to it */ + KeStackAttachProcess(&Process->Pcb, &ApcState); + Attached = TRUE; + } + } + + BaseAddress = (PVOID)PAGE_ROUND_DOWN((PBaseAddress)); + RegionSize = PAGE_ROUND_UP((ULONG_PTR)(PBaseAddress) + (PRegionSize)) - + PAGE_ROUND_DOWN((PBaseAddress)); + AddressSpace = &Process->Vm; MmLockAddressSpace(AddressSpace); @@ -1060,7 +1193,8 @@ NtFreeVirtualMemory(IN HANDLE ProcessHandle, unlock_deref_and_return: MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); + if (Attached) KeUnstackDetachProcess(&ApcState); + if (ProcessHandle != NtCurrentProcess()) ObDereferenceObject(Process); return(Status); } diff --git a/ntoskrnl/mm/arm/stubs.c b/ntoskrnl/mm/arm/stubs.c index 0388f2bb586..55178c747aa 100644 --- a/ntoskrnl/mm/arm/stubs.c +++ b/ntoskrnl/mm/arm/stubs.c @@ -870,7 +870,7 @@ MiInitPageDirectoryMap(VOID) BoundaryAddressMultiple.QuadPart = 0; BaseAddress = (PVOID)PTE_BASE; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, + MEMORY_AREA_OWNED_BY_ARM3, &BaseAddress, 0x1000000, PAGE_READWRITE, @@ -885,7 +885,7 @@ MiInitPageDirectoryMap(VOID) // BaseAddress = (PVOID)PDE_BASE; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, + MEMORY_AREA_OWNED_BY_ARM3, &BaseAddress, 0x100000, PAGE_READWRITE, @@ -900,7 +900,7 @@ MiInitPageDirectoryMap(VOID) // BaseAddress = (PVOID)HYPER_SPACE; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_SYSTEM, + MEMORY_AREA_OWNED_BY_ARM3, &BaseAddress, PAGE_SIZE, PAGE_READWRITE, diff --git a/ntoskrnl/mm/balance.c b/ntoskrnl/mm/balance.c index 555c7a666db..17edb8e97c3 100644 --- a/ntoskrnl/mm/balance.c +++ b/ntoskrnl/mm/balance.c @@ -47,14 +47,6 @@ static LONG MiBalancerWork = 0; /* FUNCTIONS ****************************************************************/ -VOID MmPrintMemoryStatistic(VOID) -{ - DbgPrint("MC_CACHE %d, MC_USER %d, MC_PPOOL %d, MC_NPPOOL %d, MmAvailablePages %d\n", - MiMemoryConsumers[MC_CACHE].PagesUsed, MiMemoryConsumers[MC_USER].PagesUsed, - MiMemoryConsumers[MC_PPOOL].PagesUsed, MiMemoryConsumers[MC_NPPOOL].PagesUsed, - MmAvailablePages); -} - VOID INIT_FUNCTION NTAPI @@ -80,13 +72,7 @@ MmInitializeBalancer(ULONG NrAvailablePages, ULONG NrSystemPages) { MiMemoryConsumers[MC_CACHE].PagesTarget = NrAvailablePages / 8; } - MiMemoryConsumers[MC_USER].PagesTarget = - NrAvailablePages - MiMinimumAvailablePages; - MiMemoryConsumers[MC_PPOOL].PagesTarget = NrAvailablePages / 2; - MiMemoryConsumers[MC_NPPOOL].PagesTarget = 0xFFFFFFFF; - MiMemoryConsumers[MC_NPPOOL].PagesUsed = NrSystemPages; - MiMemoryConsumers[MC_SYSTEM].PagesTarget = 0xFFFFFFFF; - MiMemoryConsumers[MC_SYSTEM].PagesUsed = 0; + MiMemoryConsumers[MC_USER].PagesTarget = NrAvailablePages - MiMinimumAvailablePages; } VOID @@ -99,6 +85,12 @@ MmInitializeMemoryConsumer(ULONG Consumer, MiMemoryConsumers[Consumer].Trim = Trim; } +VOID +NTAPI +MiZeroPhysicalPage( + IN PFN_NUMBER PageFrameIndex +); + NTSTATUS NTAPI MmReleasePageMemoryConsumer(ULONG Consumer, PFN_NUMBER Page) @@ -131,7 +123,7 @@ MmReleasePageMemoryConsumer(ULONG Consumer, PFN_NUMBER Page) Request = CONTAINING_RECORD(Entry, MM_ALLOCATION_REQUEST, ListEntry); KeReleaseSpinLock(&AllocationListLock, OldIrql); if(Consumer == MC_USER) MmRemoveLRUUserPage(Page); - MiZeroPage(Page); + MiZeroPhysicalPage(Page); Request->Page = Page; KeSetEvent(&Request->Event, IO_NO_INCREMENT, FALSE); } @@ -228,8 +220,6 @@ MiIsBalancerThread(VOID) PsGetCurrentThread() == MiBalancerThreadId.UniqueThread; } -VOID NTAPI MiSetConsumer(IN PFN_NUMBER Pfn, IN ULONG Consumer); - NTSTATUS NTAPI MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, @@ -257,7 +247,7 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, /* * Allocate always memory for the non paged pool and for the pager thread. */ - if ((Consumer == MC_NPPOOL) || (Consumer == MC_SYSTEM) || MiIsBalancerThread()) + if ((Consumer == MC_SYSTEM) || MiIsBalancerThread()) { OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MmAllocPage(Consumer); @@ -315,7 +305,6 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, KeBugCheck(NO_PAGES_AVAILABLE); } /* Update the Consumer and make the page active */ - MiSetConsumer(Page, Consumer); if(Consumer == MC_USER) MmInsertLRULastUserPage(Page); *AllocatedPage = Page; (void)InterlockedDecrementUL(&MiPagesRequired); diff --git a/ntoskrnl/mm/freelist.c b/ntoskrnl/mm/freelist.c index 3124c625962..e7bf276600a 100644 --- a/ntoskrnl/mm/freelist.c +++ b/ntoskrnl/mm/freelist.c @@ -23,13 +23,7 @@ /* GLOBALS ****************************************************************/ -// -// // ReactOS to NT Physical Page Descriptor Entry Legacy Mapping Definitions -// -// REACTOS NT -// -#define RmapListHead AweReferenceCount #define PHYSICAL_PAGE MMPFN #define PPHYSICAL_PAGE PMMPFN @@ -48,8 +42,6 @@ SIZE_T MmPagedPoolCommit; SIZE_T MmPeakCommitment; SIZE_T MmtotalCommitLimitMaximum; -KEVENT ZeroPageThreadEvent; -static BOOLEAN ZeroPageThreadShouldTerminate = FALSE; static RTL_BITMAP MiUserPfnBitMap; /* FUNCTIONS *************************************************************/ @@ -161,7 +153,7 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, KIRQL OldIrql; PPHYSICAL_PAGE Pfn1; INT LookForZeroedPages; - ASSERT (KeGetCurrentIrql() <= APC_LEVEL); + ASSERT(KeGetCurrentIrql() <= APC_LEVEL); // // Convert the low address into a PFN @@ -229,32 +221,18 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // while (PagesFound < PageCount) { - // - // Do we have zeroed pages? - // - if (MmZeroedPageListHead.Total) + /* Grab a page */ + Page = MiRemoveAnyPage(0); + if (Page == 0) { - // - // Grab a zero page - // - Pfn1 = MiRemoveHeadList(&MmZeroedPageListHead); - } - else if (MmFreePageListHead.Total) - { - // - // Nope, grab an unzeroed page - // - Pfn1 = MiRemoveHeadList(&MmFreePageListHead); - } - else - { - // - // This is not good... hopefully we have at least SOME pages - // + /* This is not good... hopefully we have at least SOME pages */ ASSERT(PagesFound); break; } + /* Grab the page entry for it */ + Pfn1 = MiGetPfnEntry(Page); + // // Make sure it's really free // @@ -267,11 +245,6 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, Pfn1->u3.e1.EndOfAllocation = 1; Pfn1->u3.e2.ReferenceCount = 1; - // - // Decrease available pages - // - MmAvailablePages--; - // // Save it into the MDL // @@ -303,6 +276,10 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, if (MiIsPfnInUse(Pfn1)) continue; if ((Pfn1->u3.e1.PageLocation == ZeroedPageList) != LookForZeroedPages) continue; + /* Remove the page from the free or zero list */ + ASSERT(Pfn1->u3.e1.ReadInProgress == 0); + MiUnlinkFreeOrZeroedPage(Pfn1); + // // Sanity checks // @@ -312,14 +289,13 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // Now setup the page and mark it // Pfn1->u3.e2.ReferenceCount = 1; + Pfn1->u2.ShareCount = 1; + MI_SET_PFN_DELETED(Pfn1); + Pfn1->u4.PteFrame = 0x1FFEDCB; Pfn1->u3.e1.StartOfAllocation = 1; Pfn1->u3.e1.EndOfAllocation = 1; - - // - // Decrease available pages - // - MmAvailablePages--; - + Pfn1->u4.VerifierAllocation = 0; + // // Save this page into the MDL // @@ -361,7 +337,7 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // // Terminate the MDL array if there's certain missing pages // - if (PagesFound != PageCount) *MdlPage = -1; + if (PagesFound != PageCount) *MdlPage = LIST_HEAD; // // Now go back and loop over all the MDL pages @@ -374,14 +350,14 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // Check if we've reached the end // Page = *MdlPage++; - if (Page == (PFN_NUMBER)-1) break; + if (Page == LIST_HEAD) break; // // Get the PFN entry for the page and check if we should zero it out // Pfn1 = MiGetPfnEntry(Page); ASSERT(Pfn1); - if (Pfn1->u3.e1.PageLocation != ZeroedPageList) MiZeroPage(Page); + if (Pfn1->u3.e1.PageLocation != ZeroedPageList) MiZeroPhysicalPage(Page); Pfn1->u3.e1.PageLocation = ActiveAndValid; } @@ -397,81 +373,69 @@ VOID NTAPI MmDumpPfnDatabase(VOID) { - ULONG i; - PPHYSICAL_PAGE Pfn1; - PCHAR State = "????", Type = "Unknown"; - KIRQL OldIrql; - ULONG Totals[5] = {0}, FreePages = 0; - - KeRaiseIrql(HIGH_LEVEL, &OldIrql); - - // - // Loop the PFN database - // - for (i = 0; i <= MmHighestPhysicalPage; i++) - { - Pfn1 = MiGetPfnEntry(i); - if (!Pfn1) continue; - - // - // Get the type - // - if (MiIsPfnInUse(Pfn1)) - { - State = "Used"; - } - else - { - State = "Free"; - Type = "Free"; - FreePages++; - break; - } - - // - // Pretty-print the page - // - DbgPrint("0x%08p:\t%04s\t%20s\t(%02d) [%08p])\n", - i << PAGE_SHIFT, - State, - Type, - Pfn1->u3.e2.ReferenceCount, - Pfn1->RmapListHead); - } - - DbgPrint("Nonpaged Pool: %d pages\t[%d KB]\n", Totals[MC_NPPOOL], (Totals[MC_NPPOOL] << PAGE_SHIFT) / 1024); - DbgPrint("Paged Pool: %d pages\t[%d KB]\n", Totals[MC_PPOOL], (Totals[MC_PPOOL] << PAGE_SHIFT) / 1024); - DbgPrint("File System Cache: %d pages\t[%d KB]\n", Totals[MC_CACHE], (Totals[MC_CACHE] << PAGE_SHIFT) / 1024); - DbgPrint("Process Working Set: %d pages\t[%d KB]\n", Totals[MC_USER], (Totals[MC_USER] << PAGE_SHIFT) / 1024); - DbgPrint("System: %d pages\t[%d KB]\n", Totals[MC_SYSTEM], (Totals[MC_SYSTEM] << PAGE_SHIFT) / 1024); - DbgPrint("Free: %d pages\t[%d KB]\n", FreePages, (FreePages << PAGE_SHIFT) / 1024); - - KeLowerIrql(OldIrql); + /* Pretty useless for now, to be improved later */ + return; } VOID NTAPI -MmSetRmapListHeadPage(PFN_NUMBER Pfn, struct _MM_RMAP_ENTRY* ListHead) +MmSetRmapListHeadPage(PFN_NUMBER Pfn, PMM_RMAP_ENTRY ListHead) { - KIRQL oldIrql; + KIRQL oldIrql; + PMMPFN Pfn1; - oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MiGetPfnEntry(Pfn)->RmapListHead = (LONG)ListHead; - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); + oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + Pfn1 = MiGetPfnEntry(Pfn); + ASSERT(Pfn1); + ASSERT_IS_ROS_PFN(Pfn1); + + if (ListHead) + { + /* Should not be trying to insert an RMAP for a non-active page */ + ASSERT(MiIsPfnInUse(Pfn1) == TRUE); + + /* Set the list head address */ + MI_GET_ROS_DATA(Pfn1)->RmapListHead = ListHead; + } + else + { + /* ReactOS semantics dictate the page is STILL active right now */ + ASSERT(MiIsPfnInUse(Pfn1) == TRUE); + + /* In this case, the RMAP is actually being removed, so clear field */ + MI_GET_ROS_DATA(Pfn1)->RmapListHead = NULL; + + /* ReactOS semantics will now release the page, which will make it free and enter a colored list */ + } + + KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); } -struct _MM_RMAP_ENTRY* +PMM_RMAP_ENTRY NTAPI MmGetRmapListHeadPage(PFN_NUMBER Pfn) { - KIRQL oldIrql; - struct _MM_RMAP_ENTRY* ListHead; + KIRQL oldIrql; + PMM_RMAP_ENTRY ListHead; + PMMPFN Pfn1; + + /* Lock PFN database */ + oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Get the entry */ + Pfn1 = MiGetPfnEntry(Pfn); + ASSERT(Pfn1); + ASSERT_IS_ROS_PFN(Pfn1); - oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - ListHead = (struct _MM_RMAP_ENTRY*)MiGetPfnEntry(Pfn)->RmapListHead; - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - - return(ListHead); + /* Get the list head */ + ListHead = MI_GET_ROS_DATA(Pfn1)->RmapListHead; + + /* Should not have an RMAP for a non-active page */ + ASSERT(MiIsPfnInUse(Pfn1) == TRUE); + + /* Release PFN database and return rmap list head */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); + return ListHead; } VOID @@ -479,9 +443,14 @@ NTAPI MmSetSavedSwapEntryPage(PFN_NUMBER Pfn, SWAPENTRY SwapEntry) { KIRQL oldIrql; - + PPHYSICAL_PAGE Page; + + Page = MiGetPfnEntry(Pfn); + ASSERT(Page); + ASSERT_IS_ROS_PFN(Page); + oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MiGetPfnEntry(Pfn)->u1.WsIndex = SwapEntry; + MI_GET_ROS_DATA(Page)->SwapEntry = SwapEntry; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); } @@ -491,9 +460,14 @@ MmGetSavedSwapEntryPage(PFN_NUMBER Pfn) { SWAPENTRY SwapEntry; KIRQL oldIrql; + PPHYSICAL_PAGE Page; + + Page = MiGetPfnEntry(Pfn); + ASSERT(Page); + ASSERT_IS_ROS_PFN(Page); oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - SwapEntry = MiGetPfnEntry(Pfn)->u1.WsIndex; + SwapEntry = MI_GET_ROS_DATA(Page)->SwapEntry; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); return(SwapEntry); @@ -514,7 +488,8 @@ MmReferencePage(PFN_NUMBER Pfn) Page = MiGetPfnEntry(Pfn); ASSERT(Page); - + ASSERT_IS_ROS_PFN(Page); + Page->u3.e2.ReferenceCount++; } @@ -531,6 +506,7 @@ MmGetReferenceCountPage(PFN_NUMBER Pfn) oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); ASSERT(Page); + ASSERT_IS_ROS_PFN(Page); RCount = Page->u3.e2.ReferenceCount; @@ -545,35 +521,31 @@ MmIsPageInUse(PFN_NUMBER Pfn) return MiIsPfnInUse(MiGetPfnEntry(Pfn)); } -VOID -NTAPI -MiSetConsumer(IN PFN_NUMBER Pfn, - IN ULONG Type) -{ - MiGetPfnEntry(Pfn)->u3.e1.PageLocation = ActiveAndValid; -} - VOID NTAPI MmDereferencePage(PFN_NUMBER Pfn) { PPHYSICAL_PAGE Page; - DPRINT("MmDereferencePage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT); Page = MiGetPfnEntry(Pfn); ASSERT(Page); - + ASSERT_IS_ROS_PFN(Page); + Page->u3.e2.ReferenceCount--; if (Page->u3.e2.ReferenceCount == 0) { - MmAvailablePages++; - Page->u3.e1.PageLocation = FreePageList; - MiInsertInListTail(&MmFreePageListHead, Page); - if (MmFreePageListHead.Total > 8 && 0 == KeReadStateEvent(&ZeroPageThreadEvent)) - { - KeSetEvent(&ZeroPageThreadEvent, IO_NO_INCREMENT, FALSE); - } + /* Mark the page temporarily as valid, we're going to make it free soon */ + Page->u3.e1.PageLocation = ActiveAndValid; + + /* It's not a ROS PFN anymore */ + Page->u4.AweAllocation = FALSE; + ExFreePool(MI_GET_ROS_DATA(Page)); + Page->RosMmData = 0; + + /* Bring it back into the free list */ + DPRINT("Legacy free: %lx\n", Pfn); + MiInsertPageInFreeList(Pfn); } } @@ -582,125 +554,32 @@ NTAPI MmAllocPage(ULONG Type) { PFN_NUMBER PfnOffset; - PPHYSICAL_PAGE PageDescriptor; - BOOLEAN NeedClear = FALSE; + PMMPFN Pfn1; + + PfnOffset = MiRemoveZeroPage(MI_GET_NEXT_COLOR()); - DPRINT("MmAllocPage()\n"); - - if (MmZeroedPageListHead.Total == 0) + if (!PfnOffset) { - if (MmFreePageListHead.Total == 0) - { - /* Check if this allocation is for the PFN DB itself */ - if (MmNumberOfPhysicalPages == 0) - { - ASSERT(FALSE); - } - - DPRINT1("MmAllocPage(): Out of memory\n"); - return 0; - } - PageDescriptor = MiRemoveHeadList(&MmFreePageListHead); - - NeedClear = TRUE; - } - else - { - PageDescriptor = MiRemoveHeadList(&MmZeroedPageListHead); + DPRINT1("MmAllocPage(): Out of memory\n"); + return 0; } - PageDescriptor->u3.e2.ReferenceCount = 1; - - MmAvailablePages--; - - PfnOffset = MiGetPfnEntryIndex(PageDescriptor); - if ((NeedClear) && (Type != MC_SYSTEM)) - { - MiZeroPage(PfnOffset); - } - - PageDescriptor->u3.e1.PageLocation = ActiveAndValid; + DPRINT("Legacy allocate: %lx\n", PfnOffset); + Pfn1 = MiGetPfnEntry(PfnOffset); + Pfn1->u3.e2.ReferenceCount = 1; + Pfn1->u3.e1.PageLocation = ActiveAndValid; + + /* This marks the PFN as a ReactOS PFN */ + Pfn1->u4.AweAllocation = TRUE; + + /* Allocate the extra ReactOS Data and zero it out */ + Pfn1->RosMmData = (LONG)ExAllocatePoolWithTag(NonPagedPool, sizeof(MMROSPFN), 'RsPf'); + ASSERT(MI_GET_ROS_DATA(Pfn1) != NULL); + ASSERT_IS_ROS_PFN(Pfn1); + MI_GET_ROS_DATA(Pfn1)->SwapEntry = 0; + MI_GET_ROS_DATA(Pfn1)->RmapListHead = NULL; + return PfnOffset; } -NTSTATUS -NTAPI -MiZeroPage(PFN_NUMBER Page) -{ - KIRQL Irql; - PVOID TempAddress; - - Irql = KeRaiseIrqlToDpcLevel(); - TempAddress = MiMapPageToZeroInHyperSpace(Page); - if (TempAddress == NULL) - { - return(STATUS_NO_MEMORY); - } - memset(TempAddress, 0, PAGE_SIZE); - MiUnmapPagesInZeroSpace(TempAddress, 1); - KeLowerIrql(Irql); - return(STATUS_SUCCESS); -} - -NTSTATUS -NTAPI -MmZeroPageThreadMain(PVOID Ignored) -{ - NTSTATUS Status; - KIRQL oldIrql; - PPHYSICAL_PAGE PageDescriptor; - PFN_NUMBER Pfn; - ULONG Count; - - /* Free initial kernel memory */ - //MiFreeInitMemory(); - - /* Set our priority to 0 */ - KeGetCurrentThread()->BasePriority = 0; - KeSetPriorityThread(KeGetCurrentThread(), 0); - - while(1) - { - Status = KeWaitForSingleObject(&ZeroPageThreadEvent, - 0, - KernelMode, - FALSE, - NULL); - - if (ZeroPageThreadShouldTerminate) - { - DPRINT1("ZeroPageThread: Terminating\n"); - return STATUS_SUCCESS; - } - Count = 0; - oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - while (MmFreePageListHead.Total) - { - PageDescriptor = MiRemoveHeadList(&MmFreePageListHead); - /* We set the page to used, because MmCreateVirtualMapping failed with unused pages */ - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - Pfn = MiGetPfnEntryIndex(PageDescriptor); - Status = MiZeroPage(Pfn); - - oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - if (NT_SUCCESS(Status)) - { - MiInsertZeroListAtBack(Pfn); - Count++; - } - else - { - MiInsertInListTail(&MmFreePageListHead, PageDescriptor); - PageDescriptor->u3.e1.PageLocation = FreePageList; - } - - } - DPRINT("Zeroed %d pages.\n", Count); - KeResetEvent(&ZeroPageThreadEvent); - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - } - - return STATUS_SUCCESS; -} - /* EOF */ diff --git a/ntoskrnl/mm/i386/page.c b/ntoskrnl/mm/i386/page.c index a93860a0342..e096fcf3f56 100644 --- a/ntoskrnl/mm/i386/page.c +++ b/ntoskrnl/mm/i386/page.c @@ -109,6 +109,43 @@ MmProtectToPteMask[32] = PTE_EXECUTE_WRITECOPY | PTE_WRITECOMBINED_CACHE, }; +const +ULONG MmProtectToValue[32] = +{ + PAGE_NOACCESS, + PAGE_READONLY, + PAGE_EXECUTE, + PAGE_EXECUTE_READ, + PAGE_READWRITE, + PAGE_WRITECOPY, + PAGE_EXECUTE_READWRITE, + PAGE_EXECUTE_WRITECOPY, + PAGE_NOACCESS, + PAGE_NOCACHE | PAGE_READONLY, + PAGE_NOCACHE | PAGE_EXECUTE, + PAGE_NOCACHE | PAGE_EXECUTE_READ, + PAGE_NOCACHE | PAGE_READWRITE, + PAGE_NOCACHE | PAGE_WRITECOPY, + PAGE_NOCACHE | PAGE_EXECUTE_READWRITE, + PAGE_NOCACHE | PAGE_EXECUTE_WRITECOPY, + PAGE_NOACCESS, + PAGE_GUARD | PAGE_READONLY, + PAGE_GUARD | PAGE_EXECUTE, + PAGE_GUARD | PAGE_EXECUTE_READ, + PAGE_GUARD | PAGE_READWRITE, + PAGE_GUARD | PAGE_WRITECOPY, + PAGE_GUARD | PAGE_EXECUTE_READWRITE, + PAGE_GUARD | PAGE_EXECUTE_WRITECOPY, + PAGE_NOACCESS, + PAGE_WRITECOMBINE | PAGE_READONLY, + PAGE_WRITECOMBINE | PAGE_EXECUTE, + PAGE_WRITECOMBINE | PAGE_EXECUTE_READ, + PAGE_WRITECOMBINE | PAGE_READWRITE, + PAGE_WRITECOMBINE | PAGE_WRITECOPY, + PAGE_WRITECOMBINE | PAGE_EXECUTE_READWRITE, + PAGE_WRITECOMBINE | PAGE_EXECUTE_WRITECOPY +}; + /* FUNCTIONS ***************************************************************/ BOOLEAN MmUnmapPageTable(PULONG Pt); @@ -186,7 +223,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) MmDeleteHyperspaceMapping(PageDir); return NULL; } - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Pfn); + Status = MmRequestPageMemoryConsumer(MC_SYSTEM, FALSE, &Pfn); if (!NT_SUCCESS(Status) || Pfn == 0) { KeBugCheck(MEMORY_MANAGEMENT); @@ -194,7 +231,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) Entry = InterlockedCompareExchangePte(&PageDir[PdeOffset], PFN_TO_PTE(Pfn) | PA_PRESENT | PA_READWRITE | PA_USER, 0); if (Entry != 0) { - MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn); + MmReleasePageMemoryConsumer(MC_SYSTEM, Pfn); Pfn = PTE_TO_PFN(Entry); } } @@ -243,7 +280,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) { return NULL; } - Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Pfn); + Status = MmRequestPageMemoryConsumer(MC_SYSTEM, FALSE, &Pfn); if (!NT_SUCCESS(Status) || Pfn == 0) { KeBugCheck(MEMORY_MANAGEMENT); @@ -251,7 +288,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) Entry = InterlockedCompareExchangePte(PageDir, PFN_TO_PTE(Pfn) | PA_PRESENT | PA_READWRITE | PA_USER, 0); if (Entry != 0) { - MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn); + MmReleasePageMemoryConsumer(MC_SYSTEM, Pfn); } } } @@ -412,7 +449,7 @@ MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOLEAN FreePage, if (FreePage && WasValid) { - MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn); + MmReleasePageMemoryConsumer(MC_SYSTEM, Pfn); } /* @@ -872,54 +909,6 @@ MmGetPhysicalAddress(PVOID vaddr) return p; } -VOID -NTAPI -MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size) -{ - ULONG StartOffset, EndOffset, Offset; - PULONG Pde; - - // - // Check if the process isn't there anymore - // This is probably a bad sign, since it means the caller is setting cr3 to - // 0 or something... - // - if ((PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0]) == 0) && (Process != PsGetCurrentProcess())) - { - DPRINT1("Process: %16s is dead: %p\n", Process->ImageFileName, Process->Pcb.DirectoryTableBase[0]); - ASSERT(FALSE); - return; - } - - if (Address < MmSystemRangeStart) - { - KeBugCheck(MEMORY_MANAGEMENT); - } - - StartOffset = ADDR_TO_PDE_OFFSET(Address); - EndOffset = ADDR_TO_PDE_OFFSET((PVOID)((ULONG_PTR)Address + Size)); - - if (Process != NULL && Process != PsGetCurrentProcess()) - { - Pde = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0])); - } - else - { - Pde = (PULONG)PAGEDIRECTORY_MAP; - } - for (Offset = StartOffset; Offset <= EndOffset; Offset++) - { - if (Offset != ADDR_TO_PDE_OFFSET(PAGETABLE_MAP)) - { - InterlockedCompareExchangePte(&Pde[Offset], MmGlobalKernelPageDirectory[Offset], 0); - } - } - if (Pde != (PULONG)PAGEDIRECTORY_MAP) - { - MmDeleteHyperspaceMapping(Pde); - } -} - VOID INIT_FUNCTION NTAPI diff --git a/ntoskrnl/mm/marea.c b/ntoskrnl/mm/marea.c index 0466de055c0..2c7567417ce 100644 --- a/ntoskrnl/mm/marea.c +++ b/ntoskrnl/mm/marea.c @@ -48,8 +48,6 @@ MEMORY_AREA MiStaticMemoryAreas[MI_STATIC_MEMORY_AREAS]; ULONG MiStaticMemoryAreaCount; -/* #define VALIDATE_MEMORY_AREAS */ - /* FUNCTIONS *****************************************************************/ /** @@ -158,56 +156,6 @@ static PMEMORY_AREA MmIteratePrevNode(PMEMORY_AREA Node) return Node; } -#ifdef VALIDATE_MEMORY_AREAS -static VOID MmVerifyMemoryAreas(PMMSUPPORT AddressSpace) -{ - PMEMORY_AREA Node; - - ASSERT(AddressSpace != NULL); - - /* Special case for empty tree. */ - if (AddressSpace->WorkingSetExpansionLinks.Flink == NULL) - return; - - /* Traverse the tree from left to right. */ - for (Node = MmIterateFirstNode(AddressSpace->WorkingSetExpansionLinks.Flink); - Node != NULL; - Node = MmIterateNextNode(Node)) - { - /* FiN: The starting address can be NULL if someone explicitely asks - * for NULL address. */ - ASSERT(Node->StartingAddress == NULL); - ASSERT(Node->EndingAddress >= Node->StartingAddress); - } -} -#else -#define MmVerifyMemoryAreas(x) -#endif - -VOID NTAPI -MmDumpMemoryAreas(PMMSUPPORT AddressSpace) -{ - PMEMORY_AREA Node; - - DbgPrint("MmDumpMemoryAreas()\n"); - - /* Special case for empty tree. */ - if (AddressSpace->WorkingSetExpansionLinks.Flink == NULL) - return; - - /* Traverse the tree from left to right. */ - for (Node = MmIterateFirstNode((PMEMORY_AREA)AddressSpace->WorkingSetExpansionLinks.Flink); - Node != NULL; - Node = MmIterateNextNode(Node)) - { - DbgPrint("Start %p End %p Protect %x Flags %x\n", - Node->StartingAddress, Node->EndingAddress, - Node->Protect, Node->Flags); - } - - DbgPrint("Finished MmDumpMemoryAreas()\n"); -} - PMEMORY_AREA NTAPI MmLocateMemoryAreaByAddress( PMMSUPPORT AddressSpace, @@ -218,8 +166,6 @@ MmLocateMemoryAreaByAddress( DPRINT("MmLocateMemoryAreaByAddress(AddressSpace %p, Address %p)\n", AddressSpace, Address); - MmVerifyMemoryAreas(AddressSpace); - while (Node != NULL) { if (Address < Node->StartingAddress) @@ -247,8 +193,6 @@ MmLocateMemoryAreaByRegion( PMEMORY_AREA Node; PVOID Extent = (PVOID)((ULONG_PTR)Address + Length); - MmVerifyMemoryAreas(AddressSpace); - /* Special case for empty tree. */ if (AddressSpace->WorkingSetExpansionLinks.Flink == NULL) return NULL; @@ -407,6 +351,17 @@ MmRebalanceTree( } } +VOID +NTAPI +MiInsertVad(IN PMMVAD Vad, +IN PEPROCESS Process); + +ULONG +NTAPI +MiMakeProtectionMask( + IN ULONG Protect +); + static VOID MmInsertMemoryArea( PMMSUPPORT AddressSpace, @@ -416,7 +371,38 @@ MmInsertMemoryArea( PMEMORY_AREA PreviousNode; ULONG Depth = 0; - MmVerifyMemoryAreas(AddressSpace); + /* Build a lame VAD if this is a user-space allocation */ + if ((marea->EndingAddress < MmSystemRangeStart) && (marea->Type != MEMORY_AREA_OWNED_BY_ARM3)) + { + ASSERT(marea->Type == MEMORY_AREA_VIRTUAL_MEMORY || marea->Type == MEMORY_AREA_SECTION_VIEW); + PMMVAD Vad; + Vad = ExAllocatePoolWithTag(NonPagedPool, sizeof(MMVAD), 'Fake'); + ASSERT(Vad); + RtlZeroMemory(Vad, sizeof(MMVAD)); + Vad->StartingVpn = PAGE_ROUND_DOWN(marea->StartingAddress) >> PAGE_SHIFT; + /* + * For some strange reason, it is perfectly valid to create a MAREA from 0x1000 to... 0x1000. + * In a normal OS/Memory Manager, this would be retarded, but ReactOS allows this (how it works + * I don't even want to know). + */ + if (marea->EndingAddress != marea->StartingAddress) + { + Vad->EndingVpn = PAGE_ROUND_DOWN((ULONG_PTR)marea->EndingAddress - 1) >> PAGE_SHIFT; + } + else + { + Vad->EndingVpn = Vad->StartingVpn; + } + Vad->u.VadFlags.Spare = 1; + Vad->u.VadFlags.PrivateMemory = 1; + Vad->u.VadFlags.Protection = MiMakeProtectionMask(marea->Protect); + MiInsertVad(Vad, MmGetAddressSpaceOwner(AddressSpace)); + marea->Vad = Vad; + } + else + { + marea->Vad = NULL; + } if (AddressSpace->WorkingSetExpansionLinks.Flink == NULL) { @@ -477,8 +463,6 @@ MmFindGapBottomUp( PMEMORY_AREA FirstNode; PMEMORY_AREA PreviousNode; - MmVerifyMemoryAreas(AddressSpace); - DPRINT("LowestAddress: %p HighestAddress: %p\n", LowestAddress, HighestAddress); @@ -554,8 +538,6 @@ MmFindGapTopDown( PMEMORY_AREA Node; PMEMORY_AREA PreviousNode; - MmVerifyMemoryAreas(AddressSpace); - DPRINT("LowestAddress: %p HighestAddress: %p\n", LowestAddress, HighestAddress); @@ -651,8 +633,6 @@ MmFindGapAtAddress( PVOID HighestAddress = MmGetAddressSpaceOwner(AddressSpace) ? (PVOID)((ULONG_PTR)MmSystemRangeStart - 1) : (PVOID)MAXULONG_PTR; - MmVerifyMemoryAreas(AddressSpace); - Address = MM_ROUND_DOWN(Address, PAGE_SIZE); if (LowestAddress < MmSystemRangeStart) @@ -702,6 +682,10 @@ MmFindGapAtAddress( } } +VOID +NTAPI +MiRemoveNode(IN PMMADDRESS_NODE Node, +IN PMM_AVL_TABLE Table); /** * @name MmFreeMemoryArea @@ -749,12 +733,6 @@ MmFreeMemoryArea( Address < (ULONG_PTR)EndAddress; Address += PAGE_SIZE) { - if (MemoryArea->Type == MEMORY_AREA_IO_MAPPING) - { - MmRawDeleteVirtualMapping((PVOID)Address); - } - else - { BOOLEAN Dirty = FALSE; SWAPENTRY SwapEntry = 0; PFN_NUMBER Page = 0; @@ -772,7 +750,6 @@ MmFreeMemoryArea( FreePage(FreePageContext, MemoryArea, (PVOID)Address, Page, SwapEntry, (BOOLEAN)Dirty); } - } } if (Process != NULL && @@ -780,6 +757,22 @@ MmFreeMemoryArea( { KeDetachProcess(); } + + if (MemoryArea->Vad) + { + ASSERT(MemoryArea->EndingAddress < MmSystemRangeStart); + ASSERT(MemoryArea->Type == MEMORY_AREA_VIRTUAL_MEMORY || MemoryArea->Type == MEMORY_AREA_SECTION_VIEW); + + /* MmCleanProcessAddressSpace might have removed it (and this would be MmDeleteProcessAdressSpace) */ + ASSERT(((PMMVAD)MemoryArea->Vad)->u.VadFlags.Spare != 0); + if (((PMMVAD)MemoryArea->Vad)->u.VadFlags.Spare == 1) + { + MiRemoveNode(MemoryArea->Vad, &Process->VadRoot); + } + + ExFreePool(MemoryArea->Vad); + MemoryArea->Vad = NULL; + } } /* Remove the tree item. */ @@ -843,57 +836,6 @@ MmFreeMemoryArea( return STATUS_SUCCESS; } -/** - * @name MmFreeMemoryAreaByPtr - * - * Free an existing memory area given a pointer inside it. - * - * @param AddressSpace - * Address space to free the area from. - * @param BaseAddress - * Address in the memory area we're about to free. - * @param FreePage - * Callback function for each freed page. - * @param FreePageContext - * Context passed to the callback function. - * - * @return Status - * - * @see MmFreeMemoryArea - * - * @todo Should we require the BaseAddress to be really the starting - * address of the memory area or is the current relaxed check - * (BaseAddress can point anywhere in the memory area) acceptable? - * - * @remarks Lock the address space before calling this function. - */ - -NTSTATUS NTAPI -MmFreeMemoryAreaByPtr( - PMMSUPPORT AddressSpace, - PVOID BaseAddress, - PMM_FREE_PAGE_FUNC FreePage, - PVOID FreePageContext) -{ - PMEMORY_AREA MemoryArea; - - DPRINT("MmFreeMemoryArea(AddressSpace %p, BaseAddress %p, " - "FreePageContext %p)\n", AddressSpace, BaseAddress, - FreePageContext); - - MmVerifyMemoryAreas(AddressSpace); - - MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, - BaseAddress); - if (MemoryArea == NULL) - { - KeBugCheck(MEMORY_MANAGEMENT); - return(STATUS_UNSUCCESSFUL); - } - - return MmFreeMemoryArea(AddressSpace, MemoryArea, FreePage, FreePageContext); -} - /** * @name MmCreateMemoryArea * @@ -942,8 +884,6 @@ MmCreateMemoryArea(PMMSUPPORT AddressSpace, Type, BaseAddress, *BaseAddress, Length, AllocationFlags, FixedAddress, Result); - MmVerifyMemoryAreas(AddressSpace); - Granularity = (MEMORY_AREA_VIRTUAL_MEMORY == Type ? MM_VIRTMEM_GRANULARITY : PAGE_SIZE); if ((*BaseAddress) == 0 && !FixedAddress) { @@ -1064,36 +1004,51 @@ MmMapMemoryArea(PVOID BaseAddress, } } - -VOID NTAPI -MmReleaseMemoryAreaIfDecommitted(PEPROCESS Process, - PMMSUPPORT AddressSpace, - PVOID BaseAddress) +NTSTATUS +NTAPI +MmDeleteProcessAddressSpace(PEPROCESS Process) { + PVOID Address; PMEMORY_AREA MemoryArea; - PLIST_ENTRY Entry; - PMM_REGION Region; - BOOLEAN Reserved; - MmVerifyMemoryAreas(AddressSpace); + DPRINT("MmDeleteProcessAddressSpace(Process %x (%s))\n", Process, + Process->ImageFileName); - MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, BaseAddress); - if (MemoryArea != NULL) + RemoveEntryList(&Process->MmProcessLinks); + + MmLockAddressSpace(&Process->Vm); + + while ((MemoryArea = (PMEMORY_AREA)Process->Vm.WorkingSetExpansionLinks.Flink) != NULL) { - Entry = MemoryArea->Data.VirtualMemoryData.RegionListHead.Flink; - Reserved = TRUE; - while (Reserved && Entry != &MemoryArea->Data.VirtualMemoryData.RegionListHead) + switch (MemoryArea->Type) { - Region = CONTAINING_RECORD(Entry, MM_REGION, RegionListEntry); - Reserved = (MEM_RESERVE == Region->Type); - Entry = Entry->Flink; - } + case MEMORY_AREA_SECTION_VIEW: + Address = (PVOID)MemoryArea->StartingAddress; + MmUnlockAddressSpace(&Process->Vm); + MmUnmapViewOfSection(Process, Address); + MmLockAddressSpace(&Process->Vm); + break; - if (Reserved) - { - MmFreeVirtualMemory(Process, MemoryArea); + case MEMORY_AREA_VIRTUAL_MEMORY: + MmFreeVirtualMemory(Process, MemoryArea); + break; + + case MEMORY_AREA_OWNED_BY_ARM3: + MmFreeMemoryArea(&Process->Vm, + MemoryArea, + NULL, + NULL); + break; + + default: + KeBugCheck(MEMORY_MANAGEMENT); } } + + MmUnlockAddressSpace(&Process->Vm); + + DPRINT("Finished MmReleaseMmInfo()\n"); + return(STATUS_SUCCESS); } /* EOF */ diff --git a/ntoskrnl/mm/mmfault.c b/ntoskrnl/mm/mmfault.c index 308686df707..bf8b2e014c7 100644 --- a/ntoskrnl/mm/mmfault.c +++ b/ntoskrnl/mm/mmfault.c @@ -17,37 +17,6 @@ /* PRIVATE FUNCTIONS **********************************************************/ -VOID -FASTCALL -MiSyncForProcessAttach(IN PKTHREAD Thread, - IN PEPROCESS Process) -{ - PETHREAD Ethread = CONTAINING_RECORD(Thread, ETHREAD, Tcb); - - /* Hack Sync because Mm is broken */ - MmUpdatePageDir(Process, Ethread, sizeof(ETHREAD)); - MmUpdatePageDir(Process, Ethread->ThreadsProcess, sizeof(EPROCESS)); - MmUpdatePageDir(Process, - (PVOID)Thread->StackLimit, - Thread->LargeStack ? - KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); -} - -VOID -FASTCALL -MiSyncForContextSwitch(IN PKTHREAD Thread) -{ - PVOID Process = PsGetCurrentProcess(); - PETHREAD Ethread = CONTAINING_RECORD(Thread, ETHREAD, Tcb); - - /* Hack Sync because Mm is broken */ - MmUpdatePageDir(Process, Ethread->ThreadsProcess, sizeof(EPROCESS)); - MmUpdatePageDir(Process, - (PVOID)Thread->StackLimit, - Thread->LargeStack ? - KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); -} - NTSTATUS NTAPI MmpAccessFault(KPROCESSOR_MODE Mode, @@ -105,10 +74,6 @@ MmpAccessFault(KPROCESSOR_MODE Mode, switch (MemoryArea->Type) { - case MEMORY_AREA_PAGED_POOL: - Status = STATUS_SUCCESS; - break; - case MEMORY_AREA_SECTION_VIEW: Status = MmAccessFaultSectionView(AddressSpace, MemoryArea, @@ -196,12 +161,6 @@ MmNotPresentFault(KPROCESSOR_MODE Mode, switch (MemoryArea->Type) { - case MEMORY_AREA_PAGED_POOL: - { - Status = MmCommitPagedPoolAddress((PVOID)Address, Locked); - break; - } - case MEMORY_AREA_SECTION_VIEW: Status = MmNotPresentFaultSectionView(AddressSpace, MemoryArea, @@ -240,7 +199,7 @@ MmAccessFault(IN BOOLEAN StoreInstruction, IN KPROCESSOR_MODE Mode, IN PVOID TrapInformation) { - PMEMORY_AREA MemoryArea; + PMEMORY_AREA MemoryArea = NULL; /* Cute little hack for ROS */ if ((ULONG_PTR)Address >= (ULONG_PTR)MmSystemRangeStart) @@ -255,27 +214,24 @@ MmAccessFault(IN BOOLEAN StoreInstruction, #endif } - /* - * Check if this is an ARM3 memory area or if there's no memory area at all. - * The latter can happen early in the boot cycle when ARM3 paged pool is in - * use before having defined the memory areas proper. - * A proper fix would be to define memory areas in the ARM3 code, but we want - * to avoid adding this ReactOS-specific construct to ARM3 code. - * Either way, in the future, as ReactOS-paged pool is eliminated, this hack - * can go away. - */ - MemoryArea = MmLocateMemoryAreaByAddress(MmGetKernelAddressSpace(), Address); - if (!(MemoryArea) && (Address <= MM_HIGHEST_USER_ADDRESS)) + /* Is there a ReactOS address space yet? */ + if (MmGetKernelAddressSpace()) { - /* Could this be a VAD fault from user-mode? */ - MemoryArea = MmLocateMemoryAreaByAddress(MmGetCurrentAddressSpace(), Address); + /* Check if this is an ARM3 memory area */ + MemoryArea = MmLocateMemoryAreaByAddress(MmGetKernelAddressSpace(), Address); + if (!(MemoryArea) && (Address <= MM_HIGHEST_USER_ADDRESS)) + { + /* Could this be a VAD fault from user-mode? */ + MemoryArea = MmLocateMemoryAreaByAddress(MmGetCurrentAddressSpace(), Address); + } } - if ((!(MemoryArea) && ((ULONG_PTR)Address >= (ULONG_PTR)MmPagedPoolStart)) || - ((MemoryArea) && (MemoryArea->Type == MEMORY_AREA_OWNED_BY_ARM3))) + + /* Is this an ARM3 memory area, or is there no address space yet? */ + if (((MemoryArea) && (MemoryArea->Type == MEMORY_AREA_OWNED_BY_ARM3)) || + (!(MemoryArea) && ((ULONG_PTR)Address >= (ULONG_PTR)MmPagedPoolStart)) || + (!MmGetKernelAddressSpace())) { - // - // Hand it off to more competent hands... - // + /* This is an ARM3 fault */ DPRINT("ARM3 fault %p\n", MemoryArea); return MmArmAccessFault(StoreInstruction, Address, Mode, TrapInformation); } @@ -293,25 +249,3 @@ MmAccessFault(IN BOOLEAN StoreInstruction, } } -NTSTATUS -NTAPI -MmCommitPagedPoolAddress(PVOID Address, BOOLEAN Locked) -{ - NTSTATUS Status; - PFN_NUMBER AllocatedPage; - - Status = MmRequestPageMemoryConsumer(MC_PPOOL, FALSE, &AllocatedPage); - if (!NT_SUCCESS(Status)) - { - MmUnlockAddressSpace(MmGetKernelAddressSpace()); - Status = MmRequestPageMemoryConsumer(MC_PPOOL, TRUE, &AllocatedPage); - MmLockAddressSpace(MmGetKernelAddressSpace()); - } - Status = - MmCreateVirtualMapping(NULL, - (PVOID)PAGE_ROUND_DOWN(Address), - PAGE_READWRITE, - &AllocatedPage, - 1); - return(Status); -} diff --git a/ntoskrnl/mm/mminit.c b/ntoskrnl/mm/mminit.c index d2db58eaaa5..df2140c9cc7 100644 --- a/ntoskrnl/mm/mminit.c +++ b/ntoskrnl/mm/mminit.c @@ -17,36 +17,10 @@ /* GLOBALS *******************************************************************/ -PCHAR -MemType[] = -{ - "ExceptionBlock ", - "SystemBlock ", - "Free ", - "Bad ", - "LoadedProgram ", - "FirmwareTemporary ", - "FirmwarePermanent ", - "OsloaderHeap ", - "OsloaderStack ", - "SystemCode ", - "HalCode ", - "BootDriver ", - "ConsoleInDriver ", - "ConsoleOutDriver ", - "StartupDpcStack ", - "StartupKernelStack", - "StartupPanicStack ", - "StartupPcrPage ", - "StartupPdrPage ", - "RegistryData ", - "MemoryData ", - "NlsData ", - "SpecialMemory ", - "BBTMemory ", - "LoaderReserve ", - "LoaderXIPRom " -}; +VOID NTAPI MiInitializeUserPfnBitmap(VOID); + +HANDLE MpwThreadHandle; +KEVENT MpwThreadEvent; BOOLEAN Mm64BitPhysicalAddress = FALSE; ULONG MmReadClusterSize; @@ -56,12 +30,6 @@ ULONG MmReadClusterSize; UCHAR MmDisablePagingExecutive = 1; // Forced to off PMMPTE MmSharedUserDataPte; PMMSUPPORT MmKernelAddressSpace; -BOOLEAN MiDbgEnableMdDump = -#ifdef _ARM_ -TRUE; -#else -FALSE; -#endif /* PRIVATE FUNCTIONS *********************************************************/ @@ -198,21 +166,6 @@ MiInitSystemMemoryAreas() BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); - // - // And now, ReactOS paged pool - // - BaseAddress = MmPagedPoolBase; - Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), - MEMORY_AREA_PAGED_POOL | MEMORY_AREA_STATIC, - &BaseAddress, - MmPagedPoolSize, - PAGE_READWRITE, - &MArea, - TRUE, - 0, - BoundaryAddressMultiple); - ASSERT(Status == STATUS_SUCCESS); - // // Next, the KPCR // @@ -260,7 +213,7 @@ MiInitSystemMemoryAreas() #if defined(_X86_) // - // Finally, reserve the 2 pages we currently make use of for HAL mappings + // Finally, reserve the 2 pages we currently make use of for HAL mappings // BaseAddress = (PVOID)0xFFC00000; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), @@ -287,10 +240,6 @@ MiDbgDumpAddressSpace(VOID) MmSystemRangeStart, (ULONG_PTR)MmSystemRangeStart + MmBootImageSize, "Boot Loaded Image"); - DPRINT1(" 0x%p - 0x%p\t%s\n", - MmPagedPoolBase, - (ULONG_PTR)MmPagedPoolBase + MmPagedPoolSize, - "Paged Pool"); DPRINT1(" 0x%p - 0x%p\t%s\n", MmPfnDatabase, (ULONG_PTR)MmPfnDatabase + (MxPfnAllocation << PAGE_SHIFT), @@ -328,28 +277,88 @@ MiDbgDumpAddressSpace(VOID) "Non Paged Pool Expansion PTE Space"); } -VOID -NTAPI -MiDbgDumpMemoryDescriptors(VOID) +NTSTATUS NTAPI +MmMpwThreadMain(PVOID Ignored) { - PLIST_ENTRY NextEntry; - PMEMORY_ALLOCATION_DESCRIPTOR Md; - ULONG TotalPages = 0; - - DPRINT1("Base\t\tLength\t\tType\n"); - for (NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink; - NextEntry != &KeLoaderBlock->MemoryDescriptorListHead; - NextEntry = NextEntry->Flink) - { - Md = CONTAINING_RECORD(NextEntry, MEMORY_ALLOCATION_DESCRIPTOR, ListEntry); - DPRINT1("%08lX\t%08lX\t%s\n", Md->BasePage, Md->PageCount, MemType[Md->MemoryType]); - TotalPages += Md->PageCount; - } + NTSTATUS Status; + ULONG PagesWritten; + LARGE_INTEGER Timeout; - DPRINT1("Total: %08lX (%d MB)\n", TotalPages, (TotalPages * PAGE_SIZE) / 1024 / 1024); + Timeout.QuadPart = -50000000; + + for(;;) + { + Status = KeWaitForSingleObject(&MpwThreadEvent, + 0, + KernelMode, + FALSE, + &Timeout); + if (!NT_SUCCESS(Status)) + { + DbgPrint("MpwThread: Wait failed\n"); + KeBugCheck(MEMORY_MANAGEMENT); + return(STATUS_UNSUCCESSFUL); + } + + PagesWritten = 0; + + CcRosFlushDirtyPages(128, &PagesWritten); + } } -VOID NTAPI MiInitializeUserPfnBitmap(VOID); +NTSTATUS +NTAPI +MmInitMpwThread(VOID) +{ + KPRIORITY Priority; + NTSTATUS Status; + CLIENT_ID MpwThreadId; + + KeInitializeEvent(&MpwThreadEvent, SynchronizationEvent, FALSE); + + Status = PsCreateSystemThread(&MpwThreadHandle, + THREAD_ALL_ACCESS, + NULL, + NULL, + &MpwThreadId, + (PKSTART_ROUTINE) MmMpwThreadMain, + NULL); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + + Priority = 27; + NtSetInformationThread(MpwThreadHandle, + ThreadPriority, + &Priority, + sizeof(Priority)); + + return(STATUS_SUCCESS); +} + +NTSTATUS +NTAPI +MmInitBsmThread(VOID) +{ + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE ThreadHandle; + + /* Create the thread */ + InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); + Status = PsCreateSystemThread(&ThreadHandle, + THREAD_ALL_ACCESS, + &ObjectAttributes, + NULL, + NULL, + KeBalanceSetManager, + NULL); + + /* Close the handle and return status */ + ZwClose(ThreadHandle); + return Status; +} BOOLEAN NTAPI @@ -361,81 +370,65 @@ MmInitSystem(IN ULONG Phase, MMPTE TempPte = ValidKernelPte; PFN_NUMBER PageFrameNumber; - if (Phase == 0) - { - /* Initialize the kernel address space */ - KeInitializeGuardedMutex(&PsGetCurrentProcess()->AddressCreationLock); - MmKernelAddressSpace = MmGetCurrentAddressSpace(); - MmInitGlobalKernelPageDirectory(); - - /* Dump memory descriptors */ - if (MiDbgEnableMdDump) MiDbgDumpMemoryDescriptors(); - - /* Initialize ARMツウ in phase 0 */ - MmArmInitSystem(0, KeLoaderBlock); - - /* Put the paged pool after the loaded modules */ - MmPagedPoolBase = (PVOID)PAGE_ROUND_UP((ULONG_PTR)MmSystemRangeStart + - MmBootImageSize); - MmPagedPoolSize = MM_PAGED_POOL_SIZE; - - /* Intialize system memory areas */ - MiInitSystemMemoryAreas(); + /* Initialize the kernel address space */ + ASSERT(Phase == 1); + KeInitializeGuardedMutex(&PsIdleProcess->AddressCreationLock); + MmKernelAddressSpace = &PsIdleProcess->Vm; - /* Dump the address space */ - MiDbgDumpAddressSpace(); - } - else if (Phase == 1) - { - MmInitializePagedPool(); - MiInitializeUserPfnBitmap(); - MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory); - MmInitializeRmapList(); - MmInitializePageOp(); - MmInitSectionImplementation(); - MmInitPagingFile(); - - // - // Create a PTE to double-map the shared data section. We allocate it - // from paged pool so that we can't fault when trying to touch the PTE - // itself (to map it), since paged pool addresses will already be mapped - // by the fault handler. - // - MmSharedUserDataPte = ExAllocatePoolWithTag(PagedPool, - sizeof(MMPTE), - ' mM'); - if (!MmSharedUserDataPte) return FALSE; - - // - // Now get the PTE for shared data, and read the PFN that holds it - // - PointerPte = MiAddressToPte((PVOID)KI_USER_SHARED_DATA); - ASSERT(PointerPte->u.Hard.Valid == 1); - PageFrameNumber = PFN_FROM_PTE(PointerPte); - - /* Build the PTE and write it */ - MI_MAKE_HARDWARE_PTE_KERNEL(&TempPte, - PointerPte, - MM_READONLY, - PageFrameNumber); - *MmSharedUserDataPte = TempPte; - - /* Setup the memory threshold events */ - if (!MiInitializeMemoryEvents()) return FALSE; - - /* - * Unmap low memory - */ - MiInitBalancerThread(); - - /* - * Initialise the modified page writer. - */ - MmInitMpwThread(); - - /* Initialize the balance set manager */ - MmInitBsmThread(); - } + /* Intialize system memory areas */ + MiInitSystemMemoryAreas(); + + /* Dump the address space */ + MiDbgDumpAddressSpace(); + + MmInitGlobalKernelPageDirectory(); + MiInitializeUserPfnBitmap(); + MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory); + MmInitializeRmapList(); + MmInitializePageOp(); + MmInitSectionImplementation(); + MmInitPagingFile(); + + // + // Create a PTE to double-map the shared data section. We allocate it + // from paged pool so that we can't fault when trying to touch the PTE + // itself (to map it), since paged pool addresses will already be mapped + // by the fault handler. + // + MmSharedUserDataPte = ExAllocatePoolWithTag(PagedPool, + sizeof(MMPTE), + ' mM'); + if (!MmSharedUserDataPte) return FALSE; + + // + // Now get the PTE for shared data, and read the PFN that holds it + // + PointerPte = MiAddressToPte((PVOID)KI_USER_SHARED_DATA); + ASSERT(PointerPte->u.Hard.Valid == 1); + PageFrameNumber = PFN_FROM_PTE(PointerPte); + + /* Build the PTE and write it */ + MI_MAKE_HARDWARE_PTE_KERNEL(&TempPte, + PointerPte, + MM_READONLY, + PageFrameNumber); + *MmSharedUserDataPte = TempPte; + + /* Setup the memory threshold events */ + if (!MiInitializeMemoryEvents()) return FALSE; + + /* + * Unmap low memory + */ + MiInitBalancerThread(); + + /* + * Initialise the modified page writer. + */ + MmInitMpwThread(); + + /* Initialize the balance set manager */ + MmInitBsmThread(); return TRUE; } diff --git a/ntoskrnl/mm/mpw.c b/ntoskrnl/mm/mpw.c deleted file mode 100644 index 89fba8d6e1e..00000000000 --- a/ntoskrnl/mm/mpw.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/mm/mpw.c - * PURPOSE: Writes data that has been modified in memory but not on - * the disk - * - * PROGRAMMERS: David Welch (welch@cwcom.net) - */ - -/* INCLUDES ****************************************************************/ - -#include -#define NDEBUG -#include - -/* GLOBALS *******************************************************************/ - -HANDLE MpwThreadHandle; -static CLIENT_ID MpwThreadId; -KEVENT MpwThreadEvent; -BOOLEAN MpwThreadShouldTerminate; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS NTAPI -MmMpwThreadMain(PVOID Ignored) -{ - NTSTATUS Status; - ULONG PagesWritten; - LARGE_INTEGER Timeout; - - Timeout.QuadPart = -50000000; - - for(;;) - { - Status = KeWaitForSingleObject(&MpwThreadEvent, - 0, - KernelMode, - FALSE, - &Timeout); - if (!NT_SUCCESS(Status)) - { - DbgPrint("MpwThread: Wait failed\n"); - KeBugCheck(MEMORY_MANAGEMENT); - return(STATUS_UNSUCCESSFUL); - } - if (MpwThreadShouldTerminate) - { - DbgPrint("MpwThread: Terminating\n"); - return(STATUS_SUCCESS); - } - - PagesWritten = 0; - - CcRosFlushDirtyPages(128, &PagesWritten); - } -} - -NTSTATUS -NTAPI -MmInitMpwThread(VOID) -{ - KPRIORITY Priority; - NTSTATUS Status; - - MpwThreadShouldTerminate = FALSE; - KeInitializeEvent(&MpwThreadEvent, SynchronizationEvent, FALSE); - - Status = PsCreateSystemThread(&MpwThreadHandle, - THREAD_ALL_ACCESS, - NULL, - NULL, - &MpwThreadId, - (PKSTART_ROUTINE) MmMpwThreadMain, - NULL); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - Priority = 1; - NtSetInformationThread(MpwThreadHandle, - ThreadPriority, - &Priority, - sizeof(Priority)); - - return(STATUS_SUCCESS); -} - -NTSTATUS -NTAPI -MmInitBsmThread(VOID) -{ - NTSTATUS Status; - OBJECT_ATTRIBUTES ObjectAttributes; - HANDLE ThreadHandle; - - /* Create the thread */ - InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); - Status = PsCreateSystemThread(&ThreadHandle, - THREAD_ALL_ACCESS, - &ObjectAttributes, - NULL, - NULL, - KeBalanceSetManager, - NULL); - - /* Close the handle and return status */ - ZwClose(ThreadHandle); - return Status; -} diff --git a/ntoskrnl/mm/pe.c b/ntoskrnl/mm/pe.c deleted file mode 100644 index ae80234bebd..00000000000 --- a/ntoskrnl/mm/pe.c +++ /dev/null @@ -1,745 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/mm/pe.c - * PURPOSE: Loader for PE executables - * - * PROGRAMMERS: KJK::Hyperion - */ - -/* INCLUDES *****************************************************************/ - -#include - -//#define NDEBUG -#include - -#include - -static ULONG SectionCharacteristicsToProtect[16] = -{ - PAGE_NOACCESS, /* 0 = NONE */ - PAGE_NOACCESS, /* 1 = SHARED */ - PAGE_EXECUTE, /* 2 = EXECUTABLE */ - PAGE_EXECUTE, /* 3 = EXECUTABLE, SHARED */ - PAGE_READONLY, /* 4 = READABLE */ - PAGE_READONLY, /* 5 = READABLE, SHARED */ - PAGE_EXECUTE_READ, /* 6 = READABLE, EXECUTABLE */ - PAGE_EXECUTE_READ, /* 7 = READABLE, EXECUTABLE, SHARED */ - /* - * FIXME? do we really need the WriteCopy field in segments? can't we use - * PAGE_WRITECOPY here? - */ - PAGE_READWRITE, /* 8 = WRITABLE */ - PAGE_READWRITE, /* 9 = WRITABLE, SHARED */ - PAGE_EXECUTE_READWRITE, /* 10 = WRITABLE, EXECUTABLE */ - PAGE_EXECUTE_READWRITE, /* 11 = WRITABLE, EXECUTABLE, SHARED */ - PAGE_READWRITE, /* 12 = WRITABLE, READABLE */ - PAGE_READWRITE, /* 13 = WRITABLE, READABLE, SHARED */ - PAGE_EXECUTE_READWRITE, /* 14 = WRITABLE, READABLE, EXECUTABLE */ - PAGE_EXECUTE_READWRITE, /* 15 = WRITABLE, READABLE, EXECUTABLE, SHARED */ -}; - -/* TODO: Intsafe should be made into a library, as it's generally useful */ -static __inline BOOLEAN Intsafe_CanAddULongPtr(IN ULONG_PTR Addend1, IN ULONG_PTR Addend2) -{ - return Addend1 <= (MAXULONG_PTR - Addend2); -} - -static __inline BOOLEAN Intsafe_CanAddLong64(IN LONG64 Addend1, IN LONG64 Addend2) -{ - return Addend1 <= (MAXLONGLONG - Addend2); -} - -static __inline BOOLEAN Intsafe_CanAddULong32(IN ULONG Addend1, IN ULONG Addend2) -{ - return Addend1 <= (MAXULONG - Addend2); -} - -static __inline BOOLEAN Intsafe_AddULong32(OUT PULONG Result, IN ULONG Addend1, IN ULONG Addend2) -{ - if(!Intsafe_CanAddULong32(Addend1, Addend2)) - return FALSE; - - *Result = Addend1 + Addend2; - return TRUE; -} - -static __inline BOOLEAN Intsafe_CanMulULong32(IN ULONG Factor1, IN ULONG Factor2) -{ - return Factor1 <= (MAXULONG / Factor2); -} - -static __inline BOOLEAN Intsafe_CanOffsetPointer(IN CONST VOID * Pointer, IN SIZE_T Offset) -{ - /* FIXME: (PVOID)MAXULONG_PTR isn't necessarily a valid address */ - return Intsafe_CanAddULongPtr((ULONG_PTR)Pointer, Offset); -} - -/* TODO: these are standard DDK/PSDK macros */ -#ifndef RTL_FIELD_SIZE -#define RTL_FIELD_SIZE(TYPE_, FIELD_) (sizeof(((TYPE_ *)0)->FIELD_)) -#endif - -#ifndef RTL_SIZEOF_THROUGH_FIELD -#define RTL_SIZEOF_THROUGH_FIELD(TYPE_, FIELD_) \ - (FIELD_OFFSET(TYPE_, FIELD_) + RTL_FIELD_SIZE(TYPE_, FIELD_)) -#endif - -#ifndef RTL_CONTAINS_FIELD -#define RTL_CONTAINS_FIELD(P_, SIZE_, FIELD_) \ - ((ULONG_PTR)(P_) + (ULONG_PTR)(SIZE_) > (ULONG_PTR)&((P_)->FIELD_) + sizeof((P_)->FIELD_)) -#endif - -static __inline BOOLEAN IsPowerOf2(IN ULONG Number) -{ - if(Number == 0) - return FALSE; - return (Number & (Number - 1)) == 0; -} - -static __inline ULONG ModPow2(IN ULONG Address, IN ULONG Alignment) -{ - ASSERT(IsPowerOf2(Alignment)); - return Address & (Alignment - 1); -} - -static __inline BOOLEAN IsAligned(IN ULONG Address, IN ULONG Alignment) -{ - return ModPow2(Address, Alignment) == 0; -} - -static __inline BOOLEAN AlignUp(OUT PULONG AlignedAddress, IN ULONG Address, IN ULONG Alignment) -{ - ULONG nExcess = ModPow2(Address, Alignment); - - if(nExcess == 0) - { - *AlignedAddress = Address; - return nExcess == 0; - } - else - return Intsafe_AddULong32(AlignedAddress, Address, Alignment - nExcess); -} - -#define PEFMT_FIELDS_EQUAL(TYPE1_, TYPE2_, FIELD_) \ - ( \ - (FIELD_OFFSET(TYPE1_, FIELD_) == FIELD_OFFSET(TYPE2_, FIELD_)) && \ - (RTL_FIELD_SIZE(TYPE1_, FIELD_) == RTL_FIELD_SIZE(TYPE2_, FIELD_)) \ - ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// -// FIXME: All this whitespace is "padding" so the C_ASSERTs aren't on the same lines as asserts in other headers. -// This is necessary because of the way we define C_ASSERT in a gcc compatible way. -// This can be removed once we upgrade to gcc 4.3.x or later (which implements __COUNTER__). -// - - - - - - - - - - - - - - - - - - - - - - - - - - - -// -// PeFmtCreateSection depends on the following: -// -C_ASSERT(EXEFMT_LOAD_HEADER_SIZE >= sizeof(IMAGE_DOS_HEADER)); -C_ASSERT(sizeof(IMAGE_NT_HEADERS32) <= sizeof(IMAGE_NT_HEADERS64)); - -C_ASSERT(TYPE_ALIGNMENT(IMAGE_NT_HEADERS32) == TYPE_ALIGNMENT(IMAGE_NT_HEADERS64)); -C_ASSERT(RTL_SIZEOF_THROUGH_FIELD(IMAGE_NT_HEADERS32, FileHeader) == RTL_SIZEOF_THROUGH_FIELD(IMAGE_NT_HEADERS64, FileHeader)); -C_ASSERT(FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader) == FIELD_OFFSET(IMAGE_NT_HEADERS64, OptionalHeader)); - -C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, Magic)); -C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, SectionAlignment)); -C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, FileAlignment)); -C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, Subsystem)); -C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, MinorSubsystemVersion)); -C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, MajorSubsystemVersion)); -C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, AddressOfEntryPoint)); -C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, SizeOfCode)); -C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, SizeOfHeaders)); - -/* - References: - [1] Microsoft Corporation, "Microsoft Portable Executable and Common Object - File Format Specification", revision 6.0 (February 1999) -*/ -NTSTATUS NTAPI PeFmtCreateSection(IN CONST VOID * FileHeader, - IN SIZE_T FileHeaderSize, - IN PVOID File, - OUT PMM_IMAGE_SECTION_OBJECT ImageSectionObject, - OUT PULONG Flags, - IN PEXEFMT_CB_READ_FILE ReadFileCb, - IN PEXEFMT_CB_ALLOCATE_SEGMENTS AllocateSegmentsCb) -{ - NTSTATUS nStatus; - ULONG cbFileHeaderOffsetSize = 0; - ULONG cbSectionHeadersOffset = 0; - ULONG cbSectionHeadersSize; - ULONG cbSectionHeadersOffsetSize = 0; - ULONG cbOptHeaderSize; - ULONG cbHeadersSize = 0; - ULONG nSectionAlignment; - ULONG nFileAlignment; - const IMAGE_DOS_HEADER * pidhDosHeader; - const IMAGE_NT_HEADERS32 * pinhNtHeader; - const IMAGE_OPTIONAL_HEADER32 * piohOptHeader; - const IMAGE_SECTION_HEADER * pishSectionHeaders; - PMM_SECTION_SEGMENT pssSegments; - LARGE_INTEGER lnOffset; - PVOID pBuffer; - ULONG nPrevVirtualEndOfSegment = 0; - ULONG nFileSizeOfHeaders = 0; - ULONG i; - - ASSERT(FileHeader); - ASSERT(FileHeaderSize > 0); - ASSERT(File); - ASSERT(ImageSectionObject); - ASSERT(ReadFileCb); - ASSERT(AllocateSegmentsCb); - - ASSERT(Intsafe_CanOffsetPointer(FileHeader, FileHeaderSize)); - - ASSERT(((UINT_PTR)FileHeader % TYPE_ALIGNMENT(IMAGE_DOS_HEADER)) == 0); - -#define DIE(ARGS_) { DPRINT ARGS_; goto l_Return; } - - pBuffer = NULL; - pidhDosHeader = FileHeader; - - /* DOS HEADER */ - nStatus = STATUS_ROS_EXEFMT_UNKNOWN_FORMAT; - - /* image too small to be an MZ executable */ - if(FileHeaderSize < sizeof(IMAGE_DOS_HEADER)) - DIE(("Too small to be an MZ executable, size is %lu\n", FileHeaderSize)); - - /* no MZ signature */ - if(pidhDosHeader->e_magic != IMAGE_DOS_SIGNATURE) - DIE(("No MZ signature found, e_magic is %hX\n", pidhDosHeader->e_magic)); - - /* not a Windows executable */ - if(pidhDosHeader->e_lfanew <= 0) - DIE(("Not a Windows executable, e_lfanew is %d\n", pidhDosHeader->e_lfanew)); - - /* NT HEADER */ - nStatus = STATUS_INVALID_IMAGE_FORMAT; - - if(!Intsafe_AddULong32(&cbFileHeaderOffsetSize, pidhDosHeader->e_lfanew, RTL_SIZEOF_THROUGH_FIELD(IMAGE_NT_HEADERS32, FileHeader))) - DIE(("The DOS stub is too large, e_lfanew is %X\n", pidhDosHeader->e_lfanew)); - - if(FileHeaderSize < cbFileHeaderOffsetSize) - pinhNtHeader = NULL; - else - { - /* - * we already know that Intsafe_CanOffsetPointer(FileHeader, FileHeaderSize), - * and FileHeaderSize >= cbFileHeaderOffsetSize, so this holds true too - */ - ASSERT(Intsafe_CanOffsetPointer(FileHeader, pidhDosHeader->e_lfanew)); - pinhNtHeader = (PVOID)((UINT_PTR)FileHeader + pidhDosHeader->e_lfanew); - } - - /* - * the buffer doesn't contain the NT file header, or the alignment is wrong: we - * need to read the header from the file - */ - if(FileHeaderSize < cbFileHeaderOffsetSize || - (UINT_PTR)pinhNtHeader % TYPE_ALIGNMENT(IMAGE_NT_HEADERS32) != 0) - { - ULONG cbNtHeaderSize; - ULONG cbReadSize; - PVOID pData; - -l_ReadHeaderFromFile: - cbNtHeaderSize = 0; - lnOffset.QuadPart = pidhDosHeader->e_lfanew; - - /* read the header from the file */ - nStatus = ReadFileCb(File, &lnOffset, sizeof(IMAGE_NT_HEADERS64), &pData, &pBuffer, &cbReadSize); - - if(!NT_SUCCESS(nStatus)) - DIE(("ReadFile failed, status %08X\n", nStatus)); - - ASSERT(pData); - ASSERT(pBuffer); - ASSERT(cbReadSize > 0); - - nStatus = STATUS_INVALID_IMAGE_FORMAT; - - /* the buffer doesn't contain the file header */ - if(cbReadSize < RTL_SIZEOF_THROUGH_FIELD(IMAGE_NT_HEADERS32, FileHeader)) - DIE(("The file doesn't contain the PE file header\n")); - - pinhNtHeader = pData; - - /* object still not aligned: copy it to the beginning of the buffer */ - if((UINT_PTR)pinhNtHeader % TYPE_ALIGNMENT(IMAGE_NT_HEADERS32) != 0) - { - ASSERT((UINT_PTR)pBuffer % TYPE_ALIGNMENT(IMAGE_NT_HEADERS32) == 0); - RtlMoveMemory(pBuffer, pData, cbReadSize); - pinhNtHeader = pBuffer; - } - - /* invalid NT header */ - nStatus = STATUS_INVALID_IMAGE_PROTECT; - - if(pinhNtHeader->Signature != IMAGE_NT_SIGNATURE) - DIE(("The file isn't a PE executable, Signature is %X\n", pinhNtHeader->Signature)); - - nStatus = STATUS_INVALID_IMAGE_FORMAT; - - if(!Intsafe_AddULong32(&cbNtHeaderSize, pinhNtHeader->FileHeader.SizeOfOptionalHeader, FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader))) - DIE(("The full NT header is too large\n")); - - /* the buffer doesn't contain the whole NT header */ - if(cbReadSize < cbNtHeaderSize) - DIE(("The file doesn't contain the full NT header\n")); - } - else - { - ULONG cbOptHeaderOffsetSize = 0; - - nStatus = STATUS_INVALID_IMAGE_FORMAT; - - /* don't trust an invalid NT header */ - if(pinhNtHeader->Signature != IMAGE_NT_SIGNATURE) - DIE(("The file isn't a PE executable, Signature is %X\n", pinhNtHeader->Signature)); - - if(!Intsafe_AddULong32(&cbOptHeaderOffsetSize, pidhDosHeader->e_lfanew, FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader))) - DIE(("The DOS stub is too large, e_lfanew is %X\n", pidhDosHeader->e_lfanew)); - - if(!Intsafe_AddULong32(&cbOptHeaderOffsetSize, cbOptHeaderOffsetSize, pinhNtHeader->FileHeader.SizeOfOptionalHeader)) - DIE(("The NT header is too large, SizeOfOptionalHeader is %X\n", pinhNtHeader->FileHeader.SizeOfOptionalHeader)); - - /* the buffer doesn't contain the whole NT header: read it from the file */ - if(cbOptHeaderOffsetSize > FileHeaderSize) - goto l_ReadHeaderFromFile; - } - - /* read information from the NT header */ - piohOptHeader = &pinhNtHeader->OptionalHeader; - cbOptHeaderSize = pinhNtHeader->FileHeader.SizeOfOptionalHeader; - - nStatus = STATUS_INVALID_IMAGE_FORMAT; - - if(!RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, Magic)) - DIE(("The optional header doesn't contain the Magic field, SizeOfOptionalHeader is %X\n", cbOptHeaderSize)); - - /* ASSUME: RtlZeroMemory(ImageSectionObject, sizeof(*ImageSectionObject)); */ - - switch(piohOptHeader->Magic) - { - case IMAGE_NT_OPTIONAL_HDR32_MAGIC: - case IMAGE_NT_OPTIONAL_HDR64_MAGIC: - break; - - default: - DIE(("Unrecognized optional header, Magic is %X\n", piohOptHeader->Magic)); - } - - if (RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SectionAlignment) && - RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, FileAlignment)) - { - /* See [1], section 3.4.2 */ - if(piohOptHeader->SectionAlignment < PAGE_SIZE) - { - if(piohOptHeader->FileAlignment != piohOptHeader->SectionAlignment) - DIE(("Sections aren't page-aligned and the file alignment isn't the same\n")); - } - else if(piohOptHeader->SectionAlignment < piohOptHeader->FileAlignment) - DIE(("The section alignment is smaller than the file alignment\n")); - - nSectionAlignment = piohOptHeader->SectionAlignment; - nFileAlignment = piohOptHeader->FileAlignment; - - if(!IsPowerOf2(nSectionAlignment) || !IsPowerOf2(nFileAlignment)) - DIE(("The section alignment (%u) and file alignment (%u) aren't both powers of 2\n", nSectionAlignment, nFileAlignment)); - } - else - { - nSectionAlignment = PAGE_SIZE; - nFileAlignment = PAGE_SIZE; - } - - ASSERT(IsPowerOf2(nSectionAlignment)); - ASSERT(IsPowerOf2(nFileAlignment)); - - switch(piohOptHeader->Magic) - { - /* PE32 */ - case IMAGE_NT_OPTIONAL_HDR32_MAGIC: - { - if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, ImageBase)) - ImageSectionObject->ImageBase = piohOptHeader->ImageBase; - - if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SizeOfImage)) - ImageSectionObject->ImageSize = piohOptHeader->SizeOfImage; - - if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SizeOfStackReserve)) - ImageSectionObject->StackReserve = piohOptHeader->SizeOfStackReserve; - - if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SizeOfStackCommit)) - ImageSectionObject->StackCommit = piohOptHeader->SizeOfStackCommit; - - break; - } - - /* PE32+ */ - case IMAGE_NT_OPTIONAL_HDR64_MAGIC: - { - const IMAGE_OPTIONAL_HEADER64 * pioh64OptHeader; - - pioh64OptHeader = (const IMAGE_OPTIONAL_HEADER64 *)piohOptHeader; - - if(RTL_CONTAINS_FIELD(pioh64OptHeader, cbOptHeaderSize, ImageBase)) - { - if(pioh64OptHeader->ImageBase > MAXULONG_PTR) - DIE(("ImageBase exceeds the address space\n")); - - ImageSectionObject->ImageBase = (ULONG_PTR)pioh64OptHeader->ImageBase; - } - - if(RTL_CONTAINS_FIELD(pioh64OptHeader, cbOptHeaderSize, SizeOfImage)) - { - if(pioh64OptHeader->SizeOfImage > MAXULONG_PTR) - DIE(("SizeOfImage exceeds the address space\n")); - - ImageSectionObject->ImageSize = pioh64OptHeader->SizeOfImage; - } - - if(RTL_CONTAINS_FIELD(pioh64OptHeader, cbOptHeaderSize, SizeOfStackReserve)) - { - if(pioh64OptHeader->SizeOfStackReserve > MAXULONG_PTR) - DIE(("SizeOfStackReserve exceeds the address space\n")); - - ImageSectionObject->StackReserve = pioh64OptHeader->SizeOfStackReserve; - } - - if(RTL_CONTAINS_FIELD(pioh64OptHeader, cbOptHeaderSize, SizeOfStackCommit)) - { - if(pioh64OptHeader->SizeOfStackCommit > MAXULONG_PTR) - DIE(("SizeOfStackCommit exceeds the address space\n")); - - ImageSectionObject->StackCommit = pioh64OptHeader->SizeOfStackCommit; - } - - break; - } - } - - /* [1], section 3.4.2 */ - if((ULONG_PTR)ImageSectionObject->ImageBase % 0x10000) - DIE(("ImageBase is not aligned on a 64KB boundary")); - - if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, Subsystem)) - { - ImageSectionObject->Subsystem = piohOptHeader->Subsystem; - - if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, MinorSubsystemVersion) && - RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, MajorSubsystemVersion)) - { - ImageSectionObject->MinorSubsystemVersion = piohOptHeader->MinorSubsystemVersion; - ImageSectionObject->MajorSubsystemVersion = piohOptHeader->MajorSubsystemVersion; - } - } - - if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, AddressOfEntryPoint)) - { - ImageSectionObject->EntryPoint = piohOptHeader->ImageBase + - piohOptHeader->AddressOfEntryPoint; - } - - if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SizeOfCode)) - ImageSectionObject->Executable = piohOptHeader->SizeOfCode != 0; - else - ImageSectionObject->Executable = TRUE; - - ImageSectionObject->ImageCharacteristics = pinhNtHeader->FileHeader.Characteristics; - ImageSectionObject->Machine = pinhNtHeader->FileHeader.Machine; - - /* SECTION HEADERS */ - nStatus = STATUS_INVALID_IMAGE_FORMAT; - - /* see [1], section 3.3 */ - if(pinhNtHeader->FileHeader.NumberOfSections > 96) - DIE(("Too many sections, NumberOfSections is %u\n", pinhNtHeader->FileHeader.NumberOfSections)); - - /* - * the additional segment is for the file's headers. They need to be present for - * the benefit of the dynamic loader (to locate exports, defaults for thread - * parameters, resources, etc.) - */ - ImageSectionObject->NrSegments = pinhNtHeader->FileHeader.NumberOfSections + 1; - - /* file offset for the section headers */ - if(!Intsafe_AddULong32(&cbSectionHeadersOffset, pidhDosHeader->e_lfanew, FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader))) - DIE(("Offset overflow\n")); - - if(!Intsafe_AddULong32(&cbSectionHeadersOffset, cbSectionHeadersOffset, pinhNtHeader->FileHeader.SizeOfOptionalHeader)) - DIE(("Offset overflow\n")); - - /* size of the section headers */ - ASSERT(Intsafe_CanMulULong32(pinhNtHeader->FileHeader.NumberOfSections, sizeof(IMAGE_SECTION_HEADER))); - cbSectionHeadersSize = pinhNtHeader->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER); - - if(!Intsafe_AddULong32(&cbSectionHeadersOffsetSize, cbSectionHeadersOffset, cbSectionHeadersSize)) - DIE(("Section headers too large\n")); - - /* size of the executable's headers */ - if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SizeOfHeaders)) - { -// if(!IsAligned(piohOptHeader->SizeOfHeaders, nFileAlignment)) -// DIE(("SizeOfHeaders is not aligned\n")); - - if(cbSectionHeadersSize > piohOptHeader->SizeOfHeaders) - DIE(("The section headers overflow SizeOfHeaders\n")); - - cbHeadersSize = piohOptHeader->SizeOfHeaders; - } - else if(!AlignUp(&cbHeadersSize, cbSectionHeadersOffsetSize, nFileAlignment)) - DIE(("Overflow aligning the size of headers\n")); - - if(pBuffer) - { - ExFreePool(pBuffer); - pBuffer = NULL; - } - /* WARNING: pinhNtHeader IS NO LONGER USABLE */ - /* WARNING: piohOptHeader IS NO LONGER USABLE */ - /* WARNING: pioh64OptHeader IS NO LONGER USABLE */ - - if(FileHeaderSize < cbSectionHeadersOffsetSize) - pishSectionHeaders = NULL; - else - { - /* - * we already know that Intsafe_CanOffsetPointer(FileHeader, FileHeaderSize), - * and FileHeaderSize >= cbSectionHeadersOffsetSize, so this holds true too - */ - ASSERT(Intsafe_CanOffsetPointer(FileHeader, cbSectionHeadersOffset)); - pishSectionHeaders = (PVOID)((UINT_PTR)FileHeader + cbSectionHeadersOffset); - } - - /* - * the buffer doesn't contain the section headers, or the alignment is wrong: - * read the headers from the file - */ - if(FileHeaderSize < cbSectionHeadersOffsetSize || - (UINT_PTR)pishSectionHeaders % TYPE_ALIGNMENT(IMAGE_SECTION_HEADER) != 0) - { - PVOID pData; - ULONG cbReadSize; - - lnOffset.QuadPart = cbSectionHeadersOffset; - - /* read the header from the file */ - nStatus = ReadFileCb(File, &lnOffset, cbSectionHeadersSize, &pData, &pBuffer, &cbReadSize); - - if(!NT_SUCCESS(nStatus)) - DIE(("ReadFile failed with status %08X\n", nStatus)); - - ASSERT(pData); - ASSERT(pBuffer); - ASSERT(cbReadSize > 0); - - nStatus = STATUS_INVALID_IMAGE_FORMAT; - - /* the buffer doesn't contain all the section headers */ - if(cbReadSize < cbSectionHeadersSize) - DIE(("The file doesn't contain all of the section headers\n")); - - pishSectionHeaders = pData; - - /* object still not aligned: copy it to the beginning of the buffer */ - if((UINT_PTR)pishSectionHeaders % TYPE_ALIGNMENT(IMAGE_SECTION_HEADER) != 0) - { - ASSERT((UINT_PTR)pBuffer % TYPE_ALIGNMENT(IMAGE_SECTION_HEADER) == 0); - RtlMoveMemory(pBuffer, pData, cbReadSize); - pishSectionHeaders = pBuffer; - } - } - - /* SEGMENTS */ - /* allocate the segments */ - nStatus = STATUS_INSUFFICIENT_RESOURCES; - ImageSectionObject->Segments = AllocateSegmentsCb(ImageSectionObject->NrSegments); - - if(ImageSectionObject->Segments == NULL) - DIE(("AllocateSegments failed\n")); - - /* initialize the headers segment */ - pssSegments = ImageSectionObject->Segments; - -// ASSERT(IsAligned(cbHeadersSize, nFileAlignment)); - - if(!AlignUp(&nFileSizeOfHeaders, cbHeadersSize, nFileAlignment)) - DIE(("Cannot align the size of the section headers\n")); - - if(!AlignUp(&nPrevVirtualEndOfSegment, cbHeadersSize, nSectionAlignment)) - DIE(("Cannot align the size of the section headers\n")); - - pssSegments[0].FileOffset = 0; - pssSegments[0].Protection = PAGE_READONLY; - pssSegments[0].Length = nPrevVirtualEndOfSegment; - pssSegments[0].RawLength = nFileSizeOfHeaders; - pssSegments[0].VirtualAddress = 0; - pssSegments[0].Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA; - pssSegments[0].WriteCopy = TRUE; - - /* skip the headers segment */ - ++ pssSegments; - - nStatus = STATUS_INVALID_IMAGE_FORMAT; - - /* convert the executable sections into segments. See also [1], section 4 */ - for(i = 0; i < ImageSectionObject->NrSegments - 1; ++ i) - { - ULONG nCharacteristics; - - /* validate the alignment */ - if(!IsAligned(pishSectionHeaders[i].VirtualAddress, nSectionAlignment)) - DIE(("VirtualAddress[%u] is not aligned\n", i)); - - /* sections must be contiguous, ordered by base address and non-overlapping */ - if(pishSectionHeaders[i].VirtualAddress != nPrevVirtualEndOfSegment) - DIE(("Memory gap between section %u and the previous\n", i)); - - /* ignore explicit BSS sections */ - if(pishSectionHeaders[i].SizeOfRawData != 0) - { - /* validate the alignment */ -#if 0 - /* Yes, this should be a multiple of FileAlignment, but there's - * stuff out there that isn't. We can cope with that - */ - if(!IsAligned(pishSectionHeaders[i].SizeOfRawData, nFileAlignment)) - DIE(("SizeOfRawData[%u] is not aligned\n", i)); -#endif - -// if(!IsAligned(pishSectionHeaders[i].PointerToRawData, nFileAlignment)) -// DIE(("PointerToRawData[%u] is not aligned\n", i)); - - /* conversion */ - pssSegments[i].FileOffset = pishSectionHeaders[i].PointerToRawData; - pssSegments[i].RawLength = pishSectionHeaders[i].SizeOfRawData; - } - else - { - ASSERT(pssSegments[i].FileOffset == 0); - ASSERT(pssSegments[i].RawLength == 0); - } - - ASSERT(Intsafe_CanAddLong64(pssSegments[i].FileOffset, pssSegments[i].RawLength)); - - nCharacteristics = pishSectionHeaders[i].Characteristics; - - /* no explicit protection */ - if((nCharacteristics & (IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE)) == 0) - { - if(nCharacteristics & IMAGE_SCN_CNT_CODE) - nCharacteristics |= IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ; - - if(nCharacteristics & IMAGE_SCN_CNT_INITIALIZED_DATA) - nCharacteristics |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE; - - if(nCharacteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA) - nCharacteristics |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE; - } - - /* see table above */ - pssSegments[i].Protection = SectionCharacteristicsToProtect[nCharacteristics >> 28]; - pssSegments[i].WriteCopy = !(nCharacteristics & IMAGE_SCN_MEM_SHARED); - - if(pishSectionHeaders[i].Misc.VirtualSize == 0 || pishSectionHeaders[i].Misc.VirtualSize < pishSectionHeaders[i].SizeOfRawData) - pssSegments[i].Length = pishSectionHeaders[i].SizeOfRawData; - else - pssSegments[i].Length = pishSectionHeaders[i].Misc.VirtualSize; - - if(!AlignUp(&pssSegments[i].Length, pssSegments[i].Length, nSectionAlignment)) - DIE(("Cannot align the virtual size of section %u\n", i)); - - ASSERT(IsAligned(pssSegments[i].Length, nSectionAlignment)); - - if(pssSegments[i].Length == 0) - DIE(("Virtual size of section %u is null\n", i)); - - pssSegments[i].VirtualAddress = pishSectionHeaders[i].VirtualAddress; - pssSegments[i].Characteristics = pishSectionHeaders[i].Characteristics; - - /* ensure the memory image is no larger than 4GB */ - if(!Intsafe_AddULong32(&nPrevVirtualEndOfSegment, pssSegments[i].VirtualAddress, pssSegments[i].Length)) - DIE(("The image is larger than 4GB\n")); - } - - /* spare our caller some work in validating the segments */ - *Flags = EXEFMT_LOAD_ASSUME_SEGMENTS_SORTED | EXEFMT_LOAD_ASSUME_SEGMENTS_NO_OVERLAP; - - if(nSectionAlignment >= PAGE_SIZE) - *Flags |= EXEFMT_LOAD_ASSUME_SEGMENTS_PAGE_ALIGNED; - - /* Success */ - nStatus = STATUS_ROS_EXEFMT_LOADED_FORMAT | EXEFMT_LOADED_PE32; - -l_Return: - if(pBuffer) - ExFreePool(pBuffer); - - return nStatus; -} - -/* EOF */ diff --git a/ntoskrnl/mm/ppool.c b/ntoskrnl/mm/ppool.c deleted file mode 100644 index 8b086414fc5..00000000000 --- a/ntoskrnl/mm/ppool.c +++ /dev/null @@ -1,1016 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/mm/ppool.c - * PURPOSE: Implements the paged pool - * - * PROGRAMMERS: David Welch (welch@mcmail.com) - * Royce Mitchell III - */ - -/* INCLUDES *****************************************************************/ - -#include -#define NDEBUG -#include - -#if defined (ALLOC_PRAGMA) -#pragma alloc_text(INIT, MmInitializePagedPool) -#endif - -#undef ASSERT -#define ASSERT(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); DbgBreakPoint(); } - -// enable "magic" -//#define R_MAGIC -#define R_MUTEX FAST_MUTEX -#define R_ACQUIRE_MUTEX(pool) /*DPRINT1("Acquiring PPool Mutex\n");*/ ExAcquireFastMutex(&pool->Mutex) -#define R_RELEASE_MUTEX(pool) /*DPRINT1("Releasing PPool Mutex\n");*/ ExReleaseFastMutex(&pool->Mutex) -#define R_PRINT_ADDRESS(addr) KeRosPrintAddress(addr) -#define R_PANIC() KeBugCheck(MEMORY_MANAGEMENT) -#define R_DEBUG DbgPrint - -#ifdef _ARM_ -#define R_GET_STACK_FRAMES(ptr,cnt) -#else -#define R_GET_STACK_FRAMES(ptr,cnt) RtlWalkFrameChain((PVOID*)ptr,cnt, 0) -#endif - -/* GLOBALS ********************************************************************/ - -typedef unsigned long rulong; - -#define R_IS_POOL_PTR(pool,ptr) (((void*)(ULONG_PTR)(ptr) >= pool->UserBase) && ((ULONG_PTR)(ptr) < ((ULONG_PTR)pool->UserBase + pool->UserSize))) -#define R_ASSERT_PTR(pool,ptr) ASSERT( R_IS_POOL_PTR(pool,ptr) ) -#define R_ASSERT_SIZE(pool,sz) ASSERT( sz > (sizeof(R_USED)+2*R_RZ) && sz >= sizeof(R_FREE) && sz < pool->UserSize ) - -#ifndef R_ROUND_UP -#define R_ROUND_UP(x,s) ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1))) -#endif//R_ROUND_UP - -#ifndef R_ROUND_DOWN -#define R_ROUND_DOWN(x,s) ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1))) -#endif//R_ROUND_DOWN - -#ifndef R_QUEMIN -// R_QUEMIN is the minimum number of entries to keep in a que -#define R_QUEMIN 0 -#endif//R_QUEMIN - -#ifndef R_QUECOUNT -// 16, 32, 64, 128, 256, 512 -#define R_QUECOUNT 6 -#endif//R_QUECOUNT - -#ifndef R_RZ -// R_RZ is the redzone size -#define R_RZ 4 -#endif//R_RZ - -#ifndef R_RZ_LOVALUE -#define R_RZ_LOVALUE 0x87 -#endif//R_RZ_LOVALUE - -#ifndef R_RZ_HIVALUE -#define R_RZ_HIVALUE 0xA5 -#endif//R_RZ_HIVALUE - -#ifndef R_STACK -// R_STACK is the number of stack entries to store in blocks for debug purposes -#define R_STACK 6 -#else // R_STACK -#if R_STACK > 0 && R_STACK < 6 -/* Increase the frame depth to get a reasonable back trace */ -#undef R_STACK -#define R_STACK 6 -#endif // R_STACK > 0 && R_STACK < 6 -#endif//R_STACK - -#ifndef R_TAG -// R_TAG do we keep track of tags on a per-memory block basis? -#define R_TAG 0 -#endif//R_TAG - -#ifdef R_MAGIC -# ifndef R_FREE_MAGIC -# define R_FREE_MAGIC (rulong)(('F'<<0) + ('r'<<8) + ('E'<<16) + ('e'<<24)) -# endif//R_FREE_MAGIC -# ifndef R_USED_MAGIC -# define R_USED_MAGIC (rulong)(('u'<<0) + ('S'<<8) + ('e'<<16) + ('D'<<24)) -# endif//R_USED_MAGIC -#endif//R_MAGIC - -// **IMPORTANT NOTE** Magic, PrevSize, Size and Status must be at same offset -// in both the R_FREE and R_USED structures - -typedef struct _R_FREE -{ -#ifdef R_MAGIC - rulong FreeMagic; -#endif//R_MAGIC - rulong PrevSize : 30; - rulong Status : 2; - rulong Size; -#if R_STACK - ULONG_PTR LastOwnerStack[R_STACK]; -#endif//R_STACK - struct _R_FREE* NextFree; - struct _R_FREE* PrevFree; -} -R_FREE, *PR_FREE; - -typedef struct _R_USED -{ -#ifdef R_MAGIC - rulong UsedMagic; -#endif//R_MAGIC - rulong PrevSize : 30; - rulong Status : 2; - rulong Size; -#if R_STACK - ULONG_PTR LastOwnerStack[R_STACK]; -#endif//R_STACK - struct _R_USED* NextUsed; -#if R_RZ - rulong UserSize; // how many bytes the user actually asked for... -#endif//R_RZ - rulong Tag; -} -R_USED, *PR_USED; - -typedef struct _R_QUE -{ - rulong Count; - PR_USED First, Last; -} -R_QUE, *PR_QUE; - -typedef struct _R_POOL -{ - void* PoolBase; - rulong PoolSize; - void* UserBase; - rulong UserSize; - rulong Alignments[3]; - PR_FREE FirstFree, LastFree; - R_QUE Que[R_QUECOUNT][3]; - R_MUTEX Mutex; -} -R_POOL, *PR_POOL; - -PVOID MmPagedPoolBase; -SIZE_T MmPagedPoolSize; -SIZE_T MmTotalPagedPoolQuota = 0; // TODO FIXME commented out until we use it -static PR_POOL MmPagedPool = NULL; - -/* FUNCTIONS*******************************************************************/ - -#if !R_STACK -#define RiPrintLastOwner(Block) -#else -static void -RiPrintLastOwner ( PR_USED Block ) -{ - int i; - for ( i = 0; i < R_STACK; i++ ) - { - if ( Block->LastOwnerStack[i] != 0xDEADBEEF ) - { - R_DEBUG(" "); - //if (!R_PRINT_ADDRESS ((PVOID)Block->LastOwnerStack[i]) ) - { - R_DEBUG("<%X>", Block->LastOwnerStack[i] ); - } - } - } -} -#endif//R_STACK - -static int -RQueWhich ( rulong size ) -{ - rulong que, quesize; - for ( que=0, quesize=16; que < R_QUECOUNT; que++, quesize<<=1 ) - { - if ( quesize >= size ) - { - return que; - } - } - return -1; -} - -static void -RQueInit ( PR_QUE que ) -{ - que->Count = 0; - que->First = NULL; - que->Last = NULL; -} - -static void -RQueAdd ( PR_QUE que, PR_USED Item ) -{ - ASSERT(Item); - Item->Status = 2; - Item->NextUsed = NULL; - ++que->Count; - if ( !que->Last ) - { - que->First = que->Last = Item; - return; - } - ASSERT(!que->Last->NextUsed); - que->Last->NextUsed = Item; - que->Last = Item; -} - -static PR_USED -RQueRemove ( PR_QUE que ) -{ - PR_USED Item; -#if R_QUEMIN - if ( que->count < R_QUEMIN ) - return NULL; -#endif - if ( !que->First ) - return NULL; - Item = que->First; - que->First = Item->NextUsed; - if ( !--que->Count ) - { - ASSERT ( !que->First ); - que->Last = NULL; - } - Item->Status = 0; - return Item; -} - -static void -RPoolAddFree ( PR_POOL pool, PR_FREE Item ) -{ - ASSERT(pool); - ASSERT(Item); - if ( !pool->FirstFree ) - { - pool->FirstFree = pool->LastFree = Item; - Item->NextFree = NULL; - } - else - { - pool->FirstFree->PrevFree = Item; - Item->NextFree = pool->FirstFree; - pool->FirstFree = Item; - } - Item->PrevFree = NULL; -} - -static void -RPoolRemoveFree ( PR_POOL pool, PR_FREE Item ) -{ - ASSERT(pool); - ASSERT(Item); - if ( Item->NextFree ) - Item->NextFree->PrevFree = Item->PrevFree; - else - { - ASSERT ( pool->LastFree == Item ); - pool->LastFree = Item->PrevFree; - } - if ( Item->PrevFree ) - Item->PrevFree->NextFree = Item->NextFree; - else - { - ASSERT ( pool->FirstFree == Item ); - pool->FirstFree = Item->NextFree; - } -#if DBG - Item->NextFree = Item->PrevFree = (PR_FREE)(ULONG_PTR)0xDEADBEEF; -#endif//DBG -} - -#if !R_STACK -#define RFreeFillStack(free) -#define RUsedFillStack(used) -#else -static void -RFreeFillStack ( PR_FREE free ) -{ - int i; - ULONG stack[R_STACK+3]; // need to skip 3 known levels of stack trace - memset ( stack, 0xCD, sizeof(stack) ); - R_GET_STACK_FRAMES ( stack, R_STACK+3 ); - for ( i = 0; i < R_STACK; i++ ) - free->LastOwnerStack[i] = stack[i+3]; -} - -static void -RUsedFillStack ( PR_USED used ) -{ - int i; - ULONG stack[R_STACK+2]; // need to skip 2 known levels of stack trace - memset ( stack, 0xCD, sizeof(stack) ); - R_GET_STACK_FRAMES ( stack, R_STACK+2 ); - for ( i = 0; i < R_STACK; i++ ) - used->LastOwnerStack[i] = stack[i+2]; -} -#endif - -static PR_FREE -RFreeInit ( void* memory ) -{ - PR_FREE block = (PR_FREE)memory; -#if R_FREEMAGIC - block->FreeMagic = R_FREE_MAGIC; -#endif//R_FREEMAGIC - block->Status = 0; - RFreeFillStack ( block ); -#if DBG - block->PrevFree = block->NextFree = (PR_FREE)(ULONG_PTR)0xDEADBEEF; -#endif//DBG - return block; -} - -PR_POOL -RPoolInit ( void* PoolBase, rulong PoolSize, int align1, int align2, int align3 ) -{ - int align, que; - PR_POOL pool = (PR_POOL)PoolBase; - - pool->PoolBase = PoolBase; - pool->PoolSize = PoolSize; - pool->UserBase = (char*)pool->PoolBase + sizeof(R_POOL); - pool->UserSize = PoolSize - sizeof(R_POOL); - pool->Alignments[0] = align1; - pool->Alignments[1] = align2; - pool->Alignments[2] = align3; - pool->FirstFree = pool->LastFree = NULL; - - RPoolAddFree ( pool, - RFreeInit ( pool->UserBase )); - - pool->FirstFree->PrevSize = 0; - pool->FirstFree->Size = pool->UserSize; - - for ( que = 0; que < R_QUECOUNT; que++ ) - { - for ( align = 0; align < 3; align++ ) - { - RQueInit ( &pool->Que[que][align] ); - } - } - return pool; -} - -#if R_RZ -static const char* -RFormatTag ( rulong Tag, char* buf ) -{ - int i; - *(rulong*)&buf[0] = Tag; - buf[4] = 0; - for ( i = 0; i < 4; i++ ) - { - if ( !buf[i] ) - buf[i] = ' '; - } - return buf; -} -#endif - -#if !R_RZ -#define RUsedRedZoneCheck(pUsed,Addr,file,line, printzone) -#else//R_RZ -static void -RiBadBlock ( PR_USED pUsed, char* Addr, const char* violation, const char* file, int line, int printzone ) -{ - char tag[5]; - unsigned int i; - - R_DEBUG("%s(%i): %s detected for paged pool address 0x%x\n", - file, line, violation, Addr ); - -#ifdef R_MAGIC - R_DEBUG ( "UsedMagic 0x%x, ", pUsed->UsedMagic ); -#endif//R_MAGIC - R_DEBUG ( "Tag %s(%X), Size %i, UserSize %i", - RFormatTag(pUsed->Tag,tag), - pUsed->Tag, - pUsed->Size, - pUsed->UserSize ); - - if ( printzone ) - { - unsigned char* HiZone = (unsigned char*)Addr + pUsed->UserSize; - unsigned char* LoZone = (unsigned char*)Addr - R_RZ; // this is to simplify indexing below... - R_DEBUG ( ", LoZone " ); - for ( i = 0; i < R_RZ; i++ ) - R_DEBUG ( "%02x", LoZone[i] ); - R_DEBUG ( ", HiZone " ); - for ( i = 0; i < R_RZ; i++ ) - R_DEBUG ( "%02x", HiZone[i] ); - } - R_DEBUG ( "\n" ); - - R_DEBUG ( "First few Stack Frames:" ); - RiPrintLastOwner ( pUsed ); - R_DEBUG ( "\n" ); - - R_DEBUG ( "Contents of Block:\n" ); - for ( i = 0; i < 8*16 && i < pUsed->UserSize; i += 16 ) - { - int j; - R_DEBUG ( "%04X ", i ); - for ( j = 0; j < 16; j++ ) - { - if ( i+j < pUsed->UserSize ) - { - R_DEBUG ( "%02X ", (unsigned)(unsigned char)Addr[i+j] ); - } - else - { - R_DEBUG ( " " ); - } - } - R_DEBUG(" "); - for ( j = 0; j < 16; j++ ) - { - if ( i+j < pUsed->UserSize ) - { - char c = Addr[i+j]; - if ( c < 0x20 || c > 0x7E ) - c = '.'; - R_DEBUG ( "%c", c ); - } - else - { - R_DEBUG ( " " ); - } - } - R_DEBUG("\n"); - } - R_PANIC(); -} -static void -RUsedRedZoneCheck ( PR_POOL pool, PR_USED pUsed, char* Addr, const char* file, int line ) -{ - int i; - unsigned char *LoZone, *HiZone; - int bLow = 1; - int bHigh = 1; - - ASSERT ( Addr >= (char*)pool->UserBase && Addr < ((char*)pool->UserBase + pool->UserSize - 16) ); -#ifdef R_MAGIC - if ( pUsed->UsedMagic == R_FREE_MAGIC ) - { - pUsed->UserSize = 0; // just to keep from confusion, MmpBadBlock() doesn't return... - RiBadBlock ( pUsed, Addr, "double-free", file, line, 0 ); - } - if ( pUsed->UsedMagic != R_USED_MAGIC ) - { - RiBadBlock ( pUsed, Addr, "bad magic", file, line, 0 ); - } -#endif//R_MAGIC - switch ( pUsed->Status ) - { - case 0: // freed into main pool - case 2: // in ques - RiBadBlock ( pUsed, Addr, "double-free", file, line, 0 ); - // no need for break here - RiBadBlock doesn't return - case 1: // allocated - this is okay - break; - default: - RiBadBlock ( pUsed, Addr, "corrupt status", file, line, 0 ); - } - if ( pUsed->Status != 1 ) - { - RiBadBlock ( pUsed, Addr, "double-free", file, line, 0 ); - } - if ( pUsed->Size > pool->PoolSize || pUsed->Size == 0 ) - { - RiBadBlock ( pUsed, Addr, "invalid size", file, line, 0 ); - } - if ( pUsed->UserSize > pool->PoolSize || pUsed->UserSize == 0 ) - { - RiBadBlock ( pUsed, Addr, "invalid user size", file, line, 0 ); - } - HiZone = (unsigned char*)Addr + pUsed->UserSize; - LoZone = (unsigned char*)Addr - R_RZ; // this is to simplify indexing below... - for ( i = 0; i < R_RZ && bLow && bHigh; i++ ) - { - bLow = bLow && ( LoZone[i] == R_RZ_LOVALUE ); - bHigh = bHigh && ( HiZone[i] == R_RZ_HIVALUE ); - } - if ( !bLow || !bHigh ) - { - const char* violation = "High and Low-side redzone overwrite"; - if ( bHigh ) // high is okay, so it was just low failed - violation = "Low-side redzone overwrite"; - else if ( bLow ) // low side is okay, so it was just high failed - violation = "High-side redzone overwrite"; - RiBadBlock ( pUsed, Addr, violation, file, line, 1 ); - } -} -#endif//R_RZ - -PR_FREE -RPreviousBlock ( PR_FREE Block ) -{ - if ( Block->PrevSize > 0 ) - return (PR_FREE)( (char*)Block - Block->PrevSize ); - return NULL; -} - -PR_FREE -RNextBlock ( PR_POOL pool, PR_FREE Block ) -{ - PR_FREE NextBlock = (PR_FREE)( (char*)Block + Block->Size ); - if ( (char*)NextBlock >= (char*)pool->UserBase + pool->UserSize ) - NextBlock = NULL; - return NextBlock; -} - -static __inline void* -RHdrToBody ( void* blk ) -/* - * FUNCTION: Translate a block header address to the corresponding block - * address (internal) - */ -{ - return ( (void *) ((char*)blk + sizeof(R_USED) + R_RZ) ); -} - -static __inline PR_USED -RBodyToHdr ( void* addr ) -{ - return (PR_USED) - ( ((char*)addr) - sizeof(R_USED) - R_RZ ); -} - -static int -RiInFreeChain ( PR_POOL pool, PR_FREE Block ) -{ - PR_FREE Free; - Free = pool->FirstFree; - if ( Free == Block ) - return 1; - while ( Free != Block ) - { - Free = Free->NextFree; - if ( !Free ) - return 0; - } - return 1; -} - -static void -RPoolRedZoneCheck ( PR_POOL pool, const char* file, int line ) -{ - { - PR_USED Block = (PR_USED)pool->UserBase; - PR_USED NextBlock; - - for ( ;; ) - { - switch ( Block->Status ) - { - case 0: // block is in chain - ASSERT ( RiInFreeChain ( pool, (PR_FREE)Block ) ); - break; - case 1: // block is allocated - RUsedRedZoneCheck ( pool, Block, RHdrToBody(Block), file, line ); - break; - case 2: // block is in que - // nothing to verify here yet - break; - default: - ASSERT ( !"invalid status in memory block found in pool!" ); - } - NextBlock = (PR_USED)RNextBlock(pool,(PR_FREE)Block); - if ( !NextBlock ) - break; - ASSERT ( NextBlock->PrevSize == Block->Size ); - Block = NextBlock; - } - } - { - // now let's step through the list of free pointers and verify - // each one can be found by size-jumping... - PR_FREE Free = (PR_FREE)pool->FirstFree; - while ( Free ) - { - PR_FREE NextFree = (PR_FREE)pool->UserBase; - if ( Free != NextFree ) - { - while ( NextFree != Free ) - { - NextFree = RNextBlock ( pool, NextFree ); - ASSERT(NextFree); - } - } - Free = Free->NextFree; - } - } -} - -static void -RSetSize ( PR_POOL pool, PR_FREE Block, rulong NewSize, PR_FREE NextBlock ) -{ - R_ASSERT_PTR(pool,Block); - ASSERT ( NewSize < pool->UserSize ); - ASSERT ( NewSize >= sizeof(R_FREE) ); - Block->Size = NewSize; - if ( !NextBlock ) - NextBlock = RNextBlock ( pool, Block ); - if ( NextBlock ) - NextBlock->PrevSize = NewSize; -} - -static PR_FREE -RFreeSplit ( PR_POOL pool, PR_FREE Block, rulong NewSize ) -{ - PR_FREE NewBlock = (PR_FREE)((char*)Block + NewSize); - RSetSize ( pool, NewBlock, Block->Size - NewSize, NULL ); - RSetSize ( pool, Block, NewSize, NewBlock ); - RFreeInit ( NewBlock ); - RPoolAddFree ( pool, NewBlock ); - return NewBlock; -} - -static void -RFreeMerge ( PR_POOL pool, PR_FREE First, PR_FREE Second ) -{ - ASSERT ( RPreviousBlock(Second) == First ); - ASSERT ( First->Size == Second->PrevSize ); - RPoolRemoveFree ( pool, Second ); - RSetSize ( pool, First, First->Size + Second->Size, NULL ); -} - -static void -RPoolReclaim ( PR_POOL pool, PR_FREE FreeBlock ) -{ - PR_FREE NextBlock, PreviousBlock; - - RFreeInit ( FreeBlock ); - RPoolAddFree ( pool, FreeBlock ); - - // TODO FIXME - don't merge and always insert freed blocks at the end for debugging purposes... - - /* - * If the next block is immediately adjacent to the newly freed one then - * merge them. - * PLEASE DO NOT WIPE OUT 'MAGIC' OR 'LASTOWNER' DATA FOR MERGED FREE BLOCKS - */ - NextBlock = RNextBlock ( pool, FreeBlock ); - if ( NextBlock != NULL && !NextBlock->Status ) - { - RFreeMerge ( pool, FreeBlock, NextBlock ); - } - - /* - * If the previous block is adjacent to the newly freed one then - * merge them. - * PLEASE DO NOT WIPE OUT 'MAGIC' OR 'LASTOWNER' DATA FOR MERGED FREE BLOCKS - */ - PreviousBlock = RPreviousBlock ( FreeBlock ); - if ( PreviousBlock != NULL && !PreviousBlock->Status ) - { - RFreeMerge ( pool, PreviousBlock, FreeBlock ); - } -} - -static void -RiUsedInit ( PR_USED Block, rulong Tag ) -{ - Block->Status = 1; - RUsedFillStack ( Block ); -#ifdef R_MAGIC - Block->UsedMagic = R_USED_MAGIC; -#endif//R_MAGIC - //ASSERT_SIZE ( Block->Size ); - - // now add the block to the used block list -#if DBG - Block->NextUsed = (PR_USED)(ULONG_PTR)0xDEADBEEF; -#endif//R_USED_LIST - - Block->Tag = Tag; -} - -#if !R_RZ -#define RiUsedInitRedZone(Block,UserSize) -#else//R_RZ -static void -RiUsedInitRedZone ( PR_USED Block, rulong UserSize ) -{ - // write out buffer-overrun detection bytes - char* Addr = (char*)RHdrToBody(Block); - Block->UserSize = UserSize; - memset ( Addr - R_RZ, R_RZ_LOVALUE, R_RZ ); - memset ( Addr + Block->UserSize, R_RZ_HIVALUE, R_RZ ); -#if DBG - memset ( Addr, 0xCD, UserSize ); -#endif//DBG -} -#endif//R_RZ - -static void* -RPoolAlloc ( PR_POOL pool, rulong NumberOfBytes, rulong Tag, rulong align ) -{ - PR_USED NewBlock; - PR_FREE BestBlock, - CurrentBlock; - void* BestAlignedAddr; - int que, - queBytes = NumberOfBytes; - rulong BlockSize, - Alignment; - int que_reclaimed = 0; - - ASSERT ( pool ); - ASSERT ( align < 3 ); - - R_ACQUIRE_MUTEX(pool); - - if ( !NumberOfBytes ) - { - R_DEBUG("0 bytes requested - initiating pool verification\n"); - RPoolRedZoneCheck ( pool, __FILE__, __LINE__ ); - R_RELEASE_MUTEX(pool); - return NULL; - } - if ( NumberOfBytes > pool->PoolSize ) - { - if ( R_IS_POOL_PTR(pool,NumberOfBytes) ) - { - R_DEBUG("red zone verification requested for block 0x%X\n", NumberOfBytes ); - RUsedRedZoneCheck(pool,RBodyToHdr((void*)(ULONG_PTR)NumberOfBytes), (char*)(ULONG_PTR)NumberOfBytes, __FILE__, __LINE__ ); - R_RELEASE_MUTEX(pool); - return NULL; - } - R_DEBUG("Invalid allocation request: %i bytes\n", NumberOfBytes ); - R_RELEASE_MUTEX(pool); - return NULL; - } - - que = RQueWhich ( NumberOfBytes ); - if ( que >= 0 ) - { - if ( (NewBlock = RQueRemove ( &pool->Que[que][align] )) ) - { - RiUsedInit ( NewBlock, Tag ); - RiUsedInitRedZone ( NewBlock, NumberOfBytes ); - R_RELEASE_MUTEX(pool); - return RHdrToBody(NewBlock); - } - queBytes = 16 << que; - } - - /* - * Calculate the total number of bytes we will need. - */ - BlockSize = queBytes + sizeof(R_USED) + 2*R_RZ; - if (BlockSize < sizeof(R_FREE)) - { - /* At least we need the size of the free block header. */ - BlockSize = sizeof(R_FREE); - } - -try_again: - /* - * Find the best-fitting block. - */ - BestBlock = NULL; - Alignment = pool->Alignments[align]; - CurrentBlock = pool->FirstFree; - BestAlignedAddr = NULL; - - while ( CurrentBlock != NULL ) - { - PVOID Addr = RHdrToBody(CurrentBlock); - PVOID CurrentBlockEnd = (char*)CurrentBlock + CurrentBlock->Size; - /* calculate last size-aligned address available within this block */ - PVOID AlignedAddr = R_ROUND_DOWN((char*)CurrentBlockEnd-queBytes-R_RZ, Alignment); - ASSERT ( (char*)AlignedAddr+queBytes+R_RZ <= (char*)CurrentBlockEnd ); - - /* special case, this address is already size-aligned, and the right size */ - if ( Addr == AlignedAddr ) - { - BestAlignedAddr = AlignedAddr; - BestBlock = CurrentBlock; - break; - } - // if we carve out a size-aligned block... is it still past the end of this - // block's free header? - else if ( (char*)RBodyToHdr(AlignedAddr) - >= (char*)CurrentBlock+sizeof(R_FREE) ) - { - /* - * there's enough room to allocate our size-aligned memory out - * of this block, see if it's a better choice than any previous - * finds - */ - if ( BestBlock == NULL - || BestBlock->Size > CurrentBlock->Size ) - { - BestAlignedAddr = AlignedAddr; - BestBlock = CurrentBlock; - } - } - - CurrentBlock = CurrentBlock->NextFree; - } - - /* - * We didn't find anything suitable at all. - */ - if (BestBlock == NULL) - { - if ( !que_reclaimed ) - { - // reclaim que - int i, j; - for ( i = 0; i < R_QUECOUNT; i++ ) - { - for ( j = 0; j < 3; j++ ) - { - while ( (BestBlock = (PR_FREE)RQueRemove ( &pool->Que[i][j] )) ) - { - RPoolReclaim ( pool, BestBlock ); - } - } - } - - que_reclaimed = 1; - goto try_again; - } - DPRINT1("Trying to allocate %lu bytes from paged pool - nothing suitable found, returning NULL\n", - queBytes ); - R_RELEASE_MUTEX(pool); - return NULL; - } - /* - * we found a best block. If Addr isn't already aligned, we've pre-qualified that - * there's room at the beginning of the block for a free block... - */ - { - void* Addr = RHdrToBody(BestBlock); - if ( BestAlignedAddr != Addr ) - { - PR_FREE NewFreeBlock = RFreeSplit ( - pool, - BestBlock, - (char*)RBodyToHdr(BestAlignedAddr) - (char*)BestBlock ); - ASSERT ( BestAlignedAddr > Addr ); - - //DPRINT ( "breaking off preceding bytes into their own block...\n" ); - /*DPRINT ( "NewFreeBlock 0x%x Size %lu (Old Block's new size %lu) NextFree 0x%x\n", - NewFreeBlock, NewFreeBlock->Size, BestBlock->Size, BestBlock->NextFree );*/ - - /* we want the following code to use our size-aligned block */ - BestBlock = NewFreeBlock; - - //VerifyPagedPool(); - } - } - /* - * Is there enough space to create a second block from the unused portion. - */ - if ( (BestBlock->Size - BlockSize) > sizeof(R_FREE) ) - { - /*DPRINT("BestBlock 0x%x Size 0x%x BlockSize 0x%x NewSize 0x%x\n", - BestBlock, BestBlock->Size, BlockSize, NewSize );*/ - - /* - * Create the new free block. - */ - RFreeSplit ( pool, BestBlock, BlockSize ); - //ASSERT_SIZE ( NextBlock->Size ); - } - /* - * Remove the selected block from the list of free blocks. - */ - //DPRINT ( "Removing selected block from free block list\n" ); - RPoolRemoveFree ( pool, BestBlock ); - /* - * Create the new used block header. - */ - NewBlock = (PR_USED)BestBlock; - RiUsedInit ( NewBlock, Tag ); - - /* RtlZeroMemory(RHdrToBody(NewBlock), NumberOfBytes);*/ - - RiUsedInitRedZone ( NewBlock, NumberOfBytes ); - R_RELEASE_MUTEX(pool); - - return RHdrToBody(NewBlock); -} - -static void -RPoolFree ( PR_POOL pool, void* Addr ) -{ - PR_USED UsedBlock; -#if !R_RZ - rulong UsedSize; -#endif - PR_FREE FreeBlock; - rulong UserSize; - int que; - - ASSERT(pool); - if ( !Addr ) - { - R_DEBUG("Attempt to free NULL ptr, initiating Red Zone Check\n" ); - R_ACQUIRE_MUTEX(pool); - RPoolRedZoneCheck ( pool, __FILE__, __LINE__ ); - R_RELEASE_MUTEX(pool); - return; - } - R_ASSERT_PTR(pool,Addr); - - UsedBlock = RBodyToHdr(Addr); - FreeBlock = (PR_FREE)UsedBlock; -#if R_RZ - UserSize = UsedBlock->UserSize; -#else - UsedSize = UsedBlock->Size; - UserSize = UsedSize - sizeof(R_USED) - 2*R_RZ; -#endif//R_RZ - - RUsedRedZoneCheck ( pool, UsedBlock, Addr, __FILE__, __LINE__ ); - -#if R_RZ - memset ( Addr, 0xCD, UsedBlock->UserSize ); -#endif - - que = RQueWhich ( UserSize ); - if ( que >= 0 ) - { - int queBytes = 16 << que; - ASSERT( (rulong)queBytes >= UserSize ); - if ( que >= 0 ) - { - int align = 0; - if ( R_ROUND_UP(Addr,pool->Alignments[2]) == Addr ) - align = 2; - else if ( R_ROUND_UP(Addr,pool->Alignments[1]) == Addr ) - align = 1; - R_ACQUIRE_MUTEX(pool); - RQueAdd ( &pool->Que[que][align], UsedBlock ); - R_RELEASE_MUTEX(pool); - return; - } - } - - R_ACQUIRE_MUTEX(pool); - RPoolReclaim ( pool, FreeBlock ); - R_RELEASE_MUTEX(pool); -} - -VOID -INIT_FUNCTION -NTAPI -MmInitializePagedPool(VOID) -{ - /* - * We are still at a high IRQL level at this point so explicitly commit - * the first page of the paged pool before writing the first block header. - */ - MmCommitPagedPoolAddress ( (PVOID)MmPagedPoolBase, FALSE ); - - MmPagedPool = RPoolInit ( MmPagedPoolBase, - MmPagedPoolSize, - MM_POOL_ALIGNMENT, - MM_CACHE_LINE_SIZE, - PAGE_SIZE ); - - ExInitializeFastMutex(&MmPagedPool->Mutex); -} - -PVOID NTAPI -ExAllocatePagedPoolWithTag (IN POOL_TYPE PoolType, - IN ULONG NumberOfBytes, - IN ULONG Tag) -{ - int align; - - if ( NumberOfBytes >= PAGE_SIZE ) - align = 2; - else if ( PoolType & CACHE_ALIGNED_POOL_MASK ) - align = 1; - else - align = 0; - - ASSERT_IRQL_LESS_OR_EQUAL(APC_LEVEL); - - return RPoolAlloc ( MmPagedPool, NumberOfBytes, Tag, align ); -} - -VOID NTAPI -ExFreePagedPool(IN PVOID Block) -{ - ASSERT_IRQL_LESS_OR_EQUAL(APC_LEVEL); - RPoolFree ( MmPagedPool, Block ); -} - -/* EOF */ diff --git a/ntoskrnl/mm/procsup.c b/ntoskrnl/mm/procsup.c deleted file mode 100644 index 7ed23748dc6..00000000000 --- a/ntoskrnl/mm/procsup.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/mm/procsup.c - * PURPOSE: Memory functions related to Processes - * - * PROGRAMMERS: Alex Ionescu (alex@relsoft.net) - */ - -/* INCLUDES *****************************************************************/ - -#include -#define NDEBUG -#include - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -NTAPI -MmDeleteProcessAddressSpace(PEPROCESS Process) -{ - PVOID Address; - PMEMORY_AREA MemoryArea; - - DPRINT("MmDeleteProcessAddressSpace(Process %x (%s))\n", Process, - Process->ImageFileName); - - RemoveEntryList(&Process->MmProcessLinks); - - MmLockAddressSpace(&Process->Vm); - - while ((MemoryArea = (PMEMORY_AREA)Process->Vm.WorkingSetExpansionLinks.Flink) != NULL) - { - switch (MemoryArea->Type) - { - case MEMORY_AREA_SECTION_VIEW: - Address = (PVOID)MemoryArea->StartingAddress; - MmUnlockAddressSpace(&Process->Vm); - MmUnmapViewOfSection(Process, Address); - MmLockAddressSpace(&Process->Vm); - break; - - case MEMORY_AREA_VIRTUAL_MEMORY: - MmFreeVirtualMemory(Process, MemoryArea); - break; - - case MEMORY_AREA_OWNED_BY_ARM3: - MmFreeMemoryArea(&Process->Vm, - MemoryArea, - NULL, - NULL); - break; - - default: - KeBugCheck(MEMORY_MANAGEMENT); - } - } - - MmUnlockAddressSpace(&Process->Vm); - - DPRINT("Finished MmReleaseMmInfo()\n"); - return(STATUS_SUCCESS); -} - diff --git a/ntoskrnl/mm/rmap.c b/ntoskrnl/mm/rmap.c index 35b4b576342..aa2f96ee3b4 100644 --- a/ntoskrnl/mm/rmap.c +++ b/ntoskrnl/mm/rmap.c @@ -19,17 +19,6 @@ /* TYPES ********************************************************************/ -typedef struct _MM_RMAP_ENTRY -{ - struct _MM_RMAP_ENTRY* Next; - PEPROCESS Process; - PVOID Address; -#if DBG - PVOID Caller; -#endif -} -MM_RMAP_ENTRY, *PMM_RMAP_ENTRY; - /* GLOBALS ******************************************************************/ static FAST_MUTEX RmapListLock; @@ -52,140 +41,6 @@ MmInitializeRmapList(VOID) 50); } -NTSTATUS -NTAPI -MmWritePagePhysicalAddress(PFN_NUMBER Page) -{ - PMM_RMAP_ENTRY entry; - PMEMORY_AREA MemoryArea; - PMMSUPPORT AddressSpace; - ULONG Type; - PVOID Address; - PEPROCESS Process; - PMM_PAGEOP PageOp; - ULONG Offset; - NTSTATUS Status = STATUS_SUCCESS; - - /* - * Check that the address still has a valid rmap; then reference the - * process so it isn't freed while we are working. - */ - ExAcquireFastMutex(&RmapListLock); - entry = MmGetRmapListHeadPage(Page); - if (entry == NULL) - { - ExReleaseFastMutex(&RmapListLock); - return(STATUS_UNSUCCESSFUL); - } - Process = entry->Process; - Address = entry->Address; - if ((((ULONG_PTR)Address) & 0xFFF) != 0) - { - KeBugCheck(MEMORY_MANAGEMENT); - } - if (Address < MmSystemRangeStart) - { - Status = ObReferenceObjectByPointer(Process, PROCESS_ALL_ACCESS, NULL, KernelMode); - ExReleaseFastMutex(&RmapListLock); - if (!NT_SUCCESS(Status)) - { - return Status; - } - AddressSpace = &Process->Vm; - } - else - { - ExReleaseFastMutex(&RmapListLock); - AddressSpace = MmGetKernelAddressSpace(); - } - - /* - * Lock the address space; then check that the address we are using - * still corresponds to a valid memory area (the page might have been - * freed or paged out after we read the rmap entry.) - */ - MmLockAddressSpace(AddressSpace); - MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, Address); - if (MemoryArea == NULL || MemoryArea->DeleteInProgress) - { - MmUnlockAddressSpace(AddressSpace); - if (Address < MmSystemRangeStart) - { - ObDereferenceObject(Process); - } - return(STATUS_UNSUCCESSFUL); - } - - Type = MemoryArea->Type; - if (Type == MEMORY_AREA_SECTION_VIEW) - { - Offset = (ULONG_PTR)Address - (ULONG_PTR)MemoryArea->StartingAddress - + MemoryArea->Data.SectionData.ViewOffset; - /* - * Get or create a pageop - */ - PageOp = MmGetPageOp(MemoryArea, NULL, 0, - MemoryArea->Data.SectionData.Segment, - Offset, MM_PAGEOP_PAGEOUT, TRUE); - - if (PageOp == NULL) - { - MmUnlockAddressSpace(AddressSpace); - if (Address < MmSystemRangeStart) - { - ObDereferenceObject(Process); - } - return(STATUS_UNSUCCESSFUL); - } - - /* - * Release locks now we have a page op. - */ - MmUnlockAddressSpace(AddressSpace); - - /* - * Do the actual page out work. - */ - Status = MmWritePageSectionView(AddressSpace, MemoryArea, - Address, PageOp); - } - else if (Type == MEMORY_AREA_VIRTUAL_MEMORY) - { - PageOp = MmGetPageOp(MemoryArea, Address < MmSystemRangeStart ? Process->UniqueProcessId : NULL, - Address, NULL, 0, MM_PAGEOP_PAGEOUT, TRUE); - - if (PageOp == NULL) - { - MmUnlockAddressSpace(AddressSpace); - if (Address < MmSystemRangeStart) - { - ObDereferenceObject(Process); - } - return(STATUS_UNSUCCESSFUL); - } - - /* - * Release locks now we have a page op. - */ - MmUnlockAddressSpace(AddressSpace); - - /* - * Do the actual page out work. - */ - Status = MmWritePageVirtualMemory(AddressSpace, MemoryArea, - Address, PageOp); - } - else - { - KeBugCheck(MEMORY_MANAGEMENT); - } - if (Address < MmSystemRangeStart) - { - ObDereferenceObject(Process); - } - return(Status); -} - NTSTATUS NTAPI MmPageOutPhysicalAddress(PFN_NUMBER Page) @@ -208,6 +63,7 @@ MmPageOutPhysicalAddress(PFN_NUMBER Page) return(STATUS_UNSUCCESSFUL); } Process = entry->Process; + Address = entry->Address; if ((((ULONG_PTR)Address) & 0xFFF) != 0) { @@ -216,10 +72,17 @@ MmPageOutPhysicalAddress(PFN_NUMBER Page) if (Address < MmSystemRangeStart) { + if (!ExAcquireRundownProtection(&Process->RundownProtect)) + { + ExReleaseFastMutex(&RmapListLock); + return STATUS_PROCESS_IS_TERMINATING; + } + Status = ObReferenceObjectByPointer(Process, PROCESS_ALL_ACCESS, NULL, KernelMode); ExReleaseFastMutex(&RmapListLock); if (!NT_SUCCESS(Status)) { + ExReleaseRundownProtection(&Process->RundownProtect); return Status; } AddressSpace = &Process->Vm; @@ -237,6 +100,7 @@ MmPageOutPhysicalAddress(PFN_NUMBER Page) MmUnlockAddressSpace(AddressSpace); if (Address < MmSystemRangeStart) { + ExReleaseRundownProtection(&Process->RundownProtect); ObDereferenceObject(Process); } return(STATUS_UNSUCCESSFUL); @@ -258,6 +122,7 @@ MmPageOutPhysicalAddress(PFN_NUMBER Page) MmUnlockAddressSpace(AddressSpace); if (Address < MmSystemRangeStart) { + ExReleaseRundownProtection(&Process->RundownProtect); ObDereferenceObject(Process); } return(STATUS_UNSUCCESSFUL); @@ -283,6 +148,7 @@ MmPageOutPhysicalAddress(PFN_NUMBER Page) MmUnlockAddressSpace(AddressSpace); if (Address < MmSystemRangeStart) { + ExReleaseRundownProtection(&Process->RundownProtect); ObDereferenceObject(Process); } return(STATUS_UNSUCCESSFUL); @@ -303,8 +169,10 @@ MmPageOutPhysicalAddress(PFN_NUMBER Page) { KeBugCheck(MEMORY_MANAGEMENT); } + if (Address < MmSystemRangeStart) { + ExReleaseRundownProtection(&Process->RundownProtect); ObDereferenceObject(Process); } return(Status); @@ -499,6 +367,7 @@ MmDeleteRmap(PFN_NUMBER Page, PEPROCESS Process, ExAcquireFastMutex(&RmapListLock); previous_entry = NULL; current_entry = MmGetRmapListHeadPage(Page); + while (current_entry != NULL) { if (current_entry->Process == (PEPROCESS)Process && @@ -514,14 +383,14 @@ MmDeleteRmap(PFN_NUMBER Page, PEPROCESS Process, } ExReleaseFastMutex(&RmapListLock); ExFreeToNPagedLookasideList(&RmapLookasideList, current_entry); - if (Process == NULL) - { - Process = PsInitialSystemProcess; - } - if (Process) - { + if (Process == NULL) + { + Process = PsInitialSystemProcess; + } + if (Process) + { (void)InterlockedExchangeAddUL(&Process->Vm.WorkingSetSize, -PAGE_SIZE); - } + } return; } previous_entry = current_entry; diff --git a/ntoskrnl/mm/section.c b/ntoskrnl/mm/section.c index f15b18c0ac6..5dad201e343 100644 --- a/ntoskrnl/mm/section.c +++ b/ntoskrnl/mm/section.c @@ -54,6 +54,56 @@ #pragma alloc_text(INIT, MmInitSectionImplementation) #endif +NTSTATUS +NTAPI +MiMapViewInSystemSpace(IN PVOID Section, +IN PVOID Session, +OUT PVOID *MappedBase, +IN OUT PSIZE_T ViewSize); + +NTSTATUS +NTAPI +MmCreateArm3Section(OUT PVOID *SectionObject, +IN ACCESS_MASK DesiredAccess, +IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, +IN PLARGE_INTEGER InputMaximumSize, +IN ULONG SectionPageProtection, +IN ULONG AllocationAttributes, +IN HANDLE FileHandle OPTIONAL, +IN PFILE_OBJECT FileObject OPTIONAL); + +NTSTATUS +NTAPI +MmMapViewOfArm3Section(IN PVOID SectionObject, + IN PEPROCESS Process, + IN OUT PVOID *BaseAddress, + IN ULONG_PTR ZeroBits, + IN SIZE_T CommitSize, + IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, + IN OUT PSIZE_T ViewSize, + IN SECTION_INHERIT InheritDisposition, + IN ULONG AllocationType, + IN ULONG Protect); + +// +// PeFmtCreateSection depends on the following: +// +C_ASSERT(EXEFMT_LOAD_HEADER_SIZE >= sizeof(IMAGE_DOS_HEADER)); +C_ASSERT(sizeof(IMAGE_NT_HEADERS32) <= sizeof(IMAGE_NT_HEADERS64)); + +C_ASSERT(TYPE_ALIGNMENT(IMAGE_NT_HEADERS32) == TYPE_ALIGNMENT(IMAGE_NT_HEADERS64)); +C_ASSERT(RTL_SIZEOF_THROUGH_FIELD(IMAGE_NT_HEADERS32, FileHeader) == RTL_SIZEOF_THROUGH_FIELD(IMAGE_NT_HEADERS64, FileHeader)); +C_ASSERT(FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader) == FIELD_OFFSET(IMAGE_NT_HEADERS64, OptionalHeader)); + +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, Magic)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, SectionAlignment)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, FileAlignment)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, Subsystem)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, MinorSubsystemVersion)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, MajorSubsystemVersion)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, AddressOfEntryPoint)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, SizeOfCode)); +C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, SizeOfHeaders)); /* TYPES *********************************************************************/ @@ -75,6 +125,30 @@ SIZE_T MmAllocationFragment; ULONG_PTR MmSubsectionBase; +static ULONG SectionCharacteristicsToProtect[16] = +{ + PAGE_NOACCESS, /* 0 = NONE */ + PAGE_NOACCESS, /* 1 = SHARED */ + PAGE_EXECUTE, /* 2 = EXECUTABLE */ + PAGE_EXECUTE, /* 3 = EXECUTABLE, SHARED */ + PAGE_READONLY, /* 4 = READABLE */ + PAGE_READONLY, /* 5 = READABLE, SHARED */ + PAGE_EXECUTE_READ, /* 6 = READABLE, EXECUTABLE */ + PAGE_EXECUTE_READ, /* 7 = READABLE, EXECUTABLE, SHARED */ + /* + * FIXME? do we really need the WriteCopy field in segments? can't we use + * PAGE_WRITECOPY here? + */ + PAGE_READWRITE, /* 8 = WRITABLE */ + PAGE_READWRITE, /* 9 = WRITABLE, SHARED */ + PAGE_EXECUTE_READWRITE, /* 10 = WRITABLE, EXECUTABLE */ + PAGE_EXECUTE_READWRITE, /* 11 = WRITABLE, EXECUTABLE, SHARED */ + PAGE_READWRITE, /* 12 = WRITABLE, READABLE */ + PAGE_READWRITE, /* 13 = WRITABLE, READABLE, SHARED */ + PAGE_EXECUTE_READWRITE, /* 14 = WRITABLE, READABLE, EXECUTABLE */ + PAGE_EXECUTE_READWRITE, /* 15 = WRITABLE, READABLE, EXECUTABLE, SHARED */ +}; + static GENERIC_MAPPING MmpSectionMapping = { STANDARD_RIGHTS_READ | SECTION_MAP_READ | SECTION_QUERY, STANDARD_RIGHTS_WRITE | SECTION_MAP_WRITE, @@ -98,115 +172,535 @@ static const INFORMATION_CLASS_INFO ExSectionInfoClass[] = /* FUNCTIONS *****************************************************************/ -PFILE_OBJECT -NTAPI -MmGetFileObjectForSection(IN PROS_SECTION_OBJECT Section) + +/* + References: + [1] Microsoft Corporation, "Microsoft Portable Executable and Common Object + File Format Specification", revision 6.0 (February 1999) +*/ +NTSTATUS NTAPI PeFmtCreateSection(IN CONST VOID * FileHeader, + IN SIZE_T FileHeaderSize, + IN PVOID File, + OUT PMM_IMAGE_SECTION_OBJECT ImageSectionObject, + OUT PULONG Flags, + IN PEXEFMT_CB_READ_FILE ReadFileCb, + IN PEXEFMT_CB_ALLOCATE_SEGMENTS AllocateSegmentsCb) { - PAGED_CODE(); - ASSERT(Section); + NTSTATUS nStatus; + ULONG cbFileHeaderOffsetSize = 0; + ULONG cbSectionHeadersOffset = 0; + ULONG cbSectionHeadersSize; + ULONG cbSectionHeadersOffsetSize = 0; + ULONG cbOptHeaderSize; + ULONG cbHeadersSize = 0; + ULONG nSectionAlignment; + ULONG nFileAlignment; + const IMAGE_DOS_HEADER * pidhDosHeader; + const IMAGE_NT_HEADERS32 * pinhNtHeader; + const IMAGE_OPTIONAL_HEADER32 * piohOptHeader; + const IMAGE_SECTION_HEADER * pishSectionHeaders; + PMM_SECTION_SEGMENT pssSegments; + LARGE_INTEGER lnOffset; + PVOID pBuffer; + ULONG nPrevVirtualEndOfSegment = 0; + ULONG nFileSizeOfHeaders = 0; + ULONG i; - /* Return the file object */ - return Section->FileObject; // Section->ControlArea->FileObject on NT -} + ASSERT(FileHeader); + ASSERT(FileHeaderSize > 0); + ASSERT(File); + ASSERT(ImageSectionObject); + ASSERT(ReadFileCb); + ASSERT(AllocateSegmentsCb); -NTSTATUS -NTAPI -MmGetFileNameForSection(IN PROS_SECTION_OBJECT Section, - OUT POBJECT_NAME_INFORMATION *ModuleName) -{ - POBJECT_NAME_INFORMATION ObjectNameInfo; - NTSTATUS Status; - ULONG ReturnLength; + ASSERT(Intsafe_CanOffsetPointer(FileHeader, FileHeaderSize)); - /* Make sure it's an image section */ - *ModuleName = NULL; - if (!(Section->AllocationAttributes & SEC_IMAGE)) + ASSERT(((UINT_PTR)FileHeader % TYPE_ALIGNMENT(IMAGE_DOS_HEADER)) == 0); + +#define DIE(ARGS_) { DPRINT ARGS_; goto l_Return; } + + pBuffer = NULL; + pidhDosHeader = FileHeader; + + /* DOS HEADER */ + nStatus = STATUS_ROS_EXEFMT_UNKNOWN_FORMAT; + + /* image too small to be an MZ executable */ + if(FileHeaderSize < sizeof(IMAGE_DOS_HEADER)) + DIE(("Too small to be an MZ executable, size is %lu\n", FileHeaderSize)); + + /* no MZ signature */ + if(pidhDosHeader->e_magic != IMAGE_DOS_SIGNATURE) + DIE(("No MZ signature found, e_magic is %hX\n", pidhDosHeader->e_magic)); + + /* not a Windows executable */ + if(pidhDosHeader->e_lfanew <= 0) + DIE(("Not a Windows executable, e_lfanew is %d\n", pidhDosHeader->e_lfanew)); + + /* NT HEADER */ + nStatus = STATUS_INVALID_IMAGE_FORMAT; + + if(!Intsafe_AddULong32(&cbFileHeaderOffsetSize, pidhDosHeader->e_lfanew, RTL_SIZEOF_THROUGH_FIELD(IMAGE_NT_HEADERS32, FileHeader))) + DIE(("The DOS stub is too large, e_lfanew is %X\n", pidhDosHeader->e_lfanew)); + + if(FileHeaderSize < cbFileHeaderOffsetSize) + pinhNtHeader = NULL; + else { - /* It's not, fail */ - return STATUS_SECTION_NOT_IMAGE; + /* + * we already know that Intsafe_CanOffsetPointer(FileHeader, FileHeaderSize), + * and FileHeaderSize >= cbFileHeaderOffsetSize, so this holds true too + */ + ASSERT(Intsafe_CanOffsetPointer(FileHeader, pidhDosHeader->e_lfanew)); + pinhNtHeader = (PVOID)((UINT_PTR)FileHeader + pidhDosHeader->e_lfanew); } - /* Allocate memory for our structure */ - ObjectNameInfo = ExAllocatePoolWithTag(PagedPool, - 1024, - ' mM'); - if (!ObjectNameInfo) return STATUS_NO_MEMORY; - - /* Query the name */ - Status = ObQueryNameString(Section->FileObject, - ObjectNameInfo, - 1024, - &ReturnLength); - if (!NT_SUCCESS(Status)) + /* + * the buffer doesn't contain the NT file header, or the alignment is wrong: we + * need to read the header from the file + */ + if(FileHeaderSize < cbFileHeaderOffsetSize || + (UINT_PTR)pinhNtHeader % TYPE_ALIGNMENT(IMAGE_NT_HEADERS32) != 0) { - /* Failed, free memory */ - ExFreePoolWithTag(ObjectNameInfo, ' mM'); - return Status; + ULONG cbNtHeaderSize; + ULONG cbReadSize; + PVOID pData; + +l_ReadHeaderFromFile: + cbNtHeaderSize = 0; + lnOffset.QuadPart = pidhDosHeader->e_lfanew; + + /* read the header from the file */ + nStatus = ReadFileCb(File, &lnOffset, sizeof(IMAGE_NT_HEADERS64), &pData, &pBuffer, &cbReadSize); + + if(!NT_SUCCESS(nStatus)) + DIE(("ReadFile failed, status %08X\n", nStatus)); + + ASSERT(pData); + ASSERT(pBuffer); + ASSERT(cbReadSize > 0); + + nStatus = STATUS_INVALID_IMAGE_FORMAT; + + /* the buffer doesn't contain the file header */ + if(cbReadSize < RTL_SIZEOF_THROUGH_FIELD(IMAGE_NT_HEADERS32, FileHeader)) + DIE(("The file doesn't contain the PE file header\n")); + + pinhNtHeader = pData; + + /* object still not aligned: copy it to the beginning of the buffer */ + if((UINT_PTR)pinhNtHeader % TYPE_ALIGNMENT(IMAGE_NT_HEADERS32) != 0) + { + ASSERT((UINT_PTR)pBuffer % TYPE_ALIGNMENT(IMAGE_NT_HEADERS32) == 0); + RtlMoveMemory(pBuffer, pData, cbReadSize); + pinhNtHeader = pBuffer; + } + + /* invalid NT header */ + nStatus = STATUS_INVALID_IMAGE_PROTECT; + + if(pinhNtHeader->Signature != IMAGE_NT_SIGNATURE) + DIE(("The file isn't a PE executable, Signature is %X\n", pinhNtHeader->Signature)); + + nStatus = STATUS_INVALID_IMAGE_FORMAT; + + if(!Intsafe_AddULong32(&cbNtHeaderSize, pinhNtHeader->FileHeader.SizeOfOptionalHeader, FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader))) + DIE(("The full NT header is too large\n")); + + /* the buffer doesn't contain the whole NT header */ + if(cbReadSize < cbNtHeaderSize) + DIE(("The file doesn't contain the full NT header\n")); } + else + { + ULONG cbOptHeaderOffsetSize = 0; + + nStatus = STATUS_INVALID_IMAGE_FORMAT; + + /* don't trust an invalid NT header */ + if(pinhNtHeader->Signature != IMAGE_NT_SIGNATURE) + DIE(("The file isn't a PE executable, Signature is %X\n", pinhNtHeader->Signature)); + + if(!Intsafe_AddULong32(&cbOptHeaderOffsetSize, pidhDosHeader->e_lfanew, FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader))) + DIE(("The DOS stub is too large, e_lfanew is %X\n", pidhDosHeader->e_lfanew)); + + if(!Intsafe_AddULong32(&cbOptHeaderOffsetSize, cbOptHeaderOffsetSize, pinhNtHeader->FileHeader.SizeOfOptionalHeader)) + DIE(("The NT header is too large, SizeOfOptionalHeader is %X\n", pinhNtHeader->FileHeader.SizeOfOptionalHeader)); + + /* the buffer doesn't contain the whole NT header: read it from the file */ + if(cbOptHeaderOffsetSize > FileHeaderSize) + goto l_ReadHeaderFromFile; + } + + /* read information from the NT header */ + piohOptHeader = &pinhNtHeader->OptionalHeader; + cbOptHeaderSize = pinhNtHeader->FileHeader.SizeOfOptionalHeader; + + nStatus = STATUS_INVALID_IMAGE_FORMAT; + + if(!RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, Magic)) + DIE(("The optional header doesn't contain the Magic field, SizeOfOptionalHeader is %X\n", cbOptHeaderSize)); + + /* ASSUME: RtlZeroMemory(ImageSectionObject, sizeof(*ImageSectionObject)); */ + + switch(piohOptHeader->Magic) + { + case IMAGE_NT_OPTIONAL_HDR32_MAGIC: + case IMAGE_NT_OPTIONAL_HDR64_MAGIC: + break; + + default: + DIE(("Unrecognized optional header, Magic is %X\n", piohOptHeader->Magic)); + } + + if (RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SectionAlignment) && + RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, FileAlignment)) + { + /* See [1], section 3.4.2 */ + if(piohOptHeader->SectionAlignment < PAGE_SIZE) + { + if(piohOptHeader->FileAlignment != piohOptHeader->SectionAlignment) + DIE(("Sections aren't page-aligned and the file alignment isn't the same\n")); + } + else if(piohOptHeader->SectionAlignment < piohOptHeader->FileAlignment) + DIE(("The section alignment is smaller than the file alignment\n")); + + nSectionAlignment = piohOptHeader->SectionAlignment; + nFileAlignment = piohOptHeader->FileAlignment; + + if(!IsPowerOf2(nSectionAlignment) || !IsPowerOf2(nFileAlignment)) + DIE(("The section alignment (%u) and file alignment (%u) aren't both powers of 2\n", nSectionAlignment, nFileAlignment)); + } + else + { + nSectionAlignment = PAGE_SIZE; + nFileAlignment = PAGE_SIZE; + } + + ASSERT(IsPowerOf2(nSectionAlignment)); + ASSERT(IsPowerOf2(nFileAlignment)); + + switch(piohOptHeader->Magic) + { + /* PE32 */ + case IMAGE_NT_OPTIONAL_HDR32_MAGIC: + { + if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, ImageBase)) + ImageSectionObject->ImageBase = piohOptHeader->ImageBase; + + if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SizeOfImage)) + ImageSectionObject->ImageSize = piohOptHeader->SizeOfImage; + + if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SizeOfStackReserve)) + ImageSectionObject->StackReserve = piohOptHeader->SizeOfStackReserve; + + if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SizeOfStackCommit)) + ImageSectionObject->StackCommit = piohOptHeader->SizeOfStackCommit; + + break; + } + + /* PE32+ */ + case IMAGE_NT_OPTIONAL_HDR64_MAGIC: + { + const IMAGE_OPTIONAL_HEADER64 * pioh64OptHeader; + + pioh64OptHeader = (const IMAGE_OPTIONAL_HEADER64 *)piohOptHeader; + + if(RTL_CONTAINS_FIELD(pioh64OptHeader, cbOptHeaderSize, ImageBase)) + { + if(pioh64OptHeader->ImageBase > MAXULONG_PTR) + DIE(("ImageBase exceeds the address space\n")); + + ImageSectionObject->ImageBase = (ULONG_PTR)pioh64OptHeader->ImageBase; + } + + if(RTL_CONTAINS_FIELD(pioh64OptHeader, cbOptHeaderSize, SizeOfImage)) + { + if(pioh64OptHeader->SizeOfImage > MAXULONG_PTR) + DIE(("SizeOfImage exceeds the address space\n")); + + ImageSectionObject->ImageSize = pioh64OptHeader->SizeOfImage; + } + + if(RTL_CONTAINS_FIELD(pioh64OptHeader, cbOptHeaderSize, SizeOfStackReserve)) + { + if(pioh64OptHeader->SizeOfStackReserve > MAXULONG_PTR) + DIE(("SizeOfStackReserve exceeds the address space\n")); + + ImageSectionObject->StackReserve = pioh64OptHeader->SizeOfStackReserve; + } + + if(RTL_CONTAINS_FIELD(pioh64OptHeader, cbOptHeaderSize, SizeOfStackCommit)) + { + if(pioh64OptHeader->SizeOfStackCommit > MAXULONG_PTR) + DIE(("SizeOfStackCommit exceeds the address space\n")); + + ImageSectionObject->StackCommit = pioh64OptHeader->SizeOfStackCommit; + } + + break; + } + } + + /* [1], section 3.4.2 */ + if((ULONG_PTR)ImageSectionObject->ImageBase % 0x10000) + DIE(("ImageBase is not aligned on a 64KB boundary")); + + if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, Subsystem)) + { + ImageSectionObject->Subsystem = piohOptHeader->Subsystem; + + if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, MinorSubsystemVersion) && + RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, MajorSubsystemVersion)) + { + ImageSectionObject->MinorSubsystemVersion = piohOptHeader->MinorSubsystemVersion; + ImageSectionObject->MajorSubsystemVersion = piohOptHeader->MajorSubsystemVersion; + } + } + + if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, AddressOfEntryPoint)) + { + ImageSectionObject->EntryPoint = piohOptHeader->ImageBase + + piohOptHeader->AddressOfEntryPoint; + } + + if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SizeOfCode)) + ImageSectionObject->Executable = piohOptHeader->SizeOfCode != 0; + else + ImageSectionObject->Executable = TRUE; + + ImageSectionObject->ImageCharacteristics = pinhNtHeader->FileHeader.Characteristics; + ImageSectionObject->Machine = pinhNtHeader->FileHeader.Machine; + + /* SECTION HEADERS */ + nStatus = STATUS_INVALID_IMAGE_FORMAT; + + /* see [1], section 3.3 */ + if(pinhNtHeader->FileHeader.NumberOfSections > 96) + DIE(("Too many sections, NumberOfSections is %u\n", pinhNtHeader->FileHeader.NumberOfSections)); + + /* + * the additional segment is for the file's headers. They need to be present for + * the benefit of the dynamic loader (to locate exports, defaults for thread + * parameters, resources, etc.) + */ + ImageSectionObject->NrSegments = pinhNtHeader->FileHeader.NumberOfSections + 1; + + /* file offset for the section headers */ + if(!Intsafe_AddULong32(&cbSectionHeadersOffset, pidhDosHeader->e_lfanew, FIELD_OFFSET(IMAGE_NT_HEADERS32, OptionalHeader))) + DIE(("Offset overflow\n")); + + if(!Intsafe_AddULong32(&cbSectionHeadersOffset, cbSectionHeadersOffset, pinhNtHeader->FileHeader.SizeOfOptionalHeader)) + DIE(("Offset overflow\n")); + + /* size of the section headers */ + ASSERT(Intsafe_CanMulULong32(pinhNtHeader->FileHeader.NumberOfSections, sizeof(IMAGE_SECTION_HEADER))); + cbSectionHeadersSize = pinhNtHeader->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER); + + if(!Intsafe_AddULong32(&cbSectionHeadersOffsetSize, cbSectionHeadersOffset, cbSectionHeadersSize)) + DIE(("Section headers too large\n")); + + /* size of the executable's headers */ + if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, SizeOfHeaders)) + { +// if(!IsAligned(piohOptHeader->SizeOfHeaders, nFileAlignment)) +// DIE(("SizeOfHeaders is not aligned\n")); + + if(cbSectionHeadersSize > piohOptHeader->SizeOfHeaders) + DIE(("The section headers overflow SizeOfHeaders\n")); + + cbHeadersSize = piohOptHeader->SizeOfHeaders; + } + else if(!AlignUp(&cbHeadersSize, cbSectionHeadersOffsetSize, nFileAlignment)) + DIE(("Overflow aligning the size of headers\n")); + + if(pBuffer) + { + ExFreePool(pBuffer); + pBuffer = NULL; + } + /* WARNING: pinhNtHeader IS NO LONGER USABLE */ + /* WARNING: piohOptHeader IS NO LONGER USABLE */ + /* WARNING: pioh64OptHeader IS NO LONGER USABLE */ + + if(FileHeaderSize < cbSectionHeadersOffsetSize) + pishSectionHeaders = NULL; + else + { + /* + * we already know that Intsafe_CanOffsetPointer(FileHeader, FileHeaderSize), + * and FileHeaderSize >= cbSectionHeadersOffsetSize, so this holds true too + */ + ASSERT(Intsafe_CanOffsetPointer(FileHeader, cbSectionHeadersOffset)); + pishSectionHeaders = (PVOID)((UINT_PTR)FileHeader + cbSectionHeadersOffset); + } + + /* + * the buffer doesn't contain the section headers, or the alignment is wrong: + * read the headers from the file + */ + if(FileHeaderSize < cbSectionHeadersOffsetSize || + (UINT_PTR)pishSectionHeaders % TYPE_ALIGNMENT(IMAGE_SECTION_HEADER) != 0) + { + PVOID pData; + ULONG cbReadSize; + + lnOffset.QuadPart = cbSectionHeadersOffset; + + /* read the header from the file */ + nStatus = ReadFileCb(File, &lnOffset, cbSectionHeadersSize, &pData, &pBuffer, &cbReadSize); + + if(!NT_SUCCESS(nStatus)) + DIE(("ReadFile failed with status %08X\n", nStatus)); + + ASSERT(pData); + ASSERT(pBuffer); + ASSERT(cbReadSize > 0); + + nStatus = STATUS_INVALID_IMAGE_FORMAT; + + /* the buffer doesn't contain all the section headers */ + if(cbReadSize < cbSectionHeadersSize) + DIE(("The file doesn't contain all of the section headers\n")); + + pishSectionHeaders = pData; + + /* object still not aligned: copy it to the beginning of the buffer */ + if((UINT_PTR)pishSectionHeaders % TYPE_ALIGNMENT(IMAGE_SECTION_HEADER) != 0) + { + ASSERT((UINT_PTR)pBuffer % TYPE_ALIGNMENT(IMAGE_SECTION_HEADER) == 0); + RtlMoveMemory(pBuffer, pData, cbReadSize); + pishSectionHeaders = pBuffer; + } + } + + /* SEGMENTS */ + /* allocate the segments */ + nStatus = STATUS_INSUFFICIENT_RESOURCES; + ImageSectionObject->Segments = AllocateSegmentsCb(ImageSectionObject->NrSegments); + + if(ImageSectionObject->Segments == NULL) + DIE(("AllocateSegments failed\n")); + + /* initialize the headers segment */ + pssSegments = ImageSectionObject->Segments; + +// ASSERT(IsAligned(cbHeadersSize, nFileAlignment)); + + if(!AlignUp(&nFileSizeOfHeaders, cbHeadersSize, nFileAlignment)) + DIE(("Cannot align the size of the section headers\n")); + + if(!AlignUp(&nPrevVirtualEndOfSegment, cbHeadersSize, nSectionAlignment)) + DIE(("Cannot align the size of the section headers\n")); + + pssSegments[0].FileOffset = 0; + pssSegments[0].Protection = PAGE_READONLY; + pssSegments[0].Length = nPrevVirtualEndOfSegment; + pssSegments[0].RawLength = nFileSizeOfHeaders; + pssSegments[0].VirtualAddress = 0; + pssSegments[0].Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA; + pssSegments[0].WriteCopy = TRUE; + + /* skip the headers segment */ + ++ pssSegments; + + nStatus = STATUS_INVALID_IMAGE_FORMAT; + + /* convert the executable sections into segments. See also [1], section 4 */ + for(i = 0; i < ImageSectionObject->NrSegments - 1; ++ i) + { + ULONG nCharacteristics; + + /* validate the alignment */ + if(!IsAligned(pishSectionHeaders[i].VirtualAddress, nSectionAlignment)) + DIE(("VirtualAddress[%u] is not aligned\n", i)); + + /* sections must be contiguous, ordered by base address and non-overlapping */ + if(pishSectionHeaders[i].VirtualAddress != nPrevVirtualEndOfSegment) + DIE(("Memory gap between section %u and the previous\n", i)); + + /* ignore explicit BSS sections */ + if(pishSectionHeaders[i].SizeOfRawData != 0) + { + /* validate the alignment */ +#if 0 + /* Yes, this should be a multiple of FileAlignment, but there's + * stuff out there that isn't. We can cope with that + */ + if(!IsAligned(pishSectionHeaders[i].SizeOfRawData, nFileAlignment)) + DIE(("SizeOfRawData[%u] is not aligned\n", i)); +#endif + +// if(!IsAligned(pishSectionHeaders[i].PointerToRawData, nFileAlignment)) +// DIE(("PointerToRawData[%u] is not aligned\n", i)); + + /* conversion */ + pssSegments[i].FileOffset = pishSectionHeaders[i].PointerToRawData; + pssSegments[i].RawLength = pishSectionHeaders[i].SizeOfRawData; + } + else + { + ASSERT(pssSegments[i].FileOffset == 0); + ASSERT(pssSegments[i].RawLength == 0); + } + + ASSERT(Intsafe_CanAddLong64(pssSegments[i].FileOffset, pssSegments[i].RawLength)); + + nCharacteristics = pishSectionHeaders[i].Characteristics; + + /* no explicit protection */ + if((nCharacteristics & (IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE)) == 0) + { + if(nCharacteristics & IMAGE_SCN_CNT_CODE) + nCharacteristics |= IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ; + + if(nCharacteristics & IMAGE_SCN_CNT_INITIALIZED_DATA) + nCharacteristics |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE; + + if(nCharacteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA) + nCharacteristics |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE; + } + + /* see table above */ + pssSegments[i].Protection = SectionCharacteristicsToProtect[nCharacteristics >> 28]; + pssSegments[i].WriteCopy = !(nCharacteristics & IMAGE_SCN_MEM_SHARED); + + if(pishSectionHeaders[i].Misc.VirtualSize == 0 || pishSectionHeaders[i].Misc.VirtualSize < pishSectionHeaders[i].SizeOfRawData) + pssSegments[i].Length = pishSectionHeaders[i].SizeOfRawData; + else + pssSegments[i].Length = pishSectionHeaders[i].Misc.VirtualSize; + + if(!AlignUp(&pssSegments[i].Length, pssSegments[i].Length, nSectionAlignment)) + DIE(("Cannot align the virtual size of section %u\n", i)); + + ASSERT(IsAligned(pssSegments[i].Length, nSectionAlignment)); + + if(pssSegments[i].Length == 0) + DIE(("Virtual size of section %u is null\n", i)); + + pssSegments[i].VirtualAddress = pishSectionHeaders[i].VirtualAddress; + pssSegments[i].Characteristics = pishSectionHeaders[i].Characteristics; + + /* ensure the memory image is no larger than 4GB */ + if(!Intsafe_AddULong32(&nPrevVirtualEndOfSegment, pssSegments[i].VirtualAddress, pssSegments[i].Length)) + DIE(("The image is larger than 4GB\n")); + } + + /* spare our caller some work in validating the segments */ + *Flags = EXEFMT_LOAD_ASSUME_SEGMENTS_SORTED | EXEFMT_LOAD_ASSUME_SEGMENTS_NO_OVERLAP; + + if(nSectionAlignment >= PAGE_SIZE) + *Flags |= EXEFMT_LOAD_ASSUME_SEGMENTS_PAGE_ALIGNED; /* Success */ - *ModuleName = ObjectNameInfo; - return STATUS_SUCCESS; -} + nStatus = STATUS_ROS_EXEFMT_LOADED_FORMAT | EXEFMT_LOADED_PE32; -NTSTATUS -NTAPI -MmGetFileNameForAddress(IN PVOID Address, - OUT PUNICODE_STRING ModuleName) -{ - PROS_SECTION_OBJECT Section; - PMEMORY_AREA MemoryArea; - PMMSUPPORT AddressSpace; - POBJECT_NAME_INFORMATION ModuleNameInformation; - NTSTATUS Status = STATUS_ADDRESS_NOT_ASSOCIATED; +l_Return: + if(pBuffer) + ExFreePool(pBuffer); - /* Get the MM_AVL_TABLE from EPROCESS */ - if (Address >= MmSystemRangeStart) - { - AddressSpace = MmGetKernelAddressSpace(); - } - else - { - AddressSpace = &PsGetCurrentProcess()->Vm; - } - - /* Lock address space */ - MmLockAddressSpace(AddressSpace); - - /* Locate the memory area for the process by address */ - MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, Address); - - /* Make sure it's a section view type */ - if ((MemoryArea != NULL) && (MemoryArea->Type == MEMORY_AREA_SECTION_VIEW)) - { - /* Get the section pointer to the SECTION_OBJECT */ - Section = MemoryArea->Data.SectionData.Section; - - /* Unlock address space */ - MmUnlockAddressSpace(AddressSpace); - - /* Get the filename of the section */ - Status = MmGetFileNameForSection(Section,&ModuleNameInformation); - - if (NT_SUCCESS(Status)) - { - /* Init modulename */ - RtlCreateUnicodeString(ModuleName, - ModuleNameInformation->Name.Buffer); - - /* Free temp taged buffer from MmGetFileNameForSection() */ - ExFreePoolWithTag(ModuleNameInformation, ' mM'); - DPRINT("Found ModuleName %S by address %p\n", - ModuleName->Buffer,Address); - } - } - else - { - /* Unlock address space */ - MmUnlockAddressSpace(AddressSpace); - } - - return Status; + return nStatus; } /* Note: Mmsp prefix denotes "Memory Manager Section Private". */ @@ -822,7 +1316,7 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, /* * Check if this page needs to be mapped COW */ - if ((Segment->WriteCopy || MemoryArea->Data.SectionData.WriteCopyView) && + if ((Segment->WriteCopy) && (Region->Protect == PAGE_READWRITE || Region->Protect == PAGE_EXECUTE_READWRITE)) { @@ -1314,7 +1808,7 @@ MmAccessFaultSectionView(PMMSUPPORT AddressSpace, /* * Check if we are doing COW */ - if (!((Segment->WriteCopy || MemoryArea->Data.SectionData.WriteCopyView) && + if (!((Segment->WriteCopy) && (Region->Protect == PAGE_READWRITE || Region->Protect == PAGE_EXECUTE_READWRITE))) { @@ -1998,7 +2492,7 @@ MmAlterViewAttributes(PMMSUPPORT AddressSpace, MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, BaseAddress); Segment = MemoryArea->Data.SectionData.Segment; - if ((Segment->WriteCopy || MemoryArea->Data.SectionData.WriteCopyView) && + if ((Segment->WriteCopy) && (NewProtect == PAGE_READWRITE || NewProtect == PAGE_EXECUTE_READWRITE)) { DoCOW = TRUE; @@ -3306,14 +3800,6 @@ MmCreateImageSection(PROS_SECTION_OBJECT *SectionObject, ULONG i; ULONG FileAccess = 0; - /* - * Specifying a maximum size is meaningless for an image section - */ - if (UMaximumSize != NULL) - { - return(STATUS_INVALID_PARAMETER_4); - } - /* * Check file access required */ @@ -3470,132 +3956,7 @@ MmCreateImageSection(PROS_SECTION_OBJECT *SectionObject, return(Status); } -/* - * @implemented - */ -NTSTATUS NTAPI -NtCreateSection (OUT PHANDLE SectionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN PLARGE_INTEGER MaximumSize OPTIONAL, - IN ULONG SectionPageProtection OPTIONAL, - IN ULONG AllocationAttributes, - IN HANDLE FileHandle OPTIONAL) -{ - LARGE_INTEGER SafeMaximumSize; - PVOID SectionObject; - KPROCESSOR_MODE PreviousMode; - NTSTATUS Status; - PreviousMode = ExGetPreviousMode(); - - if(PreviousMode != KernelMode) - { - _SEH2_TRY - { - if (MaximumSize != NULL) - { - /* make a copy on the stack */ - SafeMaximumSize = ProbeForReadLargeInteger(MaximumSize); - MaximumSize = &SafeMaximumSize; - } - ProbeForWriteHandle(SectionHandle); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); - } - _SEH2_END; - } - - Status = MmCreateSection(&SectionObject, - DesiredAccess, - ObjectAttributes, - MaximumSize, - SectionPageProtection, - AllocationAttributes, - FileHandle, - NULL); - if (NT_SUCCESS(Status)) - { - Status = ObInsertObject ((PVOID)SectionObject, - NULL, - DesiredAccess, - 0, - NULL, - SectionHandle); - } - - return Status; -} - - -/********************************************************************** - * NAME - * NtOpenSection - * - * DESCRIPTION - * - * ARGUMENTS - * SectionHandle - * - * DesiredAccess - * - * ObjectAttributes - * - * RETURN VALUE - * - * REVISIONS - */ -NTSTATUS NTAPI -NtOpenSection(PHANDLE SectionHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes) -{ - HANDLE hSection; - KPROCESSOR_MODE PreviousMode; - NTSTATUS Status; - - PreviousMode = ExGetPreviousMode(); - - if(PreviousMode != KernelMode) - { - _SEH2_TRY - { - ProbeForWriteHandle(SectionHandle); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); - } - _SEH2_END; - } - - Status = ObOpenObjectByName(ObjectAttributes, - MmSectionObjectType, - PreviousMode, - NULL, - DesiredAccess, - NULL, - &hSection); - - if(NT_SUCCESS(Status)) - { - _SEH2_TRY - { - *SectionHandle = hSection; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - } - - return(Status); -} static NTSTATUS MmMapViewOfSegment(PMMSUPPORT AddressSpace, @@ -3634,7 +3995,6 @@ MmMapViewOfSegment(PMMSUPPORT AddressSpace, MArea->Data.SectionData.Segment = Segment; MArea->Data.SectionData.Section = Section; MArea->Data.SectionData.ViewOffset = ViewOffset; - MArea->Data.SectionData.WriteCopyView = FALSE; MmInitializeRegion(&MArea->Data.SectionData.RegionListHead, ViewSize, 0, Protect); @@ -3642,233 +4002,6 @@ MmMapViewOfSegment(PMMSUPPORT AddressSpace, } -/********************************************************************** - * NAME EXPORTED - * NtMapViewOfSection - * - * DESCRIPTION - * Maps a view of a section into the virtual address space of a - * process. - * - * ARGUMENTS - * SectionHandle - * Handle of the section. - * - * ProcessHandle - * Handle of the process. - * - * BaseAddress - * Desired base address (or NULL) on entry; - * Actual base address of the view on exit. - * - * ZeroBits - * Number of high order address bits that must be zero. - * - * CommitSize - * Size in bytes of the initially committed section of - * the view. - * - * SectionOffset - * Offset in bytes from the beginning of the section - * to the beginning of the view. - * - * ViewSize - * Desired length of map (or zero to map all) on entry - * Actual length mapped on exit. - * - * InheritDisposition - * Specified how the view is to be shared with - * child processes. - * - * AllocateType - * Type of allocation for the pages. - * - * Protect - * Protection for the committed region of the view. - * - * RETURN VALUE - * Status. - * - * @implemented - */ -NTSTATUS NTAPI -NtMapViewOfSection(IN HANDLE SectionHandle, - IN HANDLE ProcessHandle, - IN OUT PVOID* BaseAddress OPTIONAL, - IN ULONG_PTR ZeroBits OPTIONAL, - IN SIZE_T CommitSize, - IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, - IN OUT PSIZE_T ViewSize, - IN SECTION_INHERIT InheritDisposition, - IN ULONG AllocationType OPTIONAL, - IN ULONG Protect) -{ - PVOID SafeBaseAddress; - LARGE_INTEGER SafeSectionOffset; - SIZE_T SafeViewSize; - PROS_SECTION_OBJECT Section; - PEPROCESS Process; - KPROCESSOR_MODE PreviousMode; - NTSTATUS Status; - ULONG tmpProtect; - ACCESS_MASK DesiredAccess; - - /* - * Check the protection - */ - if (Protect & ~PAGE_FLAGS_VALID_FROM_USER_MODE) - { - return STATUS_INVALID_PARAMETER_10; - } - - tmpProtect = Protect & ~(PAGE_GUARD|PAGE_NOCACHE); - if (tmpProtect != PAGE_NOACCESS && - tmpProtect != PAGE_READONLY && - tmpProtect != PAGE_READWRITE && - tmpProtect != PAGE_WRITECOPY && - tmpProtect != PAGE_EXECUTE && - tmpProtect != PAGE_EXECUTE_READ && - tmpProtect != PAGE_EXECUTE_READWRITE && - tmpProtect != PAGE_EXECUTE_WRITECOPY) - { - return STATUS_INVALID_PAGE_PROTECTION; - } - - PreviousMode = ExGetPreviousMode(); - - if(PreviousMode != KernelMode) - { - SafeBaseAddress = NULL; - SafeSectionOffset.QuadPart = 0; - SafeViewSize = 0; - - _SEH2_TRY - { - if(BaseAddress != NULL) - { - ProbeForWritePointer(BaseAddress); - SafeBaseAddress = *BaseAddress; - } - if(SectionOffset != NULL) - { - ProbeForWriteLargeInteger(SectionOffset); - SafeSectionOffset = *SectionOffset; - } - ProbeForWriteSize_t(ViewSize); - SafeViewSize = *ViewSize; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); - } - _SEH2_END; - } - else - { - SafeBaseAddress = (BaseAddress != NULL ? *BaseAddress : NULL); - SafeSectionOffset.QuadPart = (SectionOffset != NULL ? SectionOffset->QuadPart : 0); - SafeViewSize = (ViewSize != NULL ? *ViewSize : 0); - } - - SafeSectionOffset.LowPart = PAGE_ROUND_DOWN(SafeSectionOffset.LowPart); - - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_OPERATION, - PsProcessType, - PreviousMode, - (PVOID*)(PVOID)&Process, - NULL); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - /* Convert NT Protection Attr to Access Mask */ - if (Protect == PAGE_READONLY) - { - DesiredAccess = SECTION_MAP_READ; - } - else if (Protect == PAGE_READWRITE) - { - DesiredAccess = SECTION_MAP_WRITE; - } - else if (Protect == PAGE_WRITECOPY) - { - DesiredAccess = SECTION_QUERY; - } - /* FIXME: Handle other Protection Attributes. For now keep previous behavior */ - else - { - DesiredAccess = SECTION_MAP_READ; - } - - Status = ObReferenceObjectByHandle(SectionHandle, - DesiredAccess, - MmSectionObjectType, - PreviousMode, - (PVOID*)(PVOID)&Section, - NULL); - if (!(NT_SUCCESS(Status))) - { - DPRINT("ObReference failed rc=%x\n",Status); - ObDereferenceObject(Process); - return(Status); - } - - Status = MmMapViewOfSection(Section, - (PEPROCESS)Process, - (BaseAddress != NULL ? &SafeBaseAddress : NULL), - ZeroBits, - CommitSize, - (SectionOffset != NULL ? &SafeSectionOffset : NULL), - (ViewSize != NULL ? &SafeViewSize : NULL), - InheritDisposition, - AllocationType, - Protect); - - /* Check if this is an image for the current process */ - if ((Section->AllocationAttributes & SEC_IMAGE) && - (Process == PsGetCurrentProcess()) && - (Status != STATUS_IMAGE_NOT_AT_BASE)) - { - /* Notify the debugger */ - DbgkMapViewOfSection(Section, - SafeBaseAddress, - SafeSectionOffset.LowPart, - SafeViewSize); - } - - ObDereferenceObject(Section); - ObDereferenceObject(Process); - - if(NT_SUCCESS(Status)) - { - /* copy parameters back to the caller */ - _SEH2_TRY - { - if(BaseAddress != NULL) - { - *BaseAddress = SafeBaseAddress; - } - if(SectionOffset != NULL) - { - *SectionOffset = SafeSectionOffset; - } - if(ViewSize != NULL) - { - *ViewSize = SafeViewSize; - } - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - } - - return(Status); -} static VOID MmFreeSectionPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address, @@ -4156,54 +4289,7 @@ MmUnmapViewOfSection(PEPROCESS Process, return(STATUS_SUCCESS); } -/********************************************************************** - * NAME EXPORTED - * NtUnmapViewOfSection - * - * DESCRIPTION - * - * ARGUMENTS - * ProcessHandle - * - * BaseAddress - * - * RETURN VALUE - * Status. - * - * REVISIONS - */ -NTSTATUS NTAPI -NtUnmapViewOfSection (HANDLE ProcessHandle, - PVOID BaseAddress) -{ - PEPROCESS Process; - KPROCESSOR_MODE PreviousMode; - NTSTATUS Status; - DPRINT("NtUnmapViewOfSection(ProcessHandle %x, BaseAddress %x)\n", - ProcessHandle, BaseAddress); - - PreviousMode = ExGetPreviousMode(); - - DPRINT("Referencing process\n"); - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_OPERATION, - PsProcessType, - PreviousMode, - (PVOID*)(PVOID)&Process, - NULL); - if (!NT_SUCCESS(Status)) - { - DPRINT("ObReferenceObjectByHandle failed (Status %x)\n", Status); - return(Status); - } - - Status = MmUnmapViewOfSection(Process, BaseAddress); - - ObDereferenceObject(Process); - - return Status; -} /** @@ -4344,79 +4430,7 @@ NtQuerySection(IN HANDLE SectionHandle, return(Status); } - - -/** - * Extends size of file backed section. - * - * @param SectionHandle - * Handle to the section object. It must be opened with - * SECTION_EXTEND_SIZE access. - * @param NewMaximumSize - * New maximum size of the section in bytes. - * - * @return Status. - * - * @todo Move the actual code to internal function MmExtendSection. - * @unimplemented - */ -NTSTATUS NTAPI -NtExtendSection(IN HANDLE SectionHandle, - IN PLARGE_INTEGER NewMaximumSize) -{ - LARGE_INTEGER SafeNewMaximumSize; - PROS_SECTION_OBJECT Section; - KPROCESSOR_MODE PreviousMode; - NTSTATUS Status; - - PreviousMode = ExGetPreviousMode(); - - if(PreviousMode != KernelMode) - { - _SEH2_TRY - { - /* make a copy on the stack */ - SafeNewMaximumSize = ProbeForReadLargeInteger(NewMaximumSize); - NewMaximumSize = &SafeNewMaximumSize; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); - } - _SEH2_END; - } - - Status = ObReferenceObjectByHandle(SectionHandle, - SECTION_EXTEND_SIZE, - MmSectionObjectType, - PreviousMode, - (PVOID*)&Section, - NULL); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - if (!(Section->AllocationAttributes & SEC_FILE)) - { - ObDereferenceObject(Section); - return STATUS_INVALID_PARAMETER; - } - - /* - * - Acquire file extneding resource. - * - Check if we're not resizing the section below it's actual size! - * - Extend segments if needed. - * - Set file information (FileAllocationInformation) to the new size. - * - Release file extending resource. - */ - - ObDereferenceObject(Section); - - return STATUS_NOT_IMPLEMENTED; -} - + /********************************************************************** * NAME EXPORTED * MmMapViewOfSection @@ -4483,6 +4497,20 @@ MmMapViewOfSection(IN PVOID SectionObject, ULONG ViewOffset; NTSTATUS Status = STATUS_SUCCESS; + if ((ULONG_PTR)SectionObject & 1) + { + return MmMapViewOfArm3Section((PVOID)((ULONG_PTR)SectionObject & ~1), + Process, + BaseAddress, + ZeroBits, + CommitSize, + SectionOffset, + ViewSize, + InheritDisposition, + AllocationType, + Protect); + } + ASSERT(Process); if (!Protect || Protect & ~PAGE_FLAGS_VALID_FOR_SECTION) @@ -4704,15 +4732,7 @@ MmCanFileBeTruncated (IN PSECTION_OBJECT_POINTERS SectionObjectPointer, } -/* - * @unimplemented - */ -BOOLEAN NTAPI -MmDisableModifiedWriteOfSection (ULONG Unknown0) -{ - UNIMPLEMENTED; - return (FALSE); -} + /* * @implemented @@ -4737,19 +4757,6 @@ MmFlushImageSection (IN PSECTION_OBJECT_POINTERS SectionObjectPointer, return FALSE; } -/* - * @unimplemented - */ -BOOLEAN NTAPI -MmForceSectionClosed ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN BOOLEAN DelayClose) -{ - UNIMPLEMENTED; - return (FALSE); -} - - /* * @implemented */ @@ -4761,6 +4768,16 @@ MmMapViewInSystemSpace (IN PVOID SectionObject, PROS_SECTION_OBJECT Section; PMMSUPPORT AddressSpace; NTSTATUS Status; + PAGED_CODE(); + + if ((ULONG_PTR)SectionObject & 1) + { + extern PVOID MmSession; + return MiMapViewInSystemSpace((PVOID)((ULONG_PTR)SectionObject & ~1), + &MmSession, + MappedBase, + ViewSize); + } DPRINT("MmMapViewInSystemSpace() called\n"); @@ -4797,22 +4814,6 @@ MmMapViewInSystemSpace (IN PVOID SectionObject, return Status; } -/* - * @unimplemented - */ -NTSTATUS -NTAPI -MmMapViewInSessionSpace ( - IN PVOID Section, - OUT PVOID *MappedBase, - IN OUT PSIZE_T ViewSize - ) -{ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - - /* * @implemented */ @@ -4831,18 +4832,6 @@ MmUnmapViewInSystemSpace (IN PVOID MappedBase) return Status; } -/* - * @unimplemented - */ -NTSTATUS -NTAPI -MmUnmapViewInSessionSpace ( - IN PVOID MappedBase - ) -{ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} /********************************************************************** * NAME EXPORTED @@ -4911,6 +4900,20 @@ MmCreateSection (OUT PVOID * Section, { ULONG Protection; PROS_SECTION_OBJECT *SectionObject = (PROS_SECTION_OBJECT *)Section; + + /* Check if an ARM3 section is being created instead */ + if (AllocationAttributes & 1) + { + DPRINT1("arm 3 path\n"); + return MmCreateArm3Section(Section, + DesiredAccess, + ObjectAttributes, + MaximumSize, + SectionPageProtection, + AllocationAttributes &~ 1, + FileHandle, + File); + } /* * Check the protection @@ -4957,14 +4960,6 @@ MmCreateSection (OUT PVOID * Section, AllocationAttributes)); } -NTSTATUS -NTAPI -NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage, - IN PVOID File2MappedAsFile) -{ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} /* EOF */ diff --git a/ntoskrnl/mm/virtual.c b/ntoskrnl/mm/virtual.c deleted file mode 100644 index 0016133b807..00000000000 --- a/ntoskrnl/mm/virtual.c +++ /dev/null @@ -1,440 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/mm/virtual.c - * PURPOSE: Implementing operations on virtual memory. - * - * PROGRAMMERS: David Welch - */ - -/* INCLUDE ********************************************************************/ - -#include -#define NDEBUG -#include - -/* PRIVATE FUNCTIONS **********************************************************/ - -NTSTATUS FASTCALL -MiQueryVirtualMemory(IN HANDLE ProcessHandle, - IN PVOID Address, - IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass, - OUT PVOID VirtualMemoryInformation, - IN SIZE_T Length, - OUT PSIZE_T ResultLength) -{ - NTSTATUS Status; - PEPROCESS Process; - MEMORY_AREA* MemoryArea; - PMMSUPPORT AddressSpace; - - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_QUERY_INFORMATION, - NULL, - UserMode, - (PVOID*)(&Process), - NULL); - - if (!NT_SUCCESS(Status)) - { - DPRINT("NtQueryVirtualMemory() = %x\n",Status); - return(Status); - } - - AddressSpace = &Process->Vm; - - MmLockAddressSpace(AddressSpace); - MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, Address); - switch(VirtualMemoryInformationClass) - { - case MemoryBasicInformation: - { - PMEMORY_BASIC_INFORMATION Info = - (PMEMORY_BASIC_INFORMATION)VirtualMemoryInformation; - if (Length != sizeof(MEMORY_BASIC_INFORMATION)) - { - MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); - return(STATUS_INFO_LENGTH_MISMATCH); - } - - if (MemoryArea == NULL) - { - Info->Type = 0; - Info->State = MEM_FREE; - Info->Protect = PAGE_NOACCESS; - Info->AllocationProtect = 0; - Info->BaseAddress = (PVOID)PAGE_ROUND_DOWN(Address); - Info->AllocationBase = NULL; - Info->RegionSize = MmFindGapAtAddress(AddressSpace, Info->BaseAddress); - Status = STATUS_SUCCESS; - *ResultLength = sizeof(MEMORY_BASIC_INFORMATION); - } - else - { - switch(MemoryArea->Type) - { - case MEMORY_AREA_VIRTUAL_MEMORY: - Status = MmQueryAnonMem(MemoryArea, Address, Info, - ResultLength); - break; - - case MEMORY_AREA_SECTION_VIEW: - Status = MmQuerySectionView(MemoryArea, Address, Info, - ResultLength); - break; - - default: - DPRINT1("unhandled memory area type: 0x%x\n", MemoryArea->Type); - Status = STATUS_UNSUCCESSFUL; - *ResultLength = 0; - } - } - break; - } - - default: - { - DPRINT1("Unsupported or unimplemented class: %lx\n", VirtualMemoryInformationClass); - Status = STATUS_INVALID_INFO_CLASS; - *ResultLength = 0; - break; - } - } - - MmUnlockAddressSpace(AddressSpace); - ObDereferenceObject(Process); - - return Status; -} - -NTSTATUS NTAPI -MiProtectVirtualMemory(IN PEPROCESS Process, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T NumberOfBytesToProtect, - IN ULONG NewAccessProtection, - OUT PULONG OldAccessProtection OPTIONAL) -{ - PMEMORY_AREA MemoryArea; - PMMSUPPORT AddressSpace; - ULONG OldAccessProtection_; - NTSTATUS Status; - - *NumberOfBytesToProtect = - PAGE_ROUND_UP((ULONG_PTR)(*BaseAddress) + (*NumberOfBytesToProtect)) - - PAGE_ROUND_DOWN(*BaseAddress); - *BaseAddress = (PVOID)PAGE_ROUND_DOWN(*BaseAddress); - - AddressSpace = &Process->Vm; - - MmLockAddressSpace(AddressSpace); - MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, *BaseAddress); - if (MemoryArea == NULL) - { - MmUnlockAddressSpace(AddressSpace); - return STATUS_UNSUCCESSFUL; - } - - if (OldAccessProtection == NULL) - OldAccessProtection = &OldAccessProtection_; - - if (MemoryArea->Type == MEMORY_AREA_VIRTUAL_MEMORY) - { - Status = MmProtectAnonMem(AddressSpace, MemoryArea, *BaseAddress, - *NumberOfBytesToProtect, NewAccessProtection, - OldAccessProtection); - } - else if (MemoryArea->Type == MEMORY_AREA_SECTION_VIEW) - { - Status = MmProtectSectionView(AddressSpace, MemoryArea, *BaseAddress, - *NumberOfBytesToProtect, - NewAccessProtection, - OldAccessProtection); - } - else - { - /* FIXME: Should we return failure or success in this case? */ - Status = STATUS_CONFLICTING_ADDRESSES; - } - - MmUnlockAddressSpace(AddressSpace); - - return Status; -} - -PVOID -NTAPI -MiMapLockedPagesInUserSpace(IN PMDL Mdl, - IN PVOID BaseVa, - IN MEMORY_CACHING_TYPE CacheType, - IN PVOID BaseAddress) -{ - PVOID Base; - PPFN_NUMBER MdlPages; - ULONG PageCount; - PEPROCESS CurrentProcess; - NTSTATUS Status; - ULONG Protect; - MEMORY_AREA *Result; - LARGE_INTEGER BoundaryAddressMultiple; - - /* Calculate the number of pages required. */ - MdlPages = (PPFN_NUMBER)(Mdl + 1); - PageCount = PAGE_ROUND_UP(Mdl->ByteCount + Mdl->ByteOffset) / PAGE_SIZE; - - /* Set default page protection */ - Protect = PAGE_READWRITE; - if (CacheType == MmNonCached) Protect |= PAGE_NOCACHE; - - BoundaryAddressMultiple.QuadPart = 0; - Base = BaseAddress; - - CurrentProcess = PsGetCurrentProcess(); - - MmLockAddressSpace(&CurrentProcess->Vm); - Status = MmCreateMemoryArea(&CurrentProcess->Vm, - MEMORY_AREA_MDL_MAPPING, - &Base, - PageCount * PAGE_SIZE, - Protect, - &Result, - (Base != NULL), - 0, - BoundaryAddressMultiple); - MmUnlockAddressSpace(&CurrentProcess->Vm); - if (!NT_SUCCESS(Status)) - { - if (Mdl->MdlFlags & MDL_MAPPING_CAN_FAIL) - { - return NULL; - } - - /* Throw exception */ - ExRaiseStatus(STATUS_ACCESS_VIOLATION); - ASSERT(0); - } - - /* Set the virtual mappings for the MDL pages. */ - if (Mdl->MdlFlags & MDL_IO_SPACE) - { - /* Map the pages */ - Status = MmCreateVirtualMappingUnsafe(CurrentProcess, - Base, - Protect, - MdlPages, - PageCount); - } - else - { - /* Map the pages */ - Status = MmCreateVirtualMapping(CurrentProcess, - Base, - Protect, - MdlPages, - PageCount); - } - - /* Check if the mapping suceeded */ - if (!NT_SUCCESS(Status)) - { - /* If it can fail, return NULL */ - if (Mdl->MdlFlags & MDL_MAPPING_CAN_FAIL) return NULL; - - /* Throw exception */ - ExRaiseStatus(STATUS_ACCESS_VIOLATION); - } - - /* Return the base */ - Base = (PVOID)((ULONG_PTR)Base + Mdl->ByteOffset); - return Base; -} - -VOID -NTAPI -MiUnmapLockedPagesInUserSpace(IN PVOID BaseAddress, - IN PMDL Mdl) -{ - PMEMORY_AREA MemoryArea; - - /* Sanity check */ - ASSERT(Mdl->Process == PsGetCurrentProcess()); - - /* Find the memory area */ - MemoryArea = MmLocateMemoryAreaByAddress(&Mdl->Process->Vm, - BaseAddress); - ASSERT(MemoryArea); - - /* Free it */ - MmFreeMemoryArea(&Mdl->Process->Vm, - MemoryArea, - NULL, - NULL); -} - -/* SYSTEM CALLS ***************************************************************/ - -NTSTATUS NTAPI -NtQueryVirtualMemory(IN HANDLE ProcessHandle, - IN PVOID Address, - IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass, - OUT PVOID VirtualMemoryInformation, - IN SIZE_T Length, - OUT PSIZE_T UnsafeResultLength) -{ - NTSTATUS Status; - SIZE_T ResultLength = 0; - KPROCESSOR_MODE PreviousMode; - WCHAR ModuleFileNameBuffer[MAX_PATH] = {0}; - UNICODE_STRING ModuleFileName; - PMEMORY_SECTION_NAME SectionName = NULL; - PEPROCESS Process; - union - { - MEMORY_BASIC_INFORMATION BasicInfo; - } - VirtualMemoryInfo; - - DPRINT("NtQueryVirtualMemory(ProcessHandle %x, Address %x, " - "VirtualMemoryInformationClass %d, VirtualMemoryInformation %x, " - "Length %lu ResultLength %x)\n",ProcessHandle,Address, - VirtualMemoryInformationClass,VirtualMemoryInformation, - Length,ResultLength); - - PreviousMode = ExGetPreviousMode(); - - if (PreviousMode != KernelMode) - { - _SEH2_TRY - { - ProbeForWrite(VirtualMemoryInformation, - Length, - sizeof(ULONG_PTR)); - - if (UnsafeResultLength) ProbeForWriteSize_t(UnsafeResultLength); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); - } - _SEH2_END; - } - - if (Address >= MmSystemRangeStart) - { - DPRINT1("Invalid parameter\n"); - return STATUS_INVALID_PARAMETER; - } - - /* FIXME: Move this inside MiQueryVirtualMemory */ - if (VirtualMemoryInformationClass == MemorySectionName) - { - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_QUERY_INFORMATION, - NULL, - PreviousMode, - (PVOID*)(&Process), - NULL); - - if (!NT_SUCCESS(Status)) - { - DPRINT("NtQueryVirtualMemory() = %x\n",Status); - return(Status); - } - - RtlInitEmptyUnicodeString(&ModuleFileName, ModuleFileNameBuffer, sizeof(ModuleFileNameBuffer)); - Status = MmGetFileNameForAddress(Address, &ModuleFileName); - - if (NT_SUCCESS(Status)) - { - SectionName = VirtualMemoryInformation; - if (PreviousMode != KernelMode) - { - _SEH2_TRY - { - RtlInitUnicodeString(&SectionName->SectionFileName, SectionName->NameBuffer); - SectionName->SectionFileName.MaximumLength = Length; - RtlCopyUnicodeString(&SectionName->SectionFileName, &ModuleFileName); - - if (UnsafeResultLength != NULL) - { - *UnsafeResultLength = ModuleFileName.Length; - } - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - } - else - { - RtlInitUnicodeString(&SectionName->SectionFileName, SectionName->NameBuffer); - SectionName->SectionFileName.MaximumLength = Length; - RtlCopyUnicodeString(&SectionName->SectionFileName, &ModuleFileName); - - if (UnsafeResultLength != NULL) - { - *UnsafeResultLength = ModuleFileName.Length; - } - } - } - ObDereferenceObject(Process); - return Status; - } - else - { - Status = MiQueryVirtualMemory(ProcessHandle, - Address, - VirtualMemoryInformationClass, - &VirtualMemoryInfo, - Length, - &ResultLength); - } - - if (NT_SUCCESS(Status)) - { - if (PreviousMode != KernelMode) - { - _SEH2_TRY - { - if (ResultLength > 0) - { - ProbeForWrite(VirtualMemoryInformation, - ResultLength, - 1); - RtlCopyMemory(VirtualMemoryInformation, - &VirtualMemoryInfo, - ResultLength); - } - if (UnsafeResultLength != NULL) - { - *UnsafeResultLength = ResultLength; - } - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - } - else - { - if (ResultLength > 0) - { - RtlCopyMemory(VirtualMemoryInformation, - &VirtualMemoryInfo, - ResultLength); - } - - if (UnsafeResultLength != NULL) - { - *UnsafeResultLength = ResultLength; - } - } - } - - return(Status); -} - -/* EOF */ diff --git a/ntoskrnl/ntoskrnl.pspec b/ntoskrnl/ntoskrnl.pspec index b359d38f4d6..cc7415b4439 100644 --- a/ntoskrnl/ntoskrnl.pspec +++ b/ntoskrnl/ntoskrnl.pspec @@ -1399,7 +1399,7 @@ @ stdcall VerSetConditionMask(long long long long) @ cdecl VfFailDeviceNode(ptr long long long ptr ptr ptr) ;VfFailDriver -;VfFailSystemBIOS +@ cdecl VfFailSystemBIOS(long long long ptr ptr ptr) @ stdcall VfIsVerificationEnabled(long ptr) #ifndef __x86_64__ @ stdcall WRITE_REGISTER_BUFFER_UCHAR(ptr ptr long) diff --git a/ntoskrnl/ntoskrnl_i386.def b/ntoskrnl/ntoskrnl_i386.def index f04d6bef3ed..321b4a46a00 100644 --- a/ntoskrnl/ntoskrnl_i386.def +++ b/ntoskrnl/ntoskrnl_i386.def @@ -1,3 +1,4 @@ +; File generated automatically from obj-i386\ntoskrnl\ntoskrnl_ntoskrnl.spec; do not edit! LIBRARY ntoskrnl.exe @@ -1305,224 +1306,225 @@ EXPORTS SeValidSecurityDescriptor@8 @1301 VerSetConditionMask@16 @1302 VfFailDeviceNode @1303 - VfIsVerificationEnabled@8 @1304 - WRITE_REGISTER_BUFFER_UCHAR@12 @1305 - WRITE_REGISTER_BUFFER_ULONG@12 @1306 - WRITE_REGISTER_BUFFER_USHORT@12 @1307 - WRITE_REGISTER_UCHAR@8 @1308 - WRITE_REGISTER_ULONG@8 @1309 - WRITE_REGISTER_USHORT@8 @1310 - WmiQueryTraceInformation@20 @1311 - WmiTraceMessage @1312 - WmiTraceMessageVa@24 @1313 - ZwAccessCheckAndAuditAlarm@44 @1314 - ZwAddBootEntry@8 @1315 - ZwAddDriverEntry@8 @1316 - ZwAdjustPrivilegesToken@24 @1317 - ZwAlertThread@4 @1318 - ZwAllocateVirtualMemory@24 @1319 - ZwAssignProcessToJobObject@8 @1320 - ZwCancelIoFile@8 @1321 - ZwCancelTimer@8 @1322 - ZwClearEvent@4 @1323 - ZwClose@4 @1324 - ZwCloseObjectAuditAlarm@12 @1325 - ZwConnectPort@32 @1326 - ZwCreateDirectoryObject@12 @1327 - ZwCreateEvent@20 @1328 - ZwCreateFile@44 @1329 - ZwCreateJobObject@12 @1330 - ZwCreateKey@28 @1331 - ZwCreateSection@28 @1332 - ZwCreateSymbolicLinkObject@16 @1333 - ZwCreateTimer@16 @1334 - ZwDeleteBootEntry@4 @1335 - ZwDeleteDriverEntry@4 @1336 - ZwDeleteFile@4 @1337 - ZwDeleteKey@4 @1338 - ZwDeleteValueKey@8 @1339 - ZwDeviceIoControlFile@40 @1340 - ZwDisplayString@4 @1341 - ZwDuplicateObject@28 @1342 - ZwDuplicateToken@24 @1343 - ZwEnumerateBootEntries@8 @1344 - ZwEnumerateDriverEntries@8 @1345 - ZwEnumerateKey@24 @1346 - ZwEnumerateValueKey@24 @1347 - ZwFlushInstructionCache@12 @1348 - ZwFlushKey@4 @1349 - ZwFlushVirtualMemory@16 @1350 - ZwFreeVirtualMemory@16 @1351 - ZwFsControlFile@40 @1352 - ZwInitiatePowerAction@16 @1353 - ZwIsProcessInJob@8 @1354 - ZwLoadDriver@4 @1355 - ZwLoadKey@8 @1356 - ZwMakeTemporaryObject@4 @1357 - ZwMapViewOfSection@40 @1358 - ZwModifyBootEntry@4 @1359 - ZwModifyDriverEntry@4 @1360 - ZwNotifyChangeKey@40 @1361 - ZwOpenDirectoryObject@12 @1362 - ZwOpenEvent@12 @1363 - ZwOpenFile@24 @1364 - ZwOpenJobObject@12 @1365 - ZwOpenKey@12 @1366 - ZwOpenProcess@16 @1367 - ZwOpenProcessToken@12 @1368 - ZwOpenProcessTokenEx@16 @1369 - ZwOpenSection@12 @1370 - ZwOpenSymbolicLinkObject@12 @1371 - ZwOpenThread@16 @1372 - ZwOpenThreadToken@16 @1373 - ZwOpenThreadTokenEx@20 @1374 - ZwOpenTimer@12 @1375 - ZwPowerInformation@20 @1376 - ZwPulseEvent@8 @1377 - ZwQueryBootEntryOrder@8 @1378 - ZwQueryBootOptions@8 @1379 - ZwQueryDefaultLocale@8 @1380 - ZwQueryDefaultUILanguage@4 @1381 - ZwQueryDirectoryFile@44 @1382 - ZwQueryDirectoryObject@28 @1383 - ZwQueryDriverEntryOrder@8 @1384 - ZwQueryEaFile@36 @1385 - ZwQueryFullAttributesFile@8 @1386 - ZwQueryInformationAtom@20 @1387 - ZwQueryInformationFile@20 @1388 - ZwQueryInformationJobObject@20 @1389 - ZwQueryInformationProcess@20 @1390 - ZwQueryInformationThread@20 @1391 - ZwQueryInformationToken@20 @1392 - ZwQueryInstallUILanguage@4 @1393 - ZwQueryKey@20 @1394 - ZwQueryObject@20 @1395 - ZwQuerySection@20 @1396 - ZwQuerySecurityObject@20 @1397 - ZwQuerySymbolicLinkObject@12 @1398 - ZwQuerySystemInformation@16 @1399 - ZwQueryValueKey@24 @1400 - ZwQueryVolumeInformationFile@20 @1401 - ZwReadFile@36 @1402 - ZwReplaceKey@12 @1403 - ZwRequestWaitReplyPort@12 @1404 - ZwResetEvent@8 @1405 - ZwRestoreKey@12 @1406 - ZwSaveKey@8 @1407 - ZwSaveKeyEx@12 @1408 - ZwSecureConnectPort@36 @1409 - ZwSetBootEntryOrder@8 @1410 - ZwSetBootOptions@8 @1411 - ZwSetDefaultLocale@8 @1412 - ZwSetDefaultUILanguage@4 @1413 - ZwSetDriverEntryOrder@8 @1414 - ZwSetEaFile@16 @1415 - ZwSetEvent@8 @1416 - ZwSetInformationFile@20 @1417 - ZwSetInformationJobObject@16 @1418 - ZwSetInformationObject@16 @1419 - ZwSetInformationProcess@16 @1420 - ZwSetInformationThread@16 @1421 - ZwSetSecurityObject@12 @1422 - ZwSetSystemInformation@12 @1423 - ZwSetSystemTime@8 @1424 - ZwSetTimer@28 @1425 - ZwSetValueKey@24 @1426 - ZwSetVolumeInformationFile@20 @1427 - ZwTerminateJobObject@8 @1428 - ZwTerminateProcess@8 @1429 - ZwTranslateFilePath@16 @1430 - ZwUnloadDriver@4 @1431 - ZwUnloadKey@4 @1432 - ZwUnmapViewOfSection@8 @1433 - ZwWaitForMultipleObjects@20 @1434 - ZwWaitForSingleObject@12 @1435 - ZwWriteFile@36 @1436 - ZwYieldExecution@0 @1437 - _abnormal_termination @1438 - _alldiv @1439 - _alldvrm @1440 - _allmul @1441 - _alloca_probe @1442 - _allrem @1443 - _allshl @1444 - _allshr @1445 - _aulldiv @1446 - _aulldvrm @1447 - _aullrem @1448 - _aullshr @1449 - _except_handler2 @1450 - _except_handler3 @1451 - _global_unwind2 @1452 - _itoa @1453 - _itow @1454 - _local_unwind2 @1455 - _purecall @1456 - _snprintf @1457 - _snwprintf @1458 - _stricmp @1459 - _strlwr @1460 - _strnicmp @1461 - _strnset @1462 - _strrev @1463 - _strset @1464 - _strupr @1465 - _vsnprintf @1466 - _vsnwprintf @1467 - _wcsicmp @1468 - _wcslwr @1469 - _wcsnicmp @1470 - _wcsnset @1471 - _wcsrev @1472 - _wcsupr @1473 - atoi @1474 - atol @1475 - isdigit @1476 - islower @1477 - isprint @1478 - isspace @1479 - isupper @1480 - isxdigit @1481 - mbstowcs @1482 - mbtowc @1483 - memchr @1484 - memcpy @1485 - memmove @1486 - memset @1487 - qsort @1488 - rand @1489 - sprintf @1490 - srand @1491 - strcat @1492 - strchr @1493 - strcmp @1494 - strcpy @1495 - strlen @1496 - strncat @1497 - strncmp @1498 - strncpy @1499 - strrchr @1500 - strspn @1501 - strstr @1502 - swprintf @1503 - tolower @1504 - toupper @1505 - towlower @1506 - towupper @1507 - vDbgPrintEx@16 @1508 - vDbgPrintExWithPrefix@20 @1509 - vsprintf @1510 - wcscat @1511 - wcschr @1512 - wcscmp @1513 - wcscpy @1514 - wcscspn @1515 - wcslen @1516 - wcsncat @1517 - wcsncmp @1518 - wcsncpy @1519 - wcsrchr @1520 - wcsspn @1521 - wcsstr @1522 - wcstombs @1523 - wctomb @1524 + VfFailSystemBIOS @1304 + VfIsVerificationEnabled@8 @1305 + WRITE_REGISTER_BUFFER_UCHAR@12 @1306 + WRITE_REGISTER_BUFFER_ULONG@12 @1307 + WRITE_REGISTER_BUFFER_USHORT@12 @1308 + WRITE_REGISTER_UCHAR@8 @1309 + WRITE_REGISTER_ULONG@8 @1310 + WRITE_REGISTER_USHORT@8 @1311 + WmiQueryTraceInformation@20 @1312 + WmiTraceMessage @1313 + WmiTraceMessageVa@24 @1314 + ZwAccessCheckAndAuditAlarm@44 @1315 + ZwAddBootEntry@8 @1316 + ZwAddDriverEntry@8 @1317 + ZwAdjustPrivilegesToken@24 @1318 + ZwAlertThread@4 @1319 + ZwAllocateVirtualMemory@24 @1320 + ZwAssignProcessToJobObject@8 @1321 + ZwCancelIoFile@8 @1322 + ZwCancelTimer@8 @1323 + ZwClearEvent@4 @1324 + ZwClose@4 @1325 + ZwCloseObjectAuditAlarm@12 @1326 + ZwConnectPort@32 @1327 + ZwCreateDirectoryObject@12 @1328 + ZwCreateEvent@20 @1329 + ZwCreateFile@44 @1330 + ZwCreateJobObject@12 @1331 + ZwCreateKey@28 @1332 + ZwCreateSection@28 @1333 + ZwCreateSymbolicLinkObject@16 @1334 + ZwCreateTimer@16 @1335 + ZwDeleteBootEntry@4 @1336 + ZwDeleteDriverEntry@4 @1337 + ZwDeleteFile@4 @1338 + ZwDeleteKey@4 @1339 + ZwDeleteValueKey@8 @1340 + ZwDeviceIoControlFile@40 @1341 + ZwDisplayString@4 @1342 + ZwDuplicateObject@28 @1343 + ZwDuplicateToken@24 @1344 + ZwEnumerateBootEntries@8 @1345 + ZwEnumerateDriverEntries@8 @1346 + ZwEnumerateKey@24 @1347 + ZwEnumerateValueKey@24 @1348 + ZwFlushInstructionCache@12 @1349 + ZwFlushKey@4 @1350 + ZwFlushVirtualMemory@16 @1351 + ZwFreeVirtualMemory@16 @1352 + ZwFsControlFile@40 @1353 + ZwInitiatePowerAction@16 @1354 + ZwIsProcessInJob@8 @1355 + ZwLoadDriver@4 @1356 + ZwLoadKey@8 @1357 + ZwMakeTemporaryObject@4 @1358 + ZwMapViewOfSection@40 @1359 + ZwModifyBootEntry@4 @1360 + ZwModifyDriverEntry@4 @1361 + ZwNotifyChangeKey@40 @1362 + ZwOpenDirectoryObject@12 @1363 + ZwOpenEvent@12 @1364 + ZwOpenFile@24 @1365 + ZwOpenJobObject@12 @1366 + ZwOpenKey@12 @1367 + ZwOpenProcess@16 @1368 + ZwOpenProcessToken@12 @1369 + ZwOpenProcessTokenEx@16 @1370 + ZwOpenSection@12 @1371 + ZwOpenSymbolicLinkObject@12 @1372 + ZwOpenThread@16 @1373 + ZwOpenThreadToken@16 @1374 + ZwOpenThreadTokenEx@20 @1375 + ZwOpenTimer@12 @1376 + ZwPowerInformation@20 @1377 + ZwPulseEvent@8 @1378 + ZwQueryBootEntryOrder@8 @1379 + ZwQueryBootOptions@8 @1380 + ZwQueryDefaultLocale@8 @1381 + ZwQueryDefaultUILanguage@4 @1382 + ZwQueryDirectoryFile@44 @1383 + ZwQueryDirectoryObject@28 @1384 + ZwQueryDriverEntryOrder@8 @1385 + ZwQueryEaFile@36 @1386 + ZwQueryFullAttributesFile@8 @1387 + ZwQueryInformationAtom@20 @1388 + ZwQueryInformationFile@20 @1389 + ZwQueryInformationJobObject@20 @1390 + ZwQueryInformationProcess@20 @1391 + ZwQueryInformationThread@20 @1392 + ZwQueryInformationToken@20 @1393 + ZwQueryInstallUILanguage@4 @1394 + ZwQueryKey@20 @1395 + ZwQueryObject@20 @1396 + ZwQuerySection@20 @1397 + ZwQuerySecurityObject@20 @1398 + ZwQuerySymbolicLinkObject@12 @1399 + ZwQuerySystemInformation@16 @1400 + ZwQueryValueKey@24 @1401 + ZwQueryVolumeInformationFile@20 @1402 + ZwReadFile@36 @1403 + ZwReplaceKey@12 @1404 + ZwRequestWaitReplyPort@12 @1405 + ZwResetEvent@8 @1406 + ZwRestoreKey@12 @1407 + ZwSaveKey@8 @1408 + ZwSaveKeyEx@12 @1409 + ZwSecureConnectPort@36 @1410 + ZwSetBootEntryOrder@8 @1411 + ZwSetBootOptions@8 @1412 + ZwSetDefaultLocale@8 @1413 + ZwSetDefaultUILanguage@4 @1414 + ZwSetDriverEntryOrder@8 @1415 + ZwSetEaFile@16 @1416 + ZwSetEvent@8 @1417 + ZwSetInformationFile@20 @1418 + ZwSetInformationJobObject@16 @1419 + ZwSetInformationObject@16 @1420 + ZwSetInformationProcess@16 @1421 + ZwSetInformationThread@16 @1422 + ZwSetSecurityObject@12 @1423 + ZwSetSystemInformation@12 @1424 + ZwSetSystemTime@8 @1425 + ZwSetTimer@28 @1426 + ZwSetValueKey@24 @1427 + ZwSetVolumeInformationFile@20 @1428 + ZwTerminateJobObject@8 @1429 + ZwTerminateProcess@8 @1430 + ZwTranslateFilePath@16 @1431 + ZwUnloadDriver@4 @1432 + ZwUnloadKey@4 @1433 + ZwUnmapViewOfSection@8 @1434 + ZwWaitForMultipleObjects@20 @1435 + ZwWaitForSingleObject@12 @1436 + ZwWriteFile@36 @1437 + ZwYieldExecution@0 @1438 + _abnormal_termination @1439 + _alldiv @1440 + _alldvrm @1441 + _allmul @1442 + _alloca_probe @1443 + _allrem @1444 + _allshl @1445 + _allshr @1446 + _aulldiv @1447 + _aulldvrm @1448 + _aullrem @1449 + _aullshr @1450 + _except_handler2 @1451 + _except_handler3 @1452 + _global_unwind2 @1453 + _itoa @1454 + _itow @1455 + _local_unwind2 @1456 + _purecall @1457 + _snprintf @1458 + _snwprintf @1459 + _stricmp @1460 + _strlwr @1461 + _strnicmp @1462 + _strnset @1463 + _strrev @1464 + _strset @1465 + _strupr @1466 + _vsnprintf @1467 + _vsnwprintf @1468 + _wcsicmp @1469 + _wcslwr @1470 + _wcsnicmp @1471 + _wcsnset @1472 + _wcsrev @1473 + _wcsupr @1474 + atoi @1475 + atol @1476 + isdigit @1477 + islower @1478 + isprint @1479 + isspace @1480 + isupper @1481 + isxdigit @1482 + mbstowcs @1483 + mbtowc @1484 + memchr @1485 + memcpy @1486 + memmove @1487 + memset @1488 + qsort @1489 + rand @1490 + sprintf @1491 + srand @1492 + strcat @1493 + strchr @1494 + strcmp @1495 + strcpy @1496 + strlen @1497 + strncat @1498 + strncmp @1499 + strncpy @1500 + strrchr @1501 + strspn @1502 + strstr @1503 + swprintf @1504 + tolower @1505 + toupper @1506 + towlower @1507 + towupper @1508 + vDbgPrintEx@16 @1509 + vDbgPrintExWithPrefix@20 @1510 + vsprintf @1511 + wcscat @1512 + wcschr @1513 + wcscmp @1514 + wcscpy @1515 + wcscspn @1516 + wcslen @1517 + wcsncat @1518 + wcsncmp @1519 + wcsncpy @1520 + wcsrchr @1521 + wcsspn @1522 + wcsstr @1523 + wcstombs @1524 + wctomb @1525 diff --git a/ntoskrnl/po/power.c b/ntoskrnl/po/power.c index 971691fa765..a163b98bc48 100644 --- a/ntoskrnl/po/power.c +++ b/ntoskrnl/po/power.c @@ -659,6 +659,7 @@ NtSetSystemPowerState(IN POWER_ACTION SystemAction, KPROCESSOR_MODE PreviousMode = KeGetPreviousMode(); POP_POWER_ACTION Action = {0}; NTSTATUS Status; + ULONG Dummy; /* Check for invalid parameter combinations */ if ((MinSystemState >= PowerSystemMaximum) || @@ -742,9 +743,12 @@ NtSetSystemPowerState(IN POWER_ACTION SystemAction, /* Check if we're still in an invalid status */ if (!NT_SUCCESS(Status)) break; + + /* Flush dirty cache pages */ + CcRosFlushDirtyPages(-1, &Dummy); /* Flush all volumes and the registry */ - DPRINT1("Flushing volumes\n"); + DPRINT1("Flushing volumes, cache flushed %d pages\n", Dummy); PopFlushVolumes(PopAction.Shutdown); /* Set IRP for drivers */ diff --git a/ntoskrnl/ps/psmgr.c b/ntoskrnl/ps/psmgr.c index d090ab85588..dbc9a660cfc 100644 --- a/ntoskrnl/ps/psmgr.c +++ b/ntoskrnl/ps/psmgr.c @@ -15,6 +15,10 @@ extern ULONG ExpInitializationPhase; extern BOOLEAN SysThreadCreated; +PVOID KeUserPopEntrySListEnd; +PVOID KeUserPopEntrySListFault; +PVOID KeUserPopEntrySListResume; + GENERIC_MAPPING PspProcessMapping = { STANDARD_RIGHTS_READ | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, @@ -187,10 +191,24 @@ PspLookupKernelUserEntryPoints(VOID) &KeRaiseUserExceptionDispatcher); if (!NT_SUCCESS(Status)) return Status; + /* Get user-mode SLIST exception functions for page fault rollback race hack */ + Status = PspLookupSystemDllEntryPoint("ExpInterlockedPopEntrySListEnd", + &KeUserPopEntrySListEnd); + if (!NT_SUCCESS(Status)) { DPRINT1("this not found\n"); return Status; } + Status = PspLookupSystemDllEntryPoint("ExpInterlockedPopEntrySListFault", + &KeUserPopEntrySListFault); + if (!NT_SUCCESS(Status)) { DPRINT1("this not found\n"); return Status; } + Status = PspLookupSystemDllEntryPoint("ExpInterlockedPopEntrySListResume", + &KeUserPopEntrySListResume); + if (!NT_SUCCESS(Status)) { DPRINT1("this not found\n"); return Status; } + + /* On x86, there are multiple ways to do a system call, find the right stubs */ +#if defined(_X86_) /* Check if this is a machine that supports SYSENTER */ if (KeFeatureBits & KF_FAST_SYSCALL) { /* Get user-mode sysenter stub */ + SharedUserdata->SystemCall = (PsNtosImageBase >> (PAGE_SHIFT + 1)); Status = PspLookupSystemDllEntryPoint("KiFastSystemCall", (PVOID)&SharedUserData-> SystemCall); @@ -213,6 +231,7 @@ PspLookupKernelUserEntryPoints(VOID) /* Set the test instruction */ SharedUserData->TestRetInstruction = 0xC3; +#endif /* Return the status */ return Status; diff --git a/ntoskrnl/rtl/libsupp.c b/ntoskrnl/rtl/libsupp.c index aba04f1042e..5f9e0c10d5a 100644 --- a/ntoskrnl/rtl/libsupp.c +++ b/ntoskrnl/rtl/libsupp.c @@ -157,36 +157,35 @@ RtlGetCurrentPeb(VOID) NTSTATUS NTAPI RtlDeleteHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - ASSERT(FALSE); + ExDeleteResource(&Lock->Resource); return STATUS_SUCCESS; } NTSTATUS NTAPI RtlEnterHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - ASSERT(FALSE); - return STATUS_SUCCESS; + return ExAcquireResourceExclusive(&Lock->Resource, TRUE); } NTSTATUS NTAPI RtlInitializeHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - ASSERT(FALSE); - return STATUS_SUCCESS; + ExInitializeResource(&Lock->Resource); + return STATUS_SUCCESS; } NTSTATUS NTAPI RtlLeaveHeapLock( - PRTL_CRITICAL_SECTION CriticalSection) + PHEAP_LOCK Lock) { - ASSERT(FALSE); + ExReleaseResource(&Lock->Resource); return STATUS_SUCCESS; } diff --git a/ntoskrnl/se/access.c b/ntoskrnl/se/access.c index fdf4f1376b3..b4ebe9f9bbd 100644 --- a/ntoskrnl/se/access.c +++ b/ntoskrnl/se/access.c @@ -331,15 +331,36 @@ SeCreateClientSecurityFromSubjectContext(IN PSECURITY_SUBJECT_CONTEXT SubjectCon } /* - * @unimplemented + * @implemented */ NTSTATUS NTAPI SeImpersonateClientEx(IN PSECURITY_CLIENT_CONTEXT ClientContext, IN PETHREAD ServerThread OPTIONAL) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + BOOLEAN EffectiveOnly; + + PAGED_CODE(); + + if (ClientContext->DirectlyAccessClientToken == FALSE) + { + EffectiveOnly = ClientContext->SecurityQos.EffectiveOnly; + } + else + { + EffectiveOnly = ClientContext->DirectAccessEffectiveOnly; + } + + if (ServerThread == NULL) + { + ServerThread = PsGetCurrentThread(); + } + + return PsImpersonateClient(ServerThread, + ClientContext->ClientToken, + TRUE, + EffectiveOnly, + ClientContext->SecurityQos.ImpersonationLevel); } /* @@ -350,29 +371,10 @@ NTAPI SeImpersonateClient(IN PSECURITY_CLIENT_CONTEXT ClientContext, IN PETHREAD ServerThread OPTIONAL) { - UCHAR b; - PAGED_CODE(); - if (ClientContext->DirectlyAccessClientToken == FALSE) - { - b = ClientContext->SecurityQos.EffectiveOnly; - } - else - { - b = ClientContext->DirectAccessEffectiveOnly; - } - - if (ServerThread == NULL) - { - ServerThread = PsGetCurrentThread(); - } - - PsImpersonateClient(ServerThread, - ClientContext->ClientToken, - 1, - b, - ClientContext->SecurityQos.ImpersonationLevel); + SeImpersonateClientEx(ClientContext, + ServerThread); } /* EOF */ diff --git a/ntoskrnl/vf/driver.c b/ntoskrnl/vf/driver.c index 8f9cc2b2ee1..cf7b61e074d 100644 --- a/ntoskrnl/vf/driver.c +++ b/ntoskrnl/vf/driver.c @@ -43,4 +43,20 @@ VfFailDeviceNode(IN PDEVICE_OBJECT PhysicalDeviceObject, UNIMPLEMENTED; } +/* + * @unimplemented + */ +VOID +NTAPI +VfFailSystemBIOS(IN ULONG BugCheckMajorCode, + IN ULONG BugCheckMinorCode, + IN VF_FAILURE_CLASS FailureClass, + IN OUT PULONG AssertionControl, + IN PSTR DebuggerMessageText, + IN PSTR ParameterFormatString, + ...) +{ + UNIMPLEMENTED; +} + /* EOF */ diff --git a/subsystems/win32/csrss/csrsrv/init.c b/subsystems/win32/csrss/csrsrv/init.c index c66411cf18a..fa8d6273765 100644 --- a/subsystems/win32/csrss/csrsrv/init.c +++ b/subsystems/win32/csrss/csrsrv/init.c @@ -38,7 +38,20 @@ InitializeVideoAddressSpace(VOID) LARGE_INTEGER Offset; SIZE_T ViewSize; CHAR IVTAndBda[1024+256]; - + + /* Free the 1MB pre-reserved region. In reality, ReactOS should simply support us mapping the view into the reserved area, but it doesn't. */ + BaseAddress = 0; + ViewSize = 1024 * 1024; + Status = ZwFreeVirtualMemory(NtCurrentProcess(), + &BaseAddress, + &ViewSize, + MEM_RELEASE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Couldn't unmap reserved memory (%x)\n", Status); + return 0; + } + /* Open the physical memory section */ InitializeObjectAttributes(&ObjectAttributes, &PhysMemName, @@ -94,7 +107,7 @@ InitializeVideoAddressSpace(VOID) &BaseAddress, 0, &ViewSize, - MEM_COMMIT, + MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (!NT_SUCCESS(Status)) { diff --git a/subsystems/win32/csrss/win32csr/dllmain.c b/subsystems/win32/csrss/win32csr/dllmain.c index 081788394bb..f38558838e8 100644 --- a/subsystems/win32/csrss/win32csr/dllmain.c +++ b/subsystems/win32/csrss/win32csr/dllmain.c @@ -145,6 +145,13 @@ Win32CsrInitComplete(void) return TRUE; } +VOID +WINAPI +PrivateCsrssManualGuiCheck(LONG Check) +{ + NtUserCallOneParam(Check, ONEPARAM_ROUTINE_CSRSS_GUICHECK); +} + BOOL WINAPI Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions, PCSRPLUGIN_SERVER_PROCS ServerProcs, diff --git a/subsystems/win32/win32k/eng/engwindow.c b/subsystems/win32/win32k/eng/engwindow.c index 5628610e58e..11eae9ef8e0 100644 --- a/subsystems/win32/win32k/eng/engwindow.c +++ b/subsystems/win32/win32k/eng/engwindow.c @@ -71,13 +71,13 @@ IntEngWndCallChangeProc( } /* - * Fills the CLIPOBJ and client rect of the WNDOBJ with the data from the given WINDOW_OBJECT + * Fills the CLIPOBJ and client rect of the WNDOBJ with the data from the given WND */ BOOLEAN FASTCALL IntEngWndUpdateClipObj( WNDGDI *WndObjInt, - PWINDOW_OBJECT Window) + PWND Window) { HRGN hVisRgn; PROSRGNDATA visRgn; @@ -89,7 +89,7 @@ IntEngWndUpdateClipObj( hVisRgn = VIS_ComputeVisibleRegion(Window, TRUE, TRUE, TRUE); if (hVisRgn != NULL) { - NtGdiOffsetRgn(hVisRgn, Window->Wnd->rcClient.left, Window->Wnd->rcClient.top); + NtGdiOffsetRgn(hVisRgn, Window->rcClient.left, Window->rcClient.top); visRgn = RGNOBJAPI_Lock(hVisRgn, NULL); if (visRgn != NULL) { @@ -127,8 +127,8 @@ IntEngWndUpdateClipObj( if (ClipObj == NULL) { /* Fall back to client rect */ - ClipObj = IntEngCreateClipRegion(1, &Window->Wnd->rcClient, - &Window->Wnd->rcClient); + ClipObj = IntEngCreateClipRegion(1, &Window->rcClient, + &Window->rcClient); } if (ClipObj == NULL) @@ -138,7 +138,7 @@ IntEngWndUpdateClipObj( } RtlCopyMemory(&WndObjInt->WndObj.coClient, ClipObj, sizeof (CLIPOBJ)); - RtlCopyMemory(&WndObjInt->WndObj.rclClient, &Window->Wnd->rcClient, sizeof (RECT)); + RtlCopyMemory(&WndObjInt->WndObj.rclClient, &Window->rcClient, sizeof (RECT)); OldClipObj = InterlockedExchangePointer((PVOID*)&WndObjInt->ClientClipObj, ClipObj); if (OldClipObj != NULL) IntEngDeleteClipRegion(OldClipObj); @@ -147,12 +147,12 @@ IntEngWndUpdateClipObj( } /* - * Updates all WNDOBJs of the given WINDOW_OBJECT and calls the change-procs. + * Updates all WNDOBJs of the given WND and calls the change-procs. */ VOID FASTCALL IntEngWindowChanged( - PWINDOW_OBJECT Window, + PWND Window, FLONG flChanged) { WNDGDI *Current; @@ -160,7 +160,7 @@ IntEngWindowChanged( ASSERT_IRQL_LESS_OR_EQUAL(PASSIVE_LEVEL); - hWnd = Window->hSelf; // pWnd->head.h; + hWnd = Window->head.h; Current = (WNDGDI *)IntGetProp(Window, AtomWndObj); if ( gcountPWO && @@ -206,7 +206,7 @@ EngCreateWnd( { WNDGDI *WndObjInt = NULL; WNDOBJ *WndObjUser = NULL; - PWINDOW_OBJECT Window; + PWND Window; BOOL calledFromUser; DECLARE_RETURN(WNDOBJ*); @@ -279,7 +279,7 @@ EngDeleteWnd( IN WNDOBJ *pwo) { WNDGDI *WndObjInt = ObjToGDI(pwo, WND); - PWINDOW_OBJECT Window; + PWND Window; BOOL calledFromUser; DPRINT("EngDeleteWnd: pwo = 0x%x\n", pwo); diff --git a/subsystems/win32/win32k/include/caret.h b/subsystems/win32/win32k/include/caret.h index 8c7998c0c6f..605718828d7 100644 --- a/subsystems/win32/win32k/include/caret.h +++ b/subsystems/win32/win32k/include/caret.h @@ -17,8 +17,8 @@ co_IntSetCaretPos(int X, int Y); BOOL FASTCALL IntSwitchCaretShowing(PVOID Info); -BOOL FASTCALL co_UserShowCaret(PWINDOW_OBJECT WindowObject); +BOOL FASTCALL co_UserShowCaret(PWND WindowObject); -BOOL FASTCALL co_UserHideCaret(PWINDOW_OBJECT WindowObject); +BOOL FASTCALL co_UserHideCaret(PWND WindowObject); /* EOF */ diff --git a/subsystems/win32/win32k/include/clipboard.h b/subsystems/win32/win32k/include/clipboard.h index 819ba98477b..b7251baa1db 100644 --- a/subsystems/win32/win32k/include/clipboard.h +++ b/subsystems/win32/win32k/include/clipboard.h @@ -7,7 +7,7 @@ VOID FASTCALL IntIncrementSequenceNumber(VOID); typedef struct _ClipboardChainElement { - PWINDOW_OBJECT window; + PWND window; struct _ClipboardChainElement *next; } CLIPBOARDCHAINELEMENT, *PCLIPBOARDCHAINELEMENT; @@ -23,9 +23,9 @@ typedef struct _CLIPBOARDSYSTEM { PTHREADINFO ClipboardThread; PTHREADINFO ClipboardOwnerThread; - PWINDOW_OBJECT ClipboardWindow; - PWINDOW_OBJECT ClipboardViewerWindow; - PWINDOW_OBJECT ClipboardOwnerWindow; + PWND ClipboardWindow; + PWND ClipboardViewerWindow; + PWND ClipboardOwnerWindow; BOOL sendDrawClipboardMsg; BOOL recentlySetClipboard; BOOL delayedRender; @@ -41,7 +41,7 @@ typedef struct _CLIPBOARDSYSTEM } CLIPBOARDSYSTEM, *PCLIPBOARDSYSTEM; VOID FASTCALL -IntClipboardFreeWindow(PWINDOW_OBJECT window); +IntClipboardFreeWindow(PWND window); UINT APIENTRY IntEnumClipboardFormats(UINT format); diff --git a/subsystems/win32/win32k/include/cursoricon.h b/subsystems/win32/win32k/include/cursoricon.h index 61d60b369bf..1a66dbc5408 100644 --- a/subsystems/win32/win32k/include/cursoricon.h +++ b/subsystems/win32/win32k/include/cursoricon.h @@ -22,15 +22,6 @@ typedef struct _CURICON_OBJECT ICONINFO IconInfo; } CURICON_OBJECT, *PCURICON_OBJECT; -typedef struct _CURSORCLIP_INFO -{ - BOOL IsClipped; - UINT Left; - UINT Top; - UINT Right; - UINT Bottom; -} CURSORCLIP_INFO, *PCURSORCLIP_INFO; - typedef struct _CURSORACCELERATION_INFO { UINT FirstThreshold; @@ -45,7 +36,8 @@ typedef struct _SYSTEM_CURSORINFO DWORD ClickLockTime; // BOOL SwapButtons; UINT ButtonsDown; - CURSORCLIP_INFO CursorClipInfo; + RECTL rcClip; + BOOL bClipped; PCURICON_OBJECT CurrentCursorObject; INT ShowingCursor; /* diff --git a/subsystems/win32/win32k/include/dce.h b/subsystems/win32/win32k/include/dce.h index de83e8a5c02..78203243380 100644 --- a/subsystems/win32/win32k/include/dce.h +++ b/subsystems/win32/win32k/include/dce.h @@ -50,7 +50,7 @@ typedef struct tagDCE #define DCX_INDESTROY 0x00400000 BOOL FASTCALL DCE_Cleanup(PDCE pDce); -PDCE FASTCALL DceAllocDCE(PWINDOW_OBJECT Window, DCE_TYPE Type); +PDCE FASTCALL DceAllocDCE(PWND Window, DCE_TYPE Type); PDCE FASTCALL DCE_FreeDCE(PDCE dce); VOID FASTCALL DCE_FreeWindowDCE(HWND); INT FASTCALL DCE_ExcludeRgn(HDC, HWND, HRGN); @@ -58,8 +58,8 @@ BOOL FASTCALL DCE_InvalidateDCE(HWND, const PRECTL); HWND FASTCALL IntWindowFromDC(HDC hDc); PDCE FASTCALL DceFreeDCE(PDCE dce, BOOLEAN Force); void FASTCALL DceEmptyCache(void); -VOID FASTCALL DceResetActiveDCEs(PWINDOW_OBJECT Window); +VOID FASTCALL DceResetActiveDCEs(PWND Window); void FASTCALL DceFreeClassDCE(HDC); HWND FASTCALL UserGethWnd(HDC,PWNDOBJ*); -void FASTCALL DceFreeWindowDCE(PWINDOW_OBJECT); +void FASTCALL DceFreeWindowDCE(PWND); void FASTCALL DceFreeThreadDCE(PTHREADINFO); diff --git a/subsystems/win32/win32k/include/desktop.h b/subsystems/win32/win32k/include/desktop.h index 406ee7bef0e..83ec40ceaf8 100644 --- a/subsystems/win32/win32k/include/desktop.h +++ b/subsystems/win32/win32k/include/desktop.h @@ -76,7 +76,7 @@ IntGetScreenDC(VOID); HWND FASTCALL IntGetDesktopWindow (VOID); -PWINDOW_OBJECT FASTCALL +PWND FASTCALL UserGetDesktopWindow(VOID); HWND FASTCALL diff --git a/subsystems/win32/win32k/include/eng.h b/subsystems/win32/win32k/include/eng.h index 82e24631c79..5d95070c03c 100644 --- a/subsystems/win32/win32k/include/eng.h +++ b/subsystems/win32/win32k/include/eng.h @@ -15,7 +15,7 @@ IntEngMaskBlt(SURFOBJ *psoDest, VOID FASTCALL IntEngWindowChanged( - PWINDOW_OBJECT Window, + PWND Window, FLONG flChanged); VOID FASTCALL IntGdiAcquireSemaphore ( HSEMAPHORE hsem ); diff --git a/subsystems/win32/win32k/include/focus.h b/subsystems/win32/win32k/include/focus.h index 859d1c75849..299efb56e0f 100644 --- a/subsystems/win32/win32k/include/focus.h +++ b/subsystems/win32/win32k/include/focus.h @@ -17,8 +17,8 @@ HWND APIENTRY IntGetCapture(VOID); HWND FASTCALL UserGetActiveWindow(VOID); BOOL FASTCALL -co_IntMouseActivateWindow(PWINDOW_OBJECT Window); +co_IntMouseActivateWindow(PWND Window); BOOL FASTCALL -co_IntSetForegroundWindow(PWINDOW_OBJECT Window); +co_IntSetForegroundWindow(PWND Window); HWND FASTCALL -co_IntSetActiveWindow(PWINDOW_OBJECT Window); +co_IntSetActiveWindow(PWND Window); diff --git a/subsystems/win32/win32k/include/hotkey.h b/subsystems/win32/win32k/include/hotkey.h index 1e1c6636c96..c03e6ebc010 100644 --- a/subsystems/win32/win32k/include/hotkey.h +++ b/subsystems/win32/win32k/include/hotkey.h @@ -27,7 +27,7 @@ GetHotKey (UINT fsModifiers, int *id); VOID FASTCALL -UnregisterWindowHotKeys(PWINDOW_OBJECT Window); +UnregisterWindowHotKeys(PWND Window); VOID FASTCALL UnregisterThreadHotKeys(struct _ETHREAD *Thread); diff --git a/subsystems/win32/win32k/include/menu.h b/subsystems/win32/win32k/include/menu.h index 94d7106baa3..6b86b62e8ad 100644 --- a/subsystems/win32/win32k/include/menu.h +++ b/subsystems/win32/win32k/include/menu.h @@ -94,7 +94,7 @@ IntCheckMenuItem(PMENU_OBJECT MenuObject, UINT uIDCheckItem, UINT uCheck); BOOL FASTCALL IntSetMenuItemRect(PMENU_OBJECT MenuObject, UINT Item, BOOL fByPos, RECTL *rcRect); -DWORD APIENTRY UserInsertMenuItem(HMENU hMenu, UINT uItem, BOOL fByPosition, LPCMENUITEMINFOW lpmii); +DWORD FASTCALL UserInsertMenuItem(PMENU_OBJECT Menu, UINT uItem, BOOL fByPosition, LPCMENUITEMINFOW lpmii); BOOL FASTCALL IntCleanupMenus(struct _EPROCESS *Process, PPROCESSINFO Win32Process); diff --git a/subsystems/win32/win32k/include/msgqueue.h b/subsystems/win32/win32k/include/msgqueue.h index 07ebc53abab..e35ab0f5a15 100644 --- a/subsystems/win32/win32k/include/msgqueue.h +++ b/subsystems/win32/win32k/include/msgqueue.h @@ -11,7 +11,6 @@ typedef struct _USER_MESSAGE { LIST_ENTRY ListEntry; - BOOLEAN FreeLParam; MSG Msg; } USER_MESSAGE, *PUSER_MESSAGE; @@ -116,19 +115,19 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, UINT uTimeout, BOOL Block, INT HookMessage, ULONG_PTR *uResult); PUSER_MESSAGE FASTCALL -MsqCreateMessage(LPMSG Msg, BOOLEAN FreeLParam); +MsqCreateMessage(LPMSG Msg); VOID FASTCALL MsqDestroyMessage(PUSER_MESSAGE Message); VOID FASTCALL MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, - MSG* Msg, BOOLEAN FreeLParam, DWORD MessageBits); + MSG* Msg, BOOLEAN HardwareMessage, DWORD MessageBits); VOID FASTCALL MsqPostQuitMessage(PUSER_MESSAGE_QUEUE MessageQueue, ULONG ExitCode); BOOLEAN APIENTRY co_MsqFindMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, IN BOOLEAN Hardware, IN BOOLEAN Remove, - IN PWINDOW_OBJECT Window, + IN PWND Window, IN UINT MsgFilterLow, IN UINT MsgFilterHigh, OUT PUSER_MESSAGE* Message); @@ -147,7 +146,7 @@ MsqInitializeImpl(VOID); BOOLEAN FASTCALL co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue); NTSTATUS FASTCALL -co_MsqWaitForNewMessages(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT WndFilter, +co_MsqWaitForNewMessages(PUSER_MESSAGE_QUEUE MessageQueue, PWND WndFilter, UINT MsgFilterMin, UINT MsgFilterMax); VOID FASTCALL MsqSendNotifyMessage(PUSER_MESSAGE_QUEUE MessageQueue, diff --git a/subsystems/win32/win32k/include/painting.h b/subsystems/win32/win32k/include/painting.h index ed7bea47f64..91385ca1be1 100644 --- a/subsystems/win32/win32k/include/painting.h +++ b/subsystems/win32/win32k/include/painting.h @@ -5,11 +5,11 @@ #include BOOL FASTCALL -co_UserRedrawWindow(PWINDOW_OBJECT Wnd, const RECTL* UpdateRect, HRGN UpdateRgn, ULONG Flags); +co_UserRedrawWindow(PWND Wnd, const RECTL* UpdateRect, HRGN UpdateRgn, ULONG Flags); VOID FASTCALL -IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags); +IntInvalidateWindows(PWND Window, HRGN hRgn, ULONG Flags); BOOL FASTCALL -IntGetPaintMessage(PWINDOW_OBJECT Window, UINT MsgFilterMin, UINT MsgFilterMax, PTHREADINFO Thread, +IntGetPaintMessage(PWND Window, UINT MsgFilterMin, UINT MsgFilterMax, PTHREADINFO Thread, MSG *Message, BOOL Remove); INT FASTCALL UserRealizePalette(HDC); -INT FASTCALL co_UserGetUpdateRgn(PWINDOW_OBJECT, HRGN, BOOL); +INT FASTCALL co_UserGetUpdateRgn(PWND, HRGN, BOOL); diff --git a/subsystems/win32/win32k/include/prop.h b/subsystems/win32/win32k/include/prop.h index 4eb86525f95..08045569027 100644 --- a/subsystems/win32/win32k/include/prop.h +++ b/subsystems/win32/win32k/include/prop.h @@ -1,5 +1,5 @@ #pragma once -PPROPERTY FASTCALL IntGetProp(PWINDOW_OBJECT,ATOM); -BOOL FASTCALL IntRemoveProp(PWINDOW_OBJECT,ATOM); -BOOL FASTCALL IntSetProp(PWINDOW_OBJECT, ATOM, HANDLE); +PPROPERTY FASTCALL IntGetProp(PWND,ATOM); +BOOL FASTCALL IntRemoveProp(PWND,ATOM); +BOOL FASTCALL IntSetProp(PWND, ATOM, HANDLE); diff --git a/subsystems/win32/win32k/include/scroll.h b/subsystems/win32/win32k/include/scroll.h index 171a4eb8389..429de28219f 100644 --- a/subsystems/win32/win32k/include/scroll.h +++ b/subsystems/win32/win32k/include/scroll.h @@ -43,21 +43,21 @@ typedef struct tagSBTRACK PSBCALC pSBCalc; } SBTRACK, *PSBTRACK; - +/* typedef struct _SBINFOEX { SCROLLBARINFO ScrollBarInfo; SCROLLINFO ScrollInfo; } SBINFOEX, *PSBINFOEX; - +*/ #define IntGetScrollbarInfoFromWindow(Window, i) \ - ((PSCROLLBARINFO)(&((Window)->pSBInfo + i)->ScrollBarInfo)) + ((PSCROLLBARINFO)(&((Window)->pSBInfoex + i)->ScrollBarInfo)) #define IntGetScrollInfoFromWindow(Window, i) \ - ((LPSCROLLINFO)(&((Window)->pSBInfo + i)->ScrollInfo)) + ((LPSCROLLINFO)(&((Window)->pSBInfoex + i)->ScrollInfo)) #define SBOBJ_TO_SBID(Obj) ((Obj) - OBJID_HSCROLL) #define SBID_IS_VALID(id) (id == SB_HORZ || id == SB_VERT || id == SB_CTL) -BOOL FASTCALL co_IntCreateScrollBars(PWINDOW_OBJECT Window); -BOOL FASTCALL IntDestroyScrollBars(PWINDOW_OBJECT Window); +BOOL FASTCALL co_IntCreateScrollBars(PWND Window); +BOOL FASTCALL IntDestroyScrollBars(PWND Window); diff --git a/subsystems/win32/win32k/include/timer.h b/subsystems/win32/win32k/include/timer.h index 9b2b07f8c9d..20faa683526 100644 --- a/subsystems/win32/win32k/include/timer.h +++ b/subsystems/win32/win32k/include/timer.h @@ -5,7 +5,7 @@ typedef struct _TIMER HEAD head; LIST_ENTRY ptmrList; PTHREADINFO pti; - PWINDOW_OBJECT pWnd; // hWnd + PWND pWnd; // hWnd UINT_PTR nID; // Specifies a nonzero timer identifier. INT cmsCountdown; // uElapse INT cmsRate; // uElapse @@ -28,13 +28,13 @@ extern PKTIMER MasterTimer; NTSTATUS FASTCALL InitTimerImpl(VOID); BOOL FASTCALL DestroyTimersForThread(PTHREADINFO pti); -BOOL FASTCALL DestroyTimersForWindow(PTHREADINFO pti, PWINDOW_OBJECT Window); -BOOL FASTCALL IntKillTimer(PWINDOW_OBJECT Window, UINT_PTR IDEvent, BOOL SystemTimer); -UINT_PTR FASTCALL IntSetTimer(PWINDOW_OBJECT Window, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, INT Type); +BOOL FASTCALL DestroyTimersForWindow(PTHREADINFO pti, PWND Window); +BOOL FASTCALL IntKillTimer(PWND Window, UINT_PTR IDEvent, BOOL SystemTimer); +UINT_PTR FASTCALL IntSetTimer(PWND Window, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, INT Type); PTIMER FASTCALL FindSystemTimer(PMSG); -BOOL FASTCALL ValidateTimerCallback(PTHREADINFO,PWINDOW_OBJECT,WPARAM,LPARAM); +BOOL FASTCALL ValidateTimerCallback(PTHREADINFO,LPARAM); VOID CALLBACK SystemTimerProc(HWND,UINT,UINT_PTR,DWORD); -UINT_PTR FASTCALL SystemTimerSet(PWINDOW_OBJECT,UINT_PTR,UINT,TIMERPROC); -BOOL FASTCALL PostTimerMessages(PWINDOW_OBJECT); +UINT_PTR FASTCALL SystemTimerSet(PWND,UINT_PTR,UINT,TIMERPROC); +BOOL FASTCALL PostTimerMessages(PWND); VOID FASTCALL ProcessTimers(VOID); VOID FASTCALL StartTheTimers(VOID); diff --git a/subsystems/win32/win32k/include/userfuncs.h b/subsystems/win32/win32k/include/userfuncs.h index d31e66faea9..9ef6b27e8c3 100644 --- a/subsystems/win32/win32k/include/userfuncs.h +++ b/subsystems/win32/win32k/include/userfuncs.h @@ -35,7 +35,7 @@ PMENU_OBJECT FASTCALL UserGetMenuObject(HMENU hMenu); #define DUMP_REFS(obj) DPRINT1("obj 0x%x, refs %i\n",obj, ((PHEAD)obj)->cLockObj) -PWINDOW_OBJECT FASTCALL IntGetWindowObject(HWND hWnd); +PWND FASTCALL IntGetWindowObject(HWND hWnd); /*************** WINSTA.C ***************/ @@ -44,7 +44,7 @@ HWINSTA FASTCALL UserGetProcessWindowStation(VOID); /*************** WINPOS.C ***************/ BOOL FASTCALL -UserGetClientOrigin(PWINDOW_OBJECT Window, LPPOINT Point); +UserGetClientOrigin(PWND Window, LPPOINT Point); /*************** FOCUS.C ***************/ @@ -52,18 +52,18 @@ HWND FASTCALL UserGetActiveWindow(VOID); HWND FASTCALL UserGetForegroundWindow(VOID); -HWND FASTCALL co_UserSetFocus(PWINDOW_OBJECT Window); +HWND FASTCALL co_UserSetFocus(PWND Window); /*************** WINDC.C ***************/ INT FASTCALL -UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc, BOOL EndPaint); +UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint); HDC FASTCALL -UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags); +UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags); HDC FASTCALL -UserGetWindowDC(PWINDOW_OBJECT Wnd); +UserGetWindowDC(PWND Wnd); /*************** SESSION.C ***************/ @@ -110,12 +110,12 @@ UserPostMessage(HWND Wnd, /*************** PAINTING.C ***************/ -BOOL FASTCALL co_UserValidateRgn(PWINDOW_OBJECT Window, HRGN hRgn); +BOOL FASTCALL co_UserValidateRgn(PWND Window, HRGN hRgn); /*************** WINDOW.C ***************/ -PWINDOW_OBJECT FASTCALL UserGetWindowObject(HWND hWnd); +PWND FASTCALL UserGetWindowObject(HWND hWnd); VOID FASTCALL co_DestroyThreadWindows(struct _ETHREAD *Thread); @@ -123,11 +123,11 @@ co_DestroyThreadWindows(struct _ETHREAD *Thread); HWND FASTCALL UserGetShellWindow(VOID); HDC FASTCALL -UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags); +UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags); -BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Wnd); +BOOLEAN FASTCALL co_UserDestroyWindow(PWND Wnd); -PWINDOW_OBJECT FASTCALL UserGetAncestor(PWINDOW_OBJECT Wnd, UINT Type); +PWND FASTCALL UserGetAncestor(PWND Wnd, UINT Type); /*************** MENU.C ***************/ @@ -148,6 +148,6 @@ BOOL FASTCALL UserDestroyMenu(HMENU hMenu); /*************** SCROLLBAR.C ***************/ DWORD FASTCALL -co_UserShowScrollBar(PWINDOW_OBJECT Window, int wBar, DWORD bShow); +co_UserShowScrollBar(PWND Window, int wBar, DWORD bShow); /* EOF */ diff --git a/subsystems/win32/win32k/include/vis.h b/subsystems/win32/win32k/include/vis.h index 5fd4a5fb82b..e81e478a7f6 100644 --- a/subsystems/win32/win32k/include/vis.h +++ b/subsystems/win32/win32k/include/vis.h @@ -13,10 +13,10 @@ #include HRGN FASTCALL -VIS_ComputeVisibleRegion(PWINDOW_OBJECT Window, BOOLEAN ClientArea, +VIS_ComputeVisibleRegion(PWND Window, BOOLEAN ClientArea, BOOLEAN ClipChildren, BOOLEAN ClipSiblings); VOID FASTCALL -co_VIS_WindowLayoutChanged(PWINDOW_OBJECT Window, HRGN UncoveredRgn); +co_VIS_WindowLayoutChanged(PWND Window, HRGN UncoveredRgn); /* EOF */ diff --git a/subsystems/win32/win32k/include/win32.h b/subsystems/win32/win32k/include/win32.h index 5de6139e1d3..63dfba76fe2 100644 --- a/subsystems/win32/win32k/include/win32.h +++ b/subsystems/win32/win32k/include/win32.h @@ -25,6 +25,7 @@ #define W32PF_SCREENSAVER 0x00200000 #define W32PF_IDLESCREENSAVER 0x00400000 #define W32PF_ICONTITLEREGISTERED 0x10000000 +#define W32PF_DPIAWARE 0x20000000 // ReactOS #define W32PF_NOWINDOWGHOSTING (0x01000000) #define W32PF_MANUALGUICHECK (0x02000000) @@ -93,6 +94,7 @@ typedef struct _THREADINFO HANDLE hEventQueueClient; PKEVENT pEventQueueServer; LIST_ENTRY PtiLink; + POINT ptLast; CLIENTTHREADINFO cti; // Used only when no Desktop or pcti NULL. /* ReactOS */ diff --git a/subsystems/win32/win32k/include/window.h b/subsystems/win32/win32k/include/window.h index 79a8df2d003..a91183a0153 100644 --- a/subsystems/win32/win32k/include/window.h +++ b/subsystems/win32/win32k/include/window.h @@ -17,44 +17,6 @@ extern ATOM AtomWndObj; /* WNDOBJ list */ BOOL FASTCALL UserUpdateUiState(PWND Wnd, WPARAM wParam); -typedef struct _WINDOW_OBJECT -{ - THRDESKHEAD head; - PWND Wnd; - - /* Pointer to the thread information */ - PTHREADINFO pti; // Use Wnd->head.pti - /* system menu handle. */ - HMENU SystemMenu; - /* Handle for the window. */ - HWND hSelf; // Use Wnd->head.h - /* Window flags. */ - ULONG state; - /* Handle of region of the window to be updated. */ - HANDLE hrgnUpdate; - /* Handle of the window region. */ - HANDLE hrgnClip; - struct _WINDOW_OBJECT* spwndChild; - struct _WINDOW_OBJECT* spwndNext; - struct _WINDOW_OBJECT* spwndPrev; - struct _WINDOW_OBJECT* spwndParent; - struct _WINDOW_OBJECT* spwndOwner; - - /* Scrollbar info */ - PSBINFOEX pSBInfo; // convert to PSBINFO - /* Entry in the list of thread windows. */ - LIST_ENTRY ThreadListEntry; -} WINDOW_OBJECT; /* PWINDOW_OBJECT already declared at top of file */ - -/* Window flags. */ -#define WINDOWOBJECT_NEED_SIZE WNDS_SENDSIZEMOVEMSGS -#define WINDOWOBJECT_NEED_ERASEBKGND WNDS_ERASEBACKGROUND -#define WINDOWOBJECT_NEED_NCPAINT WNDS_SENDNCPAINT -#define WINDOWOBJECT_RESTOREMAX (0x00000020) // Set/Clr WS_MAXIMIZE && Clr/Set WS_EX2_VERTICALLYMAXIMIZEDLEFT/RIGHT - -#define WINDOWSTATUS_DESTROYING WNDS2_INDESTROY -#define WINDOWSTATUS_DESTROYED WNDS_DESTROYED - #define HAS_DLGFRAME(Style, ExStyle) \ (((ExStyle) & WS_EX_DLGMODALFRAME) || \ (((Style) & WS_DLGFRAME) && (!((Style) & WS_THICKFRAME)))) @@ -74,23 +36,19 @@ typedef struct _WINDOW_OBJECT #define IntWndBelongsToThread(WndObj, W32Thread) \ - (((WndObj->pti->pEThread && WndObj->pti->pEThread->Tcb.Win32Thread)) && \ - (WndObj->pti->pEThread->Tcb.Win32Thread == W32Thread)) -// ((WndObj->head.pti) && (WndObj->head.pti == W32Thread)) + ((WndObj->head.pti) && (WndObj->head.pti == W32Thread)) #define IntGetWndThreadId(WndObj) \ - WndObj->pti->pEThread->Cid.UniqueThread -// WndObj->head.pti->pEThread->Cid.UniqueThread + WndObj->head.pti->pEThread->Cid.UniqueThread #define IntGetWndProcessId(WndObj) \ - WndObj->pti->pEThread->ThreadsProcess->UniqueProcessId -// WndObj->head.pti->pEThread->ThreadsProcess->UniqueProcessId + WndObj->head.pti->pEThread->ThreadsProcess->UniqueProcessId BOOL FASTCALL IntIsWindow(HWND hWnd); HWND* FASTCALL -IntWinListChildren(PWINDOW_OBJECT Window); +IntWinListChildren(PWND Window); NTSTATUS FASTCALL InitWindowImpl (VOID); @@ -99,49 +57,52 @@ NTSTATUS FASTCALL CleanupWindowImpl (VOID); VOID FASTCALL -IntGetClientRect (PWINDOW_OBJECT WindowObject, RECTL *Rect); +IntGetClientRect (PWND WindowObject, RECTL *Rect); HWND FASTCALL IntGetActiveWindow (VOID); BOOL FASTCALL -IntIsWindowVisible (PWINDOW_OBJECT Window); +IntIsWindowVisible (PWND Window); BOOL FASTCALL -IntIsChildWindow (PWINDOW_OBJECT Parent, PWINDOW_OBJECT Child); +IntIsChildWindow (PWND Parent, PWND Child); VOID FASTCALL -IntUnlinkWindow(PWINDOW_OBJECT Wnd); +IntUnlinkWindow(PWND Wnd); VOID FASTCALL -IntLinkWindow(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndParent, PWINDOW_OBJECT WndPrevSibling); +IntLinkWindow(PWND Wnd, PWND WndPrevSibling); -PWINDOW_OBJECT FASTCALL -IntGetAncestor(PWINDOW_OBJECT Wnd, UINT Type); +VOID FASTCALL +IntLinkHwnd(PWND Wnd, HWND hWndPrev); -PWINDOW_OBJECT FASTCALL -IntGetParent(PWINDOW_OBJECT Wnd); +PWND FASTCALL +IntGetAncestor(PWND Wnd, UINT Type); + +PWND FASTCALL +IntGetParent(PWND Wnd); INT FASTCALL -IntGetWindowRgn(PWINDOW_OBJECT Window, HRGN hRgn); +IntGetWindowRgn(PWND Window, HRGN hRgn); INT FASTCALL -IntGetWindowRgnBox(PWINDOW_OBJECT Window, RECTL *Rect); +IntGetWindowRgnBox(PWND Window, RECTL *Rect); BOOL FASTCALL -IntGetWindowInfo(PWINDOW_OBJECT WindowObject, PWINDOWINFO pwi); +IntGetWindowInfo(PWND WindowObject, PWINDOWINFO pwi); VOID FASTCALL -IntGetWindowBorderMeasures(PWINDOW_OBJECT WindowObject, UINT *cx, UINT *cy); +IntGetWindowBorderMeasures(PWND WindowObject, UINT *cx, UINT *cy); BOOL FASTCALL -IntIsWindowInDestroy(PWINDOW_OBJECT Window); +IntIsWindowInDestroy(PWND Window); BOOL FASTCALL -IntShowOwnedPopups( PWINDOW_OBJECT owner, BOOL fShow ); +IntShowOwnedPopups( PWND owner, BOOL fShow ); LRESULT FASTCALL -IntDefWindowProc( PWINDOW_OBJECT Window, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Ansi); +IntDefWindowProc( PWND Window, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Ansi); VOID FASTCALL IntNotifyWinEvent(DWORD, PWND, LONG, LONG); diff --git a/subsystems/win32/win32k/include/winpos.h b/subsystems/win32/win32k/include/winpos.h index 7d14676e630..cee93ab0465 100644 --- a/subsystems/win32/win32k/include/winpos.h +++ b/subsystems/win32/win32k/include/winpos.h @@ -1,36 +1,36 @@ #pragma once #define IntPtInWindow(WndObject,x,y) \ - ((x) >= (WndObject)->Wnd->rcWindow.left && \ - (x) < (WndObject)->Wnd->rcWindow.right && \ - (y) >= (WndObject)->Wnd->rcWindow.top && \ - (y) < (WndObject)->Wnd->rcWindow.bottom && \ - (!(WndObject)->hrgnClip || ((WndObject)->Wnd->style & WS_MINIMIZE) || \ - NtGdiPtInRegion((WndObject)->hrgnClip, (INT)((x) - (WndObject)->Wnd->rcWindow.left), \ - (INT)((y) - (WndObject)->Wnd->rcWindow.top)))) + ((x) >= (WndObject)->rcWindow.left && \ + (x) < (WndObject)->rcWindow.right && \ + (y) >= (WndObject)->rcWindow.top && \ + (y) < (WndObject)->rcWindow.bottom && \ + (!(WndObject)->hrgnClip || ((WndObject)->style & WS_MINIMIZE) || \ + NtGdiPtInRegion((WndObject)->hrgnClip, (INT)((x) - (WndObject)->rcWindow.left), \ + (INT)((y) - (WndObject)->rcWindow.top)))) UINT -FASTCALL co_WinPosArrangeIconicWindows(PWINDOW_OBJECT parent); +FASTCALL co_WinPosArrangeIconicWindows(PWND parent); BOOL FASTCALL -IntGetClientOrigin(PWINDOW_OBJECT Window, LPPOINT Point); +IntGetClientOrigin(PWND Window, LPPOINT Point); LRESULT FASTCALL -co_WinPosGetNonClientSize(PWINDOW_OBJECT Window, RECTL* WindowRect, RECTL* ClientRect); +co_WinPosGetNonClientSize(PWND Window, RECTL* WindowRect, RECTL* ClientRect); UINT FASTCALL -co_WinPosGetMinMaxInfo(PWINDOW_OBJECT Window, POINT* MaxSize, POINT* MaxPos, +co_WinPosGetMinMaxInfo(PWND Window, POINT* MaxSize, POINT* MaxPos, POINT* MinTrack, POINT* MaxTrack); UINT FASTCALL -co_WinPosMinMaximize(PWINDOW_OBJECT WindowObject, UINT ShowFlag, RECTL* NewPos); +co_WinPosMinMaximize(PWND WindowObject, UINT ShowFlag, RECTL* NewPos); BOOLEAN FASTCALL -co_WinPosSetWindowPos(PWINDOW_OBJECT Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, +co_WinPosSetWindowPos(PWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags); BOOLEAN FASTCALL -co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd); +co_WinPosShowWindow(PWND Window, INT Cmd); void FASTCALL -co_WinPosSendSizeMove(PWINDOW_OBJECT Window); +co_WinPosSendSizeMove(PWND Window); USHORT FASTCALL -co_WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTests, POINT *WinPoint, - PWINDOW_OBJECT* Window); -VOID FASTCALL co_WinPosActivateOtherWindow(PWINDOW_OBJECT Window); +co_WinPosWindowFromPoint(PWND ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTests, POINT *WinPoint, + PWND* Window); +VOID FASTCALL co_WinPosActivateOtherWindow(PWND Window); -VOID FASTCALL WinPosInitInternalPos(PWINDOW_OBJECT WindowObject, +VOID FASTCALL WinPosInitInternalPos(PWND WindowObject, POINT *pt, RECTL *RestoreRect); diff --git a/subsystems/win32/win32k/misc/usrheap.c b/subsystems/win32/win32k/misc/usrheap.c index c371121c657..82548623fcb 100644 --- a/subsystems/win32/win32k/misc/usrheap.c +++ b/subsystems/win32/win32k/misc/usrheap.c @@ -32,7 +32,8 @@ IntUserHeapCommitRoutine(IN PVOID Base, PW32HEAP_USER_MAPPING Mapping; PVOID UserBase = NULL; NTSTATUS Status; - SIZE_T Delta = (SIZE_T)((ULONG_PTR)(*CommitAddress) - (ULONG_PTR)Base); + SIZE_T Delta; + PVOID UserCommitAddress; W32Process = PsGetCurrentProcessWin32Process(); @@ -79,18 +80,23 @@ IntUserHeapCommitRoutine(IN PVOID Base, return Status; } - /* commit! */ - UserBase = (PVOID)((ULONG_PTR)UserBase + Delta); + /* Apply the commit address offset to the user base address */ + Delta = (SIZE_T) ((ULONG_PTR) (*CommitAddress) - (ULONG_PTR) (Base)); + UserCommitAddress = (PVOID) ((ULONG_PTR) (UserBase) + Delta); + /* Perform the actual commit */ Status = ZwAllocateVirtualMemory(NtCurrentProcess(), - &UserBase, + &UserCommitAddress, 0, CommitSize, MEM_COMMIT, PAGE_EXECUTE_READ); + if (NT_SUCCESS(Status)) { - *CommitAddress = (PVOID)((ULONG_PTR)UserBase + Delta); + /* Determine the address to return */ + Delta = (SIZE_T) ((ULONG_PTR) (UserCommitAddress) - (ULONG_PTR) (UserBase)); + *CommitAddress = (PVOID) ((ULONG_PTR) (Base) + Delta); } if (W32Process == NULL) diff --git a/subsystems/win32/win32k/ntuser/accelerator.c b/subsystems/win32/win32k/ntuser/accelerator.c index d963344af32..a913de1ebfa 100644 --- a/subsystems/win32/win32k/ntuser/accelerator.c +++ b/subsystems/win32/win32k/ntuser/accelerator.c @@ -95,7 +95,7 @@ PACCELERATOR_TABLE FASTCALL UserGetAccelObject(HACCEL hAccel) static BOOLEAN FASTCALL co_IntTranslateAccelerator( - PWINDOW_OBJECT Window, + PWND Window, UINT message, WPARAM wParam, LPARAM lParam, @@ -108,7 +108,7 @@ co_IntTranslateAccelerator( ASSERT_REFS_CO(Window); DPRINT("IntTranslateAccelerator(hwnd %x, message %x, wParam %x, lParam %x, fVirt %d, key %x, cmd %x)\n", - Window->hSelf, message, wParam, lParam, fVirt, key, cmd); + Window->head.h, message, wParam, lParam, fVirt, key, cmd); if (wParam != key) { @@ -162,7 +162,7 @@ co_IntTranslateAccelerator( } DPRINT("IntTranslateAccelerator(hwnd %x, message %x, wParam %x, lParam %x, fVirt %d, key %x, cmd %x) = FALSE\n", - Window->hSelf, message, wParam, lParam, fVirt, key, cmd); + Window->head.h, message, wParam, lParam, fVirt, key, cmd); return FALSE; @@ -250,12 +250,12 @@ found: if (mesg == WM_COMMAND) { DPRINT(", sending WM_COMMAND, wParam=%0x\n", 0x10000 | cmd); - co_IntSendMessage(Window->hSelf, mesg, 0x10000 | cmd, 0L); + co_IntSendMessage(Window->head.h, mesg, 0x10000 | cmd, 0L); } else if (mesg == WM_SYSCOMMAND) { DPRINT(", sending WM_SYSCOMMAND, wParam=%0x\n", cmd); - co_IntSendMessage(Window->hSelf, mesg, cmd, 0x00010000L); + co_IntSendMessage(Window->head.h, mesg, cmd, 0x00010000L); } else { @@ -276,7 +276,7 @@ found: } DPRINT("IntTranslateAccelerator(hWnd %x, message %x, wParam %x, lParam %x, fVirt %d, key %x, cmd %x) = TRUE\n", - Window->hSelf, message, wParam, lParam, fVirt, key, cmd); + Window->head.h, message, wParam, lParam, fVirt, key, cmd); return TRUE; } @@ -458,7 +458,7 @@ NtUserTranslateAccelerator( HACCEL hAccel, LPMSG Message) { - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; PACCELERATOR_TABLE Accel = NULL; ULONG i; USER_REFERENCE_ENTRY AccelRef, WindowRef; diff --git a/subsystems/win32/win32k/ntuser/callback.c b/subsystems/win32/win32k/ntuser/callback.c index 0bcbaf2727c..e536d4ca7e1 100644 --- a/subsystems/win32/win32k/ntuser/callback.c +++ b/subsystems/win32/win32k/ntuser/callback.c @@ -93,26 +93,26 @@ IntCleanupThreadCallbacks(PTHREADINFO W32Thread) // This will help user space programs speed up read access with the window object. // static VOID -IntSetTebWndCallback (HWND * hWnd, PVOID * pWnd) +IntSetTebWndCallback (HWND * hWnd, PWND * pWnd) { HWND hWndS = *hWnd; - PWINDOW_OBJECT Window = UserGetWindowObject(*hWnd); + PWND Window = UserGetWindowObject(*hWnd); PCLIENTINFO ClientInfo = GetWin32ClientInfo(); *hWnd = ClientInfo->CallbackWnd.hWnd; - *pWnd = ClientInfo->CallbackWnd.pvWnd; + *pWnd = ClientInfo->CallbackWnd.pWnd; ClientInfo->CallbackWnd.hWnd = hWndS; - ClientInfo->CallbackWnd.pvWnd = DesktopHeapAddressToUser(Window->Wnd); + ClientInfo->CallbackWnd.pWnd = DesktopHeapAddressToUser(Window); } static VOID -IntRestoreTebWndCallback (HWND hWnd, PVOID pWnd) +IntRestoreTebWndCallback (HWND hWnd, PWND pWnd) { PCLIENTINFO ClientInfo = GetWin32ClientInfo(); ClientInfo->CallbackWnd.hWnd = hWnd; - ClientInfo->CallbackWnd.pvWnd = pWnd; + ClientInfo->CallbackWnd.pWnd = pWnd; } /* FUNCTIONS *****************************************************************/ @@ -125,7 +125,8 @@ co_IntCallSentMessageCallback(SENDASYNCPROC CompletionCallback, LRESULT Result) { SENDASYNCPROC_CALLBACK_ARGUMENTS Arguments; - PVOID ResultPointer, pWnd; + PVOID ResultPointer; + PWND pWnd; ULONG ResultLength; NTSTATUS Status; @@ -168,7 +169,8 @@ co_IntCallWindowProc(WNDPROC Proc, WINDOWPROC_CALLBACK_ARGUMENTS StackArguments; PWINDOWPROC_CALLBACK_ARGUMENTS Arguments; NTSTATUS Status; - PVOID ResultPointer, pWnd; + PVOID ResultPointer; + PWND pWnd; ULONG ResultLength; ULONG ArgumentLength; LRESULT Result; @@ -337,6 +339,8 @@ co_IntCallHookProc(INT HookId, PANSI_STRING asClassName; PTHREADINFO pti; + ASSERT(Proc); + pti = PsGetCurrentThreadWin32Thread(); if (pti->TIF_flags & TIF_INCLEANUP) { diff --git a/subsystems/win32/win32k/ntuser/callproc.c b/subsystems/win32/win32k/ntuser/callproc.c index f2298256d08..52f83459941 100644 --- a/subsystems/win32/win32k/ntuser/callproc.c +++ b/subsystems/win32/win32k/ntuser/callproc.c @@ -193,16 +193,14 @@ NtUserGetCPD( GETCPD Flags, ULONG_PTR ProcIn) { - PWINDOW_OBJECT Window; PWND Wnd; ULONG_PTR Result = 0; UserEnterExclusive(); - if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd) + if (!(Wnd = UserGetWindowObject(hWnd))) { goto Cleanup; } - Wnd = Window->Wnd; // Processing Window only from User space. if ((Flags & ~(UserGetCPDU2A|UserGetCPDA2U)) != UserGetCPDClass) diff --git a/subsystems/win32/win32k/ntuser/caret.c b/subsystems/win32/win32k/ntuser/caret.c index 340cd49b507..3ebae7ae11b 100644 --- a/subsystems/win32/win32k/ntuser/caret.c +++ b/subsystems/win32/win32k/ntuser/caret.c @@ -239,14 +239,14 @@ co_IntDrawCaret(HWND hWnd) -BOOL FASTCALL co_UserHideCaret(PWINDOW_OBJECT Window OPTIONAL) +BOOL FASTCALL co_UserHideCaret(PWND Window OPTIONAL) { PTHREADINFO pti; PUSER_MESSAGE_QUEUE ThreadQueue; if (Window) ASSERT_REFS_CO(Window); - if(Window && Window->pti->pEThread != PsGetCurrentThread()) + if(Window && Window->head.pti->pEThread != PsGetCurrentThread()) { SetLastWin32Error(ERROR_ACCESS_DENIED); return FALSE; @@ -255,7 +255,7 @@ BOOL FASTCALL co_UserHideCaret(PWINDOW_OBJECT Window OPTIONAL) pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; - if(Window && ThreadQueue->CaretInfo->hWnd != Window->hSelf) + if(Window && ThreadQueue->CaretInfo->hWnd != Window->head.h) { SetLastWin32Error(ERROR_ACCESS_DENIED); return FALSE; @@ -274,14 +274,14 @@ BOOL FASTCALL co_UserHideCaret(PWINDOW_OBJECT Window OPTIONAL) } -BOOL FASTCALL co_UserShowCaret(PWINDOW_OBJECT Window OPTIONAL) +BOOL FASTCALL co_UserShowCaret(PWND Window OPTIONAL) { PTHREADINFO pti; PUSER_MESSAGE_QUEUE ThreadQueue; if (Window) ASSERT_REFS_CO(Window); - if(Window && Window->pti->pEThread != PsGetCurrentThread()) + if(Window && Window->head.pti->pEThread != PsGetCurrentThread()) { SetLastWin32Error(ERROR_ACCESS_DENIED); return FALSE; @@ -290,7 +290,7 @@ BOOL FASTCALL co_UserShowCaret(PWINDOW_OBJECT Window OPTIONAL) pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; - if(Window && ThreadQueue->CaretInfo->hWnd != Window->hSelf) + if(Window && ThreadQueue->CaretInfo->hWnd != Window->head.h) { SetLastWin32Error(ERROR_ACCESS_DENIED); return FALSE; @@ -320,7 +320,7 @@ NtUserCreateCaret( int nWidth, int nHeight) { - PWINDOW_OBJECT Window; + PWND Window; PTHREADINFO pti; PUSER_MESSAGE_QUEUE ThreadQueue; DECLARE_RETURN(BOOL); @@ -333,7 +333,7 @@ NtUserCreateCaret( RETURN(FALSE); } - if(Window->pti->pEThread != PsGetCurrentThread()) + if(Window->head.pti->pEThread != PsGetCurrentThread()) { SetLastWin32Error(ERROR_ACCESS_DENIED); RETURN(FALSE); @@ -431,7 +431,7 @@ BOOL APIENTRY NtUserShowCaret(HWND hWnd OPTIONAL) { - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; USER_REFERENCE_ENTRY Ref; DECLARE_RETURN(BOOL); BOOL ret; @@ -462,7 +462,7 @@ BOOL APIENTRY NtUserHideCaret(HWND hWnd OPTIONAL) { - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; USER_REFERENCE_ENTRY Ref; DECLARE_RETURN(BOOL); BOOL ret; diff --git a/subsystems/win32/win32k/ntuser/class.c b/subsystems/win32/win32k/ntuser/class.c index ac6a5b708ca..31c2970d1c3 100644 --- a/subsystems/win32/win32k/ntuser/class.c +++ b/subsystems/win32/win32k/ntuser/class.c @@ -2102,7 +2102,7 @@ NtUserSetClassLong(HWND hWnd, BOOL Ansi) { PPROCESSINFO pi; - PWINDOW_OBJECT Window; + PWND Window; ULONG_PTR Ret = 0; UserEnterExclusive(); @@ -2112,7 +2112,7 @@ NtUserSetClassLong(HWND hWnd, Window = UserGetWindowObject(hWnd); if (Window != NULL) { - if (Window->pti->ppi != pi) + if (Window->head.pti->ppi != pi) { SetLastWin32Error(ERROR_ACCESS_DENIED); goto Cleanup; @@ -2154,7 +2154,7 @@ InvalidParameter: dwNewLong = (ULONG_PTR)&Value; } - Ret = UserSetClassLongPtr(Window->Wnd->pcls, + Ret = UserSetClassLongPtr(Window->pcls, Offset, dwNewLong, Ansi); @@ -2274,7 +2274,9 @@ NtUserGetClassInfo( if (CapturedClassName.Length & 1) { - goto InvalidParameter; + SetLastWin32Error(ERROR_INVALID_PARAMETER); + Ret = FALSE; + _SEH2_LEAVE; } if (CapturedClassName.Length != 0) @@ -2297,7 +2299,9 @@ NtUserGetClassInfo( if (!IS_ATOM(CapturedClassName.Buffer)) { ERR("NtUserGetClassInfo() got ClassName instead of Atom!\n"); - goto InvalidParameter; + SetLastWin32Error(ERROR_INVALID_PARAMETER); + Ret = FALSE; + _SEH2_LEAVE; } SafeClassName.Buffer = CapturedClassName.Buffer; @@ -2305,21 +2309,13 @@ NtUserGetClassInfo( SafeClassName.MaximumLength = 0; } - if (ProbeForReadUint(&lpWndClassEx->cbSize) != sizeof(WNDCLASSEXW)) - { -InvalidParameter: - SetLastWin32Error(ERROR_INVALID_PARAMETER); - Ret = FALSE; - _SEH2_LEAVE; - } - ProbeForWrite( lpWndClassEx, sizeof(WNDCLASSEXW), sizeof(ULONG)); RtlCopyMemory( &Safewcexw, lpWndClassEx, sizeof(WNDCLASSEXW)); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST); + SetLastNtError(_SEH2_GetExceptionCode()); Ret = FALSE; } _SEH2_END; @@ -2383,7 +2379,7 @@ NtUserGetClassName (IN HWND hWnd, OUT PUNICODE_STRING ClassName, IN BOOL Ansi) { - PWINDOW_OBJECT Window; + PWND Window; UNICODE_STRING CapturedClassName; INT Ret = 0; @@ -2398,7 +2394,7 @@ NtUserGetClassName (IN HWND hWnd, CapturedClassName = *ClassName; /* get the class name */ - Ret = UserGetClassName(Window->Wnd->pcls, + Ret = UserGetClassName(Window->pcls, &CapturedClassName, Ansi); diff --git a/subsystems/win32/win32k/ntuser/clipboard.c b/subsystems/win32/win32k/ntuser/clipboard.c index 81a766709f5..538cf25707e 100644 --- a/subsystems/win32/win32k/ntuser/clipboard.c +++ b/subsystems/win32/win32k/ntuser/clipboard.c @@ -17,9 +17,9 @@ PTHREADINFO ClipboardThread; PTHREADINFO ClipboardOwnerThread; -PWINDOW_OBJECT ClipboardWindow; -PWINDOW_OBJECT ClipboardViewerWindow; -PWINDOW_OBJECT ClipboardOwnerWindow; +PWND ClipboardWindow; +PWND ClipboardViewerWindow; +PWND ClipboardOwnerWindow; BOOL sendDrawClipboardMsg; BOOL recentlySetClipboard; BOOL delayedRender; @@ -38,7 +38,7 @@ DWORD synthesizedDataSize; /* return the pointer to the prev window of the finded window, if NULL does not exists in the chain */ PCLIPBOARDCHAINELEMENT FASTCALL -IntIsWindowInChain(PWINDOW_OBJECT window) +IntIsWindowInChain(PWND window) { PCLIPBOARDCHAINELEMENT wce = WindowsChain; @@ -60,14 +60,14 @@ VOID FASTCALL printChain(VOID) PCLIPBOARDCHAINELEMENT wce2 = WindowsChain; while (wce2) { - DPRINT1("chain: %p\n", wce2->window->hSelf); + DPRINT1("chain: %p\n", wce2->window->head.h); wce2 = wce2->next; } } /* the new window always have to be the first in the chain */ PCLIPBOARDCHAINELEMENT FASTCALL -IntAddWindowToChain(PWINDOW_OBJECT window) +IntAddWindowToChain(PWND window) { PCLIPBOARDCHAINELEMENT wce = NULL; @@ -96,7 +96,7 @@ exit_addChain: } PCLIPBOARDCHAINELEMENT FASTCALL -IntRemoveWindowFromChain(PWINDOW_OBJECT window) +IntRemoveWindowFromChain(PWND window) { PCLIPBOARDCHAINELEMENT wce = WindowsChain; PCLIPBOARDCHAINELEMENT *link = &WindowsChain; @@ -345,7 +345,7 @@ intIsClipboardOpenByMe(VOID) /* IntClipboardFreeWindow it's called when a window was destroyed */ VOID FASTCALL -IntClipboardFreeWindow(PWINDOW_OBJECT window) +IntClipboardFreeWindow(PWND window) { /* called from co_UserFreeWindow in window.c */ /* check if clipboard is not locked by this window, if yes, unlock it */ @@ -377,7 +377,7 @@ BOOL APIENTRY NtUserOpenClipboard(HWND hWnd, DWORD Unknown1) { - PWINDOW_OBJECT Window; + PWND Window; BOOL ret = FALSE; UserEnterExclusive(); @@ -392,7 +392,7 @@ NtUserOpenClipboard(HWND hWnd, DWORD Unknown1) { if (ClipboardOwnerWindow) { - if (ClipboardOwnerWindow->hSelf == hWnd) + if (ClipboardOwnerWindow->head.h == hWnd) { ret = TRUE; } @@ -485,7 +485,7 @@ NtUserGetOpenClipboardWindow(VOID) if (ClipboardWindow) { - ret = ClipboardWindow->hSelf; + ret = ClipboardWindow->head.h; } UserLeave(); @@ -498,7 +498,7 @@ NtUserChangeClipboardChain(HWND hWndRemove, HWND hWndNewNext) { BOOL ret = FALSE; PCLIPBOARDCHAINELEMENT w = NULL; - PWINDOW_OBJECT removeWindow; + PWND removeWindow; UserEnterExclusive(); removeWindow = UserGetWindowObject(hWndRemove); @@ -521,9 +521,9 @@ NtUserChangeClipboardChain(HWND hWndRemove, HWND hWndNewNext) // then they do the chain /* WindowsChain->window may be NULL */ - LPARAM lparam = WindowsChain->window == NULL ? 0 : (LPARAM)WindowsChain->window->hSelf; - DPRINT1("Message: WM_CHANGECBCHAIN to %p", WindowsChain->window->hSelf); - co_IntSendMessage(WindowsChain->window->hSelf, WM_CHANGECBCHAIN, (WPARAM)hWndRemove, lparam); + LPARAM lparam = WindowsChain->window == NULL ? 0 : (LPARAM)WindowsChain->window->head.h; + DPRINT1("Message: WM_CHANGECBCHAIN to %p", WindowsChain->window->head.h); + co_IntSendMessage(WindowsChain->window->head.h, WM_CHANGECBCHAIN, (WPARAM)hWndRemove, lparam); } UserLeave(); @@ -572,8 +572,8 @@ NtUserEmptyClipboard(VOID) if (ret && ClipboardOwnerWindow) { - DPRINT("Clipboard: WM_DESTROYCLIPBOARD to %p", ClipboardOwnerWindow->hSelf); - co_IntSendMessage( ClipboardOwnerWindow->hSelf, WM_DESTROYCLIPBOARD, 0, 0); + DPRINT("Clipboard: WM_DESTROYCLIPBOARD to %p", ClipboardOwnerWindow->head.h); + co_IntSendMessage( ClipboardOwnerWindow->head.h, WM_DESTROYCLIPBOARD, 0, 0); } UserLeave(); @@ -603,8 +603,8 @@ NtUserGetClipboardData(UINT uFormat, PVOID pBuffer) /* tell owner what data needs to be rendered */ if (ClipboardOwnerWindow) { - ASSERT(ClipboardOwnerWindow->hSelf); - co_IntSendMessage(ClipboardOwnerWindow->hSelf, WM_RENDERFORMAT, (WPARAM)uFormat, 0); + ASSERT(ClipboardOwnerWindow->head.h); + co_IntSendMessage(ClipboardOwnerWindow->head.h, WM_RENDERFORMAT, (WPARAM)uFormat, 0); data = intIsFormatAvailable(uFormat); ASSERT(data->size); ret = (HANDLE)(ULONG_PTR)data->size; @@ -754,7 +754,7 @@ NtUserGetClipboardOwner(VOID) if (ClipboardOwnerWindow) { - ret = ClipboardOwnerWindow->hSelf; + ret = ClipboardOwnerWindow->head.h; } UserLeave(); @@ -771,7 +771,7 @@ NtUserGetClipboardViewer(VOID) if (WindowsChain) { - ret = WindowsChain->window->hSelf; + ret = WindowsChain->window->head.h; } UserLeave(); @@ -1037,7 +1037,7 @@ NtUserSetClipboardViewer(HWND hWndNewViewer) { HWND ret = NULL; PCLIPBOARDCHAINELEMENT newWC = NULL; - PWINDOW_OBJECT window; + PWND window; UserEnterExclusive(); @@ -1053,7 +1053,7 @@ NtUserSetClipboardViewer(HWND hWndNewViewer) if (newWC->next) { // return the next HWND available window in the chain - ret = newWC->next->window->hSelf; + ret = newWC->next->window->head.h; } } } diff --git a/subsystems/win32/win32k/ntuser/cursoricon.c b/subsystems/win32/win32k/ntuser/cursoricon.c index f439c772c59..427632e3ba7 100644 --- a/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/subsystems/win32/win32k/ntuser/cursoricon.c @@ -60,7 +60,7 @@ InitCursorImpl() gSysCursorInfo.Enabled = FALSE; gSysCursorInfo.ButtonsDown = 0; - gSysCursorInfo.CursorClipInfo.IsClipped = FALSE; + gSysCursorInfo.bClipped = FALSE; gSysCursorInfo.LastBtnDown = 0; gSysCursorInfo.CurrentCursorObject = NULL; gSysCursorInfo.ShowingCursor = 0; @@ -176,63 +176,56 @@ UserSetCursor( BOOL UserSetCursorPos( INT x, INT y, BOOL SendMouseMoveMsg) { - PWINDOW_OBJECT DesktopWindow; + PWND DesktopWindow; PSYSTEM_CURSORINFO CurInfo; HDC hDC; MSG Msg; + RECTL rcClip; + POINT pt; if(!(hDC = IntGetScreenDC())) { return FALSE; } + if(!(DesktopWindow = UserGetDesktopWindow())) + { + return FALSE; + } + CurInfo = IntGetSysCursorInfo(); - DesktopWindow = UserGetDesktopWindow(); + /* Clip cursor position */ + if (!CurInfo->bClipped) + rcClip = DesktopWindow->rcClient; + else + rcClip = CurInfo->rcClip; - if (DesktopWindow) + if(x >= rcClip.right) x = rcClip.right - 1; + if(x < rcClip.left) x = rcClip.left; + if(y >= rcClip.bottom) y = rcClip.bottom - 1; + if(y < rcClip.top) y = rcClip.top; + + pt.x = x; + pt.y = y; + + + if (SendMouseMoveMsg) { - if(x >= DesktopWindow->Wnd->rcClient.right) - x = DesktopWindow->Wnd->rcClient.right - 1; - if(y >= DesktopWindow->Wnd->rcClient.bottom) - y = DesktopWindow->Wnd->rcClient.bottom - 1; + /* Generate a mouse move message */ + Msg.message = WM_MOUSEMOVE; + Msg.wParam = CurInfo->ButtonsDown; + Msg.lParam = MAKELPARAM(x, y); + Msg.pt = pt; + MsqInsertSystemMessage(&Msg); } - if(x < 0) - x = 0; - if(y < 0) - y = 0; + /* Store the new cursor position */ + gpsi->ptCursor = pt; - //Clip cursor position - if(CurInfo->CursorClipInfo.IsClipped) - { - if(x >= (LONG)CurInfo->CursorClipInfo.Right) - x = (LONG)CurInfo->CursorClipInfo.Right - 1; - if(x < (LONG)CurInfo->CursorClipInfo.Left) - x = (LONG)CurInfo->CursorClipInfo.Left; - if(y >= (LONG)CurInfo->CursorClipInfo.Bottom) - y = (LONG)CurInfo->CursorClipInfo.Bottom - 1; - if(y < (LONG)CurInfo->CursorClipInfo.Top) - y = (LONG)CurInfo->CursorClipInfo.Top; - } - - //Store the new cursor position - gpsi->ptCursor.x = x; - gpsi->ptCursor.y = y; - - //Move the mouse pointer + /* Move the mouse pointer */ GreMovePointer(hDC, x, y); - if (!SendMouseMoveMsg) - return TRUE; - - //Generate a mouse move message - Msg.message = WM_MOUSEMOVE; - Msg.wParam = CurInfo->ButtonsDown; - Msg.lParam = MAKELPARAM(x, y); - Msg.pt = gpsi->ptCursor; - MsqInsertSystemMessage(&Msg); - return TRUE; } @@ -711,7 +704,7 @@ NtUserClipCursor( /* FIXME - check if process has WINSTA_WRITEATTRIBUTES */ PSYSTEM_CURSORINFO CurInfo; RECTL Rect; - PWINDOW_OBJECT DesktopWindow = NULL; + PWND DesktopWindow = NULL; DECLARE_RETURN(BOOL); DPRINT("Enter NtUserClipCursor\n"); @@ -731,18 +724,14 @@ NtUserClipCursor( && DesktopWindow && UnsafeRect != NULL) { - CurInfo->CursorClipInfo.IsClipped = TRUE; - CurInfo->CursorClipInfo.Left = max(Rect.left, DesktopWindow->Wnd->rcWindow.left); - CurInfo->CursorClipInfo.Top = max(Rect.top, DesktopWindow->Wnd->rcWindow.top); - CurInfo->CursorClipInfo.Right = min(Rect.right, DesktopWindow->Wnd->rcWindow.right); - CurInfo->CursorClipInfo.Bottom = min(Rect.bottom, DesktopWindow->Wnd->rcWindow.bottom); - + CurInfo->bClipped = TRUE; + RECTL_bIntersectRect(&CurInfo->rcClip, &Rect, &DesktopWindow->rcWindow); UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y, FALSE); RETURN(TRUE); } - CurInfo->CursorClipInfo.IsClipped = FALSE; + CurInfo->bClipped = FALSE; RETURN(TRUE); CLEANUP: @@ -843,12 +832,9 @@ NtUserGetClipCursor( RETURN(FALSE); CurInfo = IntGetSysCursorInfo(); - if (CurInfo->CursorClipInfo.IsClipped) + if (CurInfo->bClipped) { - Rect.left = CurInfo->CursorClipInfo.Left; - Rect.top = CurInfo->CursorClipInfo.Top; - Rect.right = CurInfo->CursorClipInfo.Right; - Rect.bottom = CurInfo->CursorClipInfo.Bottom; + Rect = CurInfo->rcClip; } else { diff --git a/subsystems/win32/win32k/ntuser/defwnd.c b/subsystems/win32/win32k/ntuser/defwnd.c index afc60e852ae..88d82802f8f 100644 --- a/subsystems/win32/win32k/ntuser/defwnd.c +++ b/subsystems/win32/win32k/ntuser/defwnd.c @@ -27,7 +27,7 @@ static LRESULT FASTCALL IntClientShutdown( - PWINDOW_OBJECT pWindow, + PWND pWindow, WPARAM wParam, LPARAM lParam ) @@ -49,14 +49,14 @@ IntClientShutdown( { for (i = 0; List[i]; i++) { - PWINDOW_OBJECT WndChild; + PWND WndChild; - if (!(WndChild = UserGetWindowObject(List[i])) || !WndChild->Wnd) + if (!(WndChild = UserGetWindowObject(List[i]))) continue; if (wParam & MCS_QUERYENDSESSION) { - if (!co_IntSendMessage(WndChild->hSelf, WM_QUERYENDSESSION, 0, lParams)) + if (!co_IntSendMessage(WndChild->head.h, WM_QUERYENDSESSION, 0, lParams)) { lResult = MCSR_DONOTSHUTDOWN; break; @@ -64,10 +64,10 @@ IntClientShutdown( } else { - co_IntSendMessage(WndChild->hSelf, WM_ENDSESSION, KillTimers, lParams); + co_IntSendMessage(WndChild->head.h, WM_ENDSESSION, KillTimers, lParams); if (KillTimers) { - DestroyTimersForWindow(WndChild->pti, WndChild); + DestroyTimersForWindow(WndChild->head.pti, WndChild); } lResult = MCSR_SHUTDOWNFINISHED; } @@ -80,17 +80,17 @@ IntClientShutdown( */ if (wParam & MCS_QUERYENDSESSION) { - if (!co_IntSendMessage(pWindow->hSelf, WM_QUERYENDSESSION, 0, lParams)) + if (!co_IntSendMessage(pWindow->head.h, WM_QUERYENDSESSION, 0, lParams)) { lResult = MCSR_DONOTSHUTDOWN; } } else { - co_IntSendMessage(pWindow->hSelf, WM_ENDSESSION, KillTimers, lParams); + co_IntSendMessage(pWindow->head.h, WM_ENDSESSION, KillTimers, lParams); if (KillTimers) { - DestroyTimersForWindow(pWindow->pti, pWindow); + DestroyTimersForWindow(pWindow->head.pti, pWindow); } lResult = MCSR_SHUTDOWNFINISHED; } @@ -102,26 +102,21 @@ IntClientShutdown( */ LRESULT FASTCALL IntDefWindowProc( - PWINDOW_OBJECT Window, + PWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Ansi) { - PWND Wnd; LRESULT lResult = 0; if (Msg > WM_USER) return 0; - Wnd = Window->Wnd; - if (!Wnd) return 0; - switch (Msg) { case WM_SYSCOMMAND: { - DPRINT1("hwnd %p WM_SYSCOMMAND %lx %lx\n", Window->hSelf, wParam, lParam ); - if (!ISITHOOKED(WH_CBT)) break; + DPRINT1("hwnd %p WM_SYSCOMMAND %lx %lx\n", Wnd->head.h, wParam, lParam ); lResult = co_HOOK_CallHooks(WH_CBT, HCBT_SYSCOMMAND, wParam, lParam); break; } @@ -129,7 +124,7 @@ IntDefWindowProc( { if ((Wnd->style & WS_VISIBLE) && wParam) break; if (!(Wnd->style & WS_VISIBLE) && !wParam) break; - if (!Window->spwndOwner) break; + if (!Wnd->spwndOwner) break; if (LOWORD(lParam)) { if (wParam) @@ -140,17 +135,15 @@ IntDefWindowProc( else Wnd->state |= WNDS_HIDDENPOPUP; - co_WinPosShowWindow(Window, wParam ? SW_SHOWNOACTIVATE : SW_HIDE); + co_WinPosShowWindow(Wnd, wParam ? SW_SHOWNOACTIVATE : SW_HIDE); } } break; case WM_CLIENTSHUTDOWN: - return IntClientShutdown(Window, wParam, lParam); + return IntClientShutdown(Wnd, wParam, lParam); case WM_CBT: { - if (!ISITHOOKED(WH_CBT)) break; - switch (wParam) { case HCBT_MOVESIZE: @@ -176,8 +169,8 @@ IntDefWindowProc( _SEH2_END; } if (!lResult) - lResult = co_HOOK_CallHooks(WH_CBT, HCBT_MOVESIZE, (WPARAM)Window->hSelf, lParam ? (LPARAM)&rt : 0); - } + lResult = co_HOOK_CallHooks(WH_CBT, HCBT_MOVESIZE, (WPARAM)Wnd->head.h, lParam ? (LPARAM)&rt : 0); + } break; } break; diff --git a/subsystems/win32/win32k/ntuser/desktop.c b/subsystems/win32/win32k/ntuser/desktop.c index 502528380f6..3a054f2f08d 100644 --- a/subsystems/win32/win32k/ntuser/desktop.c +++ b/subsystems/win32/win32k/ntuser/desktop.c @@ -515,7 +515,7 @@ HWND FASTCALL IntGetDesktopWindow(VOID) return pdo->DesktopWindow; } -PWINDOW_OBJECT FASTCALL UserGetDesktopWindow(VOID) +PWND FASTCALL UserGetDesktopWindow(VOID) { PDESKTOP pdo = IntGetActiveDesktop(); @@ -593,7 +593,7 @@ BOOL FASTCALL IntDesktopUpdatePerUserSettings(BOOL bEnable) HDC FASTCALL UserGetDesktopDC(ULONG DcType, BOOL EmptyDC, BOOL ValidatehWnd) { - PWINDOW_OBJECT DesktopObject = 0; + PWND DesktopObject = 0; HDC DesktopHDC = 0; if (DcType == DC_TYPE_DIRECT) @@ -614,7 +614,7 @@ UserGetDesktopDC(ULONG DcType, BOOL EmptyDC, BOOL ValidatehWnd) VOID APIENTRY UserRedrawDesktop() { - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; UserEnterExclusive(); @@ -656,15 +656,13 @@ IntHideDesktop(PDESKTOP Desktop) return NotifyCsrss(&Request, &Reply); #else - PWINDOW_OBJECT DesktopWindow; PWND DesktopWnd; - DesktopWindow = IntGetWindowObject(Desktop->DesktopWindow); - if (! DesktopWindow) + DesktopWnd = IntGetWindowObject(Desktop->DesktopWindow); + if (! DesktopWnd) { return ERROR_INVALID_WINDOW_HANDLE; } - DesktopWnd = DesktopWindow->Wnd; DesktopWnd->style &= ~WS_VISIBLE; return STATUS_SUCCESS; @@ -1401,7 +1399,7 @@ NtUserPaintDesktop(HDC hDC) HBRUSH DesktopBrush, PreviousBrush; HWND hWndDesktop; BOOL doPatBlt = TRUE; - PWINDOW_OBJECT WndDesktop; + PWND WndDesktop; int len; COLORREF color_old; UINT align_old; @@ -1423,7 +1421,7 @@ NtUserPaintDesktop(HDC hDC) RETURN(FALSE); } - DesktopBrush = (HBRUSH)WndDesktop->Wnd->pcls->hbrBackground; + DesktopBrush = (HBRUSH)WndDesktop->pcls->hbrBackground; /* @@ -1432,7 +1430,7 @@ NtUserPaintDesktop(HDC hDC) if (WinSta->hbmWallpaper != NULL) { - PWINDOW_OBJECT DeskWin; + PWND DeskWin; DeskWin = UserGetWindowObject(hWndDesktop); @@ -1442,8 +1440,8 @@ NtUserPaintDesktop(HDC hDC) int x, y; HDC hWallpaperDC; - sz.cx = DeskWin->Wnd->rcWindow.right - DeskWin->Wnd->rcWindow.left; - sz.cy = DeskWin->Wnd->rcWindow.bottom - DeskWin->Wnd->rcWindow.top; + sz.cx = DeskWin->rcWindow.right - DeskWin->rcWindow.left; + sz.cy = DeskWin->rcWindow.bottom - DeskWin->rcWindow.top; if (WinSta->WallpaperMode == wmStretch || WinSta->WallpaperMode == wmTile) diff --git a/subsystems/win32/win32k/ntuser/event.c b/subsystems/win32/win32k/ntuser/event.c index 3f0d36801df..02d2ffeb2a2 100644 --- a/subsystems/win32/win32k/ntuser/event.c +++ b/subsystems/win32/win32k/ntuser/event.c @@ -241,7 +241,7 @@ NtUserNotifyWinEvent( LONG idObject, LONG idChild) { - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; USER_REFERENCE_ENTRY Ref; UserEnterExclusive(); @@ -255,7 +255,7 @@ NtUserNotifyWinEvent( if (gpsi->dwInstalledEventHooks & GetMaskFromEvent(Event)) { UserRefObjectCo(Window, &Ref); - IntNotifyWinEvent( Event, Window->Wnd, idObject, idChild); + IntNotifyWinEvent( Event, Window, idObject, idChild); UserDerefObjectCo(Window); } UserLeave(); diff --git a/subsystems/win32/win32k/ntuser/focus.c b/subsystems/win32/win32k/ntuser/focus.c index 59f364ed548..5832eaf41ad 100644 --- a/subsystems/win32/win32k/ntuser/focus.c +++ b/subsystems/win32/win32k/ntuser/focus.c @@ -51,13 +51,13 @@ IntGetThreadFocusWindow(VOID) VOID FASTCALL co_IntSendDeactivateMessages(HWND hWndPrev, HWND hWnd) { - PWINDOW_OBJECT WndPrev ; + PWND WndPrev ; if (hWndPrev && (WndPrev = UserGetWindowObject(hWndPrev))) { co_IntSendMessageNoWait(hWndPrev, WM_NCACTIVATE, FALSE, 0); co_IntSendMessageNoWait(hWndPrev, WM_ACTIVATE, - MAKEWPARAM(WA_INACTIVE, WndPrev->Wnd->style & WS_MINIMIZE), + MAKEWPARAM(WA_INACTIVE, WndPrev->style & WS_MINIMIZE), (LPARAM)hWnd); } } @@ -66,7 +66,7 @@ VOID FASTCALL co_IntSendActivateMessages(HWND hWndPrev, HWND hWnd, BOOL MouseActivate) { USER_REFERENCE_ENTRY Ref, RefPrev; - PWINDOW_OBJECT Window, WindowPrev = NULL; + PWND Window, WindowPrev = NULL; if ((Window = UserGetWindowObject(hWnd))) { @@ -94,26 +94,26 @@ co_IntSendActivateMessages(HWND hWndPrev, HWND hWnd, BOOL MouseActivate) co_IntShellHookNotify(HSHELL_WINDOWACTIVATED, (LPARAM) hWnd); } - if (Window->Wnd) + if (Window) { // Set last active for window and it's owner. - Window->Wnd->hWndLastActive = hWnd; - if (Window->Wnd->spwndOwner) - Window->Wnd->spwndOwner->hWndLastActive = hWnd; - Window->Wnd->state |= WNDS_ACTIVEFRAME; + Window->hWndLastActive = hWnd; + if (Window->spwndOwner) + Window->spwndOwner->hWndLastActive = hWnd; + Window->state |= WNDS_ACTIVEFRAME; } - if (WindowPrev && WindowPrev->Wnd) - WindowPrev->Wnd->state &= ~WNDS_ACTIVEFRAME; + if (WindowPrev) + WindowPrev->state &= ~WNDS_ACTIVEFRAME; if (Window && WindowPrev) { - PWINDOW_OBJECT cWindow; + PWND cWindow; HWND *List, *phWnd; HANDLE OldTID = IntGetWndThreadId(WindowPrev); HANDLE NewTID = IntGetWndThreadId(Window); DPRINT("SendActiveMessage Old -> %x, New -> %x\n", OldTID, NewTID); - if (Window->Wnd->style & WS_MINIMIZE) + if (Window->style & WS_MINIMIZE) { DPRINT("Widow was minimized\n"); } @@ -155,7 +155,7 @@ co_IntSendActivateMessages(HWND hWndPrev, HWND hWnd, BOOL MouseActivate) /* FIXME: WA_CLICKACTIVE */ co_IntSendMessageNoWait(hWnd, WM_ACTIVATE, MAKEWPARAM(MouseActivate ? WA_CLICKACTIVE : WA_ACTIVE, - Window->Wnd->style & WS_MINIMIZE), + Window->style & WS_MINIMIZE), (LPARAM)hWndPrev); } } @@ -179,10 +179,10 @@ co_IntSendSetFocusMessages(HWND hWndPrev, HWND hWnd) } HWND FASTCALL -IntFindChildWindowToOwner(PWINDOW_OBJECT Root, PWINDOW_OBJECT Owner) +IntFindChildWindowToOwner(PWND Root, PWND Owner) { HWND Ret; - PWINDOW_OBJECT Child, OwnerWnd; + PWND Child, OwnerWnd; for(Child = Root->spwndChild; Child; Child = Child->spwndNext) { @@ -192,7 +192,7 @@ IntFindChildWindowToOwner(PWINDOW_OBJECT Root, PWINDOW_OBJECT Owner) if(OwnerWnd == Owner) { - Ret = Child->hSelf; + Ret = Child->head.h; return Ret; } } @@ -201,21 +201,18 @@ IntFindChildWindowToOwner(PWINDOW_OBJECT Root, PWINDOW_OBJECT Owner) } static BOOL FASTCALL -co_IntSetForegroundAndFocusWindow(PWINDOW_OBJECT Window, PWINDOW_OBJECT FocusWindow, BOOL MouseActivate) +co_IntSetForegroundAndFocusWindow(PWND Wnd, PWND FocusWindow, BOOL MouseActivate) { - HWND hWnd = Window->hSelf; + HWND hWnd = Wnd->head.h; HWND hWndPrev = NULL; - HWND hWndFocus = FocusWindow->hSelf; + HWND hWndFocus = FocusWindow->head.h; HWND hWndFocusPrev = NULL; PUSER_MESSAGE_QUEUE PrevForegroundQueue; - PWND Wnd; - ASSERT_REFS_CO(Window); + ASSERT_REFS_CO(Wnd); DPRINT("IntSetForegroundAndFocusWindow(%x, %x, %s)\n", hWnd, hWndFocus, MouseActivate ? "TRUE" : "FALSE"); - Wnd = Window->Wnd; - if ((Wnd->style & (WS_CHILD | WS_POPUP)) == WS_CHILD) { DPRINT("Failed - Child\n"); @@ -223,7 +220,7 @@ co_IntSetForegroundAndFocusWindow(PWINDOW_OBJECT Window, PWINDOW_OBJECT FocusWin } if (0 == (Wnd->style & WS_VISIBLE) && - Window->pti->pEThread->ThreadsProcess != CsrProcess) + Wnd->head.pti->pEThread->ThreadsProcess != CsrProcess) { DPRINT("Failed - Invisible\n"); return FALSE; @@ -248,19 +245,19 @@ co_IntSetForegroundAndFocusWindow(PWINDOW_OBJECT Window, PWINDOW_OBJECT FocusWin co_IntSendKillFocusMessages(hWndFocusPrev, hWndFocus); - IntSetFocusMessageQueue(Window->pti->MessageQueue); + IntSetFocusMessageQueue(Wnd->head.pti->MessageQueue); - if (Window->pti->MessageQueue) + if (Wnd->head.pti->MessageQueue) { - Window->pti->MessageQueue->ActiveWindow = hWnd; + Wnd->head.pti->MessageQueue->ActiveWindow = hWnd; } - if (FocusWindow->pti->MessageQueue) + if (FocusWindow->head.pti->MessageQueue) { - FocusWindow->pti->MessageQueue->FocusWindow = hWndFocus; + FocusWindow->head.pti->MessageQueue->FocusWindow = hWndFocus; } - if (PrevForegroundQueue != Window->pti->MessageQueue) + if (PrevForegroundQueue != Wnd->head.pti->MessageQueue) { /* FIXME: Send WM_ACTIVATEAPP to all thread windows. */ } @@ -272,7 +269,7 @@ co_IntSetForegroundAndFocusWindow(PWINDOW_OBJECT Window, PWINDOW_OBJECT FocusWin } BOOL FASTCALL -co_IntSetForegroundWindow(PWINDOW_OBJECT Window)//FIXME: can Window be NULL?? +co_IntSetForegroundWindow(PWND Window)//FIXME: can Window be NULL?? { /*if (Window)*/ ASSERT_REFS_CO(Window); @@ -280,24 +277,22 @@ co_IntSetForegroundWindow(PWINDOW_OBJECT Window)//FIXME: can Window be NULL?? } BOOL FASTCALL -co_IntMouseActivateWindow(PWINDOW_OBJECT Window) +co_IntMouseActivateWindow(PWND Wnd) { HWND Top; - PWINDOW_OBJECT TopWindow; + PWND TopWindow; USER_REFERENCE_ENTRY Ref; - PWND Wnd; - ASSERT_REFS_CO(Window); + ASSERT_REFS_CO(Wnd); - Wnd = Window->Wnd; if(Wnd->style & WS_DISABLED) { BOOL Ret; - PWINDOW_OBJECT TopWnd; - PWINDOW_OBJECT DesktopWindow = UserGetWindowObject(IntGetDesktopWindow()); + PWND TopWnd; + PWND DesktopWindow = UserGetWindowObject(IntGetDesktopWindow()); if(DesktopWindow) { - Top = IntFindChildWindowToOwner(DesktopWindow, Window); + Top = IntFindChildWindowToOwner(DesktopWindow, Wnd); if((TopWnd = UserGetWindowObject(Top))) { UserRefObjectCo(TopWnd, &Ref); @@ -311,13 +306,13 @@ co_IntMouseActivateWindow(PWINDOW_OBJECT Window) } - TopWindow = UserGetAncestor(Window, GA_ROOT); + TopWindow = UserGetAncestor(Wnd, GA_ROOT); if (!TopWindow) return FALSE; /* TMN: Check return valud from this function? */ UserRefObjectCo(TopWindow, &Ref); - co_IntSetForegroundAndFocusWindow(TopWindow, Window, TRUE); + co_IntSetForegroundAndFocusWindow(TopWindow, Wnd, TRUE); UserDerefObjectCo(TopWindow); @@ -325,32 +320,30 @@ co_IntMouseActivateWindow(PWINDOW_OBJECT Window) } HWND FASTCALL -co_IntSetActiveWindow(PWINDOW_OBJECT Window OPTIONAL) +co_IntSetActiveWindow(PWND Wnd OPTIONAL) { PTHREADINFO pti; PUSER_MESSAGE_QUEUE ThreadQueue; HWND hWndPrev; HWND hWnd = 0; - PWND Wnd; CBTACTIVATESTRUCT cbt; - if (Window) - ASSERT_REFS_CO(Window); + if (Wnd) + ASSERT_REFS_CO(Wnd); pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; ASSERT(ThreadQueue != 0); - if (Window != 0) + if (Wnd != 0) { - Wnd = Window->Wnd; if ((!(Wnd->style & WS_VISIBLE) && - Window->pti->pEThread->ThreadsProcess != CsrProcess) || + Wnd->head.pti->pEThread->ThreadsProcess != CsrProcess) || (Wnd->style & (WS_POPUP | WS_CHILD)) == WS_CHILD) { return ThreadQueue ? 0 : ThreadQueue->ActiveWindow; } - hWnd = Window->hSelf; + hWnd = Wnd->head.h; } hWndPrev = ThreadQueue->ActiveWindow; @@ -377,7 +370,7 @@ co_IntSetActiveWindow(PWINDOW_OBJECT Window OPTIONAL) static HWND FASTCALL -co_IntSetFocusWindow(PWINDOW_OBJECT Window OPTIONAL) +co_IntSetFocusWindow(PWND Window OPTIONAL) { HWND hWndPrev = 0; PTHREADINFO pti; @@ -394,18 +387,18 @@ co_IntSetFocusWindow(PWINDOW_OBJECT Window OPTIONAL) if (Window != 0) { - if (hWndPrev == Window->hSelf) + if (hWndPrev == Window->head.h) { return hWndPrev; } - if (co_HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, (WPARAM)Window->hSelf, (LPARAM)hWndPrev)) + if (co_HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, (WPARAM)Window->head.h, (LPARAM)hWndPrev)) return 0; - ThreadQueue->FocusWindow = Window->hSelf; + ThreadQueue->FocusWindow = Window->head.h; - co_IntSendKillFocusMessages(hWndPrev, Window->hSelf); - co_IntSendSetFocusMessages(hWndPrev, Window->hSelf); + co_IntSendKillFocusMessages(hWndPrev, Window->head.h); + co_IntSendSetFocusMessages(hWndPrev, Window->head.h); } else { @@ -475,7 +468,7 @@ NtUserSetActiveWindow(HWND hWnd) if (hWnd) { - PWINDOW_OBJECT Window; + PWND Window; PTHREADINFO pti; PUSER_MESSAGE_QUEUE ThreadQueue; HWND hWndPrev; @@ -488,7 +481,7 @@ NtUserSetActiveWindow(HWND hWnd) pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; - if (Window->pti->MessageQueue != ThreadQueue) + if (Window->head.pti->MessageQueue != ThreadQueue) { SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); RETURN( 0); @@ -540,7 +533,7 @@ NtUserSetCapture(HWND hWnd) { PTHREADINFO pti; PUSER_MESSAGE_QUEUE ThreadQueue; - PWINDOW_OBJECT Window; + PWND Window; HWND hWndPrev; DECLARE_RETURN(HWND); @@ -552,7 +545,7 @@ NtUserSetCapture(HWND hWnd) if((Window = UserGetWindowObject(hWnd))) { - if(Window->pti->MessageQueue != ThreadQueue) + if(Window->head.pti->MessageQueue != ThreadQueue) { RETURN(NULL); } @@ -580,44 +573,42 @@ CLEANUP: -HWND FASTCALL co_UserSetFocus(PWINDOW_OBJECT Window OPTIONAL) +HWND FASTCALL co_UserSetFocus(PWND Wnd OPTIONAL) { - if (Window) + if (Wnd) { PTHREADINFO pti; PUSER_MESSAGE_QUEUE ThreadQueue; HWND hWndPrev; - PWINDOW_OBJECT TopWnd; + PWND TopWnd; USER_REFERENCE_ENTRY Ref; - PWND Wnd; - ASSERT_REFS_CO(Window); + ASSERT_REFS_CO(Wnd); pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; - Wnd = Window->Wnd; if (Wnd->style & (WS_MINIMIZE | WS_DISABLED)) { return( (ThreadQueue ? ThreadQueue->FocusWindow : 0)); } - if (Window->pti->MessageQueue != ThreadQueue) + if (Wnd->head.pti->MessageQueue != ThreadQueue) { SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return( 0); } - TopWnd = UserGetAncestor(Window, GA_ROOT); - if (TopWnd && TopWnd->hSelf != UserGetActiveWindow()) + TopWnd = UserGetAncestor(Wnd, GA_ROOT); + if (TopWnd && TopWnd->head.h != UserGetActiveWindow()) { -// PWINDOW_OBJECT WndTops = UserGetWindowObject(hWndTop); +// PWND WndTops = UserGetWindowObject(hWndTop); UserRefObjectCo(TopWnd, &Ref); co_IntSetActiveWindow(TopWnd); UserDerefObjectCo(TopWnd); } - hWndPrev = co_IntSetFocusWindow(Window); + hWndPrev = co_IntSetFocusWindow(Wnd); return( hWndPrev); } @@ -635,7 +626,7 @@ HWND FASTCALL co_UserSetFocus(PWINDOW_OBJECT Window OPTIONAL) HWND APIENTRY NtUserSetFocus(HWND hWnd) { - PWINDOW_OBJECT Window; + PWND Window; USER_REFERENCE_ENTRY Ref; DECLARE_RETURN(HWND); HWND ret; diff --git a/subsystems/win32/win32k/ntuser/hook.c b/subsystems/win32/win32k/ntuser/hook.c index a71ea9bebf2..6b6df548973 100644 --- a/subsystems/win32/win32k/ntuser/hook.c +++ b/subsystems/win32/win32k/ntuser/hook.c @@ -332,6 +332,14 @@ co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam) ASSERT(WH_MINHOOK <= HookId && HookId <= WH_MAXHOOK); +#if 0 + /* FIXME! Check pDeskInfo->fsHooks for global hooks! */ + if (!ISITHOOKED(HookId)) + { + return 0; + } +#endif + pti = PsGetCurrentThreadWin32Thread(); if (!pti) { diff --git a/subsystems/win32/win32k/ntuser/hotkey.c b/subsystems/win32/win32k/ntuser/hotkey.c index 4ec1f1b5658..adfc6a5c3e1 100644 --- a/subsystems/win32/win32k/ntuser/hotkey.c +++ b/subsystems/win32/win32k/ntuser/hotkey.c @@ -102,13 +102,13 @@ GetHotKey (UINT fsModifiers, VOID FASTCALL -UnregisterWindowHotKeys(PWINDOW_OBJECT Window) +UnregisterWindowHotKeys(PWND Window) { PHOT_KEY_ITEM HotKeyItem, tmp; LIST_FOR_EACH_SAFE(HotKeyItem, tmp, &gHotkeyList, HOT_KEY_ITEM, ListEntry) { - if (HotKeyItem->hWnd == Window->hSelf) + if (HotKeyItem->hWnd == Window->head.h) { RemoveEntryList (&HotKeyItem->ListEntry); ExFreePool (HotKeyItem); @@ -164,7 +164,7 @@ NtUserRegisterHotKey(HWND hWnd, UINT vk) { PHOT_KEY_ITEM HotKeyItem; - PWINDOW_OBJECT Window; + PWND Window; PETHREAD HotKeyThread; DECLARE_RETURN(BOOL); @@ -181,7 +181,7 @@ NtUserRegisterHotKey(HWND hWnd, { RETURN( FALSE); } - HotKeyThread = Window->pti->pEThread; + HotKeyThread = Window->head.pti->pEThread; } /* Check for existing hotkey */ @@ -217,7 +217,7 @@ BOOL APIENTRY NtUserUnregisterHotKey(HWND hWnd, int id) { PHOT_KEY_ITEM HotKeyItem; - PWINDOW_OBJECT Window; + PWND Window; DECLARE_RETURN(BOOL); DPRINT("Enter NtUserUnregisterHotKey\n"); diff --git a/subsystems/win32/win32k/ntuser/input.c b/subsystems/win32/win32k/ntuser/input.c index c88b08aaae2..316b9308b31 100644 --- a/subsystems/win32/win32k/ntuser/input.c +++ b/subsystems/win32/win32k/ntuser/input.c @@ -453,7 +453,7 @@ IntKeyboardUpdateLeds(HANDLE KeyboardDeviceHandle, static VOID APIENTRY IntKeyboardSendWinKeyMsg() { - PWINDOW_OBJECT Window; + PWND Window; MSG Mesg; if (!(Window = UserGetWindowObject(InputWindowStation->ShellWindow))) @@ -468,7 +468,7 @@ IntKeyboardSendWinKeyMsg() Mesg.lParam = 0; /* The QS_HOTKEY is just a guess */ - MsqPostMessage(Window->pti->MessageQueue, &Mesg, FALSE, QS_HOTKEY); + MsqPostMessage(Window->head.pti->MessageQueue, &Mesg, FALSE, QS_HOTKEY); } static VOID APIENTRY diff --git a/subsystems/win32/win32k/ntuser/menu.c b/subsystems/win32/win32k/ntuser/menu.c index 0e32359ad2f..06618296b49 100644 --- a/subsystems/win32/win32k/ntuser/menu.c +++ b/subsystems/win32/win32k/ntuser/menu.c @@ -15,7 +15,7 @@ #include PMENU_OBJECT FASTCALL -IntGetSystemMenu(PWINDOW_OBJECT Window, BOOL bRevert, BOOL RetMenu); +IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu); @@ -253,7 +253,7 @@ IntDestroyMenuObject(PMENU_OBJECT Menu, { if(Menu) { - PWINDOW_OBJECT Window; + PWND Window; PWINSTATION_OBJECT WindowStation; NTSTATUS Status; @@ -279,7 +279,7 @@ IntDestroyMenuObject(PMENU_OBJECT Menu, Window = UserGetWindowObject(Menu->MenuInfo.Wnd); if (Window) { - Window->Wnd->IDMenu = 0; + Window->IDMenu = 0; } } // UserDereferenceObject(Menu); @@ -1079,7 +1079,7 @@ IntCheckMenuItem(PMENU_OBJECT MenuObject, UINT uIDCheckItem, UINT uCheck) } BOOL FASTCALL -IntHiliteMenuItem(PWINDOW_OBJECT WindowObject, PMENU_OBJECT MenuObject, +IntHiliteMenuItem(PWND WindowObject, PMENU_OBJECT MenuObject, UINT uItemHilite, UINT uHilite) { PMENU_ITEM MenuItem; @@ -1207,39 +1207,39 @@ IntGetMenuDefaultItem(PMENU_OBJECT MenuObject, UINT fByPos, UINT gmdiFlags, } VOID FASTCALL -co_IntInitTracking(PWINDOW_OBJECT Window, PMENU_OBJECT Menu, BOOL Popup, +co_IntInitTracking(PWND Window, PMENU_OBJECT Menu, BOOL Popup, UINT Flags) { /* FIXME - hide caret */ if(!(Flags & TPM_NONOTIFY)) - co_IntSendMessage(Window->hSelf, WM_SETCURSOR, (WPARAM)Window->hSelf, HTCAPTION); + co_IntSendMessage(Window->head.h, WM_SETCURSOR, (WPARAM)Window->head.h, HTCAPTION); /* FIXME - send WM_SETCURSOR message */ if(!(Flags & TPM_NONOTIFY)) - co_IntSendMessage(Window->hSelf, WM_INITMENU, (WPARAM)Menu->MenuInfo.Self, 0); + co_IntSendMessage(Window->head.h, WM_INITMENU, (WPARAM)Menu->MenuInfo.Self, 0); } VOID FASTCALL -co_IntExitTracking(PWINDOW_OBJECT Window, PMENU_OBJECT Menu, BOOL Popup, +co_IntExitTracking(PWND Window, PMENU_OBJECT Menu, BOOL Popup, UINT Flags) { if(!(Flags & TPM_NONOTIFY)) - co_IntSendMessage(Window->hSelf, WM_EXITMENULOOP, 0 /* FIXME */, 0); + co_IntSendMessage(Window->head.h, WM_EXITMENULOOP, 0 /* FIXME */, 0); /* FIXME - Show caret again */ } INT FASTCALL -IntTrackMenu(PMENU_OBJECT Menu, PWINDOW_OBJECT Window, INT x, INT y, +IntTrackMenu(PMENU_OBJECT Menu, PWND Window, INT x, INT y, RECTL lprect) { return 0; } BOOL FASTCALL -co_IntTrackPopupMenu(PMENU_OBJECT Menu, PWINDOW_OBJECT Window, +co_IntTrackPopupMenu(PMENU_OBJECT Menu, PWND Window, UINT Flags, POINT *Pos, UINT MenuPos, RECTL *ExcludeRect) { co_IntInitTracking(Window, Menu, TRUE, Flags); @@ -1295,7 +1295,7 @@ IntCleanupMenus(struct _EPROCESS *Process, PPROCESSINFO Win32Process) } BOOLEAN APIENTRY -intGetTitleBarInfo(PWINDOW_OBJECT pWindowObject, PTITLEBARINFO bti) +intGetTitleBarInfo(PWND pWindowObject, PTITLEBARINFO bti) { DWORD dwStyle = 0; @@ -1308,13 +1308,13 @@ intGetTitleBarInfo(PWINDOW_OBJECT pWindowObject, PTITLEBARINFO bti) bti->rgstate[0] = STATE_SYSTEM_FOCUSABLE; - dwStyle = pWindowObject->Wnd->style; - dwExStyle = pWindowObject->Wnd->ExStyle; + dwStyle = pWindowObject->style; + dwExStyle = pWindowObject->ExStyle; bti->rcTitleBar.top = 0; bti->rcTitleBar.left = 0; - bti->rcTitleBar.right = pWindowObject->Wnd->rcWindow.right - pWindowObject->Wnd->rcWindow.left; - bti->rcTitleBar.bottom = pWindowObject->Wnd->rcWindow.bottom - pWindowObject->Wnd->rcWindow.top; + bti->rcTitleBar.right = pWindowObject->rcWindow.right - pWindowObject->rcWindow.left; + bti->rcTitleBar.bottom = pWindowObject->rcWindow.bottom - pWindowObject->rcWindow.top; /* is it iconiced ? */ if ((dwStyle & WS_ICONIC)!=WS_ICONIC) @@ -1355,9 +1355,9 @@ intGetTitleBarInfo(PWINDOW_OBJECT pWindowObject, PTITLEBARINFO bti) } } - bti->rcTitleBar.top += pWindowObject->Wnd->rcWindow.top; - bti->rcTitleBar.left += pWindowObject->Wnd->rcWindow.left; - bti->rcTitleBar.right += pWindowObject->Wnd->rcWindow.left; + bti->rcTitleBar.top += pWindowObject->rcWindow.top; + bti->rcTitleBar.left += pWindowObject->rcWindow.left; + bti->rcTitleBar.right += pWindowObject->rcWindow.left; bti->rcTitleBar.bottom = bti->rcTitleBar.top; if (dwExStyle & WS_EX_TOOLWINDOW) @@ -1398,7 +1398,7 @@ intGetTitleBarInfo(PWINDOW_OBJECT pWindowObject, PTITLEBARINFO bti) { bti->rgstate[4] = STATE_SYSTEM_INVISIBLE; } - if (pWindowObject->Wnd->pcls->style & CS_NOCLOSE) + if (pWindowObject->pcls->style & CS_NOCLOSE) { bti->rgstate[5] = STATE_SYSTEM_UNAVAILABLE; } @@ -1425,50 +1425,49 @@ intGetTitleBarInfo(PWINDOW_OBJECT pWindowObject, PTITLEBARINFO bti) return retValue; } -/* FUNCTIONS *****************************************************************/ - - -/* - * @implemented - */ -DWORD -APIENTRY -NtUserBuildMenuItemList( - HMENU hMenu, - VOID* Buffer, - ULONG nBufSize, - DWORD Reserved) +DWORD FASTCALL +UserInsertMenuItem( + PMENU_OBJECT Menu, + UINT uItem, + BOOL fByPosition, + LPCMENUITEMINFOW UnsafeItemInfo) { - DWORD res = -1; - PMENU_OBJECT Menu; - DECLARE_RETURN(DWORD); + NTSTATUS Status; + ROSMENUITEMINFO ItemInfo; - DPRINT("Enter NtUserBuildMenuItemList\n"); - UserEnterExclusive(); - - if(!(Menu = UserGetMenuObject(hMenu))) + /* Try to copy the whole MENUITEMINFOW structure */ + Status = MmCopyFromCaller(&ItemInfo, UnsafeItemInfo, sizeof(MENUITEMINFOW)); + if (NT_SUCCESS(Status)) { - RETURN( (DWORD)-1); + if (sizeof(MENUITEMINFOW) != ItemInfo.cbSize + && FIELD_OFFSET(MENUITEMINFOW, hbmpItem) != ItemInfo.cbSize) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + return IntInsertMenuItem(Menu, uItem, fByPosition, &ItemInfo); } - if(Buffer) + /* Try to copy without last field (not present in older versions) */ + Status = MmCopyFromCaller(&ItemInfo, UnsafeItemInfo, FIELD_OFFSET(MENUITEMINFOW, hbmpItem)); + if (NT_SUCCESS(Status)) { - res = IntBuildMenuItemList(Menu, Buffer, nBufSize); - } - else - { - res = Menu->MenuInfo.MenuItemCount; + if (FIELD_OFFSET(MENUITEMINFOW, hbmpItem) != ItemInfo.cbSize) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + ItemInfo.hbmpItem = (HBITMAP)0; + return IntInsertMenuItem(Menu, uItem, fByPosition, &ItemInfo); } - RETURN( res); - -CLEANUP: - DPRINT("Leave NtUserBuildMenuItemList, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; + SetLastNtError(Status); + return FALSE; } +/* FUNCTIONS *****************************************************************/ + /* * @implemented */ @@ -1497,7 +1496,6 @@ CLEANUP: END_CLEANUP; } - HMENU FASTCALL UserCreateMenu(BOOL PopupMenu) { PWINSTATION_OBJECT WinStaObject; @@ -1537,7 +1535,6 @@ HMENU FASTCALL UserCreateMenu(BOOL PopupMenu) return (HMENU)Handle; } - /* * @implemented */ @@ -1574,7 +1571,7 @@ NtUserGetTitleBarInfo( HWND hwnd, PTITLEBARINFO bti) { - PWINDOW_OBJECT WindowObject; + PWND WindowObject; TITLEBARINFO bartitleinfo; DECLARE_RETURN(BOOLEAN); BOOLEAN retValue = TRUE; @@ -1633,8 +1630,6 @@ CLEANUP: END_CLEANUP; } - - /* * @implemented */ @@ -1688,7 +1683,6 @@ CLEANUP: END_CLEANUP; } - /* * @implemented */ @@ -1717,66 +1711,6 @@ CLEANUP: END_CLEANUP; } - -/* - * @implemented - */ -DWORD APIENTRY -UserInsertMenuItem( - HMENU hMenu, - UINT uItem, - BOOL fByPosition, - LPCMENUITEMINFOW UnsafeItemInfo) -{ - PMENU_OBJECT Menu; - NTSTATUS Status; - ROSMENUITEMINFO ItemInfo; - DECLARE_RETURN(DWORD); - - DPRINT("Enter UserInsertMenuItem\n"); - UserEnterExclusive(); - - if(!(Menu = UserGetMenuObject(hMenu))) - { - RETURN( FALSE); - } - - /* Try to copy the whole MENUITEMINFOW structure */ - Status = MmCopyFromCaller(&ItemInfo, UnsafeItemInfo, sizeof(MENUITEMINFOW)); - if (NT_SUCCESS(Status)) - { - if (sizeof(MENUITEMINFOW) != ItemInfo.cbSize - && FIELD_OFFSET(MENUITEMINFOW, hbmpItem) != ItemInfo.cbSize) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - RETURN( FALSE); - } - RETURN( IntInsertMenuItem(Menu, uItem, fByPosition, &ItemInfo)); - } - - /* Try to copy without last field (not present in older versions) */ - Status = MmCopyFromCaller(&ItemInfo, UnsafeItemInfo, FIELD_OFFSET(MENUITEMINFOW, hbmpItem)); - if (NT_SUCCESS(Status)) - { - if (FIELD_OFFSET(MENUITEMINFOW, hbmpItem) != ItemInfo.cbSize) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - RETURN( FALSE); - } - ItemInfo.hbmpItem = (HBITMAP)0; - RETURN( IntInsertMenuItem(Menu, uItem, fByPosition, &ItemInfo)); - } - - SetLastNtError(Status); - RETURN( FALSE); - -CLEANUP: - DPRINT("Leave UserInsertMenuItem, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; -} - - /* * @unimplemented */ @@ -1788,37 +1722,6 @@ NtUserEndMenu(VOID) return 0; } - -/* - * @implemented - */ -UINT APIENTRY -NtUserGetMenuDefaultItem( - HMENU hMenu, - UINT fByPos, - UINT gmdiFlags) -{ - PMENU_OBJECT Menu; - DWORD gismc = 0; - DECLARE_RETURN(UINT); - - DPRINT("Enter NtUserGetMenuDefaultItem\n"); - UserEnterExclusive(); - - if(!(Menu = UserGetMenuObject(hMenu))) - { - RETURN(-1); - } - - RETURN( IntGetMenuDefaultItem(Menu, fByPos, gmdiFlags, &gismc)); - -CLEANUP: - DPRINT("Leave NtUserGetMenuDefaultItem, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; -} - - /* * @implemented */ @@ -1832,7 +1735,7 @@ NtUserGetMenuBarInfo( BOOL Res = TRUE; PMENU_OBJECT MenuObject; PMENU_ITEM mi; - PWINDOW_OBJECT WindowObject; + PWND WindowObject; HMENU hMenu; POINT Offset; RECTL Rect; @@ -1848,7 +1751,7 @@ NtUserGetMenuBarInfo( RETURN(FALSE); } - hMenu = (HMENU)(DWORD_PTR)WindowObject->Wnd->IDMenu; + hMenu = (HMENU)(DWORD_PTR)WindowObject->IDMenu; if (!(MenuObject = UserGetMenuObject(hMenu))) { @@ -1934,7 +1837,7 @@ NtUserGetMenuBarInfo( } else { - PWINDOW_OBJECT SubWinObj; + PWND SubWinObj; if (!(SubWinObj = UserGetWindowObject(SubMenuObject->MenuInfo.Wnd))) { Res = FALSE; @@ -1984,7 +1887,7 @@ NtUserGetMenuBarInfo( } else { - PWINDOW_OBJECT SysWinObj; + PWND SysWinObj; if (!(SysWinObj = UserGetWindowObject(SysMenuObject->MenuInfo.Wnd))) { Res = FALSE; @@ -2034,21 +1937,41 @@ CLEANUP: END_CLEANUP; } - /* - * @unimplemented + * @implemented */ UINT APIENTRY NtUserGetMenuIndex( HMENU hMenu, - UINT wID) + HMENU hSubMenu) { - UNIMPLEMENTED + PMENU_OBJECT Menu, SubMenu; + PMENU_ITEM MenuItem; + DECLARE_RETURN(UINT); - return 0; + DPRINT("Enter NtUserGetMenuIndex\n"); + UserEnterShared(); + + if ( !(Menu = UserGetMenuObject(hMenu)) || + !(SubMenu = UserGetMenuObject(hSubMenu)) ) + RETURN(0xFFFFFFFF); + + MenuItem = Menu->MenuItemList; + while(MenuItem) + { + if (MenuItem->hSubMenu == hSubMenu) + RETURN(MenuItem->wID); + MenuItem = MenuItem->Next; + } + + RETURN(0xFFFFFFFF); + +CLEANUP: + DPRINT("Leave NtUserGetMenuIndex, ret=%i\n",_ret_); + UserLeave(); + END_CLEANUP; } - /* * @implemented */ @@ -2060,7 +1983,7 @@ NtUserGetMenuItemRect( PRECTL lprcItem) { ROSMENUINFO mi; - PWINDOW_OBJECT ReferenceWnd; + PWND ReferenceWnd; LONG XMove, YMove; RECTL Rect; NTSTATUS Status; @@ -2095,13 +2018,13 @@ NtUserGetMenuItemRect( if(MenuItem->fType & MF_POPUP) { - XMove = ReferenceWnd->Wnd->rcClient.left; - YMove = ReferenceWnd->Wnd->rcClient.top; + XMove = ReferenceWnd->rcClient.left; + YMove = ReferenceWnd->rcClient.top; } else { - XMove = ReferenceWnd->Wnd->rcWindow.left; - YMove = ReferenceWnd->Wnd->rcWindow.top; + XMove = ReferenceWnd->rcWindow.left; + YMove = ReferenceWnd->rcWindow.top; } Rect.left += XMove; @@ -2123,7 +2046,6 @@ CLEANUP: END_CLEANUP; } - /* * @implemented */ @@ -2135,7 +2057,7 @@ NtUserHiliteMenuItem( UINT uHilite) { PMENU_OBJECT Menu; - PWINDOW_OBJECT Window; + PWND Window; DECLARE_RETURN(BOOLEAN); DPRINT("Enter NtUserHiliteMenuItem\n"); @@ -2151,7 +2073,7 @@ NtUserHiliteMenuItem( RETURN(FALSE); } - if(Window->Wnd->IDMenu == (UINT)(UINT_PTR)hMenu) + if(Window->IDMenu == (UINT)(UINT_PTR)hMenu) { RETURN( IntHiliteMenuItem(Window, Menu, uItemHilite, uHilite)); } @@ -2164,7 +2086,6 @@ CLEANUP: END_CLEANUP; } - static BOOL FASTCALL UserMenuInfo( @@ -2218,41 +2139,6 @@ UserMenuInfo( return( Res); } - - - - -/* - * @implemented - */ -BOOL -APIENTRY -NtUserMenuInfo( - HMENU hMenu, - PROSMENUINFO UnsafeMenuInfo, - BOOL SetOrGet) -{ - PMENU_OBJECT Menu; - DECLARE_RETURN(BOOL); - - DPRINT("Enter NtUserMenuInfo\n"); - UserEnterShared(); - - if (!(Menu = UserGetMenuObject(hMenu))) - { - RETURN(FALSE); - } - - RETURN(UserMenuInfo(Menu, UnsafeMenuInfo, SetOrGet)); - -CLEANUP: - DPRINT("Leave NtUserMenuInfo, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; -} - - - /* * @implemented */ @@ -2264,7 +2150,7 @@ NtUserMenuItemFromPoint( DWORD Y) { PMENU_OBJECT Menu; - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; PMENU_ITEM mi; int i; DECLARE_RETURN(int); @@ -2282,8 +2168,8 @@ NtUserMenuItemFromPoint( RETURN( -1); } - X -= Window->Wnd->rcWindow.left; - Y -= Window->Wnd->rcWindow.top; + X -= Window->rcWindow.left; + Y -= Window->rcWindow.top; mi = Menu->MenuItemList; for (i = 0; NULL != mi; i++) @@ -2303,8 +2189,6 @@ CLEANUP: END_CLEANUP; } - - static BOOL FASTCALL UserMenuItemInfo( @@ -2377,7 +2261,315 @@ UserMenuItemInfo( return( Ret); } +/* + * @implemented + */ +BOOL APIENTRY +NtUserRemoveMenu( + HMENU hMenu, + UINT uPosition, + UINT uFlags) +{ + PMENU_OBJECT Menu; + DECLARE_RETURN(BOOL); + DPRINT("Enter NtUserRemoveMenu\n"); + UserEnterExclusive(); + + if(!(Menu = UserGetMenuObject(hMenu))) + { + RETURN( FALSE); + } + + RETURN(IntRemoveMenuItem(Menu, uPosition, uFlags, FALSE)); + +CLEANUP: + DPRINT("Leave NtUserRemoveMenu, ret=%i\n",_ret_); + UserLeave(); + END_CLEANUP; + +} + +/* + * @implemented + */ +BOOL APIENTRY +NtUserSetMenuContextHelpId( + HMENU hMenu, + DWORD dwContextHelpId) +{ + PMENU_OBJECT Menu; + DECLARE_RETURN(BOOL); + + DPRINT("Enter NtUserSetMenuContextHelpId\n"); + UserEnterExclusive(); + + if(!(Menu = UserGetMenuObject(hMenu))) + { + RETURN( FALSE); + } + + RETURN(IntSetMenuContextHelpId(Menu, dwContextHelpId)); + +CLEANUP: + DPRINT("Leave NtUserSetMenuContextHelpId, ret=%i\n",_ret_); + UserLeave(); + END_CLEANUP; +} + +/* + * @implemented + */ +BOOL APIENTRY +NtUserSetMenuDefaultItem( + HMENU hMenu, + UINT uItem, + UINT fByPos) +{ + PMENU_OBJECT Menu; + DECLARE_RETURN(BOOL); + + DPRINT("Enter NtUserSetMenuDefaultItem\n"); + UserEnterExclusive(); + + if(!(Menu = UserGetMenuObject(hMenu))) + { + RETURN( FALSE); + } + + RETURN( UserSetMenuDefaultItem(Menu, uItem, fByPos)); + +CLEANUP: + DPRINT("Leave NtUserSetMenuDefaultItem, ret=%i\n",_ret_); + UserLeave(); + END_CLEANUP; +} + +/* + * @implemented + */ +BOOL APIENTRY +NtUserSetMenuFlagRtoL( + HMENU hMenu) +{ + PMENU_OBJECT Menu; + DECLARE_RETURN(BOOL); + + DPRINT("Enter NtUserSetMenuFlagRtoL\n"); + UserEnterExclusive(); + + if(!(Menu = UserGetMenuObject(hMenu))) + { + RETURN( FALSE); + } + + RETURN(IntSetMenuFlagRtoL(Menu)); + +CLEANUP: + DPRINT("Leave NtUserSetMenuFlagRtoL, ret=%i\n",_ret_); + UserLeave(); + END_CLEANUP; +} + +/* + * @implemented + */ +BOOL APIENTRY +NtUserThunkedMenuInfo( + HMENU hMenu, + LPCMENUINFO lpcmi) +{ + PMENU_OBJECT Menu; + DECLARE_RETURN(BOOL); + + DPRINT("Enter NtUserThunkedMenuInfo\n"); + UserEnterExclusive(); + + if (!(Menu = UserGetMenuObject(hMenu))) + { + RETURN(FALSE); + } + + RETURN(UserMenuInfo(Menu, (PROSMENUINFO)lpcmi, TRUE)); + +CLEANUP: + DPRINT("Leave NtUserThunkedMenuInfo, ret=%i\n",_ret_); + UserLeave(); + END_CLEANUP; +} + +/* + * @implemented + */ +BOOL APIENTRY +NtUserThunkedMenuItemInfo( + HMENU hMenu, + UINT uItem, + BOOL fByPosition, + BOOL bInsert, + LPMENUITEMINFOW lpmii, + PUNICODE_STRING lpszCaption) +{ + PMENU_OBJECT Menu; + NTSTATUS Status; + UNICODE_STRING lstrCaption; + DECLARE_RETURN(BOOL); + + DPRINT("Enter NtUserThunkedMenuItemInfo\n"); + UserEnterExclusive(); + + /* lpszCaption may be NULL, check for it and call RtlInitUnicodeString() + if bInsert == TRUE call UserInsertMenuItem() else UserSetMenuItemInfo() */ + + if (!(Menu = UserGetMenuObject(hMenu))) + { + RETURN(FALSE); + } + + lstrCaption.Buffer = NULL; + + /* Check if we got a Caption */ + if (lpszCaption) + { + /* Copy the string to kernel mode */ + Status = ProbeAndCaptureUnicodeString( &lstrCaption, + UserMode, + lpszCaption); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to capture MenuItem Caption (status 0x%08x)\n",Status); + SetLastNtError(Status); + RETURN(FALSE); + } + } + + if (bInsert) RETURN( UserInsertMenuItem(Menu, uItem, fByPosition, lpmii)); + + RETURN( UserMenuItemInfo(Menu, uItem, fByPosition, (PROSMENUITEMINFO)lpmii, TRUE)); + +CLEANUP: + DPRINT("Leave NtUserThunkedMenuItemInfo, ret=%i\n",_ret_); + UserLeave(); + END_CLEANUP; +} + +/* + * @implemented + */ +/* NOTE: unused function */ +BOOL APIENTRY +NtUserTrackPopupMenuEx( + HMENU hMenu, + UINT fuFlags, + int x, + int y, + HWND hWnd, + LPTPMPARAMS lptpm) +{ + UNIMPLEMENTED + + return FALSE; +} + + +////// ReactOS NtUserBad +/* + * @implemented + */ +DWORD +APIENTRY +NtUserBuildMenuItemList( + HMENU hMenu, + VOID* Buffer, + ULONG nBufSize, + DWORD Reserved) +{ + DWORD res = -1; + PMENU_OBJECT Menu; + DECLARE_RETURN(DWORD); + + DPRINT("Enter NtUserBuildMenuItemList\n"); + UserEnterExclusive(); + + if(!(Menu = UserGetMenuObject(hMenu))) + { + RETURN( (DWORD)-1); + } + + if(Buffer) + { + res = IntBuildMenuItemList(Menu, Buffer, nBufSize); + } + else + { + res = Menu->MenuInfo.MenuItemCount; + } + + RETURN( res); + +CLEANUP: + DPRINT("Leave NtUserBuildMenuItemList, ret=%i\n",_ret_); + UserLeave(); + END_CLEANUP; +} + +/* + * @implemented + */ +UINT APIENTRY +NtUserGetMenuDefaultItem( + HMENU hMenu, + UINT fByPos, + UINT gmdiFlags) +{ + PMENU_OBJECT Menu; + DWORD gismc = 0; + DECLARE_RETURN(UINT); + + DPRINT("Enter NtUserGetMenuDefaultItem\n"); + UserEnterExclusive(); + + if(!(Menu = UserGetMenuObject(hMenu))) + { + RETURN(-1); + } + + RETURN( IntGetMenuDefaultItem(Menu, fByPos, gmdiFlags, &gismc)); + +CLEANUP: + DPRINT("Leave NtUserGetMenuDefaultItem, ret=%i\n",_ret_); + UserLeave(); + END_CLEANUP; +} + +/* + * @implemented + */ +BOOL +APIENTRY +NtUserMenuInfo( + HMENU hMenu, + PROSMENUINFO UnsafeMenuInfo, + BOOL SetOrGet) +{ + PMENU_OBJECT Menu; + DECLARE_RETURN(BOOL); + + DPRINT("Enter NtUserMenuInfo\n"); + UserEnterShared(); + + if (!(Menu = UserGetMenuObject(hMenu))) + { + RETURN(FALSE); + } + + RETURN(UserMenuInfo(Menu, UnsafeMenuInfo, SetOrGet)); + +CLEANUP: + DPRINT("Leave NtUserMenuInfo, ret=%i\n",_ret_); + UserLeave(); + END_CLEANUP; +} /* * @implemented @@ -2411,176 +2603,4 @@ CLEANUP: } - -/* - * @implemented - */ -BOOL APIENTRY -NtUserRemoveMenu( - HMENU hMenu, - UINT uPosition, - UINT uFlags) -{ - PMENU_OBJECT Menu; - DECLARE_RETURN(BOOL); - - DPRINT("Enter NtUserRemoveMenu\n"); - UserEnterExclusive(); - - if(!(Menu = UserGetMenuObject(hMenu))) - { - RETURN( FALSE); - } - - RETURN(IntRemoveMenuItem(Menu, uPosition, uFlags, FALSE)); - -CLEANUP: - DPRINT("Leave NtUserRemoveMenu, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; - -} - - -/* - * @implemented - */ -BOOL APIENTRY -NtUserSetMenuContextHelpId( - HMENU hMenu, - DWORD dwContextHelpId) -{ - PMENU_OBJECT Menu; - DECLARE_RETURN(BOOL); - - DPRINT("Enter NtUserSetMenuContextHelpId\n"); - UserEnterExclusive(); - - if(!(Menu = UserGetMenuObject(hMenu))) - { - RETURN( FALSE); - } - - RETURN(IntSetMenuContextHelpId(Menu, dwContextHelpId)); - -CLEANUP: - DPRINT("Leave NtUserSetMenuContextHelpId, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; -} - - - -/* - * @implemented - */ -BOOL APIENTRY -NtUserSetMenuDefaultItem( - HMENU hMenu, - UINT uItem, - UINT fByPos) -{ - PMENU_OBJECT Menu; - DECLARE_RETURN(BOOL); - - DPRINT("Enter NtUserSetMenuDefaultItem\n"); - UserEnterExclusive(); - - if(!(Menu = UserGetMenuObject(hMenu))) - { - RETURN( FALSE); - } - - RETURN( UserSetMenuDefaultItem(Menu, uItem, fByPos)); - -CLEANUP: - DPRINT("Leave NtUserSetMenuDefaultItem, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; -} - - -/* - * @implemented - */ -BOOL APIENTRY -NtUserSetMenuFlagRtoL( - HMENU hMenu) -{ - PMENU_OBJECT Menu; - DECLARE_RETURN(BOOL); - - DPRINT("Enter NtUserSetMenuFlagRtoL\n"); - UserEnterExclusive(); - - if(!(Menu = UserGetMenuObject(hMenu))) - { - RETURN( FALSE); - } - - RETURN(IntSetMenuFlagRtoL(Menu)); - -CLEANUP: - DPRINT("Leave NtUserSetMenuFlagRtoL, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; -} - - -/* - * @unimplemented - */ -DWORD APIENTRY -NtUserThunkedMenuInfo( - HMENU hMenu, - LPCMENUINFO lpcmi) -{ - UNIMPLEMENTED - /* This function seems just to call SetMenuInfo() */ - return 0; -} - - -/* - * @unimplemented - */ -DWORD APIENTRY -NtUserThunkedMenuItemInfo( - HMENU hMenu, - UINT uItem, - BOOL fByPosition, - BOOL bInsert, - LPMENUITEMINFOW lpmii, - PUNICODE_STRING lpszCaption) -{ - - /* lpszCaption may be NULL, check for it and call RtlInitUnicodeString() - if bInsert == TRUE call NtUserInsertMenuItem() else NtUserSetMenuItemInfo() */ - - if (bInsert) return UserInsertMenuItem(hMenu, uItem, fByPosition, lpmii); - - UNIMPLEMENTED - return 0; -} - - -/* - * @implemented - */ -/* NOTE: unused function */ -BOOL APIENTRY -NtUserTrackPopupMenuEx( - HMENU hMenu, - UINT fuFlags, - int x, - int y, - HWND hWnd, - LPTPMPARAMS lptpm) -{ - UNIMPLEMENTED - - return FALSE; -} - - /* EOF */ diff --git a/subsystems/win32/win32k/ntuser/message.c b/subsystems/win32/win32k/ntuser/message.c index 1d7a0b34171..403e02b84ce 100644 --- a/subsystems/win32/win32k/ntuser/message.c +++ b/subsystems/win32/win32k/ntuser/message.c @@ -327,47 +327,39 @@ static VOID FASTCALL IntCallWndProc -( PWINDOW_OBJECT Window, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +( PWND Window, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { BOOL SameThread = FALSE; + CWPSTRUCT CWP; - if (Window->pti == ((PTHREADINFO)PsGetCurrentThreadWin32Thread())) + if (Window->head.pti == ((PTHREADINFO)PsGetCurrentThreadWin32Thread())) SameThread = TRUE; - if ((!SameThread && (Window->pti->fsHooks & HOOKID_TO_FLAG(WH_CALLWNDPROC))) || - (SameThread && ISITHOOKED(WH_CALLWNDPROC)) ) - { - CWPSTRUCT CWP; - CWP.hwnd = hWnd; - CWP.message = Msg; - CWP.wParam = wParam; - CWP.lParam = lParam; - co_HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, SameThread, (LPARAM)&CWP ); - } + CWP.hwnd = hWnd; + CWP.message = Msg; + CWP.wParam = wParam; + CWP.lParam = lParam; + co_HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, SameThread, (LPARAM)&CWP ); } static VOID FASTCALL IntCallWndProcRet -( PWINDOW_OBJECT Window, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *uResult) +( PWND Window, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *uResult) { BOOL SameThread = FALSE; + CWPRETSTRUCT CWPR; - if (Window->pti == ((PTHREADINFO)PsGetCurrentThreadWin32Thread())) + if (Window->head.pti == ((PTHREADINFO)PsGetCurrentThreadWin32Thread())) SameThread = TRUE; - if ((!SameThread && (Window->pti->fsHooks & HOOKID_TO_FLAG(WH_CALLWNDPROCRET))) || - (SameThread && ISITHOOKED(WH_CALLWNDPROCRET)) ) - { - CWPRETSTRUCT CWPR; - CWPR.hwnd = hWnd; - CWPR.message = Msg; - CWPR.wParam = wParam; - CWPR.lParam = lParam; - CWPR.lResult = *uResult; - co_HOOK_CallHooks( WH_CALLWNDPROCRET, HC_ACTION, SameThread, (LPARAM)&CWPR ); - } + CWPR.hwnd = hWnd; + CWPR.message = Msg; + CWPR.wParam = wParam; + CWPR.lParam = lParam; + CWPR.lResult = *uResult; + co_HOOK_CallHooks( WH_CALLWNDPROCRET, HC_ACTION, SameThread, (LPARAM)&CWPR ); } LRESULT @@ -380,12 +372,12 @@ IntDispatchMessage(PMSG pMsg) PMSGMEMORY MsgMemoryEntry; INT lParamBufferSize; LPARAM lParamPacked; - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; if (pMsg->hwnd) { Window = UserGetWindowObject(pMsg->hwnd); - if (!Window || !Window->Wnd) return 0; + if (!Window) return 0; } if (((pMsg->message == WM_SYSTIMER) || @@ -394,7 +386,7 @@ IntDispatchMessage(PMSG pMsg) { if (pMsg->message == WM_TIMER) { - if (ValidateTimerCallback(PsGetCurrentThreadWin32Thread(),Window,pMsg->wParam,pMsg->lParam)) + if (ValidateTimerCallback(PsGetCurrentThreadWin32Thread(),pMsg->lParam)) { KeQueryTickCount(&TickCount); Time = MsqCalculateMessageTime(&TickCount); @@ -421,7 +413,7 @@ IntDispatchMessage(PMSG pMsg) } } // Need a window! - if ( !Window || !Window->Wnd ) return 0; + if ( !Window ) return 0; /* See if this message type is present in the table */ MsgMemoryEntry = FindMsgMemory(pMsg->message); @@ -440,8 +432,8 @@ IntDispatchMessage(PMSG pMsg) return 0; } - retval = co_IntCallWindowProc( Window->Wnd->lpfnWndProc, - !Window->Wnd->Unicode, + retval = co_IntCallWindowProc( Window->lpfnWndProc, + !Window->Unicode, pMsg->hwnd, pMsg->message, pMsg->wParam, @@ -522,11 +514,11 @@ BOOL FASTCALL co_IntActivateWindowMouse( PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg, - PWINDOW_OBJECT MsgWindow, + PWND MsgWindow, USHORT *HitTest) { ULONG Result; - PWINDOW_OBJECT Parent; + PWND Parent; ASSERT_REFS_CO(MsgWindow); @@ -539,9 +531,9 @@ co_IntActivateWindowMouse( Parent = IntGetParent(MsgWindow);//fixme: deref retval? /* If no parent window, pass MsgWindows HWND as wParam. Fixes bug #3111 */ - Result = co_IntSendMessage(MsgWindow->hSelf, + Result = co_IntSendMessage(MsgWindow->head.h, WM_MOUSEACTIVATE, - (WPARAM) (Parent ? Parent->hSelf : MsgWindow->hSelf), + (WPARAM) (Parent ? Parent->head.h : MsgWindow->head.h), (LPARAM)MAKELONG(*HitTest, Msg->message) ); @@ -570,7 +562,7 @@ co_IntTranslateMouseMessage( USHORT *HitTest, BOOL Remove) { - PWINDOW_OBJECT Window; + PWND Window; USER_REFERENCE_ENTRY Ref, DesktopRef; if(!(Window = UserGetWindowObject(Msg->hwnd))) @@ -583,38 +575,38 @@ co_IntTranslateMouseMessage( UserRefObjectCo(Window, &Ref); - if ( ThreadQueue == Window->pti->MessageQueue && - ThreadQueue->CaptureWindow != Window->hSelf) + if ( ThreadQueue == Window->head.pti->MessageQueue && + ThreadQueue->CaptureWindow != Window->head.h) { /* only send WM_NCHITTEST messages if we're not capturing the window! */ if (Remove ) { - *HitTest = co_IntSendMessage(Window->hSelf, WM_NCHITTEST, 0, + *HitTest = co_IntSendMessage(Window->head.h, WM_NCHITTEST, 0, MAKELONG(Msg->pt.x, Msg->pt.y)); } /* else we are going to see this message again, but then with Remove == TRUE */ if (*HitTest == (USHORT)HTTRANSPARENT) { - PWINDOW_OBJECT DesktopWindow; + PWND DesktopWindow; HWND hDesktop = IntGetDesktopWindow(); if ((DesktopWindow = UserGetWindowObject(hDesktop))) { - PWINDOW_OBJECT Wnd; + PWND Wnd; UserRefObjectCo(DesktopWindow, &DesktopRef); - co_WinPosWindowFromPoint(DesktopWindow, Window->pti->MessageQueue, &Msg->pt, &Wnd); + co_WinPosWindowFromPoint(DesktopWindow, Window->head.pti->MessageQueue, &Msg->pt, &Wnd); if (Wnd) { if (Wnd != Window) { /* post the message to the other window */ - Msg->hwnd = Wnd->hSelf; - if(!(Wnd->state & WINDOWSTATUS_DESTROYING)) + Msg->hwnd = Wnd->head.h; + if(!(Wnd->state & WNDS_DESTROYED)) { - MsqPostMessage(Wnd->pti->MessageQueue, Msg, FALSE, + MsqPostMessage(Wnd->head.pti->MessageQueue, Msg, FALSE, Msg->message == WM_MOUSEMOVE ? QS_MOUSEMOVE : QS_MOUSEBUTTON); } @@ -648,7 +640,7 @@ co_IntTranslateMouseMessage( { /* generate double click messages, if necessary */ if ((((*HitTest) != HTCLIENT) || - (Window->Wnd->pcls->style & CS_DBLCLKS)) && + (Window->pcls->style & CS_DBLCLKS)) && MsqIsDblClk(Msg, Remove)) { Msg->message += WM_LBUTTONDBLCLK - WM_LBUTTONDOWN; @@ -665,7 +657,7 @@ co_IntTranslateMouseMessage( (((*HitTest) == HTCAPTION) || ((*HitTest) == HTSYSMENU)) ) { Msg->message = WM_CONTEXTMENU; - Msg->wParam = (WPARAM)Window->hSelf; + Msg->wParam = (WPARAM)Window->head.h; } else { @@ -678,8 +670,8 @@ co_IntTranslateMouseMessage( { /* NOTE: Msg->pt should remain in screen coordinates. -- FiN */ Msg->lParam = MAKELONG( - Msg->pt.x - (WORD)Window->Wnd->rcClient.left, - Msg->pt.y - (WORD)Window->Wnd->rcClient.top); + Msg->pt.x - (WORD)Window->rcClient.left, + Msg->pt.y - (WORD)Window->rcClient.top); } } @@ -687,10 +679,85 @@ co_IntTranslateMouseMessage( return FALSE; } -BOOL ProcessMouseMessage(MSG* Msg, USHORT HitTest, UINT RemoveMsg) +BOOL ProcessMouseMessage(MSG* Msg, BOOLEAN RemoveMessages) { MOUSEHOOKSTRUCT MHook; EVENTMSG Event; + PTHREADINFO pti; + PUSER_MESSAGE_QUEUE ThreadQueue; + USER_REFERENCE_ENTRY Ref; + USHORT HitTest = HTNOWHERE; + + pti = PsGetCurrentThreadWin32Thread(); + ThreadQueue = pti->MessageQueue; + + if(RemoveMessages) + { + PWND MsgWindow = NULL; + + /* Mouse message process */ + + if( Msg->hwnd && + ( MsgWindow = UserGetWindowObject(Msg->hwnd) ) && + Msg->message >= WM_MOUSEFIRST && + Msg->message <= WM_MOUSELAST ) + { + USHORT HitTest; + + UserRefObjectCo(MsgWindow, &Ref); + + if ( co_IntTranslateMouseMessage( ThreadQueue, + Msg, + &HitTest, + TRUE)) + /* FIXME - check message filter again, if the message doesn't match anymore, + search again */ + { + UserDerefObjectCo(MsgWindow); + /* eat the message, search again */ + return FALSE; + } + + if(ThreadQueue->CaptureWindow == NULL) + { + co_IntSendHitTestMessages(ThreadQueue, Msg); + + if ( ( Msg->message != WM_MOUSEMOVE && + Msg->message != WM_NCMOUSEMOVE ) && + IS_BTN_MESSAGE(Msg->message, DOWN) && + co_IntActivateWindowMouse(ThreadQueue, Msg, MsgWindow, &HitTest) ) + { + UserDerefObjectCo(MsgWindow); + /* eat the message, search again */ + return FALSE; + } + } + + UserDerefObjectCo(MsgWindow); + } + else + { + co_IntSendHitTestMessages(ThreadQueue, Msg); + } + + return TRUE; + } + + if ( ( Msg->hwnd && + Msg->message >= WM_MOUSEFIRST && + Msg->message <= WM_MOUSELAST ) && + co_IntTranslateMouseMessage( ThreadQueue, + Msg, + &HitTest, + FALSE) ) + /* FIXME - check message filter again, if the message doesn't match anymore, + search again */ + { + /* eat the message, search again */ + return FALSE; + } + + pti->rpdesk->htEx = HitTest; /* Now set the capture hit. */ Event.message = Msg->message; Event.time = Msg->time; @@ -705,28 +772,25 @@ BOOL ProcessMouseMessage(MSG* Msg, USHORT HitTest, UINT RemoveMsg) MHook.wHitTestCode = HitTest; MHook.dwExtraInfo = 0; if (co_HOOK_CallHooks( WH_MOUSE, - RemoveMsg ? HC_ACTION : HC_NOREMOVE, + RemoveMessages ? HC_ACTION : HC_NOREMOVE, Msg->message, (LPARAM)&MHook )) { - if (ISITHOOKED(WH_CBT)) - { - MHook.pt = Msg->pt; - MHook.hwnd = Msg->hwnd; - MHook.wHitTestCode = HitTest; - MHook.dwExtraInfo = 0; - co_HOOK_CallHooks( WH_CBT, - HCBT_CLICKSKIPPED, - Msg->message, - (LPARAM)&MHook); - } + MHook.pt = Msg->pt; + MHook.hwnd = Msg->hwnd; + MHook.wHitTestCode = HitTest; + MHook.dwExtraInfo = 0; + co_HOOK_CallHooks( WH_CBT, + HCBT_CLICKSKIPPED, + Msg->message, + (LPARAM)&MHook); return FALSE; } return TRUE; } -BOOL ProcessKeyboardMessage(MSG* Msg, UINT RemoveMsg) +BOOL ProcessKeyboardMessage(MSG* Msg, BOOLEAN RemoveMessages) { EVENTMSG Event; @@ -739,28 +803,45 @@ BOOL ProcessKeyboardMessage(MSG* Msg, UINT RemoveMsg) co_HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)&Event); if (co_HOOK_CallHooks( WH_KEYBOARD, - RemoveMsg ? HC_ACTION : HC_NOREMOVE, + RemoveMessages ? HC_ACTION : HC_NOREMOVE, LOWORD(Msg->wParam), Msg->lParam)) { - if (ISITHOOKED(WH_CBT)) - { - /* skip this message */ - co_HOOK_CallHooks( WH_CBT, - HCBT_KEYSKIPPED, - LOWORD(Msg->wParam), - Msg->lParam ); - } + /* skip this message */ + co_HOOK_CallHooks( WH_CBT, + HCBT_KEYSKIPPED, + LOWORD(Msg->wParam), + Msg->lParam ); return FALSE; } return TRUE; } + +BOOL ProcessHardwareMessage(MSG* Msg, BOOLEAN RemoveMessages) +{ + if ( IS_MOUSE_MESSAGE(Msg->message)) + { + if (!ProcessMouseMessage(Msg, RemoveMessages)) + { + return FALSE; + } + } + else if ( IS_KBD_MESSAGE(Msg->message)) + { + if(!ProcessKeyboardMessage(Msg, RemoveMessages)) + { + return FALSE; + } + } + + return TRUE; +} /* * Internal version of PeekMessage() doing all the work */ BOOL FASTCALL co_IntPeekMessage( PUSER_MESSAGE Msg, - PWINDOW_OBJECT Window, + PWND Window, UINT MsgFilterMin, UINT MsgFilterMax, UINT RemoveMsg ) @@ -769,226 +850,107 @@ co_IntPeekMessage( PUSER_MESSAGE Msg, LARGE_INTEGER LargeTickCount; PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE Message; - BOOL Present, RemoveMessages; - USER_REFERENCE_ENTRY Ref; - USHORT HitTest; - - /* The queues and order in which they are checked are documented in the MSDN - article on GetMessage() */ + BOOL RemoveMessages; pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; - /* Inspect RemoveMsg flags */ - /* Note: - The only flag we process is PM_REMOVE. - Processing (High word) PM_QS_Xx Is needed. This and MsgFilterXxx can result - with QS_Xx flags to be used to isolate which message check to test for. - ATM, we look at all messages and the filters are sent to co_MsqFindMessage - and there, it is cross checked. - Example: Wine server/queue.c is_keyboard_msg, check_msg_filter and - filter_contains_hw_range. - */ RemoveMessages = RemoveMsg & PM_REMOVE; -/* - If no filter is specified, messages are processed in the following order: - - * Sent messages - * Posted messages - * Input (hardware) messages and system internal events - * Sent messages (again) - * WM_PAINT messages - * WM_TIMER messages - */ -CheckMessages: - - HitTest = HTNOWHERE; - - Present = FALSE; - - KeQueryTickCount(&LargeTickCount); - ThreadQueue->LastMsgRead = LargeTickCount.u.LowPart; - - /* Dispatch sent messages here. */ - while (co_MsqDispatchOneSentMessage(ThreadQueue)) - ; - - /* Now look for a quit message. */ - - if (ThreadQueue->QuitPosted) + do { - /* According to the PSDK, WM_QUIT messages are always returned, regardless - of the filter specified */ - Msg->Msg.hwnd = NULL; - Msg->Msg.message = WM_QUIT; - Msg->Msg.wParam = ThreadQueue->QuitExitCode; - Msg->Msg.lParam = 0; - Msg->FreeLParam = FALSE; - if (RemoveMessages) - { - ThreadQueue->QuitPosted = FALSE; - } - goto MsgExit; - } + KeQueryTickCount(&LargeTickCount); + ThreadQueue->LastMsgRead = LargeTickCount.u.LowPart; - /* Now check for normal messages. */ - Present = co_MsqFindMessage( ThreadQueue, - FALSE, - RemoveMessages, - Window, - MsgFilterMin, - MsgFilterMax, - &Message ); - if (Present) - { - RtlCopyMemory(Msg, Message, sizeof(USER_MESSAGE)); - if (RemoveMessages) - { - MsqDestroyMessage(Message); - } - goto MessageFound; - } + /* Dispatch sent messages here. */ + while (co_MsqDispatchOneSentMessage(ThreadQueue)) + ; - /* Check for hardware events. */ - Present = co_MsqFindMessage( ThreadQueue, - TRUE, - RemoveMessages, - Window, - MsgFilterMin, - MsgFilterMax, - &Message ); - if (Present) - { - RtlCopyMemory(Msg, Message, sizeof(USER_MESSAGE)); - if (RemoveMessages) - { - MsqDestroyMessage(Message); - } - goto MessageFound; - } + /* Now look for a quit message. */ - /* Check for sent messages again. */ - while (co_MsqDispatchOneSentMessage(ThreadQueue)) - ; - - /* Check for paint messages. */ - if ( IntGetPaintMessage( Window, - MsgFilterMin, - MsgFilterMax, - pti, - &Msg->Msg, - RemoveMessages)) - { - Msg->FreeLParam = FALSE; - goto MsgExit; - } - - if (PostTimerMessages(Window)) - goto CheckMessages; - - if(Present) - { -MessageFound: - - if(RemoveMessages) - { - PWINDOW_OBJECT MsgWindow = NULL; - - /* Mouse message process */ - - if( Msg->Msg.hwnd && - ( MsgWindow = UserGetWindowObject(Msg->Msg.hwnd) ) && - Msg->Msg.message >= WM_MOUSEFIRST && - Msg->Msg.message <= WM_MOUSELAST ) - { - USHORT HitTest; - - UserRefObjectCo(MsgWindow, &Ref); - - if ( co_IntTranslateMouseMessage( ThreadQueue, - &Msg->Msg, - &HitTest, - TRUE)) - /* FIXME - check message filter again, if the message doesn't match anymore, - search again */ - { - UserDerefObjectCo(MsgWindow); - /* eat the message, search again */ - goto CheckMessages; - } - - if(ThreadQueue->CaptureWindow == NULL) - { - co_IntSendHitTestMessages(ThreadQueue, &Msg->Msg); - - if ( ( Msg->Msg.message != WM_MOUSEMOVE && - Msg->Msg.message != WM_NCMOUSEMOVE ) && - IS_BTN_MESSAGE(Msg->Msg.message, DOWN) && - co_IntActivateWindowMouse(ThreadQueue, &Msg->Msg, MsgWindow, &HitTest) ) - { - UserDerefObjectCo(MsgWindow); - /* eat the message, search again */ - goto CheckMessages; - } - } - - UserDerefObjectCo(MsgWindow); - } - else - { - co_IntSendHitTestMessages(ThreadQueue, &Msg->Msg); - } - -// if(MsgWindow) -// { -// UserDereferenceObject(MsgWindow); -// } - - goto MsgExit; - } - - if ( ( Msg->Msg.hwnd && - Msg->Msg.message >= WM_MOUSEFIRST && - Msg->Msg.message <= WM_MOUSELAST ) && - co_IntTranslateMouseMessage( ThreadQueue, - &Msg->Msg, - &HitTest, - FALSE) ) - /* FIXME - check message filter again, if the message doesn't match anymore, - search again */ - { - /* eat the message, search again */ - goto CheckMessages; - } - -MsgExit: - if ( ISITHOOKED(WH_MOUSE) && IS_MOUSE_MESSAGE(Msg->Msg.message)) - { - if(!ProcessMouseMessage(&Msg->Msg, HitTest, RemoveMsg)) - { - return FALSE; - } - } - - if ( ISITHOOKED(WH_KEYBOARD) && IS_KBD_MESSAGE(Msg->Msg.message)) - { - if(!ProcessKeyboardMessage(&Msg->Msg, RemoveMsg)) + if (ThreadQueue->QuitPosted) + { + /* According to the PSDK, WM_QUIT messages are always returned, regardless + of the filter specified */ + Msg->Msg.hwnd = NULL; + Msg->Msg.message = WM_QUIT; + Msg->Msg.wParam = ThreadQueue->QuitExitCode; + Msg->Msg.lParam = 0; + if (RemoveMessages) { - return FALSE; + ThreadQueue->QuitPosted = FALSE; } - } - // The WH_GETMESSAGE hook enables an application to monitor messages about to - // be returned by the GetMessage or PeekMessage function. - if (ISITHOOKED(WH_GETMESSAGE)) - { - //DPRINT1("Peek WH_GETMESSAGE -> %x\n",&Msg); - co_HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, RemoveMsg & PM_REMOVE, (LPARAM)&Msg->Msg); - } - return TRUE; - } - return Present; + return TRUE; + } + + /* Now check for normal messages. */ + if (co_MsqFindMessage( ThreadQueue, + FALSE, + RemoveMessages, + Window, + MsgFilterMin, + MsgFilterMax, + &Message )) + { + RtlCopyMemory(Msg, Message, sizeof(USER_MESSAGE)); + if (RemoveMessages) + { + MsqDestroyMessage(Message); + } + break; + } + + /* Check for hardware events. */ + if(co_MsqFindMessage( ThreadQueue, + TRUE, + RemoveMessages, + Window, + MsgFilterMin, + MsgFilterMax, + &Message )) + { + RtlCopyMemory(Msg, Message, sizeof(USER_MESSAGE)); + if (RemoveMessages) + { + MsqDestroyMessage(Message); + } + + if(!ProcessHardwareMessage(&Msg->Msg, RemoveMessages)) + continue; + + break; + } + + /* Check for sent messages again. */ + while (co_MsqDispatchOneSentMessage(ThreadQueue)) + ; + + /* Check for paint messages. */ + if( IntGetPaintMessage( Window, + MsgFilterMin, + MsgFilterMax, + pti, + &Msg->Msg, + RemoveMessages)) + { + break; + } + + if (PostTimerMessages(Window)) + { + continue; + } + + return FALSE; + } + while (TRUE); + + // The WH_GETMESSAGE hook enables an application to monitor messages about to + // be returned by the GetMessage or PeekMessage function. + + co_HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, RemoveMsg & PM_REMOVE, (LPARAM)&Msg->Msg); + return TRUE; } static NTSTATUS FASTCALL @@ -1086,7 +1048,7 @@ CopyMsgToUserMem(MSG *UserModeMsg, MSG *KernelModeMsg) } static BOOL FASTCALL -co_IntWaitMessage( PWINDOW_OBJECT Window, +co_IntWaitMessage( PWND Window, UINT MsgFilterMin, UINT MsgFilterMax ) { @@ -1135,7 +1097,7 @@ co_IntGetPeekMessage( PMSG pMsg, BOOL bGMSG ) { BOOL Present; - PWINDOW_OBJECT Window; + PWND Window; USER_MESSAGE Msg; if ( hWnd == HWND_TOPMOST || @@ -1155,7 +1117,7 @@ co_IntGetPeekMessage( PMSG pMsg, } else { - Window = (PWINDOW_OBJECT)hWnd; + Window = (PWND)hWnd; } if (MsgFilterMax < MsgFilterMin) @@ -1279,7 +1241,7 @@ UserPostMessage( HWND Wnd, if (Wnd == HWND_BROADCAST) { HWND *List; - PWINDOW_OBJECT DesktopWindow; + PWND DesktopWindow; ULONG i; DesktopWindow = UserGetWindowObject(IntGetDesktopWindow()); @@ -1294,22 +1256,22 @@ UserPostMessage( HWND Wnd, } else { - PWINDOW_OBJECT Window; + PWND Window; Window = UserGetWindowObject(Wnd); - if ( !Window || !Window->Wnd ) + if ( !Window ) { return FALSE; } - pti = Window->Wnd->head.pti; + pti = Window->head.pti; if ( pti->TIF_flags & TIF_INCLEANUP ) { DPRINT1("Attempted to post message to window 0x%x when the thread is in cleanup!\n", Wnd); return FALSE; } - if ( Window->state & WINDOWSTATUS_DESTROYING ) + if ( Window->state & WNDS_DESTROYED ) { DPRINT1("Attempted to post message to window 0x%x that is being destroyed!\n", Wnd); /* FIXME - last error code? */ @@ -1318,7 +1280,7 @@ UserPostMessage( HWND Wnd, if (WM_QUIT == Msg) { - MsqPostQuitMessage(Window->pti->MessageQueue, wParam); + MsqPostQuitMessage(Window->head.pti->MessageQueue, wParam); } else { @@ -1329,7 +1291,7 @@ UserPostMessage( HWND Wnd, Message.pt = gpsi->ptCursor; KeQueryTickCount(&LargeTickCount); pti->timeLast = Message.time = MsqCalculateMessageTime(&LargeTickCount); - MsqPostMessage(Window->pti->MessageQueue, &Message, FALSE, QS_POSTMESSAGE); + MsqPostMessage(Window->head.pti->MessageQueue, &Message, FALSE, QS_POSTMESSAGE); } } return TRUE; @@ -1362,7 +1324,7 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, { ULONG_PTR Result; NTSTATUS Status; - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; PMSGMEMORY MsgMemoryEntry; INT lParamBufferSize; LPARAM lParamPacked; @@ -1382,7 +1344,7 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, IntCallWndProc( Window, hWnd, Msg, wParam, lParam); if ( NULL != Win32Thread && - Window->pti->MessageQueue == Win32Thread->MessageQueue) + Window->head.pti->MessageQueue == Win32Thread->MessageQueue) { if (Win32Thread->TIF_flags & TIF_INCLEANUP) { @@ -1407,8 +1369,8 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, RETURN( FALSE); } - Result = (ULONG_PTR)co_IntCallWindowProc( Window->Wnd->lpfnWndProc, - !Window->Wnd->Unicode, + Result = (ULONG_PTR)co_IntCallWindowProc( Window->lpfnWndProc, + !Window->Unicode, hWnd, Msg, wParam, @@ -1430,13 +1392,13 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, RETURN( TRUE); } - if (uFlags & SMTO_ABORTIFHUNG && MsqIsHung(Window->pti->MessageQueue)) + if (uFlags & SMTO_ABORTIFHUNG && MsqIsHung(Window->head.pti->MessageQueue)) { /* FIXME - Set a LastError? */ RETURN( FALSE); } - if (Window->state & WINDOWSTATUS_DESTROYING) + if (Window->state & WNDS_DESTROYED) { /* FIXME - last error? */ DPRINT1("Attempted to send message to window 0x%x that is being destroyed!\n", hWnd); @@ -1445,7 +1407,7 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, do { - Status = co_MsqSendMessage( Window->pti->MessageQueue, + Status = co_MsqSendMessage( Window->head.pti->MessageQueue, hWnd, Msg, wParam, @@ -1457,7 +1419,7 @@ co_IntSendMessageTimeoutSingle( HWND hWnd, } while ((STATUS_TIMEOUT == Status) && (uFlags & SMTO_NOTIMEOUTIFNOTHUNG) && - !MsqIsHung(Window->pti->MessageQueue)); + !MsqIsHung(Window->head.pti->MessageQueue)); IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); @@ -1496,7 +1458,7 @@ co_IntSendMessageTimeout( HWND hWnd, UINT uTimeout, ULONG_PTR *uResult ) { - PWINDOW_OBJECT DesktopWindow; + PWND DesktopWindow; HWND *Children; HWND *Child; @@ -1554,7 +1516,7 @@ co_IntSendMessageWithCallBack( HWND hWnd, ULONG_PTR *uResult) { ULONG_PTR Result; - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; PMSGMEMORY MsgMemoryEntry; INT lParamBufferSize; LPARAM lParamPacked; @@ -1570,7 +1532,7 @@ co_IntSendMessageWithCallBack( HWND hWnd, UserRefObjectCo(Window, &Ref); - if (Window->state & WINDOWSTATUS_DESTROYING) + if (Window->state & WNDS_DESTROYED) { /* FIXME - last error? */ DPRINT1("Attempted to send message to window 0x%x that is being destroyed!\n", hWnd); @@ -1604,18 +1566,18 @@ co_IntSendMessageWithCallBack( HWND hWnd, lParamBufferSize = MsgMemorySize(MsgMemoryEntry, wParam, lParam); } - if (! NT_SUCCESS(PackParam(&lParamPacked, Msg, wParam, lParam, Window->pti->MessageQueue != Win32Thread->MessageQueue))) + if (! NT_SUCCESS(PackParam(&lParamPacked, Msg, wParam, lParam, Window->head.pti->MessageQueue != Win32Thread->MessageQueue))) { DPRINT1("Failed to pack message parameters\n"); RETURN( FALSE); } /* If this is not a callback and it can be sent now, then send it. */ - if ((Window->pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) + if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) { - Result = (ULONG_PTR)co_IntCallWindowProc( Window->Wnd->lpfnWndProc, - !Window->Wnd->Unicode, + Result = (ULONG_PTR)co_IntCallWindowProc( Window->lpfnWndProc, + !Window->Unicode, hWnd, Msg, wParam, @@ -1629,7 +1591,7 @@ co_IntSendMessageWithCallBack( HWND hWnd, IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); - if ((Window->pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) + if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) { if (! NT_SUCCESS(UnpackParam(lParamPacked, Msg, wParam, lParam, FALSE))) { @@ -1652,14 +1614,14 @@ co_IntSendMessageWithCallBack( HWND hWnd, Message->Result = 0; Message->SenderQueue = NULL; //Win32Thread->MessageQueue; - IntReferenceMessageQueue(Window->pti->MessageQueue); + IntReferenceMessageQueue(Window->head.pti->MessageQueue); Message->CompletionCallback = CompletionCallback; Message->CompletionCallbackContext = CompletionCallbackContext; Message->HookMessage = MSQ_NORMAL | MSQ_SENTNOWAIT; Message->HasPackedLParam = (lParamBufferSize > 0); - InsertTailList(&Window->pti->MessageQueue->SentMessagesListHead, &Message->ListEntry); - IntDereferenceMessageQueue(Window->pti->MessageQueue); + InsertTailList(&Window->head.pti->MessageQueue->SentMessagesListHead, &Message->ListEntry); + IntDereferenceMessageQueue(Window->head.pti->MessageQueue); RETURN(TRUE); @@ -1679,7 +1641,7 @@ co_IntPostOrSendMessage( HWND hWnd, { ULONG_PTR Result; PTHREADINFO pti; - PWINDOW_OBJECT Window; + PWND Window; if ( hWnd == HWND_BROADCAST ) { @@ -1693,7 +1655,7 @@ co_IntPostOrSendMessage( HWND hWnd, pti = PsGetCurrentThreadWin32Thread(); - if ( Window->pti->MessageQueue != pti->MessageQueue && + if ( Window->head.pti->MessageQueue != pti->MessageQueue && FindMsgMemory(Msg) == 0 ) { Result = UserPostMessage(hWnd, Msg, wParam, lParam); @@ -1720,7 +1682,7 @@ co_IntDoSendMessage( HWND hWnd, PTHREADINFO pti; LRESULT Result = TRUE; NTSTATUS Status; - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; NTUSERSENDMESSAGEINFO Info; MSG UserModeMsg; MSG KernelModeMsg; @@ -1732,7 +1694,7 @@ co_IntDoSendMessage( HWND hWnd, if (HWND_BROADCAST != hWnd) { Window = UserGetWindowObject(hWnd); - if ( !Window || !Window->Wnd ) + if ( !Window ) { /* Tell usermode to not touch this one */ Info.HandledByKernel = TRUE; @@ -1742,7 +1704,7 @@ co_IntDoSendMessage( HWND hWnd, } /* Check for an exiting window. */ - if (Window && Window->state & WINDOWSTATUS_DESTROYING) + if (Window && Window->state & WNDS_DESTROYED) { DPRINT1("co_IntDoSendMessage Window Exiting!\n"); } @@ -1753,7 +1715,7 @@ co_IntDoSendMessage( HWND hWnd, // This is checked in user mode!!!!!!! if ( HWND_BROADCAST != hWnd && NULL != pti && - Window->pti->MessageQueue == pti->MessageQueue && + Window->head.pti->MessageQueue == pti->MessageQueue && !ISITHOOKED(WH_CALLWNDPROC) && !ISITHOOKED(WH_CALLWNDPROCRET) && ( Msg < WM_DDE_FIRST || Msg > WM_DDE_LAST ) ) @@ -1765,11 +1727,11 @@ co_IntDoSendMessage( HWND hWnd, sizeof(BOOL)); if (! NT_SUCCESS(Status)) { - Info.Ansi = ! Window->Wnd->Unicode; + Info.Ansi = ! Window->Unicode; } - Info.Ansi = !Window->Wnd->Unicode; - Info.Proc = Window->Wnd->lpfnWndProc; + Info.Ansi = !Window->Unicode; + Info.Proc = Window->lpfnWndProc; } else { @@ -1848,7 +1810,7 @@ UserSendNotifyMessage( HWND hWnd, if (hWnd == HWND_BROADCAST) //Handle Broadcast { HWND *List; - PWINDOW_OBJECT DesktopWindow; + PWND DesktopWindow; ULONG i; DesktopWindow = UserGetWindowObject(IntGetDesktopWindow()); @@ -1867,13 +1829,13 @@ UserSendNotifyMessage( HWND hWnd, { ULONG_PTR PResult; PTHREADINFO pti; - PWINDOW_OBJECT Window; + PWND Window; if ( !(Window = UserGetWindowObject(hWnd)) ) return FALSE; pti = PsGetCurrentThreadWin32Thread(); - if (Window->pti->MessageQueue != pti->MessageQueue) + if (Window->head.pti->MessageQueue != pti->MessageQueue) { // Send message w/o waiting for it. Result = UserPostMessage(hWnd, Msg, wParam, lParam); } @@ -2094,7 +2056,7 @@ NtUserGetMessage( PNTUSERGETMESSAGEINFO UnsafeInfo, NTUSERGETMESSAGEINFO Info; NTSTATUS Status; /* FIXME: if initialization is removed, gcc complains that this may be used before initialization. Please review */ - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; PMSGMEMORY MsgMemoryEntry; PVOID UserMem; UINT Size; @@ -2159,10 +2121,6 @@ NtUserGetMessage( PNTUSERGETMESSAGEINFO UnsafeInfo, } Info.Msg.lParam = (LPARAM) UserMem; } - if (Msg.FreeLParam && 0 != Msg.Msg.lParam) - { - ExFreePool((void *) Msg.Msg.lParam); - } Status = MmCopyToCaller(UnsafeInfo, &Info, sizeof(NTUSERGETMESSAGEINFO)); if (! NT_SUCCESS(Status)) { @@ -2245,7 +2203,7 @@ NtUserPeekMessage(PNTUSERGETMESSAGEINFO UnsafeInfo, NTSTATUS Status; BOOL Present; NTUSERGETMESSAGEINFO Info; - PWINDOW_OBJECT Window; + PWND Window; PMSGMEMORY MsgMemoryEntry; PVOID UserMem; UINT Size; @@ -2268,7 +2226,7 @@ NtUserPeekMessage(PNTUSERGETMESSAGEINFO UnsafeInfo, } else { - Window = (PWINDOW_OBJECT)hWnd; + Window = (PWND)hWnd; } if (MsgFilterMax < MsgFilterMin) @@ -2315,10 +2273,6 @@ NtUserPeekMessage(PNTUSERGETMESSAGEINFO UnsafeInfo, } Info.Msg.lParam = (LPARAM) UserMem; } - if (RemoveMsg && Msg.FreeLParam && 0 != Msg.Msg.lParam) - { - ExFreePool((void *) Msg.Msg.lParam); - } Status = MmCopyToCaller(UnsafeInfo, &Info, sizeof(NTUSERGETMESSAGEINFO)); if (! NT_SUCCESS(Status)) { @@ -2417,17 +2371,13 @@ NtUserCallMsgFilter( if (BadChk) RETURN( FALSE); - if ( ISITHOOKED(WH_SYSMSGFILTER) && - co_HOOK_CallHooks( WH_SYSMSGFILTER, code, 0, (LPARAM)&Msg)) + if ( co_HOOK_CallHooks( WH_SYSMSGFILTER, code, 0, (LPARAM)&Msg)) { Ret = TRUE; } else { - if ( ISITHOOKED(WH_MSGFILTER) ) - { - Ret = co_HOOK_CallHooks( WH_MSGFILTER, code, 0, (LPARAM)&Msg); - } + Ret = co_HOOK_CallHooks( WH_MSGFILTER, code, 0, (LPARAM)&Msg); } _SEH2_TRY @@ -2519,7 +2469,7 @@ NtUserMessageCall( LRESULT lResult = 0; BOOL Ret = FALSE; BOOL BadChk = FALSE; - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; USER_REFERENCE_ENTRY Ref; UserEnterExclusive(); @@ -2618,12 +2568,13 @@ NtUserMessageCall( case FNID_SENDMESSAGECALLBACK: { PCALL_BACK_INFO CallBackInfo = (PCALL_BACK_INFO)ResultInfo; + ULONG_PTR uResult; if (!CallBackInfo) break; if (!co_IntSendMessageWithCallBack(hWnd, Msg, wParam, lParam, - CallBackInfo->CallBack, CallBackInfo->Context, NULL)) + CallBackInfo->CallBack, CallBackInfo->Context, &uResult)) { DPRINT1("Callback failure!\n"); } diff --git a/subsystems/win32/win32k/ntuser/monitor.c b/subsystems/win32/win32k/ntuser/monitor.c index dd20d9d16b3..2f587bfd492 100644 --- a/subsystems/win32/win32k/ntuser/monitor.c +++ b/subsystems/win32/win32k/ntuser/monitor.c @@ -885,7 +885,7 @@ NtUserMonitorFromWindow( IN HWND hWnd, IN DWORD dwFlags) { - PWINDOW_OBJECT Window; + PWND Window; HMONITOR hMonitor = NULL; RECTL Rect; DECLARE_RETURN(HMONITOR); @@ -903,11 +903,8 @@ NtUserMonitorFromWindow( RETURN(hMonitor); } - if (!Window->Wnd) - RETURN(hMonitor); - - Rect.left = Rect.right = Window->Wnd->rcWindow.left; - Rect.top = Rect.bottom = Window->Wnd->rcWindow.bottom; + Rect.left = Rect.right = Window->rcWindow.left; + Rect.top = Rect.bottom = Window->rcWindow.bottom; IntGetMonitorsFromRect(&Rect, &hMonitor, NULL, 1, dwFlags); diff --git a/subsystems/win32/win32k/ntuser/msgqueue.c b/subsystems/win32/win32k/ntuser/msgqueue.c index b7cba1d7dd0..5d0bee88eba 100644 --- a/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/subsystems/win32/win32k/ntuser/msgqueue.c @@ -69,16 +69,16 @@ static VOID FASTCALL IdlePing(VOID) { HWND hWnd; - PWINDOW_OBJECT Window; + PWND Window; PPROCESSINFO W32d = PsGetCurrentProcessWin32Process(); hWnd = UserGetForegroundWindow(); Window = UserGetWindowObject(hWnd); - if (Window && Window->pti) + if (Window && Window->head.pti) { - if (Window->pti->fsHooks & HOOKID_TO_FLAG(WH_FOREGROUNDIDLE)) + if (Window->head.pti->fsHooks & HOOKID_TO_FLAG(WH_FOREGROUNDIDLE)) { co_HOOK_CallHooks(WH_FOREGROUNDIDLE,HC_ACTION,0,0); } @@ -342,12 +342,12 @@ MsqIsDblClk(LPMSG Msg, BOOL Remove) } static BOOL APIENTRY -co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Window, UINT FilterLow, UINT FilterHigh, +co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWND Window, UINT FilterLow, UINT FilterHigh, PUSER_MESSAGE Message, BOOL Remove, PBOOL Freed, - PWINDOW_OBJECT ScopeWin, PPOINT ScreenPoint, BOOL FromGlobalQueue, PLIST_ENTRY *Next) + PWND ScopeWin, PPOINT ScreenPoint, BOOL FromGlobalQueue, PLIST_ENTRY *Next) { USHORT Msg = Message->Msg.message; - PWINDOW_OBJECT CaptureWindow = NULL; + PWND CaptureWindow = NULL; HWND hCaptureWin; /* FIXME: Mouse message can be sent before the Desktop is up and running in which case ScopeWin (Desktop) is 0. @@ -411,7 +411,7 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Win return(FALSE); } - if (CaptureWindow->pti->MessageQueue != MessageQueue) + if (CaptureWindow->head.pti->MessageQueue != MessageQueue) { if (! FromGlobalQueue) { @@ -434,34 +434,34 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Win /* lock the destination message queue, so we don't get in trouble with other threads, messing with it at the same time */ - IntLockHardwareMessageQueue(CaptureWindow->pti->MessageQueue); - InsertTailList(&CaptureWindow->pti->MessageQueue->HardwareMessagesListHead, + IntLockHardwareMessageQueue(CaptureWindow->head.pti->MessageQueue); + InsertTailList(&CaptureWindow->head.pti->MessageQueue->HardwareMessagesListHead, &Message->ListEntry); if(Message->Msg.message == WM_MOUSEMOVE) { - if(CaptureWindow->pti->MessageQueue->MouseMoveMsg) + if(CaptureWindow->head.pti->MessageQueue->MouseMoveMsg) { /* remove the old WM_MOUSEMOVE message, we're processing a more recent one */ - RemoveEntryList(&CaptureWindow->pti->MessageQueue->MouseMoveMsg->ListEntry); - ExFreePool(CaptureWindow->pti->MessageQueue->MouseMoveMsg); + RemoveEntryList(&CaptureWindow->head.pti->MessageQueue->MouseMoveMsg->ListEntry); + ExFreePool(CaptureWindow->head.pti->MessageQueue->MouseMoveMsg); } /* save the pointer to the WM_MOUSEMOVE message in the new queue */ - CaptureWindow->pti->MessageQueue->MouseMoveMsg = Message; + CaptureWindow->head.pti->MessageQueue->MouseMoveMsg = Message; - CaptureWindow->pti->MessageQueue->QueueBits |= QS_MOUSEMOVE; - CaptureWindow->pti->MessageQueue->ChangedBits |= QS_MOUSEMOVE; - if (CaptureWindow->pti->MessageQueue->WakeMask & QS_MOUSEMOVE) - KeSetEvent(CaptureWindow->pti->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); + CaptureWindow->head.pti->MessageQueue->QueueBits |= QS_MOUSEMOVE; + CaptureWindow->head.pti->MessageQueue->ChangedBits |= QS_MOUSEMOVE; + if (CaptureWindow->head.pti->MessageQueue->WakeMask & QS_MOUSEMOVE) + KeSetEvent(CaptureWindow->head.pti->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); } else { - CaptureWindow->pti->MessageQueue->QueueBits |= QS_MOUSEBUTTON; - CaptureWindow->pti->MessageQueue->ChangedBits |= QS_MOUSEBUTTON; - if (CaptureWindow->pti->MessageQueue->WakeMask & QS_MOUSEBUTTON) - KeSetEvent(CaptureWindow->pti->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); + CaptureWindow->head.pti->MessageQueue->QueueBits |= QS_MOUSEBUTTON; + CaptureWindow->head.pti->MessageQueue->ChangedBits |= QS_MOUSEBUTTON; + if (CaptureWindow->head.pti->MessageQueue->WakeMask & QS_MOUSEBUTTON) + KeSetEvent(CaptureWindow->head.pti->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); } - IntUnLockHardwareMessageQueue(CaptureWindow->pti->MessageQueue); + IntUnLockHardwareMessageQueue(CaptureWindow->head.pti->MessageQueue); *Freed = FALSE; UserDereferenceObject(CaptureWindow); @@ -472,7 +472,7 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Win *ScreenPoint = Message->Msg.pt; - if((Window != NULL && PtrToInt(Window) != 1 && CaptureWindow->hSelf != Window->hSelf) || + if((Window != NULL && PtrToInt(Window) != 1 && CaptureWindow->head.h != Window->head.h) || ((FilterLow != 0 || FilterHigh != 0) && (Msg < FilterLow || Msg > FilterHigh))) { /* Reject the message because it doesn't match the filter */ @@ -482,21 +482,21 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Win /* Lock the message queue so no other thread can mess with it. Our own message queue is not locked while fetching from the global queue, so we have to make sure nothing interferes! */ - IntLockHardwareMessageQueue(CaptureWindow->pti->MessageQueue); + IntLockHardwareMessageQueue(CaptureWindow->head.pti->MessageQueue); /* if we're from the global queue, we need to add our message to our private queue so we don't loose it! */ - InsertTailList(&CaptureWindow->pti->MessageQueue->HardwareMessagesListHead, + InsertTailList(&CaptureWindow->head.pti->MessageQueue->HardwareMessagesListHead, &Message->ListEntry); } if (Message->Msg.message == WM_MOUSEMOVE) { - if(CaptureWindow->pti->MessageQueue->MouseMoveMsg && - (CaptureWindow->pti->MessageQueue->MouseMoveMsg != Message)) + if(CaptureWindow->head.pti->MessageQueue->MouseMoveMsg && + (CaptureWindow->head.pti->MessageQueue->MouseMoveMsg != Message)) { /* delete the old message */ - RemoveEntryList(&CaptureWindow->pti->MessageQueue->MouseMoveMsg->ListEntry); - ExFreePool(CaptureWindow->pti->MessageQueue->MouseMoveMsg); + RemoveEntryList(&CaptureWindow->head.pti->MessageQueue->MouseMoveMsg->ListEntry); + ExFreePool(CaptureWindow->head.pti->MessageQueue->MouseMoveMsg); if (!FromGlobalQueue) { // We might have deleted the next one in our queue, so fix next @@ -505,11 +505,11 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Win } /* always save a pointer to this WM_MOUSEMOVE message here because we're sure that the message is in the private queue */ - CaptureWindow->pti->MessageQueue->MouseMoveMsg = Message; + CaptureWindow->head.pti->MessageQueue->MouseMoveMsg = Message; } if(FromGlobalQueue) { - IntUnLockHardwareMessageQueue(CaptureWindow->pti->MessageQueue); + IntUnLockHardwareMessageQueue(CaptureWindow->head.pti->MessageQueue); } UserDereferenceObject(CaptureWindow); @@ -518,7 +518,7 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Win } /* FIXME - only assign if removing? */ - Message->Msg.hwnd = CaptureWindow->hSelf; + Message->Msg.hwnd = CaptureWindow->head.h; Message->Msg.message = Msg; Message->Msg.lParam = MAKELONG(Message->Msg.pt.x, Message->Msg.pt.y); @@ -532,22 +532,22 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Win /* Lock the message queue so no other thread can mess with it. Our own message queue is not locked while fetching from the global queue, so we have to make sure nothing interferes! */ - IntLockHardwareMessageQueue(CaptureWindow->pti->MessageQueue); - if(CaptureWindow->pti->MessageQueue->MouseMoveMsg) + IntLockHardwareMessageQueue(CaptureWindow->head.pti->MessageQueue); + if(CaptureWindow->head.pti->MessageQueue->MouseMoveMsg) { /* delete the WM_(NC)MOUSEMOVE message in the private queue, we're dealing with one that's been sent later */ - RemoveEntryList(&CaptureWindow->pti->MessageQueue->MouseMoveMsg->ListEntry); - ExFreePool(CaptureWindow->pti->MessageQueue->MouseMoveMsg); + RemoveEntryList(&CaptureWindow->head.pti->MessageQueue->MouseMoveMsg->ListEntry); + ExFreePool(CaptureWindow->head.pti->MessageQueue->MouseMoveMsg); /* our message is not in the private queue so we can remove the pointer instead of setting it to the current message we're processing */ - CaptureWindow->pti->MessageQueue->MouseMoveMsg = NULL; + CaptureWindow->head.pti->MessageQueue->MouseMoveMsg = NULL; } - IntUnLockHardwareMessageQueue(CaptureWindow->pti->MessageQueue); + IntUnLockHardwareMessageQueue(CaptureWindow->head.pti->MessageQueue); } - else if (CaptureWindow->pti->MessageQueue->MouseMoveMsg == Message) + else if (CaptureWindow->head.pti->MessageQueue->MouseMoveMsg == Message) { - CaptureWindow->pti->MessageQueue->MouseMoveMsg = NULL; + CaptureWindow->head.pti->MessageQueue->MouseMoveMsg = NULL; } } @@ -557,7 +557,7 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Win } BOOL APIENTRY -co_MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Window, +co_MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWND Window, UINT FilterLow, UINT FilterHigh, BOOL Remove, PUSER_MESSAGE* Message) { @@ -565,7 +565,7 @@ co_MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Windo POINT ScreenPoint; BOOL Accept, Freed; PLIST_ENTRY CurrentEntry; - PWINDOW_OBJECT DesktopWindow = NULL; + PWND DesktopWindow = NULL; PVOID WaitObjects[2]; NTSTATUS WaitStatus; DECLARE_RETURN(BOOL); @@ -591,8 +591,8 @@ co_MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Windo if (DesktopWindow) { - UserRefObjectCo(DesktopWindow, &Ref);//can DesktopWindow be NULL? - Desk = DesktopWindow->pti->pDeskInfo; + UserRefObjectCo(DesktopWindow, &Ref); + Desk = DesktopWindow->head.pti->pDeskInfo; } /* Process messages in the message queue itself. */ @@ -628,6 +628,18 @@ co_MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Windo } } + else + { + if (Remove) + { + RemoveEntryList(&Current->ListEntry); + } + IntUnLockHardwareMessageQueue(MessageQueue); + IntUnLockSystemHardwareMessageQueueLock(FALSE); + *Message = Current; + + RETURN(TRUE); + } } IntUnLockHardwareMessageQueue(MessageQueue); @@ -650,7 +662,6 @@ co_MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Windo UserMsg = ExAllocateFromPagedLookasideList(&MessageLookasideList); /* What to do if out of memory? For now we just panic a bit in debug */ ASSERT(UserMsg); - UserMsg->FreeLParam = FALSE; UserMsg->Msg = Msg; InsertTailList(&HardwareMessageQueueHead, &UserMsg->ListEntry); @@ -808,7 +819,7 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) FocusMessageQueue->Desktop->pDeskInfo->LastInputWasKbd = TRUE; Msg.pt = gpsi->ptCursor; - MsqPostMessage(FocusMessageQueue, &Msg, FALSE, QS_KEY); + MsqPostMessage(FocusMessageQueue, &Msg, TRUE, QS_KEY); } else { @@ -822,7 +833,7 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) VOID FASTCALL MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) { - PWINDOW_OBJECT Window; + PWND Window; PTHREADINFO Win32Thread; MSG Mesg; LARGE_INTEGER LargeTickCount; @@ -856,7 +867,7 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) KeQueryTickCount(&LargeTickCount); Mesg.time = MsqCalculateMessageTime(&LargeTickCount); Mesg.pt = gpsi->ptCursor; - MsqPostMessage(Window->pti->MessageQueue, &Mesg, FALSE, QS_HOTKEY); + MsqPostMessage(Window->head.pti->MessageQueue, &Mesg, FALSE, QS_HOTKEY); UserDereferenceObject(Window); ObDereferenceObject (Thread); @@ -866,7 +877,7 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) } PUSER_MESSAGE FASTCALL -MsqCreateMessage(LPMSG Msg, BOOLEAN FreeLParam) +MsqCreateMessage(LPMSG Msg) { PUSER_MESSAGE Message; @@ -876,7 +887,6 @@ MsqCreateMessage(LPMSG Msg, BOOLEAN FreeLParam) return NULL; } - Message->FreeLParam = FreeLParam; RtlMoveMemory(&Message->Msg, Msg, sizeof(MSG)); return Message; @@ -1023,11 +1033,11 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) PUSER_MESSAGE PostedMessage; PUSER_MESSAGE_QUEUE MessageQueue; PLIST_ENTRY CurrentEntry, ListHead; - PWINDOW_OBJECT Window = pWindow; + PWND Window = pWindow; ASSERT(Window); - MessageQueue = Window->pti->MessageQueue; + MessageQueue = Window->head.pti->MessageQueue; ASSERT(MessageQueue); /* remove the posted messages for this window */ @@ -1037,7 +1047,7 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) { PostedMessage = CONTAINING_RECORD(CurrentEntry, USER_MESSAGE, ListEntry); - if (PostedMessage->Msg.hwnd == Window->hSelf) + if (PostedMessage->Msg.hwnd == Window->head.h) { RemoveEntryList(&PostedMessage->ListEntry); MsqDestroyMessage(PostedMessage); @@ -1056,7 +1066,7 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) { SentMessage = CONTAINING_RECORD(CurrentEntry, USER_SENT_MESSAGE, ListEntry); - if(SentMessage->Msg.hwnd == Window->hSelf) + if(SentMessage->Msg.hwnd == Window->head.h) { DPRINT("Notify the sender and remove a message from the queue that had not been dispatched\n"); @@ -1302,17 +1312,26 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue, } VOID FASTCALL -MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, MSG* Msg, BOOLEAN FreeLParam, +MsqPostMessage(PUSER_MESSAGE_QUEUE MessageQueue, MSG* Msg, BOOLEAN HardwareMessage, DWORD MessageBits) { PUSER_MESSAGE Message; - if(!(Message = MsqCreateMessage(Msg, FreeLParam))) + if(!(Message = MsqCreateMessage(Msg))) { return; } - InsertTailList(&MessageQueue->PostedMessagesListHead, - &Message->ListEntry); + + if(!HardwareMessage) + { + InsertTailList(&MessageQueue->PostedMessagesListHead, + &Message->ListEntry); + } + else + { + InsertTailList(&MessageQueue->HardwareMessagesListHead, + &Message->ListEntry); + } MessageQueue->QueueBits |= MessageBits; MessageQueue->ChangedBits |= MessageBits; if (MessageQueue->WakeMask & MessageBits) @@ -1334,7 +1353,7 @@ BOOLEAN APIENTRY co_MsqFindMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, IN BOOLEAN Hardware, IN BOOLEAN Remove, - IN PWINDOW_OBJECT Window, + IN PWND Window, IN UINT MsgFilterLow, IN UINT MsgFilterHigh, OUT PUSER_MESSAGE* Message) @@ -1361,7 +1380,7 @@ co_MsqFindMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, ListEntry); if ( ( !Window || PtrToInt(Window) == 1 || - Window->hSelf == CurrentMessage->Msg.hwnd ) && + Window->head.h == CurrentMessage->Msg.hwnd ) && ( (MsgFilterLow == 0 && MsgFilterHigh == 0) || ( MsgFilterLow <= CurrentMessage->Msg.message && MsgFilterHigh >= CurrentMessage->Msg.message ) ) ) @@ -1381,7 +1400,7 @@ co_MsqFindMessage(IN PUSER_MESSAGE_QUEUE MessageQueue, } NTSTATUS FASTCALL -co_MsqWaitForNewMessages(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT WndFilter, +co_MsqWaitForNewMessages(PUSER_MESSAGE_QUEUE MessageQueue, PWND WndFilter, UINT MsgFilterMin, UINT MsgFilterMax) { PVOID WaitObjects[2] = {MessageQueue->NewMessages, &HardwareMessageEvent}; diff --git a/subsystems/win32/win32k/ntuser/ntstubs.c b/subsystems/win32/win32k/ntuser/ntstubs.c index 2430a4df7ac..3219a953411 100644 --- a/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/subsystems/win32/win32k/ntuser/ntstubs.c @@ -866,17 +866,6 @@ NtUserNotifyProcessCreate( return 0; } -BOOL -APIENTRY -NtUserPrintWindow( - HWND hwnd, - HDC hdcBlt, - UINT nFlags) -{ - UNIMPLEMENTED; - return 0; -} - NTSTATUS APIENTRY NtUserProcessConnect( @@ -1136,20 +1125,11 @@ NtUserValidateTimerCallback( LPARAM lParam) { BOOL Ret = FALSE; - PWINDOW_OBJECT Window = NULL; UserEnterShared(); - if (hWnd) - { - Window = UserGetWindowObject(hWnd); - if (!Window || !Window->Wnd) - goto Exit; - } + Ret = ValidateTimerCallback(PsGetCurrentThreadWin32Thread(), lParam); - Ret = ValidateTimerCallback(PsGetCurrentThreadWin32Thread(), Window, wParam, lParam); - -Exit: UserLeave(); return Ret; } diff --git a/subsystems/win32/win32k/ntuser/object.c b/subsystems/win32/win32k/ntuser/object.c index 9f9dd111ca6..0c3fb075d7e 100644 --- a/subsystems/win32/win32k/ntuser/object.c +++ b/subsystems/win32/win32k/ntuser/object.c @@ -328,7 +328,7 @@ UserCreateObject( PUSER_HANDLE_TABLE ht, switch (type) { -// case otWindow: + case otWindow: // case otMenu: // case otHook: // case otCallProc: @@ -418,7 +418,7 @@ UserDereferenceObject(PVOID object) switch (type) { -// case otWindow: + case otWindow: // case otMenu: // case otHook: // case otCallProc: diff --git a/subsystems/win32/win32k/ntuser/painting.c b/subsystems/win32/win32k/ntuser/painting.c index d847021ca4f..6eca443034a 100644 --- a/subsystems/win32/win32k/ntuser/painting.c +++ b/subsystems/win32/win32k/ntuser/painting.c @@ -36,15 +36,13 @@ */ BOOL FASTCALL -IntIntersectWithParents(PWINDOW_OBJECT Child, RECTL *WindowRect) +IntIntersectWithParents(PWND Child, RECTL *WindowRect) { - PWINDOW_OBJECT ParentWindow; PWND ParentWnd; - ParentWindow = Child->spwndParent; - while (ParentWindow != NULL) + ParentWnd = Child->spwndParent; + while (ParentWnd != NULL) { - ParentWnd = ParentWindow->Wnd; if (!(ParentWnd->style & WS_VISIBLE) || (ParentWnd->style & WS_MINIMIZE)) { @@ -58,35 +56,33 @@ IntIntersectWithParents(PWINDOW_OBJECT Child, RECTL *WindowRect) /* FIXME: Layered windows. */ - ParentWindow = ParentWindow->spwndParent; + ParentWnd = ParentWnd->spwndParent; } return TRUE; } BOOL FASTCALL -IntValidateParent(PWINDOW_OBJECT Child, HRGN hValidateRgn, BOOL Recurse) +IntValidateParent(PWND Child, HRGN hValidateRgn, BOOL Recurse) { - PWINDOW_OBJECT ParentWindow = Child->spwndParent; - PWND ParentWnd; + PWND ParentWnd = Child->spwndParent; - while (ParentWindow) + while (ParentWnd) { - ParentWnd = ParentWindow->Wnd; if (ParentWnd->style & WS_CLIPCHILDREN) break; - if (ParentWindow->hrgnUpdate != 0) + if (ParentWnd->hrgnUpdate != 0) { if (Recurse) return FALSE; - IntInvalidateWindows( ParentWindow, + IntInvalidateWindows( ParentWnd, hValidateRgn, RDW_VALIDATE | RDW_NOCHILDREN); } - ParentWindow = ParentWindow->spwndParent; + ParentWnd = ParentWnd->spwndParent; } return TRUE; @@ -99,23 +95,21 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN hValidateRgn, BOOL Recurse) */ HRGN FASTCALL -IntCalcWindowRgn(PWINDOW_OBJECT Window, BOOL Client) +IntCalcWindowRgn(PWND Wnd, BOOL Client) { - PWND Wnd; HRGN hRgnWindow; - Wnd = Window->Wnd; if (Client) hRgnWindow = IntSysCreateRectRgnIndirect(&Wnd->rcClient); else hRgnWindow = IntSysCreateRectRgnIndirect(&Wnd->rcWindow); - if (Window->hrgnClip != NULL && !(Wnd->style & WS_MINIMIZE)) + if (Wnd->hrgnClip != NULL && !(Wnd->style & WS_MINIMIZE)) { NtGdiOffsetRgn(hRgnWindow, -Wnd->rcWindow.left, -Wnd->rcWindow.top); - NtGdiCombineRgn(hRgnWindow, hRgnWindow, Window->hrgnClip, RGN_AND); + NtGdiCombineRgn(hRgnWindow, hRgnWindow, Wnd->hrgnClip, RGN_AND); NtGdiOffsetRgn(hRgnWindow, Wnd->rcWindow.left, Wnd->rcWindow.top); @@ -140,7 +134,7 @@ IntCalcWindowRgn(PWINDOW_OBJECT Window, BOOL Client) */ HRGN FASTCALL -IntGetNCUpdateRgn(PWINDOW_OBJECT Window, BOOL Validate) +IntGetNCUpdateRgn(PWND Window, BOOL Validate) { HRGN hRgnNonClient; HRGN hRgnWindow; @@ -195,8 +189,8 @@ IntGetNCUpdateRgn(PWINDOW_OBJECT Window, BOOL Validate) IntGdiSetRegionOwner(Window->hrgnUpdate, GDI_OBJ_HMGR_POWNED); REGION_FreeRgnByHandle(Window->hrgnUpdate); Window->hrgnUpdate = NULL; - if (!(Window->Wnd->state & WNDS_INTERNALPAINT)) - MsqDecPaintCountQueue(Window->pti->MessageQueue); + if (!(Window->state & WNDS_INTERNALPAINT)) + MsqDecPaintCountQueue(Window->head.pti->MessageQueue); } } @@ -217,26 +211,23 @@ IntGetNCUpdateRgn(PWINDOW_OBJECT Window, BOOL Validate) */ VOID FASTCALL -co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse) +co_IntPaintWindows(PWND Wnd, ULONG Flags, BOOL Recurse) { HDC hDC; - HWND hWnd = Window->hSelf; + HWND hWnd = Wnd->head.h; HRGN TempRegion; - PWND Wnd; - - Wnd = Window->Wnd; if (Flags & (RDW_ERASENOW | RDW_UPDATENOW)) { - if (Window->hrgnUpdate) + if (Wnd->hrgnUpdate) { - if (!IntValidateParent(Window, Window->hrgnUpdate, Recurse)) + if (!IntValidateParent(Wnd, Wnd->hrgnUpdate, Recurse)) return; } if (Flags & RDW_UPDATENOW) { - if (Window->hrgnUpdate != NULL || + if (Wnd->hrgnUpdate != NULL || Wnd->state & WNDS_INTERNALPAINT) { co_IntSendMessage(hWnd, WM_PAINT, 0, 0); @@ -244,11 +235,11 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse) } else { - if (Window->state & WINDOWOBJECT_NEED_NCPAINT) + if (Wnd->state & WNDS_SENDNCPAINT) { - TempRegion = IntGetNCUpdateRgn(Window, TRUE); - Window->state &= ~WINDOWOBJECT_NEED_NCPAINT; - MsqDecPaintCountQueue(Window->pti->MessageQueue); + TempRegion = IntGetNCUpdateRgn(Wnd, TRUE); + Wnd->state &= ~WNDS_SENDNCPAINT; + MsqDecPaintCountQueue(Wnd->head.pti->MessageQueue); co_IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)TempRegion, 0); if ( (HANDLE) 1 != TempRegion && @@ -259,19 +250,19 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse) } } - if (Window->state & WINDOWOBJECT_NEED_ERASEBKGND) + if (Wnd->state & WNDS_ERASEBACKGROUND) { - if (Window->hrgnUpdate) + if (Wnd->hrgnUpdate) { - hDC = UserGetDCEx( Window, - Window->hrgnUpdate, + hDC = UserGetDCEx( Wnd, + Wnd->hrgnUpdate, DCX_CACHE|DCX_USESTYLE|DCX_INTERSECTRGN|DCX_KEEPCLIPRGN); if (co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hDC, 0)) { - Window->state &= ~WINDOWOBJECT_NEED_ERASEBKGND; + Wnd->state &= ~WNDS_ERASEBACKGROUND; } - UserReleaseDC(Window, hDC, FALSE); + UserReleaseDC(Wnd, hDC, FALSE); } } } @@ -294,19 +285,18 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse) { HWND *List, *phWnd; - if ((List = IntWinListChildren(Window))) + if ((List = IntWinListChildren(Wnd))) { /* FIXME: Handle WS_EX_TRANSPARENT */ for (phWnd = List; *phWnd; ++phWnd) { - Window = UserGetWindowObject(*phWnd); - Wnd = Window->Wnd; - if (Window && (Wnd->style & WS_VISIBLE)) + Wnd = UserGetWindowObject(*phWnd); + if (Wnd && (Wnd->style & WS_VISIBLE)) { USER_REFERENCE_ENTRY Ref; - UserRefObjectCo(Window, &Ref); - co_IntPaintWindows(Window, Flags, TRUE); - UserDerefObjectCo(Window); + UserRefObjectCo(Wnd, &Ref); + co_IntPaintWindows(Wnd, Flags, TRUE); + UserDerefObjectCo(Wnd); } } ExFreePool(List); @@ -321,14 +311,12 @@ co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse) */ VOID FASTCALL -IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) +IntInvalidateWindows(PWND Wnd, HRGN hRgn, ULONG Flags) { INT RgnType; - PWND Wnd; BOOL HadPaintMessage, HadNCPaintMessage; BOOL HasPaintMessage, HasNCPaintMessage; - Wnd = Window->Wnd; DPRINT("IntInvalidateWindows start\n"); /* * If the nonclient is not to be redrawn, clip the region to the client @@ -338,7 +326,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) { HRGN hRgnClient; - hRgnClient = IntSysCreateRectRgnIndirect(&Window->Wnd->rcClient); + hRgnClient = IntSysCreateRectRgnIndirect(&Wnd->rcClient); RgnType = NtGdiCombineRgn(hRgn, hRgn, hRgnClient, RGN_AND); REGION_FreeRgnByHandle(hRgnClient); } @@ -347,11 +335,11 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) * Clip the given region with window rectangle (or region) */ - if (!Window->hrgnClip || (Wnd->style & WS_MINIMIZE)) + if (!Wnd->hrgnClip || (Wnd->style & WS_MINIMIZE)) { HRGN hRgnWindow; - hRgnWindow = IntSysCreateRectRgnIndirect(&Window->Wnd->rcWindow); + hRgnWindow = IntSysCreateRectRgnIndirect(&Wnd->rcWindow); RgnType = NtGdiCombineRgn(hRgn, hRgn, hRgnWindow, RGN_AND); REGION_FreeRgnByHandle(hRgnWindow); } @@ -360,7 +348,7 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) NtGdiOffsetRgn( hRgn, -Wnd->rcWindow.left, -Wnd->rcWindow.top); - RgnType = NtGdiCombineRgn(hRgn, hRgn, Window->hrgnClip, RGN_AND); + RgnType = NtGdiCombineRgn(hRgn, hRgn, Wnd->hrgnClip, RGN_AND); NtGdiOffsetRgn( hRgn, Wnd->rcWindow.left, Wnd->rcWindow.top); @@ -370,9 +358,9 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) * Save current state of pending updates */ - HadPaintMessage = Window->hrgnUpdate != NULL || + HadPaintMessage = Wnd->hrgnUpdate != NULL || Wnd->state & WNDS_INTERNALPAINT; - HadNCPaintMessage = Window->state & WINDOWOBJECT_NEED_NCPAINT; + HadNCPaintMessage = Wnd->state & WNDS_SENDNCPAINT; /* * Update the region and flags @@ -380,47 +368,47 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) if (Flags & RDW_INVALIDATE && RgnType != NULLREGION) { - if (Window->hrgnUpdate == NULL) + if (Wnd->hrgnUpdate == NULL) { - Window->hrgnUpdate = IntSysCreateRectRgn(0, 0, 0, 0); - IntGdiSetRegionOwner(Window->hrgnUpdate, GDI_OBJ_HMGR_PUBLIC); + Wnd->hrgnUpdate = IntSysCreateRectRgn(0, 0, 0, 0); + IntGdiSetRegionOwner(Wnd->hrgnUpdate, GDI_OBJ_HMGR_PUBLIC); } - if (NtGdiCombineRgn(Window->hrgnUpdate, Window->hrgnUpdate, + if (NtGdiCombineRgn(Wnd->hrgnUpdate, Wnd->hrgnUpdate, hRgn, RGN_OR) == NULLREGION) { - IntGdiSetRegionOwner(Window->hrgnUpdate, GDI_OBJ_HMGR_POWNED); - REGION_FreeRgnByHandle(Window->hrgnUpdate); - Window->hrgnUpdate = NULL; + IntGdiSetRegionOwner(Wnd->hrgnUpdate, GDI_OBJ_HMGR_POWNED); + REGION_FreeRgnByHandle(Wnd->hrgnUpdate); + Wnd->hrgnUpdate = NULL; } if (Flags & RDW_FRAME) - Window->state |= WINDOWOBJECT_NEED_NCPAINT; + Wnd->state |= WNDS_SENDNCPAINT; if (Flags & RDW_ERASE) - Window->state |= WINDOWOBJECT_NEED_ERASEBKGND; + Wnd->state |= WNDS_ERASEBACKGROUND; Flags |= RDW_FRAME; } if (Flags & RDW_VALIDATE && RgnType != NULLREGION) { - if (Window->hrgnUpdate != NULL) + if (Wnd->hrgnUpdate != NULL) { - if (NtGdiCombineRgn(Window->hrgnUpdate, Window->hrgnUpdate, + if (NtGdiCombineRgn(Wnd->hrgnUpdate, Wnd->hrgnUpdate, hRgn, RGN_DIFF) == NULLREGION) { - IntGdiSetRegionOwner(Window->hrgnUpdate, GDI_OBJ_HMGR_POWNED); - REGION_FreeRgnByHandle(Window->hrgnUpdate); - Window->hrgnUpdate = NULL; + IntGdiSetRegionOwner(Wnd->hrgnUpdate, GDI_OBJ_HMGR_POWNED); + REGION_FreeRgnByHandle(Wnd->hrgnUpdate); + Wnd->hrgnUpdate = NULL; } } - if (Window->hrgnUpdate == NULL) - Window->state &= ~WINDOWOBJECT_NEED_ERASEBKGND; + if (Wnd->hrgnUpdate == NULL) + Wnd->state &= ~WNDS_ERASEBACKGROUND; if (Flags & RDW_NOFRAME) - Window->state &= ~WINDOWOBJECT_NEED_NCPAINT; + Wnd->state &= ~WNDS_SENDNCPAINT; if (Flags & RDW_NOERASE) - Window->state &= ~WINDOWOBJECT_NEED_ERASEBKGND; + Wnd->state &= ~WNDS_ERASEBACKGROUND; } if (Flags & RDW_INTERNALPAINT) @@ -440,11 +428,11 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) if (!(Flags & RDW_NOCHILDREN) && !(Wnd->style & WS_MINIMIZE) && ((Flags & RDW_ALLCHILDREN) || !(Wnd->style & WS_CLIPCHILDREN))) { - PWINDOW_OBJECT Child; + PWND Child; - for (Child = Window->spwndChild; Child; Child = Child->spwndNext) + for (Child = Wnd->spwndChild; Child; Child = Child->spwndNext) { - if (Child->Wnd->style & WS_VISIBLE) + if (Child->style & WS_VISIBLE) { /* * Recursive call to update children hrgnUpdate @@ -462,24 +450,24 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) * Fake post paint messages to window message queue if needed */ - HasPaintMessage = Window->hrgnUpdate != NULL || + HasPaintMessage = Wnd->hrgnUpdate != NULL || Wnd->state & WNDS_INTERNALPAINT; - HasNCPaintMessage = Window->state & WINDOWOBJECT_NEED_NCPAINT; + HasNCPaintMessage = Wnd->state & WNDS_SENDNCPAINT; if (HasPaintMessage != HadPaintMessage) { if (HadPaintMessage) - MsqDecPaintCountQueue(Window->pti->MessageQueue); + MsqDecPaintCountQueue(Wnd->head.pti->MessageQueue); else - MsqIncPaintCountQueue(Window->pti->MessageQueue); + MsqIncPaintCountQueue(Wnd->head.pti->MessageQueue); } if (HasNCPaintMessage != HadNCPaintMessage) { if (HadNCPaintMessage) - MsqDecPaintCountQueue(Window->pti->MessageQueue); + MsqDecPaintCountQueue(Wnd->head.pti->MessageQueue); else - MsqIncPaintCountQueue(Window->pti->MessageQueue); + MsqIncPaintCountQueue(Wnd->head.pti->MessageQueue); } DPRINT("IntInvalidateWindows exit\n"); } @@ -493,19 +481,17 @@ IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags) */ BOOL FASTCALL -IntIsWindowDrawable(PWINDOW_OBJECT Window) +IntIsWindowDrawable(PWND Wnd) { - PWINDOW_OBJECT WndObject; - PWND Wnd; + PWND WndObject; - for (WndObject = Window; WndObject != NULL; WndObject = WndObject->spwndParent) + for (WndObject = Wnd; WndObject != NULL; WndObject = WndObject->spwndParent) { - Wnd = WndObject->Wnd; - if ( Window->state & WINDOWSTATUS_DESTROYING || // state2 - Window->state & WINDOWSTATUS_DESTROYED || - !Wnd || - !(Wnd->style & WS_VISIBLE) || - ((Wnd->style & WS_MINIMIZE) && (WndObject != Window))) + if ( WndObject->state2 & WNDS2_INDESTROY || + WndObject->state & WNDS_DESTROYED || + !WndObject || + !(WndObject->style & WS_VISIBLE) || + ((WndObject->style & WS_MINIMIZE) && (WndObject != Wnd))) { return FALSE; } @@ -517,13 +503,13 @@ IntIsWindowDrawable(PWINDOW_OBJECT Window) /* * IntRedrawWindow * - * Internal version of NtUserRedrawWindow that takes WINDOW_OBJECT as + * Internal version of NtUserRedrawWindow that takes WND as * first parameter. */ BOOL FASTCALL co_UserRedrawWindow( - PWINDOW_OBJECT Window, + PWND Window, const RECTL* UpdateRect, HRGN UpdateRgn, ULONG Flags) @@ -558,26 +544,26 @@ co_UserRedrawWindow( hRgn = NULL; } else - NtGdiOffsetRgn(hRgn, Window->Wnd->rcClient.left, Window->Wnd->rcClient.top); + NtGdiOffsetRgn(hRgn, Window->rcClient.left, Window->rcClient.top); } else if (UpdateRect != NULL) { if (!RECTL_bIsEmptyRect(UpdateRect)) { hRgn = IntSysCreateRectRgnIndirect((RECTL *)UpdateRect); - NtGdiOffsetRgn(hRgn, Window->Wnd->rcClient.left, Window->Wnd->rcClient.top); + NtGdiOffsetRgn(hRgn, Window->rcClient.left, Window->rcClient.top); } } else if ((Flags & (RDW_INVALIDATE | RDW_FRAME)) == (RDW_INVALIDATE | RDW_FRAME) || (Flags & (RDW_VALIDATE | RDW_NOFRAME)) == (RDW_VALIDATE | RDW_NOFRAME)) { - if (!RECTL_bIsEmptyRect(&Window->Wnd->rcWindow)) - hRgn = IntSysCreateRectRgnIndirect(&Window->Wnd->rcWindow); + if (!RECTL_bIsEmptyRect(&Window->rcWindow)) + hRgn = IntSysCreateRectRgnIndirect(&Window->rcWindow); } else { - if (!RECTL_bIsEmptyRect(&Window->Wnd->rcClient)) - hRgn = IntSysCreateRectRgnIndirect(&Window->Wnd->rcClient); + if (!RECTL_bIsEmptyRect(&Window->rcClient)) + hRgn = IntSysCreateRectRgnIndirect(&Window->rcClient); } } @@ -617,45 +603,41 @@ co_UserRedrawWindow( } BOOL FASTCALL -IntIsWindowDirty(PWINDOW_OBJECT Window) +IntIsWindowDirty(PWND Wnd) { - PWND Wnd = Window->Wnd; return (Wnd->style & WS_VISIBLE) && - ((Window->hrgnUpdate != NULL) || + ((Wnd->hrgnUpdate != NULL) || (Wnd->state & WNDS_INTERNALPAINT) || - (Window->state & WINDOWOBJECT_NEED_NCPAINT)); + (Wnd->state & WNDS_SENDNCPAINT)); } HWND FASTCALL -IntFindWindowToRepaint(PWINDOW_OBJECT Window, PTHREADINFO Thread) +IntFindWindowToRepaint(PWND Window, PTHREADINFO Thread) { HWND hChild; - PWINDOW_OBJECT TempWindow; - PWND Wnd, TempWnd; + PWND TempWindow; for (; Window != NULL; Window = Window->spwndNext) { - Wnd = Window->Wnd; if (IntWndBelongsToThread(Window, Thread) && IntIsWindowDirty(Window)) { /* Make sure all non-transparent siblings are already drawn. */ - if (Wnd->ExStyle & WS_EX_TRANSPARENT) + if (Window->ExStyle & WS_EX_TRANSPARENT) { for (TempWindow = Window->spwndNext; TempWindow != NULL; TempWindow = TempWindow->spwndNext) { - TempWnd = TempWindow->Wnd; - if (!(TempWnd->ExStyle & WS_EX_TRANSPARENT) && + if (!(TempWindow->ExStyle & WS_EX_TRANSPARENT) && IntWndBelongsToThread(TempWindow, Thread) && IntIsWindowDirty(TempWindow)) { - return TempWindow->hSelf; + return TempWindow->head.h; } } } - return Window->hSelf; + return Window->head.h; } if (Window->spwndChild) @@ -671,7 +653,7 @@ IntFindWindowToRepaint(PWINDOW_OBJECT Window, PTHREADINFO Thread) BOOL FASTCALL IntGetPaintMessage( - PWINDOW_OBJECT Window, + PWND Window, UINT MsgFilterMin, UINT MsgFilterMax, PTHREADINFO Thread, @@ -697,7 +679,7 @@ IntGetPaintMessage( return FALSE; } - if (Window != NULL && Message->hwnd != Window->hSelf) + if (Window != NULL && Message->hwnd != Window->head.h) return FALSE; Message->message = WM_PAINT; @@ -708,12 +690,12 @@ IntGetPaintMessage( static HWND FASTCALL -co_IntFixCaret(PWINDOW_OBJECT Window, RECTL *lprc, UINT flags) +co_IntFixCaret(PWND Window, RECTL *lprc, UINT flags) { PDESKTOP Desktop; PTHRDCARETINFO CaretInfo; HWND hWndCaret; - PWINDOW_OBJECT WndCaret; + PWND WndCaret; ASSERT_REFS_CO(Window); @@ -750,6 +732,58 @@ co_IntFixCaret(PWINDOW_OBJECT Window, RECTL *lprc, UINT flags) return 0; } +BOOL +FASTCALL +IntPrintWindow( + PWND pwnd, + HDC hdcBlt, + UINT nFlags) +{ + HDC hdcSrc; + INT cx, cy, xSrc, ySrc; + + if ( nFlags & PW_CLIENTONLY) + { + cx = pwnd->rcClient.right - pwnd->rcClient.left; + cy = pwnd->rcClient.bottom - pwnd->rcClient.top; + xSrc = pwnd->rcClient.left - pwnd->rcWindow.left; + ySrc = pwnd->rcClient.top - pwnd->rcWindow.top; + } + else + { + cx = pwnd->rcWindow.right - pwnd->rcWindow.left; + cy = pwnd->rcWindow.bottom - pwnd->rcWindow.top; + xSrc = 0; + ySrc = 0; + } + + // TODO: Setup Redirection for Print. + return FALSE; + + /* Update the window just incase. */ + co_IntPaintWindows( pwnd, RDW_ERASENOW|RDW_UPDATENOW, FALSE); + + hdcSrc = UserGetDCEx( pwnd, NULL, DCX_CACHE|DCX_WINDOW); + /* Print window to printer context. */ + NtGdiBitBlt( hdcBlt, + 0, + 0, + cx, + cy, + hdcSrc, + xSrc, + ySrc, + SRCCOPY, + 0, + 0); + + UserReleaseDC( pwnd, hdcSrc, FALSE); + + // TODO: Release Redirection from Print. + + return TRUE; +} + /* PUBLIC FUNCTIONS ***********************************************************/ /* @@ -762,12 +796,11 @@ co_IntFixCaret(PWINDOW_OBJECT Window, RECTL *lprc, UINT flags) HDC APIENTRY NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs) { - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; PAINTSTRUCT Ps; NTSTATUS Status; DECLARE_RETURN(HDC); USER_REFERENCE_ENTRY Ref; - PWND Wnd; DPRINT("Enter NtUserBeginPaint\n"); UserEnterExclusive(); @@ -779,17 +812,15 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs) UserRefObjectCo(Window, &Ref); - Wnd = Window->Wnd; - co_UserHideCaret(Window); - if (Window->state & WINDOWOBJECT_NEED_NCPAINT) + if (Window->state & WNDS_SENDNCPAINT) { HRGN hRgn; hRgn = IntGetNCUpdateRgn(Window, FALSE); - Window->state &= ~WINDOWOBJECT_NEED_NCPAINT; - MsqDecPaintCountQueue(Window->pti->MessageQueue); + Window->state &= ~WNDS_SENDNCPAINT; + MsqDecPaintCountQueue(Window->head.pti->MessageQueue); co_IntSendMessage(hWnd, WM_NCPAINT, (WPARAM)hRgn, 0); if (hRgn != (HANDLE)1 && hRgn != NULL) { @@ -810,7 +841,7 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs) if (Window->hrgnUpdate != NULL) { - MsqDecPaintCountQueue(Window->pti->MessageQueue); + MsqDecPaintCountQueue(Window->head.pti->MessageQueue); GdiGetClipBox(Ps.hdc, &Ps.rcPaint); IntGdiSetRegionOwner(Window->hrgnUpdate, GDI_OBJ_HMGR_POWNED); /* The region is part of the dc now and belongs to the process! */ @@ -818,17 +849,17 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs) } else { - if (Wnd->state & WNDS_INTERNALPAINT) - MsqDecPaintCountQueue(Window->pti->MessageQueue); + if (Window->state & WNDS_INTERNALPAINT) + MsqDecPaintCountQueue(Window->head.pti->MessageQueue); IntGetClientRect(Window, &Ps.rcPaint); } - Wnd->state &= ~WNDS_INTERNALPAINT; + Window->state &= ~WNDS_INTERNALPAINT; - if (Window->state & WINDOWOBJECT_NEED_ERASEBKGND) + if (Window->state & WNDS_ERASEBACKGROUND) { - Window->state &= ~WINDOWOBJECT_NEED_ERASEBKGND; + Window->state &= ~WNDS_ERASEBACKGROUND; Ps.fErase = !co_IntSendMessage(hWnd, WM_ERASEBKGND, (WPARAM)Ps.hdc, 0); } else @@ -837,9 +868,9 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* UnsafePs) } if (Window->hrgnUpdate) { - if (!(Wnd->style & WS_CLIPCHILDREN)) + if (!(Window->style & WS_CLIPCHILDREN)) { - PWINDOW_OBJECT Child; + PWND Child; for (Child = Window->spwndChild; Child; Child = Child->spwndNext) { IntInvalidateWindows(Child, Window->hrgnUpdate, RDW_FRAME | RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); @@ -876,7 +907,7 @@ BOOL APIENTRY NtUserEndPaint(HWND hWnd, CONST PAINTSTRUCT* pUnsafePs) { NTSTATUS Status = STATUS_SUCCESS; - PWINDOW_OBJECT Window; + PWND Window; DECLARE_RETURN(BOOL); USER_REFERENCE_ENTRY Ref; HDC hdc = NULL; @@ -920,7 +951,7 @@ CLEANUP: INT FASTCALL -co_UserGetUpdateRgn(PWINDOW_OBJECT Window, HRGN hRgn, BOOL bErase) +co_UserGetUpdateRgn(PWND Window, HRGN hRgn, BOOL bErase) { int RegionType; RECTL Rect; @@ -933,11 +964,11 @@ co_UserGetUpdateRgn(PWINDOW_OBJECT Window, HRGN hRgn, BOOL bErase) } else { - Rect = Window->Wnd->rcClient; + Rect = Window->rcClient; IntIntersectWithParents(Window, &Rect); NtGdiSetRectRgn(hRgn, Rect.left, Rect.top, Rect.right, Rect.bottom); RegionType = NtGdiCombineRgn(hRgn, hRgn, Window->hrgnUpdate, RGN_AND); - NtGdiOffsetRgn(hRgn, -Window->Wnd->rcClient.left, -Window->Wnd->rcClient.top); + NtGdiOffsetRgn(hRgn, -Window->rcClient.left, -Window->rcClient.top); } if (bErase && RegionType != NULLREGION && RegionType != ERROR) @@ -959,7 +990,7 @@ INT APIENTRY NtUserGetUpdateRgn(HWND hWnd, HRGN hRgn, BOOL bErase) { DECLARE_RETURN(INT); - PWINDOW_OBJECT Window; + PWND Window; INT ret; USER_REFERENCE_ENTRY Ref; @@ -993,7 +1024,7 @@ CLEANUP: BOOL APIENTRY NtUserGetUpdateRect(HWND hWnd, LPRECT UnsafeRect, BOOL bErase) { - PWINDOW_OBJECT Window; + PWND Window; RECTL Rect; INT RegionType; PROSRGNDATA RgnData; @@ -1017,7 +1048,7 @@ NtUserGetUpdateRect(HWND hWnd, LPRECT UnsafeRect, BOOL bErase) /* Get the update region bounding box. */ if (Window->hrgnUpdate == (HRGN)1) { - Rect = Window->Wnd->rcClient; + Rect = Window->rcClient; } else { @@ -1027,14 +1058,14 @@ NtUserGetUpdateRect(HWND hWnd, LPRECT UnsafeRect, BOOL bErase) RGNOBJAPI_Unlock(RgnData); if (RegionType != ERROR && RegionType != NULLREGION) - RECTL_bIntersectRect(&Rect, &Rect, &Window->Wnd->rcClient); + RECTL_bIntersectRect(&Rect, &Rect, &Window->rcClient); } if (IntIntersectWithParents(Window, &Rect)) { RECTL_vOffsetRect(&Rect, - -Window->Wnd->rcClient.left, - -Window->Wnd->rcClient.top); + -Window->rcClient.left, + -Window->rcClient.top); } else { Rect.left = Rect.top = Rect.right = Rect.bottom = 0; @@ -1082,7 +1113,7 @@ NtUserRedrawWindow( UINT flags) { RECTL SafeUpdateRect; - PWINDOW_OBJECT Wnd; + PWND Wnd; BOOL Ret; USER_REFERENCE_ENTRY Ref; NTSTATUS Status = STATUS_SUCCESS; @@ -1364,7 +1395,7 @@ NtUserScrollWindowEx( { RECTL rcScroll, rcClip, rcCaret, rcUpdate; INT Result; - PWINDOW_OBJECT Window = NULL, CaretWnd; + PWND Window = NULL, CaretWnd; HDC hDC; HRGN hrgnOwn = NULL, hrgnTemp; HWND hwndCaret; @@ -1462,7 +1493,7 @@ NtUserScrollWindowEx( if (flags & SW_SCROLLCHILDREN) { - PWINDOW_OBJECT Child; + PWND Child; RECTL rcChild; POINT ClientOrigin; USER_REFERENCE_ENTRY WndRef; @@ -1471,7 +1502,7 @@ NtUserScrollWindowEx( IntGetClientOrigin(Window, &ClientOrigin); for (Child = Window->spwndChild; Child; Child = Child->spwndNext) { - rcChild = Child->Wnd->rcWindow; + rcChild = Child->rcWindow; rcChild.left -= ClientOrigin.x; rcChild.top -= ClientOrigin.y; rcChild.right -= ClientOrigin.x; @@ -1545,7 +1576,7 @@ CLEANUP: BOOL UserDrawSysMenuButton( - PWINDOW_OBJECT pWnd, + PWND pWnd, HDC hDc, RECTL *lpRc, BOOL Down) @@ -1557,12 +1588,12 @@ UserDrawSysMenuButton( /* Get the icon to draw. We don't care about WM_GETICON here. */ - hIcon = pWnd->Wnd->pcls->hIconSm; + hIcon = pWnd->pcls->hIconSm; if(!hIcon) { DPRINT("Wnd class has no small icon.\n"); - hIcon = pWnd->Wnd->pcls->hIcon; + hIcon = pWnd->pcls->hIcon; } if(!hIcon) @@ -1651,7 +1682,7 @@ UserDrawCaptionText( } BOOL UserDrawCaption( - PWINDOW_OBJECT pWnd, + PWND pWnd, HDC hDc, RECTL *lpRc, HFONT hFont, @@ -1668,13 +1699,9 @@ BOOL UserDrawCaption( RECTL r = *lpRc; LONG ButtonWidth, IconWidth; BOOL HasIcon; - PWND Wnd = NULL; //ASSERT(pWnd != NULL); - if (pWnd) - Wnd = pWnd->Wnd; - RECTL_vMakeWellOrdered(lpRc); hMemBmp = NtGdiCreateCompatibleBitmap(hDc, lpRc->right - lpRc->left, @@ -1704,11 +1731,11 @@ BOOL UserDrawCaption( VCenter = (lpRc->bottom - lpRc->top) / 2; Padding = VCenter - (Height / 2); - if ((!hIcon) && (Wnd != NULL)) + if ((!hIcon) && (pWnd != NULL)) { - HasIcon = (uFlags & DC_ICON) && (Wnd->style & WS_SYSMENU) - && !(uFlags & DC_SMALLCAP) && !(Wnd->ExStyle & WS_EX_DLGMODALFRAME) - && !(Wnd->ExStyle & WS_EX_TOOLWINDOW); + HasIcon = (uFlags & DC_ICON) && (pWnd->style & WS_SYSMENU) + && !(uFlags & DC_SMALLCAP) && !(pWnd->ExStyle & WS_EX_DLGMODALFRAME) + && !(pWnd->ExStyle & WS_EX_TOOLWINDOW); } else HasIcon = (hIcon != 0); @@ -1782,14 +1809,14 @@ BOOL UserDrawCaption( TRIVERTEX vert[2]; COLORREF Colors[2]; - if (Wnd != NULL) + if (pWnd != NULL) { - if(Wnd->style & WS_SYSMENU) + if(pWnd->style & WS_SYSMENU) { r.right -= 3 + ButtonWidth; if(!(uFlags & DC_SMALLCAP)) { - if(Wnd->style & (WS_MAXIMIZEBOX | WS_MINIMIZEBOX)) + if(pWnd->style & (WS_MAXIMIZEBOX | WS_MINIMIZEBOX)) r.right -= 2 + 2 * ButtonWidth; else r.right -= 2; r.right -= 2; @@ -1869,12 +1896,12 @@ BOOL UserDrawCaption( ButtonWidth = UserGetSystemMetrics(SM_CXSMSIZE) - 2; else ButtonWidth = UserGetSystemMetrics(SM_CXSIZE) - 2; - if ((Wnd != NULL) && (Wnd->style & WS_SYSMENU)) + if ((pWnd != NULL) && (pWnd->style & WS_SYSMENU)) { r.right -= 3 + ButtonWidth; if(! (uFlags & DC_SMALLCAP)) { - if(Wnd->style & (WS_MAXIMIZEBOX | WS_MINIMIZEBOX)) + if(pWnd->style & (WS_MAXIMIZEBOX | WS_MINIMIZEBOX)) r.right -= 2 + 2 * ButtonWidth; else r.right -= 2; r.right -= 2; @@ -1888,9 +1915,9 @@ BOOL UserDrawCaption( else if (pWnd != NULL) { UNICODE_STRING ustr; - ustr.Buffer = pWnd->Wnd->strName.Buffer; - ustr.Length = pWnd->Wnd->strName.Length; - ustr.MaximumLength = pWnd->Wnd->strName.MaximumLength; + ustr.Buffer = pWnd->strName.Buffer; + ustr.Length = pWnd->strName.Length; + ustr.MaximumLength = pWnd->strName.MaximumLength; UserDrawCaptionText(hMemDc, &ustr, &r, uFlags); } } @@ -1944,7 +1971,7 @@ NtUserDrawCaptionTemp( const PUNICODE_STRING str, UINT uFlags) { - PWINDOW_OBJECT pWnd = NULL; + PWND pWnd = NULL; UNICODE_STRING SafeStr = {0}; NTSTATUS Status = STATUS_SUCCESS; RECTL SafeRect; @@ -2028,6 +2055,36 @@ NtUserInvalidateRgn( return NtUserRedrawWindow(hWnd, NULL, hRgn, RDW_INVALIDATE | (bErase? RDW_ERASE : 0)); } +BOOL +APIENTRY +NtUserPrintWindow( + HWND hwnd, + HDC hdcBlt, + UINT nFlags) +{ + PWND Window; + BOOL Ret = FALSE; + + UserEnterExclusive(); + + if (hwnd) + { + Window = UserGetWindowObject(hwnd); + // TODO: Add Desktop and MessageBox check via FNID's. + if ( Window ) + { + /* Validate flags and check it as a mask for 0 or 1. */ + if ( (nFlags & PW_CLIENTONLY) == nFlags) + Ret = IntPrintWindow( Window, hdcBlt, nFlags); + else + SetLastWin32Error(ERROR_INVALID_PARAMETER); + } + } + + UserLeave(); + return Ret; +} + /* ValidateRect gets redirected to NtUserValidateRect: http://blog.csdn.net/ntdll/archive/2005/10/19/509299.aspx */ BOOL diff --git a/subsystems/win32/win32k/ntuser/prop.c b/subsystems/win32/win32k/ntuser/prop.c index 5e032a60e84..56e221d3fb8 100644 --- a/subsystems/win32/win32k/ntuser/prop.c +++ b/subsystems/win32/win32k/ntuser/prop.c @@ -35,13 +35,13 @@ /* STATIC FUNCTIONS **********************************************************/ PPROPERTY FASTCALL -IntGetProp(PWINDOW_OBJECT Window, ATOM Atom) +IntGetProp(PWND Window, ATOM Atom) { PLIST_ENTRY ListEntry; PPROPERTY Property; - ListEntry = Window->Wnd->PropListHead.Flink; - while (ListEntry != &Window->Wnd->PropListHead) + ListEntry = Window->PropListHead.Flink; + while (ListEntry != &Window->PropListHead) { Property = CONTAINING_RECORD(ListEntry, PROPERTY, PropListEntry); if (Property->Atom == Atom) @@ -54,7 +54,7 @@ IntGetProp(PWINDOW_OBJECT Window, ATOM Atom) } BOOL FASTCALL -IntRemoveProp(PWINDOW_OBJECT Window, ATOM Atom) +IntRemoveProp(PWND Window, ATOM Atom) { PPROPERTY Prop; Prop = IntGetProp(Window, Atom); @@ -65,12 +65,12 @@ IntRemoveProp(PWINDOW_OBJECT Window, ATOM Atom) } RemoveEntryList(&Prop->PropListEntry); UserHeapFree(Prop); - Window->Wnd->PropListItems--; + Window->PropListItems--; return TRUE; } BOOL FASTCALL -IntSetProp(PWINDOW_OBJECT pWnd, ATOM Atom, HANDLE Data) +IntSetProp(PWND pWnd, ATOM Atom, HANDLE Data) { PPROPERTY Prop; @@ -84,8 +84,8 @@ IntSetProp(PWINDOW_OBJECT pWnd, ATOM Atom, HANDLE Data) return FALSE; } Prop->Atom = Atom; - InsertTailList(&pWnd->Wnd->PropListHead, &Prop->PropListEntry); - pWnd->Wnd->PropListItems++; + InsertTailList(&pWnd->PropListHead, &Prop->PropListEntry); + pWnd->PropListItems++; } Prop->Data = Data; @@ -100,7 +100,7 @@ NtUserBuildPropList(HWND hWnd, DWORD BufferSize, DWORD *Count) { - PWINDOW_OBJECT Window; + PWND Window; PPROPERTY Property; PLIST_ENTRY ListEntry; PROPLISTITEM listitem, *li; @@ -125,8 +125,8 @@ NtUserBuildPropList(HWND hWnd, /* copy list */ li = (PROPLISTITEM *)Buffer; - ListEntry = Window->Wnd->PropListHead.Flink; - while((BufferSize >= sizeof(PROPLISTITEM)) && (ListEntry != &Window->Wnd->PropListHead)) + ListEntry = Window->PropListHead.Flink; + while((BufferSize >= sizeof(PROPLISTITEM)) && (ListEntry != &Window->PropListHead)) { Property = CONTAINING_RECORD(ListEntry, PROPERTY, PropListEntry); listitem.Atom = Property->Atom; @@ -147,7 +147,7 @@ NtUserBuildPropList(HWND hWnd, } else { - Cnt = Window->Wnd->PropListItems * sizeof(PROPLISTITEM); + Cnt = Window->PropListItems * sizeof(PROPLISTITEM); } if(Count) @@ -170,7 +170,7 @@ CLEANUP: HANDLE APIENTRY NtUserRemoveProp(HWND hWnd, ATOM Atom) { - PWINDOW_OBJECT Window; + PWND Window; PPROPERTY Prop; HANDLE Data; DECLARE_RETURN(HANDLE); @@ -192,7 +192,7 @@ NtUserRemoveProp(HWND hWnd, ATOM Atom) Data = Prop->Data; RemoveEntryList(&Prop->PropListEntry); UserHeapFree(Prop); - Window->Wnd->PropListItems--; + Window->PropListItems--; RETURN(Data); @@ -205,7 +205,7 @@ CLEANUP: BOOL APIENTRY NtUserSetProp(HWND hWnd, ATOM Atom, HANDLE Data) { - PWINDOW_OBJECT Window; + PWND Window; DECLARE_RETURN(BOOL); DPRINT("Enter NtUserSetProp\n"); diff --git a/subsystems/win32/win32k/ntuser/scrollbar.c b/subsystems/win32/win32k/ntuser/scrollbar.c index 787a0e3a87e..84ed568c9ed 100644 --- a/subsystems/win32/win32k/ntuser/scrollbar.c +++ b/subsystems/win32/win32k/ntuser/scrollbar.c @@ -38,12 +38,11 @@ * the top. Return TRUE if the scrollbar is vertical, FALSE if horizontal. */ BOOL FASTCALL -IntGetScrollBarRect (PWINDOW_OBJECT Window, INT nBar, RECTL *lprect) +IntGetScrollBarRect (PWND Wnd, INT nBar, RECTL *lprect) { BOOL vertical; - PWND Wnd = Window->Wnd; - RECTL ClientRect = Window->Wnd->rcClient; - RECTL WindowRect = Window->Wnd->rcWindow; + RECTL ClientRect = Wnd->rcClient; + RECTL WindowRect = Wnd->rcWindow; switch (nBar) { @@ -72,7 +71,7 @@ IntGetScrollBarRect (PWINDOW_OBJECT Window, INT nBar, RECTL *lprect) break; case SB_CTL: - IntGetClientRect (Window, lprect); + IntGetClientRect (Wnd, lprect); vertical = ((Wnd->style & SBS_VERT) != 0); break; @@ -84,9 +83,8 @@ IntGetScrollBarRect (PWINDOW_OBJECT Window, INT nBar, RECTL *lprect) } BOOL FASTCALL -IntCalculateThumb(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi, LPSCROLLINFO psi) +IntCalculateThumb(PWND Wnd, LONG idObject, PSCROLLBARINFO psbi, LPSCROLLINFO psi) { - PWND Wnd = Window->Wnd; INT Thumb, ThumbBox, ThumbPos, cxy, mx; RECTL ClientRect; @@ -101,7 +99,7 @@ IntCalculateThumb(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi, LPS cxy = psbi->rcScrollBar.bottom - psbi->rcScrollBar.top; break; case SB_CTL: - IntGetClientRect(Window, &ClientRect); + IntGetClientRect(Wnd, &ClientRect); if(Wnd->style & SBS_VERT) { Thumb = UserGetSystemMetrics(SM_CYVSCROLL); @@ -161,13 +159,13 @@ IntCalculateThumb(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi, LPS } static VOID FASTCALL -IntUpdateSBInfo(PWINDOW_OBJECT Window, int wBar) +IntUpdateSBInfo(PWND Window, int wBar) { PSCROLLBARINFO sbi; LPSCROLLINFO psi; ASSERT(Window); - ASSERT(Window->pSBInfo); + ASSERT(Window->pSBInfoex); sbi = IntGetScrollbarInfoFromWindow(Window, wBar); psi = IntGetScrollInfoFromWindow(Window, wBar); @@ -176,7 +174,7 @@ IntUpdateSBInfo(PWINDOW_OBJECT Window, int wBar) } static BOOL FASTCALL -co_IntGetScrollInfo(PWINDOW_OBJECT Window, INT nBar, LPSCROLLINFO lpsi) +co_IntGetScrollInfo(PWND Window, INT nBar, LPSCROLLINFO lpsi) { UINT Mask; LPSCROLLINFO psi; @@ -278,7 +276,7 @@ NEWco_IntGetScrollInfo( } static DWORD FASTCALL -co_IntSetScrollInfo(PWINDOW_OBJECT Window, INT nBar, LPCSCROLLINFO lpsi, BOOL bRedraw) +co_IntSetScrollInfo(PWND Window, INT nBar, LPCSCROLLINFO lpsi, BOOL bRedraw) { /* * Update the scrollbar state and set action flags according to @@ -420,10 +418,10 @@ co_IntSetScrollInfo(PWINDOW_OBJECT Window, INT nBar, LPCSCROLLINFO lpsi, BOOL bR if (bRedraw) { RECTL UpdateRect = psbi->rcScrollBar; - UpdateRect.left -= Window->Wnd->rcClient.left - Window->Wnd->rcWindow.left; - UpdateRect.right -= Window->Wnd->rcClient.left - Window->Wnd->rcWindow.left; - UpdateRect.top -= Window->Wnd->rcClient.top - Window->Wnd->rcWindow.top; - UpdateRect.bottom -= Window->Wnd->rcClient.top - Window->Wnd->rcWindow.top; + UpdateRect.left -= Window->rcClient.left - Window->rcWindow.left; + UpdateRect.right -= Window->rcClient.left - Window->rcWindow.left; + UpdateRect.top -= Window->rcClient.top - Window->rcWindow.top; + UpdateRect.bottom -= Window->rcClient.top - Window->rcWindow.top; co_UserRedrawWindow(Window, &UpdateRect, 0, RDW_INVALIDATE | RDW_FRAME); } @@ -432,7 +430,7 @@ co_IntSetScrollInfo(PWINDOW_OBJECT Window, INT nBar, LPCSCROLLINFO lpsi, BOOL bR } BOOL FASTCALL -co_IntGetScrollBarInfo(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi) +co_IntGetScrollBarInfo(PWND Window, LONG idObject, PSCROLLBARINFO psbi) { INT Bar; PSCROLLBARINFO sbi; @@ -466,7 +464,7 @@ co_IntGetScrollBarInfo(PWINDOW_OBJECT Window, LONG idObject, PSCROLLBARINFO psbi } BOOL FASTCALL -co_IntCreateScrollBars(PWINDOW_OBJECT Window) +co_IntCreateScrollBars(PWND Window) { PSCROLLBARINFO psbi; LPSCROLLINFO psi; @@ -475,7 +473,7 @@ co_IntCreateScrollBars(PWINDOW_OBJECT Window) ASSERT_REFS_CO(Window); - if(Window->pSBInfo) + if(Window->pSBInfoex) { /* no need to create it anymore */ return TRUE; @@ -483,17 +481,17 @@ co_IntCreateScrollBars(PWINDOW_OBJECT Window) /* allocate memory for all scrollbars (HORZ, VERT, CONTROL) */ Size = 3 * (sizeof(SBINFOEX)); - if(!(Window->pSBInfo = ExAllocatePoolWithTag(PagedPool, Size, TAG_SBARINFO))) + if(!(Window->pSBInfoex = ExAllocatePoolWithTag(PagedPool, Size, TAG_SBARINFO))) { - DPRINT1("Unable to allocate memory for scrollbar information for window 0x%x\n", Window->hSelf); + DPRINT1("Unable to allocate memory for scrollbar information for window 0x%x\n", Window->head.h); return FALSE; } - RtlZeroMemory(Window->pSBInfo, Size); + RtlZeroMemory(Window->pSBInfoex, Size); co_WinPosGetNonClientSize(Window, - &Window->Wnd->rcWindow, - &Window->Wnd->rcClient); + &Window->rcWindow, + &Window->rcClient); for(s = SB_HORZ; s <= SB_VERT; s++) { @@ -514,12 +512,12 @@ co_IntCreateScrollBars(PWINDOW_OBJECT Window) } BOOL FASTCALL -IntDestroyScrollBars(PWINDOW_OBJECT Window) +IntDestroyScrollBars(PWND Window) { - if(Window->pSBInfo) + if(Window->pSBInfoex) { - ExFreePool(Window->pSBInfo); - Window->pSBInfo = NULL; + ExFreePool(Window->pSBInfoex); + Window->pSBInfoex = NULL; return TRUE; } return FALSE; @@ -570,7 +568,7 @@ NtUserGetScrollBarInfo(HWND hWnd, LONG idObject, PSCROLLBARINFO psbi) { NTSTATUS Status; SCROLLBARINFO sbi; - PWINDOW_OBJECT Window; + PWND Window; BOOL Ret; DECLARE_RETURN(BOOL); USER_REFERENCE_ENTRY Ref; @@ -620,7 +618,7 @@ NtUserSBGetParms( LPSCROLLINFO lpsi) { NTSTATUS Status; - PWINDOW_OBJECT Window; + PWND Window; SCROLLINFO psi; DWORD sz; BOOL Ret; @@ -677,7 +675,7 @@ NtUserEnableScrollBar( UINT wSBflags, UINT wArrows) { - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; PSCROLLBARINFO InfoV = NULL, InfoH = NULL; BOOL Chg = FALSE; DECLARE_RETURN(BOOL); @@ -757,7 +755,7 @@ NtUserSetScrollBarInfo( LONG idObject, SETSCROLLBARINFO *info) { - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; SETSCROLLBARINFO Safeinfo; PSCROLLBARINFO sbi; LPSCROLLINFO psi; @@ -821,7 +819,7 @@ NtUserSetScrollInfo( LPCSCROLLINFO lpsi, BOOL bRedraw) { - PWINDOW_OBJECT Window = NULL; + PWND Window = NULL; NTSTATUS Status; SCROLLINFO ScrollInfo; DECLARE_RETURN(DWORD); @@ -857,14 +855,11 @@ CLEANUP: /* Ported from WINE20020904 (SCROLL_ShowScrollBar) */ DWORD FASTCALL -co_UserShowScrollBar(PWINDOW_OBJECT Window, int wBar, DWORD bShow) +co_UserShowScrollBar(PWND Wnd, int wBar, DWORD bShow) { DWORD Style, OldStyle; - PWND Wnd; - ASSERT_REFS_CO(Window); - - Wnd = Window->Wnd; + ASSERT_REFS_CO(Wnd); switch(wBar) { @@ -885,16 +880,16 @@ co_UserShowScrollBar(PWINDOW_OBJECT Window, int wBar, DWORD bShow) return( FALSE); } - if(!co_IntCreateScrollBars(Window)) + if(!co_IntCreateScrollBars(Wnd)) { return( FALSE); } if (wBar == SB_CTL) { - IntUpdateSBInfo(Window, SB_CTL); + IntUpdateSBInfo(Wnd, SB_CTL); - co_WinPosShowWindow(Window, bShow ? SW_SHOW : SW_HIDE); + co_WinPosShowWindow(Wnd, bShow ? SW_SHOW : SW_HIDE); return( TRUE); } @@ -907,14 +902,14 @@ co_UserShowScrollBar(PWINDOW_OBJECT Window, int wBar, DWORD bShow) if(Wnd->style != OldStyle) { if(Wnd->style & WS_HSCROLL) - IntUpdateSBInfo(Window, SB_HORZ); + IntUpdateSBInfo(Wnd, SB_HORZ); if(Wnd->style & WS_VSCROLL) - IntUpdateSBInfo(Window, SB_VERT); + IntUpdateSBInfo(Wnd, SB_VERT); if(Wnd->style & WS_VISIBLE) { /* Frame has been changed, let the window redraw itself */ - co_WinPosSetWindowPos(Window, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | + co_WinPosSetWindowPos(Wnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED | SWP_NOSENDCHANGING); } } @@ -926,7 +921,7 @@ co_UserShowScrollBar(PWINDOW_OBJECT Window, int wBar, DWORD bShow) DWORD APIENTRY NtUserShowScrollBar(HWND hWnd, int wBar, DWORD bShow) { - PWINDOW_OBJECT Window; + PWND Window; DECLARE_RETURN(DWORD); DWORD ret; USER_REFERENCE_ENTRY Ref; diff --git a/subsystems/win32/win32k/ntuser/simplecall.c b/subsystems/win32/win32k/ntuser/simplecall.c index 7c4d2226354..af977096c8a 100644 --- a/subsystems/win32/win32k/ntuser/simplecall.c +++ b/subsystems/win32/win32k/ntuser/simplecall.c @@ -230,7 +230,7 @@ NtUserCallOneParam( case ONEPARAM_ROUTINE_ISWINDOWINDESTROY: { - PWINDOW_OBJECT Window; + PWND Window; DWORD_PTR Result; if(!(Window = UserGetWindowObject((HWND)Param))) @@ -317,6 +317,42 @@ NtUserCallOneParam( _SEH2_END; RETURN(Ret); } + case ONEPARAM_ROUTINE_SETPROCDEFLAYOUT: + { + PPROCESSINFO ppi; + if (Param & LAYOUT_ORIENTATIONMASK) + { + ppi = PsGetCurrentProcessWin32Process(); + ppi->dwLayout = Param; + RETURN(TRUE); + } + SetLastWin32Error(ERROR_INVALID_PARAMETER); + RETURN(FALSE); + } + case ONEPARAM_ROUTINE_GETPROCDEFLAYOUT: + { + BOOL Ret = TRUE; + PPROCESSINFO ppi; + PDWORD pdwLayout; + if ( PsGetCurrentProcess() == CsrProcess) + { + SetLastWin32Error(ERROR_INVALID_ACCESS); + RETURN(FALSE); + } + ppi = PsGetCurrentProcessWin32Process(); + _SEH2_TRY + { + pdwLayout = (PDWORD)Param; + *pdwLayout = ppi->dwLayout; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastNtError(_SEH2_GetExceptionCode()); + Ret = FALSE; + } + _SEH2_END; + RETURN(Ret); + } } DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n", Routine, Param); @@ -341,7 +377,7 @@ NtUserCallTwoParam( DWORD Routine) { NTSTATUS Status; - PWINDOW_OBJECT Window; + PWND Window; DECLARE_RETURN(DWORD_PTR); DPRINT("Enter NtUserCallTwoParam\n"); @@ -420,7 +456,7 @@ NtUserCallTwoParam( wParam = MAKEWPARAM((Param2 >> 3) & 0x3, Param2 & (UISF_HIDEFOCUS | UISF_HIDEACCEL | UISF_ACTIVE)); - RETURN( UserUpdateUiState(Window->Wnd, wParam) ); + RETURN( UserUpdateUiState(Window, wParam) ); } case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW: @@ -460,22 +496,19 @@ NtUserCallHwndLock( DWORD Routine) { BOOL Ret = 0; - PWINDOW_OBJECT Window; - PWND Wnd; + PWND Window; USER_REFERENCE_ENTRY Ref; DECLARE_RETURN(BOOLEAN); DPRINT("Enter NtUserCallHwndLock\n"); UserEnterExclusive(); - if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd) + if (!(Window = UserGetWindowObject(hWnd))) { RETURN( FALSE); } UserRefObjectCo(Window, &Ref); - Wnd = Window->Wnd; - /* FIXME: Routine can be 0x53 - 0x5E */ switch (Routine) { @@ -487,7 +520,7 @@ NtUserCallHwndLock( { DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n"); Ret = TRUE; - if ((Wnd->style & (WS_CHILD | WS_POPUP)) != WS_CHILD) + if ((Window->style & (WS_CHILD | WS_POPUP)) != WS_CHILD) co_WinPosSetWindowPos( Window, HWND_DESKTOP, 0,0,0,0, @@ -579,13 +612,13 @@ NtUserCallHwnd( { case HWND_ROUTINE_GETWNDCONTEXTHLPID: { - PWINDOW_OBJECT Window; + PWND Window; PPROPERTY HelpId; USER_REFERENCE_ENTRY Ref; UserEnterExclusive(); - if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd) + if (!(Window = UserGetWindowObject(hWnd))) { UserLeave(); return 0; @@ -628,7 +661,7 @@ NtUserCallHwndParam( case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID: { - PWINDOW_OBJECT Window; + PWND Window; UserEnterExclusive(); if(!(Window = UserGetWindowObject(hWnd))) @@ -648,20 +681,18 @@ NtUserCallHwndParam( case HWNDPARAM_ROUTINE_SETDIALOGPOINTER: { - PWINDOW_OBJECT Window; PWND pWnd; USER_REFERENCE_ENTRY Ref; UserEnterExclusive(); - if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd) + if (!(pWnd = UserGetWindowObject(hWnd))) { UserLeave(); return 0; } - UserRefObjectCo(Window, &Ref); + UserRefObjectCo(pWnd, &Ref); - pWnd = Window->Wnd; if (pWnd->head.pti->ppi == PsGetCurrentProcessWin32Process() && pWnd->cbwndExtra == DLGWINDOWEXTRA && !(pWnd->state & WNDS_SERVERSIDEWINDOWPROC)) @@ -678,7 +709,7 @@ NtUserCallHwndParam( } } - UserDerefObjectCo(Window); + UserDerefObjectCo(pWnd); UserLeave(); return 0; } @@ -697,14 +728,14 @@ NtUserCallHwndParamLock( DWORD Routine) { DWORD Ret = 0; - PWINDOW_OBJECT Window; + PWND Window; USER_REFERENCE_ENTRY Ref; DECLARE_RETURN(DWORD); DPRINT1("Enter NtUserCallHwndParamLock\n"); UserEnterExclusive(); - if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd) + if (!(Window = UserGetWindowObject(hWnd))) { RETURN( FALSE); } diff --git a/subsystems/win32/win32k/ntuser/timer.c b/subsystems/win32/win32k/ntuser/timer.c index 2f4e2189f3f..f9d83d6f27f 100644 --- a/subsystems/win32/win32k/ntuser/timer.c +++ b/subsystems/win32/win32k/ntuser/timer.c @@ -114,7 +114,7 @@ RemoveTimer(PTIMER pTmr) PTIMER FASTCALL -FindTimer(PWINDOW_OBJECT Window, +FindTimer(PWND Window, UINT_PTR nID, UINT flags) { @@ -167,11 +167,10 @@ FindSystemTimer(PMSG pMsg) BOOL FASTCALL ValidateTimerCallback(PTHREADINFO pti, - PWINDOW_OBJECT Window, - WPARAM wParam, LPARAM lParam) { PLIST_ENTRY pLE; + BOOL Ret = FALSE; PTIMER pTmr = FirstpTmr; if (!pTmr) return FALSE; @@ -180,22 +179,22 @@ ValidateTimerCallback(PTHREADINFO pti, do { if ( (lParam == (LPARAM)pTmr->pfn) && - (pTmr->flags & (TMRF_SYSTEM|TMRF_RIT)) && + !(pTmr->flags & (TMRF_SYSTEM|TMRF_RIT)) && (pTmr->pti->ppi == pti->ppi) ) + { + Ret = TRUE; break; - + } pLE = pTmr->ptmrList.Flink; pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); } while (pTmr != FirstpTmr); TimerLeave(); - if (!pTmr) return FALSE; - - return TRUE; + return Ret; } UINT_PTR FASTCALL -IntSetTimer( PWINDOW_OBJECT Window, +IntSetTimer( PWND Window, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, @@ -263,7 +262,7 @@ IntSetTimer( PWINDOW_OBJECT Window, if (!pTmr) return 0; if (Window && (Type & TMRF_TIFROMWND)) - pTmr->pti = Window->pti->pEThread->Tcb.Win32Thread; + pTmr->pti = Window->head.pti->pEThread->Tcb.Win32Thread; else { if (Type & TMRF_RIT) @@ -317,12 +316,12 @@ StartTheTimers(VOID) UINT_PTR FASTCALL -SystemTimerSet( PWINDOW_OBJECT Window, +SystemTimerSet( PWND Window, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc) { - if (Window && Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess()) + if (Window && Window->head.pti->pEThread->ThreadsProcess != PsGetCurrentProcess()) { SetLastWin32Error(ERROR_ACCESS_DENIED); DPRINT("SysemTimerSet: Access Denied!\n"); @@ -333,7 +332,7 @@ SystemTimerSet( PWINDOW_OBJECT Window, BOOL FASTCALL -PostTimerMessages(PWINDOW_OBJECT Window) +PostTimerMessages(PWND Window) { PLIST_ENTRY pLE; PUSER_MESSAGE_QUEUE ThreadQueue; @@ -355,7 +354,7 @@ PostTimerMessages(PWINDOW_OBJECT Window) (pTmr->pti == pti) && ((pTmr->pWnd == Window) || (Window == NULL)) ) { - Msg.hwnd = (pTmr->pWnd) ? pTmr->pWnd->hSelf : 0; + Msg.hwnd = (pTmr->pWnd) ? pTmr->pWnd->head.h : 0; Msg.message = (pTmr->flags & TMRF_SYSTEM) ? WM_SYSTIMER : WM_TIMER; Msg.wParam = (WPARAM) pTmr->nID; Msg.lParam = (LPARAM) pTmr->pfn; @@ -456,7 +455,7 @@ ProcessTimers(VOID) } BOOL FASTCALL -DestroyTimersForWindow(PTHREADINFO pti, PWINDOW_OBJECT Window) +DestroyTimersForWindow(PTHREADINFO pti, PWND Window) { PLIST_ENTRY pLE; PTIMER pTmr = FirstpTmr; @@ -510,7 +509,7 @@ DestroyTimersForThread(PTHREADINFO pti) } BOOL FASTCALL -IntKillTimer(PWINDOW_OBJECT Window, UINT_PTR IDEvent, BOOL SystemTimer) +IntKillTimer(PWND Window, UINT_PTR IDEvent, BOOL SystemTimer) { PTIMER pTmr = NULL; DPRINT("IntKillTimer Window %x id %p systemtimer %s\n", @@ -562,7 +561,7 @@ NtUserSetTimer TIMERPROC lpTimerFunc ) { - PWINDOW_OBJECT Window; + PWND Window; DECLARE_RETURN(UINT_PTR); DPRINT("Enter NtUserSetTimer\n"); @@ -587,7 +586,7 @@ NtUserKillTimer UINT_PTR uIDEvent ) { - PWINDOW_OBJECT Window; + PWND Window; DECLARE_RETURN(BOOL); DPRINT("Enter NtUserKillTimer\n"); @@ -616,8 +615,7 @@ NtUserSetSystemTimer( DPRINT("Enter NtUserSetSystemTimer\n"); - // This is wrong, lpTimerFunc is NULL! - RETURN(IntSetTimer(UserGetWindowObject(hWnd), nIDEvent, uElapse, lpTimerFunc, TMRF_SYSTEM)); + RETURN(IntSetTimer(UserGetWindowObject(hWnd), nIDEvent, uElapse, NULL, TMRF_SYSTEM)); CLEANUP: DPRINT("Leave NtUserSetSystemTimer, ret=%i\n", _ret_); diff --git a/subsystems/win32/win32k/ntuser/vis.c b/subsystems/win32/win32k/ntuser/vis.c index d82e384cbf2..0bf5dc88e72 100644 --- a/subsystems/win32/win32k/ntuser/vis.c +++ b/subsystems/win32/win32k/ntuser/vis.c @@ -31,16 +31,13 @@ HRGN FASTCALL VIS_ComputeVisibleRegion( - PWINDOW_OBJECT Window, + PWND Wnd, BOOLEAN ClientArea, BOOLEAN ClipChildren, BOOLEAN ClipSiblings) { HRGN VisRgn, ClipRgn; - PWINDOW_OBJECT PreviousWindow, CurrentWindow, CurrentSibling; - PWND Wnd, CurrentWnd, PreviousWnd, CurrentSiblingWnd; - - Wnd = Window->Wnd; + PWND PreviousWindow, CurrentWindow, CurrentSibling; if (!Wnd || !(Wnd->style & WS_VISIBLE)) { @@ -51,11 +48,11 @@ VIS_ComputeVisibleRegion( if (ClientArea) { - VisRgn = IntSysCreateRectRgnIndirect(&Window->Wnd->rcClient); + VisRgn = IntSysCreateRectRgnIndirect(&Wnd->rcClient); } else { - VisRgn = IntSysCreateRectRgnIndirect(&Window->Wnd->rcWindow); + VisRgn = IntSysCreateRectRgnIndirect(&Wnd->rcWindow); } /* @@ -64,49 +61,45 @@ VIS_ComputeVisibleRegion( * our window. */ - PreviousWindow = Window; - PreviousWnd = PreviousWindow->Wnd; - CurrentWindow = Window->spwndParent; + PreviousWindow = Wnd; + CurrentWindow = Wnd->spwndParent; while (CurrentWindow) { - if ( CurrentWindow->state & WINDOWSTATUS_DESTROYING || // state2 - CurrentWindow->state & WINDOWSTATUS_DESTROYED ) + if ( CurrentWindow->state2 & WNDS2_INDESTROY || + CurrentWindow->state & WNDS_DESTROYED ) { DPRINT1("ATM the Current Window or Parent is dead!\n"); if (VisRgn) REGION_FreeRgnByHandle(VisRgn); return NULL; } - CurrentWnd = CurrentWindow->Wnd; - if (!CurrentWnd || !(CurrentWnd->style & WS_VISIBLE)) + if (!(CurrentWindow->style & WS_VISIBLE)) { if (VisRgn) REGION_FreeRgnByHandle(VisRgn); return NULL; } - ClipRgn = IntSysCreateRectRgnIndirect(&CurrentWnd->rcClient); + ClipRgn = IntSysCreateRectRgnIndirect(&CurrentWindow->rcClient); NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_AND); REGION_FreeRgnByHandle(ClipRgn); - if ((PreviousWnd->style & WS_CLIPSIBLINGS) || - (PreviousWnd == Wnd && ClipSiblings)) + if ((PreviousWindow->style & WS_CLIPSIBLINGS) || + (PreviousWindow == Wnd && ClipSiblings)) { CurrentSibling = CurrentWindow->spwndChild; while ( CurrentSibling != NULL && - CurrentSibling != PreviousWindow && - CurrentSibling->Wnd ) + CurrentSibling != PreviousWindow ) { - CurrentSiblingWnd = CurrentSibling->Wnd; - if ((CurrentSiblingWnd->style & WS_VISIBLE) && - !(CurrentSiblingWnd->ExStyle & WS_EX_TRANSPARENT)) + if ((CurrentSibling->style & WS_VISIBLE) && + !(CurrentSibling->ExStyle & WS_EX_TRANSPARENT)) { - ClipRgn = IntSysCreateRectRgnIndirect(&CurrentSiblingWnd->rcWindow); + ClipRgn = IntSysCreateRectRgnIndirect(&CurrentSibling->rcWindow); /* Combine it with the window region if available */ - if (CurrentSibling->hrgnClip && !(CurrentSiblingWnd->style & WS_MINIMIZE)) + if (CurrentSibling->hrgnClip && !(CurrentSibling->style & WS_MINIMIZE)) { - NtGdiOffsetRgn(ClipRgn, -CurrentSiblingWnd->rcWindow.left, -CurrentSiblingWnd->rcWindow.top); + NtGdiOffsetRgn(ClipRgn, -CurrentSibling->rcWindow.left, -CurrentSibling->rcWindow.top); NtGdiCombineRgn(ClipRgn, ClipRgn, CurrentSibling->hrgnClip, RGN_AND); - NtGdiOffsetRgn(ClipRgn, CurrentSiblingWnd->rcWindow.left, CurrentSiblingWnd->rcWindow.top); + NtGdiOffsetRgn(ClipRgn, CurrentSibling->rcWindow.left, CurrentSibling->rcWindow.top); } NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF); REGION_FreeRgnByHandle(ClipRgn); @@ -116,26 +109,24 @@ VIS_ComputeVisibleRegion( } PreviousWindow = CurrentWindow; - PreviousWnd = PreviousWindow->Wnd; CurrentWindow = CurrentWindow->spwndParent; } if (ClipChildren) { - CurrentWindow = Window->spwndChild; - while (CurrentWindow && CurrentWindow->Wnd) + CurrentWindow = Wnd->spwndChild; + while (CurrentWindow) { - CurrentWnd = CurrentWindow->Wnd; - if ((CurrentWnd->style & WS_VISIBLE) && - !(CurrentWnd->ExStyle & WS_EX_TRANSPARENT)) + if ((CurrentWindow->style & WS_VISIBLE) && + !(CurrentWindow->ExStyle & WS_EX_TRANSPARENT)) { - ClipRgn = IntSysCreateRectRgnIndirect(&CurrentWnd->rcWindow); + ClipRgn = IntSysCreateRectRgnIndirect(&CurrentWindow->rcWindow); /* Combine it with the window region if available */ - if (CurrentWindow->hrgnClip && !(CurrentWnd->style & WS_MINIMIZE)) + if (CurrentWindow->hrgnClip && !(CurrentWindow->style & WS_MINIMIZE)) { - NtGdiOffsetRgn(ClipRgn, -CurrentWnd->rcWindow.left, -CurrentWnd->rcWindow.top); + NtGdiOffsetRgn(ClipRgn, -CurrentWindow->rcWindow.left, -CurrentWindow->rcWindow.top); NtGdiCombineRgn(ClipRgn, ClipRgn, CurrentWindow->hrgnClip, RGN_AND); - NtGdiOffsetRgn(ClipRgn, CurrentWnd->rcWindow.left, CurrentWnd->rcWindow.top); + NtGdiOffsetRgn(ClipRgn, CurrentWindow->rcWindow.left, CurrentWindow->rcWindow.top); } NtGdiCombineRgn(VisRgn, VisRgn, ClipRgn, RGN_DIFF); REGION_FreeRgnByHandle(ClipRgn); @@ -144,10 +135,10 @@ VIS_ComputeVisibleRegion( } } - if (Window->hrgnClip && !(Wnd->style & WS_MINIMIZE)) + if (Wnd->hrgnClip && !(Wnd->style & WS_MINIMIZE)) { NtGdiOffsetRgn(VisRgn, -Wnd->rcWindow.left, -Wnd->rcWindow.top); - NtGdiCombineRgn(VisRgn, VisRgn, Window->hrgnClip, RGN_AND); + NtGdiCombineRgn(VisRgn, VisRgn, Wnd->hrgnClip, RGN_AND); NtGdiOffsetRgn(VisRgn, Wnd->rcWindow.left, Wnd->rcWindow.top); } @@ -156,28 +147,24 @@ VIS_ComputeVisibleRegion( VOID FASTCALL co_VIS_WindowLayoutChanged( - PWINDOW_OBJECT Window, + PWND Wnd, HRGN NewlyExposed) { HRGN Temp; - PWINDOW_OBJECT Parent; + PWND Parent; USER_REFERENCE_ENTRY Ref; - PWND Wnd, ParentWnd; - ASSERT_REFS_CO(Window); - - Wnd = Window->Wnd; + ASSERT_REFS_CO(Wnd); Temp = IntSysCreateRectRgn(0, 0, 0, 0); NtGdiCombineRgn(Temp, NewlyExposed, NULL, RGN_COPY); - Parent = Window->spwndParent; + Parent = Wnd->spwndParent; if(Parent) { - ParentWnd = Parent->Wnd; NtGdiOffsetRgn(Temp, - Wnd->rcWindow.left - ParentWnd->rcClient.left, - Wnd->rcWindow.top - ParentWnd->rcClient.top); + Wnd->rcWindow.left - Parent->rcClient.left, + Wnd->rcWindow.top - Parent->rcClient.top); UserRefObjectCo(Parent, &Ref); co_UserRedrawWindow(Parent, NULL, Temp, diff --git a/subsystems/win32/win32k/ntuser/windc.c b/subsystems/win32/win32k/ntuser/windc.c index ed49ac6a920..e6b3cfa5ad9 100644 --- a/subsystems/win32/win32k/ntuser/windc.c +++ b/subsystems/win32/win32k/ntuser/windc.c @@ -59,7 +59,7 @@ DceCreateDisplayDC(VOID) static HRGN FASTCALL -DceGetVisRgn(PWINDOW_OBJECT Window, ULONG Flags, HWND hWndChild, ULONG CFlags) +DceGetVisRgn(PWND Window, ULONG Flags, HWND hWndChild, ULONG CFlags) { HRGN VisRgn; @@ -75,12 +75,9 @@ DceGetVisRgn(PWINDOW_OBJECT Window, ULONG Flags, HWND hWndChild, ULONG CFlags) } PDCE FASTCALL -DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type) +DceAllocDCE(PWND Window OPTIONAL, DCE_TYPE Type) { PDCE pDce; - PWND Wnd = NULL; - - if (Window) Wnd = Window->Wnd; pDce = ExAllocatePoolWithTag(PagedPool, sizeof(DCE), TAG_PDCE); if(!pDce) @@ -94,9 +91,9 @@ DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type) } DCECount++; DPRINT("Alloc DCE's! %d\n",DCECount); - pDce->hwndCurrent = (Window ? Window->hSelf : NULL); - pDce->pwndOrg = Wnd; - pDce->pwndClip = Wnd; + pDce->hwndCurrent = (Window ? Window->head.h : NULL); + pDce->pwndOrg = Window; + pDce->pwndClip = Window; pDce->hrgnClip = NULL; pDce->hrgnClipPublic = NULL; pDce->hrgnSavedVis = NULL; @@ -124,12 +121,12 @@ DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type) else { pDce->DCXFlags = DCX_DCEBUSY; - if (Wnd) + if (Window) { if (Type == DCE_WINDOW_DC) { - if (Wnd->style & WS_CLIPCHILDREN) pDce->DCXFlags |= DCX_CLIPCHILDREN; - if (Wnd->style & WS_CLIPSIBLINGS) pDce->DCXFlags |= DCX_CLIPSIBLINGS; + if (Window->style & WS_CLIPCHILDREN) pDce->DCXFlags |= DCX_CLIPCHILDREN; + if (Window->style & WS_CLIPSIBLINGS) pDce->DCXFlags |= DCX_CLIPSIBLINGS; } } } @@ -137,12 +134,11 @@ DceAllocDCE(PWINDOW_OBJECT Window OPTIONAL, DCE_TYPE Type) } static VOID APIENTRY -DceSetDrawable( PWINDOW_OBJECT Window OPTIONAL, +DceSetDrawable( PWND Window OPTIONAL, HDC hDC, ULONG Flags, BOOL SetClipOrigin) { - PWND Wnd; DC *dc = DC_LockDc(hDC); if(!dc) return; @@ -154,16 +150,15 @@ DceSetDrawable( PWINDOW_OBJECT Window OPTIONAL, } else { - Wnd = Window->Wnd; if (Flags & DCX_WINDOW) { - dc->ptlDCOrig.x = Wnd->rcWindow.left; - dc->ptlDCOrig.y = Wnd->rcWindow.top; + dc->ptlDCOrig.x = Window->rcWindow.left; + dc->ptlDCOrig.y = Window->rcWindow.top; } else { - dc->ptlDCOrig.x = Wnd->rcClient.left; - dc->ptlDCOrig.y = Wnd->rcClient.top; + dc->ptlDCOrig.x = Window->rcClient.left; + dc->ptlDCOrig.y = Window->rcClient.top; } } DC_UnlockDc(dc); @@ -254,16 +249,15 @@ DceReleaseDC(DCE* dce, BOOL EndPaint) } static VOID FASTCALL -DceUpdateVisRgn(DCE *Dce, PWINDOW_OBJECT Window, ULONG Flags) +DceUpdateVisRgn(DCE *Dce, PWND Window, ULONG Flags) { HANDLE hRgnVisible = NULL; ULONG DcxFlags; - PWINDOW_OBJECT DesktopWindow; + PWND DesktopWindow; if (Flags & DCX_PARENTCLIP) { - PWINDOW_OBJECT Parent; - PWND ParentWnd; + PWND Parent; Parent = Window->spwndParent; if(!Parent) @@ -272,9 +266,7 @@ DceUpdateVisRgn(DCE *Dce, PWINDOW_OBJECT Window, ULONG Flags) goto noparent; } - ParentWnd = Parent->Wnd; - - if (ParentWnd->style & WS_CLIPSIBLINGS) + if (Parent->style & WS_CLIPSIBLINGS) { DcxFlags = DCX_CLIPSIBLINGS | (Flags & ~(DCX_CLIPCHILDREN | DCX_WINDOW)); @@ -283,14 +275,14 @@ DceUpdateVisRgn(DCE *Dce, PWINDOW_OBJECT Window, ULONG Flags) { DcxFlags = Flags & ~(DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | DCX_WINDOW); } - hRgnVisible = DceGetVisRgn(Parent, DcxFlags, Window->hSelf, Flags); + hRgnVisible = DceGetVisRgn(Parent, DcxFlags, Window->head.h, Flags); } else if (Window == NULL) { DesktopWindow = UserGetWindowObject(IntGetDesktopWindow()); if (NULL != DesktopWindow) { - hRgnVisible = IntSysCreateRectRgnIndirect(&DesktopWindow->Wnd->rcWindow); + hRgnVisible = IntSysCreateRectRgnIndirect(&DesktopWindow->rcWindow); } else { @@ -338,24 +330,21 @@ noparent: } HDC FASTCALL -UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags) +UserGetDCEx(PWND Wnd OPTIONAL, HANDLE ClipRegion, ULONG Flags) { - PWINDOW_OBJECT Parent; + PWND Parent; ULONG DcxFlags; DCE* Dce = NULL; BOOL UpdateClipOrigin = FALSE; - PWND Wnd = NULL; HDC hDC = NULL; PPROCESSINFO ppi; PLIST_ENTRY pLE; - if (NULL == Window) + if (NULL == Wnd) { Flags &= ~DCX_USESTYLE; Flags |= DCX_CACHE; } - else - Wnd = Window->Wnd; if (Flags & (DCX_WINDOW | DCX_PARENTCLIP)) Flags |= DCX_CACHE; @@ -420,9 +409,9 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags) Flags &= ~(DCX_PARENTCLIP | DCX_CLIPCHILDREN); } - Parent = (Window ? Window->spwndParent : NULL); + Parent = (Wnd ? Wnd->spwndParent : NULL); - if (NULL == Window || !(Wnd->style & WS_CHILD) || NULL == Parent) + if (NULL == Wnd || !(Wnd->style & WS_CHILD) || NULL == Parent) { Flags &= ~DCX_PARENTCLIP; Flags |= DCX_CLIPSIBLINGS; @@ -434,10 +423,10 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags) if (Flags & DCX_PARENTCLIP) { if ((Wnd->style & WS_VISIBLE) && - (Parent->Wnd->style & WS_VISIBLE)) + (Parent->style & WS_VISIBLE)) { Flags &= ~DCX_CLIPCHILDREN; - if (Parent->Wnd->style & WS_CLIPSIBLINGS) + if (Parent->style & WS_CLIPSIBLINGS) { Flags |= DCX_CLIPSIBLINGS; } @@ -478,7 +467,7 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags) { DceEmpty = Dce; } - else if (Dce->hwndCurrent == (Window ? Window->hSelf : NULL) && + else if (Dce->hwndCurrent == (Wnd ? Wnd->head.h : NULL) && ((Dce->DCXFlags & DCX_CACHECOMPAREMASK) == DcxFlags)) { UpdateClipOrigin = TRUE; @@ -499,7 +488,7 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags) } if (!Dce) return NULL; - Dce->hwndCurrent = (Window ? Window->hSelf : NULL); + Dce->hwndCurrent = (Wnd ? Wnd->head.h : NULL); } else // If we are here, we are POWNED or having CLASS. { @@ -508,7 +497,7 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags) Dce = CONTAINING_RECORD(pLE, DCE, List); do { // Check for Window handle than HDC match for CLASS. - if ((Dce->hwndCurrent == Window->hSelf) || + if ((Dce->hwndCurrent == Wnd->head.h) || (Dce->hDC == hDC)) break; pLE = Dce->List.Flink; @@ -556,18 +545,18 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags) { Flags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN; Dce->DCXFlags |= DCX_INTERSECTRGN | DCX_KEEPCLIPRGN; - ClipRegion = Window->hrgnUpdate; + ClipRegion = Wnd->hrgnUpdate; } if (ClipRegion == (HRGN) 1) { if (!(Flags & DCX_WINDOW)) { - Dce->hrgnClip = IntSysCreateRectRgnIndirect(&Window->Wnd->rcClient); + Dce->hrgnClip = IntSysCreateRectRgnIndirect(&Wnd->rcClient); } else { - Dce->hrgnClip = IntSysCreateRectRgnIndirect(&Window->Wnd->rcWindow); + Dce->hrgnClip = IntSysCreateRectRgnIndirect(&Wnd->rcWindow); } Dce->DCXFlags &= ~DCX_KEEPCLIPRGN; } @@ -582,9 +571,9 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags) Dce->hrgnClip = ClipRegion; } - DceSetDrawable(Window, Dce->hDC, Flags, UpdateClipOrigin); + DceSetDrawable(Wnd, Dce->hDC, Flags, UpdateClipOrigin); - DceUpdateVisRgn(Dce, Window, Flags); + DceUpdateVisRgn(Dce, Wnd, Flags); if (Dce->DCXFlags & DCX_CACHE) { @@ -679,7 +668,7 @@ DceFreeDCE(PDCE pdce, BOOLEAN Force) * Remove owned DCE and reset unreleased cache DCEs. */ void FASTCALL -DceFreeWindowDCE(PWINDOW_OBJECT Window) +DceFreeWindowDCE(PWND Window) { PDCE pDCE; PLIST_ENTRY pLE; @@ -704,12 +693,12 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) DPRINT1("FreeWindowDCE List is Empty!!!!\n"); break; } - if ( pDCE->hwndCurrent == Window->hSelf && + if ( pDCE->hwndCurrent == Window->head.h && !(pDCE->DCXFlags & DCX_DCEEMPTY) ) { if (!(pDCE->DCXFlags & DCX_CACHE)) /* owned or Class DCE*/ { - if (Window->Wnd->pcls->style & CS_CLASSDC) /* Test Class first */ + if (Window->pcls->style & CS_CLASSDC) /* Test Class first */ { if (pDCE->DCXFlags & (DCX_INTERSECTRGN | DCX_EXCLUDERGN)) /* Class DCE*/ DceDeleteClipRgn(pDCE); @@ -727,7 +716,7 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) } /* Do not change owner so thread can clean up! */ } - else if (Window->Wnd->pcls->style & CS_OWNDC) /* owned DCE*/ + else if (Window->pcls->style & CS_OWNDC) /* owned DCE*/ { pDCE = DceFreeDCE(pDCE, FALSE); if (!pDCE) break; @@ -750,7 +739,7 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) * We should change this to DPRINT when ReactOS is more stable * (for 1.0?). */ - DPRINT1("[%p] GetDC() without ReleaseDC()!\n", Window->hSelf); + DPRINT1("[%p] GetDC() without ReleaseDC()!\n", Window->head.h); DceReleaseDC(pDCE, FALSE); } pDCE->DCXFlags |= DCX_DCEEMPTY; @@ -830,11 +819,11 @@ DceEmptyCache(VOID) } VOID FASTCALL -DceResetActiveDCEs(PWINDOW_OBJECT Window) +DceResetActiveDCEs(PWND Window) { DCE *pDCE; PDC dc; - PWINDOW_OBJECT CurrentWindow; + PWND CurrentWindow; INT DeltaX; INT DeltaY; PLIST_ENTRY pLE; @@ -852,7 +841,7 @@ DceResetActiveDCEs(PWINDOW_OBJECT Window) if(pLE == &LEDce) break; if (0 == (pDCE->DCXFlags & (DCX_DCEEMPTY|DCX_INDESTROY))) { - if (Window->hSelf == pDCE->hwndCurrent) + if (Window->head.h == pDCE->hwndCurrent) { CurrentWindow = Window; } @@ -878,17 +867,17 @@ DceResetActiveDCEs(PWINDOW_OBJECT Window) { if (pDCE->DCXFlags & DCX_WINDOW) { - DeltaX = CurrentWindow->Wnd->rcWindow.left - dc->ptlDCOrig.x; - DeltaY = CurrentWindow->Wnd->rcWindow.top - dc->ptlDCOrig.y; - dc->ptlDCOrig.x = CurrentWindow->Wnd->rcWindow.left; - dc->ptlDCOrig.y = CurrentWindow->Wnd->rcWindow.top; + DeltaX = CurrentWindow->rcWindow.left - dc->ptlDCOrig.x; + DeltaY = CurrentWindow->rcWindow.top - dc->ptlDCOrig.y; + dc->ptlDCOrig.x = CurrentWindow->rcWindow.left; + dc->ptlDCOrig.y = CurrentWindow->rcWindow.top; } else { - DeltaX = CurrentWindow->Wnd->rcClient.left - dc->ptlDCOrig.x; - DeltaY = CurrentWindow->Wnd->rcClient.top - dc->ptlDCOrig.y; - dc->ptlDCOrig.x = CurrentWindow->Wnd->rcClient.left; - dc->ptlDCOrig.y = CurrentWindow->Wnd->rcClient.top; + DeltaX = CurrentWindow->rcClient.left - dc->ptlDCOrig.x; + DeltaY = CurrentWindow->rcClient.top - dc->ptlDCOrig.y; + dc->ptlDCOrig.x = CurrentWindow->rcClient.left; + dc->ptlDCOrig.y = CurrentWindow->rcClient.top; } if (NULL != dc->rosdc.hClipRgn) { @@ -904,7 +893,7 @@ DceResetActiveDCEs(PWINDOW_OBJECT Window) DceUpdateVisRgn(pDCE, CurrentWindow, pDCE->DCXFlags); - if (Window->hSelf != pDCE->hwndCurrent) + if (Window->head.h != pDCE->hwndCurrent) { // IntEngWindowChanged(CurrentWindow, WOC_RGN_CLIENT); // UserDerefObject(CurrentWindow); @@ -943,7 +932,7 @@ IntWindowFromDC(HDC hDc) } INT FASTCALL -UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc, BOOL EndPaint) +UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint) { PDCE dce; PLIST_ENTRY pLE; @@ -975,7 +964,7 @@ UserReleaseDC(PWINDOW_OBJECT Window, HDC hDc, BOOL EndPaint) } HDC FASTCALL -UserGetWindowDC(PWINDOW_OBJECT Wnd) +UserGetWindowDC(PWND Wnd) { return UserGetDCEx(Wnd, 0, DCX_USESTYLE | DCX_WINDOW); } @@ -984,7 +973,7 @@ HWND FASTCALL UserGethWnd( HDC hdc, PWNDOBJ *pwndo) { PWNDGDI pWndgdi; - PWINDOW_OBJECT Wnd; + PWND Wnd; HWND hWnd; hWnd = IntWindowFromDC(hdc); @@ -1004,7 +993,7 @@ UserGethWnd( HDC hdc, PWNDOBJ *pwndo) HDC APIENTRY NtUserGetDCEx(HWND hWnd OPTIONAL, HANDLE ClipRegion, ULONG Flags) { - PWINDOW_OBJECT Wnd=NULL; + PWND Wnd=NULL; DECLARE_RETURN(HDC); DPRINT("Enter NtUserGetDCEx\n"); diff --git a/subsystems/win32/win32k/ntuser/window.c b/subsystems/win32/win32k/ntuser/window.c index c98feef9b16..0b270cf8c0b 100644 --- a/subsystems/win32/win32k/ntuser/window.c +++ b/subsystems/win32/win32k/ntuser/window.c @@ -84,9 +84,9 @@ BOOL FASTCALL UserUpdateUiState(PWND Wnd, WPARAM wParam) return TRUE; } -PWINDOW_OBJECT FASTCALL IntGetWindowObject(HWND hWnd) +PWND FASTCALL IntGetWindowObject(HWND hWnd) { - PWINDOW_OBJECT Window; + PWND Window; if (!hWnd) return NULL; @@ -96,17 +96,15 @@ PWINDOW_OBJECT FASTCALL IntGetWindowObject(HWND hWnd) ASSERT(Window->head.cLockObj >= 0); Window->head.cLockObj++; - - ASSERT(Window->Wnd); } return Window; } /* temp hack */ -PWINDOW_OBJECT FASTCALL UserGetWindowObject(HWND hWnd) +PWND FASTCALL UserGetWindowObject(HWND hWnd) { PTHREADINFO ti; - PWINDOW_OBJECT Window; + PWND Window; if (PsGetCurrentProcess() != PsInitialSystemProcess) { @@ -124,8 +122,8 @@ PWINDOW_OBJECT FASTCALL UserGetWindowObject(HWND hWnd) return NULL; } - Window = (PWINDOW_OBJECT)UserGetObject(gHandleTable, hWnd, otWindow); - if (!Window || 0 != (Window->state & WINDOWSTATUS_DESTROYED)) + Window = (PWND)UserGetObject(gHandleTable, hWnd, otWindow); + if (!Window || 0 != (Window->state & WNDS_DESTROYED)) { SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return NULL; @@ -133,8 +131,6 @@ PWINDOW_OBJECT FASTCALL UserGetWindowObject(HWND hWnd) ASSERT(Window->head.cLockObj >= 0); - ASSERT(Window->Wnd); - return Window; } @@ -158,7 +154,7 @@ PWINDOW_OBJECT FASTCALL UserGetWindowObject(HWND hWnd) BOOL FASTCALL IntIsWindow(HWND hWnd) { - PWINDOW_OBJECT Window; + PWND Window; if (!(Window = UserGetWindowObject(hWnd))) return FALSE; @@ -168,14 +164,14 @@ IntIsWindow(HWND hWnd) -PWINDOW_OBJECT FASTCALL -IntGetParent(PWINDOW_OBJECT Wnd) +PWND FASTCALL +IntGetParent(PWND Wnd) { - if (Wnd->Wnd->style & WS_POPUP) + if (Wnd->style & WS_POPUP) { return Wnd->spwndOwner; } - else if (Wnd->Wnd->style & WS_CHILD) + else if (Wnd->style & WS_CHILD) { return Wnd->spwndParent; } @@ -195,9 +191,9 @@ IntGetParent(PWINDOW_OBJECT Wnd) */ HWND* FASTCALL -IntWinListChildren(PWINDOW_OBJECT Window) +IntWinListChildren(PWND Window) { - PWINDOW_OBJECT Child; + PWND Child; HWND *List; UINT Index, NumChildren = 0; @@ -216,7 +212,7 @@ IntWinListChildren(PWINDOW_OBJECT Window) for (Child = Window->spwndChild, Index = 0; Child != NULL; Child = Child->spwndNext, ++Index) - List[Index] = Child->hSelf; + List[Index] = Child->head.h; List[Index] = NULL; return List; @@ -228,7 +224,7 @@ IntWinListChildren(PWINDOW_OBJECT Window) static void IntSendDestroyMsg(HWND hWnd) { - PWINDOW_OBJECT Window; + PWND Window; #if 0 /* FIXME */ GUITHREADINFO info; @@ -297,17 +293,16 @@ static void IntSendDestroyMsg(HWND hWnd) } static VOID -UserFreeWindowInfo(PTHREADINFO ti, PWINDOW_OBJECT WindowObject) +UserFreeWindowInfo(PTHREADINFO ti, PWND Wnd) { PCLIENTINFO ClientInfo = GetWin32ClientInfo(); - PWND Wnd = WindowObject->Wnd; if (!Wnd) return; - if (ClientInfo->CallbackWnd.pvWnd == DesktopHeapAddressToUser(WindowObject->Wnd)) + if (ClientInfo->CallbackWnd.pWnd == DesktopHeapAddressToUser(Wnd)) { ClientInfo->CallbackWnd.hWnd = NULL; - ClientInfo->CallbackWnd.pvWnd = NULL; + ClientInfo->CallbackWnd.pWnd = NULL; } if (Wnd->strName.Buffer != NULL) @@ -319,8 +314,8 @@ UserFreeWindowInfo(PTHREADINFO ti, PWINDOW_OBJECT WindowObject) Wnd->strName.Buffer = NULL; } - DesktopHeapFree(Wnd->head.rpdesk, Wnd); - WindowObject->Wnd = NULL; +// DesktopHeapFree(Wnd->head.rpdesk, Wnd); +// WindowObject->Wnd = NULL; } /*********************************************************************** @@ -332,31 +327,28 @@ UserFreeWindowInfo(PTHREADINFO ti, PWINDOW_OBJECT WindowObject) * done in CreateWindow is undone here and not in DestroyWindow:-P */ -static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window, +static LRESULT co_UserFreeWindow(PWND Window, PPROCESSINFO ProcessData, PTHREADINFO ThreadData, BOOLEAN SendMessages) { HWND *Children; HWND *ChildHandle; - PWINDOW_OBJECT Child; + PWND Child; PMENU_OBJECT Menu; BOOLEAN BelongsToThreadData; - PWND Wnd; ASSERT(Window); - Wnd = Window->Wnd; - - if(Window->state & WINDOWSTATUS_DESTROYING) + if(Window->state2 & WNDS2_INDESTROY) { DPRINT("Tried to call IntDestroyWindow() twice\n"); return 0; } - Window->state |= WINDOWSTATUS_DESTROYING; - Wnd->style &= ~WS_VISIBLE; + Window->state2 |= WNDS2_INDESTROY; + Window->style &= ~WS_VISIBLE; - IntNotifyWinEvent(EVENT_OBJECT_DESTROY, Wnd, OBJID_WINDOW, 0); + IntNotifyWinEvent(EVENT_OBJECT_DESTROY, Window, OBJID_WINDOW, 0); /* remove the window already at this point from the thread window list so we don't get into trouble when destroying the thread windows while we're still @@ -365,12 +357,12 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window, BelongsToThreadData = IntWndBelongsToThread(Window, ThreadData); - IntDeRegisterShellHookWindow(Window->hSelf); + IntDeRegisterShellHookWindow(Window->head.h); if(SendMessages) { /* Send destroy messages */ - IntSendDestroyMsg(Window->hSelf); + IntSendDestroyMsg(Window->head.h); } /* free child windows */ @@ -384,7 +376,7 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window, if(!IntWndBelongsToThread(Child, ThreadData)) { /* send WM_DESTROY messages to windows not belonging to the same thread */ - IntSendDestroyMsg(Child->hSelf); + IntSendDestroyMsg(Child->head.h); } else co_UserFreeWindow(Child, ProcessData, ThreadData, SendMessages); @@ -405,7 +397,7 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window, RDW_VALIDATE | RDW_NOFRAME | RDW_NOERASE | RDW_NOINTERNALPAINT | RDW_NOCHILDREN); if(BelongsToThreadData) - co_IntSendMessage(Window->hSelf, WM_NCDESTROY, 0, 0); + co_IntSendMessage(Window->head.h, WM_NCDESTROY, 0, 0); } DestroyTimersForWindow(ThreadData, Window); HOOK_DestroyThreadHooks(ThreadData->pEThread); // This is needed here too! @@ -414,19 +406,18 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window, MsqRemoveWindowMessagesFromQueue(Window); /* from now on no messages can be sent to this window anymore */ - Window->state |= WINDOWSTATUS_DESTROYED; - Wnd->state |= WNDS_DESTROYED; - Wnd->fnid |= FNID_FREED; + Window->state |= WNDS_DESTROYED; + Window->fnid |= FNID_FREED; /* don't remove the WINDOWSTATUS_DESTROYING bit */ /* reset shell window handles */ if(ThreadData->rpdesk) { - if (Window->hSelf == ThreadData->rpdesk->rpwinstaParent->ShellWindow) + if (Window->head.h == ThreadData->rpdesk->rpwinstaParent->ShellWindow) ThreadData->rpdesk->rpwinstaParent->ShellWindow = NULL; - if (Window->hSelf == ThreadData->rpdesk->rpwinstaParent->ShellListView) + if (Window->head.h == ThreadData->rpdesk->rpwinstaParent->ShellListView) ThreadData->rpdesk->rpwinstaParent->ShellListView = NULL; } @@ -437,21 +428,21 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window, #if 0 /* FIXME */ - WinPosCheckInternalPos(Window->hSelf); - if (Window->hSelf == GetCapture()) + WinPosCheckInternalPos(Window->head.h); + if (Window->head.h == GetCapture()) { ReleaseCapture(); } /* free resources associated with the window */ - TIMER_RemoveWindowTimers(Window->hSelf); + TIMER_RemoveWindowTimers(Window->head.h); #endif - if (!(Wnd->style & WS_CHILD) && Wnd->IDMenu - && (Menu = UserGetMenuObject((HMENU)Wnd->IDMenu))) + if (!(Window->style & WS_CHILD) && Window->IDMenu + && (Menu = UserGetMenuObject((HMENU)Window->IDMenu))) { IntDestroyMenuObject(Menu, TRUE, TRUE); - Wnd->IDMenu = 0; + Window->IDMenu = 0; } if(Window->SystemMenu @@ -471,23 +462,23 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window, IntUnlinkWindow(Window); UserReferenceObject(Window); - UserDeleteObject(Window->hSelf, otWindow); + UserDeleteObject(Window->head.h, otWindow); IntDestroyScrollBars(Window); /* dereference the class */ - IntDereferenceClass(Wnd->pcls, - Window->pti->pDeskInfo, - Window->pti->ppi); - Wnd->pcls = NULL; + IntDereferenceClass(Window->pcls, + Window->head.pti->pDeskInfo, + Window->head.pti->ppi); + Window->pcls = NULL; if(Window->hrgnClip) { GreDeleteObject(Window->hrgnClip); } - ASSERT(Window->Wnd != NULL); - UserFreeWindowInfo(Window->pti, Window); +// ASSERT(Window != NULL); + UserFreeWindowInfo(Window->head.pti, Window); UserDereferenceObject(Window); @@ -497,9 +488,8 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window, } VOID FASTCALL -IntGetWindowBorderMeasures(PWINDOW_OBJECT Window, UINT *cx, UINT *cy) +IntGetWindowBorderMeasures(PWND Wnd, UINT *cx, UINT *cy) { - PWND Wnd = Window->Wnd; if(HAS_DLGFRAME(Wnd->style, Wnd->ExStyle) && !(Wnd->style & WS_MINIMIZE)) { *cx = UserGetSystemMetrics(SM_CXDLGFRAME); @@ -669,17 +659,15 @@ IntSetWindowProc(PWND pWnd, // Move this to user space! BOOL FASTCALL -IntGetWindowInfo(PWINDOW_OBJECT Window, PWINDOWINFO pwi) +IntGetWindowInfo(PWND Wnd, PWINDOWINFO pwi) { - PWND Wnd = Window->Wnd; - pwi->cbSize = sizeof(WINDOWINFO); - pwi->rcWindow = Window->Wnd->rcWindow; - pwi->rcClient = Window->Wnd->rcClient; + pwi->rcWindow = Wnd->rcWindow; + pwi->rcClient = Wnd->rcClient; pwi->dwStyle = Wnd->style; pwi->dwExStyle = Wnd->ExStyle; - pwi->dwWindowStatus = (UserGetForegroundWindow() == Window->hSelf); /* WS_ACTIVECAPTION */ - IntGetWindowBorderMeasures(Window, &pwi->cxWindowBorders, &pwi->cyWindowBorders); + pwi->dwWindowStatus = (UserGetForegroundWindow() == Wnd->head.h); /* WS_ACTIVECAPTION */ + IntGetWindowBorderMeasures(Wnd, &pwi->cxWindowBorders, &pwi->cyWindowBorders); pwi->atomWindowType = (Wnd->pcls ? Wnd->pcls->atomClassName : 0); pwi->wCreatorVersion = 0x400; /* FIXME - return a real version number */ return TRUE; @@ -687,12 +675,11 @@ IntGetWindowInfo(PWINDOW_OBJECT Window, PWINDOWINFO pwi) static BOOL FASTCALL IntSetMenu( - PWINDOW_OBJECT Window, + PWND Wnd, HMENU Menu, BOOL *Changed) { PMENU_OBJECT OldMenu, NewMenu = NULL; - PWND Wnd = Window->Wnd; if ((Wnd->style & (WS_CHILD | WS_POPUP)) == WS_CHILD) { @@ -709,7 +696,7 @@ IntSetMenu( if (Wnd->IDMenu) { OldMenu = IntGetMenuObject((HMENU) Wnd->IDMenu); - ASSERT(NULL == OldMenu || OldMenu->MenuInfo.Wnd == Window->hSelf); + ASSERT(NULL == OldMenu || OldMenu->MenuInfo.Wnd == Wnd->head.h); } else { @@ -744,7 +731,7 @@ IntSetMenu( Wnd->IDMenu = (UINT) Menu; if (NULL != NewMenu) { - NewMenu->MenuInfo.Wnd = Window->hSelf; + NewMenu->MenuInfo.Wnd = Wnd->head.h; IntReleaseMenuObject(NewMenu); } if (NULL != OldMenu) @@ -765,14 +752,14 @@ co_DestroyThreadWindows(struct _ETHREAD *Thread) { PTHREADINFO WThread; PLIST_ENTRY Current; - PWINDOW_OBJECT Wnd; + PWND Wnd; USER_REFERENCE_ENTRY Ref; WThread = (PTHREADINFO)Thread->Tcb.Win32Thread; while (!IsListEmpty(&WThread->WindowListHead)) { Current = WThread->WindowListHead.Flink; - Wnd = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry); + Wnd = CONTAINING_RECORD(Current, WND, ThreadListEntry); DPRINT("thread cleanup: while destroy wnds, wnd=0x%x\n",Wnd); @@ -803,14 +790,14 @@ co_DestroyThreadWindows(struct _ETHREAD *Thread) * \note Does not check the validity of the parameters */ VOID FASTCALL -IntGetClientRect(PWINDOW_OBJECT Window, RECTL *Rect) +IntGetClientRect(PWND Window, RECTL *Rect) { ASSERT( Window ); ASSERT( Rect ); Rect->left = Rect->top = 0; - Rect->right = Window->Wnd->rcClient.right - Window->Wnd->rcClient.left; - Rect->bottom = Window->Wnd->rcClient.bottom - Window->Wnd->rcClient.top; + Rect->right = Window->rcClient.right - Window->rcClient.left; + Rect->bottom = Window->rcClient.bottom - Window->rcClient.top; } @@ -834,7 +821,7 @@ IntGetFocusWindow(VOID) #endif PMENU_OBJECT FASTCALL -IntGetSystemMenu(PWINDOW_OBJECT Window, BOOL bRevert, BOOL RetMenu) +IntGetSystemMenu(PWND Window, BOOL bRevert, BOOL RetMenu) { PMENU_OBJECT Menu, NewMenu = NULL, SysMenu = NULL, ret = NULL; PTHREADINFO W32Thread; @@ -870,7 +857,7 @@ IntGetSystemMenu(PWINDOW_OBJECT Window, BOOL bRevert, BOOL RetMenu) { Window->SystemMenu = NewMenu->MenuInfo.Self; NewMenu->MenuInfo.Flags |= MF_SYSMENU; - NewMenu->MenuInfo.Wnd = Window->hSelf; + NewMenu->MenuInfo.Wnd = Window->head.h; ret = NewMenu; //IntReleaseMenuObject(NewMenu); } @@ -889,7 +876,7 @@ IntGetSystemMenu(PWINDOW_OBJECT Window, BOOL bRevert, BOOL RetMenu) return NULL; } SysMenu->MenuInfo.Flags |= MF_SYSMENU; - SysMenu->MenuInfo.Wnd = Window->hSelf; + SysMenu->MenuInfo.Wnd = Window->head.h; hNewMenu = co_IntLoadSysMenuTemplate(); if(!hNewMenu) { @@ -943,20 +930,18 @@ IntGetSystemMenu(PWINDOW_OBJECT Window, BOOL bRevert, BOOL RetMenu) BOOL FASTCALL -IntIsChildWindow(PWINDOW_OBJECT Parent, PWINDOW_OBJECT BaseWindow) +IntIsChildWindow(PWND Parent, PWND BaseWindow) { - PWINDOW_OBJECT Window; - PWND Wnd; + PWND Window; Window = BaseWindow; while (Window) { - Wnd = Window->Wnd; if (Window == Parent) { return(TRUE); } - if(!(Wnd->style & WS_CHILD)) + if(!(Window->style & WS_CHILD)) { break; } @@ -968,20 +953,18 @@ IntIsChildWindow(PWINDOW_OBJECT Parent, PWINDOW_OBJECT BaseWindow) } BOOL FASTCALL -IntIsWindowVisible(PWINDOW_OBJECT BaseWindow) +IntIsWindowVisible(PWND BaseWindow) { - PWINDOW_OBJECT Window; - PWND Wnd; + PWND Window; Window = BaseWindow; while(Window) { - Wnd = Window->Wnd; - if(!(Wnd->style & WS_CHILD)) + if(!(Window->style & WS_CHILD)) { break; } - if(!(Wnd->style & WS_VISIBLE)) + if(!(Window->style & WS_VISIBLE)) { return FALSE; } @@ -989,7 +972,7 @@ IntIsWindowVisible(PWINDOW_OBJECT BaseWindow) Window = Window->spwndParent; } - if(Window && Wnd->style & WS_VISIBLE) + if(Window && Window->style & WS_VISIBLE) { return TRUE; } @@ -997,77 +980,126 @@ IntIsWindowVisible(PWINDOW_OBJECT BaseWindow) return FALSE; } -VOID FASTCALL -IntLinkWnd( - PWND Wnd, - PWND WndParent, - PWND WndPrevSibling) /* set to NULL if top sibling */ -{ - Wnd->spwndParent = WndParent; - if ((Wnd->spwndPrev = WndPrevSibling)) - { - /* link after WndPrevSibling */ - if ((Wnd->spwndNext = WndPrevSibling->spwndNext)) - Wnd->spwndNext->spwndPrev = Wnd; - Wnd->spwndPrev->spwndNext = Wnd; - } - else - { - /* link at top */ - if ((Wnd->spwndNext = WndParent->spwndChild)) - Wnd->spwndNext->spwndPrev = Wnd; - - WndParent->spwndChild = Wnd; - } - -} - -/* link the window into siblings and parent. children are kept in place. */ +/* + link the window into siblings list + children and parent are kept in place. +*/ VOID FASTCALL IntLinkWindow( - PWINDOW_OBJECT Wnd, - PWINDOW_OBJECT WndParent, - PWINDOW_OBJECT WndPrevSibling /* set to NULL if top sibling */ + PWND Wnd, + PWND WndInsertAfter /* set to NULL if top sibling */ ) { - PWINDOW_OBJECT Parent; - - IntLinkWnd(Wnd->Wnd, - WndParent->Wnd, - WndPrevSibling ? WndPrevSibling->Wnd : NULL); - - Wnd->spwndParent = WndParent; - if ((Wnd->spwndPrev = WndPrevSibling)) + if ((Wnd->spwndPrev = WndInsertAfter)) { - /* link after WndPrevSibling */ - if ((Wnd->spwndNext = WndPrevSibling->spwndNext)) + /* link after WndInsertAfter */ + if ((Wnd->spwndNext = WndInsertAfter->spwndNext)) Wnd->spwndNext->spwndPrev = Wnd; + Wnd->spwndPrev->spwndNext = Wnd; } else { /* link at top */ - Parent = Wnd->spwndParent; - if ((Wnd->spwndNext = WndParent->spwndChild)) + if ((Wnd->spwndNext = Wnd->spwndParent->spwndChild)) Wnd->spwndNext->spwndPrev = Wnd; - else if (Parent) - { - Parent->spwndChild = Wnd; - return; - } - if(Parent) - { - Parent->spwndChild = Wnd; - } - } + Wnd->spwndParent->spwndChild = Wnd; + } +} + + +VOID FASTCALL IntLinkHwnd(PWND Wnd, HWND hWndPrev) +{ + if (hWndPrev == HWND_NOTOPMOST) + { + if (!(Wnd->ExStyle & WS_EX_TOPMOST) && + (Wnd->ExStyle2 & WS_EX2_LINKED)) return; /* nothing to do */ + Wnd->ExStyle &= ~WS_EX_TOPMOST; + hWndPrev = HWND_TOP; /* fallback to the HWND_TOP case */ + } + + IntUnlinkWindow(Wnd); /* unlink it from the previous location */ + + if (hWndPrev == HWND_BOTTOM) + { + /* Link in the bottom of the list */ + PWND WndInsertAfter; + + WndInsertAfter = Wnd->spwndParent->spwndChild; + while( WndInsertAfter && WndInsertAfter->spwndNext) + WndInsertAfter = WndInsertAfter->spwndNext; + + IntLinkWindow(Wnd, WndInsertAfter); + Wnd->ExStyle &= ~WS_EX_TOPMOST; + } + else if (hWndPrev == HWND_TOPMOST) + { + /* Link in the top of the list */ + IntLinkWindow(Wnd, NULL); + + Wnd->ExStyle |= WS_EX_TOPMOST; + } + else if (hWndPrev == HWND_TOP) + { + /* Link it after the last topmost window */ + PWND WndInsertBefore; + + WndInsertBefore = Wnd->spwndParent->spwndChild; + + if (!(Wnd->ExStyle & WS_EX_TOPMOST)) /* put it above the first non-topmost window */ + { + while (WndInsertBefore != NULL && WndInsertBefore->spwndNext != NULL) + { + if (!(WndInsertBefore->ExStyle & WS_EX_TOPMOST)) break; + if (WndInsertBefore == Wnd->spwndOwner) /* keep it above owner */ + { + Wnd->ExStyle |= WS_EX_TOPMOST; + break; + } + WndInsertBefore = WndInsertBefore->spwndNext; + } + } + + IntLinkWindow(Wnd, WndInsertBefore ? WndInsertBefore->spwndPrev : NULL); + } + else + { + /* Link it after hWndPrev */ + PWND WndInsertAfter; + + WndInsertAfter = UserGetWindowObject(hWndPrev); + /* Are we called with an erroneous handle */ + if(WndInsertAfter == NULL) + { + /* Link in a default position */ + IntLinkHwnd(Wnd, HWND_TOP); + return; + } + + IntLinkWindow(Wnd, WndInsertAfter); + + /* Fix the WS_EX_TOPMOST flag */ + if (!(WndInsertAfter->ExStyle & WS_EX_TOPMOST)) + { + Wnd->ExStyle &= ~WS_EX_TOPMOST; + } + else + { + if(WndInsertAfter->spwndNext && + WndInsertAfter->spwndNext->ExStyle & WS_EX_TOPMOST) + { + Wnd->ExStyle |= WS_EX_TOPMOST; + } + } + } } HWND FASTCALL IntSetOwner(HWND hWnd, HWND hWndNewOwner) { - PWINDOW_OBJECT Wnd, WndOldOwner, WndNewOwner; + PWND Wnd, WndOldOwner, WndNewOwner; HWND ret; Wnd = IntGetWindowObject(hWnd); @@ -1076,28 +1108,25 @@ IntSetOwner(HWND hWnd, HWND hWndNewOwner) WndOldOwner = Wnd->spwndOwner; - ret = WndOldOwner ? WndOldOwner->hSelf : 0; + ret = WndOldOwner ? WndOldOwner->head.h : 0; if((WndNewOwner = UserGetWindowObject(hWndNewOwner))) { Wnd->spwndOwner= WndNewOwner; - Wnd->Wnd->spwndOwner = WndNewOwner->Wnd; } else { Wnd->spwndOwner = NULL; - Wnd->Wnd->spwndOwner = NULL; } UserDereferenceObject(Wnd); return ret; } -PWINDOW_OBJECT FASTCALL -co_IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) +PWND FASTCALL +co_IntSetParent(PWND Wnd, PWND WndNewParent) { - PWINDOW_OBJECT WndOldParent, Sibling, InsertAfter; -// HWND hWnd, hWndNewParent; + PWND WndOldParent; BOOL WasVisible; ASSERT(Wnd); @@ -1105,9 +1134,6 @@ co_IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) ASSERT_REFS_CO(Wnd); ASSERT_REFS_CO(WndNewParent); -// hWnd = Wnd->hSelf; -// hWndNewParent = WndNewParent->hSelf; - /* Some applications try to set a child as a parent */ if (IntIsChildWindow(Wnd, WndNewParent)) { @@ -1121,12 +1147,8 @@ co_IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) */ WasVisible = co_WinPosShowWindow(Wnd, SW_HIDE); -// /* Validate that window and parent still exist */ -// if (!IntIsWindow(hWnd) || !IntIsWindow(hWndNewParent)) -// return NULL; - /* Window must belong to current process */ - if (Wnd->pti->pEThread->ThreadsProcess != PsGetCurrentProcess()) + if (Wnd->head.pti->pEThread->ThreadsProcess != PsGetCurrentProcess()) return NULL; WndOldParent = Wnd->spwndParent; @@ -1135,28 +1157,15 @@ co_IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) if (WndNewParent != WndOldParent) { + /* Unlink the window from the siblings list */ IntUnlinkWindow(Wnd); - InsertAfter = NULL; - if (0 == (Wnd->Wnd->ExStyle & WS_EX_TOPMOST)) - { - /* Not a TOPMOST window, put after TOPMOSTs of new parent */ - Sibling = WndNewParent->spwndChild; - while (NULL != Sibling && 0 != (Sibling->Wnd->ExStyle & WS_EX_TOPMOST)) - { - InsertAfter = Sibling; - Sibling = Sibling->spwndNext; - } - } - if (NULL == InsertAfter) - { - IntLinkWindow(Wnd, WndNewParent, InsertAfter /*prev sibling*/); - } - else - { -// UserReferenceObject(InsertAfter); - IntLinkWindow(Wnd, WndNewParent, InsertAfter /*prev sibling*/); -// UserDereferenceObject(InsertAfter); - } + + /* Set the new parent */ + Wnd->spwndParent = WndNewParent; + + /* Link the window with its new siblings*/ + IntLinkHwnd(Wnd, HWND_TOP); + } /* @@ -1164,7 +1173,7 @@ co_IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) * in the z-order and send the expected WM_WINDOWPOSCHANGING and * WM_WINDOWPOSCHANGED notification messages. */ - co_WinPosSetWindowPos(Wnd, (0 == (Wnd->Wnd->ExStyle & WS_EX_TOPMOST) ? HWND_TOP : HWND_TOPMOST), + co_WinPosSetWindowPos(Wnd, (0 == (Wnd->ExStyle & WS_EX_TOPMOST) ? HWND_TOP : HWND_TOPMOST), 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | (WasVisible ? SWP_SHOWWINDOW : 0)); @@ -1173,28 +1182,11 @@ co_IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent) * for WM_WINDOWPOSCHANGED) in Windows, should probably remove SWP_NOMOVE */ - /* - * Validate that the old parent still exist, since it migth have been - * destroyed during the last callbacks to user-mode - */ -// if(WndOldParent) -// { -// if(!IntIsWindow(WndOldParent->hSelf)) -// { -// UserDereferenceObject(WndOldParent); -// return NULL; -// } - - /* don't dereference the window object here, it must be done by the caller - of IntSetParent() */ -// return WndOldParent; -// } - - return WndOldParent;//NULL; + return WndOldParent; } BOOL FASTCALL -IntSetSystemMenu(PWINDOW_OBJECT Window, PMENU_OBJECT Menu) +IntSetSystemMenu(PWND Window, PMENU_OBJECT Menu) { PMENU_OBJECT OldMenu; if(Window->SystemMenu) @@ -1219,57 +1211,35 @@ IntSetSystemMenu(PWINDOW_OBJECT Window, PMENU_OBJECT Menu) return TRUE; } -/* unlink the window from siblings and parent. children are kept in place. */ +/* unlink the window from siblings. children and parent are kept in place. */ VOID FASTCALL -IntUnlinkWnd(PWND Wnd) +IntUnlinkWindow(PWND Wnd) { if (Wnd->spwndNext) - Wnd->spwndNext->spwndPrev = Wnd->spwndPrev; - + Wnd->spwndNext->spwndPrev = Wnd->spwndPrev; + if (Wnd->spwndPrev) - Wnd->spwndPrev->spwndNext = Wnd->spwndNext; - + Wnd->spwndPrev->spwndNext = Wnd->spwndNext; + if (Wnd->spwndParent && Wnd->spwndParent->spwndChild == Wnd) - Wnd->spwndParent->spwndChild = Wnd->spwndNext; - - Wnd->spwndPrev = Wnd->spwndNext = Wnd->spwndParent = NULL; -} - - -/* unlink the window from siblings and parent. children are kept in place. */ -VOID FASTCALL -IntUnlinkWindow(PWINDOW_OBJECT Wnd) -{ - PWINDOW_OBJECT WndParent = Wnd->spwndParent; - - IntUnlinkWnd(Wnd->Wnd); - - if (Wnd->spwndNext) - Wnd->spwndNext->spwndPrev = Wnd->spwndPrev; - - if (Wnd->spwndPrev) - Wnd->spwndPrev->spwndNext = Wnd->spwndNext; - else if (WndParent && WndParent->spwndChild == Wnd) - WndParent->spwndChild = Wnd->spwndNext; - - Wnd->spwndPrev = Wnd->spwndNext = Wnd->spwndParent = NULL; + Wnd->spwndParent->spwndChild = Wnd->spwndNext; + + Wnd->spwndPrev = Wnd->spwndNext = NULL; } BOOL FASTCALL -IntIsWindowInDestroy(PWINDOW_OBJECT Window) +IntIsWindowInDestroy(PWND Window) { - return ((Window->state & WINDOWSTATUS_DESTROYING) == WINDOWSTATUS_DESTROYING); + return ((Window->state2 & WNDS2_INDESTROY) == WNDS2_INDESTROY); } BOOL FASTCALL -IntGetWindowPlacement(PWINDOW_OBJECT Window, WINDOWPLACEMENT *lpwndpl) +IntGetWindowPlacement(PWND Wnd, WINDOWPLACEMENT *lpwndpl) { - PWND Wnd; POINT Size; - Wnd = Window->Wnd; if (!Wnd) return FALSE; if(lpwndpl->length != sizeof(WINDOWPLACEMENT)) @@ -1282,7 +1252,7 @@ IntGetWindowPlacement(PWINDOW_OBJECT Window, WINDOWPLACEMENT *lpwndpl) { lpwndpl->showCmd = SW_HIDE; } - else if (0 != (Window->state & WINDOWOBJECT_RESTOREMAX) || + else if (0 != (Wnd->state2 & WNDS2_MAXIMIZEBUTTONDOWN) || 0 != (Wnd->style & WS_MAXIMIZE)) { lpwndpl->showCmd = SW_MAXIMIZE; @@ -1298,7 +1268,7 @@ IntGetWindowPlacement(PWINDOW_OBJECT Window, WINDOWPLACEMENT *lpwndpl) Size.x = Wnd->rcWindow.left; Size.y = Wnd->rcWindow.top; - WinPosInitInternalPos(Window, &Size, + WinPosInitInternalPos(Wnd, &Size, &Wnd->rcWindow); lpwndpl->rcNormalPosition = Wnd->InternalPos.NormalRect; @@ -1355,7 +1325,7 @@ NtUserBuildHwndList( if (hwndParent || !dwThreadId) { PDESKTOP Desktop; - PWINDOW_OBJECT Parent, Window; + PWND Parent, Window; if(!hwndParent) { @@ -1397,7 +1367,7 @@ NtUserBuildHwndList( _SEH2_TRY { ProbeForWrite(pWnd, sizeof(HWND), 1); - *pWnd = Window->hSelf; + *pWnd = Window->head.h; pWnd++; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) @@ -1442,7 +1412,7 @@ NtUserBuildHwndList( PETHREAD Thread; PTHREADINFO W32Thread; PLIST_ENTRY Current; - PWINDOW_OBJECT Window; + PWND Window; Status = PsLookupThreadByThreadId((HANDLE)dwThreadId, &Thread); if(!NT_SUCCESS(Status)) @@ -1459,14 +1429,14 @@ NtUserBuildHwndList( Current = W32Thread->WindowListHead.Flink; while(Current != &(W32Thread->WindowListHead)) { - Window = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry); + Window = CONTAINING_RECORD(Current, WND, ThreadListEntry); ASSERT(Window); if(bChildren || Window->spwndOwner != NULL) { if(dwCount < *pBufSize && pWnd) { - Status = MmCopyToCaller(pWnd++, &Window->hSelf, sizeof(HWND)); + Status = MmCopyToCaller(pWnd++, &Window->head.h, sizeof(HWND)); if(!NT_SUCCESS(Status)) { SetLastNtError(Status); @@ -1495,7 +1465,7 @@ NtUserChildWindowFromPointEx(HWND hwndParent, LONG y, UINT uiFlags) { - PWINDOW_OBJECT Parent; + PWND Parent; POINTL Pt; HWND Ret; HWND *List, *phWnd; @@ -1508,10 +1478,10 @@ NtUserChildWindowFromPointEx(HWND hwndParent, Pt.x = x; Pt.y = y; - if(Parent->hSelf != IntGetDesktopWindow()) + if(Parent->head.h != IntGetDesktopWindow()) { - Pt.x += Parent->Wnd->rcClient.left; - Pt.y += Parent->Wnd->rcClient.top; + Pt.x += Parent->rcClient.left; + Pt.y += Parent->rcClient.top; } if(!IntPtInWindow(Parent, Pt.x, Pt.y)) @@ -1519,31 +1489,29 @@ NtUserChildWindowFromPointEx(HWND hwndParent, return NULL; } - Ret = Parent->hSelf; + Ret = Parent->head.h; if((List = IntWinListChildren(Parent))) { for(phWnd = List; *phWnd; phWnd++) { - PWINDOW_OBJECT Child; - PWND ChildWnd; + PWND Child; if((Child = UserGetWindowObject(*phWnd))) { - ChildWnd = Child->Wnd; - if(!(ChildWnd->style & WS_VISIBLE) && (uiFlags & CWP_SKIPINVISIBLE)) + if(!(Child->style & WS_VISIBLE) && (uiFlags & CWP_SKIPINVISIBLE)) { continue; } - if((ChildWnd->style & WS_DISABLED) && (uiFlags & CWP_SKIPDISABLED)) + if((Child->style & WS_DISABLED) && (uiFlags & CWP_SKIPDISABLED)) { continue; } - if((ChildWnd->ExStyle & WS_EX_TRANSPARENT) && (uiFlags & CWP_SKIPTRANSPARENT)) + if((Child->ExStyle & WS_EX_TRANSPARENT) && (uiFlags & CWP_SKIPTRANSPARENT)) { continue; } if(IntPtInWindow(Child, Pt.x, Pt.y)) { - Ret = Child->hSelf; + Ret = Child->head.h; break; } } @@ -1554,18 +1522,34 @@ NtUserChildWindowFromPointEx(HWND hwndParent, return Ret; } +static void IntSendParentNotify( PWND pWindow, UINT msg ) +{ + if ( (pWindow->style & (WS_CHILD | WS_POPUP)) == WS_CHILD && + !(pWindow->style & WS_EX_NOPARENTNOTIFY)) + { + if (pWindow->spwndParent && pWindow->spwndParent != UserGetDesktopWindow()) + { + co_IntSendMessage( pWindow->spwndParent->head.h, + WM_PARENTNOTIFY, + MAKEWPARAM( msg, pWindow->IDMenu), + (LPARAM)pWindow->head.h ); + } + } +} + void FASTCALL -IntFixWindowCoordinates(CREATESTRUCTW* Cs, PWINDOW_OBJECT ParentWindow, DWORD* dwShowMode) +IntFixWindowCoordinates(CREATESTRUCTW* Cs, PWND ParentWindow, DWORD* dwShowMode) { #define IS_DEFAULT(x) ((x) == CW_USEDEFAULT || (x) == (SHORT)0x8000) /* default positioning for overlapped windows */ if(!(Cs->style & (WS_POPUP | WS_CHILD))) { - RECTL WorkArea; + PMONITOR pMonitor; PRTL_USER_PROCESS_PARAMETERS ProcessParams; - UserSystemParametersInfo(SPI_GETWORKAREA, 0, &WorkArea, 0); + pMonitor = IntGetPrimaryMonitor(); + ASSERT(pMonitor); ProcessParams = PsGetCurrentProcess()->Peb->ProcessParameters; @@ -1580,8 +1564,17 @@ IntFixWindowCoordinates(CREATESTRUCTW* Cs, PWINDOW_OBJECT ParentWindow, DWORD* d } else { - Cs->x = WorkArea.left; - Cs->y = WorkArea.top; + Cs->x = pMonitor->cWndStack * (UserGetSystemMetrics(SM_CXSIZE) + UserGetSystemMetrics(SM_CXFRAME)); + Cs->y = pMonitor->cWndStack * (UserGetSystemMetrics(SM_CYSIZE) + UserGetSystemMetrics(SM_CYFRAME)); + if (Cs->x > ((pMonitor->rcWork.right - pMonitor->rcWork.left) / 4) || + Cs->y > ((pMonitor->rcWork.bottom - pMonitor->rcWork.top) / 4)) + { + /* reset counter and position */ + Cs->x = 0; + Cs->y = 0; + pMonitor->cWndStack = 0; + } + pMonitor->cWndStack++; } } @@ -1594,8 +1587,8 @@ IntFixWindowCoordinates(CREATESTRUCTW* Cs, PWINDOW_OBJECT ParentWindow, DWORD* d } else { - Cs->cx = (WorkArea.right - WorkArea.left) * 3 / 4 - Cs->x; - Cs->cy = (WorkArea.bottom - WorkArea.top) * 3 / 4 - Cs->y; + Cs->cx = (pMonitor->rcWork.right - pMonitor->rcWork.left) * 3 / 4; + Cs->cy = (pMonitor->rcWork.bottom - pMonitor->rcWork.top) * 3 / 4; } } /* neither x nor cx are default. Check the y values . @@ -1605,7 +1598,7 @@ IntFixWindowCoordinates(CREATESTRUCTW* Cs, PWINDOW_OBJECT ParentWindow, DWORD* d else if (IS_DEFAULT(Cs->cy)) { DPRINT("Strange use of CW_USEDEFAULT in nHeight\n"); - Cs->cy = (WorkArea.bottom - WorkArea.top) * 3 / 4 - Cs->y; + Cs->cy = (pMonitor->rcWork.bottom - pMonitor->rcWork.top) * 3 / 4; } } else @@ -1627,14 +1620,13 @@ IntFixWindowCoordinates(CREATESTRUCTW* Cs, PWINDOW_OBJECT ParentWindow, DWORD* d } /* Allocates and initializes a window*/ -PWINDOW_OBJECT FASTCALL IntCreateWindow(CREATESTRUCTW* Cs, +PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs, PLARGE_STRING WindowName, PCLS Class, - PWINDOW_OBJECT ParentWindow, - PWINDOW_OBJECT OwnerWindow) + PWND ParentWindow, + PWND OwnerWindow) { - PWND Wnd = NULL; - PWINDOW_OBJECT Window; + PWND pWnd = NULL; HWND hWnd; PTHREADINFO pti = NULL; PMENU_OBJECT SystemMenu; @@ -1656,66 +1648,50 @@ PWINDOW_OBJECT FASTCALL IntCreateWindow(CREATESTRUCTW* Cs, Cs->dwExStyle &= ~WS_EX_SETANSICREATOR; /* Allocate the new window */ - Window = (PWINDOW_OBJECT) UserCreateObject( gHandleTable, - pti->rpdesk, - (PHANDLE)&hWnd, - otWindow, - sizeof(WINDOW_OBJECT)); - if (!Window) + pWnd = (PWND) UserCreateObject( gHandleTable, + pti->rpdesk, + (PHANDLE)&hWnd, + otWindow, + sizeof(WND) + Class->cbwndExtra); + + if (!pWnd) { goto AllocError; } - Wnd = DesktopHeapAlloc(pti->rpdesk, sizeof(WND) + Class->cbwndExtra); - - if (!Wnd) - { - goto AllocError; - } - - RtlZeroMemory(Wnd, sizeof(WND) + Class->cbwndExtra); - DPRINT("Created object with handle %X\n", hWnd); if (NULL == pti->rpdesk->DesktopWindow) { /* If there is no desktop window yet, we must be creating it */ pti->rpdesk->DesktopWindow = hWnd; - pti->rpdesk->pDeskInfo->spwnd = Wnd; + pti->rpdesk->pDeskInfo->spwnd = pWnd; } /* * Fill out the structure describing it. */ - Window->Wnd = Wnd; - Window->pti = pti; - Window->hSelf = hWnd; - Window->spwndParent = ParentWindow; - Window->spwndOwner = OwnerWindow; + /* Remember, pWnd->head is setup in object.c ...*/ + pWnd->spwndParent = ParentWindow; + pWnd->spwndOwner = OwnerWindow; + pWnd->fnid = 0; + pWnd->hWndLastActive = hWnd; + pWnd->state2 |= WNDS2_WIN40COMPAT; + pWnd->pcls = Class; + pWnd->hModule = Cs->hInstance; + pWnd->style = Cs->style & ~WS_VISIBLE; + pWnd->ExStyle = Cs->dwExStyle; + pWnd->cbwndExtra = pWnd->pcls->cbwndExtra; - Wnd->head.h = hWnd; - Wnd->head.pti = pti; - Wnd->head.rpdesk = pti->rpdesk; - Wnd->fnid = 0; - Wnd->hWndLastActive = hWnd; - Wnd->state2 |= WNDS2_WIN40COMPAT; - Wnd->pcls = Class; - Wnd->hModule = Cs->hInstance; - Wnd->style = Cs->style & ~WS_VISIBLE; - Wnd->ExStyle = Cs->dwExStyle; - Wnd->cbwndExtra = Wnd->pcls->cbwndExtra; - Wnd->spwndOwner = OwnerWindow ? OwnerWindow->Wnd : NULL; - Wnd->spwndParent = ParentWindow ? ParentWindow->Wnd : NULL; - - IntReferenceMessageQueue(Window->pti->MessageQueue); - if (Wnd->spwndParent != NULL && Cs->hwndParent != 0) + IntReferenceMessageQueue(pWnd->head.pti->MessageQueue); + if (pWnd->spwndParent != NULL && Cs->hwndParent != 0) { - Wnd->HideFocus = Wnd->spwndParent->HideFocus; - Wnd->HideAccel = Wnd->spwndParent->HideAccel; + pWnd->HideFocus = pWnd->spwndParent->HideFocus; + pWnd->HideAccel = pWnd->spwndParent->HideAccel; } - if (Wnd->pcls->CSF_flags & CSF_SERVERSIDEPROC) - Wnd->state |= WNDS_SERVERSIDEWINDOWPROC; + if (pWnd->pcls->CSF_flags & CSF_SERVERSIDEPROC) + pWnd->state |= WNDS_SERVERSIDEWINDOWPROC; /* BugBoy Comments: Comment below say that System classes are always created as UNICODE. In windows, creating a window with the ANSI version of CreateWindow @@ -1726,31 +1702,31 @@ PWINDOW_OBJECT FASTCALL IntCreateWindow(CREATESTRUCTW* Cs, see what problems this would cause.*/ // Set WndProc from Class. - Wnd->lpfnWndProc = Wnd->pcls->lpfnWndProc; + pWnd->lpfnWndProc = pWnd->pcls->lpfnWndProc; // GetWindowProc, test for non server side default classes and set WndProc. - if ( Wnd->pcls->fnid <= FNID_GHOST && Wnd->pcls->fnid >= FNID_BUTTON ) + if ( pWnd->pcls->fnid <= FNID_GHOST && pWnd->pcls->fnid >= FNID_BUTTON ) { if (bUnicodeWindow) { - if (GETPFNCLIENTA(Wnd->pcls->fnid) == Wnd->lpfnWndProc) - Wnd->lpfnWndProc = GETPFNCLIENTW(Wnd->pcls->fnid); + if (GETPFNCLIENTA(pWnd->pcls->fnid) == pWnd->lpfnWndProc) + pWnd->lpfnWndProc = GETPFNCLIENTW(pWnd->pcls->fnid); } else { - if (GETPFNCLIENTW(Wnd->pcls->fnid) == Wnd->lpfnWndProc) - Wnd->lpfnWndProc = GETPFNCLIENTA(Wnd->pcls->fnid); + if (GETPFNCLIENTW(pWnd->pcls->fnid) == pWnd->lpfnWndProc) + pWnd->lpfnWndProc = GETPFNCLIENTA(pWnd->pcls->fnid); } } // If not an Unicode caller, set Ansi creator bit. - if (!bUnicodeWindow) Wnd->state |= WNDS_ANSICREATOR; + if (!bUnicodeWindow) pWnd->state |= WNDS_ANSICREATOR; // Clone Class Ansi/Unicode proc type. - if (Wnd->pcls->CSF_flags & CSF_ANSIPROC) + if (pWnd->pcls->CSF_flags & CSF_ANSIPROC) { - Wnd->state |= WNDS_ANSIWINDOWPROC; - Wnd->Unicode = FALSE; + pWnd->state |= WNDS_ANSIWINDOWPROC; + pWnd->Unicode = FALSE; } else { /* @@ -1768,13 +1744,13 @@ PWINDOW_OBJECT FASTCALL IntCreateWindow(CREATESTRUCTW* Cs, Class->atomClassName == gpsi->atomSysClass[ICLS_MDICLIENT] || Class->atomClassName == gpsi->atomSysClass[ICLS_STATIC] ) ) { // Override Class and set the window Ansi WndProc. - Wnd->state |= WNDS_ANSIWINDOWPROC; - Wnd->Unicode = FALSE; + pWnd->state |= WNDS_ANSIWINDOWPROC; + pWnd->Unicode = FALSE; } else { // Set the window Unicode WndProc. - Wnd->state &= ~WNDS_ANSIWINDOWPROC; - Wnd->Unicode = TRUE; + pWnd->state &= ~WNDS_ANSIWINDOWPROC; + pWnd->Unicode = TRUE; } } @@ -1784,8 +1760,7 @@ PWINDOW_OBJECT FASTCALL IntCreateWindow(CREATESTRUCTW* Cs, if (Class->atomClassName == gpsi->atomSysClass[ICLS_EDIT]) { PCALLPROCDATA CallProc; - //CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, bUnicodeWindow, Wnd->ti->ppi); - CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, Wnd->Unicode , Wnd->head.pti->ppi); + CallProc = CreateCallProc(NULL, pWnd->lpfnWndProc, pWnd->Unicode , pWnd->head.pti->ppi); if (!CallProc) { @@ -1794,50 +1769,50 @@ PWINDOW_OBJECT FASTCALL IntCreateWindow(CREATESTRUCTW* Cs, } else { - UserAddCallProcToClass(Wnd->pcls, CallProc); + UserAddCallProcToClass(pWnd->pcls, CallProc); } } - InitializeListHead(&Wnd->PropListHead); + InitializeListHead(&pWnd->PropListHead); if ( WindowName->Buffer != NULL && WindowName->Length > 0 ) { - Wnd->strName.Buffer = DesktopHeapAlloc(Wnd->head.rpdesk, + pWnd->strName.Buffer = DesktopHeapAlloc(pWnd->head.rpdesk, WindowName->Length + sizeof(UNICODE_NULL)); - if (Wnd->strName.Buffer == NULL) + if (pWnd->strName.Buffer == NULL) { goto AllocError; } - RtlCopyMemory(Wnd->strName.Buffer, WindowName->Buffer, WindowName->Length); - Wnd->strName.Buffer[WindowName->Length / sizeof(WCHAR)] = L'\0'; - Wnd->strName.Length = WindowName->Length; + RtlCopyMemory(pWnd->strName.Buffer, WindowName->Buffer, WindowName->Length); + pWnd->strName.Buffer[WindowName->Length / sizeof(WCHAR)] = L'\0'; + pWnd->strName.Length = WindowName->Length; } /* Correct the window style. */ - if ((Wnd->style & (WS_CHILD | WS_POPUP)) != WS_CHILD) + if ((pWnd->style & (WS_CHILD | WS_POPUP)) != WS_CHILD) { - Wnd->style |= WS_CLIPSIBLINGS; - if (!(Wnd->style & WS_POPUP)) + pWnd->style |= WS_CLIPSIBLINGS; + if (!(pWnd->style & WS_POPUP)) { - Wnd->style |= WS_CAPTION; - Window->state |= WINDOWOBJECT_NEED_SIZE; + pWnd->style |= WS_CAPTION; + pWnd->state |= WNDS_SENDSIZEMOVEMSGS; } } - if ((Wnd->ExStyle & WS_EX_DLGMODALFRAME) || - (Wnd->style & (WS_DLGFRAME | WS_THICKFRAME))) - Wnd->ExStyle |= WS_EX_WINDOWEDGE; + if ((pWnd->ExStyle & WS_EX_DLGMODALFRAME) || + (pWnd->style & (WS_DLGFRAME | WS_THICKFRAME))) + pWnd->ExStyle |= WS_EX_WINDOWEDGE; else - Wnd->ExStyle &= ~WS_EX_WINDOWEDGE; + pWnd->ExStyle &= ~WS_EX_WINDOWEDGE; /* create system menu */ if((Cs->style & WS_SYSMENU) )//&& (dwStyle & WS_CAPTION) == WS_CAPTION) { - SystemMenu = IntGetSystemMenu(Window, TRUE, TRUE); + SystemMenu = IntGetSystemMenu(pWnd, TRUE, TRUE); if(SystemMenu) { - Window->SystemMenu = SystemMenu->MenuInfo.Self; + pWnd->SystemMenu = SystemMenu->MenuInfo.Self; IntReleaseMenuObject(SystemMenu); } } @@ -1846,51 +1821,48 @@ PWINDOW_OBJECT FASTCALL IntCreateWindow(CREATESTRUCTW* Cs, if ((Cs->style & (WS_CHILD | WS_POPUP)) != WS_CHILD) { if (Cs->hMenu) - IntSetMenu(Window, Cs->hMenu, &MenuChanged); - else if (Wnd->pcls->lpszMenuName) // Take it from the parent. + IntSetMenu(pWnd, Cs->hMenu, &MenuChanged); + else if (pWnd->pcls->lpszMenuName) // Take it from the parent. { UNICODE_STRING MenuName; HMENU hMenu; - if (IS_INTRESOURCE(Wnd->pcls->lpszMenuName)) + if (IS_INTRESOURCE(pWnd->pcls->lpszMenuName)) { MenuName.Length = 0; MenuName.MaximumLength = 0; - MenuName.Buffer = Wnd->pcls->lpszMenuName; + MenuName.Buffer = pWnd->pcls->lpszMenuName; } else { - RtlInitUnicodeString( &MenuName, Wnd->pcls->lpszMenuName); + RtlInitUnicodeString( &MenuName, pWnd->pcls->lpszMenuName); } - hMenu = co_IntCallLoadMenu( Wnd->pcls->hModule, &MenuName); - if (hMenu) IntSetMenu(Window, hMenu, &MenuChanged); + hMenu = co_IntCallLoadMenu( pWnd->pcls->hModule, &MenuName); + if (hMenu) IntSetMenu(pWnd, hMenu, &MenuChanged); } } else // Not a child - Wnd->IDMenu = (UINT) Cs->hMenu; + pWnd->IDMenu = (UINT) Cs->hMenu; /* Insert the window into the thread's window list. */ - InsertTailList (&pti->WindowListHead, &Window->ThreadListEntry); + InsertTailList (&pti->WindowListHead, &pWnd->ThreadListEntry); /* Handle "CS_CLASSDC", it is tested first. */ - if ( (Wnd->pcls->style & CS_CLASSDC) && !(Wnd->pcls->pdce) ) + if ( (pWnd->pcls->style & CS_CLASSDC) && !(pWnd->pcls->pdce) ) { /* One DCE per class to have CLASS. */ - Wnd->pcls->pdce = DceAllocDCE( Window, DCE_CLASS_DC ); + pWnd->pcls->pdce = DceAllocDCE( pWnd, DCE_CLASS_DC ); } - else if ( Wnd->pcls->style & CS_OWNDC) + else if ( pWnd->pcls->style & CS_OWNDC) { /* Allocate a DCE for this window. */ - DceAllocDCE(Window, DCE_WINDOW_DC); + DceAllocDCE(pWnd, DCE_WINDOW_DC); } - return Window; + return pWnd; AllocError: - if(Window) - UserDereferenceObject(Window); - - if(Wnd) - DesktopHeapFree(Wnd->head.rpdesk, Wnd); + if(pWnd) + UserDereferenceObject(pWnd); SetLastNtError(STATUS_INSUFFICIENT_RESOURCES); return NULL; @@ -1904,11 +1876,10 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs, PUNICODE_STRING ClassName, PLARGE_STRING WindowName) { - PWINDOW_OBJECT Window = NULL, ParentWindow = NULL, OwnerWindow; + PWND Window = NULL, ParentWindow = NULL, OwnerWindow; HWND hWnd, hWndParent, hWndOwner; DWORD dwStyle; PWINSTATION_OBJECT WinSta; - PWND Wnd = NULL; PCLS Class = NULL; SIZE Size; POINT MaxPos; @@ -1985,25 +1956,23 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs, RETURN(0); } - Wnd = Window->Wnd; - hWnd = Window->hSelf; + hWnd = Window->head.h; UserRefObjectCo(Window, &Ref); ObDereferenceObject(WinSta); /* Call the WH_CBT hook */ dwStyle = Cs->style; - Cs->style = Wnd->style; /* HCBT_CREATEWND needs the real window style */ + Cs->style = Window->style; /* HCBT_CREATEWND needs the real window style */ CbtCreate.lpcs = Cs; CbtCreate.hwndInsertAfter = HWND_TOP; - if (ISITHOOKED(WH_CBT)) + + if (co_HOOK_CallHooks(WH_CBT, HCBT_CREATEWND, (WPARAM) hWnd, (LPARAM) &CbtCreate)) { - if (co_HOOK_CallHooks(WH_CBT, HCBT_CREATEWND, (WPARAM) hWnd, (LPARAM) &CbtCreate)) - { - DPRINT1("HCBT_CREATEWND hook failed!\n"); - RETURN( (PWND) NULL); - } + DPRINT1("HCBT_CREATEWND hook failed!\n"); + RETURN( (PWND) NULL); } + Cs->style = dwStyle; /* NCCREATE and WM_NCCALCSIZE need the original values*/ /* Send the WM_GETMINMAXINFO message*/ @@ -2021,63 +1990,31 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs, if (Size.cy < MinTrack.y) Size.cy = MinTrack.y; } - Wnd->rcWindow.left = Cs->x; - Wnd->rcWindow.top = Cs->y; - Wnd->rcWindow.right = Cs->x + Size.cx; - Wnd->rcWindow.bottom = Cs->y + Size.cy; - if (0 != (Wnd->style & WS_CHILD) && ParentWindow) + Window->rcWindow.left = Cs->x; + Window->rcWindow.top = Cs->y; + Window->rcWindow.right = Cs->x + Size.cx; + Window->rcWindow.bottom = Cs->y + Size.cy; + if (0 != (Window->style & WS_CHILD) && ParentWindow) { - RECTL_vOffsetRect(&Wnd->rcWindow, - ParentWindow->Wnd->rcClient.left, - ParentWindow->Wnd->rcClient.top); + RECTL_vOffsetRect(&Window->rcWindow, + ParentWindow->rcClient.left, + ParentWindow->rcClient.top); } - Wnd->rcClient = Wnd->rcWindow; + Window->rcClient = Window->rcWindow; /* Link the window*/ if (NULL != ParentWindow) { - /* link the window into the parent's child list */ + /* link the window into the siblings list */ if ((dwStyle & (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD) - { - PWINDOW_OBJECT PrevSibling; - - PrevSibling = ParentWindow->spwndChild; - - if(PrevSibling) - { - while (PrevSibling->spwndNext) - PrevSibling = PrevSibling->spwndNext; - } - - /* link window as bottom sibling */ - IntLinkWindow(Window, ParentWindow, PrevSibling /*prev sibling*/); - } + IntLinkHwnd(Window, HWND_BOTTOM); else - { - /* link window as top sibling (but after topmost siblings) */ - PWINDOW_OBJECT InsertAfter, Sibling; - if (!(Cs->dwExStyle & WS_EX_TOPMOST)) - { - InsertAfter = NULL; - Sibling = ParentWindow->spwndChild; - while (Sibling && (Sibling->Wnd->ExStyle & WS_EX_TOPMOST)) - { - InsertAfter = Sibling; - Sibling = Sibling->spwndNext; - } - } - else - { - InsertAfter = NULL; - } - - IntLinkWindow(Window, ParentWindow, InsertAfter /* prev sibling */); - } + IntLinkHwnd(Window, HWND_TOP); } /* Send the NCCREATE message */ - Result = co_IntSendMessage(Window->hSelf, WM_NCCREATE, 0, (LPARAM) Cs); + Result = co_IntSendMessage(Window->head.h, WM_NCCREATE, 0, (LPARAM) Cs); if (!Result) { DPRINT1("co_UserCreateWindowEx(): NCCREATE message failed\n"); @@ -2085,49 +2022,48 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs, } /* Send the WM_NCCALCSIZE message */ - MaxPos.x = Window->Wnd->rcWindow.left; - MaxPos.y = Window->Wnd->rcWindow.top; + MaxPos.x = Window->rcWindow.left; + MaxPos.y = Window->rcWindow.top; - Result = co_WinPosGetNonClientSize(Window, &Wnd->rcWindow, &Wnd->rcClient); + Result = co_WinPosGetNonClientSize(Window, &Window->rcWindow, &Window->rcClient); - RECTL_vOffsetRect(&Wnd->rcWindow, MaxPos.x - Wnd->rcWindow.left, - MaxPos.y - Wnd->rcWindow.top); + RECTL_vOffsetRect(&Window->rcWindow, MaxPos.x - Window->rcWindow.left, + MaxPos.y - Window->rcWindow.top); /* Send the WM_CREATE message. */ - Result = co_IntSendMessage(Window->hSelf, WM_CREATE, 0, (LPARAM) Cs); + Result = co_IntSendMessage(Window->head.h, WM_CREATE, 0, (LPARAM) Cs); if (Result == (LRESULT)-1) { DPRINT1("co_UserCreateWindowEx(): WM_CREATE message failed\n"); - IntUnlinkWindow(Window); RETURN((PWND)0); } /* Send the EVENT_OBJECT_CREATE event*/ - IntNotifyWinEvent(EVENT_OBJECT_CREATE, Window->Wnd, OBJID_WINDOW, 0); + IntNotifyWinEvent(EVENT_OBJECT_CREATE, Window, OBJID_WINDOW, 0); /* By setting the flag below it can be examined to determine if the window was created successfully and a valid pwnd was passed back to caller since from here the function has to succeed. */ - Window->Wnd->state2 |= WNDS2_WMCREATEMSGPROCESSED; + Window->state2 |= WNDS2_WMCREATEMSGPROCESSED; /* Send the WM_SIZE and WM_MOVE messages. */ - if (!(Window->state & WINDOWOBJECT_NEED_SIZE)) + if (!(Window->state & WNDS_SENDSIZEMOVEMSGS)) { co_WinPosSendSizeMove(Window); } /* Show or maybe minimize or maximize the window. */ - if (Wnd->style & (WS_MINIMIZE | WS_MAXIMIZE)) + if (Window->style & (WS_MINIMIZE | WS_MAXIMIZE)) { RECTL NewPos; UINT16 SwFlag; - SwFlag = (Wnd->style & WS_MINIMIZE) ? SW_MINIMIZE : SW_MAXIMIZE; + SwFlag = (Window->style & WS_MINIMIZE) ? SW_MINIMIZE : SW_MAXIMIZE; co_WinPosMinMaximize(Window, SwFlag, &NewPos); - SwFlag = ((Wnd->style & WS_CHILD) || UserGetActiveWindow()) ? + SwFlag = ((Window->style & WS_CHILD) || UserGetActiveWindow()) ? SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED : SWP_NOZORDER | SWP_FRAMECHANGED; @@ -2136,14 +2072,7 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs, } /* Send the WM_PARENTNOTIFY message */ - if ((Wnd->style & WS_CHILD) && - (!(Wnd->ExStyle & WS_EX_NOPARENTNOTIFY)) && ParentWindow) - { - co_IntSendMessage(ParentWindow->hSelf, - WM_PARENTNOTIFY, - MAKEWPARAM(WM_CREATE, Wnd->IDMenu), - (LPARAM)Window->hSelf); - } + IntSendParentNotify(Window, WM_CREATE); /* Notify the shell that a new window was created */ if ((!hWndParent) && (!hWndOwner)) @@ -2152,11 +2081,11 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs, } /* Initialize and show the window's scrollbars */ - if (Wnd->style & WS_VSCROLL) + if (Window->style & WS_VSCROLL) { co_UserShowScrollBar(Window, SB_VERT, TRUE); } - if (Wnd->style & WS_HSCROLL) + if (Window->style & WS_HSCROLL) { co_UserShowScrollBar(Window, SB_HORZ, TRUE); } @@ -2164,23 +2093,23 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs, /* Show the new window */ if (Cs->style & WS_VISIBLE) { - if (Wnd->style & WS_MAXIMIZE) + if (Window->style & WS_MAXIMIZE) dwShowMode = SW_SHOW; - else if (Wnd->style & WS_MINIMIZE) + else if (Window->style & WS_MINIMIZE) dwShowMode = SW_SHOWMINIMIZED; co_WinPosShowWindow(Window, dwShowMode); - if (Wnd->ExStyle & WS_EX_MDICHILD) + if (Window->ExStyle & WS_EX_MDICHILD) { - co_IntSendMessage(ParentWindow->hSelf, WM_MDIREFRESHMENU, 0, 0); + co_IntSendMessage(ParentWindow->head.h, WM_MDIREFRESHMENU, 0, 0); /* ShowWindow won't activate child windows */ co_WinPosSetWindowPos(Window, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE); } } DPRINT("co_UserCreateWindowEx(): Created window %X\n", hWnd); - RETURN( Wnd); + RETURN( Window); CLEANUP: if (!_ret_) @@ -2391,55 +2320,55 @@ NtUserDeferWindowPos(HDWP WinPosInfo, } -BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) +BOOLEAN FASTCALL co_UserDestroyWindow(PWND Window) { - BOOLEAN isChild; - PWND Wnd; HWND hWnd; PTHREADINFO ti; MSG msg; ASSERT_REFS_CO(Window); // FIXME: temp hack? - hWnd = Window->hSelf; - - Wnd = Window->Wnd; - - if (!Wnd) return TRUE; // FIXME: Need to finish object rewrite or lock the thread when killing the window! + hWnd = Window->head.h; DPRINT("co_UserDestroyWindow \n"); /* Check for owner thread */ - if ( (Window->pti->pEThread != PsGetCurrentThread()) || - Wnd->head.pti != PsGetCurrentThreadWin32Thread() ) + if ( (Window->head.pti->pEThread != PsGetCurrentThread()) || + Window->head.pti != PsGetCurrentThreadWin32Thread() ) { SetLastWin32Error(ERROR_ACCESS_DENIED); return FALSE; } /* If window was created successfully and it is hooked */ - if ((Wnd->state2 & WNDS2_WMCREATEMSGPROCESSED) && (ISITHOOKED(WH_CBT))) + if ((Window->state2 & WNDS2_WMCREATEMSGPROCESSED)) { if (co_HOOK_CallHooks(WH_CBT, HCBT_DESTROYWND, (WPARAM) hWnd, 0)) return FALSE; } + /* Inform the parent */ + if (Window->style & WS_CHILD) + { + IntSendParentNotify(Window, WM_DESTROY); + } + /* Look whether the focus is within the tree of windows we will * be destroying. */ if (!co_WinPosShowWindow(Window, SW_HIDE)) { - if (UserGetActiveWindow() == Window->hSelf) + if (UserGetActiveWindow() == Window->head.h) { co_WinPosActivateOtherWindow(Window); } } - if (Window->pti->MessageQueue->ActiveWindow == Window->hSelf) - Window->pti->MessageQueue->ActiveWindow = NULL; - if (Window->pti->MessageQueue->FocusWindow == Window->hSelf) - Window->pti->MessageQueue->FocusWindow = NULL; - if (Window->pti->MessageQueue->CaptureWindow == Window->hSelf) - Window->pti->MessageQueue->CaptureWindow = NULL; + if (Window->head.pti->MessageQueue->ActiveWindow == Window->head.h) + Window->head.pti->MessageQueue->ActiveWindow = NULL; + if (Window->head.pti->MessageQueue->FocusWindow == Window->head.h) + Window->head.pti->MessageQueue->FocusWindow = NULL; + if (Window->head.pti->MessageQueue->CaptureWindow == Window->head.h) + Window->head.pti->MessageQueue->CaptureWindow = NULL; /* * Check if this window is the Shell's Desktop Window. If so set hShellWindow to NULL @@ -2456,41 +2385,25 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) } } - IntDereferenceMessageQueue(Window->pti->MessageQueue); + IntDereferenceMessageQueue(Window->head.pti->MessageQueue); IntEngWindowChanged(Window, WOC_DELETE); - isChild = (0 != (Wnd->style & WS_CHILD)); -#if 0 /* FIXME */ - - if (isChild) - { - if (! USER_IsExitingThread(GetCurrentThreadId())) - { - send_parent_notify(hwnd, WM_DESTROY); - } - } - else if (NULL != GetWindow(Wnd, GW_OWNER)) - { - co_HOOK_CallHooks( WH_SHELL, HSHELL_WINDOWDESTROYED, (WPARAM)hwnd, 0L, TRUE ); - /* FIXME: clean up palette - see "Internals" p.352 */ - } -#endif - - if (!IntIsWindow(Window->hSelf)) + if (!IntIsWindow(Window->head.h)) { return TRUE; } /* Recursively destroy owned windows */ - if (! isChild) + + if (! (Window->style & WS_CHILD)) { for (;;) { BOOL GotOne = FALSE; HWND *Children; HWND *ChildHandle; - PWINDOW_OBJECT Child, Desktop; + PWND Child, Desktop; Desktop = IntIsDesktopWindow(Window) ? Window : UserGetWindowObject(IntGetDesktopWindow()); @@ -2522,7 +2435,6 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) if (Child->spwndOwner != NULL) { Child->spwndOwner = NULL; - Child->Wnd->spwndOwner = NULL; } } @@ -2542,7 +2454,7 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) msg.pt = gpsi->ptCursor; MsqInsertSystemMessage(&msg); - if (!IntIsWindow(Window->hSelf)) + if (!IntIsWindow(Window->head.h)) { return TRUE; } @@ -2560,7 +2472,7 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) BOOLEAN APIENTRY NtUserDestroyWindow(HWND Wnd) { - PWINDOW_OBJECT Window; + PWND Window; DECLARE_RETURN(BOOLEAN); BOOLEAN ret; USER_REFERENCE_ENTRY Ref; @@ -2637,8 +2549,8 @@ NtUserFillWindow(HWND hWndPaint, static HWND FASTCALL -IntFindWindow(PWINDOW_OBJECT Parent, - PWINDOW_OBJECT ChildAfter, +IntFindWindow(PWND Parent, + PWND ChildAfter, RTL_ATOM ClassAtom, PUNICODE_STRING WindowName) { @@ -2657,14 +2569,14 @@ IntFindWindow(PWINDOW_OBJECT Parent, if(ChildAfter) { /* skip handles before and including ChildAfter */ - while(*phWnd && (*(phWnd++) != ChildAfter->hSelf)) + while(*phWnd && (*(phWnd++) != ChildAfter->head.h)) ; } /* search children */ while(*phWnd) { - PWINDOW_OBJECT Child; + PWND Child; if(!(Child = UserGetWindowObject(*(phWnd++)))) { continue; @@ -2673,17 +2585,17 @@ IntFindWindow(PWINDOW_OBJECT Parent, /* Do not send WM_GETTEXT messages in the kernel mode version! The user mode version however calls GetWindowText() which will send WM_GETTEXT messages to windows belonging to its processes */ - if (!ClassAtom || Child->Wnd->pcls->atomClassName == ClassAtom) + if (!ClassAtom || Child->pcls->atomClassName == ClassAtom) { // HACK: use UNICODE_STRING instead of LARGE_STRING - CurrentWindowName.Buffer = Child->Wnd->strName.Buffer; - CurrentWindowName.Length = Child->Wnd->strName.Length; - CurrentWindowName.MaximumLength = Child->Wnd->strName.MaximumLength; + CurrentWindowName.Buffer = Child->strName.Buffer; + CurrentWindowName.Length = Child->strName.Length; + CurrentWindowName.MaximumLength = Child->strName.MaximumLength; if(!CheckWindowName || - (Child->Wnd->strName.Length < 0xFFFF && + (Child->strName.Length < 0xFFFF && !RtlCompareUnicodeString(WindowName, &CurrentWindowName, TRUE))) { - Ret = Child->hSelf; + Ret = Child->head.h; break; } } @@ -2725,7 +2637,7 @@ NtUserFindWindowEx(HWND hwndParent, PUNICODE_STRING ucWindowName, DWORD dwUnknown) { - PWINDOW_OBJECT Parent, ChildAfter; + PWND Parent, ChildAfter; UNICODE_STRING ClassName = {0}, WindowName = {0}; HWND Desktop, Ret = NULL; RTL_ATOM ClassAtom = (RTL_ATOM)0; @@ -2816,10 +2728,10 @@ NtUserFindWindowEx(HWND hwndParent, _SEH2_TRY { - if(Parent->hSelf == Desktop) + if(Parent->head.h == Desktop) { HWND *List, *phWnd; - PWINDOW_OBJECT TopLevelWindow; + PWND TopLevelWindow; BOOLEAN CheckWindowName; BOOLEAN WindowMatches; BOOLEAN ClassMatches; @@ -2834,7 +2746,7 @@ NtUserFindWindowEx(HWND hwndParent, if(ChildAfter) { /* skip handles before and including ChildAfter */ - while(*phWnd && (*(phWnd++) != ChildAfter->hSelf)) + while(*phWnd && (*(phWnd++) != ChildAfter->head.h)) ; } @@ -2853,18 +2765,18 @@ NtUserFindWindowEx(HWND hwndParent, /* Do not send WM_GETTEXT messages in the kernel mode version! The user mode version however calls GetWindowText() which will send WM_GETTEXT messages to windows belonging to its processes */ - ustr.Buffer = TopLevelWindow->Wnd->strName.Buffer; - ustr.Length = TopLevelWindow->Wnd->strName.Length; - ustr.MaximumLength = TopLevelWindow->Wnd->strName.MaximumLength; + ustr.Buffer = TopLevelWindow->strName.Buffer; + ustr.Length = TopLevelWindow->strName.Length; + ustr.MaximumLength = TopLevelWindow->strName.MaximumLength; WindowMatches = !CheckWindowName || - (TopLevelWindow->Wnd->strName.Length < 0xFFFF && + (TopLevelWindow->strName.Length < 0xFFFF && !RtlCompareUnicodeString(&WindowName, &ustr, TRUE)); ClassMatches = (ClassAtom == (RTL_ATOM)0) || - ClassAtom == TopLevelWindow->Wnd->pcls->atomClassName; + ClassAtom == TopLevelWindow->pcls->atomClassName; if (WindowMatches && ClassMatches) { - Ret = TopLevelWindow->hSelf; + Ret = TopLevelWindow->head.h; break; } @@ -2872,7 +2784,7 @@ NtUserFindWindowEx(HWND hwndParent, { /* window returns the handle of the top-level window, in case it found the child window */ - Ret = TopLevelWindow->hSelf; + Ret = TopLevelWindow->head.h; break; } @@ -2890,7 +2802,7 @@ NtUserFindWindowEx(HWND hwndParent, /* FIXME - if both hwndParent and hwndChildAfter are NULL, we also should search the message-only windows. Should this also be done if Parent is the desktop window??? */ - PWINDOW_OBJECT MsgWindows; + PWND MsgWindows; if((MsgWindows = UserGetWindowObject(IntGetMessageWindow()))) { @@ -2930,11 +2842,11 @@ NtUserFlashWindowEx(IN PFLASHWINFO pfwi) /* * @implemented */ -PWINDOW_OBJECT FASTCALL UserGetAncestor(PWINDOW_OBJECT Wnd, UINT Type) +PWND FASTCALL UserGetAncestor(PWND Wnd, UINT Type) { - PWINDOW_OBJECT WndAncestor, Parent; + PWND WndAncestor, Parent; - if (Wnd->hSelf == IntGetDesktopWindow()) + if (Wnd->head.h == IntGetDesktopWindow()) { return NULL; } @@ -2974,7 +2886,7 @@ PWINDOW_OBJECT FASTCALL UserGetAncestor(PWINDOW_OBJECT Wnd, UINT Type) for (;;) { - PWINDOW_OBJECT Parent; + PWND Parent; Parent = IntGetParent(WndAncestor); @@ -3003,7 +2915,7 @@ PWINDOW_OBJECT FASTCALL UserGetAncestor(PWINDOW_OBJECT Wnd, UINT Type) HWND APIENTRY NtUserGetAncestor(HWND hWnd, UINT Type) { - PWINDOW_OBJECT Window, Ancestor; + PWND Window, Ancestor; DECLARE_RETURN(HWND); DPRINT("Enter NtUserGetAncestor\n"); @@ -3017,7 +2929,7 @@ NtUserGetAncestor(HWND hWnd, UINT Type) Ancestor = UserGetAncestor(Window, Type); /* faxme: can UserGetAncestor ever return NULL for a valid window? */ - RETURN(Ancestor ? Ancestor->hSelf : NULL); + RETURN(Ancestor ? Ancestor->head.h : NULL); CLEANUP: DPRINT("Leave NtUserGetAncestor, ret=%i\n",_ret_); @@ -3032,7 +2944,7 @@ NtUserGetComboBoxInfo( HWND hWnd, PCOMBOBOXINFO pcbi) { - PWINDOW_OBJECT Wnd; + PWND Wnd; DECLARE_RETURN(BOOL); DPRINT("Enter NtUserGetComboBoxInfo\n"); @@ -3059,7 +2971,7 @@ NtUserGetComboBoxInfo( _SEH2_END; // Pass the user pointer, it was already probed. - RETURN( (BOOL) co_IntSendMessage( Wnd->hSelf, CB_GETCOMBOBOXINFO, 0, (LPARAM)pcbi)); + RETURN( (BOOL) co_IntSendMessage( Wnd->head.h, CB_GETCOMBOBOXINFO, 0, (LPARAM)pcbi)); CLEANUP: DPRINT("Leave NtUserGetComboBoxInfo, ret=%i\n",_ret_); @@ -3076,14 +2988,14 @@ NtUserGetInternalWindowPos( HWND hWnd, LPRECT rectWnd, LPPOINT ptIcon) { - PWINDOW_OBJECT Window; + PWND Window; DWORD Ret = 0; BOOL Hit = FALSE; WINDOWPLACEMENT wndpl; UserEnterShared(); - if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd) + if (!(Window = UserGetWindowObject(hWnd))) { Hit = FALSE; goto Exit; @@ -3147,7 +3059,7 @@ APIENTRY NtUserGetListBoxInfo( HWND hWnd) { - PWINDOW_OBJECT Wnd; + PWND Wnd; DECLARE_RETURN(DWORD); DPRINT("Enter NtUserGetListBoxInfo\n"); @@ -3158,7 +3070,7 @@ NtUserGetListBoxInfo( RETURN( 0 ); } - RETURN( (DWORD) co_IntSendMessage( Wnd->hSelf, LB_GETLISTBOXINFO, 0, 0 )); + RETURN( (DWORD) co_IntSendMessage( Wnd->head.h, LB_GETLISTBOXINFO, 0, 0 )); CLEANUP: DPRINT("Leave NtUserGetListBoxInfo, ret=%i\n",_ret_); @@ -3170,7 +3082,7 @@ CLEANUP: HWND FASTCALL co_UserSetParent(HWND hWndChild, HWND hWndNewParent) { - PWINDOW_OBJECT Wnd = NULL, WndParent = NULL, WndOldParent; + PWND Wnd = NULL, WndParent = NULL, WndOldParent; HWND hWndOldParent = NULL; USER_REFERENCE_ENTRY Ref, ParentRef; @@ -3216,7 +3128,7 @@ co_UserSetParent(HWND hWndChild, HWND hWndNewParent) if (WndOldParent) { - hWndOldParent = WndOldParent->hSelf; + hWndOldParent = WndOldParent->head.h; UserDereferenceObject(WndOldParent); } @@ -3311,7 +3223,7 @@ BOOL APIENTRY NtUserSetShellWindowEx(HWND hwndShell, HWND hwndListView) { PWINSTATION_OBJECT WinStaObject; - PWINDOW_OBJECT WndShell, WndListView; + PWND WndShell, WndListView; DECLARE_RETURN(BOOL); USER_REFERENCE_ENTRY Ref; NTSTATUS Status; @@ -3363,14 +3275,14 @@ NtUserSetShellWindowEx(HWND hwndShell, HWND hwndListView) co_WinPosSetWindowPos(hwndListView, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE); #endif - if (WndListView->Wnd->ExStyle & WS_EX_TOPMOST) + if (WndListView->ExStyle & WS_EX_TOPMOST) { ObDereferenceObject(WinStaObject); RETURN( FALSE); } } - if (WndShell->Wnd->ExStyle & WS_EX_TOPMOST) + if (WndShell->ExStyle & WS_EX_TOPMOST) { ObDereferenceObject(WinStaObject); RETURN( FALSE); @@ -3426,7 +3338,7 @@ CLEANUP: HMENU APIENTRY NtUserGetSystemMenu(HWND hWnd, BOOL bRevert) { - PWINDOW_OBJECT Window; + PWND Window; PMENU_OBJECT Menu; DECLARE_RETURN(HMENU); @@ -3462,7 +3374,7 @@ BOOL APIENTRY NtUserSetSystemMenu(HWND hWnd, HMENU hMenu) { BOOL Result = FALSE; - PWINDOW_OBJECT Window; + PWND Window; PMENU_OBJECT Menu; DECLARE_RETURN(BOOL); @@ -3498,8 +3410,7 @@ CLEANUP: LONG FASTCALL co_UserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi) { - PWINDOW_OBJECT Window, Parent; - PWND Wnd; + PWND Window, Parent; PWINSTATION_OBJECT WindowStation; LONG OldValue; STYLESTRUCT Style; @@ -3515,19 +3426,15 @@ co_UserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi) return( 0); } - Wnd = Window->Wnd; - - if (!Wnd) return 0; // No go on zero. - if ((INT)Index >= 0) { - if ((Index + sizeof(LONG)) > Wnd->cbwndExtra) + if ((Index + sizeof(LONG)) > Window->cbwndExtra) { SetLastWin32Error(ERROR_INVALID_INDEX); return( 0); } - OldValue = *((LONG *)((PCHAR)(Wnd + 1) + Index)); + OldValue = *((LONG *)((PCHAR)(Window + 1) + Index)); /* if ( Index == DWLP_DLGPROC && Wnd->state & WNDS_DIALOGWINDOW) { @@ -3537,21 +3444,21 @@ co_UserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi) if (!OldValue) return 0; } */ - *((LONG *)((PCHAR)(Wnd + 1) + Index)) = NewValue; + *((LONG *)((PCHAR)(Window + 1) + Index)) = NewValue; } else { switch (Index) { case GWL_EXSTYLE: - OldValue = (LONG) Wnd->ExStyle; + OldValue = (LONG) Window->ExStyle; Style.styleOld = OldValue; Style.styleNew = NewValue; /* * Remove extended window style bit WS_EX_TOPMOST for shell windows. */ - WindowStation = Window->pti->rpdesk->rpwinstaParent; + WindowStation = Window->head.pti->rpdesk->rpwinstaParent; if(WindowStation) { if (hWnd == WindowStation->ShellWindow || hWnd == WindowStation->ShellListView) @@ -3559,54 +3466,54 @@ co_UserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi) } co_IntSendMessage(hWnd, WM_STYLECHANGING, GWL_EXSTYLE, (LPARAM) &Style); - Wnd->ExStyle = (DWORD)Style.styleNew; + Window->ExStyle = (DWORD)Style.styleNew; co_IntSendMessage(hWnd, WM_STYLECHANGED, GWL_EXSTYLE, (LPARAM) &Style); break; case GWL_STYLE: - OldValue = (LONG) Wnd->style; + OldValue = (LONG) Window->style; Style.styleOld = OldValue; Style.styleNew = NewValue; co_IntSendMessage(hWnd, WM_STYLECHANGING, GWL_STYLE, (LPARAM) &Style); - Wnd->style = (DWORD)Style.styleNew; + Window->style = (DWORD)Style.styleNew; co_IntSendMessage(hWnd, WM_STYLECHANGED, GWL_STYLE, (LPARAM) &Style); break; case GWL_WNDPROC: { - if ( Wnd->head.pti->ppi != PsGetCurrentProcessWin32Process() || - Wnd->fnid & FNID_FREED) + if ( Window->head.pti->ppi != PsGetCurrentProcessWin32Process() || + Window->fnid & FNID_FREED) { SetLastWin32Error(ERROR_ACCESS_DENIED); return( 0); } - OldValue = (LONG)IntSetWindowProc(Wnd, + OldValue = (LONG)IntSetWindowProc(Window, (WNDPROC)NewValue, Ansi); break; } case GWL_HINSTANCE: - OldValue = (LONG) Wnd->hModule; - Wnd->hModule = (HINSTANCE) NewValue; + OldValue = (LONG) Window->hModule; + Window->hModule = (HINSTANCE) NewValue; break; case GWL_HWNDPARENT: Parent = Window->spwndParent; - if (Parent && (Parent->hSelf == IntGetDesktopWindow())) - OldValue = (LONG) IntSetOwner(Window->hSelf, (HWND) NewValue); + if (Parent && (Parent->head.h == IntGetDesktopWindow())) + OldValue = (LONG) IntSetOwner(Window->head.h, (HWND) NewValue); else - OldValue = (LONG) co_UserSetParent(Window->hSelf, (HWND) NewValue); + OldValue = (LONG) co_UserSetParent(Window->head.h, (HWND) NewValue); break; case GWL_ID: - OldValue = (LONG) Wnd->IDMenu; - Wnd->IDMenu = (UINT) NewValue; + OldValue = (LONG) Window->IDMenu; + Window->IDMenu = (UINT) NewValue; break; case GWL_USERDATA: - OldValue = Wnd->dwUserData; - Wnd->dwUserData = NewValue; + OldValue = Window->dwUserData; + Window->dwUserData = NewValue; break; default: @@ -3659,7 +3566,7 @@ CLEANUP: WORD APIENTRY NtUserSetWindowWord(HWND hWnd, INT Index, WORD NewValue) { - PWINDOW_OBJECT Window; + PWND Window; WORD OldValue; DECLARE_RETURN(WORD); @@ -3676,7 +3583,7 @@ NtUserSetWindowWord(HWND hWnd, INT Index, WORD NewValue) case GWL_ID: case GWL_HINSTANCE: case GWL_HWNDPARENT: - RETURN( co_UserSetWindowLong(Window->hSelf, Index, (UINT)NewValue, TRUE)); + RETURN( co_UserSetWindowLong(Window->head.h, Index, (UINT)NewValue, TRUE)); default: if (Index < 0) { @@ -3685,14 +3592,14 @@ NtUserSetWindowWord(HWND hWnd, INT Index, WORD NewValue) } } - if (Index > Window->Wnd->cbwndExtra - sizeof(WORD)) + if (Index > Window->cbwndExtra - sizeof(WORD)) { SetLastWin32Error(ERROR_INVALID_PARAMETER); RETURN( 0); } - OldValue = *((WORD *)((PCHAR)(Window->Wnd + 1) + Index)); - *((WORD *)((PCHAR)(Window->Wnd + 1) + Index)) = NewValue; + OldValue = *((WORD *)((PCHAR)(Window + 1) + Index)); + *((WORD *)((PCHAR)(Window + 1) + Index)) = NewValue; RETURN( OldValue); @@ -3709,7 +3616,6 @@ BOOL APIENTRY NtUserGetWindowPlacement(HWND hWnd, WINDOWPLACEMENT *lpwndpl) { - PWINDOW_OBJECT Window; PWND Wnd; POINT Size; WINDOWPLACEMENT Safepl; @@ -3719,11 +3625,10 @@ NtUserGetWindowPlacement(HWND hWnd, DPRINT("Enter NtUserGetWindowPlacement\n"); UserEnterShared(); - if (!(Window = UserGetWindowObject(hWnd))) + if (!(Wnd = UserGetWindowObject(hWnd))) { RETURN( FALSE); } - Wnd = Window->Wnd; Status = MmCopyFromCaller(&Safepl, lpwndpl, sizeof(WINDOWPLACEMENT)); if(!NT_SUCCESS(Status)) @@ -3741,7 +3646,7 @@ NtUserGetWindowPlacement(HWND hWnd, { Safepl.showCmd = SW_HIDE; } - else if ((0 != (Window->state & WINDOWOBJECT_RESTOREMAX) || + else if ((0 != (Wnd->state2 & WNDS2_MAXIMIZEBUTTONDOWN) || 0 != (Wnd->style & WS_MAXIMIZE)) && 0 == (Wnd->style & WS_MINIMIZE)) { @@ -3758,7 +3663,7 @@ NtUserGetWindowPlacement(HWND hWnd, Size.x = Wnd->rcWindow.left; Size.y = Wnd->rcWindow.top; - WinPosInitInternalPos(Window, &Size, + WinPosInitInternalPos(Wnd, &Size, &Wnd->rcWindow); Safepl.rcNormalPosition = Wnd->InternalPos.NormalRect; @@ -3830,7 +3735,6 @@ NtUserMoveWindow( DWORD APIENTRY NtUserQueryWindow(HWND hWnd, DWORD Index) { - PWINDOW_OBJECT Window; PWND pWnd; DWORD Result; DECLARE_RETURN(UINT); @@ -3838,21 +3742,19 @@ NtUserQueryWindow(HWND hWnd, DWORD Index) DPRINT("Enter NtUserQueryWindow\n"); UserEnterShared(); - if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd) + if (!(pWnd = UserGetWindowObject(hWnd))) { RETURN( 0); } - pWnd = Window->Wnd; - switch(Index) { case QUERY_WINDOW_UNIQUE_PROCESS_ID: - Result = (DWORD)IntGetWndProcessId(Window); + Result = (DWORD)IntGetWndProcessId(pWnd); break; case QUERY_WINDOW_UNIQUE_THREAD_ID: - Result = (DWORD)IntGetWndThreadId(Window); + Result = (DWORD)IntGetWndThreadId(pWnd); break; case QUERY_WINDOW_ACTIVE: @@ -3864,7 +3766,7 @@ NtUserQueryWindow(HWND hWnd, DWORD Index) break; case QUERY_WINDOW_ISHUNG: - Result = (DWORD)MsqIsHung(Window->pti->MessageQueue); + Result = (DWORD)MsqIsHung(pWnd->head.pti->MessageQueue); break; case QUERY_WINDOW_REAL_ID: @@ -4002,7 +3904,7 @@ NtUserSetMenu( HMENU Menu, BOOL Repaint) { - PWINDOW_OBJECT Window; + PWND Window; BOOL Changed; DECLARE_RETURN(BOOL); @@ -4046,18 +3948,16 @@ BOOL APIENTRY NtUserSetWindowFNID(HWND hWnd, WORD fnID) { - PWINDOW_OBJECT Window; PWND Wnd; DECLARE_RETURN(BOOL); DPRINT("Enter NtUserSetWindowFNID\n"); UserEnterExclusive(); - if (!(Window = UserGetWindowObject(hWnd))) + if (!(Wnd = UserGetWindowObject(hWnd))) { RETURN( FALSE); } - Wnd = Window->Wnd; if (Wnd->pcls) { // From user land we only set these. @@ -4084,7 +3984,6 @@ BOOL APIENTRY NtUserSetWindowPlacement(HWND hWnd, WINDOWPLACEMENT *lpwndpl) { - PWINDOW_OBJECT Window; PWND Wnd; WINDOWPLACEMENT Safepl; NTSTATUS Status; @@ -4094,11 +3993,10 @@ NtUserSetWindowPlacement(HWND hWnd, DPRINT("Enter NtUserSetWindowPlacement\n"); UserEnterExclusive(); - if (!(Window = UserGetWindowObject(hWnd))) + if (!(Wnd = UserGetWindowObject(hWnd))) { RETURN( FALSE); } - Wnd = Window->Wnd; Status = MmCopyFromCaller(&Safepl, lpwndpl, sizeof(WINDOWPLACEMENT)); if(!NT_SUCCESS(Status)) @@ -4111,11 +4009,11 @@ NtUserSetWindowPlacement(HWND hWnd, RETURN( FALSE); } - UserRefObjectCo(Window, &Ref); + UserRefObjectCo(Wnd, &Ref); if ((Wnd->style & (WS_MAXIMIZE | WS_MINIMIZE)) == 0) { - co_WinPosSetWindowPos(Window, NULL, + co_WinPosSetWindowPos(Wnd, NULL, Safepl.rcNormalPosition.left, Safepl.rcNormalPosition.top, Safepl.rcNormalPosition.right - Safepl.rcNormalPosition.left, Safepl.rcNormalPosition.bottom - Safepl.rcNormalPosition.top, @@ -4123,14 +4021,14 @@ NtUserSetWindowPlacement(HWND hWnd, } /* FIXME - change window status */ - co_WinPosShowWindow(Window, Safepl.showCmd); + co_WinPosShowWindow(Wnd, Safepl.showCmd); Wnd->InternalPosInitialized = TRUE; Wnd->InternalPos.NormalRect = Safepl.rcNormalPosition; Wnd->InternalPos.IconPos = Safepl.ptMinPosition; Wnd->InternalPos.MaxPos = Safepl.ptMaxPosition; - UserDerefObjectCo(Window); + UserDerefObjectCo(Wnd); RETURN(TRUE); CLEANUP: @@ -4154,7 +4052,7 @@ NtUserSetWindowPos( UINT uFlags) { DECLARE_RETURN(BOOL); - PWINDOW_OBJECT Window; + PWND Window; BOOL ret; USER_REFERENCE_ENTRY Ref; @@ -4196,12 +4094,11 @@ CLEANUP: INT FASTCALL -IntGetWindowRgn(PWINDOW_OBJECT Window, HRGN hRgn) +IntGetWindowRgn(PWND Window, HRGN hRgn) { INT Ret; HRGN VisRgn; ROSRGNDATA *pRgn; - PWND Wnd; if(!Window) { @@ -4212,20 +4109,18 @@ IntGetWindowRgn(PWINDOW_OBJECT Window, HRGN hRgn) return ERROR; } - Wnd = Window->Wnd; - /* Create a new window region using the window rectangle */ - VisRgn = IntSysCreateRectRgnIndirect(&Window->Wnd->rcWindow); - NtGdiOffsetRgn(VisRgn, -Window->Wnd->rcWindow.left, -Window->Wnd->rcWindow.top); + VisRgn = IntSysCreateRectRgnIndirect(&Window->rcWindow); + NtGdiOffsetRgn(VisRgn, -Window->rcWindow.left, -Window->rcWindow.top); /* if there's a region assigned to the window, combine them both */ - if(Window->hrgnClip && !(Wnd->style & WS_MINIMIZE)) + if(Window->hrgnClip && !(Window->style & WS_MINIMIZE)) NtGdiCombineRgn(VisRgn, VisRgn, Window->hrgnClip, RGN_AND); /* Copy the region into hRgn */ NtGdiCombineRgn(hRgn, VisRgn, NULL, RGN_COPY); if((pRgn = RGNOBJAPI_Lock(hRgn, NULL))) { - Ret = pRgn->rdh.iType; + Ret = REGION_Complexity(pRgn); RGNOBJAPI_Unlock(pRgn); } else @@ -4237,12 +4132,11 @@ IntGetWindowRgn(PWINDOW_OBJECT Window, HRGN hRgn) } INT FASTCALL -IntGetWindowRgnBox(PWINDOW_OBJECT Window, RECTL *Rect) +IntGetWindowRgnBox(PWND Window, RECTL *Rect) { INT Ret; HRGN VisRgn; ROSRGNDATA *pRgn; - PWND Wnd; if(!Window) { @@ -4253,18 +4147,16 @@ IntGetWindowRgnBox(PWINDOW_OBJECT Window, RECTL *Rect) return ERROR; } - Wnd = Window->Wnd; - /* Create a new window region using the window rectangle */ - VisRgn = IntSysCreateRectRgnIndirect(&Window->Wnd->rcWindow); - NtGdiOffsetRgn(VisRgn, -Window->Wnd->rcWindow.left, -Window->Wnd->rcWindow.top); + VisRgn = IntSysCreateRectRgnIndirect(&Window->rcWindow); + NtGdiOffsetRgn(VisRgn, -Window->rcWindow.left, -Window->rcWindow.top); /* if there's a region assigned to the window, combine them both */ - if(Window->hrgnClip && !(Wnd->style & WS_MINIMIZE)) + if(Window->hrgnClip && !(Window->style & WS_MINIMIZE)) NtGdiCombineRgn(VisRgn, VisRgn, Window->hrgnClip, RGN_AND); if((pRgn = RGNOBJAPI_Lock(VisRgn, NULL))) { - Ret = pRgn->rdh.iType; + Ret = REGION_Complexity(pRgn); *Rect = pRgn->rdh.rcBound; RGNOBJAPI_Unlock(pRgn); } @@ -4287,7 +4179,7 @@ NtUserSetWindowRgn( BOOL bRedraw) { HRGN hrgnCopy; - PWINDOW_OBJECT Window; + PWND Window; DECLARE_RETURN(INT); DPRINT("Enter NtUserSetWindowRgn\n"); @@ -4343,7 +4235,7 @@ CLEANUP: BOOL APIENTRY NtUserShowWindow(HWND hWnd, LONG nCmdShow) { - PWINDOW_OBJECT Window; + PWND Window; BOOL ret; DECLARE_RETURN(BOOL); USER_REFERENCE_ENTRY Ref; @@ -4425,7 +4317,7 @@ NtUserWindowFromPoint(LONG X, LONG Y) { POINT pt; HWND Ret; - PWINDOW_OBJECT DesktopWindow = NULL, Window = NULL; + PWND DesktopWindow = NULL, Window = NULL; DECLARE_RETURN(HWND); USER_REFERENCE_ENTRY Ref; @@ -4448,7 +4340,7 @@ NtUserWindowFromPoint(LONG X, LONG Y) if(Window) { - Ret = Window->hSelf; + Ret = Window->head.h; RETURN( Ret); } @@ -4479,7 +4371,6 @@ CLEANUP: BOOL APIENTRY NtUserDefSetText(HWND hWnd, PLARGE_STRING WindowText) { - PWINDOW_OBJECT Window; PWND Wnd; LARGE_STRING SafeText; UNICODE_STRING UnicodeString; @@ -4508,12 +4399,11 @@ NtUserDefSetText(HWND hWnd, PLARGE_STRING WindowText) UserEnterExclusive(); - if(!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd) + if(!(Wnd = UserGetWindowObject(hWnd))) { UserLeave(); return FALSE; } - Wnd = Window->Wnd; // ReactOS uses Unicode and not mixed. Up/Down converting will take time. // Brought to you by: The Wine Project! Dysfunctional Thought Processes! @@ -4592,7 +4482,7 @@ NtUserDefSetText(HWND hWnd, PLARGE_STRING WindowText) // In User32, these are called after: NotifyWinEvent EVENT_OBJECT_NAMECHANGE than // RepaintButton, StaticRepaint, NtUserCallHwndLock HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK, etc. /* Send shell notifications */ - if (!Window->spwndOwner && !IntGetParent(Window)) + if (!Wnd->spwndOwner && !IntGetParent(Wnd)) { co_IntShellHookNotify(HSHELL_REDRAW, (LPARAM) hWnd); } @@ -4615,7 +4505,6 @@ Exit: INT APIENTRY NtUserInternalGetWindowText(HWND hWnd, LPWSTR lpString, INT nMaxCount) { - PWINDOW_OBJECT Window; PWND Wnd; NTSTATUS Status; INT Result; @@ -4630,11 +4519,10 @@ NtUserInternalGetWindowText(HWND hWnd, LPWSTR lpString, INT nMaxCount) RETURN( 0); } - if(!(Window = UserGetWindowObject(hWnd))) + if(!(Wnd = UserGetWindowObject(hWnd))) { RETURN( 0); } - Wnd = Window->Wnd; Result = Wnd->strName.Length / sizeof(WCHAR); if(lpString) @@ -4676,10 +4564,10 @@ CLEANUP: BOOL FASTCALL -IntShowOwnedPopups(PWINDOW_OBJECT OwnerWnd, BOOL fShow ) +IntShowOwnedPopups(PWND OwnerWnd, BOOL fShow ) { int count = 0; - PWINDOW_OBJECT pWnd; + PWND pWnd; HWND *win_array; // ASSERT(OwnerWnd); @@ -4700,7 +4588,7 @@ IntShowOwnedPopups(PWINDOW_OBJECT OwnerWnd, BOOL fShow ) if (fShow) { - if (pWnd->Wnd->state & WNDS_HIDDENPOPUP) + if (pWnd->state & WNDS_HIDDENPOPUP) { /* In Windows, ShowOwnedPopups(TRUE) generates * WM_SHOWWINDOW messages with SW_PARENTOPENING, @@ -4712,7 +4600,7 @@ IntShowOwnedPopups(PWINDOW_OBJECT OwnerWnd, BOOL fShow ) } else { - if (pWnd->Wnd->style & WS_VISIBLE) + if (pWnd->style & WS_VISIBLE) { /* In Windows, ShowOwnedPopups(FALSE) generates * WM_SHOWWINDOW messages with SW_PARENTCLOSING, @@ -4757,7 +4645,7 @@ NtUserValidateHandleSecure( { case otWindow: { - PWINDOW_OBJECT Window; + PWND Window; if ((Window = UserGetWindowObject((HWND) handle))) return TRUE; return FALSE; } diff --git a/subsystems/win32/win32k/ntuser/winpos.c b/subsystems/win32/win32k/ntuser/winpos.c index cef431fc039..7a9562613c4 100644 --- a/subsystems/win32/win32k/ntuser/winpos.c +++ b/subsystems/win32/win32k/ntuser/winpos.c @@ -33,10 +33,10 @@ #include VOID FASTCALL -co_IntPaintWindows(PWINDOW_OBJECT Window, ULONG Flags, BOOL Recurse); +co_IntPaintWindows(PWND Window, ULONG Flags, BOOL Recurse); BOOL FASTCALL -IntValidateParent(PWINDOW_OBJECT Child, HRGN hValidateRgn, BOOL Recurse); +IntValidateParent(PWND Child, HRGN hValidateRgn, BOOL Recurse); /* GLOBALS *******************************************************************/ @@ -55,7 +55,7 @@ IntValidateParent(PWINDOW_OBJECT Child, HRGN hValidateRgn, BOOL Recurse); /* FUNCTIONS *****************************************************************/ BOOL FASTCALL -IntGetClientOrigin(PWINDOW_OBJECT Window OPTIONAL, LPPOINT Point) +IntGetClientOrigin(PWND Window OPTIONAL, LPPOINT Point) { Window = Window ? Window : UserGetWindowObject(IntGetDesktopWindow()); if (Window == NULL) @@ -63,14 +63,14 @@ IntGetClientOrigin(PWINDOW_OBJECT Window OPTIONAL, LPPOINT Point) Point->x = Point->y = 0; return FALSE; } - Point->x = Window->Wnd->rcClient.left; - Point->y = Window->Wnd->rcClient.top; + Point->x = Window->rcClient.left; + Point->y = Window->rcClient.top; return TRUE; } BOOL FASTCALL -UserGetClientOrigin(PWINDOW_OBJECT Window, LPPOINT Point) +UserGetClientOrigin(PWND Window, LPPOINT Point) { BOOL Ret; POINT pt; @@ -108,17 +108,17 @@ UserGetClientOrigin(PWINDOW_OBJECT Window, LPPOINT Point) * Check if we can activate the specified window. */ static -BOOL FASTCALL can_activate_window( PWINDOW_OBJECT Wnd OPTIONAL) +BOOL FASTCALL can_activate_window( PWND Wnd OPTIONAL) { LONG style; if (!Wnd) return FALSE; - if (!Wnd->Wnd) return FALSE; - style = Wnd->Wnd->style; + + style = Wnd->style; if (!(style & WS_VISIBLE) && - Wnd->pti->pEThread->ThreadsProcess != CsrProcess) return FALSE; + Wnd->head.pti->pEThread->ThreadsProcess != CsrProcess) return FALSE; if ((style & WS_MINIMIZE) && - Wnd->pti->pEThread->ThreadsProcess != CsrProcess) return FALSE; + Wnd->head.pti->pEThread->ThreadsProcess != CsrProcess) return FALSE; if ((style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return FALSE; return TRUE; /* FIXME: This window could be disable because the child that closed @@ -133,25 +133,22 @@ BOOL FASTCALL can_activate_window( PWINDOW_OBJECT Wnd OPTIONAL) * Activates window other than pWnd. */ VOID FASTCALL -co_WinPosActivateOtherWindow(PWINDOW_OBJECT Window) +co_WinPosActivateOtherWindow(PWND Wnd) { - PWINDOW_OBJECT WndTo = NULL; + PWND WndTo = NULL; HWND Fg; USER_REFERENCE_ENTRY Ref; - PWND Wnd; - ASSERT_REFS_CO(Window); + ASSERT_REFS_CO(Wnd); - Wnd = Window->Wnd; - - if (IntIsDesktopWindow(Window)) + if (IntIsDesktopWindow(Wnd)) { IntSetFocusMessageQueue(NULL); return; } /* If this is popup window, try to activate the owner first. */ - if ((Wnd->style & WS_POPUP) && (WndTo = Window->spwndOwner)) + if ((Wnd->style & WS_POPUP) && (WndTo = Wnd->spwndOwner)) { WndTo = UserGetAncestor( WndTo, GA_ROOT ); if (can_activate_window(WndTo)) goto done; @@ -159,7 +156,7 @@ co_WinPosActivateOtherWindow(PWINDOW_OBJECT Window) /* Pick a next top-level window. */ /* FIXME: Search for non-tooltip windows first. */ - WndTo = Window; + WndTo = Wnd; for (;;) { if (!(WndTo = WndTo->spwndNext)) break; @@ -171,7 +168,7 @@ done: if (WndTo) UserRefObjectCo(WndTo, &Ref); Fg = UserGetForegroundWindow(); - if ((!Fg || Window->hSelf == Fg) && WndTo)//fixme: ok if WndTo is NULL?? + if ((!Fg || Wnd->head.h == Fg) && WndTo)//fixme: ok if WndTo is NULL?? { /* fixme: wine can pass WndTo=NULL to co_IntSetForegroundWindow. hmm */ if (co_IntSetForegroundWindow(WndTo)) @@ -190,7 +187,7 @@ done: UINT FASTCALL -co_WinPosArrangeIconicWindows(PWINDOW_OBJECT parent) +co_WinPosArrangeIconicWindows(PWND parent) { RECTL rectParent; INT i, x, y, xspacing, yspacing; @@ -209,24 +206,21 @@ co_WinPosArrangeIconicWindows(PWINDOW_OBJECT parent) for( i = 0; List[i]; i++) { - PWINDOW_OBJECT WndChild; - PWND ChildWnd; + PWND Child; - if (!(WndChild = UserGetWindowObject(List[i]))) + if (!(Child = UserGetWindowObject(List[i]))) continue; - ChildWnd = WndChild->Wnd; - - if((ChildWnd->style & WS_MINIMIZE) != 0 ) + if((Child->style & WS_MINIMIZE) != 0 ) { USER_REFERENCE_ENTRY Ref; - UserRefObjectCo(WndChild, &Ref); + UserRefObjectCo(Child, &Ref); - co_WinPosSetWindowPos(WndChild, 0, x + UserGetSystemMetrics(SM_CXBORDER), + co_WinPosSetWindowPos(Child, 0, x + UserGetSystemMetrics(SM_CXBORDER), y - yspacing - UserGetSystemMetrics(SM_CYBORDER) , 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE ); - UserDerefObjectCo(WndChild); + UserDerefObjectCo(Child); if (x <= rectParent.right - xspacing) x += xspacing; @@ -243,35 +237,34 @@ co_WinPosArrangeIconicWindows(PWINDOW_OBJECT parent) static VOID FASTCALL -WinPosFindIconPos(PWINDOW_OBJECT Window, POINT *Pos) +WinPosFindIconPos(PWND Window, POINT *Pos) { /* FIXME */ } VOID FASTCALL -WinPosInitInternalPos(PWINDOW_OBJECT Window, POINT *pt, RECTL *RestoreRect) +WinPosInitInternalPos(PWND Wnd, POINT *pt, RECTL *RestoreRect) { - PWINDOW_OBJECT Parent; + PWND Parent; UINT XInc, YInc; - PWND Wnd = Window->Wnd; if (!Wnd->InternalPosInitialized) { RECTL WorkArea; - Parent = Window->spwndParent; + Parent = Wnd->spwndParent; if(Parent) { if(IntIsDesktopWindow(Parent)) UserSystemParametersInfo(SPI_GETWORKAREA, 0, &WorkArea, 0); else - WorkArea = Parent->Wnd->rcClient; + WorkArea = Parent->rcClient; } else UserSystemParametersInfo(SPI_GETWORKAREA, 0, &WorkArea, 0); - Wnd->InternalPos.NormalRect = Window->Wnd->rcWindow; - IntGetWindowBorderMeasures(Window, &XInc, &YInc); + Wnd->InternalPos.NormalRect = Wnd->rcWindow; + IntGetWindowBorderMeasures(Wnd, &XInc, &YInc); Wnd->InternalPos.MaxPos.x = WorkArea.left - XInc; Wnd->InternalPos.MaxPos.y = WorkArea.top - YInc; Wnd->InternalPos.IconPos.x = WorkArea.left; @@ -294,25 +287,23 @@ WinPosInitInternalPos(PWINDOW_OBJECT Window, POINT *pt, RECTL *RestoreRect) } UINT FASTCALL -co_WinPosMinMaximize(PWINDOW_OBJECT Window, UINT ShowFlag, RECT* NewPos) +co_WinPosMinMaximize(PWND Wnd, UINT ShowFlag, RECT* NewPos) { POINT Size; UINT SwpFlags = 0; - PWND Wnd; - ASSERT_REFS_CO(Window); - Wnd = Window->Wnd; + ASSERT_REFS_CO(Wnd); Size.x = Wnd->rcWindow.left; Size.y = Wnd->rcWindow.top; - WinPosInitInternalPos(Window, &Size, &Wnd->rcWindow); + WinPosInitInternalPos(Wnd, &Size, &Wnd->rcWindow); - if (co_HOOK_CallHooks( WH_CBT, HCBT_MINMAX, (WPARAM)Window->hSelf, ShowFlag)) + if (co_HOOK_CallHooks( WH_CBT, HCBT_MINMAX, (WPARAM)Wnd->head.h, ShowFlag)) return SWP_NOSIZE | SWP_NOMOVE; if (Wnd->style & WS_MINIMIZE) { - if (!co_IntSendMessageNoWait(Window->hSelf, WM_QUERYOPEN, 0, 0)) + if (!co_IntSendMessageNoWait(Wnd->head.h, WM_QUERYOPEN, 0, 0)) { return(SWP_NOSIZE | SWP_NOMOVE); } @@ -324,17 +315,17 @@ co_WinPosMinMaximize(PWINDOW_OBJECT Window, UINT ShowFlag, RECT* NewPos) { if (Wnd->style & WS_MAXIMIZE) { - Window->state |= WINDOWOBJECT_RESTOREMAX; + Wnd->state2 |= WNDS2_MAXIMIZEBUTTONDOWN; Wnd->style &= ~WS_MAXIMIZE; } else { - Window->state &= ~WINDOWOBJECT_RESTOREMAX; + Wnd->state2 &= ~WNDS2_MAXIMIZEBUTTONDOWN; } - co_UserRedrawWindow(Window, NULL, 0, RDW_VALIDATE | RDW_NOERASE | + co_UserRedrawWindow(Wnd, NULL, 0, RDW_VALIDATE | RDW_NOERASE | RDW_NOINTERNALPAINT); Wnd->style |= WS_MINIMIZE; - WinPosFindIconPos(Window, &Wnd->InternalPos.IconPos); + WinPosFindIconPos(Wnd, &Wnd->InternalPos.IconPos); RECTL_vSetRect(NewPos, Wnd->InternalPos.IconPos.x, Wnd->InternalPos.IconPos.y, UserGetSystemMetrics(SM_CXMINIMIZED), UserGetSystemMetrics(SM_CYMINIMIZED)); @@ -344,7 +335,7 @@ co_WinPosMinMaximize(PWINDOW_OBJECT Window, UINT ShowFlag, RECT* NewPos) case SW_MAXIMIZE: { - co_WinPosGetMinMaxInfo(Window, &Size, &Wnd->InternalPos.MaxPos, + co_WinPosGetMinMaxInfo(Wnd, &Size, &Wnd->InternalPos.MaxPos, NULL, NULL); DPRINT("Maximize: %d,%d %dx%d\n", Wnd->InternalPos.MaxPos.x, Wnd->InternalPos.MaxPos.y, Size.x, Size.y); @@ -363,9 +354,9 @@ co_WinPosMinMaximize(PWINDOW_OBJECT Window, UINT ShowFlag, RECT* NewPos) if (Wnd->style & WS_MINIMIZE) { Wnd->style &= ~WS_MINIMIZE; - if (Window->state & WINDOWOBJECT_RESTOREMAX) + if (Wnd->state2 & WNDS2_MAXIMIZEBUTTONDOWN) { - co_WinPosGetMinMaxInfo(Window, &Size, + co_WinPosGetMinMaxInfo(Wnd, &Size, &Wnd->InternalPos.MaxPos, NULL, NULL); Wnd->style |= WS_MAXIMIZE; RECTL_vSetRect(NewPos, Wnd->InternalPos.MaxPos.x, @@ -467,22 +458,22 @@ UserAdjustWindowRectEx(LPRECT lpRect, } UINT FASTCALL -co_WinPosGetMinMaxInfo(PWINDOW_OBJECT Window, POINT* MaxSize, POINT* MaxPos, +co_WinPosGetMinMaxInfo(PWND Window, POINT* MaxSize, POINT* MaxPos, POINT* MinTrack, POINT* MaxTrack) { MINMAXINFO MinMax; PMONITOR monitor; INT xinc, yinc; - LONG style = Window->Wnd->style; + LONG style = Window->style; LONG adjustedStyle; - LONG exstyle = Window->Wnd->ExStyle; + LONG exstyle = Window->ExStyle; RECT rc; ASSERT_REFS_CO(Window); /* Compute default values */ - rc = Window->Wnd->rcWindow; + rc = Window->rcWindow; MinMax.ptReserved.x = rc.left; MinMax.ptReserved.y = rc.top; @@ -491,9 +482,9 @@ co_WinPosGetMinMaxInfo(PWINDOW_OBJECT Window, POINT* MaxSize, POINT* MaxPos, else adjustedStyle = style; - if(Window->Wnd->spwndParent) + if(Window->spwndParent) IntGetClientRect(Window->spwndParent, &rc); - UserAdjustWindowRectEx(&rc, adjustedStyle, ((style & WS_POPUP) && Window->Wnd->IDMenu), exstyle); + UserAdjustWindowRectEx(&rc, adjustedStyle, ((style & WS_POPUP) && Window->IDMenu), exstyle); xinc = -rc.left; yinc = -rc.top; @@ -517,7 +508,7 @@ co_WinPosGetMinMaxInfo(PWINDOW_OBJECT Window, POINT* MaxSize, POINT* MaxPos, //if (!EMPTYPOINT(win->max_pos)) MinMax.ptMaxPosition = win->max_pos; - co_IntSendMessage(Window->hSelf, WM_GETMINMAXINFO, 0, (LPARAM)&MinMax); + co_IntSendMessage(Window->head.h, WM_GETMINMAXINFO, 0, (LPARAM)&MinMax); /* if the app didn't change the values, adapt them for the current monitor */ if ((monitor = IntGetPrimaryMonitor())) @@ -603,15 +594,13 @@ FixClientRect(PRECTL ClientRect, PRECTL WindowRect) static LONG FASTCALL -co_WinPosDoNCCALCSize(PWINDOW_OBJECT Window, PWINDOWPOS WinPos, +co_WinPosDoNCCALCSize(PWND Window, PWINDOWPOS WinPos, RECT* WindowRect, RECT* ClientRect) { - PWINDOW_OBJECT Parent; + PWND Parent; UINT wvrFlags = 0; - PWND Wnd; ASSERT_REFS_CO(Window); - Wnd = Window->Wnd; /* Send WM_NCCALCSIZE message to get new client area */ if ((WinPos->flags & (SWP_FRAMECHANGED | SWP_NOSIZE)) != SWP_NOSIZE) @@ -620,48 +609,48 @@ co_WinPosDoNCCALCSize(PWINDOW_OBJECT Window, PWINDOWPOS WinPos, WINDOWPOS winposCopy; params.rgrc[0] = *WindowRect; - params.rgrc[1] = Window->Wnd->rcWindow; - params.rgrc[2] = Window->Wnd->rcClient; + params.rgrc[1] = Window->rcWindow; + params.rgrc[2] = Window->rcClient; Parent = Window->spwndParent; - if (0 != (Wnd->style & WS_CHILD) && Parent) + if (0 != (Window->style & WS_CHILD) && Parent) { - RECTL_vOffsetRect(&(params.rgrc[0]), - Parent->Wnd->rcClient.left, - - Parent->Wnd->rcClient.top); - RECTL_vOffsetRect(&(params.rgrc[1]), - Parent->Wnd->rcClient.left, - - Parent->Wnd->rcClient.top); - RECTL_vOffsetRect(&(params.rgrc[2]), - Parent->Wnd->rcClient.left, - - Parent->Wnd->rcClient.top); + RECTL_vOffsetRect(&(params.rgrc[0]), - Parent->rcClient.left, + - Parent->rcClient.top); + RECTL_vOffsetRect(&(params.rgrc[1]), - Parent->rcClient.left, + - Parent->rcClient.top); + RECTL_vOffsetRect(&(params.rgrc[2]), - Parent->rcClient.left, + - Parent->rcClient.top); } params.lppos = &winposCopy; winposCopy = *WinPos; - wvrFlags = co_IntSendMessageNoWait(Window->hSelf, WM_NCCALCSIZE, TRUE, (LPARAM) ¶ms); + wvrFlags = co_IntSendMessageNoWait(Window->head.h, WM_NCCALCSIZE, TRUE, (LPARAM) ¶ms); /* If the application send back garbage, ignore it */ if (params.rgrc[0].left <= params.rgrc[0].right && params.rgrc[0].top <= params.rgrc[0].bottom) { *ClientRect = params.rgrc[0]; - if ((Wnd->style & WS_CHILD) && Parent) + if ((Window->style & WS_CHILD) && Parent) { - RECTL_vOffsetRect(ClientRect, Parent->Wnd->rcClient.left, - Parent->Wnd->rcClient.top); + RECTL_vOffsetRect(ClientRect, Parent->rcClient.left, + Parent->rcClient.top); } FixClientRect(ClientRect, WindowRect); } /* FIXME: WVR_ALIGNxxx */ - if (ClientRect->left != Wnd->rcClient.left || - ClientRect->top != Wnd->rcClient.top) + if (ClientRect->left != Window->rcClient.left || + ClientRect->top != Window->rcClient.top) { WinPos->flags &= ~SWP_NOCLIENTMOVE; } if ((ClientRect->right - ClientRect->left != - Wnd->rcClient.right - Wnd->rcClient.left) || + Window->rcClient.right - Window->rcClient.left) || (ClientRect->bottom - ClientRect->top != - Wnd->rcClient.bottom - Wnd->rcClient.top)) + Window->rcClient.bottom - Window->rcClient.top)) { WinPos->flags &= ~SWP_NOCLIENTSIZE; } @@ -669,8 +658,8 @@ co_WinPosDoNCCALCSize(PWINDOW_OBJECT Window, PWINDOWPOS WinPos, else { if (! (WinPos->flags & SWP_NOMOVE) - && (ClientRect->left != Wnd->rcClient.left || - ClientRect->top != Wnd->rcClient.top)) + && (ClientRect->left != Window->rcClient.left || + ClientRect->top != Window->rcClient.top)) { WinPos->flags &= ~SWP_NOCLIENTMOVE; } @@ -681,24 +670,22 @@ co_WinPosDoNCCALCSize(PWINDOW_OBJECT Window, PWINDOWPOS WinPos, static BOOL FASTCALL -co_WinPosDoWinPosChanging(PWINDOW_OBJECT Window, +co_WinPosDoWinPosChanging(PWND Window, PWINDOWPOS WinPos, PRECTL WindowRect, PRECTL ClientRect) { INT X, Y; - PWND Wnd; ASSERT_REFS_CO(Window); - Wnd = Window->Wnd; if (!(WinPos->flags & SWP_NOSENDCHANGING)) { - co_IntSendMessageNoWait(Window->hSelf, WM_WINDOWPOSCHANGING, 0, (LPARAM) WinPos); + co_IntSendMessageNoWait(Window->head.h, WM_WINDOWPOSCHANGING, 0, (LPARAM) WinPos); } - *WindowRect = Wnd->rcWindow; - *ClientRect = Wnd->rcClient; + *WindowRect = Window->rcWindow; + *ClientRect = Window->rcClient; if (!(WinPos->flags & SWP_NOSIZE)) { @@ -708,23 +695,23 @@ co_WinPosDoWinPosChanging(PWINDOW_OBJECT Window, if (!(WinPos->flags & SWP_NOMOVE)) { - PWINDOW_OBJECT Parent; + PWND Parent; X = WinPos->x; Y = WinPos->y; Parent = Window->spwndParent; - if ((0 != (Wnd->style & WS_CHILD)) && Parent) + if ((0 != (Window->style & WS_CHILD)) && Parent) { - X += Parent->Wnd->rcClient.left; - Y += Parent->Wnd->rcClient.top; + X += Parent->rcClient.left; + Y += Parent->rcClient.top; } WindowRect->left = X; WindowRect->top = Y; - WindowRect->right += X - Wnd->rcWindow.left; - WindowRect->bottom += Y - Wnd->rcWindow.top; + WindowRect->right += X - Window->rcWindow.left; + WindowRect->bottom += Y - Window->rcWindow.top; RECTL_vOffsetRect(ClientRect, - X - Wnd->rcWindow.left, - Y - Wnd->rcWindow.top); + X - Window->rcWindow.left, + Y - Window->rcWindow.top); } WinPos->flags |= SWP_NOCLIENTMOVE | SWP_NOCLIENTSIZE; @@ -743,12 +730,12 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) HWND *List = NULL; HWND Owner; LONG Style; - PWINDOW_OBJECT Window ,DesktopWindow, ChildObject; + PWND Window ,DesktopWindow, ChildObject; int i; Window = UserGetWindowObject(hWnd); - Owner = Window->spwndOwner ? Window->spwndOwner->hSelf : NULL; - Style = Window->Wnd->style; + Owner = Window->spwndOwner ? Window->spwndOwner->head.h : NULL; + Style = Window->style; if ((Style & WS_POPUP) && Owner) { @@ -771,7 +758,7 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) ChildObject = UserGetWindowObject(List[i]); if (NULL != ChildObject) { - if (0 == (ChildObject->Wnd->ExStyle & WS_EX_TOPMOST)) + if (0 == (ChildObject->ExStyle & WS_EX_TOPMOST)) { break; } @@ -800,7 +787,7 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) { for (i = 0; List[i]; i++) { - PWINDOW_OBJECT Wnd; + PWND Wnd; if (List[i] == hWnd) break; @@ -808,7 +795,7 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) if (!(Wnd = UserGetWindowObject(List[i]))) continue; - if (Wnd->Wnd->style & WS_POPUP && Wnd->spwndOwner == Window) + if (Wnd->style & WS_POPUP && Wnd->spwndOwner == Window) { USER_REFERENCE_ENTRY Ref; UserRefObjectCo(Wnd, &Ref); @@ -835,21 +822,21 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) */ static VOID FASTCALL -WinPosInternalMoveWindow(PWINDOW_OBJECT Window, INT MoveX, INT MoveY) +WinPosInternalMoveWindow(PWND Window, INT MoveX, INT MoveY) { - PWINDOW_OBJECT Child; + PWND Child; ASSERT(Window != Window->spwndChild); - Window->Wnd->rcWindow.left += MoveX; - Window->Wnd->rcWindow.right += MoveX; - Window->Wnd->rcWindow.top += MoveY; - Window->Wnd->rcWindow.bottom += MoveY; + Window->rcWindow.left += MoveX; + Window->rcWindow.right += MoveX; + Window->rcWindow.top += MoveY; + Window->rcWindow.bottom += MoveY; - Window->Wnd->rcClient.left += MoveX; - Window->Wnd->rcClient.right += MoveX; - Window->Wnd->rcClient.top += MoveY; - Window->Wnd->rcClient.bottom += MoveY; + Window->rcClient.left += MoveX; + Window->rcClient.right += MoveX; + Window->rcClient.top += MoveY; + Window->rcClient.bottom += MoveY; for(Child = Window->spwndChild; Child; Child = Child->spwndNext) { @@ -864,12 +851,8 @@ WinPosInternalMoveWindow(PWINDOW_OBJECT Window, INT MoveX, INT MoveY) */ static BOOL FASTCALL -WinPosFixupFlags(WINDOWPOS *WinPos, PWINDOW_OBJECT Window) +WinPosFixupFlags(WINDOWPOS *WinPos, PWND Wnd) { - PWND Wnd = Window->Wnd; - - if (!Wnd) return FALSE; - if (Wnd->style & WS_VISIBLE) { WinPos->flags &= ~SWP_SHOWWINDOW; @@ -945,7 +928,7 @@ WinPosFixupFlags(WINDOWPOS *WinPos, PWINDOW_OBJECT Window) && HWND_NOTOPMOST != WinPos->hwndInsertAfter && HWND_BOTTOM != WinPos->hwndInsertAfter) { - PWINDOW_OBJECT InsAfterWnd, Parent = Window->spwndParent; + PWND InsAfterWnd, Parent = Wnd->spwndParent; InsAfterWnd = UserGetWindowObject(WinPos->hwndInsertAfter); @@ -961,7 +944,7 @@ WinPosFixupFlags(WINDOWPOS *WinPos, PWINDOW_OBJECT Window) * itself. */ if ((WinPos->hwnd == WinPos->hwndInsertAfter) || - ((InsAfterWnd->spwndNext) && (WinPos->hwnd == InsAfterWnd->spwndNext->hSelf))) + ((InsAfterWnd->spwndNext) && (WinPos->hwnd == InsAfterWnd->spwndNext->head.h))) { WinPos->flags |= SWP_NOZORDER; } @@ -975,7 +958,7 @@ WinPosFixupFlags(WINDOWPOS *WinPos, PWINDOW_OBJECT Window) /* x and y are always screen relative */ BOOLEAN FASTCALL co_WinPosSetWindowPos( - PWINDOW_OBJECT Window, + PWND Window, HWND WndInsertAfter, INT x, INT y, @@ -999,24 +982,22 @@ co_WinPosSetWindowPos( HDC Dc; RECTL CopyRect; RECTL TempRect; - PWINDOW_OBJECT Ancestor; + PWND Ancestor; ASSERT_REFS_CO(Window); - if (!Window->Wnd) return FALSE; - /* FIXME: Get current active window from active queue. */ /* * Only allow CSRSS to mess with the desktop window */ - if ( Window->hSelf == IntGetDesktopWindow() && - Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess()) + if ( Window->head.h == IntGetDesktopWindow() && + Window->head.pti->pEThread->ThreadsProcess != PsGetCurrentProcess()) { return FALSE; } - WinPos.hwnd = Window->hSelf; + WinPos.hwnd = Window->head.h; WinPos.hwndInsertAfter = WndInsertAfter; WinPos.x = x; WinPos.y = y; @@ -1043,7 +1024,7 @@ co_WinPosSetWindowPos( Ancestor = UserGetAncestor(Window, GA_PARENT); if ( (WinPos.flags & (SWP_NOZORDER | SWP_HIDEWINDOW | SWP_SHOWWINDOW)) != SWP_NOZORDER && - Ancestor && Ancestor->hSelf == IntGetDesktopWindow() ) + Ancestor && Ancestor->head.h == IntGetDesktopWindow() ) { WinPos.hwndInsertAfter = WinPosDoOwnedPopups(WinPos.hwnd, WinPos.hwndInsertAfter); } @@ -1070,7 +1051,7 @@ co_WinPosSetWindowPos( else if(VisRgn) { RGNOBJAPI_Unlock(VisRgn); - NtGdiOffsetRgn(VisBefore, -Window->Wnd->rcWindow.left, -Window->Wnd->rcWindow.top); + NtGdiOffsetRgn(VisBefore, -Window->rcWindow.left, -Window->rcWindow.top); } } } @@ -1082,82 +1063,11 @@ co_WinPosSetWindowPos( /* Relink windows. (also take into account shell window in hwndShellWindow) */ if (!(WinPos.flags & SWP_NOZORDER) && WinPos.hwnd != UserGetShellWindow()) { - PWINDOW_OBJECT ParentWindow; - PWINDOW_OBJECT Sibling; - PWINDOW_OBJECT InsertAfterWindow; - - if ((ParentWindow = Window->spwndParent)) - { - if (HWND_TOPMOST == WinPos.hwndInsertAfter) - { - InsertAfterWindow = NULL; - } - else if (HWND_TOP == WinPos.hwndInsertAfter - || HWND_NOTOPMOST == WinPos.hwndInsertAfter) - { - InsertAfterWindow = NULL; - Sibling = ParentWindow->spwndChild; - while ( NULL != Sibling && - 0 != (Sibling->Wnd->ExStyle & WS_EX_TOPMOST) ) - { - InsertAfterWindow = Sibling; - Sibling = Sibling->spwndNext; - } - if (NULL != InsertAfterWindow) - { - UserReferenceObject(InsertAfterWindow); - } - } - else if (WinPos.hwndInsertAfter == HWND_BOTTOM) - { - if(ParentWindow->spwndChild) - { - InsertAfterWindow = ParentWindow->spwndChild; - - if(InsertAfterWindow) - { - while (InsertAfterWindow->spwndNext) - InsertAfterWindow = InsertAfterWindow->spwndNext; - } - - UserReferenceObject(InsertAfterWindow); - } - else - InsertAfterWindow = NULL; - } - else - InsertAfterWindow = IntGetWindowObject(WinPos.hwndInsertAfter); - /* Do nothing if hwndInsertAfter is HWND_BOTTOM and Window is already - the last window */ - if (InsertAfterWindow != Window) - { - IntUnlinkWindow(Window); - IntLinkWindow(Window, ParentWindow, InsertAfterWindow); - } - if (InsertAfterWindow != NULL) - UserDereferenceObject(InsertAfterWindow); - - if ( (HWND_TOPMOST == WinPos.hwndInsertAfter) || - (0 != (Window->Wnd->ExStyle & WS_EX_TOPMOST) && - NULL != Window->spwndPrev && - 0 != (Window->spwndPrev->Wnd->ExStyle & WS_EX_TOPMOST)) || - (NULL != Window->spwndNext && - 0 != (Window->spwndNext->Wnd->ExStyle & WS_EX_TOPMOST)) ) - { - Window->Wnd->ExStyle |= WS_EX_TOPMOST; - } - else - { - Window->Wnd->ExStyle &= ~ WS_EX_TOPMOST; - } - - } + IntLinkHwnd(Window, WndInsertAfter); } - if (!Window->Wnd) return FALSE; - - OldWindowRect = Window->Wnd->rcWindow; - OldClientRect = Window->Wnd->rcClient; + OldWindowRect = Window->rcWindow; + OldClientRect = Window->rcClient; if (OldClientRect.bottom - OldClientRect.top == NewClientRect.bottom - NewClientRect.top) @@ -1181,8 +1091,8 @@ co_WinPosSetWindowPos( NewClientRect.top - OldClientRect.top); } - Window->Wnd->rcWindow = NewWindowRect; - Window->Wnd->rcClient = NewClientRect; + Window->rcWindow = NewWindowRect; + Window->rcClient = NewClientRect; if (!(WinPos.flags & SWP_SHOWWINDOW) && (WinPos.flags & SWP_HIDEWINDOW)) { @@ -1192,21 +1102,21 @@ co_WinPosSetWindowPos( 0, RDW_VALIDATE | RDW_NOFRAME | RDW_NOERASE | RDW_NOINTERNALPAINT | RDW_ALLCHILDREN); - if ((Window->Wnd->style & WS_VISIBLE) && + if ((Window->style & WS_VISIBLE) && Window->spwndParent == UserGetDesktopWindow()) { - co_IntShellHookNotify(HSHELL_WINDOWDESTROYED, (LPARAM)Window->hSelf); + co_IntShellHookNotify(HSHELL_WINDOWDESTROYED, (LPARAM)Window->head.h); } - Window->Wnd->style &= ~WS_VISIBLE; + Window->style &= ~WS_VISIBLE; } else if (WinPos.flags & SWP_SHOWWINDOW) { - if (!(Window->Wnd->style & WS_VISIBLE) && + if (!(Window->style & WS_VISIBLE) && Window->spwndParent == UserGetDesktopWindow() ) { - co_IntShellHookNotify(HSHELL_WINDOWCREATED, (LPARAM)Window->hSelf); + co_IntShellHookNotify(HSHELL_WINDOWCREATED, (LPARAM)Window->head.h); } - Window->Wnd->style |= WS_VISIBLE; + Window->style |= WS_VISIBLE; } if (Window->hrgnUpdate != NULL && Window->hrgnUpdate != (HRGN)1) @@ -1235,7 +1145,7 @@ co_WinPosSetWindowPos( else if(VisRgn) { RGNOBJAPI_Unlock(VisRgn); - NtGdiOffsetRgn(VisAfter, -Window->Wnd->rcWindow.left, -Window->Wnd->rcWindow.top); + NtGdiOffsetRgn(VisAfter, -Window->rcWindow.left, -Window->rcWindow.top); } /* @@ -1249,7 +1159,7 @@ co_WinPosSetWindowPos( VisAfter != NULL && !(WinPos.flags & SWP_NOCOPYBITS) && ((WinPos.flags & SWP_NOSIZE) || !(WvrFlags & WVR_REDRAW)) && - !(Window->Wnd->ExStyle & WS_EX_TRANSPARENT) ) + !(Window->ExStyle & WS_EX_TRANSPARENT) ) { CopyRgn = IntSysCreateRectRgn(0, 0, 0, 0); RgnType = NtGdiCombineRgn(CopyRgn, VisAfter, VisBefore, RGN_AND); @@ -1367,14 +1277,14 @@ co_WinPosSetWindowPos( GreDeleteObject(DirtyRgn); */ - PWINDOW_OBJECT Parent = Window->spwndParent; + PWND Parent = Window->spwndParent; NtGdiOffsetRgn( DirtyRgn, - Window->Wnd->rcWindow.left, - Window->Wnd->rcWindow.top); - if ( (Window->Wnd->style & WS_CHILD) && + Window->rcWindow.left, + Window->rcWindow.top); + if ( (Window->style & WS_CHILD) && (Parent) && - !(Parent->Wnd->style & WS_CLIPCHILDREN)) + !(Parent->style & WS_CLIPCHILDREN)) { IntInvalidateWindows( Parent, DirtyRgn, @@ -1425,7 +1335,7 @@ co_WinPosSetWindowPos( if (!(WinPos.flags & SWP_NOACTIVATE)) { - if ((Window->Wnd->style & (WS_CHILD | WS_POPUP)) == WS_CHILD) + if ((Window->style & (WS_CHILD | WS_POPUP)) == WS_CHILD) { co_IntSendMessageNoWait(WinPos.hwnd, WM_CHILDACTIVATE, 0, 0); } @@ -1452,14 +1362,14 @@ co_WinPosSetWindowPos( } LRESULT FASTCALL -co_WinPosGetNonClientSize(PWINDOW_OBJECT Window, RECT* WindowRect, RECT* ClientRect) +co_WinPosGetNonClientSize(PWND Window, RECT* WindowRect, RECT* ClientRect) { LRESULT Result; ASSERT_REFS_CO(Window); *ClientRect = *WindowRect; - Result = co_IntSendMessageNoWait(Window->hSelf, WM_NCCALCSIZE, FALSE, (LPARAM) ClientRect); + Result = co_IntSendMessageNoWait(Window->head.h, WM_NCCALCSIZE, FALSE, (LPARAM) ClientRect); FixClientRect(ClientRect, WindowRect); @@ -1467,12 +1377,11 @@ co_WinPosGetNonClientSize(PWINDOW_OBJECT Window, RECT* WindowRect, RECT* ClientR } void FASTCALL -co_WinPosSendSizeMove(PWINDOW_OBJECT Window) +co_WinPosSendSizeMove(PWND Wnd) { WPARAM wParam = SIZE_RESTORED; - PWND Wnd = Window->Wnd; - Window->state &= ~WINDOWOBJECT_NEED_SIZE; + Wnd->state &= ~WNDS_SENDSIZEMOVEMSGS; if (Wnd->style & WS_MAXIMIZE) { wParam = SIZE_MAXIMIZED; @@ -1482,31 +1391,27 @@ co_WinPosSendSizeMove(PWINDOW_OBJECT Window) wParam = SIZE_MINIMIZED; } - co_IntSendMessageNoWait(Window->hSelf, WM_SIZE, wParam, + co_IntSendMessageNoWait(Wnd->head.h, WM_SIZE, wParam, MAKELONG(Wnd->rcClient.right - Wnd->rcClient.left, Wnd->rcClient.bottom - Wnd->rcClient.top)); - co_IntSendMessageNoWait(Window->hSelf, WM_MOVE, 0, + co_IntSendMessageNoWait(Wnd->head.h, WM_MOVE, 0, MAKELONG(Wnd->rcClient.left, Wnd->rcClient.top)); - IntEngWindowChanged(Window, WOC_RGN_CLIENT); + IntEngWindowChanged(Wnd, WOC_RGN_CLIENT); } BOOLEAN FASTCALL -co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd) +co_WinPosShowWindow(PWND Wnd, INT Cmd) { BOOLEAN WasVisible; UINT Swp = 0; RECTL NewPos; BOOLEAN ShowFlag; // HRGN VisibleRgn; - PWND Wnd; - ASSERT_REFS_CO(Window); - Wnd = Window->Wnd; - - if (!Wnd) return FALSE; + ASSERT_REFS_CO(Wnd); WasVisible = (Wnd->style & WS_VISIBLE) != 0; @@ -1519,7 +1424,7 @@ co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd) return(FALSE); } Swp |= SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE; - if (Window->hSelf != UserGetActiveWindow()) + if (Wnd->head.h != UserGetActiveWindow()) Swp |= SWP_NOACTIVATE | SWP_NOZORDER; break; } @@ -1535,7 +1440,7 @@ co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd) Swp |= SWP_NOACTIVATE; if (!(Wnd->style & WS_MINIMIZE)) { - Swp |= co_WinPosMinMaximize(Window, SW_MINIMIZE, &NewPos) | + Swp |= co_WinPosMinMaximize(Wnd, SW_MINIMIZE, &NewPos) | SWP_FRAMECHANGED; } else @@ -1554,7 +1459,7 @@ co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd) Swp |= SWP_SHOWWINDOW; if (!(Wnd->style & WS_MAXIMIZE)) { - Swp |= co_WinPosMinMaximize(Window, SW_MAXIMIZE, &NewPos) | + Swp |= co_WinPosMinMaximize(Wnd, SW_MAXIMIZE, &NewPos) | SWP_FRAMECHANGED; } else @@ -1587,7 +1492,7 @@ co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd) Swp |= SWP_SHOWWINDOW; if (Wnd->style & (WS_MINIMIZE | WS_MAXIMIZE)) { - Swp |= co_WinPosMinMaximize(Window, SW_RESTORE, &NewPos) | + Swp |= co_WinPosMinMaximize(Wnd, SW_RESTORE, &NewPos) | SWP_FRAMECHANGED; } else @@ -1605,7 +1510,7 @@ co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd) if (ShowFlag != WasVisible) { - co_IntSendMessageNoWait(Window->hSelf, WM_SHOWWINDOW, ShowFlag, 0); + co_IntSendMessageNoWait(Wnd->head.h, WM_SHOWWINDOW, ShowFlag, 0); } /* We can't activate a child window */ @@ -1615,22 +1520,22 @@ co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd) Swp |= SWP_NOACTIVATE | SWP_NOZORDER; } - co_WinPosSetWindowPos(Window, 0 != (Wnd->ExStyle & WS_EX_TOPMOST) + co_WinPosSetWindowPos(Wnd, 0 != (Wnd->ExStyle & WS_EX_TOPMOST) ? HWND_TOPMOST : HWND_TOP, NewPos.left, NewPos.top, NewPos.right, NewPos.bottom, LOWORD(Swp)); if ((Cmd == SW_HIDE) || (Cmd == SW_MINIMIZE)) { - PWINDOW_OBJECT ThreadFocusWindow; + PWND ThreadFocusWindow; /* FIXME: This will cause the window to be activated irrespective * of whether it is owned by the same thread. Has to be done * asynchronously. */ - if (Window->hSelf == UserGetActiveWindow()) + if (Wnd->head.h == UserGetActiveWindow()) { - co_WinPosActivateOtherWindow(Window); + co_WinPosActivateOtherWindow(Wnd); } @@ -1638,20 +1543,20 @@ co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd) ThreadFocusWindow = UserGetWindowObject(IntGetThreadFocusWindow()); /* Revert focus to parent */ - if (ThreadFocusWindow && (Window == ThreadFocusWindow || - IntIsChildWindow(Window, ThreadFocusWindow))) + if (ThreadFocusWindow && (Wnd == ThreadFocusWindow || + IntIsChildWindow(Wnd, ThreadFocusWindow))) { //faxme: as long as we have ref on Window, we also, indirectly, have ref on parent... - co_UserSetFocus(Window->spwndParent); + co_UserSetFocus(Wnd->spwndParent); } } /* FIXME: Check for window destruction. */ - if ((Window->state & WINDOWOBJECT_NEED_SIZE) && - !(Window->state & WINDOWSTATUS_DESTROYING)) + if ((Wnd->state & WNDS_SENDSIZEMOVEMSGS) && + !(Wnd->state2 & WNDS2_INDESTROY)) { - co_WinPosSendSizeMove(Window); + co_WinPosSendSizeMove(Wnd); } /* Activate the window if activation is not requested and the window is not minimized */ @@ -1668,9 +1573,9 @@ co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd) #if 0 /* find child of 'parent' that contains the given point (in parent-relative coords) */ -PWINDOW_OBJECT child_window_from_point(PWINDOW_OBJECT parent, int x, int y ) +PWND child_window_from_point(PWND parent, int x, int y ) { - PWINDOW_OBJECT Wnd;// = parent->spwndChild; + PWND Wnd;// = parent->spwndChild; // LIST_FOR_EACH_ENTRY( Wnd, &parent->children, struct window, entry ) for (Wnd = parent->spwndChild; Wnd; Wnd = Wnd->spwndNext) @@ -1698,15 +1603,14 @@ Caller must dereference the "returned" Window static VOID FASTCALL co_WinPosSearchChildren( - PWINDOW_OBJECT ScopeWin, + PWND ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTests, POINT *Point, - PWINDOW_OBJECT* Window, + PWND* Window, USHORT *HitTest ) { - PWINDOW_OBJECT Current; - PWND CurrentWnd; + PWND Current; HWND *List, *phWnd; USER_REFERENCE_ENTRY Ref; @@ -1718,14 +1622,13 @@ co_WinPosSearchChildren( { if (!(Current = UserGetWindowObject(*phWnd))) continue; - CurrentWnd = Current->Wnd; - if (!(CurrentWnd->style & WS_VISIBLE)) + if (!(Current->style & WS_VISIBLE)) { continue; } - if ((CurrentWnd->style & (WS_POPUP | WS_CHILD | WS_DISABLED)) == + if ((Current->style & (WS_POPUP | WS_CHILD | WS_DISABLED)) == (WS_CHILD | WS_DISABLED)) { continue; @@ -1740,13 +1643,13 @@ co_WinPosSearchChildren( *Window = Current; UserReferenceObject(*Window); - if (CurrentWnd->style & WS_MINIMIZE) + if (Current->style & WS_MINIMIZE) { *HitTest = HTCAPTION; break; } - if (CurrentWnd->style & WS_DISABLED) + if (Current->style & WS_DISABLED) { *HitTest = HTERROR; break; @@ -1754,9 +1657,9 @@ co_WinPosSearchChildren( UserRefObjectCo(Current, &Ref); - if (OnlyHitTests && (Current->pti->MessageQueue == OnlyHitTests)) + if (OnlyHitTests && (Current->head.pti->MessageQueue == OnlyHitTests)) { - *HitTest = co_IntSendMessage(Current->hSelf, WM_NCHITTEST, 0, + *HitTest = co_IntSendMessage(Current->head.h, WM_NCHITTEST, 0, MAKELONG(Point->x, Point->y)); if ((*HitTest) == (USHORT)HTTRANSPARENT) { @@ -1767,10 +1670,10 @@ co_WinPosSearchChildren( else *HitTest = HTCLIENT; - if (Point->x >= CurrentWnd->rcClient.left && - Point->x < CurrentWnd->rcClient.right && - Point->y >= CurrentWnd->rcClient.top && - Point->y < CurrentWnd->rcClient.bottom) + if (Point->x >= Current->rcClient.left && + Point->x < Current->rcClient.right && + Point->y >= Current->rcClient.top && + Point->y < Current->rcClient.bottom) { co_WinPosSearchChildren(Current, OnlyHitTests, Point, Window, HitTest); } @@ -1785,11 +1688,11 @@ co_WinPosSearchChildren( /* wine: WINPOS_WindowFromPoint */ USHORT FASTCALL -co_WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTests, POINT *WinPoint, - PWINDOW_OBJECT* Window) +co_WinPosWindowFromPoint(PWND ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTests, POINT *WinPoint, + PWND* Window) { HWND DesktopWindowHandle; - PWINDOW_OBJECT DesktopWindow; + PWND DesktopWindow; POINT Point = *WinPoint; USHORT HitTest; @@ -1803,18 +1706,18 @@ co_WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTes return(HTERROR); } - if (ScopeWin->Wnd->style & WS_DISABLED) + if (ScopeWin->style & WS_DISABLED) { return(HTERROR); } /* Translate the point to the space of the scope window. */ DesktopWindowHandle = IntGetDesktopWindow(); - if((DesktopWindowHandle != ScopeWin->hSelf) && + if((DesktopWindowHandle != ScopeWin->head.h) && (DesktopWindow = UserGetWindowObject(DesktopWindowHandle))) { - Point.x += ScopeWin->Wnd->rcClient.left - DesktopWindow->Wnd->rcClient.left; - Point.y += ScopeWin->Wnd->rcClient.top - DesktopWindow->Wnd->rcClient.top; + Point.x += ScopeWin->rcClient.left - DesktopWindow->rcClient.left; + Point.y += ScopeWin->rcClient.top - DesktopWindow->rcClient.top; } HitTest = HTNOWHERE; @@ -1832,8 +1735,7 @@ NtUserGetMinMaxInfo( BOOL SendMessage) { POINT Size; - PWINDOW_OBJECT Window = NULL; - PWND Wnd; + PWND Window = NULL; MINMAXINFO SafeMinMax; NTSTATUS Status; BOOL ret; @@ -1849,12 +1751,11 @@ NtUserGetMinMaxInfo( } UserRefObjectCo(Window, &Ref); - Wnd = Window->Wnd; - Size.x = Window->Wnd->rcWindow.left; - Size.y = Window->Wnd->rcWindow.top; + Size.x = Window->rcWindow.left; + Size.y = Window->rcWindow.top; WinPosInitInternalPos(Window, &Size, - &Wnd->rcWindow); + &Window->rcWindow); co_WinPosGetMinMaxInfo(Window, &SafeMinMax.ptMaxSize, &SafeMinMax.ptMaxPosition, &SafeMinMax.ptMinTrackSize, &SafeMinMax.ptMaxTrackSize); diff --git a/subsystems/win32/win32k/objects/bitblt.c b/subsystems/win32/win32k/objects/bitblt.c index 3bb33d6bbac..f685b1163e5 100644 --- a/subsystems/win32/win32k/objects/bitblt.c +++ b/subsystems/win32/win32k/objects/bitblt.c @@ -291,9 +291,9 @@ NtGdiBitBlt( &DCDest->dclevel.pbrFill->ptOrigin, ROP3_TO_ROP4(ROP)); -cleanup: - if (UsesSource) + if (UsesSource) EXLATEOBJ_vCleanup(&exlo); +cleanup: if (UsesSource && hDCSrc != hDCDest) { DC_UnlockDc(DCSrc); diff --git a/subsystems/win32/win32k/objects/cliprgn.c b/subsystems/win32/win32k/objects/cliprgn.c index 4156ba79d39..63b629add84 100644 --- a/subsystems/win32/win32k/objects/cliprgn.c +++ b/subsystems/win32/win32k/objects/cliprgn.c @@ -109,10 +109,10 @@ GdiSelectVisRgn(HDC hdc, HRGN hrgn) ASSERT (dc->prgnVis != NULL); - retval = NtGdiCombineRgn(((PROSRGNDATA)dc->prgnVis)->BaseObject.hHmgr, hrgn, 0, RGN_COPY); + retval = NtGdiCombineRgn(dc->prgnVis->BaseObject.hHmgr, hrgn, 0, RGN_COPY); if ( retval != ERROR ) { - NtGdiOffsetRgn(((PROSRGNDATA)dc->prgnVis)->BaseObject.hHmgr, -dc->ptlDCOrig.x, -dc->ptlDCOrig.y); + NtGdiOffsetRgn(dc->prgnVis->BaseObject.hHmgr, -dc->ptlDCOrig.x, -dc->ptlDCOrig.y); CLIPPING_UpdateGCRegion(dc); } @@ -310,7 +310,7 @@ int APIENTRY NtGdiExcludeClipRect(HDC hDC, if (!dc->rosdc.hClipRgn) { dc->rosdc.hClipRgn = IntSysCreateRectRgn(0, 0, 0, 0); - NtGdiCombineRgn(dc->rosdc.hClipRgn, ((PROSRGNDATA)dc->prgnVis)->BaseObject.hHmgr, NewRgn, RGN_DIFF); + NtGdiCombineRgn(dc->rosdc.hClipRgn, dc->prgnVis->BaseObject.hHmgr, NewRgn, RGN_DIFF); Result = SIMPLEREGION; } else @@ -551,7 +551,7 @@ NEW_CLIPPING_UpdateGCRegion(PDC pDC) CLIPOBJ * co; /* Must have VisRgn set to a valid state! */ - if (!pDC->prgnVis) return ERROR; + ASSERT (pDC->prgnVis); if (pDC->prgnAPI) { diff --git a/subsystems/win32/win32k/objects/device.c b/subsystems/win32/win32k/objects/device.c index 659b9cb4f95..b6fb6a24708 100644 --- a/subsystems/win32/win32k/objects/device.c +++ b/subsystems/win32/win32k/objects/device.c @@ -1357,7 +1357,7 @@ IntChangeDisplaySettings( { WCHAR szBuffer[MAX_DRIVER_NAME]; PDC DC; - PWINDOW_OBJECT Wnd=NULL; + PWND Wnd=NULL; HWND hWnd; HDC hDC; @@ -1478,7 +1478,7 @@ GetDisplayNumberFromDeviceName( if (pDeviceName == NULL || pDeviceName->Length == 0) { - PWINDOW_OBJECT DesktopObject; + PWND DesktopObject; HDC DesktopHDC; PDC pDC; diff --git a/subsystems/win32/win32k/objects/palette.c b/subsystems/win32/win32k/objects/palette.c index a8f3b829bba..f031fd3b1ca 100644 --- a/subsystems/win32/win32k/objects/palette.c +++ b/subsystems/win32/win32k/objects/palette.c @@ -752,7 +752,7 @@ IntAnimatePalette(HPALETTE hPal, UINT pal_entries; HDC hDC; PDC dc; - PWINDOW_OBJECT Wnd; + PWND Wnd; const PALETTEENTRY *pptr = PaletteColors; palPtr = (PPALETTE)PALETTE_LockPalette(hPal); @@ -1071,7 +1071,7 @@ BOOL APIENTRY NtGdiUpdateColors(HDC hDC) { - PWINDOW_OBJECT Wnd; + PWND Wnd; BOOL calledFromUser, ret; USER_REFERENCE_ENTRY Ref; diff --git a/subsystems/win32/win32k/objects/path.c b/subsystems/win32/win32k/objects/path.c index 21ecb7c442b..04a1314719d 100644 --- a/subsystems/win32/win32k/objects/path.c +++ b/subsystems/win32/win32k/objects/path.c @@ -1062,8 +1062,6 @@ PATH_PathToRegion ( PPATH pPath, INT nPolyFillMode, HRGN *pHrgn ) PATH_FlattenPath ( pPath ); - /* FIXME: What happens when number of points is zero? */ - /* First pass: Find out how many strokes there are in the path */ /* FIXME: We could eliminate this with some bookkeeping in GdiPath */ numStrokes=0; @@ -1071,6 +1069,11 @@ PATH_PathToRegion ( PPATH pPath, INT nPolyFillMode, HRGN *pHrgn ) if((pPath->pFlags[i] & ~PT_CLOSEFIGURE) == PT_MOVETO) numStrokes++; + if(numStrokes == 0) + { + return FALSE; + } + /* Allocate memory for number-of-points-in-stroke array */ pNumPointsInStroke = ExAllocatePoolWithTag(PagedPool, sizeof(ULONG) * numStrokes, TAG_PATH); if(!pNumPointsInStroke)