diff --git a/Resources/Config/oolite-font.plist b/Resources/Config/oolite-font.plist index 3f75edf4..b3dbb4aa 100644 --- a/Resources/Config/oolite-font.plist +++ b/Resources/Config/oolite-font.plist @@ -1,5 +1,16 @@ { - encoding = 12; // NSWindowsCP1252StringEncoding, Windows Latin 1 + /* + Currently, Oolite supports the following encodings for fonts: + windows-latin-1 (Windows code page 1252) + windows-latin-2 (Windows code page 1250) + windows-cyrillic (Windows code page 1251) + windows-greek (Windows code page 1253) + windows-turkish (Windows code page 1254) + + OXPs with fonts in each encoding (using Helvetica) are available at: + http://svn.berlios.de/svnroot/repos/oolite-linux/trunk/tests/encodings/ + */ + encoding = "windows-latin-1"; texture = "oolite-font.png"; substitutions = diff --git a/src/Core/OOEncodingConverter.h b/src/Core/OOEncodingConverter.h index c3ccccaf..54c2a10f 100644 --- a/src/Core/OOEncodingConverter.h +++ b/src/Core/OOEncodingConverter.h @@ -49,6 +49,9 @@ SOFTWARE. */ + +#ifndef OOENCODINGCONVERTER_EXCLUDE // For the convenience of fonttexgen + #import "OOCocoa.h" @class OOCache; @@ -67,3 +70,18 @@ SOFTWARE. - (NSData *) convertString:(NSString *)string; @end + +#endif OOENCODINGCONVERTER_EXCLUDE + + +/* + There are a variety of overlapping naming schemes for text encoding. + We ignore them and use a fixed list: + "windows-latin-1" NSWindowsCP1252StringEncoding + "windows-latin-2" NSWindowsCP1250StringEncoding + "windows-cyrillic" NSWindowsCP1251StringEncoding + "windows-greek" NSWindowsCP1253StringEncoding + "windows-turkish" NSWindowsCP1254StringEncoding +*/ +NSString *StringFromEncoding(NSStringEncoding encoding); // Returns nil for unknown +NSStringEncoding EncodingFromString(NSString *name); // Returns (NSStringEncoding)NSNotFound for unknown diff --git a/src/Core/OOEncodingConverter.m b/src/Core/OOEncodingConverter.m index ba879222..22d41495 100644 --- a/src/Core/OOEncodingConverter.m +++ b/src/Core/OOEncodingConverter.m @@ -46,6 +46,8 @@ SOFTWARE. */ +#ifndef OOENCODINGCONVERTER_EXCLUDE + #import "OOEncodingConverter.h" #import "OOCache.h" #import "OOCollectionExtractors.h" @@ -112,7 +114,7 @@ static unsigned sCacheMisses = 0; - (id) initWithFontPList:(NSDictionary *)fontPList { - return [self initWithEncoding:[fontPList unsignedIntForKey:@"encoding"] substitutions:[fontPList dictionaryForKey:@"substitutions"]]; + return [self initWithEncoding:EncodingFromString([fontPList stringForKey:@"encoding"]) substitutions:[fontPList dictionaryForKey:@"substitutions"]]; } @@ -211,3 +213,58 @@ static unsigned sCacheMisses = 0; #endif @end + +#endif OOENCODINGCONVERTER_EXCLUDE + + +/* + There are a variety of overlapping naming schemes for text encoding. + We ignore them and use a fixed list: + "windows-latin-1" NSWindowsCP1252StringEncoding + "windows-latin-2" NSWindowsCP1250StringEncoding + "windows-cyrillic" NSWindowsCP1251StringEncoding + "windows-greek" NSWindowsCP1253StringEncoding + "windows-turkish" NSWindowsCP1254StringEncoding +*/ + +#define kWindowsLatin1Str @"windows-latin-1" +#define kWindowsLatin2Str @"windows-latin-2" +#define kWindowsCyrillicStr @"windows-cyrillic" +#define kWindowsGreekStr @"windows-greek" +#define kWindowsTurkishStr @"windows-turkish" + + +NSString *StringFromEncoding(NSStringEncoding encoding) +{ + switch (encoding) + { + case NSWindowsCP1252StringEncoding: + return kWindowsLatin1Str; + + case NSWindowsCP1250StringEncoding: + return kWindowsLatin2Str; + + case NSWindowsCP1251StringEncoding: + return kWindowsCyrillicStr; + + case NSWindowsCP1253StringEncoding: + return kWindowsGreekStr; + + case NSWindowsCP1254StringEncoding: + return kWindowsTurkishStr; + + default: + return nil; + } +} + + +NSStringEncoding EncodingFromString(NSString *name) +{ + if ([name isEqualToString:kWindowsLatin1Str]) return NSWindowsCP1252StringEncoding; + if ([name isEqualToString:kWindowsLatin2Str]) return NSWindowsCP1250StringEncoding; + if ([name isEqualToString:kWindowsCyrillicStr]) return NSWindowsCP1251StringEncoding; + if ([name isEqualToString:kWindowsGreekStr]) return NSWindowsCP1253StringEncoding; + if ([name isEqualToString:kWindowsTurkishStr]) return NSWindowsCP1254StringEncoding; + return (NSStringEncoding)NSNotFound; +} diff --git a/src/Core/OOWeakReference.m b/src/Core/OOWeakReference.m index d223c0bc..10749289 100644 --- a/src/Core/OOWeakReference.m +++ b/src/Core/OOWeakReference.m @@ -96,8 +96,8 @@ This code is hereby placed in the public domain. if (__builtin_expect( selector != @selector(weakRefDrop) && - selector != @selector(weakRefObjectStillExists) - && selector != @selector(weakRefUnderlyingObject), 1)) + selector != @selector(weakRefObjectStillExists) && + selector != @selector(weakRefUnderlyingObject), 1)) { // Not a proxy method; get signature from _object if it exists, otherwise generic signature for nil calls. if (__builtin_expect(_object != nil, 1)) result = [(id)_object methodSignatureForSelector:selector]; diff --git a/tools/fonttexgen/English.lproj/MainMenu.nib/designable.nib b/tools/fonttexgen/English.lproj/MainMenu.nib/designable.nib index 0ee24f52..5a77c07e 100644 --- a/tools/fonttexgen/English.lproj/MainMenu.nib/designable.nib +++ b/tools/fonttexgen/English.lproj/MainMenu.nib/designable.nib @@ -9,12 +9,11 @@ YES - YES com.apple.InterfaceBuilderKit - com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin YES @@ -33,50 +32,30 @@ YES - NewApplication + Font Texture Generator 1048576 2147483647 - - NSImage + + NSImage NSMenuCheckmark - - + + NSMenuMixedState submenuAction: - + YES - About NewApplication + About Font Texture Generator 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - UHJlZmVyZW5jZXPigKY - , - 1048576 - 2147483647 - - + + @@ -86,8 +65,8 @@ 1048576 2147483647 - - + + @@ -95,8 +74,8 @@ 1048576 2147483647 - - + + submenuAction: @@ -114,17 +93,17 @@ 1048576 2147483647 - - + + - Hide NewApplication + Hide Font Texture Generator h 1048576 2147483647 - - + + @@ -132,8 +111,8 @@ 1572864 2147483647 - - + + @@ -141,8 +120,8 @@ 1048576 2147483647 - - + + @@ -152,17 +131,17 @@ 1048576 2147483647 - - + + - Quit NewApplication + Quit Font Texture Generator q 1048576 2147483647 - - + + _NSAppleMenu @@ -174,132 +153,21 @@ 1048576 2147483647 - - + + submenuAction: YES - - - New - n - 1048576 - 2147483647 - - - - - - T3BlbuKApg - o - 1048576 - 2147483647 - - - - - - Open Recent - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - Clear Menu - - 1048576 - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - U2F2ZSBBc+KApg - S - 1179648 + s + 1048840 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - UHJpbnTigKY - p - 1048576 - 2147483647 - - + + @@ -310,8 +178,8 @@ 1048576 2147483647 - - + + submenuAction: @@ -323,8 +191,8 @@ z 1048576 2147483647 - - + + @@ -332,8 +200,8 @@ Z 1179648 2147483647 - - + + @@ -343,8 +211,8 @@ 1048576 2147483647 - - + + @@ -352,8 +220,8 @@ x 1048576 2147483647 - - + + @@ -361,8 +229,8 @@ c 1048576 2147483647 - - + + @@ -370,8 +238,8 @@ v 1048576 2147483647 - - + + @@ -379,8 +247,8 @@ 1048576 2147483647 - - + + @@ -388,8 +256,8 @@ a 1048576 2147483647 - - + + @@ -399,8 +267,8 @@ 1048576 2147483647 - - + + @@ -408,8 +276,8 @@ 1048576 2147483647 - - + + submenuAction: @@ -421,8 +289,8 @@ f 1048576 2147483647 - - + + 1 @@ -431,8 +299,8 @@ g 1048576 2147483647 - - + + 2 @@ -441,8 +309,8 @@ G 1179648 2147483647 - - + + 3 @@ -451,8 +319,8 @@ e 1048576 2147483647 - - + + 7 @@ -461,8 +329,8 @@ j 1048576 2147483647 - - + + @@ -473,8 +341,8 @@ 1048576 2147483647 - - + + submenuAction: @@ -486,8 +354,8 @@ : 1048576 2147483647 - - + + @@ -495,8 +363,8 @@ ; 1048576 2147483647 - - + + @@ -504,8 +372,8 @@ 1048576 2147483647 - - + + @@ -513,8 +381,8 @@ 1048576 2147483647 - - + + @@ -525,8 +393,8 @@ 1048576 2147483647 - - + + submenuAction: @@ -538,8 +406,8 @@ 1048576 2147483647 - - + + 1 @@ -548,8 +416,8 @@ 1048576 2147483647 - - + + 2 @@ -558,8 +426,8 @@ 1179648 2147483647 - - + + 3 @@ -571,8 +439,8 @@ 1048576 2147483647 - - + + submenuAction: @@ -584,8 +452,8 @@ 1048576 2147483647 - - + + @@ -593,8 +461,8 @@ 1048576 2147483647 - - + + @@ -602,182 +470,35 @@ - - - Format - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Show Colors - C - 1179648 - 2147483647 - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - Show Toolbar - - 1572864 - 2147483647 - - - - - - Q3VzdG9taXplIFRvb2xiYXLigKY - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - NewApplication Help - ? - 1048576 - 2147483647 - - - - - - _NSMainMenu - 7 + 15 2 - {{35, 512}, {552, 624}} + {{35, 47}, {1210, 1089}} 1946157056 - + Window NSWindow + {314, 193} - 256 + 274 YES - 268 - {{20, 52}, {512, 512}} + 274 + {{20, 20}, {1024, 1024}} FontTextureView - 268 - {{79, 21}, {46, 22}} + 265 + {{1123, 1022}, {46, 22}} YES @@ -794,7 +515,7 @@ YES 6 - System + System textBackgroundColor 3 @@ -803,7 +524,7 @@ 6 - + textColor 3 @@ -814,8 +535,8 @@ - 268 - {{17, 23}, {57, 17}} + 265 + {{1061, 1024}, {57, 17}} YES @@ -827,7 +548,7 @@ 6 - + controlColor 3 @@ -836,7 +557,7 @@ 6 - + controlTextColor @@ -844,8 +565,8 @@ - 268 - {{130, 17}, {19, 27}} + 265 + {{1174, 1018}, {19, 27}} YES @@ -861,8 +582,8 @@ - 268 - {{276, 18}, {19, 27}} + 265 + {{1174, 987}, {19, 27}} YES @@ -878,8 +599,8 @@ - 268 - {{163, 24}, {57, 17}} + 265 + {{1061, 993}, {57, 17}} YES @@ -895,8 +616,8 @@ - 268 - {{225, 22}, {46, 22}} + 265 + {{1123, 991}, {46, 22}} YES @@ -911,28 +632,10 @@ - - - 268 - {{17, 572}, {518, 34}} - - - YES - - 67239488 - 4195328 - SW1wb3J0YW50OiBzZXQg4oCcRm9udCBzbW9vdGhpbmcgc3R5bGXigJ0gdG8g4oCcU3RhbmRhcmTigJ0g -aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - - - - - - - 268 - {{442, 13}, {96, 32}} + 265 + {{1058, 893}, {96, 32}} YES @@ -952,8 +655,8 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - 268 - {{310, 23}, {110, 18}} + 265 + {{1062, 967}, {110, 18}} YES @@ -966,7 +669,7 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA 1211912703 2 - + NSSwitch @@ -978,66 +681,132 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA 25 + + + 268 + {{17, 1052}, {613, 17}} + + + YES + + 67239488 + 272630784 + SW1wb3J0YW50OiBzZXQg4oCcRm9udCBzbW9vdGhpbmcgc3R5bGXigJ0gdG8g4oCcU3RhbmRhcmTigJ0g +aW4gdGhlIEFwcGVhcmFuY2Ugc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA + + + + + + + + + 265 + {{1061, 937}, {132, 26}} + + + YES + + -2076049856 + 2048 + + + 109199615 + 1 + + + 400 + 75 + + + Latin-1 + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + 12 + + + YES + + OtherViews + + YES + + + + Latin-2 + + 1048576 + 2147483647 + + + _popUpItemAction: + 15 + + + + + Cyrillic + + 1048576 + 2147483647 + + + _popUpItemAction: + 11 + + + + + Greek + + 1048576 + 2147483647 + + + _popUpItemAction: + 13 + + + + + Turkish + + 1048576 + 2147483647 + + + _popUpItemAction: + 14 + + + + + 1 + YES + YES + 2 + + - {552, 624} + {1210, 1089} {{0, 0}, {1920, 1178}} + {314, 215} - - YES - offsetX - offsetY - alternatingColors - YES YES - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - orderFrontStandardAboutPanel: @@ -1046,14 +815,6 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA 142 - - - performClose: - - - - 193 - toggleContinuousSpellChecking: @@ -1150,14 +911,6 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA 235 - - - performZoom: - - - - 240 - performFindPanelAction: @@ -1206,62 +959,6 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA 357 - - - showHelp: - - - - 360 - - - - orderFrontColorPanel: - - - - 361 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - hide: @@ -1294,33 +991,17 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA 370 - - - newDocument: - - - - 373 - - - - openDocument: - - - - 374 - - value: values.offsetX + value: values.offsetX - + value - values.offsetX + values.offsetX 2 @@ -1328,7 +1009,7 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - value: values.offsetX + @@ -1336,7 +1017,7 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - values.offsetX + 2 @@ -1344,15 +1025,15 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - value: values.offsetY + value: values.offsetY - + - values.offsetY + values.offsetY 2 @@ -1360,7 +1041,7 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - value: values.offsetY + @@ -1368,7 +1049,7 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - values.offsetY + 2 @@ -1398,6 +1079,30 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA 419 + + + saveImage: + + + + 420 + + + + takeEncodingFromTag: + + + + 431 + + + + encodingPopUp + + + + 432 + @@ -1433,26 +1138,13 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA YES - - - - MainMenu - - 19 - - - YES - - - - 56 @@ -1462,16 +1154,6 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - - 103 - - - YES - - - - 1 - 217 @@ -1495,102 +1177,16 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA YES - - - - - - - - - - - - 75 - - - 3 - 80 8 - - 78 - - - 6 - - - 72 - - - - - 82 - - - 9 - - - 124 - - - YES - - - - - - 77 - - - 5 - - - 73 - - - - - - 79 - - - 7 - - - 112 - - - 10 - - - 74 - - - 2 - - - 125 - - - YES - - - - - - 126 - - - 205 @@ -1740,21 +1336,6 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - - 106 - - - YES - - - - - - - 111 - - - 57 @@ -1765,9 +1346,7 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - - @@ -1800,22 +1379,11 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - - 129 - - - 121 - 143 - - 236 - - - 131 @@ -1840,96 +1408,6 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - - 24 - - - YES - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - YES - - - - - - 296 - - - YES - - - - - - - 297 - - - - - 298 - - - - - 299 - - - YES - - - - - - 300 - - - YES - - - - - - - 344 - - - - - 345 - - - 211 @@ -2020,9 +1498,10 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - + + @@ -2120,20 +1599,6 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - - 411 - - - YES - - - - - - 412 - - - 413 @@ -2162,6 +1627,76 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA + + 421 + + + YES + + + + + + 422 + + + + + 423 + + + YES + + + + + + 424 + + + YES + + + + + + 425 + + + YES + + + + + + + + + + 426 + + + + + 427 + + + + + 428 + + + + + 429 + + + + + 430 + + + @@ -2171,24 +1706,6 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA -1.IBPluginDependency -2.IBPluginDependency -3.IBPluginDependency - 103.IBPluginDependency - 103.ImportedFromIB2 - 106.IBPluginDependency - 106.ImportedFromIB2 - 106.editorWindowContentRectSynchronizationRect - 111.IBPluginDependency - 111.ImportedFromIB2 - 112.IBPluginDependency - 112.ImportedFromIB2 - 124.IBPluginDependency - 124.ImportedFromIB2 - 125.IBPluginDependency - 125.ImportedFromIB2 - 125.editorWindowContentRectSynchronizationRect - 126.IBPluginDependency - 126.ImportedFromIB2 - 129.IBPluginDependency - 129.ImportedFromIB2 130.IBPluginDependency 130.ImportedFromIB2 130.editorWindowContentRectSynchronizationRect @@ -2208,8 +1725,6 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA 149.ImportedFromIB2 150.IBPluginDependency 150.ImportedFromIB2 - 19.IBPluginDependency - 19.ImportedFromIB2 195.IBPluginDependency 195.ImportedFromIB2 196.IBPluginDependency @@ -2268,29 +1783,10 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA 220.editorWindowContentRectSynchronizationRect 221.IBPluginDependency 221.ImportedFromIB2 - 23.IBPluginDependency - 23.ImportedFromIB2 - 236.IBPluginDependency - 236.ImportedFromIB2 - 239.IBPluginDependency - 239.ImportedFromIB2 - 24.IBPluginDependency - 24.ImportedFromIB2 - 24.editorWindowContentRectSynchronizationRect 29.IBPluginDependency 29.ImportedFromIB2 29.WindowOrigin 29.editorWindowContentRectSynchronizationRect - 295.IBPluginDependency - 296.IBPluginDependency - 296.editorWindowContentRectSynchronizationRect - 297.IBPluginDependency - 298.IBPluginDependency - 299.IBPluginDependency - 300.IBPluginDependency - 300.editorWindowContentRectSynchronizationRect - 344.IBPluginDependency - 345.IBPluginDependency 346.IBPluginDependency 346.ImportedFromIB2 348.IBPluginDependency @@ -2308,6 +1804,8 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA 371.IBWindowTemplateEditedContentRect 371.NSWindowTemplate.visibleAtLaunch 371.editorWindowContentRectSynchronizationRect + 371.windowTemplate.hasMinSize + 371.windowTemplate.minSize 372.IBPluginDependency 375.IBPluginDependency 376.IBPluginDependency @@ -2322,14 +1820,21 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA 398.IBPluginDependency 399.IBPluginDependency 400.IBPluginDependency - 411.IBPluginDependency - 412.IBPluginDependency 413.IBPluginDependency 414.IBPluginDependency 416.IBPluginDependency 417.IBPluginDependency - 5.IBPluginDependency - 5.ImportedFromIB2 + 421.IBPluginDependency + 422.IBPluginDependency + 423.IBPluginDependency + 424.IBPluginDependency + 425.IBPluginDependency + 425.editorWindowContentRectSynchronizationRect + 426.IBPluginDependency + 427.IBPluginDependency + 428.IBPluginDependency + 429.IBPluginDependency + 430.IBPluginDependency 56.IBPluginDependency 56.ImportedFromIB2 57.IBPluginDependency @@ -2337,227 +1842,161 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA 57.editorWindowContentRectSynchronizationRect 58.IBPluginDependency 58.ImportedFromIB2 - 72.IBPluginDependency - 72.ImportedFromIB2 - 73.IBPluginDependency - 73.ImportedFromIB2 - 74.IBPluginDependency - 74.ImportedFromIB2 - 75.IBPluginDependency - 75.ImportedFromIB2 - 77.IBPluginDependency - 77.ImportedFromIB2 - 78.IBPluginDependency - 78.ImportedFromIB2 - 79.IBPluginDependency - 79.ImportedFromIB2 80.IBPluginDependency 80.ImportedFromIB2 81.IBPluginDependency 81.ImportedFromIB2 81.editorWindowContentRectSynchronizationRect - 82.IBPluginDependency - 82.ImportedFromIB2 83.IBPluginDependency 83.ImportedFromIB2 - 92.IBPluginDependency - 92.ImportedFromIB2 YES - + - + - - - {{596, 852}, {216, 23}} - - - - - - - - - {{522, 812}, {146, 23}} - - - - - - {{436, 809}, {64, 6}} - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + {{608, 612}, {275, 83}} - + - + - + - + - + {{187, 434}, {243, 243}} - + - + - + - + - + - + - + {{608, 612}, {167, 43}} - + - + - + - + - + - + - + - + {{608, 612}, {241, 103}} - + - - - - - - - - - {{525, 802}, {197, 73}} - + {74, 862} - {{6, 978}, {478, 20}} - - - {{475, 832}, {234, 43}} - - - - - {{231, 634}, {176, 43}} - - - + {{593, 1006}, {297, 20}} + - + - + {{608, 612}, {215, 63}} - - - - - - - - {{35, 512}, {552, 624}} - - {{35, 512}, {552, 624}} - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - + - + - {{23, 794}, {245, 183}} - + + {{35, 47}, {1210, 1089}} - + {{35, 47}, {1210, 1089}} + + {314, 193} + + + + + + + + + + + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + {{1085, 907}, {132, 103}} + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + - + - + {{605, 853}, {298, 153}} + - + - + - - - - - - - - - {{145, 474}, {199, 203}} - - - - - + {{737, 983}, {142, 23}} + @@ -2581,7 +2020,7 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA - 419 + 432 @@ -2590,18 +2029,22 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA FontTextureView NSView - saveImage: - id - - YES - + YES + saveImage: + takeEncodingFromTag: YES + id + + + + NSPopUpButton + IBProjectSource FontTextureView.h @@ -2614,412 +2057,345 @@ aW4gdGhlIEFwcGVhcmFuY2UKc3lzdGVtIHByZWZlcmVuY2VzIHBhbmUuA 3 YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEClQALAAwAMQA1ADYAPAA9 -AEIAVgBXAFgAWQALAGYAcwB8AH0AfgCDAI0AjgCgAKEAqQCqAK0AtwC4ALkAvgDAAMUAxgDJAM0A0QDZ -ANoA4gDjAOgA6QDsAPEA8gD6APsBCAELAQ4BFgEXARsBIwEkASsBLAE0ATUBPQFFAUYBTgFPAVcBWAFr -AWwBbwFyAXoBewGIAYkBjgGPAZABkwGPAZcBmgGeAAsBnwGhAaIBpQGpAdkB3wHvAfUB9gH3AfsB/AIA -AgECBAIFAgkCDQIWAhoCGwIcAh0CIwIqAisCLAIwAjgCPAI9Aj4CPwJDAkoCTgJPAlACUQJVAl4CYgJj -AmQCZQJpAnACcQJyAnMCdwJ+AoICgwKEAoUCiQKQApQClQKWApoCoQKiAqMCpAKoAq8CsAKxArICtgK9 -Ar4CvwLDAsoCywLMAs0C0QLYAtkC2gLbAt8C5gLnAugC6QLtAvQC9QL2AvcC+wMCAwcDCAMJAw0DFQMW -AxcDGAMcAyMDJAMlAykDMAM1AzYDNwM7A0IDRgNHA0gDSQNNAWsDVANVA1YDWgNhA2IDYwNnA24DcgNz -A3QDdQN5A4ADgQOCA4YDjQOOA48DkwOaA5sDnAOgA6cDqAOpA60DtAO1A7YDugPBA8IDwwPEA8gDzwPQ -A9ED0gPXA9gD3APjA+QD5QPmA+oD8QP1A/YD9wP4A/wEAwQEBAUEBgQKBBEEEgQTBBQEGAQfBCAEIQQi -BCYELQQuBC8EMwQ6BDsEPAQ9BEEESARJBEoEVARaBGAEYQRiBGMEZwRoBGkEagRtBGcEaQR0BHsEfAR9 -BHsEfASEBIsEjASNBPcFAgUDBREFHAUdBR4FIgUjBSUFLgU3BTgFPQVGBR0FRwVPBVYFVwVeBV8FZgVn -BWgFaQVuBXcFHQV8BX0FgwWEBZIFmwWiBaMFpAWtBbYFHQW3BbwFvwXABckFygXLBc8F0AXXBR0F4AXp -BR0F6gXvBfYF9wUdBgAGBwYQBhEFHQYaBR0GIwYkBi4FHQY3BkAFHQZBBlEGWgZjBR0GbAUdBnUGdgZ5 -BnsG5QdQB7sHvAe9B74HvwfAB8EHwgfDB8QHxQfGB8cHyAfJB8oHywfMB80HzgfPB9AH0QfSB9MH1AfV -B9YH1wfYB9kH2gfbB9wH3QfeB98H4AfhB+IH4wfkB+UH5gfnB+gH6QfqB+sH7AftB+4H7wfwB/EH8gfz -B/QH9Qf2B/cH+Af5B/oH+wf8B/0H/gf/CAAIAQgCCAMIBAgFCAYIBwgICAkICggLCAwIDQgOCA8IEAgR -CBIIEwgUCBUIFggXCBgIGQgaCBsIHAgdCB4IHwggCCEIIggjCCYIKQjBCVkJWglbCVwJXQleCV8JYAlh -CWIJYwlkCWUJZglnCWgJaQlqCWsJbAltCW4JbwlwCXEJcglzCXQJdQl2CXcJeAl5CXoJewl8CX0Jfgl/ -CYAJgQmCCYMJhAFoCYUJhgmHCYgJiQmKCYsJjAmNCY4JjwmQCZEJkgmTCZQJlQmWCZcJmAmZCZoJmwmc -CZ0JngmfCaAJoQFjCaIJowmkCaUJpgmnCagJqQmqCasJrAmtCa4JrwmwCbEJsgmzCbQJtQm2CbcJuAm5 -CboJuwm8Cb0Jvgm/CcAJwQnCCcMJxAnFCcYJxwnICckJygnLCcwJzQnOCc8J0AnRCdIJ0wnUCdUJ1gnX -CdgJ2QnaCdsJ3AndCd4J3wngCeEJ4gnjCeQJ5QnmCecJ6AnpCeoJ6wnsCe8J8gn1VSRudWxs3xASAA0A -DgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsA -LAAtAC4ALwAwVk5TUm9vdFYkY2xhc3NdTlNPYmplY3RzS2V5c18QD05TQ2xhc3Nlc1ZhbHVlc18QGU5T -QWNjZXNzaWJpbGl0eU9pZHNWYWx1ZXNdTlNDb25uZWN0aW9uc1tOU05hbWVzS2V5c1tOU0ZyYW1ld29y -a11OU0NsYXNzZXNLZXlzWk5TT2lkc0tleXNdTlNOYW1lc1ZhbHVlc18QGU5TQWNjZXNzaWJpbGl0eUNv -bm5lY3RvcnNdTlNGb250TWFuYWdlcl8QEE5TVmlzaWJsZVdpbmRvd3NfEA9OU09iamVjdHNWYWx1ZXNf -EBdOU0FjY2Vzc2liaWxpdHlPaWRzS2V5c1lOU05leHRPaWRcTlNPaWRzVmFsdWVzgAKBApSBATiBAfmB -ApOAV4EBjoAFgQH4gQH6gQGPgQKRgACABoEBjYECkhEBpYEB+9IADgAyADMANFtOU0NsYXNzTmFtZYAE -gANdTlNBcHBsaWNhdGlvbtIANwA4ADkAOlgkY2xhc3Nlc1okY2xhc3NuYW1logA6ADteTlNDdXN0b21P -YmplY3RYTlNPYmplY3RfEBBJQkNvY29hRnJhbWV3b3Jr0gAOAD4APwBAWk5TLm9iamVjdHOAVqEAQYAH -2gBDAA4ARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUACtcTlNXaW5kb3dWaWV3XE5TU2Ny -ZWVuUmVjdF1OU1dpbmRvd1RpdGxlWU5TV1RGbGFnc11OU1dpbmRvd0NsYXNzXE5TV2luZG93UmVjdF8Q -D05TV2luZG93QmFja2luZ18QEU5TV2luZG93U3R5bGVNYXNrW05TVmlld0NsYXNzgAuAVYBUgAkSdAAA -AIAKgAgQAhAHgABfEBd7ezM1LCA1MTJ9LCB7NTUyLCA2MjR9fVZXaW5kb3dYTlNXaW5kb3fXAFoADgBb -AFwAXQBYAF4AXwBgAGEAYgBjAF8AZV8QD05TTmV4dFJlc3BvbmRlclpOU1N1YnZpZXdzWE5TdkZsYWdz -W05TRnJhbWVTaXplW05TU3VwZXJ2aWV3gAyAU4ANEQEAgFGADIBS0gAOAD4AZwBogFCqAGkAagBrAGwA -bQBuAG8AcABxAHKADoASgCOALIAxgDSAOIA7gD+ARdcAWgAOAHQAXABYADIAXgBMAHYAdwB4AF8AegBM -V05TRnJhbWWAC4ARgA8RAQyADIAQgAtfEBZ7ezIwLCA1Mn0sIHs1MTIsIDUxMn19XxAPRm9udFRleHR1 -cmVWaWV30gA3ADgAfwCApACAAIEAggA7XE5TQ3VzdG9tVmlld1ZOU1ZpZXdbTlNSZXNwb25kZXLYAFoA -DgB0AIQAXACFAFgAXgBMAIcAiACJAHgAigBfAExWTlNDZWxsWU5TRW5hYmxlZIALgCKAE4AUCYAMgAtf -EBR7ezc5LCAyMX0sIHs0NiwgMjJ9fdkAjwAOAJAAkQCSAJMAlACVAJYAlwCYAJkAmgCbAGoAnQCKAJ9b -TlNDZWxsRmxhZ3NfEBFOU0JhY2tncm91bmRDb2xvclpOU0NvbnRlbnRzWU5TU3VwcG9ydF1OU0NvbnRy -b2xWaWV3XE5TQ2VsbEZsYWdzMl8QEU5TRHJhd3NCYWNrZ3JvdW5kW05TVGV4dENvbG9yE/////+Ucf5B -gCGAGYAVgBaAEhIQQAQACYAeUNQADgCiAKMApAClAKYApwCoVk5TU2l6ZVZOU05hbWVYTlNmRmxhZ3OA -GCNAKgAAAAAAAIAXEQQUXEx1Y2lkYUdyYW5kZdIANwA4AKsArKIArAA7Vk5TRm9udNUADgCuAK8AsACx -ALIAswC0ALUAtldOU0NvbG9yXE5TQ29sb3JTcGFjZVtOU0NvbG9yTmFtZV1OU0NhdGFsb2dOYW1lgB2A -HBAGgBuAGlZTeXN0ZW1fEBN0ZXh0QmFja2dyb3VuZENvbG9y0wAOAK8AugCyALwAvVdOU1doaXRlgB0Q -A0IxANIANwA4AL8ArqIArgA71QAOAK4ArwCwALEAsgDCALQAwwC2gB2AIIAfgBpZdGV4dENvbG9y0wAO -AK8AugCyALwAyIAdQjAA0gA3ADgAygDLpADLAMwAhAA7XxAPTlNUZXh0RmllbGRDZWxsXE5TQWN0aW9u -Q2VsbNIANwA4AM4Az6UAzwDQAIEAggA7W05TVGV4dEZpZWxkWU5TQ29udHJvbNgAWgAOAHQAhABcAIUA -WABeAEwAhwDUANUAeACKAF8ATIALgCKAJIAlCYAMgAtfEBR7ezE3LCAyM30sIHs1NywgMTd9fdgAjwAO -AJAAkQCSAJMAlACWANsAmADdAN4AmwBrAJ0A4RIEAf5AgCGAJ4AmgBaAI4AqWVggb2Zmc2V0OtUADgCu -AK8AsACxALIA5QC0AOYAtoAdgCmAKIAaXGNvbnRyb2xDb2xvctMADgCvALoAsgC8AOuAHUswLjY2NjY2 -NjY5ANUADgCuAK8AsACxALIAwgC0AO8AtoAdgCCAK4AaXxAQY29udHJvbFRleHRDb2xvctgAWgAOAHQA -hABcAIUAWABeAEwA9AD1APYAeACKAF8ATIALgDCALYAuCYAMgAtfEBV7ezEzMCwgMTd9LCB7MTksIDI3 -fX3YAI8ADgD8AP0A/gCTAJQA/wEAAQEBAgEDAQQAbAEGAIpbTlNJbmNyZW1lbnRaTlNNYXhWYWx1ZVpO -U01pblZhbHVlXE5TQXV0b3JlcGVhdBIADf4ggC8jP/AAAAAAAAAjQIAAAAAAAAAjwIAAAAAAAACALBAA -CdIANwA4AQkBCqQBCgDMAIQAO11OU1N0ZXBwZXJDZWxs0gA3ADgBDAENpQENANAAgQCCADtZTlNTdGVw -cGVy2ABaAA4AdACEAFwAhQBYAF4ATAD0AREBEgB4AIoAXwBMgAuAMIAygDMJgAyAC18QFXt7Mjc2LCAx -OH0sIHsxOSwgMjd9fdgAjwAOAPwA/QD+AJMAlAD/AQABAQECAQMBBABtAQYAioAvgDEJ2ABaAA4AdACE -AFwAhQBYAF4ATACHAR4BHwB4AIoAXwBMgAuAIoA1gDYJgAyAC18QFXt7MTYzLCAyNH0sIHs1NywgMTd9 -fdgAjwAOAJAAkQCSAJMAlACWANsAmADdAScAmwBuAJ0A4YAhgCeAN4AWgDSAKllZIG9mZnNldDrYAFoA -DgB0AIQAXACFAFgAXgBMAIcBLwEwAHgAigBfAEyAC4AigDmAOgmADIALXxAVe3syMjUsIDIyfSwgezQ2 -LCAyMn192QCPAA4AkACRAJIAkwCUAJUAlgCXAJgAmQCaAJsAbwCdAIoAn4AhgBmAFYAWgDgJgB7YAFoA -DgB0AIQAXACFAFgAXgBMAIcBQAFBAHgAigBfAEyAC4AigDyAPQmADIALXxAWe3sxNywgNTcyfSwgezUx -OCwgMzR9fdgAjwAOAJAAkQCSAJMAlACWANsAmADdAUkAmwBwAUwA4YAhgCeAPoAWgDsSAEAEAIAqbxBe -AEkAbQBwAG8AcgB0AGEAbgB0ADoAIABzAGUAdAAgIBwARgBvAG4AdAAgAHMAbQBvAG8AdABoAGkAbgBn -ACAAcwB0AHkAbABlIB0AIAB0AG8AICAcAFMAdABhAG4AZABhAHIAZCAdACAAaQBuACAAdABoAGUAIABB -AHAAcABlAGEAcgBhAG4AYwBlAAoAcwB5AHMAdABlAG0AIABwAHIAZQBmAGUAcgBlAG4AYwBlAHMAIABw -AGEAbgBlAC7YAFoADgB0AIQAXACFAFgAXgBMAVEBUgFTAHgAigBfAEyAC4BEgECAQQmADIALXxAVe3s0 -NDIsIDEzfSwgezk2LCAzMn193ACPAA4BWQFaAVsBXACRAJIAkwFdAJQBXgFfAWAAmgFiAWMAmgFlAJsA -cQFoAWkBal8QE05TQWx0ZXJuYXRlQ29udGVudHNfEBJOU1BlcmlvZGljSW50ZXJ2YWxeTlNCdXR0b25G -bGFnczJfEA9OU0tleUVxdWl2YWxlbnRfEA9OU1BlcmlvZGljRGVsYXldTlNCdXR0b25GbGFncxIEAf4A -gEOAFRAZEIGAFYBCgBaAPxDIEggAAAAT/////4aCQP9UU2F2ZdIANwA4AW0BbqQBbgDMAIQAO1xOU0J1 -dHRvbkNlbGzSADcAOAFwAXGlAXEA0ACBAIIAO1hOU0J1dHRvbtgAWgAOAHQAhABcAIUAWABeAEwBUQF1 -AXYAeACKAF8ATIALgESARoBHCYAMgAtfEBZ7ezMxMCwgMjN9LCB7MTEwLCAxOH193gCPAA4BWQF8AVoB -WwF9AVwAkQCSAJMBXQCUAV4BfgFgAJoBgQFiAFMBggCaAYQAmwByAWgBBgGHXU5TTm9ybWFsSW1hZ2Vf -EBBOU0FsdGVybmF0ZUltYWdlE/////+EAf4AgEOAFYBJgE2AFYBIgBaARRJIPFH/XENoZWNrZXJib2Fy -ZNMADgAyAYoBiwGMAY1eTlNSZXNvdXJjZU5hbWWATIBKgEtXTlNJbWFnZVhOU1N3aXRjaNIANwA4AZEB -kqIBkgA7XxAQTlNDdXN0b21SZXNvdXJjZdIADgGUAZUBlltOU0ltYWdlTmFtZYBPgE7SADcAOAGYAZmi -AZkAO18QE05TQnV0dG9uSW1hZ2VTb3VyY2XSADcAOAGbAZyjAZwBnQA7Xk5TTXV0YWJsZUFycmF5V05T -QXJyYXlaezU1MiwgNjI0fdIANwA4AaAAgaMAgQCCADtfEBZ7ezAsIDB9LCB7MTkyMCwgMTE3OH190gA3 -ADgBowGkogGkADtfEBBOU1dpbmRvd1RlbXBsYXRl0gA3ADgBpgGnowGnAagAO1xOU011dGFibGVTZXRV -TlNTZXTSAA4APgBnAauAUK8QLQGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8B -wAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2IBYgGSAaoBugHSA -eoCAgIWAi4CQgJWAmoCegKOAqICtgLKAt4C8gMCAxYDLgNCA1IDagN6A4oDmgOqA7oDzgPiA+oD/gQEF -gQEKgQEPgQEUgQEYgQEdgQEhgQEsgQEvgQEygQE10wAOAdoB2wHcAd0B3lhOU1NvdXJjZVdOU0xhYmVs -gGOAWYBi2AAOAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuV05TVGl0bGVfEBFOU0tleUVxdWl2 -TW9kTWFza1pOU0tleUVxdWl2XU5TTW5lbW9uaWNMb2NZTlNPbkltYWdlXE5TTWl4ZWRJbWFnZVZOU01l -bnWAYYBbEgAYAACAXBJ/////gF2AX4Ba1AAOAeAAowHwAfEB8gHzAfRbTlNNZW51SXRlbXOBAUGBAViB -AWaBAVlbSGlkZSBPdGhlcnNRaNMADgAyAYoBiwGMAfqATIBKgF5fEA9OU01lbnVDaGVja21hcmvTAA4A -MgGKAYsBjAH/gEyASoBgXxAQTlNNZW51TWl4ZWRTdGF0ZdIANwA4AgICA6ICAwA7Wk5TTWVudUl0ZW1f -EBZoaWRlT3RoZXJBcHBsaWNhdGlvbnM60gA3ADgCBgIHowIHAggAO18QFU5TTmliQ29udHJvbENvbm5l -Y3Rvcl5OU05pYkNvbm5lY3RvctMADgHaAdsB3AILAgyAY4BlgGnZAA4B4AHhAeIB4wHkAeUB5gIOAecC -EAIRAhIB6wHsAe0CFQC8VU5TVGFngGGAZxIAEgAAgGiAXYBfgGbTAA4B4AHwAfECGAIZgQFBgQFWgQFX -W1NtYXJ0IExpbmtzUUdfEB10b2dnbGVBdXRvbWF0aWNMaW5rRGV0ZWN0aW9uOtQADgIeAdoB2wHcAB8C -IQIiXU5TRGVzdGluYXRpb26AY4ACgGuAbdcADgHgAeIB4wHkAeUB5gHnAiUAmgHrAewB7QHugGGAbIAV -gF2AX4BaXxAUQWJvdXQgTmV3QXBwbGljYXRpb25fEB1vcmRlckZyb250U3RhbmRhcmRBYm91dFBhbmVs -OtMADgHaAdsB3AIuAi+AY4BvgHPYAA4B4AHhAeIB4wHkAeUB5gHnAjICMwI0AesB7AHtAjeAYYBxEgAQ -AACAcoBdgF+AcNMADgHgAfAB8QI6AjuBAUGBAYGBAYNUQ29weVFjVWNvcHk60wAOAdoB2wHcAkECQoBj -gHWAedgADgHgAeEB4gHjAeQB5QHmAecCRQIzAkYB6wHsAe0CSYBhgHeAeIBdgF+AdtMADgHgAfAB8QJM -Ak2BAUGBAUeBAUlfEBFKdW1wIHRvIFNlbGVjdGlvblFqXxAdY2VudGVyU2VsZWN0aW9uSW5WaXNpYmxl -QXJlYTrTAA4B2gHbAdwCUwJUgGOAe4B/2QAOAlYB4AHhAeIB4wHkAeUB5gHnAJoCWQIRAloB6wHsAe0C -XVlOU1Rvb2xUaXCAYYAVgH2AfoBdgF+AfNMADgHgAfAB8QJgAmGBAUGBATqBATtdUGFnZSBTZXR1cC4u -LlFQXnJ1blBhZ2VMYXlvdXQ60wAOAdoB2wHcAmcCaIBjgIGAhNgADgHgAeEB4gHjAeQB5QHmAecCawIR -AmwB6wHsAe0CXYBhgIKAg4BdgF+AfGgAUwBhAHYAZQAgAEEAcyAmUVNfEA9zYXZlRG9jdW1lbnRBczrT -AA4B2gHbAdwCdQJ2gGOAhoCK2AAOAeAB4QHiAeMB5AHlAeYB5wJ5AjMCegHrAewB7QJ9gGGAiICJgF2A -X4CH0wAOAeAB8AHxAoACgYEBQYEBaYEBal5DaGVjayBTcGVsbGluZ1E7XmNoZWNrU3BlbGxpbmc60wAO -AdoB2wHcAocCiIBjgIyAj9gADgHgAeEB4gHjAeQB5QHmAecCiwIzAJoB6wHsAe0Cj4BhgI6AFYBdgF+A -jdMADgHgAfAB8QKSApOBAUGBAUSBAUVdU3RvcCBTcGVha2luZ11zdG9wU3BlYWtpbmc60wAOAdoB2wHc -ApgCmYBjgJGAlNgADgHgAeEB4gHjAeQB5QHmAecCnAIzAp0B6wHsAe0CfYBhgJKAk4BdgF+Ah24AUwBo -AG8AdwAgAFMAcABlAGwAbABpAG4AZyAmUTpfEA9zaG93R3Vlc3NQYW5lbDrTAA4B2gHbAdwCpgKngGOA -loCZ2AAOAeAB4QHiAeMB5AHlAeYB5wKqAjMCqwHrAewB7QHugGGAl4CYgF2AX4BaXxATUXVpdCBOZXdB -cHBsaWNhdGlvblFxWnRlcm1pbmF0ZTrTAA4B2gHbAdwCtAK1gGOAm4Cd1wAOAeAB4gHjAeQB5QHmAecC -uACaAesB7AHtAl2AYYCcgBWAXYBfgHxfEA9SZXZlcnQgdG8gU2F2ZWRfEBZyZXZlcnREb2N1bWVudFRv -U2F2ZWQ60wAOAdoB2wHcAsECwoBjgJ+AotkADgHgAeEB4gHjAeQB5QHmAg4B5wLFAjMCxgHrAewB7QIV -AFOAYYCggKGAXYBfgGZcU21hcnQgUXVvdGVzUWdfECF0b2dnbGVBdXRvbWF0aWNRdW90ZVN1YnN0aXR1 -dGlvbjrTAA4B2gHbAdwCzwLQgGOApICn2AAOAeAB4QHiAeMB5AHlAeYB5wLTAjMC1AHrAewB7QI3gGGA -pYCmgF2AX4BwVVBhc3RlUXZWcGFzdGU60wAOAdoB2wHcAt0C3oBjgKmArNgADgHgAeEB4gHjAeQB5QHm -AecC4QIzAuIB6wHsAe0CXYBhgKqAq4BdgF+AfGYAUAByAGkAbgB0ICZRcFZwcmludDrTAA4B2gHbAdwC -6wLsgGOAroCx2AAOAeAB4QHiAeMB5AHlAeYB5wLvAjMC8AHrAewB7QJdgGGAr4CwgF2AX4B8ZQBPAHAA -ZQBuICZRb11vcGVuRG9jdW1lbnQ60wAOAdoB2wHcAvkC+oBjgLOAttgADgHgAeEB4gHjAeQB5QHmAecC -/QIzAJoB6wHsAe0DAYBhgLWAFYBdgF+AtNQADgHgAKMB8AHxAE8DBQMGgQFBgAmBAXeBAXVfEBJCcmlu -ZyBBbGwgdG8gRnJvbnRfEA9hcnJhbmdlSW5Gcm9udDrTAA4B2gHbAdwDCwMMgGOAuIC72QAOAeAB4QHi -AeMB5AHlAeYCDgHnAw8CMwMQAesB7AHtAhUDFIBhgLmAuoBdgF+AZhABXxAQU21hcnQgQ29weS9QYXN0 -ZVFmXxAYdG9nZ2xlU21hcnRJbnNlcnREZWxldGU60wAOAdoB2wHcAxoDG4BjgL2Av9gADgHgAeEB4gHj -AeQB5QHmAecDHgIzAJoB6wHsAe0DAYBhgL6AFYBdgF+AtFRab29tXHBlcmZvcm1ab29tOtMADgHaAdsB -3AMnAyiAY4DBgMTYAA4B4AHhAeIB4wHkAeUB5gHnAysCMwCaAesB7AHtAy+AYYDDgBWAXYBfgMLUAA4B -4ACjAfAB8QMyAzMDNIEBQYEBPYEBQIEBP1pDbGVhciBNZW51XxAVY2xlYXJSZWNlbnREb2N1bWVudHM6 -0wAOAdoB2wHcAzkDOoBjgMaAytgADgHgAeEB4gHjAeQB5QHmAecDPQIRAz4B6wHsAe0DQYBhgMiAyYBd -gF+Ax9MADgHgAfAB8QNEA0WBAUGBAW6BAXBbU2hvdyBDb2xvcnNRQ18QFW9yZGVyRnJvbnRDb2xvclBh -bmVsOtMADgHaAdsB3ANLA0yAY4DMgM/YAA4B4AHhAeIB4wHkAeUB5gHnA08CMwNQAesB7AHtAl2AYYDN -gM6AXYBfgHxRc11zYXZlRG9jdW1lbnQ60wAOAdoB2wHcA1gDWYBjgNGA09gADgHgAeEB4gHjAeQB5QHm -AecDXAIzAJoB6wHsAe0CN4BhgNKAFYBdgF+AcFZEZWxldGVXZGVsZXRlOtMADgHaAdsB3ANlA2aAY4DV -gNnYAA4B4AHhAeIB4wHkAeUB5gHnA2kB6QNqAesB7AHtA22AYYDXgNiAXYBfgNbTAA4B4AHwAfEDcANx -gQFBgQFRgQFSXFNob3cgVG9vbGJhclF0XxATdG9nZ2xlVG9vbGJhclNob3duOtMADgHaAdsB3AN3A3iA -Y4DbgN3YAA4B4AHhAeIB4wHkAeUB5gHnA3sCMwCaAesB7AHtAo+AYYDcgBWAXYBfgI1eU3RhcnQgU3Bl -YWtpbmdec3RhcnRTcGVha2luZzrTAA4B2gHbAdwDhAOFgGOA34Dh2AAOAeAB4QHiAeMB5AHlAeYB5wOI -AjMAmgHrAewB7QJ9gGGA4IAVgF2AX4CHXxAbQ2hlY2sgU3BlbGxpbmcgV2hpbGUgVHlwaW5nXxAedG9n -Z2xlQ29udGludW91c1NwZWxsQ2hlY2tpbmc60wAOAdoB2wHcA5EDkoBjgOOA5dgADgHgAeEB4gHjAeQB -5QHmAecDlQIzAeoB6wHsAe0B7oBhgOSAXIBdgF+AWl8QE0hpZGUgTmV3QXBwbGljYXRpb25VaGlkZTrT -AA4B2gHbAdwDngOfgGOA54Dp2QAOAeAB4QHiAeMB5AHlAeYCDgHnA6ICMwMQAesB7AHtAkkDFIBhgOiA -uoBdgF+AdmUARgBpAG4AZCAmXxAXcGVyZm9ybUZpbmRQYW5lbEFjdGlvbjrTAA4B2gHbAdwDqwOsgGOA -64Dt2AAOAeAB4QHiAeMB5AHlAeYB5wOvAjMAmgHrAewB7QJ9gGGA7IAVgF2AX4CHXxAbQ2hlY2sgR3Jh -bW1hciBXaXRoIFNwZWxsaW5nXxAWdG9nZ2xlR3JhbW1hckNoZWNraW5nOtMADgHaAdsB3AO4A7mAY4Dv -gPLYAA4B4AHhAeIB4wHkAeUB5gHnA7wCMwO9AesB7AHtAwGAYYDwgPGAXYBfgLRYTWluaW1pemVRbV8Q -E3BlcmZvcm1NaW5pYXR1cml6ZTrTAA4B2gHbAdwDxgPHgGOA9ID32AAOAeAB4QHiAeMB5AHlAeYB5wPK -AjMDywHrAewB7QI3gGGA9YD2gF2AX4BwWlNlbGVjdCBBbGxRYVpzZWxlY3RBbGw61AAOAh4B2gHbAdwA -aQBxA9aAY4AOgD+A+VpzYXZlSW1hZ2U60wAOAdoB2wHcA9oD24BjgPuA/tgADgHgAeEB4gHjAeQB5QHm -AecD3gIzA98B6wHsAe0CXYBhgPyA/YBdgF+AfFNOZXdRblxuZXdEb2N1bWVudDrTAA4B2gHbAdwD6APp -gGOBAQCBAQTYAA4B4AHhAeIB4wHkAeUB5gHnA+wCMwPtAesB7AHtA/CAYYEBAoEBA4BdgF+BAQHTAA4B -4AHwAfED8wP0gQFBgQFngQFoXxATTmV3QXBwbGljYXRpb24gSGVscFE/WXNob3dIZWxwOtMADgHaAdsB -3AP6A/uAY4EBBoEBCdgADgHgAeEB4gHjAeQB5QHmAecD/gIzA/8B6wHsAe0CXYBhgQEHgQEIgF2AX4B8 -VUNsb3NlUXddcGVyZm9ybUNsb3NlOtMADgHaAdsB3AQIBAmAY4EBC4EBDtgADgHgAeEB4gHjAeQB5QHm -AecEDAIRBA0B6wHsAe0CN4BhgQEMgQENgF2AX4BwVFJlZG9RWlVyZWRvOtMADgHaAdsB3AQWBBeAY4EB -EIEBE9gADgHgAeEB4gHjAeQB5QHmAecEGgIzBBsB6wHsAe0CN4BhgQERgQESgF2AX4BwVFVuZG9RelV1 -bmRvOtMADgHaAdsB3AQkBCWAY4EBFYEBF9gADgHgAeEB4gHjAeQB5QHmAecEKAIzAJoB6wHsAe0DbYBh -gQEWgBWAXYBfgNZvEBIAQwB1AHMAdABvAG0AaQB6AGUAIABUAG8AbwBsAGIAYQByICZfEB9ydW5Ub29s -YmFyQ3VzdG9taXphdGlvblBhbGV0dGU60wAOAdoB2wHcBDEEMoBjgQEZgQEc2AAOAeAB4QHiAeMB5AHl -AeYB5wQ1AjMENgHrAewB7QI3gGGBARqBARuAXYBfgHBTQ3V0UXhUY3V0OtMADgHaAdsB3AQ/BECAY4EB -HoEBINgADgHgAeEB4gHjAeQB5QHmAecEQwIzAJoB6wHsAe0B7oBhgQEfgBWAXYBfgFpYU2hvdyBBbGxf -EBZ1bmhpZGVBbGxBcHBsaWNhdGlvbnM61wAOAh4ESwRMAdoB2wRNBE4ETwRQBFEAbwRTAFNZTlNLZXlQ -YXRoWU5TQmluZGluZ18QHE5TTmliQmluZGluZ0Nvbm5lY3RvclZlcnNpb26BASuBASKBASqBASmAOIEB -KNMADgRVBFYEVwRYAIpeTlNEZWNsYXJlZEtleXNfEBBOU1NoYXJlZEluc3RhbmNlgQEngQEjCdIADgA+ -AGcEXIBQowRdBF4EX4EBJIEBJYEBJldvZmZzZXRYV29mZnNldFlfEBFhbHRlcm5hdGluZ0NvbG9yc9IA -NwA4BGQEZaMEZQRmADtfEBhOU1VzZXJEZWZhdWx0c0NvbnRyb2xsZXJcTlNDb250cm9sbGVyXxAVdmFs -dWU6IHZhbHVlcy5vZmZzZXRZVXZhbHVlXnZhbHVlcy5vZmZzZXRZ0gA3ADgEawRsowRsAggAO18QFU5T -TmliQmluZGluZ0Nvbm5lY3RvctcADgIeBEsETAHaAdsETQROBE8EcARRAG0EcwBTgQErgQEigQEugQEp -gDGBAS3XAA4CHgRLBEwB2gHbBE0ETgRPBHcEUQBqBHoAU4EBK4EBIoEBMYEBKYASgQEwXxAVdmFsdWU6 -IHZhbHVlcy5vZmZzZXRYXnZhbHVlcy5vZmZzZXRY1wAOAh4ESwRMAdoB2wRNBE4ETwSABFEAbASDAFOB -ASuBASKBATSBASmALIEBM9cADgIeBEsETAHaAdsETQROBE8EhwRRAHIEigBTgQErgQEigQE3gQEpgEWB -ATZfEB92YWx1ZTogdmFsdWVzLmFsdGVybmF0aW5nQ29sb3JzXxAYdmFsdWVzLmFsdGVybmF0aW5nQ29s -b3Jz0gAOAD4EjgSPgQGMrxBnAHICwQSSAl0CjwSVAG0DbQBvAGkEmgFTA6sETwN3A1gBHwOEAHAEFgIV -ApgATAHuA/ACzwIuAEECpgJ1AlMAbAJ9A8YA1QL5BLQDLwORBLcEuAS5BLoDGgPaAwEEvgOeAGsEwQTC -AmcCIQTFBMYAagTIBMkCQQTLAjcCtANBAocCSQTRBDEDCwBuBNUECATXBNgB3QESBD8E3ATdAt0E3wF2 -AHEE4gEwAUEE5QTmA0sE6ATpA+gE6wMnA/oDuANlAPYDOQCJAgsC6wT1BCSARYCfgQE5gHyAjYEBRoAx -gNaAOIAOgQFTgEGA64EBIoDbgNGANoDfgDuBARCAZoCRgAuAWoEBAYCkgG+AB4CWgIaAe4AsgIeA9IAl -gLOBAUqAwoDjgQFrgQFtgQFegQFzgL2A+4C0gQFMgOeAI4EBW4EBX4CBgGuBATyBAXiAEoEBQoEBeoB1 -gQFUgHCAm4DHgIyAdoEBhYEBGYC4gDSBAWWBAQuBAU6BAWKAWYAzgQEegQGGgQGEgKmBAXGAR4A/gQGA -gDqAPYEBQ4EBfoDMgQFagQGIgQEAgQGLgMGBAQaA74DVgC6AxoAUgGWAroEBdoEBFdoADgHgAeEE+AHi -BPkB4wHkAeUB5gHnAJoCMwCKAJoAigHrAewB7QHuXU5TSXNTZXBhcmF0b3JcTlNJc0Rpc2FibGVkgGGA -FQmAFQmAXYBfgFpURmlsZdIADgA+AGcFBYBQqwPaAusExQTIA/oDSwJnArQE5QJTAt2A+4CugQE8gQFC -gQEGgMyAgYCbgQFDgHuAqdoADgUSAeAB4QHiAeMB5AHlAeYFEwHnAy8DMgIzAJoB6wHsAe0CXQUbWU5T -U3VibWVudVhOU0FjdGlvboBhgMKBAT2AFYBdgF+AfIEBPltPcGVuIFJlY2VudF5zdWJtZW51QWN0aW9u -OtIADgA+AGcFIIBQoQMngMFfEBZfTlNSZWNlbnREb2N1bWVudHNNZW510gA3ADgFJAHmogHmADvaAA4B -4AHhBPgB4gT5AeMB5AHlAeYB5wCaAjMAigCaAIoB6wHsAe0CXYBhgBUJgBUJgF2AX4B82gAOAeAB4QT4 -AeIE+QHjAeQB5QHmAecAmgIzAIoAmgCKAesB7AHtAl2AYYAVCYAVCYBdgF+AfFZTcGVlY2jSAA4APgBn -BTqAUKIDdwKHgNuAjNoADgUSAeAB4QHiAeMB5AHlAeYFEwHnAkkCTAIzAJoB6wHsAe0CNwVFgGGAdoEB -R4AVgF2AX4BwgQFIVEZpbmTSAA4APgBnBUmAUKUDngS0BL4E1wJBgOeBAUqBAUyBAU6AddkADgHgAeEB -4gHjAeQB5QHmAg4B5wVRAjMCxgHrAewB7QJJAFOAYYEBS4ChgF2AX4B2WUZpbmQgTmV4dNkADgHgAeEB -4gHjAeQB5QHmAg4B5wVZAhECEgHrAewB7QJJALyAYYEBTYBogF2AX4B2XUZpbmQgUHJldmlvdXPZAA4B -4AHhAeIB4wHkAeUB5gIOAecFYQIzBWIB6wHsAe0CSQBUgGGBAU+BAVCAXYBfgHZfEBZVc2UgU2VsZWN0 -aW9uIGZvciBGaW5kUWVUVmlld9IADgA+AGcFa4BQogNlBCSA1YEBFdoADgUSAeAB4QHiAeMB5AHlAeYF -EwHnA20DcAIzAJoB6wHsAe0EywV2gGGA1oEBUYAVgF2AX4EBVIEBVdQADgHgAKMB8AHxBXkFegV7gQFB -gQF8gQGKgQF9XVN1YnN0aXR1dGlvbnPSAA4APgBnBX+AUKMDCwLBAguAuICfgGVeTmV3QXBwbGljYXRp -b27SAA4APgBnBYaAUKsCIQToBMEEuQTCBNUDkQHdBD8EkgKmgGuBAVqBAVuBAV6BAV+BAWWA44BZgQEe -gQE5gJbaAA4B4AHhBPgB4gT5AeMB5AHlAeYB5wCaAjMAigCaAIoB6wHsAe0B7oBhgBUJgBUJgF2AX4Ba -2AAOAeAB4QHiAeMB5AHlAeYB5wWdAjMFngHrAewB7QHugGGBAVyBAV2AXYBfgFpsAFAAcgBlAGYAZQBy -AGUAbgBjAGUAcyAmUSzaAA4B4AHhBPgB4gT5AeMB5AHlAeYB5wCaAjMAigCaAIoB6wHsAe0B7oBhgBUJ -gBUJgF2AX4Ba2gAOBRIB4AHhAeIB4wHkAeUB5gUTAecE2AWwAjMAmgHrAewB7QHuBbWAYYEBYoEBYIAV -gF2AX4BagQFhWFNlcnZpY2Vz1AAOAeAAowHwAfEFsAW6BbuBAUGBAWCBAWSBAWPSAA4APgBnBb6AUKBf -EA9fTlNTZXJ2aWNlc01lbnXaAA4B4AHhBPgB4gT5AeMB5AHlAeYB5wCaAjMAigCaAIoB6wHsAe0B7oBh -gBUJgBUJgF2AX4BaXF9OU0FwcGxlTWVudVRIZWxw0gAOAD4AZwXNgFChA+iBAQBfEBRTcGVsbGluZyBh -bmQgR3JhbW1hctIADgA+AGcF0oBQpAKYAnUDhAOrgJGAhoDfgOvaAA4FEgHgAeEB4gHjAeQB5QHmBRMB -5wIVAhgCMwCaAesB7AHtAjcF34BhgGaBAVaAFYBdgF+AcIEBbNoADgUSAeAB4QHiAeMB5AHlAeYFEwHn -A0EDRAIzAJoB6wHsAe0EywXogGGAx4EBboAVgF2AX4EBVIEBb1ZGb3JtYXTSAA4APgBnBeyAUKIE3wM5 -gQFxgMbYAA4B4AHhAeIB4wHkAeUB5gHnBfECMwNqAesB7AHtA0GAYYEBcoDYgF2AX4DHWlNob3cgRm9u -dHPaAA4FEgHgAeEB4gHjAeQB5QHmBRMB5wJ9AoACMwCaAesB7AHtAjcF/4BhgIeBAWmAFYBdgF+AcIEB -dNIADgA+AGcGAoBQpAO4AxoE9QL5gO+AvYEBdoCz2gAOAeAB4QT4AeIE+QHjAeQB5QHmAecAmgIzAIoA -mgCKAesB7AHtAwGAYYAVCYAVCYBdgF+AtF5fTlNXaW5kb3dzTWVuddoADgUSAeAB4QHiAeMB5AHlAeYF -EwHnAe4B8gIzAJoB6wHsAe0EywYZgGGAWoEBWIAVgF2AX4EBVIEBedoADgUSAeAB4QHiAeMB5AHlAeYF -EwHnAo8CkgIzAJoB6wHsAe0CNwYigGGAjYEBRIAVgF2AX4BwgQF7WUFNYWluTWVuddIADgA+AGcGJoBQ -pwTGBOYE4gS4BJoE3ATpgQF4gQF+gQGAgQFtgQFTgQGGgQGI2gAOBRIB4AHhAeIB4wHkAeUB5gUTAecC -XQJgAjMAmgHrAewB7QTLBjaAYYB8gQE6gBWAXYBfgQFUgQF/2gAOBRIB4AHhAeIB4wHkAeUB5gUTAecC -NwI6AjMAmgHrAewB7QTLBj+AYYBwgQGBgBWAXYBfgQFUgQGCVEVkaXTSAA4APgBnBkOAUK0EFgQIBN0E -MQIuAs8DWAPGBNEElQS6BLcEyYEBEIEBC4EBhIEBGYBvgKSA0YD0gQGFgQFGgQFzgQFrgQF62gAOAeAB -4QT4AeIE+QHjAeQB5QHmAecAmgIzAIoAmgCKAesB7AHtAjeAYYAVCYAVCYBdgF+AcNoADgHgAeEE+AHi -BPkB4wHkAeUB5gHnAJoCMwCKAJoAigHrAewB7QI3gGGAFQmAFQmAXYBfgHDaAA4FEgHgAeEB4gHjAeQB -5QHmBRMB5wMBAE8CMwCaAesB7AHtBMsGa4BhgLSACYAVgF2AX4EBVIEBh9oADgUSAeAB4QHiAeMB5AHl -AeYFEwHnA/AD8wIzAJoB6wHsAe0EywZ0gGGBAQGBAWeAFYBdgF+BAVSBAYlbX05TTWFpbk1lbnXSAA4A -MgAzADSABIAD0gA3ADgGegGdogGdADvSAA4APgSOBn2BAYyvEGcATAIVAe4E5gTJAjcATASaAEwATATL -AHECfQAfAo8CNwBuAn0ATAI3BLcCfQBBBMYE6QI3AjcAHwHuAn0CXQBMBLoCNwBrAwECSQTFAe4CNwTL -Ae4CNwMBAl0E3AJJAkkATAHuAe4CXQHuAl0EywBMAl0CNwJJAB8E4gJdBLgCjwSVAjcCNwIVAEwB7gI3 -AkkEwgHuAG0B7gTLAjcCXQNBAHIATATLAG8AcAJdBMsCXQHuBMsD8AAfAy8CXQMBA20AbANBAGoCFQJd -AwEDbYALgGaAWoEBfoEBeoBwgAuBAVOAC4ALgQFUgD+Ah4ACgI2AcIA0gIeAC4BwgQFrgIeAB4EBeIEB -iIBwgHCAAoBagIeAfIALgQFzgHCAI4C0gHaBATyAWoBwgQFUgFqAcIC0gHyBAYaAdoB2gAuAWoBagHyA -WoB8gQFUgAuAfIBwgHaAAoEBgIB8gQFtgI2BAUaAcIBwgGaAC4BagHCAdoEBX4BagDGAWoEBVIBwgHyA -x4BFgAuBAVSAOIA7gHyBAVSAfIBagQFUgQEBgAKAwoB8gLSA1oAsgMeAEoBmgHyAtIDW0gAOAD4Ejgbn -gQGMrxBoAHICwQSSAl0CjwSVAG0DbQBvAGkEmgFTA6sETwN3A1gBHwAfA4QAcAQWAhUCmABMAe4D8ALP -AEECLgKmAlMAbAJ1An0DxgDVAvkEtAMvA5EEuAS3BLkEugMaA9oDAQS+A54AawTBBMICZwIhBMUExgBq -BMgEyQJBBMsCNwK0A0EChwJJAG4E0QQxAwsE1QQIARIB3QTYBNcEPwTcBN0C3QTfAXYAcQTiATABQQTl -BOYDSwToBOkDZQTrA/oD6AO4APYDJwM5AIkCCwLrBPUEJIBFgJ+BATmAfICNgQFGgDGA1oA4gA6BAVOA -QYDrgQEigNuA0YA2gAKA34A7gQEQgGaAkYALgFqBAQGApIAHgG+AloB7gCyAhoCHgPSAJYCzgQFKgMKA -44EBbYEBa4EBXoEBc4C9gPuAtIEBTIDngCOBAVuBAV+AgYBrgQE8gQF4gBKBAUKBAXqAdYEBVIBwgJuA -x4CMgHaANIEBhYEBGYC4gQFlgQELgDOAWYEBYoEBToEBHoEBhoEBhICpgQFxgEeAP4EBgIA6gD2BAUOB -AX6AzIEBWoEBiIDVgQGLgQEGgQEAgO+ALoDBgMaAFIBlgK6BAXaBARXSAA4APgSOB1KBAYyvEGgHUwdU -B1UHVgdXB1gHWQdaB1sHXAddB14HXwdgB2EHYgdjB2QHZQdmB2cHaAdpB2oHawdsB20HbgdvB3AHcQdy -B3MHdAd1B3YHdwd4B3kHegd7B3wHfQd+B38HgAeBB4IHgweEB4UHhgeHB4gHiQeKB4sHjAeNB44HjweQ -B5EHkgeTB5QHlQeWB5cHmAeZB5oHmwecB50HngefB6AHoQeiB6MHpAelB6YHpweoB6kHqgerB6wHrQeu -B68HsAexB7IHswe0B7UHtge3B7gHuQe6gQGQgQGRgQGSgQGTgQGUgQGVgQGWgQGXgQGYgQGZgQGagQGb -gQGcgQGdgQGegQGfgQGggQGhgQGigQGjgQGkgQGlgQGmgQGngQGogQGpgQGqgQGrgQGsgQGtgQGugQGv -gQGwgQGxgQGygQGzgQG0gQG1gQG2gQG3gQG4gQG5gQG6gQG7gQG8gQG9gQG+gQG/gQHAgQHBgQHCgQHD -gQHEgQHFgQHGgQHHgQHIgQHJgQHKgQHLgQHMgQHNgQHOgQHPgQHQgQHRgQHSgQHTgQHUgQHVgQHWgQHX -gQHYgQHZgQHagQHbgQHcgQHdgQHegQHfgQHggQHhgQHigQHjgQHkgQHlgQHmgQHngQHogQHpgQHqgQHr -gQHsgQHtgQHugQHvgQHwgQHxgQHygQHzgQH0gQH1gQH2gQH3XxAYQ2hlY2sgQm94IChDaGVja2VyYm9h -cmQpXxAYTWVudSBJdGVtIChTbWFydCBRdW90ZXMpWVNlcGFyYXRvcltNZW51IChGaWxlKV1NZW51IChT -cGVlY2gpXxAQTWVudSBJdGVtIChGaW5kKVdTdGVwcGVyW01lbnUgKFZpZXcpWlRleHQgRmllbGRfEBFG -b250IFRleHR1cmUgVmlld18QEE1lbnUgSXRlbSAoVmlldylfEBJCdXR0b24gQ2VsbCAoU2F2ZSlfECdN -ZW51IEl0ZW0gKENoZWNrIEdyYW1tYXIgV2l0aCBTcGVsbGluZylfEB9TaGFyZWQgVXNlciBEZWZhdWx0 -cyBDb250cm9sbGVyXxAaTWVudSBJdGVtIChTdGFydCBTcGVha2luZylfEBJNZW51IEl0ZW0gKERlbGV0 -ZSlfEBtUZXh0IEZpZWxkIENlbGwgKFkgb2Zmc2V0OilcRmlsZSdzIE93bmVyXxAnTWVudSBJdGVtIChD -aGVjayBTcGVsbGluZyBXaGlsZSBUeXBpbmcpbxBsAFMAdABhAHQAaQBjACAAVABlAHgAdAAgACgASQBt +AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxECBwALAAwAMQA1ADYAPAA9 +AEIAWgBbAFwAXQBeAAsAawB5AIEAggCDAIgAkwCUAKYApwCvALAAswC9AL4AvwDEAMYAywDMAM8A0wDX +AN8A4ADoAOkA7gDvAPIA9wD4AQABAQEOAREBFAEcAR0BIQEpASoBMQEyAToBOwFDAUsBTAFfAWABYwFm +AW4BbwF8AX0BggGDAYQBhwGDAYsBjgGXAZgBnwGgAagBqQHBAdcB3AHdAeEB4gHmAecB6AHqAesB8wH8 +AecB/QIHAecCCAISAecCEwIdAecCHgIiAiQCKAIrAAsCLAIuAi8CMAIzAjcCWgJgAmcCawJsAm0CbgJy +AnYCfQJ+An8CgAKEAosCjwKQApECkgKWAp0CoQKiAqMCpwKuAq8CsAKxArUCvAK9Ar4CvwLDAsoCywLM +As0C0QLYAt0C3gLfAuAC5ALrAuwC7QLxAvgC/AL9Av4DAgMJAwoDCwMMAxADGAMZAxoDGwMhAyIDJQMp +AzADNAM1AzYDNwM8Az0DQgNKA04DTwNQA1EDVQNdA14DXwNjA2oDawNsA3EDeAN5A3oDfgOFA4YDhwOI +A1ADjQORA5gDmQOaA5sDnwOmA6cDqAOpA60DtAO1A7YDugPBA8IDwwPEA8gDzwPQA9ED1QPcA90D3gPo +A+wD8APxA/ID8wP2A/0EBAQFBAYEDQQOBA8EFgRpBGoEbwR6BH8EgASGBJAEkQSSBJ4EpwSRBKgErQSw +BLEEugTDBMQEzQSRBM4E0gTbBJEE3ATsBPUE/gUHBJEFCAUQBRcFGAUfBSAFKAUpBSoFMwSRBTQFOwVE +BJEFRQVLBJEFVAVVBVgFWgWtBgEGVQZWBlcGWAZZBloGWwZcBl0GXgZfBmAGYQZiBmMGZAZlBmYGZwZo +BmkGagZrBmwGbQZuBm8GcAZxBnIGcwZ0BnUGdgZ3BngGeQZ6BnsGfAZ9Bn4GfwaABoEGggaDBoQGhQaG +BocGiAaJBooGiwaMBo0GjgaPBpAGkQaSBpMGlAaVBpYGlwaYBpkGmgabBpwGnQaeBp8GoAahBqIGowak +BqUGpgapBqwHIAeUB5UHlgeXB5gHmQeaB5sHnAedB54HnwegB6EHogejB6QHpQemB6cHqAepB6oHqwes +B60HrgevB7AHsQeyB7MHtAe1B7YHtwe4B7kHuge7B7wHvQe+B78HwAfBB8IHwwfEB8UHxgfHB8gHyQfK +B8sHzAfNB84HzwfQB9EH0gfTB9QH1QfWB9cH2AfZB9oH2wfcB90H3gffB+AH4QG9B+IH4wfkB+UH5gFc +B+cH6AfpB+oH6wfsB+0H7gfvB/AH8QfyB/MH9Af1B/YH9wf4B/kH+gf7B/wH/Qf+B/8IAAgBCAIIAwgG +CAkIDFUkbnVsbN8QEgANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMA +JAAlACYAJwAoACkAKgArACwALQAuAC8AMFZOU1Jvb3RWJGNsYXNzXU5TT2JqZWN0c0tleXNfEA9OU0Ns +YXNzZXNWYWx1ZXNfEBlOU0FjY2Vzc2liaWxpdHlPaWRzVmFsdWVzXU5TQ29ubmVjdGlvbnNbTlNOYW1l +c0tleXNbTlNGcmFtZXdvcmtdTlNDbGFzc2VzS2V5c1pOU09pZHNLZXlzXU5TTmFtZXNWYWx1ZXNfEBlO +U0FjY2Vzc2liaWxpdHlDb25uZWN0b3JzXU5TRm9udE1hbmFnZXJfEBBOU1Zpc2libGVXaW5kb3dzXxAP +TlNPYmplY3RzVmFsdWVzXxAXTlNBY2Nlc3NpYmlsaXR5T2lkc0tleXNZTlNOZXh0T2lkXE5TT2lkc1Zh +bHVlc4ACgQIGgQEEgQGPgQIFgHaBATuABYEBjoEBkIEBPIECA4AAgAaBATqBAgQRAbKBAZHSAA4AMgAz +ADRbTlNDbGFzc05hbWWABIADXU5TQXBwbGljYXRpb27SADcAOAA5ADpYJGNsYXNzZXNaJGNsYXNzbmFt +ZaIAOgA7Xk5TQ3VzdG9tT2JqZWN0WE5TT2JqZWN0XxAQSUJDb2NvYUZyYW1ld29ya9IADgA+AD8AQFpO +Uy5vYmplY3RzgHWhAEGAB9wAQwAOAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYA +VwBYACtcTlNXaW5kb3dWaWV3XE5TU2NyZWVuUmVjdF1OU1dpbmRvd1RpdGxlWU5TV1RGbGFnc11OU1dp +bmRvd0NsYXNzXxAWTlNXaW5kb3dDb250ZW50TWluU2l6ZVxOU1dpbmRvd1JlY3RfEA9OU1dpbmRvd0Jh +Y2tpbmdfEBFOU1dpbmRvd1N0eWxlTWFza1lOU01pblNpemVbTlNWaWV3Q2xhc3OADIB0gHKACRJ0AAAA +gAqAC4AIEAIQD4BzgABfEBh7ezM1LCA0N30sIHsxMjEwLCAxMDg5fX1WV2luZG93WE5TV2luZG93Wnsz +MTQsIDE5M33XAF8ADgBgAGEAYgBcAGMAZABlAGYAZwBoAGQAal8QD05TTmV4dFJlc3BvbmRlclpOU1N1 +YnZpZXdzWE5TdkZsYWdzW05TRnJhbWVTaXplW05TU3VwZXJ2aWV3gA2AcYAOEQESgG+ADYBw0gAOAD4A +bABtgGurAG4AbwBwAHEAcgBzAHQAdQB2AHcAeIAPgBOAJIAtgDKANYA5gDyAQoBNgFHXAF8ADgB6AGEA +XAAyAGMATgB8AH0AZwBkAH8ATldOU0ZyYW1lgAyAEoAQgA2AEYAMXxAYe3syMCwgMjB9LCB7MTAyNCwg +MTAyNH19XxAPRm9udFRleHR1cmVWaWV30gA3ADgAhACFpACFAIYAhwA7XE5TQ3VzdG9tVmlld1ZOU1Zp +ZXdbTlNSZXNwb25kZXLYAF8ADgB6AIkAYQCKAFwAYwBOAIwAjQCOAI8AkABkAE5WTlNDZWxsWU5TRW5h +YmxlZIAMgCOAFIAVEQEJCYANgAxfEBh7ezExMjMsIDEwMjJ9LCB7NDYsIDIyfX3ZAJUADgCWAJcAmACZ +AJoAmwCcAJ0AngCfAKAAoQBvAKMAkAClW05TQ2VsbEZsYWdzXxARTlNCYWNrZ3JvdW5kQ29sb3JaTlND +b250ZW50c1lOU1N1cHBvcnRdTlNDb250cm9sVmlld1xOU0NlbGxGbGFnczJfEBFOU0RyYXdzQmFja2dy +b3VuZFtOU1RleHRDb2xvchP/////lHH+QYAigBqAFoAXgBMSEEAEAAmAH1DUAA4AqACpAKoAqwCsAK0A +rlZOU1NpemVWTlNOYW1lWE5TZkZsYWdzgBkjQCoAAAAAAACAGBEEFFxMdWNpZGFHcmFuZGXSADcAOACx +ALKiALIAO1ZOU0ZvbnTVAA4AtAC1ALYAtwC4ALkAugC7ALxXTlNDb2xvclxOU0NvbG9yU3BhY2VbTlND +b2xvck5hbWVdTlNDYXRhbG9nTmFtZYAegB0QBoAcgBtWU3lzdGVtXxATdGV4dEJhY2tncm91bmRDb2xv +ctMADgC1AMAAuADCAMNXTlNXaGl0ZYAeEANCMQDSADcAOADFALSiALQAO9UADgC0ALUAtgC3ALgAyAC6 +AMkAvIAegCGAIIAbWXRleHRDb2xvctMADgC1AMAAuADCAM6AHkIwANIANwA4ANAA0aQA0QDSAIkAO18Q +D05TVGV4dEZpZWxkQ2VsbFxOU0FjdGlvbkNlbGzSADcAOADUANWlANUA1gCGAIcAO1tOU1RleHRGaWVs +ZFlOU0NvbnRyb2zYAF8ADgB6AIkAYQCKAFwAYwBOAIwA2gDbAI8AkABkAE6ADIAjgCWAJgmADYAMXxAY +e3sxMDYxLCAxMDI0fSwgezU3LCAxN3192ACVAA4AlgCXAJgAmQCaAJwA4QCeAOMA5AChAHAAowDnEgQB +/kCAIoAogCeAF4AkgCtZWCBvZmZzZXQ61QAOALQAtQC2ALcAuADrALoA7AC8gB6AKoApgBtcY29udHJv +bENvbG9y0wAOALUAwAC4AMIA8YAeSzAuNjY2NjY2NjkA1QAOALQAtQC2ALcAuADIALoA9QC8gB6AIYAs +gBtfEBBjb250cm9sVGV4dENvbG9y2ABfAA4AegCJAGEAigBcAGMATgD6APsA/ACPAJAAZABOgAyAMYAu +gC8JgA2ADF8QGHt7MTE3NCwgMTAxOH0sIHsxOSwgMjd9fdgAlQAOAQIBAwEEAJkAmgEFAQYBBwEIAQkB +CgBxAQwAkFtOU0luY3JlbWVudFpOU01heFZhbHVlWk5TTWluVmFsdWVcTlNBdXRvcmVwZWF0EgAN/iCA +MCM/8AAAAAAAACNAgAAAAAAAACPAgAAAAAAAAIAtEAAJ0gA3ADgBDwEQpAEQANIAiQA7XU5TU3RlcHBl +ckNlbGzSADcAOAESAROlARMA1gCGAIcAO1lOU1N0ZXBwZXLYAF8ADgB6AIkAYQCKAFwAYwBOAPoBFwEY +AI8AkABkAE6ADIAxgDOANAmADYAMXxAXe3sxMTc0LCA5ODd9LCB7MTksIDI3fX3YAJUADgECAQMBBACZ +AJoBBQEGAQcBCAEJAQoAcgEMAJCAMIAyCdgAXwAOAHoAiQBhAIoAXABjAE4AjAEkASUAjwCQAGQAToAM +gCOANoA3CYANgAxfEBd7ezEwNjEsIDk5M30sIHs1NywgMTd9fdgAlQAOAJYAlwCYAJkAmgCcAOEAngDj +AS0AoQBzAKMA54AigCiAOIAXgDWAK1lZIG9mZnNldDrYAF8ADgB6AIkAYQCKAFwAYwBOAIwBNQE2AI8A +kABkAE6ADIAjgDqAOwmADYAMXxAXe3sxMTIzLCA5OTF9LCB7NDYsIDIyfX3ZAJUADgCWAJcAmACZAJoA +mwCcAJ0AngCfAKAAoQB0AKMAkAClgCKAGoAWgBeAOQmAH9gAXwAOAHoAiQBhAIoAXABjAE4BRQFGAUcA +jwCQAGQAToAMgEGAPYA+CYANgAxfEBd7ezEwNTgsIDg5M30sIHs5NiwgMzJ9fdwAlQAOAU0BTgFPAVAA +lwCYAJkBUQCaAVIBUwFUAKABVgFXAKABWQChAHUBXAFdAV5fEBNOU0FsdGVybmF0ZUNvbnRlbnRzXxAS +TlNQZXJpb2RpY0ludGVydmFsXk5TQnV0dG9uRmxhZ3MyXxAPTlNLZXlFcXVpdmFsZW50XxAPTlNQZXJp +b2RpY0RlbGF5XU5TQnV0dG9uRmxhZ3MSBAH+AIBAgBYQGRCBgBaAP4AXgDwQyBIIAAAAE/////+GgkD/ +VFNhdmXSADcAOAFhAWKkAWIA0gCJADtcTlNCdXR0b25DZWxs0gA3ADgBZAFlpQFlANYAhgCHADtYTlNC +dXR0b27YAF8ADgB6AIkAYQCKAFwAYwBOAUUBaQFqAI8AkABkAE6ADIBBgEOARAmADYAMXxAYe3sxMDYy +LCA5Njd9LCB7MTEwLCAxOH193gCVAA4BTQFwAU4BTwFxAVAAlwCYAJkBUQCaAVIBcgFUAKABdQFWAFYB +dgCgAXgAoQB2AVwBDAF7XU5TTm9ybWFsSW1hZ2VfEBBOU0FsdGVybmF0ZUltYWdlE/////+EAf4AgECA +FoBGgEqAFoBFgBeAQhJIPFH/XENoZWNrZXJib2FyZNMADgAyAX4BfwGAAYFeTlNSZXNvdXJjZU5hbWWA +SYBHgEhXTlNJbWFnZVhOU1N3aXRjaNIANwA4AYUBhqIBhgA7XxAQTlNDdXN0b21SZXNvdXJjZdIADgGI +AYkBiltOU0ltYWdlTmFtZYBMgEvSADcAOAGMAY2iAY0AO18QE05TQnV0dG9uSW1hZ2VTb3VyY2XYAF8A +DgB6AIkAYQCKAFwAYwBOAIwBkQGSAZMAkABkAE6ADIAjgE6ATxEBDAmADYAMXxAXe3sxNywgMTA1Mn0s +IHs2MTMsIDE3fX3YAJUADgCWAJcAmACZAJoAnADhAJ4A4wGbAKEAdwCjAOeAIoAogFCAF4BNgCtvEF4A +SQBtAHAAbwByAHQAYQBuAHQAOgAgAHMAZQB0ACAgHABGAG8AbgB0ACAAcwBtAG8AbwB0AGgAaQBuAGcA +IABzAHQAeQBsAGUgHQAgAHQAbwAgIBwAUwB0AGEAbgBkAGEAcgBkIB0AIABpAG4AIAB0AGgAZQAgAEEA +cABwAGUAYQByAGEAbgBjAGUAIABzAHkAcwB0AGUAbQAgAHAAcgBlAGYAZQByAGUAbgBjAGUAcwAgAHAA +YQBuAGUALtgAXwAOAHoAiQBhAIoAXABjAE4BogGjAaQAjwCQAGQAToAMgG6AUoBTCYANgAxfEBh7ezEw +NjEsIDkzN30sIHsxMzIsIDI2fX3fEBIAlQGqAasBTQFOAA4BTwFQAJgBrACZAa0BrgGvAVEAmgGwAVIB +sQCQAFYAoAG0AbUBtgCgAKEBuQB4AbYAkACQAb0BvgG/AcBfEBpOU01lbnVJdGVtUmVzcGVjdEFsaWdu +bWVudF8QD05TQXJyb3dQb3NpdGlvblpOU01lbnVJdGVtXxAPTlNQcmVmZXJyZWRFZGdlXxASTlNVc2Vz +SXRlbUZyb21NZW51XU5TQWx0ZXJzU3RhdGVWTlNNZW51E/////+EQf5ACYAWEEuAbRABgBaAF4BUgFEJ +CREBkBEIAIBVEgaCQP/cAcIADgHDAcQBxQHGAccByAGwAckBygHLAaQBzQHOAc8AoAHRAdIB0wG/AdUB +1gG2WE5TVGFyZ2V0V05TVGl0bGVfEBFOU0tleUVxdWl2TW9kTWFza1pOU0tleUVxdWl2XU5TTW5lbW9u +aWNMb2NZTlNPbkltYWdlXE5TTWl4ZWRJbWFnZVhOU0FjdGlvblVOU1RhZ1dOU1N0YXRlgFOAXIBWEgAQ +AACAFhJ/////gFeAWYBVgFsQDNMADgHDAdgB2QHaAdtbTlNNZW51SXRlbXOAbIBdgF5XTGF0aW4tMdMA +DgAyAX4BfwGAAeCASYBHgFhfEA9OU01lbnVDaGVja21hcmvTAA4AMgF+AX8BgAHlgEmAR4BaXxAQTlNN +ZW51TWl4ZWRTdGF0ZV8QEV9wb3BVcEl0ZW1BY3Rpb2460gA3ADgB6QGsogGsADtaT3RoZXJWaWV3c9IA +DgA+AGwB7YBrpQG5Ae8B8AHxAfKAVIBfgGKAZYBo2wHCAA4BwwHEAcUBxgHHAcgBsAHJAcoBpAHNAfYB +zwCgAdEB0gHTAb8B+wBXgFOAXIBggBaAV4BZgFWAYVdMYXRpbi0y2wHCAA4BwwHEAcUBxgHHAcgBsAHJ +AcoBpAHNAgABzwCgAdEB0gHTAb8CBQIGgFOAXIBjgBaAV4BZgFWAZBALWEN5cmlsbGlj2wHCAA4BwwHE +AcUBxgHHAcgBsAHJAcoBpAHNAgsBzwCgAdEB0gHTAb8CEAIRgFOAXIBmgBaAV4BZgFWAZxANVUdyZWVr +2wHCAA4BwwHEAcUBxgHHAcgBsAHJAcoBpAHNAhYBzwCgAdEB0gHTAb8CGwIcgFOAXIBpgBaAV4BZgFWA +ahAOV1R1cmtpc2jSADcAOAIfAiCjAiACIQA7Xk5TTXV0YWJsZUFycmF5V05TQXJyYXnSADcAOAIjAbCi +AbAAO9IANwA4AiUCJqYCJgInAWIA0gCJADtfEBFOU1BvcFVwQnV0dG9uQ2VsbF5OU01lbnVJdGVtQ2Vs +bNIANwA4AikCKqYCKgFlANYAhgCHADtdTlNQb3BVcEJ1dHRvblx7MTIxMCwgMTA4OX3SADcAOAItAIaj +AIYAhwA7XxAWe3swLCAwfSwgezE5MjAsIDExNzh9fVp7MzE0LCAyMTV90gA3ADgCMQIyogIyADtfEBBO +U1dpbmRvd1RlbXBsYXRl0gA3ADgCNAI1owI1AjYAO1xOU011dGFibGVTZXRVTlNTZXTSAA4APgBsAjmA +a68QIAI6AjsCPAI9Aj4CPwJAAkECQgJDAkQCRQJGAkcCSAJJAkoCSwJMAk0CTgJPAlACUQJSAlMCVAJV +AlYCVwJYAlmAd4B+gIOAiYCOgJOAmICdgKOAp4CsgLGAtoC5gL+AwYDHgMuAz4DTgNiA2oDfgOSA6IDt +gPGA9YD8gP2BAQCBAQPTAA4CWwJcAl0CXgJfWE5TU291cmNlV05TTGFiZWyAfYB4gHzYAA4BwwHEAcUB +xgHHAcgBsAHNAmIBzwJjAdEB0gHTAmaAXIB6gHuAV4BZgHnTAA4BwwHYAdkCaQJqgGyBAR2BAR9UVW5k +b1F6VXVuZG860gA3ADgCbwJwowJwAnEAO18QFU5TTmliQ29udHJvbENvbm5lY3Rvcl5OU05pYkNvbm5l +Y3RvctMADgJbAlwCXQJ0AnWAfYB/gILYAA4BwwHEAcUBxgHHAcgBsAHNAngBzwJ5AdEB0gHTAmaAXICA +gIGAV4BZgHlUQ29weVFjVWNvcHk60wAOAlsCXAJdAoICg4B9gISAiNkADgHDAcQBxQHGAccByAGwAcoB +zQKGAc8ChwHRAdIB0wKKAbaAXICGgIeAV4BZgIXTAA4BwwHYAdkCjQKOgGyBASOBASVlAEYAaQBuAGQg +JlFmXxAXcGVyZm9ybUZpbmRQYW5lbEFjdGlvbjrTAA4CWwJcAl0ClAKVgH2AioCN2AAOAcMBxAHFAcYB +xwHIAbABzQKYAc8AoAHRAdIB0wKcgFyAjIAWgFeAWYCL0wAOAcMB2AHZAp8CoIBsgQEugQEwXxAbQ2hl +Y2sgU3BlbGxpbmcgV2hpbGUgVHlwaW5nXxAedG9nZ2xlQ29udGludW91c1NwZWxsQ2hlY2tpbmc60wAO +AlsCXAJdAqUCpoB9gI+AktgADgHDAcQBxQHGAccByAGwAc0CqQHPAqoB0QHSAdMCnIBcgJCAkYBXgFmA +i24AUwBoAG8AdwAgAFMAcABlAGwAbABpAG4AZyAmUTpfEA9zaG93R3Vlc3NQYW5lbDrTAA4CWwJcAl0C +swK0gH2AlICX2AAOAcMBxAHFAcYBxwHIAbABzQK3Ac8CuAHRAdIB0wKcgFyAlYCWgFeAWYCLXkNoZWNr +IFNwZWxsaW5nUTteY2hlY2tTcGVsbGluZzrTAA4CWwJcAl0CwQLCgH2AmYCc2AAOAcMBxAHFAcYBxwHI +AbABzQLFAc8CxgHRAdIB0wJmgFyAmoCbgFeAWYB5VVBhc3RlUXZWcGFzdGU60wAOAlsCXAJdAs8C0IB9 +gJ6AotgADgHDAcQBxQHGAccByAGwAc0C0wHPAtQB0QHSAdMC14BcgKCAoYBXgFmAn9QADgHDAKkB2AHZ +AtoC2wLcgGyBAQyBAReBAQ5fEBtIaWRlIEZvbnQgVGV4dHVyZSBHZW5lcmF0b3JRaFVoaWRlOtMADgJb +AlwCXQLiAuOAfYCkgKbYAA4BwwHEAcUBxgHHAcgBsAHNAuYBzwCgAdEB0gHTAteAXIClgBaAV4BZgJ9Y +U2hvdyBBbGxfEBZ1bmhpZGVBbGxBcHBsaWNhdGlvbnM60wAOAlsCXAJdAu8C8IB9gKiAq9gADgHDAcQB +xQHGAccByAGwAc0C8wHPAKAB0QHSAdMC94BcgKqAFoBXgFmAqdMADgHDAdgB2QL6AvuAbIEBBYEBBl1T +dG9wIFNwZWFraW5nXXN0b3BTcGVha2luZzrTAA4CWwJcAl0DAAMBgH2ArYCw2AAOAcMBxAHFAcYBxwHI +AbABzQMEAc8DBQHRAdIB0wJmgFyAroCvgFeAWYB5U0N1dFF4VGN1dDrTAA4CWwJcAl0DDgMPgH2AsoC1 +2AAOAcMBxAHFAcYBxwHIAbABzQMSAxMDFAHRAdIB0wJmgFyAsxIAEgAAgLSAV4BZgHlUUmVkb1FaVXJl +ZG861AAOAxwCWwJcAx0AeABuAyBdTlNEZXN0aW5hdGlvboC4gFGAD4C3XWVuY29kaW5nUG9wVXDSADcA +OAMjAySjAyQCcQA7XxAUTlNOaWJPdXRsZXRDb25uZWN0b3LTAA4CWwJcAl0DJwMogH2AuoC+2QAOAcMB +xAHFAcYBxwHIAbABygHNAysBzwMsAdEB0gHTAy8AVoBcgLyAvYBXgFmAu9MADgHDAdgB2QMyAzOAbIEB +MoEBNFxTbWFydCBRdW90ZXNRZ18QIXRvZ2dsZUF1dG9tYXRpY1F1b3RlU3Vic3RpdHV0aW9uOtQADgMc +AlsCXAJdAG4AeAM7gH2AD4BRgMBfEBR0YWtlRW5jb2RpbmdGcm9tVGFnOtQADgMcAlsCXAJdAG4DQANB +gH2AD4DCgMbYAA4BwwHEAcUBxgHHAcgBsAHNA0QDRQNGAdEB0gHTA0mAXIDEEgAQAQiAxYBXgFmAw9MA +DgHDAdgB2QNMA02AbIEBGYEBG2gAUwBhAHYAZQAgAEEAcyAmUXNac2F2ZUltYWdlOtMADgJbAlwCXQNT +A1SAfYDIgMrYAA4BwwHEAcUBxgHHAcgBsAHNA1cDWALUAdEB0gHTAteAXIDJEgAYAACAoYBXgFmAn1tI +aWRlIE90aGVyc18QFmhpZGVPdGhlckFwcGxpY2F0aW9uczrTAA4CWwJcAl0DYQNigH2AzIDO2AAOAcMB +xAHFAcYBxwHIAbABzQNlAc8AoAHRAdIB0wL3gFyAzYAWgFeAWYCpXlN0YXJ0IFNwZWFraW5nXnN0YXJ0 +U3BlYWtpbmc61AAOAxwCWwJcAl0AHwNvA3CAfYACgNCA0tcADgHDAcUBxgHHAcgBsAHNA3MAoAHRAdIB +0wLXgFyA0YAWgFeAWYCfXxAcQWJvdXQgRm9udCBUZXh0dXJlIEdlbmVyYXRvcl8QHW9yZGVyRnJvbnRT +dGFuZGFyZEFib3V0UGFuZWw60wAOAlsCXAJdA3wDfYB9gNSA19kADgHDAcQBxQHGAccByAGwAcoBzQOA +AxMDgQHRAdIB0wMvAMKAXIDVgNaAV4BZgLtbU21hcnQgTGlua3NRR18QHXRvZ2dsZUF1dG9tYXRpY0xp +bmtEZXRlY3Rpb2461AAOAxwCWwJcAl0AbgB1A4yAfYAPgDyA2dMADgJbAlwCXQOPA5CAfYDbgN7YAA4B +wwHEAcUBxgHHAcgBsAHNA5MBzwOUAdEB0gHTAoqAXIDcgN2AV4BZgIVfEBFKdW1wIHRvIFNlbGVjdGlv +blFqXxAdY2VudGVyU2VsZWN0aW9uSW5WaXNpYmxlQXJlYTrTAA4CWwJcAl0DnQOegH2A4IDj2AAOAcMB +xAHFAcYBxwHIAbABzQOhAc8DogHRAdIB0wJmgFyA4YDigFeAWYB5WlNlbGVjdCBBbGxRYVpzZWxlY3RB +bGw60wAOAlsCXAJdA6sDrIB9gOWA59kADgHDAcQBxQHGAccByAGwAcoBzQOvAc8ChwHRAdIB0wMvAbaA +XIDmgIeAV4BZgLtfEBBTbWFydCBDb3B5L1Bhc3RlXxAYdG9nZ2xlU21hcnRJbnNlcnREZWxldGU60wAO +AlsCXAJdA7gDuYB9gOmA7NgADgHDAcQBxQHGAccByAGwAc0DvAHPA70B0QHSAdMC14BcgOqA64BXgFmA +n18QG1F1aXQgRm9udCBUZXh0dXJlIEdlbmVyYXRvclFxWnRlcm1pbmF0ZTrTAA4CWwJcAl0DxgPHgH2A +7oDw2AAOAcMBxAHFAcYBxwHIAbABzQPKAc8AoAHRAdIB0wJmgFyA74AWgFeAWYB5VkRlbGV0ZVdkZWxl +dGU60wAOAlsCXAJdA9MD1IB9gPKA9NgADgHDAcQBxQHGAccByAGwAc0D1wHPAKAB0QHSAdMCnIBcgPOA +FoBXgFmAi18QG0NoZWNrIEdyYW1tYXIgV2l0aCBTcGVsbGluZ18QFnRvZ2dsZUdyYW1tYXJDaGVja2lu +ZzrXAA4DHAPfA+ACWwJcA+ED4gPjA+QD5QBxA+cAVllOU0tleVBhdGhZTlNCaW5kaW5nXxAcTlNOaWJC +aW5kaW5nQ29ubmVjdG9yVmVyc2lvboD7gPaA+oD5gC2A+NIADgPpA+oAkF8QEE5TU2hhcmVkSW5zdGFu +Y2WA9wnSADcAOAPtA+6jA+4D7wA7XxAYTlNVc2VyRGVmYXVsdHNDb250cm9sbGVyXE5TQ29udHJvbGxl +cl8QFXZhbHVlOiB2YWx1ZXMub2Zmc2V0WFV2YWx1ZV52YWx1ZXMub2Zmc2V0WNIANwA4A/QD9aMD9QJx +ADtfEBVOU05pYkJpbmRpbmdDb25uZWN0b3LXAA4DHAPfA+ACWwJcA+ED4gPjA+QD5QBvA+cAVoD7gPaA ++oD5gBOA+NcADgMcA98D4AJbAlwD4QPiA+MEAAPlAHYEAwBWgPuA9oD/gPmAQoD+XxAfdmFsdWU6IHZh +bHVlcy5hbHRlcm5hdGluZ0NvbG9yc18QGHZhbHVlcy5hbHRlcm5hdGluZ0NvbG9yc9cADgMcA98D4AJb +AlwD4QPiA+MECQPlAHIEDABWgPuA9oEBAoD5gDKBAQFfEBV2YWx1ZTogdmFsdWVzLm9mZnNldFledmFs +dWVzLm9mZnNldFnXAA4DHAPfA+ACWwJcA+ED4gPjBAkD5QB0BAwAVoD7gPaBAQKA+YA5gQEB0gAOAD4E +FwQYgQE5rxBQA48AcwL3AUcAeABBASUBpAQhBCID0wKUAWoAbgByBCgDYQNAAl4A2wG5BC4ELwLXBDEE +MgEYBDQENQPGBDcEOAB2AZICnAD8AsEBNgHxBEACggB1AnQDLwNTAs8ERwBvAHEC4gN8BEwD4wG/AwAD +qwRRA7gEUwB3AooEVgKlAycDDgNvBFsC7wNJBF4AjgHvAfIB8AOdAE4CZgBwAHQCs4DbgDWAqYA+gFGA +B4A3gFOBAQeBAQiA8oCKgESAD4AygQELgMyAwoB4gCaAVIEBIYEBEoCfgQEtgQEigDSBAQ+BARWA7oEB +JoEBKoBCgE+Ai4AvgJmAO4BlgQEYgISAPIB/gLuAyICegQExgBOALYCkgNSBASCA9oBVgK2A5YEBOIDp +gQEogE2AhYEBFoCPgLqAsoDQgQEcgKiAw4EBNYAVgF+AaIBigOCADIB5gCSAOYCUVlNwZWVjaNIADgA+ +AGwEbIBrogNhAu+AzICo2gAOAcMBxARwAcUEcQHGAccByAGwAc0AoAHPAJAAoACQAdEB0gHTAtddTlNJ +c1NlcGFyYXRvclxOU0lzRGlzYWJsZWSAXIAWCYAWCYBXgFmAn9QADgHDAKkB2AHZBHwEfQR+gGyBAQmB +ATeBAQpZQU1haW5NZW510gAOAD4AbASCgGujBCgEQARbgQELgQEYgQEc2gAOBIcBwwHEAcUBxgHHAcgB +sAHJAc0C1wLaAc8AoAHRAdIB0wQiBI9ZTlNTdWJtZW51gFyAn4EBDIAWgFeAWYEBCIEBDV8QFkZvbnQg +VGV4dHVyZSBHZW5lcmF0b3Jec3VibWVudUFjdGlvbjrSAA4APgBsBJSAa6kDbwQhBDQENQLPA1MC4gRW +A7iA0IEBB4EBD4EBFYCegMiApIEBFoDp2gAOBIcBwwHEAcUBxgHHAcgBsAHJAc0ELwShAc8AoAHRAdIB +0wLXBKaAXIEBEoEBEIAWgFeAWYCfgQERWFNlcnZpY2Vz1AAOAcMAqQHYAdkEoQSrBKyAbIEBEIEBFIEB +E9IADgA+AGwEr4BroF8QD19OU1NlcnZpY2VzTWVuddoADgHDAcQEcAHFBHEBxgHHAcgBsAHNAKABzwCQ +AKAAkAHRAdIB0wLXgFyAFgmAFgmAV4BZgJ/aAA4BwwHEBHABxQRxAcYBxwHIAbABzQCgAc8AkACgAJAB +0QHSAdMC14BcgBYJgBYJgFeAWYCfXF9OU0FwcGxlTWVuddoADgSHAcMBxAHFAcYBxwHIAbAByQHNA0kD +TAHPAKAB0QHSAdMEIgTMgFyAw4EBGYAWgFeAWYEBCIEBGlRGaWxl0gAOAD4AbATQgGuhA0CAwtoADgSH +AcMBxAHFAcYBxwHIAbAByQHNAmYCaQHPAKAB0QHSAdMEIgTagFyAeYEBHYAWgFeAWYEBCIEBHlRFZGl0 +0gAOAD4AbATegGutAl4DDgRMAwACdALBA8YDnQQuBDIEMQRHBF6AeICygQEggK2Af4CZgO6A4IEBIYEB +IoEBLYEBMYEBNdoADgHDAcQEcAHFBHEBxgHHAcgBsAHNAKABzwCQAKAAkAHRAdIB0wJmgFyAFgmAFgmA +V4BZgHnaAA4BwwHEBHABxQRxAcYBxwHIAbABzQCgAc8AkACgAJAB0QHSAdMCZoBcgBYJgBYJgFeAWYB5 +2gAOBIcBwwHEAcUBxgHHAcgBsAHJAc0CigKNAc8AoAHRAdIB0wJmBQaAXICFgQEjgBaAV4BZgHmBASRU +RmluZNIADgA+AGwFCoBrpQKCBDcEUwQ4A4+AhIEBJoEBKIEBKoDb2QAOAcMBxAHFAcYBxwHIAbABygHN +BRIBzwMsAdEB0gHTAooAVoBcgQEngL2AV4BZgIVZRmluZCBOZXh02QAOAcMBxAHFAcYBxwHIAbABygHN +BRoDEwOBAdEB0gHTAooAwoBcgQEpgNaAV4BZgIVdRmluZCBQcmV2aW91c9kADgHDAcQBxQHGAccByAGw +AcoBzQUiAc8FIwHRAdIB0wKKBSeAXIEBK4EBLIBXgFmAhRAHXxAWVXNlIFNlbGVjdGlvbiBmb3IgRmlu +ZFFl2gAOBIcBwwHEAcUBxgHHAcgBsAHJAc0CnAKfAc8AoAHRAdIB0wJmBTKAXICLgQEugBaAV4BZgHmB +AS9fEBRTcGVsbGluZyBhbmQgR3JhbW1hctIADgA+AGwFNoBrpAKlArMClAPTgI+AlICKgPLaAA4EhwHD +AcQBxQHGAccByAGwAckBzQMvAzIBzwCgAdEB0gHTAmYFQ4BcgLuBATKAFoBXgFmAeYEBM11TdWJzdGl0 +dXRpb25z0gAOAD4AbAVHgGujA6sDJwN8gOWAuoDU2gAOBIcBwwHEAcUBxgHHAcgBsAHJAc0C9wL6Ac8A +oAHRAdIB0wJmBVOAXICpgQEFgBaAV4BZgHmBATZbX05TTWFpbk1lbnXSAA4AMgAzADSABIAD0gA3ADgF +WQIhogIhADvSAA4APgQXBVyBATmvEFACigBOBF4AdQBOAB8AcwB4AtcAHwKcApwAdgBOAE4EIgL3A0kC +ZgBwAb8CZgQ0BCgCZgJmAHIC1wLXAmYCigKKAE4AdwQxAHECZgB0Ab8EIgKKAE4CZgRHAtcC1wJmAE4A +TgLXAy8CZgAfAaQCZgMvAB8C1wKKAE4EMgLXApwDLwJmAtcEIgL3BEACZgBvAb8BvwG/AmYAQQRbAE4A +TgKcgIWADIEBNYA8gAyAAoA1gFGAn4ACgIuAi4BCgAyADIEBCICpgMOAeYAkgFWAeYEBD4EBC4B5gHmA +MoCfgJ+AeYCFgIWADIBNgQEtgC2AeYA5gFWBAQiAhYAMgHmBATGAn4CfgHmADIAMgJ+Au4B5gAKAU4B5 +gLuAAoCfgIWADIEBIoCfgIuAu4B5gJ+BAQiAqYEBGIB5gBOAVYBVgFWAeYAHgQEcgAyADICL0gAOAD4E +FwWvgQE5rxBRAHMBRwL3ArMDjwBBASUBpAQhBCID0wKUAWoAbgByBCgDQANhAl4A2wG5BC4ELwLXBDEE +MgEYBDQENQPGBDcEOAAfAHYA/AGSAsEBNgKcAfEEQAKCAHUCdABxA1MAbwLPBEcDLwLiA3wD4wRMAb8D +AAOrBFEDuAB3BFMCigRWAqUDJwNJBFsDbwMOAI4EXgLvAe8B8gHwA50AeABOAHACZgB0gDWAPoCpgJSA +24AHgDeAU4EBB4EBCIDygIqARIAPgDKBAQuAwoDMgHiAJoBUgQEhgQESgJ+BAS2BASKANIEBD4EBFYDu +gQEmgQEqgAKAQoAvgE+AmYA7gIuAZYEBGICEgDyAf4AtgMiAE4CegQExgLuApIDUgPaBASCAVYCtgOWB +ATiA6YBNgQEogIWBARaAj4C6gMOBARyA0ICygBWBATWAqIBfgGiAYoDggFGADIAkgHmAOdIADgA+BBcG +A4EBOa8QUQYEBgUGBgYHBggGCQYKBgsGDAYNBg4GDwYQBhEGEgYTBhQGFQYWBhcGGAYZBhoGGwYcBh0G +HgYfBiAGIQYiBiMGJAYlBiYGJwYoBikGKgYrBiwGLQYuBi8GMAYxBjIGMwY0BjUGNgY3BjgGOQY6BjsG +PAY9Bj4GPwZABkEGQgZDBkQGRQZGBkcGSAZJBkoGSwZMBk0GTgZPBlAGUQZSBlMGVIEBPYEBPoEBP4EB +QIEBQYEBQoEBQ4EBRIEBRYEBRoEBR4EBSIEBSYEBSoEBS4EBTIEBTYEBToEBT4EBUIEBUYEBUoEBU4EB +VIEBVYEBVoEBV4EBWIEBWYEBWoEBW4EBXIEBXYEBXoEBX4EBYIEBYYEBYoEBY4EBZIEBZYEBZoEBZ4EB +aIEBaYEBaoEBa4EBbIEBbYEBboEBb4EBcIEBcYEBcoEBc4EBdIEBdYEBdoEBd4EBeIEBeYEBeoEBe4EB +fIEBfYEBfoEBf4EBgIEBgYEBgoEBg4EBhIEBhYEBhoEBh4EBiIEBiYEBioEBi4EBjIEBjV8QF1N0YXRp +YyBUZXh0IChZIG9mZnNldDopXxASQnV0dG9uIENlbGwgKFNhdmUpXU1lbnUgKFNwZWVjaClfEBpNZW51 +IEl0ZW0gKENoZWNrIFNwZWxsaW5nKV8QHU1lbnUgSXRlbSAoSnVtcCB0byBTZWxlY3Rpb24pXxAPV2lu +ZG93IChXaW5kb3cpXxAbVGV4dCBGaWVsZCBDZWxsIChZIG9mZnNldDopXxAcUG9wIFVwIEJ1dHRvbiBD +ZWxsIChMYXRpbi0xKVlTZXBhcmF0b3JYTWFpbk1lbnVfECdNZW51IEl0ZW0gKENoZWNrIEdyYW1tYXIg +V2l0aCBTcGVsbGluZylfECdNZW51IEl0ZW0gKENoZWNrIFNwZWxsaW5nIFdoaWxlIFR5cGluZylfEBpC +dXR0b24gQ2VsbCAoQ2hlY2tlcmJvYXJkKV8QEUZvbnQgVGV4dHVyZSBWaWV3V1N0ZXBwZXJfECJNZW51 +IEl0ZW0gKEZvbnQgVGV4dHVyZSBHZW5lcmF0b3IpUThfEBpNZW51IEl0ZW0gKFN0YXJ0IFNwZWFraW5n +KV8QEE1lbnUgSXRlbSAoVW5kbylfEBtUZXh0IEZpZWxkIENlbGwgKFggb2Zmc2V0OilfEBNNZW51IEl0 +ZW0gKExhdGluLTEpW1NlcGFyYXRvci0zXxAPTWVudSAoU2VydmljZXMpXxAdTWVudSAoRm9udCBUZXh0 +dXJlIEdlbmVyYXRvcilfECBNZW51IEl0ZW0gKFNwZWxsaW5nIGFuZCBHcmFtbWFyKV8QEE1lbnUgSXRl +bSAoRmluZClcU3RlcHBlciBDZWxsXxAUTWVudSBJdGVtIChTZXJ2aWNlcylbU2VwYXJhdG9yLTFfEBJN +ZW51IEl0ZW0gKERlbGV0ZSlfEBVNZW51IEl0ZW0gKEZpbmQgTmV4dClfECJNZW51IEl0ZW0gKFVzZSBT +ZWxlY3Rpb24gZm9yIEZpbmQpXEZpbGUncyBPd25lcl8QGENoZWNrIEJveCAoQ2hlY2tlcmJvYXJkKV5T +dGVwcGVyIENlbGwtMW8QcABUAGUAeAB0ACAARgBpAGUAbABkACAAQwBlAGwAbAAgACgASQBtAHAAbwBy +AHQAYQBuAHQAOgAgAHMAZQB0ACAgHABGAG8AbgB0ACAAcwBtAG8AbwB0AGgAaQBuAGcAIABzAHQAeQBs +AGUgHQAgAHQAbwAgIBwAUwB0AGEAbgBkAGEAcgBkIB0AIABpAG4AIAB0AGgAZQAgAEEAcABwAGUAYQBy +AGEAbgBjAGUAIABzAHkAcwB0AGUAbQAgAHAAcgBlAGYAZQByAGUAbgBjAGUAcwAgAHAAYQBuAGUALgAp +XxARTWVudSBJdGVtIChQYXN0ZSlfEBFUZXh0IEZpZWxkIENlbGwtMV8QG01lbnUgKFNwZWxsaW5nIGFu +ZCBHcmFtbWFyKV8QEU1lbnUgSXRlbSAoR3JlZWspXxAQTWVudSBJdGVtIChGaWxlKW8QEQBNAGUAbgB1 +ACAASQB0AGUAbQAgACgARgBpAG4AZCAmAClfEBJQdXNoIEJ1dHRvbiAoU2F2ZSlfEBBNZW51IEl0ZW0g +KENvcHkpWVN0ZXBwZXItMV8QF01lbnUgSXRlbSAoSGlkZSBPdGhlcnMpWlRleHQgRmllbGRfECdNZW51 +IEl0ZW0gKEhpZGUgRm9udCBUZXh0dXJlIEdlbmVyYXRvcilfEBlNZW51IEl0ZW0gKFN1YnN0aXR1dGlv +bnMpXxAUTWVudSAoU3Vic3RpdHV0aW9ucylfEBRNZW51IEl0ZW0gKFNob3cgQWxsKV8QF01lbnUgSXRl +bSAoU21hcnQgTGlua3MpXxAfU2hhcmVkIFVzZXIgRGVmYXVsdHMgQ29udHJvbGxlcltTZXBhcmF0b3It +NF8QEU1lbnUgKE90aGVyVmlld3MpXxAPTWVudSBJdGVtIChDdXQpXxAcTWVudSBJdGVtIChTbWFydCBD +b3B5L1Bhc3RlKVtBcHBsaWNhdGlvblQxMTExbxBsAFMAdABhAHQAaQBjACAAVABlAHgAdAAgACgASQBt AHAAbwByAHQAYQBuAHQAOgAgAHMAZQB0ACAgHABGAG8AbgB0ACAAcwBtAG8AbwB0AGgAaQBuAGcAIABz AHQAeQBsAGUgHQAgAHQAbwAgIBwAUwB0AGEAbgBkAGEAcgBkIB0AIABpAG4AIAB0AGgAZQAgAEEAcABw -AGUAYQByAGEAbgBjAGUACgBzAHkAcwB0AGUAbQAgAHAAcgBlAGYAZQByAGUAbgBjAGUAcwAgAHAAYQBu -AGUALgApXxAQTWVudSBJdGVtIChVbmRvKV8QFE1lbnUgKFN1YnN0aXR1dGlvbnMpbxAaAE0AZQBuAHUA -IABJAHQAZQBtACAAKABTAGgAbwB3ACAAUwBwAGUAbABsAGkAbgBnICYAKVxDb250ZW50IFZpZXdfEBVN -ZW51IChOZXdBcHBsaWNhdGlvbilRMl8QEU1lbnUgSXRlbSAoUGFzdGUpXxAPV2luZG93IChXaW5kb3cp -XxAQTWVudSBJdGVtIChDb3B5KVQxMTExUTVZU3RlcHBlci0xXxAaTWVudSBJdGVtIChDaGVjayBTcGVs -bGluZylfEBtNZW51IChTcGVsbGluZyBhbmQgR3JhbW1hcilfEBZNZW51IEl0ZW0gKFNlbGVjdCBBbGwp -XxAbVGV4dCBGaWVsZCBDZWxsIChYIG9mZnNldDopXxAeTWVudSBJdGVtIChCcmluZyBBbGwgdG8gRnJv -bnQpXxAVTWVudSBJdGVtIChGaW5kIE5leHQpXxASTWVudSAoT3BlbiBSZWNlbnQpXxAfTWVudSBJdGVt -IChIaWRlIE5ld0FwcGxpY2F0aW9uKV8QEk1lbnUgSXRlbSAoRm9ybWF0KV8QGU1lbnUgSXRlbSAoU3Vi -c3RpdHV0aW9ucylbU2VwYXJhdG9yLTFfECBNZW51IEl0ZW0gKFNwZWxsaW5nIGFuZCBHcmFtbWFyKV8Q -EE1lbnUgSXRlbSAoWm9vbSlROV1NZW51IChXaW5kb3cpXxAZTWVudSBJdGVtIChGaW5kIFByZXZpb3Vz -KW8QEQBNAGUAbgB1ACAASQB0AGUAbQAgACgARgBpAG4AZCAmAClfEBdTdGF0aWMgVGV4dCAoWCBvZmZz -ZXQ6KVMxMjFfEBRNZW51IEl0ZW0gKFNlcnZpY2VzKVE4XxAgTWVudSBJdGVtIChBYm91dCBOZXdBcHBs -aWNhdGlvbilfEBdNZW51IEl0ZW0gKE9wZW4gUmVjZW50KV8QGk1lbnUgSXRlbSAoTmV3QXBwbGljYXRp -b24pXFRleHQgRmllbGQtMVE3XxASTWVudSBJdGVtIChTcGVlY2gpXxAdTWVudSBJdGVtIChKdW1wIHRv -IFNlbGVjdGlvbilYTWFpbk1lbnVbTWVudSAoRWRpdClSMTBdTWVudSAoRm9ybWF0KV8QGU1lbnUgSXRl -bSAoU3RvcCBTcGVha2luZylbTWVudSAoRmluZClfEBdTdGF0aWMgVGV4dCAoWSBvZmZzZXQ6KVtTZXBh -cmF0b3ItNV8QD01lbnUgSXRlbSAoQ3V0KV8QHE1lbnUgSXRlbSAoU21hcnQgQ29weS9QYXN0ZSlbU2Vw -YXJhdG9yLTJfEBBNZW51IEl0ZW0gKFJlZG8pXFN0ZXBwZXIgQ2VsbF8QF01lbnUgSXRlbSAoSGlkZSBP -dGhlcnMpXxAPTWVudSAoU2VydmljZXMpXxAiTWVudSBJdGVtIChVc2UgU2VsZWN0aW9uIGZvciBGaW5k -KV8QFE1lbnUgSXRlbSAoU2hvdyBBbGwpXxASTWVudSBJdGVtIChXaW5kb3cpW1NlcGFyYXRvci02UTZf -EBZNZW51IEl0ZW0gKFNob3cgRm9udHMpXxAaQnV0dG9uIENlbGwgKENoZWNrZXJib2FyZClfEBJQdXNo -IEJ1dHRvbiAoU2F2ZSlfEBBNZW51IEl0ZW0gKEVkaXQpXxAPVGV4dCBGaWVsZCBDZWxsbxBwAFQAZQB4 -AHQAIABGAGkAZQBsAGQAIABDAGUAbABsACAAKABJAG0AcABvAHIAdABhAG4AdAA6ACAAcwBlAHQAICAc -AEYAbwBuAHQAIABzAG0AbwBvAHQAaABpAG4AZwAgAHMAdAB5AGwAZSAdACAAdABvACAgHABTAHQAYQBu -AGQAYQByAGQgHQAgAGkAbgAgAHQAaABlACAAQQBwAHAAZQBhAHIAYQBuAGMAZQAKAHMAeQBzAHQAZQBt -ACAAcAByAGUAZgBlAHIAZQBuAGMAZQBzACAAcABhAG4AZQAuAClTMi0xXxAQTWVudSBJdGVtIChGaWxl -KVEzW1NlcGFyYXRvci0zUTFfEBhNZW51IEl0ZW0gKFNob3cgVG9vbGJhcilbQXBwbGljYXRpb25TMS0x -XxAfTWVudSBJdGVtIChOZXdBcHBsaWNhdGlvbiBIZWxwKV8QFE1lbnUgSXRlbSAoTWluaW1pemUpXlN0 -ZXBwZXIgQ2VsbC0xXxAWTWVudSBJdGVtIChDbGVhciBNZW51KV8QF01lbnUgSXRlbSAoU2hvdyBDb2xv -cnMpXxARVGV4dCBGaWVsZCBDZWxsLTFfEBdNZW51IEl0ZW0gKFNtYXJ0IExpbmtzKW8QEQBNAGUAbgB1 -ACAASQB0AGUAbQAgACgATwBwAGUAbiAmAClbU2VwYXJhdG9yLTRvEB4ATQBlAG4AdQAgAEkAdABlAG0A -IAAoAEMAdQBzAHQAbwBtAGkAegBlACAAVABvAG8AbABiAGEAciAmACnSAA4APgSOCCWBAYyg0gAOAD4E -jggogQGMoNIADgA+BI4IK4EBjK8QlQHBAHIB0ALBBJICXQGsAdYCjwSVAG0DbQBvAGkEmgFTA6sBuwHC -BE8DdwHMA1gBHwAfAcMDhAG5AdEAcAQWAhUCmABMAe4D8ALPAi4AQQKmAnUCUwBsAc0CfQPGANUC+QGv -AdUB0gS0AdcBtgMvAbIDkQS3BLgB0wS5BLoDGgPaAwEBywS+A54BrgGtAbABvwBrAc8EwQTCAmcCIQTF -BMYBygBqBMgEyQHHAbcCQQHEBMsCNwK0AcADQQKHAdQCSQTRBDEDCwBuAbwBvQHFBNUECAGxAcgBswG1 -BNcE2AHdARIEPwHOAckE3ATdAt0E3wF2AHEE4gEwAcYBugFBBOUE5gNLBOgE6QPoBOsDJwP6A7gDZQD2 -AdgDOQCJAb4CCwLrBPUEJAG0AbiAy4BFgQEPgJ+BATmAfIBYgQEvgI2BAUaAMYDWgDiADoEBU4BBgOuA -rYDQgQEigNuA+oDRgDaAAoDUgN+Ao4EBFIA7gQEQgGaAkYALgFqBAQGApIBvgAeAloCGgHuALID/gIeA -9IAlgLOAboEBLIEBGIEBSoEBMoCVgMKAgIDjgQFrgQFtgQEdgQFegQFzgL2A+4C0gPiBAUyA54BqgGSA -dIDAgCOBAQqBAVuBAV+AgYBrgQE8gQF4gPOAEoEBQoEBeoDmgJqAdYDagQFUgHCAm4DFgMeAjIEBIYB2 -gQGFgQEZgLiANICygLeA3oEBZYEBC4B6gOqAhYCQgQFOgQFigFmAM4EBHoEBBYDugQGGgQGEgKmBAXGA -R4A/gQGAgDqA4oCogD2BAUOBAX6AzIEBWoEBiIEBAIEBi4DBgQEGgO+A1YAugQE1gMaAFIC8gGWAroEB -doEBFYCLgJ7SAA4APgSOCMOBAYyvEJUIxAjFCMYIxwjICMkIygjLCMwIzQjOCM8I0AjRCNII0wjUCNUI -1gjXCNgI2QjaCNsI3AjdCN4I3wjgCOEI4gjjCOQI5QjmCOcI6AjpCOoI6wjsCO0I7gjvCPAI8QjyCPMI -9Aj1CPYI9wj4CPkI+gj7CPwI/Qj+CP8JAAkBCQIJAwkECQUJBgkHCQgJCQkKCQsJDAkNCQ4JDwkQCREJ -EgkTCRQJFQkWCRcJGAkZCRoJGwkcCR0JHgkfCSAJIQkiCSMJJAklCSYJJwkoCSkJKgkrCSwJLQkuCS8J -MAkxCTIJMwk0CTUJNgk3CTgJOQk6CTsJPAk9CT4JPwlACUEJQglDCUQJRQlGCUcJSAlJCUoJSwlMCU0J -TglPCVAJUQlSCVMJVAlVCVYJVwlYgQH8gQH9gQH+gQH/gQIAgQIBgQICgQIDgQIEgQIFgQIGgQIHgQII -gQIJgQIKgQILgQIMgQINgQIOgQIPgQIQgQIRgQISgQITgQIUgQIVgQIWgQIXgQIYgQIZgQIagQIbgQIc -gQIdgQIegQIfgQIggQIhgQIigQIjgQIkgQIlgQImgQIngQIogQIpgQIqgQIrgQIsgQItgQIugQIvgQIw -gQIxgQIygQIzgQI0gQI1gQI2gQI3gQI4gQI5gQI6gQI7gQI8gQI9gQI+gQI/gQJAgQJBgQJCgQJDgQJE -gQJFgQJGgQJHgQJIgQJJgQJKgQJLgQJMgQJNgQJOgQJPgQJQgQJRgQJSgQJTgQJUgQJVgQJWgQJXgQJY -gQJZgQJagQJbgQJcgQJdgQJegQJfgQJggQJhgQJigQJjgQJkgQJlgQJmgQJngQJogQJpgQJqgQJrgQJs -gQJtgQJugQJvgQJwgQJxgQJygQJzgQJ0gQJ1gQJ2gQJ3gQJ4gQJ5gQJ6gQJ7gQJ8gQJ9gQJ+gQJ/gQKA -gQKBgQKCgQKDgQKEgQKFgQKGgQKHgQKIgQKJgQKKgQKLgQKMgQKNgQKOgQKPgQKQEQFqEQGgEN8RAV8Q -lRBREQFwEQGIENQQ2hEBixEBKBEBjREBdxEBJxEBnhEBWhEBdhDrEQGGEMQRAXUQyhEBjxEBpBEBbhDb -EOIRAW0RAZsQzxEBXRDMEQF0EDkQahDLEMURAXMQiBDJEE0RAXwRAWgQxhEBexAFEOARAZQQ5BDQEQGK -EQFxEH0RAWsQhhEBXBEBKxEBchCPENgQ7xBSEBgRAZ8Q1RDREI4RAWUQ9RB/EQF6EOcQgxBQEDoQfBA4 -EOgRAXgQTxDTEPERAWwQ0hDpEB0QzRBwEQFpEQEsEMMRAZIQ3BDWEMcRAV4RAYwQJxEBYxDeEJAQ1xBX -EQFbEOEQ5hDdEIIQkREBkBCWEMEQJRATEM4QThEBWBEBoREBnRDZEQGOEQFvEFYRAZwQShBTEEsQ7BBn -EG8T//////////0QfhBJEBcRASkRAX0RAaMRAVkRAXkQ8BEBYhBIEFwRASoQ4xEBZNIADgA+AGcJ7oBQ -oNIADgA+BI4J8YEBjKDSAA4APgSOCfSBAYyg0gA3ADgJ9gn3ogn3ADteTlNJQk9iamVjdERhdGEACAAZ -ACIAJwAxADoAPwBEAFIAVABmBZQFmgXlBewF8wYBBhMGLwY9BkkGVQZjBm4GfAaYBqYGuQbLBuUG7wb8 -Bv4HAQcEBwcHCgcMBw8HEQcUBxcHGgcdBx8HIQckBycHKgctBzYHQgdEB0YHVAddB2YHcQd2B4UHjgeh -B6oHtQe3B7oHvAflB/IH/wgNCBcIJQgyCEQIWAhkCGYIaAhqCGwIcQhzCHUIdwh5CHsIlQicCKUIwgjU -CN8I6Aj0CQAJAgkECQYJCQkLCQ0JDwkYCRoJLwkxCTMJNQk3CTkJOwk9CT8JQQlDCWAJaAlqCWwJbglx -CXMJdQl3CZAJogmrCbQJwQnICdQJ9Qn8CgYKCAoKCgwKDgoPChEKEwoqCk8KWwpvCnoKhAqSCp8Kswq/ -CsgKygrMCs4K0ArSCtcK2AraCtsK7ArzCvoLAwsFCw4LEAsTCyALKQsuCzULSgtSC18Lawt5C3sLfQt/ -C4ELgwuKC6ALrQu1C7cLuQu8C8ULygvfC+EL4wvlC+cL8Qv+DAAMAwwMDBUMJww0DD0MSAxUDF4MfwyB -DIMMhQyHDIgMigyMDKMMxAzJDMsMzQzPDNEM0wzVDN8M9Az2DPgM+gz8DQkNFg0YDSQNOQ07DT0NPw1B -DVQNdQ13DXkNew19DX4NgA2CDZoNuw3HDdIN3Q3qDe8N8Q36DgMODA4ODhAOEQ4aDiMOMQ46DkUOTw5w -DnIOdA52DngOeQ57Dn0OlQ62DrgOug67DtwO3g7gDuIO5A7lDucO6Q8BDyIPJA8mDygPKg8sDy4POA9Z -D1sPXQ9fD2EPYg9kD2YPfg+jD6UPpw+pD6sPrQ+uD7AP0Q/TD9UP1w/ZD9oP3A/eD/cQGBAaEBwQHhAg -ECIQJxApEOgRCRELEQ0RDxERERIRFBEWES4RXxF1EYoRmRGrEb0RyxHQEdIR1BHWEdgR2hHcEd4R4BHi -EecR8BH1Ef4SBxIUEh0SKBIxElISVBJWElgSWhJbEl0SXxJ4ErESvxLSEtsS3RLfEuES4xLlEucS6RLr -EvAS/RMKExkTGxMdEx8TJxMwEzkTPhNRE1oTZhNoE2oTcxN4E44TlxOeE60TtRPAE8kT0BPpE/IT9xQK -FBMUGhQnFC0UNhQ4FJUUlxSZFJsUnRSfFKEUoxSlFKcUqRSrFK0UrxSxFLMUtRS3FLkUuxS9FL8UwRTD -FMUUxxTJFMsUzRTPFNEU0xTVFNcU2RTcFN8U4hTlFOgU6xTuFPEU9BT3FPoVBxUQFRgVGhUcFR4VPxVH -FVsVZhV0FX4VixWSFZQVlhWbFZ0VohWkFaYVqBW5FcUVyBXLFc4V0RXdFd8V7BXuFfAV8hYEFhEWExYV -FhcWKhYzFjgWQxZcFmUWbBaEFpMWoBaiFqQWphbLFtEW0xbVFtoW3BbeFuAW4hbvFvIW9Rb4FwQXBhcm -FzcXRRdHF0kXSxdNF2oXbBduF3AXchd0F3YXjRetF7oXvBe+F8AX4RfjF+UX6hfsF+4X8BfyF/8YAhgF -GAgYDRgPGBUYIhgkGCYYKBhJGEsYTRhPGFEYUxhVGGIYZRhoGGsYfxiBGKEYrhiwGLIYtBjZGOMY5Rjn -GOkY6xjtGO8Y8Rj+GQEZBBkHGRUZFxkmGTMZNRk3GTkZWhlcGV4ZYBliGWQZZhl3GXkZixmYGZoZnBme -Gb8ZwRnDGcUZxxnJGcsZ2BnbGd4Z4RnwGfIaARoOGhAaEhoUGjUaNxo5GjsaPRo/GkEaThpRGlQaVxpl -GnMagBqCGoQahhqnGqkaqxqtGq8asRqzGtAa0hrkGvEa8xr1GvcbGBsaGxwbHhsgGyIbJBs6GzwbRxtU -G1YbWBtaG3cbeRt7G30bfxuBG4MblRuuG7sbvRu/G8Eb5hvoG+ob7BvuG/Ab8hv/HAEcJRwyHDQcNhw4 -HFkcWxxdHF8cYRxjHGUcaxxtHHQcgRyDHIUchxyoHKocrByuHLAcshy0HMEcwxzKHNcc2RzbHN0c/h0A -HQIdBB0GHQgdCh0VHRcdJR0yHTQdNh04HVkdWx1dHV8dYR1jHWUddh15HXsdfh2BHZYdqB21HbcduR27 -HeAd4h3kHeYd6B3qHewd7h4BHgMeHh4rHi0eLx4xHlIeVB5WHlgeWh5cHl4eYx5wHn0efx6BHoMepB6m -Hqgeqh6sHq4esB7BHsQexx7KHs0e2B7wHv0e/x8BHwMfJB8mHygfKh8sHy4fMB89H0AfQx9GH1IfVB9s -H3kfex99H38foB+iH6Qfph+oH6ofrB+uH7wfyR/LH80fzx/wH/If9B/2H/gf+h/8IAMgCyAYIBogHCAe -ID8gQSBDIEUgRyBJIEsgWCBbIF4gYSBuIHAghiCTIJUglyCZILogvCC+IMAgwiDEIMYg1SDkIPEg8yD1 -IPchGCEaIRwhHiEgISIhJCFCIWMhcCFyIXQhdiGXIZkhmyGdIZ8hoSGjIbkhvyHMIc4h0CHSIfch+SH7 -If0h/yIBIgMiDiIoIjUiNyI5IjsiXCJeImAiYiJkImYiaCKGIp8irCKuIrAisiLTItUi1yLZItsi3SLf -Iugi6iMAIw0jDyMRIxMjNCM2IzgjOiM8Iz4jQCNLI00jWCNpI2sjbSNvI3EjfCOJI4sjjSOPI7AjsiO0 -I7YjuCO6I7wjwCPCI88j3CPeI+Ej5CQFJAckCiQNJA8kESQUJCEkJCQnJCokQCRCJEwkWSRbJF4kYSSC -JIQkhySKJIwkjiSQJJYkmCSmJLMktSS4JLsk3CTeJOEk5CTmJOgk6iTvJPEk9yUEJQYlCSUMJS0lLyUy -JTUlNyU5JTslQCVCJUglVSVXJVolXSV+JYAlgyWFJYcliSWLJbIl1CXhJeMl5iXpJgomDCYPJhImFCYW -JhgmHCYeJiMmMCYyJjUmOCZZJlsmXiZgJmImZCZmJm8miCalJq8muSbYJtsm3ibhJuQm5ibpJvYnBScY -JxsnHicfJygnKicxJzQnNyc6J0InSideJ2cnbieJJ5Ynrie0J8MnzCfTJ+soCCgLKA4oESgUKBYoGSg2 -KDkoPCg/KEIoRChHKF8obiiLKI4okSiUKJcomSicKLkovCi/KMIoxSjHKMoo7CkHKRApEynkKeYp6Cnr -Ke0p7ynyKfQp9in4Kfop/Sn/KgEqBCoGKggqCioMKg4qESoTKhUqFyoZKhwqHiogKiIqJComKigqKios -Ki4qMCoyKjUqNyo5KjwqPypCKkUqRypJKksqTipQKlIqVSpYKloqXCpfKmIqZCpnKmoqbCpvKnEqcyp1 -KncqeSp8Kn8qgSqDKoYqiSqMKo8qkSqTKpYqmSqcKp4qoSqjKqUqqCqqKqwqryqyKrQqtyq6Kr0qwCrC -KsUqxyrJKssqzSrPKtEq0yrWKtkrAisQKx0rHyshKyIrJCslKycrKSsrKzArOSs7K1IrVCtWK1krXCtf -K2ErYytlK2graitsK5UrnyuoK6orrCuvK7Ersyu1K7cruivGK9Ur3ivgK+Mr5Sv+LAcsDCw1LDcsOSw6 -LDwsPSw/LEEsQyxsLG4scCxxLHMsdCx2LHgseiyBLIosjCyRLJMslSy+LMAswizFLMcsySzLLM0s0CzV -LN4s4CzrLO0s8CzzLPYs+C0dLR8tIi0kLSYtKC0qLTQtWS1bLV4tYC1iLWQtZi10LZktmy2eLaEtoy2l -LactwC3CLcct0C3SLdct2S3cLgUuBy4JLgwuDi4QLhIuFS4YLikuLC4vLjIuNS5DLkwuTi5VLlcuWS5b -Lmoucy51Lowuji6RLpQuly6aLp0uny6hLqQupy6pLtIu1C7WLtcu2S7aLtwu3i7gLwEvAy8GLwkvCy8N -Lw8vKC8qL1MvVS9XL1gvWi9bL10vXy9hL4ovjC+PL5IvlC+WL5gvmi+dL6Yvty+6L70vwC/DL8wvzi/P -L+EwCjAMMA4wDzARMBIwFDAWMBgwJTAqMDMwNTA4MDswUjBbMF0wZjBoMGowbDBuMJcwmTCbMJ4woDCi -MKQwpjCpMNIw1DDWMNkw2zDdMN8w4jDlMOww9TD3MPww/zEBMSIxJDEnMSkxKzEtMS8xOjFjMWUxZzFq -MWwxbjFwMXIxdTF+MYAxiTGLMY0xkDGSMbsxvTG/McAxwjHDMcUxxzHJMdgyATIDMgUyCDIKMgwyDjIR -MhQyPTI/MkEyRDJGMkgySjJMMk8yWTJiMmQyczJ2MnkyfDJ/MoIyhTKIMrEyszK1MrgyujK8Mr4ywTLE -Mu0y7zLxMvQy9jL4Mvoy/TMAMwUzDjMQMyszLjMxMzQzNzM5MzszPTM/M0IzRTNIM0szTjN3M3kzezN8 -M34zfzOBM4MzhTOuM7AzsjOzM7UztjO4M7ozvDPlM+cz6TPrM+0z7zPxM/Qz9zQgNCI0JTQoNCo0LDQu -NDE0NDRANEk0SzRNNFY0WzRkNGc1ODU6NTw1PjVBNUQ1RjVINUs1TTVPNVI1VDVWNVg1WjVcNV41YDVi -NWQ1ZzVpNWs1bjVxNXM1dTV3NXk1ezV9NX81gjWENYY1iDWKNY01jzWRNZQ1ljWYNZo1nDWfNaE1ozWl -Nac1qTWrNa01rzWyNbQ1tjW4Nbo1vDW/NcE1xDXGNck1yzXNNc810TXTNdU11zXaNdw13jXgNeM15TXn -Nek16zXtNfA18jX0NfY1+TX7Nf02ADYDNgU2BzYJNgs2DTYPNhE2EzYVNhc2GTYbNiQ2Jzb6Nvw2/jcB -NwM3BTcINwo3DDcONxA3EzcVNxc3GjccNx43IDciNyQ3JjcpNys3LTcvNzE3NDc2Nzg3Ojc8Nz43QDdC -N0Q3RjdIN0o3TTdPN1E3VDdXN1o3XTdfN2E3YzdmN2g3ajdtN3A3cjd0N3c3ejd8N383gjeEN4c3iTeL -N403jzeRN5M3ljeZN5s3njehN6M3pTeoN6s3rjexN7Q3tje5N7s3vTfAN8I3xDfHN8o3zDfPN9I31DfX -N9o33TffN+E34zflN+c36TfrN+438Tf6N/040DjTONY42TjcON844jjlOOg46zjuOPE49Dj3OPo4/TkA -OQM5BjkJOQw5DzkSORU5GDkbOR45ITkkOSc5KjktOTA5Mzk2OTk5PDk/OUI5RTlIOUs5TjlROVQ5Vzla -OV05YDljOWY5aTlsOW85cjl1OXg5ezl+OYE5hDmHOYo5jTmQOZM5ljmZOZw5nzmiOaU5qDmrOa45sTm0 -Obc5ujm9OcA5wznGOck5zDnPOdI51TnYOds53jnhOeQ55znqOe058DnzOfY5+Tn8Of86AjoFOgg6Izo+ -Okg6VDpiOnU6fTqJOpQ6qDq7OtA6+jscOzk7TjtsO3k7ozx+PJE8qDzfPOw9BD0GPRo9LD0/PUQ9Rj1Q -PW09iz2kPcI94z37PhA+Mj5HPmM+bz6SPqU+pz61PtE+9j8QPxQ/Kz8tP1A/aj+HP5Q/lj+rP8s/1D/g -P+M/8UANQBlAM0A/QFFAcEB8QI9AnEC2QMhA7UEEQRlBJUEnQUBBXUFyQYVBl0J6Qn5CkUKTQp9CoUK8 -QshCzELuQwVDFEMtQ0dDW0N1Q5pDpkPlQ+5D8UPyQ/tD/kP/RAhEC0U4RTpFPEU/RUFFREVGRUhFS0VN -RVBFUkVURVZFWEVbRV1FX0VhRWNFZkVoRWpFbEVuRXBFckV0RXZFeUV7RX5FgEWCRYRFhkWJRYtFjUWP -RZFFk0WVRZdFmUWbRZ1Fn0WhRaNFpkWpRaxFr0WxRbNFtUW3RbpFvUXARcNFxkXIRcpFzEXORdFF00XV -RddF2UXbRd1F4EXjReZF6EXqRe1F8EXyRfRF90X6RfxF/kYARgJGBUYHRglGC0YNRg9GEkYURhdGGkYc -Rh5GIEYiRiRGJ0YqRixGLkYwRjJGNUY4RjpGPEY/RkJGREZHRkpGTEZPRlFGU0ZWRlhGWkZcRl5GYUZk -RmZGaUZsRm9GckZ0RndGeUZ7Rn1GgEaCRoRGhkaIRopGjUaQRpJGlEadRqBHzUfQR9NH1kfZR9xH30fi -R+VH6EfrR+5H8Uf0R/dH+kf9SABIA0gGSAlIDEgPSBJIFUgYSBtIHkghSCRIJ0gqSC1IMEgzSDZIOUg8 -SD9IQkhFSEhIS0hOSFFIVEhXSFpIXUhgSGNIZkhpSGxIb0hySHVIeEh7SH5IgUiESIdIikiNSJBIk0iW -SJlInEifSKJIpUioSKtIrkixSLRIt0i6SL1IwEjDSMZIyUjMSM9I0kjVSNhI20jeSOFI5EjnSOpI7Ujw -SPNI9kj5SPxI/0kCSQVJCEkLSQ5JEUkUSRdJGkkdSSBJI0kmSSlJLEkvSTJJNUk4STtJPklBSURJR0lK -SU1JUElTSVZJWUlcSV9JYkllSWhJa0luSXFJdEl3SXpJfUmASYNJhkmJSYxJj0mSSZRJl0mZSZtJnkmh -SaNJpUmoSatJrkmxSbRJt0m6Sb1Jv0nCScRJx0nJScxJz0nSSdRJ1knZSdxJ3knhSeNJ5knoSepJ7Enu -SfFJ80n1SfdJ+kn9Sf9KAkoESgZKCUoLSg1KEEoTShVKGEoaSh1KIEojSiVKJ0opSitKLUowSjJKNEo2 -SjlKO0o9SkBKQkpESkZKSEpKSkxKTkpRSlNKVUpXSlpKXEpeSmBKYkpkSmdKakpsSm9KcUpzSnVKeEp7 -Sn1KgEqCSoRKhkqISotKjUqPSpFKk0qVSphKmkqcSp5KoEqiSqRKp0qqSq1Kr0qySrVKt0q6SrxKvkrA -SsJKxErGSs9K0UrTStVK2ErbSt5K4UrkSuZK6UrrSu1K8ErySvVK/ksASwFLCksNSw5LF0saSxtLJEsp -AAAAAAAAAgIAAAAAAAAJ+AAAAAAAAAAAAAAAAAAASzg +AGUAYQByAGEAbgBjAGUAIABzAHkAcwB0AGUAbQAgAHAAcgBlAGYAZQByAGUAbgBjAGUAcwAgAHAAYQBu +AGUALgApXxAZTWVudSBJdGVtIChGaW5kIFByZXZpb3VzKVtNZW51IChGaW5kKVtTZXBhcmF0b3ItMm8Q +GgBNAGUAbgB1ACAASQB0AGUAbQAgACgAUwBoAG8AdwAgAFMAcABlAGwAbABpAG4AZyAmAClfEBhNZW51 +IEl0ZW0gKFNtYXJ0IFF1b3RlcylbTWVudSAoRmlsZSlfEBBNZW51IEl0ZW0gKEVkaXQpXxAoTWVudSBJ +dGVtIChBYm91dCBGb250IFRleHR1cmUgR2VuZXJhdG9yKV8QEE1lbnUgSXRlbSAoUmVkbylfEA9UZXh0 +IEZpZWxkIENlbGxfEBJNZW51IEl0ZW0gKFNwZWVjaClfEBlNZW51IEl0ZW0gKFN0b3AgU3BlYWtpbmcp +XxATTWVudSBJdGVtIChMYXRpbi0yKV8QE01lbnUgSXRlbSAoVHVya2lzaClfEBRNZW51IEl0ZW0gKEN5 +cmlsbGljKV8QFk1lbnUgSXRlbSAoU2VsZWN0IEFsbClfEBZQb3B1cCBCdXR0b24gKExhdGluLTEpXENv +bnRlbnQgVmlld18QF1N0YXRpYyBUZXh0IChYIG9mZnNldDopW01lbnUgKEVkaXQpXFRleHQgRmllbGQt +MdIADgA+BBcGqIEBOaDSAA4APgQXBquBATmg0gAOAD4EFwaugQE5rxBxAvcBJQJIApQBagBuAHIDQAJE +AbkCVgQvAjsC1wQxBDICQQQ3BDgAHwGSAPwBNgLBAlgCSwRAAj4AdQMvA1MCzwRHAuID4wJNA6sDuAB3 +Aj8CigKlAfIDDgNvA0kC7wCOBF4CTAHvAlACRgFHAmYAcAB0AjoDjwBzArMCVQBBAaQCUwQhBCID0wJS +AkoEKANhAl4A2wQuAlECPQJFARgENAQ1A8YCPAB2ApwB8QJOAoICWQJ0AHEAbwJXAlQCQwN8BEwCQAG/ +AkkDAAJHBFEEUwRWAycCTwRbAfAAeAOdAE4CQoCpgDeAv4CKgESAD4AygMKArIBUgPyBARKAfoCfgQEt +gQEigJ2BASaBASqAAoBPgC+AO4CZgQEAgMuBARiAjoA8gLuAyICegQExgKSA9oDTgOWA6YBNgJOAhYCP +gGiAsoDQgMOAqIAVgQE1gM+AX4DfgLaAPoB5gCSAOYB3gNuANYCUgPWAB4BTgO2BAQeBAQiA8oDogMeB +AQuAzIB4gCaBASGA5ICJgLGANIEBD4EBFYDugIOAQoCLgGWA2ICEgQEDgH+ALYATgP2A8YCngNSBASCA +mIBVgMGArYC5gQE4gQEogQEWgLqA2oEBHIBigFGA4IAMgKPSAA4APgQXByKBATmvEHEHIwckByUHJgcn +BygHKQcqBysHLActBy4HLwcwBzEHMgczBzQHNQc2BzcHOAc5BzoHOwc8Bz0HPgc/B0AHQQdCB0MHRAdF +B0YHRwdIB0kHSgdLB0wHTQdOB08HUAdRB1IHUwdUB1UHVgdXB1gHWQdaB1sHXAddB14HXwdgB2EHYgdj +B2QHZQdmB2cHaAdpB2oHawdsB20HbgdvB3AHcQdyB3MHdAd1B3YHdwd4B3kHegd7B3wHfQd+B38HgAeB +B4IHgweEB4UHhgeHB4gHiQeKB4sHjAeNB44HjweQB5EHkgeTgQGSgQGTgQGUgQGVgQGWgQGXgQGYgQGZ +gQGagQGbgQGcgQGdgQGegQGfgQGggQGhgQGigQGjgQGkgQGlgQGmgQGngQGogQGpgQGqgQGrgQGsgQGt +gQGugQGvgQGwgQGxgQGygQGzgQG0gQG1gQG2gQG3gQG4gQG5gQG6gQG7gQG8gQG9gQG+gQG/gQHAgQHB +gQHCgQHDgQHEgQHFgQHGgQHHgQHIgQHJgQHKgQHLgQHMgQHNgQHOgQHPgQHQgQHRgQHSgQHTgQHUgQHV +gQHWgQHXgQHYgQHZgQHagQHbgQHcgQHdgQHegQHfgQHggQHhgQHigQHjgQHkgQHlgQHmgQHngQHogQHp +gQHqgQHrgQHsgQHtgQHugQHvgQHwgQHxgQHygQHzgQH0gQH1gQH2gQH3gQH4gQH5gQH6gQH7gQH8gQH9 +gQH+gQH/gQIAgQIBgQICENQRAY8RAa8Q2xEBoREBdxEBixBQEOQRAaoRAYgQghDgEDkQ2BDaEQFvENAQ +3REBsREBphEBfREBjhDLEQGUEOkQUxDmEQGdEQFdEJEQhhEBXBCWEQGGEQFlEQFeEIgRAaUQ4RDcEMwR +Aa4Q1xA6EFEQwxEBeRDTEI4RAasQ6BEBsBEBnhDNEQF6EQGNEN8Q0hEBjBDJEQGKEQFzEQGoEOsQjxAd +EQFaEQFxEQFwEDgQxBDPEQF7ENYRAWMQ3hDnEIMQkBDKEPERAaARAa0RAZ8Q0REBkhDFEQF8EQF4EQGj +EQFbEOMRAWIQzhDiEQGpEQGkEMcRAWQT//////////0Q1RCVEQFfEPUQ2REBrBEBpxDGEQF0EQFy0gAO +AD4AbAgFgGug0gAOAD4EFwgIgQE5oNIADgA+BBcIC4EBOaDSADcAOAgNCA6iCA4AO15OU0lCT2JqZWN0 +RGF0YQAIABkAIgAnADEAOgA/AEQAUgBUAGYEeAR+BMkE0ATXBOUE9wUTBSEFLQU5BUcFUgVgBXwFigWd +Ba8FyQXTBeAF4gXlBegF6wXuBfAF8wX1BfgF+wX+BgEGAwYFBggGCwYOBhEGGgYmBigGKgY4BkEGSgZV +BloGaQZyBoUGjgaZBpsGngagBtEG3gbrBvkHAwcRByoHNwdJB10HZwdzB3UHdwd5B3sHgAeCB4QHhgeI +B4oHjAeOB6kHsAe5B8QH4QfzB/4IBwgTCB8IIQgjCCUIKAgqCCwILgg3CDkIUAhSCFQIVghYCFoIXAhe +CGAIYghkCGYIgwiLCI0IjwiRCJMIlQiXCLIIxAjNCNYI4wjqCPYJFwkeCSgJKgksCS4JMAkzCTQJNgk4 +CVMJeAmECZgJowmtCbsJyAncCegJ8QnzCfUJ9wn5CfsKAAoBCgMKBAoVChwKIwosCi4KNwo5CjwKSQpS +ClcKXgpzCnsKiAqUCqIKpAqmCqgKqgqsCrMKyQrWCt4K4AriCuUK7grzCwgLCgsMCw4LEAsaCycLKQss +CzULPgtQC10LZgtxC30LhwuoC6oLrAuuC7ALsQuzC7UL0AvxC/YL+Av6C/wL/gwADAIMDAwhDCMMJQwn +DCkMNgxDDEUMUQxmDGgMagxsDG4MgQyiDKQMpgyoDKoMqwytDK8MygzrDPcNAg0NDRoNHw0hDSoNMw08 +DT4NQA1BDUoNUw1hDWoNdQ1/DaANog2kDaYNqA2pDasNrQ3HDegN6g3sDe0ODg4QDhIOFA4WDhcOGQ4b +DjUOVg5YDloOXA5eDmAOYg5sDo0Ojw6RDpMOlQ6WDpgOmg60DtkO2w7dDt8O4Q7jDuQO5g8HDwkPCw8N +Dw8PEA8SDxQPLg9fD3UPig+ZD6sPvQ/LD9AP0g/UD9YP2A/aD9wP3g/gD+IP5w/wD/UP/hAHEBQQHRAo +EDEQUhBUEFYQWBBaEFsQXRBfEHoQsxDBENQQ3RDfEOEQ4xDlEOcQ6RDrEO0Q8hD/EQwRGxEdER8RIREp +ETIROxFAEVMRXBFoEWoRbBF1EXoRkBGxEbMRtRG3EbkRvBG9Eb8RwRHbEfwR/hIAEgISBBIGEggSxxLo +EuoS7BLuEvAS8RLzEvUTEBNbE3gTihOVE6cTvBPKE9ET2hPbE90T3xPhE+MT5RPnE+kT6xPsE+0T8BPz +E/UT+hQrFDQUPBRQFFsUaRRzFIAUiRSPFJcUmRSbFJ0UohSkFKkUqxStFK8UsRSzFMAUzBTOFNAU0hTa +FOcU6RTrFO0U/xUMFQ4VEBUSFSUVORVCFUcVUhVbFV0VaBVqFWwVbhVwFXIVnxWhFaMVpRWnFakVqxWt +Fa8VtxXkFeYV6BXqFewV7hXwFfIV9BX2Ff8WLBYuFjAWMhY0FjYWOBY6FjwWPhZEFnEWcxZ1FncWeRZ7 +Fn0WfxaBFoMWixaUFpsWqhayFrsWwBbJFtYW6hb5FwIXDxcdFyoXMxc6F1MXXhdnF2wXfxeIF48XnBei +F6sXrRfwF/IX9Bf2F/gX+hf8F/4YABgCGAQYBhgIGAoYDBgOGBAYEhgUGBYYGBgaGBwYHhggGCIYJBgm +GCgYKhgsGC8YMhg/GEgYUBhSGFQYVhh3GHkYexh9GH8YgRiDGJAYkhiVGJgYnRifGKUYrhi1GM0Y3Bjp +GOsY7RjvGRAZEhkUGRYZGBkaGRwZIRkjGSkZNhk4GToZPBlhGWMZZRlnGWkZaxltGXoZfBl/GYIZjRmP +GakZthm4GboZvBndGd8Z4RnjGeUZ5xnpGfYZ+Bn7Gf4aHBo9GkoaTBpOGlAacRpzGnUadxp5GnsafRqa +Gpwarhq7Gr0avxrBGuIa5BrmGuga6hrsGu4a/Rr/Gw4bGxsdGx8bIRtCG0QbRhtIG0obTBtOG1QbVhtd +G2obbBtuG3AbkRuTG5UblxuZG5sbnRuuG7Absxu2G7kb1xvZG98b7BvuG/Ab8hwTHBUcFxwZHBscHRwf +HCgcQRxOHFAcUhxUHHUcdxx5HHscfRx/HIEcjhyQHJMclhykHLIcvxzBHMMcxRzmHOgc6hzsHO4c8Bzy +HPYc+Bz9HQodDB0OHRAdMR0zHTUdOh08HT4dQB1CHUcdSR1PHWAdbh1wHXIddB12HYQdjR2UHasduB26 +Hbwdvh3jHeUd5x3pHesd7R3vHfwd/h4BHgQeER4THjceSB5KHkweTh5QHmceeB56Hnwefh6AHqEeox6l +HqoerB6uHrAesh6/HsEexB7HHtge2h7lHvIe9B72HvgfGR8bHx0fIh8kHyYfKB8qHzYfTx9cH14fYB9i +H4MfhR+HH4kfix+NH48fnh+tH74fwB/CH8Qfxh/jH+Uf5x/pH+sf7R/vIA4gLiA7ID0gPyBBIGYgaCBq +IGwgbiBwIHIgfiCAIKAgsSCzILUgtyC5IMYgyCDKIMwg7SDvIPEg8yD1IPcg+SENIQ8hLyE8IT4hQCFC +IWMhZSFnIWkhayFtIW8heiF8IYchlCGWIZghmiG/IcEhwyHFIcchySHLId4h+SIGIggiCiIMIi0iLyIx +IjMiNSI3IjkiVyJZImQicSJzInUidyKYIpoinCKeIqAioiKkIqsisyLAIsIixCLGIuci6SLrIu0i7yLx +IvMjESMqI0cjUSNbI3ojfCN+I4AjgiOEI4YjjyOiI6QjpSOuI7Uj0CPdI/Uj+yQKJBMkGiQyJE8kUSRT +JFUkVyRZJFskeCR6JHwkfiSAJIIkhCSmJMEk3iTgJOIk5STnJOkk7CUEJRMlMCUyJTQlNyU5JTslPiVH +JUol7SXvJfEl8yX1Jfcl+SX7Jf0mACYDJgUmByYJJgsmDSYQJhImFCYWJhgmGiYdJiAmIiYlJigmKiYt +JjAmMiY1JjgmOiY8Jj4mQCZCJkQmRiZJJksmTSZPJlEmUyZVJlgmWiZcJl4mYCZjJmUmZyZpJmsmbiZw +JnMmdSZ3JnomfCZ+JoAmgiaFJocmiSaMJo4mkCaSJpQmliaYJpomnCaeJqAmpyawJrImtya5Jrsm5Cby +Jv8nAScDJwQnBicHJwknCycNJx4nICcjJyYnKSczJzwnPidFJ0gnSydOJ3cngSeDJ4UniCeKJ4wnjieR +J5QnrSe8J8UnxyfaJ9wn3yfiJ+Un5yfpJ+sn7ifwKBkoGygeKCEoIyglKCcoKSgsKDUoRihIKEsoTihR +KFooXChdKG8omCiaKJwonSifKKAooiikKKYozyjRKNMo1CjWKNco2SjbKN0o6ikTKRUpFykaKRwpHikg +KSMpJikrKTQpNik5KTspZClmKWgpayltKW8pcSl0KXcpfCmFKYcpoimkKaYpqSmrKa0prymxKbMptim5 +KbwpvynCKesp7SnvKfAp8inzKfUp9yn5KiIqJComKicqKSoqKiwqLiowKlkqWypdKmAqYipkKmYqaCpr +KnAqeSp7KoYqiCqLKo4qkSqTKrgquiq9Kr8qwSrDKsUqzyr0KvYq+Sr7Kv0q/ysBKw8rNCs2KzkrPCs+ +K0ArQitEK10rXyuIK4orjCuPK5ErkyuVK5crmiuxK7orvCvFK8crySvLK80r9iv4K/or/Sv/LAEsAywF +LAgsFiwfLCEsKCwqLCwsLixXLFksWyxeLGAsYixkLGYsaSx1LH4sgCyCLIsskCyZLJwtPy1BLUMtRi1I +LUotTC1OLVAtUi1ULVYtWC1aLVwtXi1hLWMtZS1nLWktay1tLXAtcy11LXcteS17LX0tfy2BLYMthS2H +LYotjC2OLZAtki2VLZctmS2bLZ4toC2iLaQtpi2oLaotrC2uLbAtsi20LbYtuC26Lbwtvi3BLcMtxS3H +Lcktyy3OLdAt0y3VLdct2S3bLd0t3y3hLeQt5i3oLeot8y32LpsunS6fLqEuoy6lLqcuqS6rLq4usS6z +LrUuty65Lrsuvi7ALsIuxC7GLsguyy7OLtAu0y7WLtgu2y7eLuAu4y7mLugu6i7sLu4u8C7yLvQu9i75 +Lvsu/S7/LwEvAy8FLwcvCi8MLw4vEC8SLxUvFy8ZLxsvHi8gLyIvJS8nLyovLC8uLzAvMy81LzcvOS88 +Lz4vQC9CL0QvRi9IL0ovTC9OL1AvWS9cMAEwBDAHMAowDTAQMBMwFjAZMBwwHzAiMCUwKDArMC4wMTA0 +MDcwOjA9MEAwQzBGMEkwTDBPMFIwVTBYMFswXjBhMGQwZzBqMG0wcDBzMHYweTB8MH8wgjCFMIgwizCO +MJEwlDCXMJownTCgMKMwpjCpMKwwrzCyMLUwuDC7ML4wwTDEMMcwyjDNMNAw0zDWMNkw3DDfMOIw5TDo +MOsw7jDxMPQxDjEjMTExTjFuMYAxnjG9Mccx0DH6MiQyQTJVMl0ygjKEMqEytDLSMugy9DMGMyYzSTNc +M2kzgDOMM6EzuTPeM+s0BjQVNPg1DDUgNT41UjVlNYo1nzWyNbw11jXhNgs2JzY+NlU2bzaRNp02sTbD +NuI27jbzN8436jf2OAI4OThUOGA4czieOLE4wzjYOPQ5CjkgOTc5UDlpOXY5kDmcOak5sjm1ObY5vznC +OcM5zDnPOrQ6tjq4Oro6vDq+OsA6wjrEOsY6yDrKOs06zzrROtQ61zrZOtw63zrhOuM65TrnOuk67Dru +OvE68zr1Ovc6+Tr7Ov47ADsCOwQ7BjsIOwo7DDsOOxA7EjsUOxY7GDsaOxw7HzshOyM7JTsnOyk7Kzst +Oy87MTszOzU7Nzs5Ozs7PTs/O0I7RTtHO0k7SztOO1A7UjtUO1c7WTtbO107XztiO2U7ZztpO2s7bTtv +O3E7czt2O3g7ejt8O347gDuCO4Q7hzuJO4s7jTuPO5E7lDuXO5o7nDueO6E7ozulO6c7qTurO7Q7tzyc +PJ88ojylPKg8qzyuPLE8tDy3PLo8vTzAPMM8xjzJPMw8zzzSPNU82DzbPN484TzkPOc86jztPPA88zz2 +PPk8/Dz/PQI9BT0IPQs9Dj0RPRQ9Fz0aPR09ID0jPSY9KT0sPS89Mj01PTg9Oz0+PUE9RD1HPUo9TT1Q +PVM9Vj1ZPVw9Xz1iPWU9aD1rPW49cT10PXc9ej19PYA9gz2GPYk9jD2PPZI9lT2YPZs9nj2hPaQ9pz2q +Pa09sD2zPbY9uT28Pb89wj3FPcg9yz3OPdE91D3XPdo93T3gPeM95j3pPew97z3xPfQ99z35Pfw9/z4C +PgQ+Bj4JPgw+Dj4QPhI+FD4WPhk+Gz4dPiA+Iz4mPik+Kz4uPjA+Mj40Pjc+Oj48Pj4+QT5DPkY+ST5M +Pk4+UT5TPlU+Vz5aPlw+Xj5gPmI+ZT5nPmk+bD5uPnE+dD52Pnk+fD5+PoA+gz6FPog+iz6OPpA+kj6U +Ppc+mj6dPp8+oT6jPqY+qD6rPq0+rz6xPrM+tT63Pro+vT7APsI+xT7HPso+zT7QPtM+1T7YPto+3D7f +PuI+5D7nPvA+8j70Pvc++T77Pv4/AT8DPwY/CT8SPxQ/FT8ePyE/Ij8rPy4/Lz84Pz0AAAAAAAACAgAA +AAAAAAgPAAAAAAAAAAAAAAAAAAA/TA diff --git a/tools/fonttexgen/English.lproj/MainMenu.nib/keyedobjects.nib b/tools/fonttexgen/English.lproj/MainMenu.nib/keyedobjects.nib index d0ae65a8..ba6ec170 100644 Binary files a/tools/fonttexgen/English.lproj/MainMenu.nib/keyedobjects.nib and b/tools/fonttexgen/English.lproj/MainMenu.nib/keyedobjects.nib differ diff --git a/tools/fonttexgen/FontTextureView.h b/tools/fonttexgen/FontTextureView.h index a88d9c40..5e1eb224 100644 --- a/tools/fonttexgen/FontTextureView.h +++ b/tools/fonttexgen/FontTextureView.h @@ -11,17 +11,20 @@ @interface FontTextureView: NSView { - int _offsetX, _offsetY; - BOOL _alternatingColors; - NSImage *_topRows; - NSImage *_credits; - NSArray *_widths; - NSDictionary *_template; + int _offsetX, _offsetY; + BOOL _alternatingColors; + NSImage *_topRows; + NSArray *_widths; + NSDictionary *_template; + NSStringEncoding _encoding; + + IBOutlet NSPopUpButton *encodingPopUp; } @property (nonatomic) int offsetX, offsetY; @property (nonatomic) BOOL alternatingColors; - (IBAction) saveImage:(id)sender; +- (IBAction) takeEncodingFromTag:(id)sender; @end diff --git a/tools/fonttexgen/FontTextureView.m b/tools/fonttexgen/FontTextureView.m index d773ef0d..76d7d9f8 100644 --- a/tools/fonttexgen/FontTextureView.m +++ b/tools/fonttexgen/FontTextureView.m @@ -9,9 +9,37 @@ // Hackerific: it's a view that thinks it's a controller. #import "FontTextureView.h" +#import +#import "OOEncodingConverter.h" -#define ENCODING 11//NSWindowsCP1252StringEncoding +@interface NSImage () +@property (setter=setFlipped:, getter=isFlipped) BOOL flipped; +@end + + +static inline NSPoint ScalePoint(NSPoint point, NSPoint scale) +{ + point.x *= scale.x; + point.y *= scale.y; + return point; +} + + +static inline NSSize ScaleSize(NSSize size, NSPoint scale) +{ + size.width *= scale.x; + size.height *= scale.y; + return size; +} + + +static inline NSRect ScaleRect(NSRect rect, NSPoint scale) +{ + rect.origin = ScalePoint(rect.origin, scale); + rect.size = ScaleSize(rect.size, scale); + return rect; +} @interface NSString (StringWithCharacter) @@ -36,6 +64,7 @@ [[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:4], @"offsetX", + [NSNumber numberWithInt:NSWindowsCP1252StringEncoding], @"encoding", nil]]; } @@ -79,8 +108,11 @@ withKeyPath:@"values.alternatingColors" options:nil]; + _encoding = [[NSUserDefaults standardUserDefaults] integerForKey:@"encoding"]; + [encodingPopUp selectItemWithTag:_encoding]; + _topRows = [NSImage imageNamed:@"toprows"]; - _credits = [NSImage imageNamed:@"credits"]; + _topRows.flipped = YES; _template = [[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"template" ofType:@"plist"]] copy]; } @@ -99,7 +131,10 @@ [[NSColor blackColor] set]; [NSBezierPath fillRect:rect]; - NSFont *font = [NSFont fontWithName:@"Helvetica Bold" size:25.0]; + // Originally hard-coded at 512x512 pixels, scale is used to transform magic numbers as appropriate. + NSPoint scale = { self.bounds.size.width / 512, self.bounds.size.height / 512 }; + + NSFont *font = [NSFont fontWithName:@"Helvetica Bold" size:25.0 * scale.y]; if (font == nil) NSLog(@"Failed to find font!"); NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, [NSColor whiteColor], NSForegroundColorAttributeName, nil]; @@ -112,41 +147,47 @@ { if (_alternatingColors && ((x % 2) == (y % 2))) { - NSRect frame = {{ x * 32, y * 32 }, { 32, 32 }}; + NSRect frame = {{ x * 32.0 * scale.x, y * 32.0 * scale.y }, { 32.0 * scale.x, 32.0 * scale.y }}; [[NSColor darkGrayColor] set]; [NSBezierPath fillRect:frame]; } uint8_t value = y * 16 + x; - if (value < 32 && value != '\t' && value != 0x08 && value != 0x18) continue; - if (value == 0x7F) value = '?'; // Substitution glyph for unknown characters - NSString *string = [[NSString alloc] initWithBytes:&value length:1 encoding:ENCODING]; - - if (value == 0x08) string = [NSString stringWithCharacter:0x2605]; // Black Star - if (value == 0x18) string = [NSString stringWithCharacter:0x2606]; // White Star - - // Replace Euro sign with Cruzeiro sign. - if ([string characterAtIndex:0] == 0x20AC) string = [NSString stringWithCharacter:0x20A2]; - // Replace tab with space. - if ([string characterAtIndex:0] == '\t') string = [NSString stringWithCharacter:' ']; - - NSPoint point = NSMakePoint(x * 32 + self.offsetX, y * 32 + self.offsetY); - [string drawAtPoint:point withAttributes:attrs]; - - NSNumber *width = [NSNumber numberWithFloat:[string sizeWithAttributes:attrs].width / 4.0]; - if (value < 32) + if (y >= 2 || value == '\t' || value == 0x08 || value == 0x18) { - [widths replaceObjectAtIndex:value withObject:width]; - } - else - { - [widths addObject:width]; + // if (value == 0x7F) value = '?'; // Substitution glyph for unknown characters -- not used + NSString *string = [[NSString alloc] initWithBytes:&value length:1 encoding:_encoding]; + + if (value == 0x08) string = [NSString stringWithCharacter:0x2605]; // Black Star + if (value == 0x18) string = [NSString stringWithCharacter:0x2606]; // White Star + + // Replace Euro sign with Cruzeiro sign. + if ([string characterAtIndex:0] == 0x20AC) string = [NSString stringWithCharacter:0x20A2]; + // Replace tab with space. + if ([string characterAtIndex:0] == '\t') string = [NSString stringWithCharacter:' ']; + + NSPoint point = NSMakePoint((x * 32.0 + self.offsetX) * scale.x, (y * 32.0 + self.offsetY) * scale.y); + [string drawAtPoint:point withAttributes:attrs]; + + NSNumber *width = [NSNumber numberWithFloat:[string sizeWithAttributes:attrs].width / 4.0]; + if (value < 32) + { + [widths replaceObjectAtIndex:value withObject:width]; + } + else + { + [widths addObject:width]; + } } } } - [_topRows compositeToPoint:NSMakePoint(0, _topRows.size.height) operation:NSCompositePlusLighter]; + [NSGraphicsContext currentContext].imageInterpolation = NSImageInterpolationHigh; + NSRect srcRect = {{0, 0}, _topRows.size}; + NSRect dstRect = {{0, 0}, {32.0 * scale.x * 8.0, 32.0 * scale.y * 2.0}}; + [_topRows drawInRect:dstRect fromRect:srcRect operation:NSCompositePlusLighter fraction:1.0]; + _widths = [widths copy]; } @@ -166,13 +207,21 @@ NSMutableDictionary *plist = [_template mutableCopy]; [plist setObject:_widths forKey:@"widths"]; - [plist setObject:[NSNumber numberWithInt:ENCODING] forKey:@"encoding"]; + [plist setObject:StringFromEncoding(_encoding) forKey:@"encoding"]; path = [[path stringByDeletingPathExtension] stringByAppendingPathExtension:@"plist"]; [plist writeToFile:path atomically:YES]; } } + +- (IBAction) takeEncodingFromTag:(id)sender +{ + _encoding = [[sender selectedItem] tag]; + [[NSUserDefaults standardUserDefaults] setInteger:_encoding forKey:@"encoding"]; + [self setNeedsDisplay:YES]; +} + @end diff --git a/tools/fonttexgen/fonttexgen.xcodeproj/project.pbxproj b/tools/fonttexgen/fonttexgen.xcodeproj/project.pbxproj index e8bb55c9..79c3a644 100644 --- a/tools/fonttexgen/fonttexgen.xcodeproj/project.pbxproj +++ b/tools/fonttexgen/fonttexgen.xcodeproj/project.pbxproj @@ -7,9 +7,11 @@ objects = { /* Begin PBXBuildFile section */ + 1A88FF7C0D5E393A002E5344 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A88FF7B0D5E393A002E5344 /* QuartzCore.framework */; }; 1AC544440D4D01DE00C90E5B /* FontTextureView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AC544430D4D01DE00C90E5B /* FontTextureView.m */; }; 1AC544AB0D4D175B00C90E5B /* toprows.png in Resources */ = {isa = PBXBuildFile; fileRef = 1AC544A90D4D175B00C90E5B /* toprows.png */; }; 1AC545680D4D362C00C90E5B /* template.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1AC545670D4D362C00C90E5B /* template.plist */; }; + 1AD3DA280D5F62E700AB473C /* OOEncodingConverter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AD3DA270D5F62E700AB473C /* OOEncodingConverter.m */; }; 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; @@ -20,10 +22,13 @@ 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; + 1A88FF7B0D5E393A002E5344 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = SDKs/MacOSX10.5.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; 1AC544420D4D01DE00C90E5B /* FontTextureView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FontTextureView.h; sourceTree = ""; }; 1AC544430D4D01DE00C90E5B /* FontTextureView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FontTextureView.m; sourceTree = ""; }; 1AC544A90D4D175B00C90E5B /* toprows.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = toprows.png; sourceTree = ""; }; 1AC545670D4D362C00C90E5B /* template.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = template.plist; sourceTree = ""; }; + 1AD3DA260D5F62E700AB473C /* OOEncodingConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OOEncodingConverter.h; path = ../../src/Core/OOEncodingConverter.h; sourceTree = SOURCE_ROOT; }; + 1AD3DA270D5F62E700AB473C /* OOEncodingConverter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OOEncodingConverter.m; path = ../../src/Core/OOEncodingConverter.m; sourceTree = SOURCE_ROOT; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; @@ -39,6 +44,7 @@ buildActionMask = 2147483647; files = ( 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, + 1A88FF7C0D5E393A002E5344 /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -50,6 +56,8 @@ children = ( 1AC544420D4D01DE00C90E5B /* FontTextureView.h */, 1AC544430D4D01DE00C90E5B /* FontTextureView.m */, + 1AD3DA260D5F62E700AB473C /* OOEncodingConverter.h */, + 1AD3DA270D5F62E700AB473C /* OOEncodingConverter.m */, ); name = Classes; sourceTree = ""; @@ -58,6 +66,7 @@ isa = PBXGroup; children = ( 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + 1A88FF7B0D5E393A002E5344 /* QuartzCore.framework */, ); name = "Linked Frameworks"; sourceTree = ""; @@ -181,6 +190,7 @@ files = ( 8D11072D0486CEB800E47090 /* main.m in Sources */, 1AC544440D4D01DE00C90E5B /* FontTextureView.m in Sources */, + 1AD3DA280D5F62E700AB473C /* OOEncodingConverter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -210,12 +220,18 @@ isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(DEVELOPER_DIR)/SDKs/MacOSX10.5.sdk/System/Library/Frameworks\"", + ); GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = fonttexgen_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = "NS_BUILD_32_LIKE_64=1"; + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = OOENCODINGCONVERTER_EXCLUDE; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; PRODUCT_NAME = fonttexgen; @@ -228,6 +244,10 @@ isa = XCBuildConfiguration; buildSettings = { DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(DEVELOPER_DIR)/SDKs/MacOSX10.5.sdk/System/Library/Frameworks\"", + ); GCC_ENABLE_OBJC_GC = required; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; diff --git a/tools/fonttexgen/main.m b/tools/fonttexgen/main.m index c0c4cb2f..52f7eb2a 100644 --- a/tools/fonttexgen/main.m +++ b/tools/fonttexgen/main.m @@ -10,5 +10,13 @@ int main(int argc, char *argv[]) { - return NSApplicationMain(argc, (const char **) argv); + @try + { + return NSApplicationMain(argc, (const char **) argv); + } + @catch (id e) + { + NSLog(@"*** Root exception handler: %@: %@", [e name], [e reason]); + } + return -1; } diff --git a/tools/fonttexgen/oolite-gov-symbols.pdf b/tools/fonttexgen/oolite-gov-symbols.pdf new file mode 100644 index 00000000..523a1628 Binary files /dev/null and b/tools/fonttexgen/oolite-gov-symbols.pdf differ diff --git a/tools/fonttexgen/toprows-big.png b/tools/fonttexgen/toprows-big.png new file mode 100644 index 00000000..ba5c619a Binary files /dev/null and b/tools/fonttexgen/toprows-big.png differ diff --git a/tools/fonttexgen/toprows.png b/tools/fonttexgen/toprows.png index db44b9f8..d8d7a001 100644 Binary files a/tools/fonttexgen/toprows.png and b/tools/fonttexgen/toprows.png differ